Skip to content

Commit de37faf

Browse files
Michael Chankuba-moo
authored andcommitted
bnxt_en: Fix GSO type for HW GRO packets on 5750X chips
The existing code is using RSS profile to determine IPV4/IPV6 GSO type on all chips older than 5760X. This won't work on 5750X chips that may be using modified RSS profiles. This commit from 2018 has updated the driver to not use RSS profile for HW GRO packets on newer chips: 50f011b ("bnxt_en: Update RSS setup and GRO-HW logic according to the latest spec.") However, a recent commit to add support for the newest 5760X chip broke the logic. If the GRO packet needs to be re-segmented by the stack, the wrong GSO type will cause the packet to be dropped. Fix it to only use RSS profile to determine GSO type on the oldest 5730X/5740X chips which cannot use the new method and is safe to use the RSS profiles. Also fix the L3/L4 hash type for RX packets by not using the RSS profile for the same reason. Use the ITYPE field in the RX completion to determine L3/L4 hash types correctly. Fixes: a7445d6 ("bnxt_en: Add support for new RX and TPA_START completion types for P7") Reviewed-by: Colin Winegarden <[email protected]> Reviewed-by: Somnath Kotur <[email protected]> Reviewed-by: Kalesh AP <[email protected]> Signed-off-by: Michael Chan <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 5e7aa97 commit de37faf

File tree

2 files changed

+9
-8
lines changed

2 files changed

+9
-8
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
15311531
if (TPA_START_IS_IPV6(tpa_start1))
15321532
tpa_info->gso_type = SKB_GSO_TCPV6;
15331533
/* RSS profiles 1 and 3 with extract code 0 for inner 4-tuple */
1534-
else if (cmp_type == CMP_TYPE_RX_L2_TPA_START_CMP &&
1534+
else if (!BNXT_CHIP_P4_PLUS(bp) &&
15351535
TPA_START_HASH_TYPE(tpa_start) == 3)
15361536
tpa_info->gso_type = SKB_GSO_TCPV6;
15371537
tpa_info->rss_hash =
@@ -2226,15 +2226,13 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
22262226
if (cmp_type == CMP_TYPE_RX_L2_V3_CMP) {
22272227
type = bnxt_rss_ext_op(bp, rxcmp);
22282228
} else {
2229-
u32 hash_type = RX_CMP_HASH_TYPE(rxcmp);
2229+
u32 itypes = RX_CMP_ITYPES(rxcmp);
22302230

2231-
/* RSS profiles 1 and 3 with extract code 0 for inner
2232-
* 4-tuple
2233-
*/
2234-
if (hash_type != 1 && hash_type != 3)
2235-
type = PKT_HASH_TYPE_L3;
2236-
else
2231+
if (itypes == RX_CMP_FLAGS_ITYPE_TCP ||
2232+
itypes == RX_CMP_FLAGS_ITYPE_UDP)
22372233
type = PKT_HASH_TYPE_L4;
2234+
else
2235+
type = PKT_HASH_TYPE_L3;
22382236
}
22392237
skb_set_hash(skb, le32_to_cpu(rxcmp->rx_cmp_rss_hash), type);
22402238
}

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ struct rx_cmp {
267267
(((le32_to_cpu((rxcmp)->rx_cmp_misc_v1) & RX_CMP_RSS_HASH_TYPE) >>\
268268
RX_CMP_RSS_HASH_TYPE_SHIFT) & RSS_PROFILE_ID_MASK)
269269

270+
#define RX_CMP_ITYPES(rxcmp) \
271+
(le32_to_cpu((rxcmp)->rx_cmp_len_flags_type) & RX_CMP_FLAGS_ITYPES_MASK)
272+
270273
#define RX_CMP_V3_HASH_TYPE_LEGACY(rxcmp) \
271274
((le32_to_cpu((rxcmp)->rx_cmp_misc_v1) & RX_CMP_V3_RSS_EXT_OP_LEGACY) >>\
272275
RX_CMP_V3_RSS_EXT_OP_LEGACY_SHIFT)

0 commit comments

Comments
 (0)