| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | From c2d639d118d27d6419f5848675ed5c112a86910f Mon Sep 17 00:00:00 2001 | 
|  | 2 | From: Florian Fainelli <f.fainelli@gmail.com> | 
|  | 3 | Date: Mon, 30 Mar 2020 14:38:52 -0700 | 
|  | 4 | Subject: [PATCH] net: dsa: bcm_sf2: Move writing of CFP_DATA(5) into slicing | 
|  | 5 | functions | 
|  | 6 |  | 
|  | 7 | In preparation for matching VLANs, move the writing of CFP_DATA(5) into | 
|  | 8 | the IPv4 and IPv6 slicing logic since they are part of the per-flow | 
|  | 9 | configuration. | 
|  | 10 |  | 
|  | 11 | Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> | 
|  | 12 | Signed-off-by: David S. Miller <davem@davemloft.net> | 
|  | 13 | --- | 
|  | 14 | drivers/net/dsa/bcm_sf2_cfp.c | 64 +++++++++++++++++------------------ | 
|  | 15 | 1 file changed, 32 insertions(+), 32 deletions(-) | 
|  | 16 |  | 
|  | 17 | --- a/drivers/net/dsa/bcm_sf2_cfp.c | 
|  | 18 | +++ b/drivers/net/dsa/bcm_sf2_cfp.c | 
|  | 19 | @@ -261,11 +261,20 @@ static int bcm_sf2_cfp_act_pol_set(struc | 
|  | 20 | static void bcm_sf2_cfp_slice_ipv4(struct bcm_sf2_priv *priv, | 
|  | 21 | struct flow_dissector_key_ipv4_addrs *addrs, | 
|  | 22 | struct flow_dissector_key_ports *ports, | 
|  | 23 | -				   unsigned int slice_num, | 
|  | 24 | +				   unsigned int slice_num, u8 num_udf, | 
|  | 25 | bool mask) | 
|  | 26 | { | 
|  | 27 | u32 reg, offset; | 
|  | 28 |  | 
|  | 29 | +	/* UDF_Valid[7:0]	[31:24] | 
|  | 30 | +	 * S-Tag		[23:8] | 
|  | 31 | +	 * C-Tag		[7:0] | 
|  | 32 | +	 */ | 
|  | 33 | +	if (mask) | 
|  | 34 | +		core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_MASK_PORT(5)); | 
|  | 35 | +	else | 
|  | 36 | +		core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_DATA_PORT(5)); | 
|  | 37 | + | 
|  | 38 | /* C-Tag		[31:24] | 
|  | 39 | * UDF_n_A8		[23:8] | 
|  | 40 | * UDF_n_A7		[7:0] | 
|  | 41 | @@ -421,18 +430,11 @@ static int bcm_sf2_cfp_ipv4_rule_set(str | 
|  | 42 | core_writel(priv, layout->udfs[slice_num].mask_value | | 
|  | 43 | udf_upper_bits(num_udf), CORE_CFP_MASK_PORT(6)); | 
|  | 44 |  | 
|  | 45 | -	/* UDF_Valid[7:0]	[31:24] | 
|  | 46 | -	 * S-Tag		[23:8] | 
|  | 47 | -	 * C-Tag		[7:0] | 
|  | 48 | -	 */ | 
|  | 49 | -	core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_DATA_PORT(5)); | 
|  | 50 | - | 
|  | 51 | -	/* Mask all but valid UDFs */ | 
|  | 52 | -	core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_MASK_PORT(5)); | 
|  | 53 | - | 
|  | 54 | /* Program the match and the mask */ | 
|  | 55 | -	bcm_sf2_cfp_slice_ipv4(priv, ipv4.key, ports.key, slice_num, false); | 
|  | 56 | -	bcm_sf2_cfp_slice_ipv4(priv, ipv4.mask, ports.mask, SLICE_NUM_MASK, true); | 
|  | 57 | +	bcm_sf2_cfp_slice_ipv4(priv, ipv4.key, ports.key, slice_num, | 
|  | 58 | +			       num_udf, false); | 
|  | 59 | +	bcm_sf2_cfp_slice_ipv4(priv, ipv4.mask, ports.mask, SLICE_NUM_MASK, | 
|  | 60 | +			       num_udf, true); | 
|  | 61 |  | 
|  | 62 | /* Insert into TCAM now */ | 
|  | 63 | bcm_sf2_cfp_rule_addr_set(priv, rule_index); | 
|  | 64 | @@ -468,11 +470,20 @@ out_err_flow_rule: | 
|  | 65 |  | 
|  | 66 | static void bcm_sf2_cfp_slice_ipv6(struct bcm_sf2_priv *priv, | 
|  | 67 | const __be32 *ip6_addr, const __be16 port, | 
|  | 68 | -				   unsigned int slice_num, | 
|  | 69 | +				   unsigned int slice_num, u32 udf_bits, | 
|  | 70 | bool mask) | 
|  | 71 | { | 
|  | 72 | u32 reg, tmp, val, offset; | 
|  | 73 |  | 
|  | 74 | +	/* UDF_Valid[7:0]	[31:24] | 
|  | 75 | +	 * S-Tag		[23:8] | 
|  | 76 | +	 * C-Tag		[7:0] | 
|  | 77 | +	 */ | 
|  | 78 | +	if (mask) | 
|  | 79 | +		core_writel(priv, udf_bits << 24, CORE_CFP_MASK_PORT(5)); | 
|  | 80 | +	else | 
|  | 81 | +		core_writel(priv, udf_bits << 24, CORE_CFP_DATA_PORT(5)); | 
|  | 82 | + | 
|  | 83 | /* C-Tag		[31:24] | 
|  | 84 | * UDF_n_B8		[23:8]	(port) | 
|  | 85 | * UDF_n_B7 (upper)	[7:0]	(addr[15:8]) | 
|  | 86 | @@ -704,20 +715,13 @@ static int bcm_sf2_cfp_ipv6_rule_set(str | 
|  | 87 | reg = layout->udfs[slice_num].mask_value | udf_upper_bits(num_udf); | 
|  | 88 | core_writel(priv, reg, CORE_CFP_MASK_PORT(6)); | 
|  | 89 |  | 
|  | 90 | -	/* UDF_Valid[7:0]	[31:24] | 
|  | 91 | -	 * S-Tag		[23:8] | 
|  | 92 | -	 * C-Tag		[7:0] | 
|  | 93 | -	 */ | 
|  | 94 | -	core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_DATA_PORT(5)); | 
|  | 95 | - | 
|  | 96 | -	/* Mask all but valid UDFs */ | 
|  | 97 | -	core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_MASK_PORT(5)); | 
|  | 98 | - | 
|  | 99 | /* Slice the IPv6 source address and port */ | 
|  | 100 | bcm_sf2_cfp_slice_ipv6(priv, ipv6.key->src.in6_u.u6_addr32, | 
|  | 101 | -			       ports.key->src, slice_num, false); | 
|  | 102 | +			       ports.key->src, slice_num, | 
|  | 103 | +			       udf_lower_bits(num_udf), false); | 
|  | 104 | bcm_sf2_cfp_slice_ipv6(priv, ipv6.mask->src.in6_u.u6_addr32, | 
|  | 105 | -			       ports.mask->src, SLICE_NUM_MASK, true); | 
|  | 106 | +			       ports.mask->src, SLICE_NUM_MASK, | 
|  | 107 | +			       udf_lower_bits(num_udf), true); | 
|  | 108 |  | 
|  | 109 | /* Insert into TCAM now because we need to insert a second rule */ | 
|  | 110 | bcm_sf2_cfp_rule_addr_set(priv, rule_index[0]); | 
|  | 111 | @@ -768,16 +772,12 @@ static int bcm_sf2_cfp_ipv6_rule_set(str | 
|  | 112 | udf_lower_bits(num_udf) << 8; | 
|  | 113 | core_writel(priv, reg, CORE_CFP_MASK_PORT(6)); | 
|  | 114 |  | 
|  | 115 | -	/* Don't care */ | 
|  | 116 | -	core_writel(priv, 0, CORE_CFP_DATA_PORT(5)); | 
|  | 117 | - | 
|  | 118 | -	/* Mask all */ | 
|  | 119 | -	core_writel(priv, 0, CORE_CFP_MASK_PORT(5)); | 
|  | 120 | - | 
|  | 121 | bcm_sf2_cfp_slice_ipv6(priv, ipv6.key->dst.in6_u.u6_addr32, | 
|  | 122 | -			       ports.key->dst, slice_num, false); | 
|  | 123 | +			       ports.key->dst, slice_num, | 
|  | 124 | +			       0, false); | 
|  | 125 | bcm_sf2_cfp_slice_ipv6(priv, ipv6.mask->dst.in6_u.u6_addr32, | 
|  | 126 | -			       ports.key->dst, SLICE_NUM_MASK, true); | 
|  | 127 | +			       ports.key->dst, SLICE_NUM_MASK, | 
|  | 128 | +			       0, true); | 
|  | 129 |  | 
|  | 130 | /* Insert into TCAM now */ | 
|  | 131 | bcm_sf2_cfp_rule_addr_set(priv, rule_index[1]); |