blob: 93b47aff7104e39bf7601f335cd83853f92518ec [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001From c2d639d118d27d6419f5848675ed5c112a86910f Mon Sep 17 00:00:00 2001
2From: Florian Fainelli <f.fainelli@gmail.com>
3Date: Mon, 30 Mar 2020 14:38:52 -0700
4Subject: [PATCH] net: dsa: bcm_sf2: Move writing of CFP_DATA(5) into slicing
5 functions
6
7In preparation for matching VLANs, move the writing of CFP_DATA(5) into
8the IPv4 and IPv6 slicing logic since they are part of the per-flow
9configuration.
10
11Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
12Signed-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]);