bnxt_en: Handle standalone RX_AGG completions.
authorMichael Chan <michael.chan@broadcom.com>
Mon, 29 Jul 2019 10:10:22 +0000 (06:10 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 29 Jul 2019 21:19:09 +0000 (14:19 -0700)
On the new 57500 chips, these new RX_AGG completions are not coalesced
at the TPA_END completion.  Handle these by storing them in the
array in the bnxt_tpa_info struct, as they are seen when processing
the CMPL ring.

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 47f59e0ae147c2a78245e372c46c308e58ad7d6c..f0867402f3b0d365bbf74112c86c6c6c4e3ec991 100644 (file)
@@ -1517,6 +1517,17 @@ static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp,
        return skb;
 }
 
+static void bnxt_tpa_agg(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
+                        struct rx_agg_cmp *rx_agg)
+{
+       u16 agg_id = TPA_AGG_AGG_ID(rx_agg);
+       struct bnxt_tpa_info *tpa_info;
+
+       tpa_info = &rxr->rx_tpa[agg_id];
+       BUG_ON(tpa_info->agg_count >= MAX_SKB_FRAGS);
+       tpa_info->agg_arr[tpa_info->agg_count++] = *rx_agg;
+}
+
 static void bnxt_deliver_skb(struct bnxt *bp, struct bnxt_napi *bnapi,
                             struct sk_buff *skb)
 {
@@ -1558,6 +1569,13 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
        rxcmp = (struct rx_cmp *)
                        &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
 
+       cmp_type = RX_CMP_TYPE(rxcmp);
+
+       if (cmp_type == CMP_TYPE_RX_TPA_AGG_CMP) {
+               bnxt_tpa_agg(bp, rxr, (struct rx_agg_cmp *)rxcmp);
+               goto next_rx_no_prod_no_len;
+       }
+
        tmp_raw_cons = NEXT_RAW_CMP(tmp_raw_cons);
        cp_cons = RING_CMP(tmp_raw_cons);
        rxcmp1 = (struct rx_cmp_ext *)
@@ -1566,8 +1584,6 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
        if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons))
                return -EBUSY;
 
-       cmp_type = RX_CMP_TYPE(rxcmp);
-
        prod = rxr->rx_prod;
 
        if (cmp_type == CMP_TYPE_RX_L2_TPA_START_CMP) {