bnx2x: Configurable pause scheme
authorEilon Greenstein <eilong@broadcom.com>
Wed, 12 Aug 2009 08:23:26 +0000 (08:23 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 13 Aug 2009 06:02:42 +0000 (23:02 -0700)
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: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bnx2x.h
drivers/net/bnx2x_main.c

index 1d0b72716f7aa21ea347d8ca86cefff2c6cf2b19..004f4a8e1649305b6c89e6558be4389c80572f1d 100644 (file)
@@ -967,6 +967,8 @@ struct bnx2x {
        dma_addr_t              qm_mapping;
 #endif
 
+       int                     dropless_fc;
+
        int                     dmae_ready;
        /* used to synchronize dmae accesses */
        struct mutex            dmae_mutex;
index 039fdd4becfffb6d88f5d5400d275484b8433e49..0ebbc77948038dd9238f30b827692c26cdc3bfae 100644 (file)
@@ -101,6 +101,10 @@ static int int_mode;
 module_param(int_mode, int, 0);
 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;
 module_param(poll, int, 0);
 MODULE_PARM_DESC(poll, " Use polling (for debug)");
@@ -2369,7 +2373,7 @@ static void bnx2x_link_attn(struct bnx2x *bp)
        if (bp->link_vars.link_up) {
 
                /* dropless flow control */
-               if (CHIP_IS_E1H(bp)) {
+               if (CHIP_IS_E1H(bp) && bp->dropless_fc) {
                        int port = BP_PORT(bp);
                        u32 pause_enabled = 0;
 
@@ -6359,9 +6363,6 @@ static int bnx2x_init_port(struct bnx2x *bp)
                REG_WR(bp, NIG_REG_LLH0_BRB1_DRV_MASK_MF + port*4,
                       (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_OUT_EN_0 + port*4, 0);
@@ -8677,6 +8678,11 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp)
                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->tx_ring_size = MAX_TX_AVAIL;