]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bnxt_en: Optimize doorbell write operations for newer chips.
authorMichael Chan <michael.chan@broadcom.com>
Mon, 29 May 2017 23:06:08 +0000 (19:06 -0400)
committerSomasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
Tue, 11 Jul 2017 00:04:09 +0000 (17:04 -0700)
Orabug: 264025332632559926366387

Older chips require the doorbells to be written twice, but newer chips
do not.  Add a new common function bnxt_db_write() to write all
doorbells appropriately depending on the chip.  Eliminating the extra
doorbell on newer chips has a significant performance improvement
on pktgen.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 434c975a8fe2f70b70ac09ea5ddd008e0528adfa)
Signed-off-by: Brian Maly <brian.maly@oracle.com>
Conflicts:
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_xdp.c
Signed-off-by: Somasundaram Krishnasamy <somasundaram.krishnasamy@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 52e6c664f8bac72e51ae7f68909f0ba3abaf38b6..66900368a774666e1e7277aa43f53f89b2e93493 100644 (file)
@@ -480,8 +480,7 @@ normal_tx:
        prod = NEXT_TX(prod);
        txr->tx_prod = prod;
 
-       writel(DB_KEY_TX | prod, txr->tx_doorbell);
-       writel(DB_KEY_TX | prod, txr->tx_doorbell);
+       bnxt_db_write(bp, txr->tx_doorbell, DB_KEY_TX | prod);
 
 tx_done:
 
@@ -1813,14 +1812,10 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
        if (event & BNXT_RX_EVENT) {
                struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
 
-               writel(DB_KEY_RX | rxr->rx_prod, rxr->rx_doorbell);
-               writel(DB_KEY_RX | rxr->rx_prod, rxr->rx_doorbell);
-               if (event & BNXT_AGG_EVENT) {
-                       writel(DB_KEY_RX | rxr->rx_agg_prod,
-                              rxr->rx_agg_doorbell);
-                       writel(DB_KEY_RX | rxr->rx_agg_prod,
-                              rxr->rx_agg_doorbell);
-               }
+               bnxt_db_write(bp, rxr->rx_doorbell, DB_KEY_RX | rxr->rx_prod);
+               if (event & BNXT_AGG_EVENT)
+                       bnxt_db_write(bp, rxr->rx_agg_doorbell,
+                                     DB_KEY_RX | rxr->rx_agg_prod);
        }
        return rx_pkts;
 }
@@ -1880,13 +1875,11 @@ static int bnxt_poll_nitroa0(struct napi_struct *napi, int budget)
 
        cpr->cp_raw_cons = raw_cons;
        BNXT_CP_DB(cpr->cp_doorbell, cpr->cp_raw_cons);
-       writel(DB_KEY_RX | rxr->rx_prod, rxr->rx_doorbell);
-       writel(DB_KEY_RX | rxr->rx_prod, rxr->rx_doorbell);
+       bnxt_db_write(bp, rxr->rx_doorbell, DB_KEY_RX | rxr->rx_prod);
 
-       if (event & BNXT_AGG_EVENT) {
-               writel(DB_KEY_RX | rxr->rx_agg_prod, rxr->rx_agg_doorbell);
-               writel(DB_KEY_RX | rxr->rx_agg_prod, rxr->rx_agg_doorbell);
-       }
+       if (event & BNXT_AGG_EVENT)
+               bnxt_db_write(bp, rxr->rx_agg_doorbell,
+                             DB_KEY_RX | rxr->rx_agg_prod);
 
        if (!bnxt_has_work(bp, cpr) && rx_pkts < budget) {
                napi_complete(napi);
@@ -7775,6 +7768,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        bp->gro_func = bnxt_gro_func_5730x;
        if (BNXT_CHIP_P4_PLUS(bp))
                bp->gro_func = bnxt_gro_func_5731x;
+       else
+               bp->flags |= BNXT_FLAG_DOUBLE_DB;
 
        rc = bnxt_hwrm_func_drv_rgtr(bp);
        if (rc)
index 8a2e9e2a47cefbc7faaddb381ac8832d1491895c..89b62d0ef3f0feb0599a93ceab680e2ff01b3fad 100644 (file)
@@ -1013,6 +1013,7 @@ struct bnxt {
        #define BNXT_FLAG_FW_LLDP_AGENT 0x80000
        #define BNXT_FLAG_MULTI_HOST    0x100000
        #define BNXT_FLAG_SHORT_CMD     0x200000
+       #define BNXT_FLAG_DOUBLE_DB     0x400000
        #define BNXT_FLAG_CHIP_NITRO_A0 0x1000000
 
        #define BNXT_FLAG_ALL_CONFIG_FEATS (BNXT_FLAG_TPA |             \
@@ -1234,6 +1235,14 @@ struct bnxt {
 #define SFF_MODULE_ID_QSFP28                   0x11
 #define BNXT_MAX_PHY_I2C_RESP_SIZE             64
 
+/* For TX and RX ring doorbells */
+static inline void bnxt_db_write(struct bnxt *bp, void __iomem *db, u32 val)
+{
+       writel(val, db);
+       if (bp->flags & BNXT_FLAG_DOUBLE_DB)
+               writel(val, db);
+}
+
 void bnxt_set_ring_params(struct bnxt *);
 int bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode);
 void bnxt_hwrm_cmd_hdr_init(struct bnxt *, void *, u16, u16, u16);
index 45e91a845cfa2685b3f8556d8e67e23183e235a8..f931a350bbb0a6efc083c07ebdb44de36ca4cdff 100644 (file)
@@ -2595,8 +2595,7 @@ static int bnxt_run_loopback(struct bnxt *bp)
        /* Sync BD data before updating doorbell */
        wmb();
 
-       writel(DB_KEY_TX | txr->tx_prod, txr->tx_doorbell);
-       writel(DB_KEY_TX | txr->tx_prod, txr->tx_doorbell);
+       bnxt_db_write(bp, txr->tx_doorbell, DB_KEY_TX | txr->tx_prod);
        rc = bnxt_poll_loopback(bp, pkt_size);
 
        dma_unmap_single(&bp->pdev->dev, map, pkt_size, PCI_DMA_TODEVICE);