Re: [PATCH net] net: mvpp2: Add TCAM entry to drop flow control pause frames

From: Antoine Tenart
Date: Thu Dec 17 2020 - 13:04:53 EST


Quoting stefanc@xxxxxxxxxxx (2020-12-17 18:45:06)
> From: Stefan Chulski <stefanc@xxxxxxxxxxx>
>
> Issue:
> Flow control frame used to pause GoP(MAC) was delivered to the CPU
> and created a load on the CPU. Since XOFF/XON frames are used only
> by MAC, these frames should be dropped inside MAC.
>
> Fix:
> According to 802.3-2012 - IEEE Standard for Ethernet pause frame
> has unique destination MAC address 01-80-C2-00-00-01.
> Add TCAM parser entry to track and drop pause frames by destination MAC.
>
> Fixes: db9d7d36eecc ("net: mvpp2: Split the PPv2 driver to a dedicated directory")

Same here, you should go further in the git history.

Also, was that introduced when the TCAM support landed in (overriding
its default configuration?)? Or is that the behaviour since the
beginning? I'm asking because while this could very be a fix, it could
also fall in the improvements category.

Thanks!
Antoine

> Signed-off-by: Stefan Chulski <stefanc@xxxxxxxxxxx>
> ---
> drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c | 34 ++++++++++++++++++++++++++
> drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h | 2 +-
> 2 files changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c
> index 1a272c2..3a9c747 100644
> --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c
> +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c
> @@ -405,6 +405,39 @@ static int mvpp2_prs_tcam_first_free(struct mvpp2 *priv, unsigned char start,
> return -EINVAL;
> }
>
> +/* Drop flow control pause frames */
> +static void mvpp2_prs_drop_fc(struct mvpp2 *priv)
> +{
> + struct mvpp2_prs_entry pe;
> + unsigned int len;
> + unsigned char da[ETH_ALEN] = {
> + 0x01, 0x80, 0xC2, 0x00, 0x00, 0x01 };
> +
> + memset(&pe, 0, sizeof(pe));
> +
> + /* For all ports - drop flow control frames */
> + pe.index = MVPP2_PE_FC_DROP;
> + mvpp2_prs_tcam_lu_set(&pe, MVPP2_PRS_LU_MAC);
> +
> + /* Set match on DA */
> + len = ETH_ALEN;
> + while (len--)
> + mvpp2_prs_tcam_data_byte_set(&pe, len, da[len], 0xff);
> +
> + mvpp2_prs_sram_ri_update(&pe, MVPP2_PRS_RI_DROP_MASK,
> + MVPP2_PRS_RI_DROP_MASK);
> +
> + mvpp2_prs_sram_bits_set(&pe, MVPP2_PRS_SRAM_LU_GEN_BIT, 1);
> + mvpp2_prs_sram_next_lu_set(&pe, MVPP2_PRS_LU_FLOWS);
> +
> + /* Mask all ports */
> + mvpp2_prs_tcam_port_map_set(&pe, MVPP2_PRS_PORT_MASK);
> +
> + /* Update shadow table and hw entry */
> + mvpp2_prs_shadow_set(priv, pe.index, MVPP2_PRS_LU_MAC);
> + mvpp2_prs_hw_write(priv, &pe);
> +}
> +
> /* Enable/disable dropping all mac da's */
> static void mvpp2_prs_mac_drop_all_set(struct mvpp2 *priv, int port, bool add)
> {
> @@ -1168,6 +1201,7 @@ static void mvpp2_prs_mac_init(struct mvpp2 *priv)
> mvpp2_prs_hw_write(priv, &pe);
>
> /* Create dummy entries for drop all and promiscuous modes */
> + mvpp2_prs_drop_fc(priv);
> mvpp2_prs_mac_drop_all_set(priv, 0, false);
> mvpp2_prs_mac_promisc_set(priv, 0, MVPP2_PRS_L2_UNI_CAST, false);
> mvpp2_prs_mac_promisc_set(priv, 0, MVPP2_PRS_L2_MULTI_CAST, false);
> diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h
> index e22f6c8..4b68dd3 100644
> --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h
> +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.h
> @@ -129,7 +129,7 @@
> #define MVPP2_PE_VID_EDSA_FLTR_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 7)
> #define MVPP2_PE_VLAN_DBL (MVPP2_PRS_TCAM_SRAM_SIZE - 6)
> #define MVPP2_PE_VLAN_NONE (MVPP2_PRS_TCAM_SRAM_SIZE - 5)
> -/* reserved */
> +#define MVPP2_PE_FC_DROP (MVPP2_PRS_TCAM_SRAM_SIZE - 4)
> #define MVPP2_PE_MAC_MC_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 3)
> #define MVPP2_PE_MAC_UC_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 2)
> #define MVPP2_PE_MAC_NON_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 1)
> --
> 1.9.1
>