]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bnxt_en: Add coalescing support for tx rings.
authorMichael Chan <michael.chan@broadcom.com>
Fri, 26 Feb 2016 09:00:03 +0000 (04:00 -0500)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 7 Jul 2016 00:36:58 +0000 (17:36 -0700)
Orabug: 23221795

When tx and rx rings don't share the same completion ring, tx coalescing
parameters can be set differently from the rx coalescing parameters.
Otherwise, use rx coalescing parameters on shared completion rings.

Adjust rx coalescing default values to lower interrupt rate.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit dfc9c94a83909f4be80e5d0c67e79793830aa312)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 313404c6724fbfd50e1385ce7512e1672d2dd38a..9ef8b6dc804f37bbc9f85700dfdb0b0a9aa98594 100644 (file)
@@ -3557,13 +3557,16 @@ static void bnxt_hwrm_set_coal_params(struct bnxt *bp, u32 max_bufs,
 int bnxt_hwrm_set_coal(struct bnxt *bp)
 {
        int i, rc = 0;
-       struct hwrm_ring_cmpl_ring_cfg_aggint_params_input req = {0};
+       struct hwrm_ring_cmpl_ring_cfg_aggint_params_input req_rx = {0},
+                                                          req_tx = {0}, *req;
        u16 max_buf, max_buf_irq;
        u16 buf_tmr, buf_tmr_irq;
        u32 flags;
 
-       bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS,
-                              -1, -1);
+       bnxt_hwrm_cmd_hdr_init(bp, &req_rx,
+                              HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS, -1, -1);
+       bnxt_hwrm_cmd_hdr_init(bp, &req_tx,
+                              HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS, -1, -1);
 
        /* Each rx completion (2 records) should be DMAed immediately.
         * DMA 1/4 of the completion buffers at a time.
@@ -3587,13 +3590,31 @@ int bnxt_hwrm_set_coal(struct bnxt *bp)
                flags |= RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_RING_IDLE;
 
        bnxt_hwrm_set_coal_params(bp, max_buf_irq << 16 | max_buf,
-                                 buf_tmr_irq << 16 | buf_tmr, flags, &req);
+                                 buf_tmr_irq << 16 | buf_tmr, flags, &req_rx);
+
+       /* max_buf must not be zero */
+       max_buf = clamp_t(u16, bp->tx_coal_bufs, 1, 63);
+       max_buf_irq = clamp_t(u16, bp->tx_coal_bufs_irq, 1, 63);
+       buf_tmr = BNXT_USEC_TO_COAL_TIMER(bp->tx_coal_ticks);
+       /* buf timer set to 1/4 of interrupt timer */
+       buf_tmr = max_t(u16, buf_tmr / 4, 1);
+       buf_tmr_irq = BNXT_USEC_TO_COAL_TIMER(bp->tx_coal_ticks_irq);
+       buf_tmr_irq = max_t(u16, buf_tmr_irq, 1);
+
+       flags = RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_TIMER_RESET;
+       bnxt_hwrm_set_coal_params(bp, max_buf_irq << 16 | max_buf,
+                                 buf_tmr_irq << 16 | buf_tmr, flags, &req_tx);
 
        mutex_lock(&bp->hwrm_cmd_lock);
        for (i = 0; i < bp->cp_nr_rings; i++) {
-               req.ring_id = cpu_to_le16(bp->grp_info[i].cp_fw_ring_id);
+               struct bnxt_napi *bnapi = bp->bnapi[i];
 
-               rc = _hwrm_send_message(bp, &req, sizeof(req),
+               req = &req_rx;
+               if (!bnapi->rx_ring)
+                       req = &req_tx;
+               req->ring_id = cpu_to_le16(bp->grp_info[i].cp_fw_ring_id);
+
+               rc = _hwrm_send_message(bp, req, sizeof(*req),
                                        HWRM_CMD_TIMEOUT);
                if (rc)
                        break;
@@ -5330,11 +5351,16 @@ static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev)
        bp->tx_ring_size = BNXT_DEFAULT_TX_RING_SIZE;
 
        /* tick values in micro seconds */
-       bp->rx_coal_ticks = 4;
-       bp->rx_coal_bufs = 20;
+       bp->rx_coal_ticks = 12;
+       bp->rx_coal_bufs = 30;
        bp->rx_coal_ticks_irq = 1;
        bp->rx_coal_bufs_irq = 2;
 
+       bp->tx_coal_ticks = 25;
+       bp->tx_coal_bufs = 30;
+       bp->tx_coal_ticks_irq = 2;
+       bp->tx_coal_bufs_irq = 2;
+
        init_timer(&bp->timer);
        bp->timer.data = (unsigned long)bp;
        bp->timer.function = bnxt_timer;
index 6913307e7612d61710217529a56dd5f22f726317..ba67c4a66ef30298d490b06831b44ec11ee323c3 100644 (file)
@@ -968,10 +968,15 @@ struct bnxt {
        __le16                  vxlan_fw_dst_port_id;
        u8                      nge_port_cnt;
        __le16                  nge_fw_dst_port_id;
+
        u16                     rx_coal_ticks;
        u16                     rx_coal_ticks_irq;
        u16                     rx_coal_bufs;
        u16                     rx_coal_bufs_irq;
+       u16                     tx_coal_ticks;
+       u16                     tx_coal_ticks_irq;
+       u16                     tx_coal_bufs;
+       u16                     tx_coal_bufs_irq;
 
 #define BNXT_USEC_TO_COAL_TIMER(x)     ((x) * 25 / 2)
 
index 09f0e780b3aa70be50de030bc28700bf09a7643e..f44480a2e2af7588d29cb5449773308bc681c743 100644 (file)
@@ -52,6 +52,11 @@ static int bnxt_get_coalesce(struct net_device *dev,
        coal->rx_coalesce_usecs_irq = bp->rx_coal_ticks_irq;
        coal->rx_max_coalesced_frames_irq = bp->rx_coal_bufs_irq / 2;
 
+       coal->tx_coalesce_usecs = bp->tx_coal_ticks;
+       coal->tx_max_coalesced_frames = bp->tx_coal_bufs;
+       coal->tx_coalesce_usecs_irq = bp->tx_coal_ticks_irq;
+       coal->tx_max_coalesced_frames_irq = bp->tx_coal_bufs_irq;
+
        return 0;
 }
 
@@ -67,6 +72,11 @@ static int bnxt_set_coalesce(struct net_device *dev,
        bp->rx_coal_ticks_irq = coal->rx_coalesce_usecs_irq;
        bp->rx_coal_bufs_irq = coal->rx_max_coalesced_frames_irq * 2;
 
+       bp->tx_coal_ticks = coal->tx_coalesce_usecs;
+       bp->tx_coal_bufs = coal->tx_max_coalesced_frames;
+       bp->tx_coal_ticks_irq = coal->tx_coalesce_usecs_irq;
+       bp->tx_coal_bufs_irq = coal->tx_max_coalesced_frames_irq;
+
        if (netif_running(dev))
                rc = bnxt_hwrm_set_coal(bp);