]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
bnxt_en: Refactor bnxt_poll_work().
authorMichael Chan <michael.chan@broadcom.com>
Sun, 14 Oct 2018 11:02:57 +0000 (07:02 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 16 Oct 2018 05:44:33 +0000 (22:44 -0700)
Separate the CP ring polling logic in bnxt_poll_work() into 2 separate
functions __bnxt_poll_work() and __bnxt_poll_work_done().  Since the logic
is separated, we need to add tx_pkts and events fields to struct bnxt_napi
to keep track of the events to handle between the 2 functions.  We also
add had_work_done field to struct bnxt_cp_ring_info to indicate whether
some work was performed on the CP ring.

This is needed to better support the 57500 chips.  We need to poll up to
2 separate CP rings before we update or ARM the CP rings on the 57500 chips.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h

index 065f4c23864257bf39dcb1bf56cd749e2b5b4276..10d713aa76eee40b1917938942269229a9cfc21b 100644 (file)
@@ -1889,8 +1889,8 @@ static irqreturn_t bnxt_inta(int irq, void *dev_instance)
        return IRQ_HANDLED;
 }
 
-static int bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
-                         int budget)
+static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
+                           int budget)
 {
        struct bnxt_napi *bnapi = cpr->bnapi;
        u32 raw_cons = cpr->cp_raw_cons;
@@ -1913,6 +1913,7 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
                 * reading any further.
                 */
                dma_rmb();
+               cpr->had_work_done = 1;
                if (TX_CMP_TYPE(txcmp) == CMP_TYPE_TX_L2_CMP) {
                        tx_pkts++;
                        /* return full budget so NAPI will complete. */
@@ -1963,22 +1964,43 @@ static int bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
        }
 
        cpr->cp_raw_cons = raw_cons;
-       /* ACK completion ring before freeing tx ring and producing new
-        * buffers in rx/agg rings to prevent overflowing the completion
-        * ring.
-        */
-       bnxt_db_cq(bp, &cpr->cp_db, cpr->cp_raw_cons);
+       bnapi->tx_pkts += tx_pkts;
+       bnapi->events |= event;
+       return rx_pkts;
+}
 
-       if (tx_pkts)
-               bnapi->tx_int(bp, bnapi, tx_pkts);
+static void __bnxt_poll_work_done(struct bnxt *bp, struct bnxt_napi *bnapi)
+{
+       if (bnapi->tx_pkts) {
+               bnapi->tx_int(bp, bnapi, bnapi->tx_pkts);
+               bnapi->tx_pkts = 0;
+       }
 
-       if (event & BNXT_RX_EVENT) {
+       if (bnapi->events & BNXT_RX_EVENT) {
                struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
 
                bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
-               if (event & BNXT_AGG_EVENT)
+               if (bnapi->events & BNXT_AGG_EVENT)
                        bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
        }
+       bnapi->events = 0;
+}
+
+static int bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
+                         int budget)
+{
+       struct bnxt_napi *bnapi = cpr->bnapi;
+       int rx_pkts;
+
+       rx_pkts = __bnxt_poll_work(bp, cpr, budget);
+
+       /* ACK completion ring before freeing tx ring and producing new
+        * buffers in rx/agg rings to prevent overflowing the completion
+        * ring.
+        */
+       bnxt_db_cq(bp, &cpr->cp_db, cpr->cp_raw_cons);
+
+       __bnxt_poll_work_done(bp, bnapi);
        return rx_pkts;
 }
 
index 50b129e53a48310ec9ee25fce361fa7e626cb3c9..48cb2d54c3bc60bf4724bf1d45e791e3de00d262 100644 (file)
@@ -792,6 +792,8 @@ struct bnxt_cp_ring_info {
        u32                     cp_raw_cons;
        struct bnxt_db_info     cp_db;
 
+       u8                      had_work_done:1;
+
        struct bnxt_coal        rx_ring_coal;
        u64                     rx_packets;
        u64                     rx_bytes;
@@ -829,6 +831,9 @@ struct bnxt_napi {
 
        void                    (*tx_int)(struct bnxt *, struct bnxt_napi *,
                                          int);
+       int                     tx_pkts;
+       u8                      events;
+
        u32                     flags;
 #define BNXT_NAPI_FLAG_XDP     0x1