Merge branch 'net-mvpp2-rss-fixes'
Sven Auhagen says: ==================== net: mvpp2: rss fixes This patch series fixes up some rss problems in the mvpp2 driver. The classifier is missing some fragmentation flags, the parser has the QinQ headers switched and the PPPoE Layer 4 detecion is not working correctly. This is leading to no or bad rss for the default settings. ==================== Link: https://lore.kernel.org/r/20230325163903.ofefgus43x66as7i@Svens-MacBookPro.local Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Коммит
b4c66d755e
|
@ -62,35 +62,38 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
|||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_UNTAG,
|
||||
MVPP22_CLS_HEK_IP4_2T,
|
||||
MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 |
|
||||
MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_UNTAG,
|
||||
MVPP22_CLS_HEK_IP4_2T,
|
||||
MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT |
|
||||
MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_UNTAG,
|
||||
MVPP22_CLS_HEK_IP4_2T,
|
||||
MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER |
|
||||
MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
|
||||
|
||||
/* TCP over IPv4 flows, fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_TCP4, MVPP2_FL_IP4_TCP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_TCP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
/* UDP over IPv4 flows, Not fragmented, no vlan tag */
|
||||
|
@ -132,35 +135,38 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
|
|||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_UNTAG,
|
||||
MVPP22_CLS_HEK_IP4_2T,
|
||||
MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4 |
|
||||
MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_UNTAG,
|
||||
MVPP22_CLS_HEK_IP4_2T,
|
||||
MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OPT |
|
||||
MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_UNTAG,
|
||||
MVPP22_CLS_HEK_IP4_2T,
|
||||
MVPP2_PRS_RI_VLAN_NONE | MVPP2_PRS_RI_L3_IP4_OTHER |
|
||||
MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_RI_IP_FRAG_TRUE | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK | MVPP2_PRS_RI_VLAN_MASK),
|
||||
|
||||
/* UDP over IPv4 flows, fragmented, with vlan tag */
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_RI_L3_IP4 | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_RI_L3_IP4_OPT | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
MVPP2_DEF_FLOW(MVPP22_FLOW_UDP4, MVPP2_FL_IP4_UDP_FRAG_TAG,
|
||||
MVPP22_CLS_HEK_IP4_2T | MVPP22_CLS_HEK_TAGGED,
|
||||
MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_RI_L3_IP4_OTHER | MVPP2_PRS_RI_IP_FRAG_TRUE |
|
||||
MVPP2_PRS_RI_L4_UDP,
|
||||
MVPP2_PRS_IP_MASK),
|
||||
|
||||
/* TCP over IPv6 flows, not fragmented, no vlan tag */
|
||||
|
|
|
@ -1539,8 +1539,8 @@ static int mvpp2_prs_vlan_init(struct platform_device *pdev, struct mvpp2 *priv)
|
|||
if (!priv->prs_double_vlans)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Double VLAN: 0x8100, 0x88A8 */
|
||||
err = mvpp2_prs_double_vlan_add(priv, ETH_P_8021Q, ETH_P_8021AD,
|
||||
/* Double VLAN: 0x88A8, 0x8100 */
|
||||
err = mvpp2_prs_double_vlan_add(priv, ETH_P_8021AD, ETH_P_8021Q,
|
||||
MVPP2_PRS_PORT_MASK);
|
||||
if (err)
|
||||
return err;
|
||||
|
@ -1607,59 +1607,45 @@ static int mvpp2_prs_vlan_init(struct platform_device *pdev, struct mvpp2 *priv)
|
|||
static int mvpp2_prs_pppoe_init(struct mvpp2 *priv)
|
||||
{
|
||||
struct mvpp2_prs_entry pe;
|
||||
int tid;
|
||||
int tid, ihl;
|
||||
|
||||
/* IPv4 over PPPoE with options */
|
||||
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
|
||||
MVPP2_PE_LAST_FREE_TID);
|
||||
if (tid < 0)
|
||||
return tid;
|
||||
/* IPv4 over PPPoE with header length >= 5 */
|
||||
for (ihl = MVPP2_PRS_IPV4_IHL_MIN; ihl <= MVPP2_PRS_IPV4_IHL_MAX; ihl++) {
|
||||
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
|
||||
MVPP2_PE_LAST_FREE_TID);
|
||||
if (tid < 0)
|
||||
return tid;
|
||||
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_PPPOE);
|
||||
pe.index = tid;
|
||||
memset(&pe, 0, sizeof(pe));
|
||||
mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_PPPOE);
|
||||
pe.index = tid;
|
||||
|
||||
mvpp2_prs_match_etype(&pe, 0, PPP_IP);
|
||||
mvpp2_prs_match_etype(&pe, 0, PPP_IP);
|
||||
mvpp2_prs_tcam_data_byte_set(&pe, MVPP2_ETH_TYPE_LEN,
|
||||
MVPP2_PRS_IPV4_HEAD | ihl,
|
||||
MVPP2_PRS_IPV4_HEAD_MASK |
|
||||
MVPP2_PRS_IPV4_IHL_MASK);
|
||||
|
||||
mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_IP4);
|
||||
mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP4_OPT,
|
||||
MVPP2_PRS_RI_L3_PROTO_MASK);
|
||||
/* goto ipv4 dest-address (skip eth_type + IP-header-size - 4) */
|
||||
mvpp2_prs_sram_shift_set(&pe, MVPP2_ETH_TYPE_LEN +
|
||||
sizeof(struct iphdr) - 4,
|
||||
MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
|
||||
/* Set L3 offset */
|
||||
mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3,
|
||||
MVPP2_ETH_TYPE_LEN,
|
||||
MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
|
||||
mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_IP4);
|
||||
mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP4,
|
||||
MVPP2_PRS_RI_L3_PROTO_MASK);
|
||||
/* goto ipv4 dst-address (skip eth_type + IP-header-size - 4) */
|
||||
mvpp2_prs_sram_shift_set(&pe, MVPP2_ETH_TYPE_LEN +
|
||||
sizeof(struct iphdr) - 4,
|
||||
MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD);
|
||||
/* Set L3 offset */
|
||||
mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L3,
|
||||
MVPP2_ETH_TYPE_LEN,
|
||||
MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
|
||||
/* Set L4 offset */
|
||||
mvpp2_prs_sram_offset_set(&pe, MVPP2_PRS_SRAM_UDF_TYPE_L4,
|
||||
MVPP2_ETH_TYPE_LEN + (ihl * 4),
|
||||
MVPP2_PRS_SRAM_OP_SEL_UDF_ADD);
|
||||
|
||||
/* Update shadow table and hw entry */
|
||||
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_PPPOE);
|
||||
mvpp2_prs_hw_write(priv, &pe);
|
||||
|
||||
/* IPv4 over PPPoE without options */
|
||||
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
|
||||
MVPP2_PE_LAST_FREE_TID);
|
||||
if (tid < 0)
|
||||
return tid;
|
||||
|
||||
pe.index = tid;
|
||||
|
||||
mvpp2_prs_tcam_data_byte_set(&pe, MVPP2_ETH_TYPE_LEN,
|
||||
MVPP2_PRS_IPV4_HEAD |
|
||||
MVPP2_PRS_IPV4_IHL_MIN,
|
||||
MVPP2_PRS_IPV4_HEAD_MASK |
|
||||
MVPP2_PRS_IPV4_IHL_MASK);
|
||||
|
||||
/* Clear ri before updating */
|
||||
pe.sram[MVPP2_PRS_SRAM_RI_WORD] = 0x0;
|
||||
pe.sram[MVPP2_PRS_SRAM_RI_CTRL_WORD] = 0x0;
|
||||
mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_L3_IP4,
|
||||
MVPP2_PRS_RI_L3_PROTO_MASK);
|
||||
|
||||
/* Update shadow table and hw entry */
|
||||
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_PPPOE);
|
||||
mvpp2_prs_hw_write(priv, &pe);
|
||||
/* Update shadow table and hw entry */
|
||||
mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_PPPOE);
|
||||
mvpp2_prs_hw_write(priv, &pe);
|
||||
}
|
||||
|
||||
/* IPv6 over PPPoE */
|
||||
tid = mvpp2_prs_tcam_first_free(priv, MVPP2_PE_FIRST_FREE_TID,
|
||||
|
|
Загрузка…
Ссылка в новой задаче