Commit 107dec27 authored by Iyappan Subramanian's avatar Iyappan Subramanian Committed by David S. Miller

drivers: net: xgene: Add support for multiple queues

Signed-off-by: default avatarIyappan Subramanian <isubramanian@apm.com>
Signed-off-by: default avatarKhuong Dinh <kdinh@apm.com>
Signed-off-by: default avatarTanmay Inamdar <tinamdar@apm.com>
Tested-by: default avatarToan Le <toanle@apm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fc4262d2
...@@ -331,14 +331,15 @@ static int xgene_cle_set_rss_skeys(struct xgene_enet_cle *cle) ...@@ -331,14 +331,15 @@ static int xgene_cle_set_rss_skeys(struct xgene_enet_cle *cle)
static int xgene_cle_set_rss_idt(struct xgene_enet_pdata *pdata) static int xgene_cle_set_rss_idt(struct xgene_enet_pdata *pdata)
{ {
u32 fpsel, dstqid, nfpsel, idt_reg; u32 fpsel, dstqid, nfpsel, idt_reg, idx;
int i, ret = 0; int i, ret = 0;
u16 pool_id; u16 pool_id;
for (i = 0; i < XGENE_CLE_IDT_ENTRIES; i++) { for (i = 0; i < XGENE_CLE_IDT_ENTRIES; i++) {
pool_id = pdata->rx_ring->buf_pool->id; idx = i % pdata->rxq_cnt;
pool_id = pdata->rx_ring[idx]->buf_pool->id;
fpsel = xgene_enet_ring_bufnum(pool_id) - 0x20; fpsel = xgene_enet_ring_bufnum(pool_id) - 0x20;
dstqid = xgene_enet_dst_ring_num(pdata->rx_ring); dstqid = xgene_enet_dst_ring_num(pdata->rx_ring[idx]);
nfpsel = 0; nfpsel = 0;
idt_reg = 0; idt_reg = 0;
...@@ -695,8 +696,8 @@ static int xgene_enet_cle_init(struct xgene_enet_pdata *pdata) ...@@ -695,8 +696,8 @@ static int xgene_enet_cle_init(struct xgene_enet_pdata *pdata)
br->mask = 0xffff; br->mask = 0xffff;
} }
def_qid = xgene_enet_dst_ring_num(pdata->rx_ring); def_qid = xgene_enet_dst_ring_num(pdata->rx_ring[0]);
pool_id = pdata->rx_ring->buf_pool->id; pool_id = pdata->rx_ring[0]->buf_pool->id;
def_fpsel = xgene_enet_ring_bufnum(pool_id) - 0x20; def_fpsel = xgene_enet_ring_bufnum(pool_id) - 0x20;
memset(dbptr, 0, sizeof(struct xgene_cle_dbptr) * DB_MAX_PTRS); memset(dbptr, 0, sizeof(struct xgene_cle_dbptr) * DB_MAX_PTRS);
......
...@@ -204,6 +204,17 @@ static u32 xgene_enet_ring_len(struct xgene_enet_desc_ring *ring) ...@@ -204,6 +204,17 @@ static u32 xgene_enet_ring_len(struct xgene_enet_desc_ring *ring)
return num_msgs; return num_msgs;
} }
static void xgene_enet_setup_coalescing(struct xgene_enet_desc_ring *ring)
{
u32 data = 0x7777;
xgene_enet_ring_wr32(ring, CSR_PBM_COAL, 0x8e);
xgene_enet_ring_wr32(ring, CSR_PBM_CTICK1, data);
xgene_enet_ring_wr32(ring, CSR_PBM_CTICK2, data << 16);
xgene_enet_ring_wr32(ring, CSR_THRESHOLD0_SET1, 0x40);
xgene_enet_ring_wr32(ring, CSR_THRESHOLD1_SET1, 0x80);
}
void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring, void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring,
struct xgene_enet_pdata *pdata, struct xgene_enet_pdata *pdata,
enum xgene_enet_err_code status) enum xgene_enet_err_code status)
...@@ -892,4 +903,5 @@ struct xgene_ring_ops xgene_ring1_ops = { ...@@ -892,4 +903,5 @@ struct xgene_ring_ops xgene_ring1_ops = {
.clear = xgene_enet_clear_ring, .clear = xgene_enet_clear_ring,
.wr_cmd = xgene_enet_wr_cmd, .wr_cmd = xgene_enet_wr_cmd,
.len = xgene_enet_ring_len, .len = xgene_enet_ring_len,
.coalesce = xgene_enet_setup_coalescing,
}; };
...@@ -54,6 +54,11 @@ enum xgene_enet_rm { ...@@ -54,6 +54,11 @@ enum xgene_enet_rm {
#define IS_BUFFER_POOL BIT(20) #define IS_BUFFER_POOL BIT(20)
#define PREFETCH_BUF_EN BIT(21) #define PREFETCH_BUF_EN BIT(21)
#define CSR_RING_ID_BUF 0x000c #define CSR_RING_ID_BUF 0x000c
#define CSR_PBM_COAL 0x0014
#define CSR_PBM_CTICK1 0x001c
#define CSR_PBM_CTICK2 0x0020
#define CSR_THRESHOLD0_SET1 0x0030
#define CSR_THRESHOLD1_SET1 0x0034
#define CSR_RING_NE_INT_MODE 0x017c #define CSR_RING_NE_INT_MODE 0x017c
#define CSR_RING_CONFIG 0x006c #define CSR_RING_CONFIG 0x006c
#define CSR_RING_WR_BASE 0x0070 #define CSR_RING_WR_BASE 0x0070
......
...@@ -49,6 +49,11 @@ ...@@ -49,6 +49,11 @@
#define XGENE_ENET_MSS 1448 #define XGENE_ENET_MSS 1448
#define XGENE_MIN_ENET_FRAME_SIZE 60 #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_CPU_BUFNUM_0 0
#define START_ETH_BUFNUM_0 2 #define START_ETH_BUFNUM_0 2
#define START_BP_BUFNUM_0 0x22 #define START_BP_BUFNUM_0 0x22
...@@ -73,7 +78,6 @@ ...@@ -73,7 +78,6 @@
#define X2_START_RING_NUM_1 256 #define X2_START_RING_NUM_1 256
#define IRQ_ID_SIZE 16 #define IRQ_ID_SIZE 16
#define XGENE_MAX_TXC_RINGS 1
#define PHY_POLL_LINK_ON (10 * HZ) #define PHY_POLL_LINK_ON (10 * HZ)
#define PHY_POLL_LINK_OFF (PHY_POLL_LINK_ON / 5) #define PHY_POLL_LINK_OFF (PHY_POLL_LINK_ON / 5)
...@@ -103,6 +107,7 @@ struct xgene_enet_desc_ring { ...@@ -103,6 +107,7 @@ struct xgene_enet_desc_ring {
void *irq_mbox_addr; void *irq_mbox_addr;
u16 dst_ring_num; u16 dst_ring_num;
u8 nbufpool; u8 nbufpool;
u8 index;
struct sk_buff *(*rx_skb); struct sk_buff *(*rx_skb);
struct sk_buff *(*cp_skb); struct sk_buff *(*cp_skb);
dma_addr_t *frag_dma_addr; dma_addr_t *frag_dma_addr;
...@@ -144,6 +149,7 @@ struct xgene_ring_ops { ...@@ -144,6 +149,7 @@ struct xgene_ring_ops {
void (*clear)(struct xgene_enet_desc_ring *); void (*clear)(struct xgene_enet_desc_ring *);
void (*wr_cmd)(struct xgene_enet_desc_ring *, int); void (*wr_cmd)(struct xgene_enet_desc_ring *, int);
u32 (*len)(struct xgene_enet_desc_ring *); u32 (*len)(struct xgene_enet_desc_ring *);
void (*coalesce)(struct xgene_enet_desc_ring *);
}; };
struct xgene_cle_ops { struct xgene_cle_ops {
...@@ -159,15 +165,16 @@ struct xgene_enet_pdata { ...@@ -159,15 +165,16 @@ struct xgene_enet_pdata {
struct clk *clk; struct clk *clk;
struct platform_device *pdev; struct platform_device *pdev;
enum xgene_enet_id enet_id; enum xgene_enet_id enet_id;
struct xgene_enet_desc_ring *tx_ring; struct xgene_enet_desc_ring *tx_ring[XGENE_NUM_TX_RING];
struct xgene_enet_desc_ring *rx_ring; struct xgene_enet_desc_ring *rx_ring[XGENE_NUM_RX_RING];
u16 tx_level; u16 tx_level[XGENE_NUM_TX_RING];
u16 txc_level; u16 txc_level[XGENE_NUM_TX_RING];
char *dev_name; char *dev_name;
u32 rx_buff_cnt; u32 rx_buff_cnt;
u32 tx_qcnt_hi; u32 tx_qcnt_hi;
u32 rx_irq; u32 irqs[XGENE_MAX_ENET_IRQ];
u32 txc_irq; u8 rxq_cnt;
u8 txq_cnt;
u8 cq_cnt; u8 cq_cnt;
void __iomem *eth_csr_addr; void __iomem *eth_csr_addr;
void __iomem *eth_ring_if_addr; void __iomem *eth_ring_if_addr;
......
...@@ -190,6 +190,17 @@ static u32 xgene_enet_ring_len(struct xgene_enet_desc_ring *ring) ...@@ -190,6 +190,17 @@ static u32 xgene_enet_ring_len(struct xgene_enet_desc_ring *ring)
return num_msgs; return num_msgs;
} }
static void xgene_enet_setup_coalescing(struct xgene_enet_desc_ring *ring)
{
u32 data = 0x7777;
xgene_enet_ring_wr32(ring, CSR_PBM_COAL, 0x8e);
xgene_enet_ring_wr32(ring, CSR_PBM_CTICK1, data);
xgene_enet_ring_wr32(ring, CSR_PBM_CTICK2, data << 16);
xgene_enet_ring_wr32(ring, CSR_THRESHOLD0_SET1, 0x40);
xgene_enet_ring_wr32(ring, CSR_THRESHOLD1_SET1, 0x80);
}
struct xgene_ring_ops xgene_ring2_ops = { struct xgene_ring_ops xgene_ring2_ops = {
.num_ring_config = X2_NUM_RING_CONFIG, .num_ring_config = X2_NUM_RING_CONFIG,
.num_ring_id_shift = 13, .num_ring_id_shift = 13,
...@@ -197,4 +208,5 @@ struct xgene_ring_ops xgene_ring2_ops = { ...@@ -197,4 +208,5 @@ struct xgene_ring_ops xgene_ring2_ops = {
.clear = xgene_enet_clear_ring, .clear = xgene_enet_clear_ring,
.wr_cmd = xgene_enet_wr_cmd, .wr_cmd = xgene_enet_wr_cmd,
.len = xgene_enet_ring_len, .len = xgene_enet_ring_len,
.coalesce = xgene_enet_setup_coalescing,
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment