提交 a18f5128 编写于 作者: E Eilon Greenstein 提交者: David S. Miller

bnx2x: Configurable pause scheme

When a given ring is running out of space, the FW can send pause towards the
network. When working with multi-queues, when one queue is getting out of space
it can block all other queues. The preferred scheme is to send pause frames only
when running out of the shared internal chip buffers and if a given queue cannot
place a packet on the host, it will drop it. Since some users might want to work
in drop-less mode, allowing changing the behavior as a module parameter.
Signed-off-by: NEilon Greenstein <eilong@broadcom.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 a119a069
...@@ -967,6 +967,8 @@ struct bnx2x { ...@@ -967,6 +967,8 @@ struct bnx2x {
dma_addr_t qm_mapping; dma_addr_t qm_mapping;
#endif #endif
int dropless_fc;
int dmae_ready; int dmae_ready;
/* used to synchronize dmae accesses */ /* used to synchronize dmae accesses */
struct mutex dmae_mutex; struct mutex dmae_mutex;
......
...@@ -101,6 +101,10 @@ static int int_mode; ...@@ -101,6 +101,10 @@ static int int_mode;
module_param(int_mode, int, 0); module_param(int_mode, int, 0);
MODULE_PARM_DESC(int_mode, " Force interrupt mode (1 INT#x; 2 MSI)"); MODULE_PARM_DESC(int_mode, " Force interrupt mode (1 INT#x; 2 MSI)");
static int dropless_fc;
module_param(dropless_fc, int, 0);
MODULE_PARM_DESC(dropless_fc, " Pause on exhausted host ring");
static int poll; static int poll;
module_param(poll, int, 0); module_param(poll, int, 0);
MODULE_PARM_DESC(poll, " Use polling (for debug)"); MODULE_PARM_DESC(poll, " Use polling (for debug)");
...@@ -2369,7 +2373,7 @@ static void bnx2x_link_attn(struct bnx2x *bp) ...@@ -2369,7 +2373,7 @@ static void bnx2x_link_attn(struct bnx2x *bp)
if (bp->link_vars.link_up) { if (bp->link_vars.link_up) {
/* dropless flow control */ /* dropless flow control */
if (CHIP_IS_E1H(bp)) { if (CHIP_IS_E1H(bp) && bp->dropless_fc) {
int port = BP_PORT(bp); int port = BP_PORT(bp);
u32 pause_enabled = 0; u32 pause_enabled = 0;
...@@ -6359,9 +6363,6 @@ static int bnx2x_init_port(struct bnx2x *bp) ...@@ -6359,9 +6363,6 @@ static int bnx2x_init_port(struct bnx2x *bp)
REG_WR(bp, NIG_REG_LLH0_BRB1_DRV_MASK_MF + port*4, REG_WR(bp, NIG_REG_LLH0_BRB1_DRV_MASK_MF + port*4,
(IS_E1HMF(bp) ? 0x1 : 0x2)); (IS_E1HMF(bp) ? 0x1 : 0x2));
/* support pause requests from USDM, TSDM and BRB */
REG_WR(bp, NIG_REG_LLFC_EGRESS_SRC_ENABLE_0 + port*4, 0x7);
{ {
REG_WR(bp, NIG_REG_LLFC_ENABLE_0 + port*4, 0); REG_WR(bp, NIG_REG_LLFC_ENABLE_0 + port*4, 0);
REG_WR(bp, NIG_REG_LLFC_OUT_EN_0 + port*4, 0); REG_WR(bp, NIG_REG_LLFC_OUT_EN_0 + port*4, 0);
...@@ -8677,6 +8678,11 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) ...@@ -8677,6 +8678,11 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
bp->dev->features |= NETIF_F_LRO; bp->dev->features |= NETIF_F_LRO;
} }
if (CHIP_IS_E1(bp))
bp->dropless_fc = 0;
else
bp->dropless_fc = dropless_fc;
bp->mrrs = mrrs; bp->mrrs = mrrs;
bp->tx_ring_size = MAX_TX_AVAIL; bp->tx_ring_size = MAX_TX_AVAIL;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册