Skip to content

Commit aff3da3

Browse files
stefanchulskidavem330
authored andcommitted
net: mvpp2: fix parsing fragmentation detection
Parsing fragmentation detection failed due to wrong configured parser TCAM entry's. Some traffic was marked as fragmented in RX descriptor, even it wasn't IP fragmented. The hardware also failed to calculate checksums which lead to use software checksum and caused performance degradation. Fixes: 3f51850 ("ethernet: Add new driver for Marvell Armada 375 network unit") Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com> Signed-off-by: Stefan Chulski <stefanc@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 2580c4c commit aff3da3

File tree

1 file changed

+14
-6
lines changed
  • drivers/net/ethernet/marvell

1 file changed

+14
-6
lines changed

drivers/net/ethernet/marvell/mvpp2.c

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,7 @@ enum mvpp2_tag_type {
676676
#define MVPP2_PRS_RI_L3_MCAST BIT(15)
677677
#define MVPP2_PRS_RI_L3_BCAST (BIT(15) | BIT(16))
678678
#define MVPP2_PRS_RI_IP_FRAG_MASK 0x20000
679+
#define MVPP2_PRS_RI_IP_FRAG_TRUE BIT(17)
679680
#define MVPP2_PRS_RI_UDF3_MASK 0x300000
680681
#define MVPP2_PRS_RI_UDF3_RX_SPECIAL BIT(21)
681682
#define MVPP2_PRS_RI_L4_PROTO_MASK 0x1c00000
@@ -2315,7 +2316,7 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,
23152316
(proto != IPPROTO_IGMP))
23162317
return -EINVAL;
23172318

2318-
/* Fragmented packet */
2319+
/* Not fragmented packet */
23192320
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
23202321
MVPP2_PE_LAST_FREE_TID);
23212322
if (tid < 0)
@@ -2334,8 +2335,12 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,
23342335
MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
23352336
mvpp2_prs_sram_ai_update(&pe, MVPP2_PRS_IPV4_DIP_AI_BIT,
23362337
MVPP2_PRS_IPV4_DIP_AI_BIT);
2337-
mvpp2_prs_sram_ri_update(&pe, ri | MVPP2_PRS_RI_IP_FRAG_MASK,
2338-
ri_mask | MVPP2_PRS_RI_IP_FRAG_MASK);
2338+
mvpp2_prs_sram_ri_update(&pe, ri, ri_mask | MVPP2_PRS_RI_IP_FRAG_MASK);
2339+
2340+
mvpp2_prs_tcam_data_byte_set(&pe, 2, 0x00,
2341+
MVPP2_PRS_TCAM_PROTO_MASK_L);
2342+
mvpp2_prs_tcam_data_byte_set(&pe, 3, 0x00,
2343+
MVPP2_PRS_TCAM_PROTO_MASK);
23392344

23402345
mvpp2_prs_tcam_data_byte_set(&pe, 5, proto, MVPP2_PRS_TCAM_PROTO_MASK);
23412346
mvpp2_prs_tcam_ai_update(&pe, 0, MVPP2_PRS_IPV4_DIP_AI_BIT);
@@ -2346,7 +2351,7 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,
23462351
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_IP4);
23472352
mvpp2_prs_hw_write(priv, &pe);
23482353

2349-
/* Not fragmented packet */
2354+
/* Fragmented packet */
23502355
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
23512356
MVPP2_PE_LAST_FREE_TID);
23522357
if (tid < 0)
@@ -2358,8 +2363,11 @@ static int mvpp2_prs_ip4_proto(struct mvpp2 *priv, unsigned short proto,
23582363
pe.sram.word[MVPP2_PRS_SRAM_RI_CTRL_WORD] = 0x0;
23592364
mvpp2_prs_sram_ri_update(&pe, ri, ri_mask);
23602365

2361-
mvpp2_prs_tcam_data_byte_set(&pe, 2, 0x00, MVPP2_PRS_TCAM_PROTO_MASK_L);
2362-
mvpp2_prs_tcam_data_byte_set(&pe, 3, 0x00, MVPP2_PRS_TCAM_PROTO_MASK);
2366+
mvpp2_prs_sram_ri_update(&pe, ri | MVPP2_PRS_RI_IP_FRAG_TRUE,
2367+
ri_mask | MVPP2_PRS_RI_IP_FRAG_MASK);
2368+
2369+
mvpp2_prs_tcam_data_byte_set(&pe, 2, 0x00, 0x0);
2370+
mvpp2_prs_tcam_data_byte_set(&pe, 3, 0x00, 0x0);
23632371

23642372
/* Update shadow table and hw entry */
23652373
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_IP4);

0 commit comments

Comments
 (0)