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
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
11 Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
12 Signed-off-by: David S. Miller <davem@davemloft.net>
14 drivers/net/dsa/bcm_sf2_cfp.c | 64 +++++++++++++++++------------------
15 1 file changed, 32 insertions(+), 32 deletions(-)
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,
29 + /* UDF_Valid[7:0] [31:24]
34 + core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_MASK_PORT(5));
36 + core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_DATA_PORT(5));
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));
45 - /* UDF_Valid[7:0] [31:24]
49 - core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_DATA_PORT(5));
51 - /* Mask all but valid UDFs */
52 - core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_MASK_PORT(5));
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,
59 + bcm_sf2_cfp_slice_ipv4(priv, ipv4.mask, ports.mask, SLICE_NUM_MASK,
62 /* Insert into TCAM now */
63 bcm_sf2_cfp_rule_addr_set(priv, rule_index);
64 @@ -468,11 +470,20 @@ out_err_flow_rule:
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,
72 u32 reg, tmp, val, offset;
74 + /* UDF_Valid[7:0] [31:24]
79 + core_writel(priv, udf_bits << 24, CORE_CFP_MASK_PORT(5));
81 + core_writel(priv, udf_bits << 24, CORE_CFP_DATA_PORT(5));
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));
90 - /* UDF_Valid[7:0] [31:24]
94 - core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_DATA_PORT(5));
96 - /* Mask all but valid UDFs */
97 - core_writel(priv, udf_lower_bits(num_udf) << 24, CORE_CFP_MASK_PORT(5));
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);
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));
116 - core_writel(priv, 0, CORE_CFP_DATA_PORT(5));
119 - core_writel(priv, 0, CORE_CFP_MASK_PORT(5));
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,
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,
130 /* Insert into TCAM now */
131 bcm_sf2_cfp_rule_addr_set(priv, rule_index[1]);