bnxt_en: enable interrupt sampling on 5750X for DIM
authorAndy Gospodarek <gospo@broadcom.com>
Mon, 27 Dec 2021 08:00:28 +0000 (03:00 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 27 Dec 2021 12:00:28 +0000 (12:00 +0000)
5750X (P5) chips handle receiving packets on the NQ rather than the main
completion queue so we need to get and set stats from the correct spots
for dynamic interrupt moderation.

Signed-off-by: Andy Gospodarek <gospo@broadcom.com>
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

index 53101d00768ced48b6414cc92634cc4e6a4afc2e..11df2fc05f6a73cfe0fe0e57c8f8025c6908b9f2 100644 (file)
@@ -2632,6 +2632,7 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
 {
        struct bnxt_napi *bnapi = container_of(napi, struct bnxt_napi, napi);
        struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
+       struct bnxt_cp_ring_info *cpr_rx;
        u32 raw_cons = cpr->cp_raw_cons;
        struct bnxt *bp = bnapi->bp;
        struct nqe_cn *nqcmp;
@@ -2659,7 +2660,7 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
                        if (napi_complete_done(napi, work_done))
                                BNXT_DB_NQ_ARM_P5(&cpr->cp_db,
                                                  cpr->cp_raw_cons);
-                       return work_done;
+                       goto poll_done;
                }
 
                /* The valid test of the entry must be done first before
@@ -2685,6 +2686,17 @@ static int bnxt_poll_p5(struct napi_struct *napi, int budget)
                cpr->cp_raw_cons = raw_cons;
                BNXT_DB_NQ_P5(&cpr->cp_db, raw_cons);
        }
+poll_done:
+       cpr_rx = cpr->cp_ring_arr[BNXT_RX_HDL];
+       if (cpr_rx && (bp->flags & BNXT_FLAG_DIM)) {
+               struct dim_sample dim_sample = {};
+
+               dim_update_sample(cpr->event_ctr,
+                                 cpr_rx->rx_packets,
+                                 cpr_rx->rx_bytes,
+                                 &dim_sample);
+               net_dim(&cpr->dim, dim_sample);
+       }
        return work_done;
 }