Merge tag 'arc-4.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
[linux-2.6-block.git] / drivers / net / ethernet / apm / xgene / xgene_enet_main.h
index 248dfc40a7611a0b298336c0aa552665da165ba7..175d18890c7a7da01895d7970ef653ce0170c01a 100644 (file)
@@ -36,6 +36,7 @@
 #include <linux/if_vlan.h>
 #include <linux/phy.h>
 #include "xgene_enet_hw.h"
+#include "xgene_enet_cle.h"
 #include "xgene_enet_ring2.h"
 
 #define XGENE_DRV_VERSION      "v1.0"
 #define XGENE_ENET_MSS 1448
 #define XGENE_MIN_ENET_FRAME_SIZE      60
 
+#define XGENE_MAX_ENET_IRQ     8
+#define XGENE_NUM_RX_RING      4
+#define XGENE_NUM_TX_RING      4
+#define XGENE_NUM_TXC_RING     4
+
 #define START_CPU_BUFNUM_0     0
 #define START_ETH_BUFNUM_0     2
 #define START_BP_BUFNUM_0      0x22
@@ -72,7 +78,6 @@
 #define X2_START_RING_NUM_1    256
 
 #define IRQ_ID_SIZE            16
-#define XGENE_MAX_TXC_RINGS    1
 
 #define PHY_POLL_LINK_ON       (10 * HZ)
 #define PHY_POLL_LINK_OFF      (PHY_POLL_LINK_ON / 5)
@@ -102,6 +107,7 @@ struct xgene_enet_desc_ring {
        void *irq_mbox_addr;
        u16 dst_ring_num;
        u8 nbufpool;
+       u8 index;
        struct sk_buff *(*rx_skb);
        struct sk_buff *(*cp_skb);
        dma_addr_t *frag_dma_addr;
@@ -143,6 +149,11 @@ struct xgene_ring_ops {
        void (*clear)(struct xgene_enet_desc_ring *);
        void (*wr_cmd)(struct xgene_enet_desc_ring *, int);
        u32 (*len)(struct xgene_enet_desc_ring *);
+       void (*coalesce)(struct xgene_enet_desc_ring *);
+};
+
+struct xgene_cle_ops {
+       int (*cle_init)(struct xgene_enet_pdata *pdata);
 };
 
 /* ethernet private data */
@@ -154,15 +165,16 @@ struct xgene_enet_pdata {
        struct clk *clk;
        struct platform_device *pdev;
        enum xgene_enet_id enet_id;
-       struct xgene_enet_desc_ring *tx_ring;
-       struct xgene_enet_desc_ring *rx_ring;
-       u16 tx_level;
-       u16 txc_level;
+       struct xgene_enet_desc_ring *tx_ring[XGENE_NUM_TX_RING];
+       struct xgene_enet_desc_ring *rx_ring[XGENE_NUM_RX_RING];
+       u16 tx_level[XGENE_NUM_TX_RING];
+       u16 txc_level[XGENE_NUM_TX_RING];
        char *dev_name;
        u32 rx_buff_cnt;
        u32 tx_qcnt_hi;
-       u32 rx_irq;
-       u32 txc_irq;
+       u32 irqs[XGENE_MAX_ENET_IRQ];
+       u8 rxq_cnt;
+       u8 txq_cnt;
        u8 cq_cnt;
        void __iomem *eth_csr_addr;
        void __iomem *eth_ring_if_addr;
@@ -174,10 +186,12 @@ struct xgene_enet_pdata {
        void __iomem *ring_cmd_addr;
        int phy_mode;
        enum xgene_enet_rm rm;
+       struct xgene_enet_cle cle;
        struct rtnl_link_stats64 stats;
        const struct xgene_mac_ops *mac_ops;
        const struct xgene_port_ops *port_ops;
        struct xgene_ring_ops *ring_ops;
+       struct xgene_cle_ops *cle_ops;
        struct delayed_work link_work;
        u32 port_id;
        u8 cpu_bufnum;
@@ -229,6 +243,13 @@ static inline struct device *ndev_to_dev(struct net_device *ndev)
        return ndev->dev.parent;
 }
 
+static inline u16 xgene_enet_dst_ring_num(struct xgene_enet_desc_ring *ring)
+{
+       struct xgene_enet_pdata *pdata = netdev_priv(ring->ndev);
+
+       return ((u16)pdata->rm << 10) | ring->num;
+}
+
 void xgene_enet_set_ethtool_ops(struct net_device *netdev);
 
 #endif /* __XGENE_ENET_MAIN_H__ */