hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_flex_keys.c
....@@ -12,7 +12,7 @@
1212 MLXSW_AFK_ELEMENT_INST_BUF(DMAC_0_31, 0x02, 4),
1313 MLXSW_AFK_ELEMENT_INST_U32(PCP, 0x08, 13, 3),
1414 MLXSW_AFK_ELEMENT_INST_U32(VID, 0x08, 0, 12),
15
- MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 8),
15
+ MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 16),
1616 };
1717
1818 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_l2_smac[] = {
....@@ -20,7 +20,7 @@
2020 MLXSW_AFK_ELEMENT_INST_BUF(SMAC_0_31, 0x02, 4),
2121 MLXSW_AFK_ELEMENT_INST_U32(PCP, 0x08, 13, 3),
2222 MLXSW_AFK_ELEMENT_INST_U32(VID, 0x08, 0, 12),
23
- MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 8),
23
+ MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 16),
2424 };
2525
2626 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_l2_smac_ex[] = {
....@@ -32,13 +32,13 @@
3232 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_sip[] = {
3333 MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP_0_31, 0x00, 4),
3434 MLXSW_AFK_ELEMENT_INST_U32(IP_PROTO, 0x08, 0, 8),
35
- MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 8),
35
+ MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 16),
3636 };
3737
3838 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_dip[] = {
3939 MLXSW_AFK_ELEMENT_INST_BUF(DST_IP_0_31, 0x00, 4),
4040 MLXSW_AFK_ELEMENT_INST_U32(IP_PROTO, 0x08, 0, 8),
41
- MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 8),
41
+ MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x0C, 0, 16),
4242 };
4343
4444 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4[] = {
....@@ -98,8 +98,8 @@
9898
9999 #define MLXSW_SP1_AFK_KEY_BLOCK_SIZE 16
100100
101
-static void mlxsw_sp1_afk_encode_block(char *block, int block_index,
102
- char *output)
101
+static void mlxsw_sp1_afk_encode_block(char *output, int block_index,
102
+ char *block)
103103 {
104104 unsigned int offset = block_index * MLXSW_SP1_AFK_KEY_BLOCK_SIZE;
105105 char *output_indexed = output + offset;
....@@ -107,10 +107,19 @@
107107 memcpy(output_indexed, block, MLXSW_SP1_AFK_KEY_BLOCK_SIZE);
108108 }
109109
110
+static void mlxsw_sp1_afk_clear_block(char *output, int block_index)
111
+{
112
+ unsigned int offset = block_index * MLXSW_SP1_AFK_KEY_BLOCK_SIZE;
113
+ char *output_indexed = output + offset;
114
+
115
+ memset(output_indexed, 0, MLXSW_SP1_AFK_KEY_BLOCK_SIZE);
116
+}
117
+
110118 const struct mlxsw_afk_ops mlxsw_sp1_afk_ops = {
111119 .blocks = mlxsw_sp1_afk_blocks,
112120 .blocks_count = ARRAY_SIZE(mlxsw_sp1_afk_blocks),
113121 .encode_block = mlxsw_sp1_afk_encode_block,
122
+ .clear_block = mlxsw_sp1_afk_clear_block,
114123 };
115124
116125 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_0[] = {
....@@ -140,7 +149,7 @@
140149
141150 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_5[] = {
142151 MLXSW_AFK_ELEMENT_INST_U32(VID, 0x04, 16, 12),
143
- MLXSW_AFK_ELEMENT_INST_U32(SRC_SYS_PORT, 0x04, 0, 8), /* RX_ACL_SYSTEM_PORT */
152
+ MLXSW_AFK_ELEMENT_INST_EXT_U32(SRC_SYS_PORT, 0x04, 0, 8, -1, true), /* RX_ACL_SYSTEM_PORT */
144153 };
145154
146155 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_0[] = {
....@@ -156,6 +165,11 @@
156165 MLXSW_AFK_ELEMENT_INST_U32(IP_ECN, 0x04, 6, 2),
157166 MLXSW_AFK_ELEMENT_INST_U32(IP_TTL_, 0x04, 8, 8),
158167 MLXSW_AFK_ELEMENT_INST_U32(IP_PROTO, 0x04, 16, 8),
168
+};
169
+
170
+static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_4[] = {
171
+ MLXSW_AFK_ELEMENT_INST_U32(VIRT_ROUTER_0_7, 0x04, 24, 8),
172
+ MLXSW_AFK_ELEMENT_INST_U32(VIRT_ROUTER_8_10, 0x00, 0, 3),
159173 };
160174
161175 static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv6_0[] = {
....@@ -201,6 +215,7 @@
201215 MLXSW_AFK_BLOCK(0x38, mlxsw_sp_afk_element_info_ipv4_0),
202216 MLXSW_AFK_BLOCK(0x39, mlxsw_sp_afk_element_info_ipv4_1),
203217 MLXSW_AFK_BLOCK(0x3A, mlxsw_sp_afk_element_info_ipv4_2),
218
+ MLXSW_AFK_BLOCK(0x3C, mlxsw_sp_afk_element_info_ipv4_4),
204219 MLXSW_AFK_BLOCK(0x40, mlxsw_sp_afk_element_info_ipv6_0),
205220 MLXSW_AFK_BLOCK(0x41, mlxsw_sp_afk_element_info_ipv6_1),
206221 MLXSW_AFK_BLOCK(0x42, mlxsw_sp_afk_element_info_ipv6_2),
....@@ -263,10 +278,9 @@
263278 MLXSW_SP2_AFK_BLOCK_LAYOUT(block11, 0x00, 12),
264279 };
265280
266
-static void mlxsw_sp2_afk_encode_block(char *block, int block_index,
267
- char *output)
281
+static void __mlxsw_sp2_afk_block_value_set(char *output, int block_index,
282
+ u64 block_value)
268283 {
269
- u64 block_value = mlxsw_sp2_afk_block_value_get(block);
270284 const struct mlxsw_sp2_afk_block_layout *block_layout;
271285
272286 if (WARN_ON(block_index < 0 ||
....@@ -278,8 +292,22 @@
278292 &block_layout->item, 0, block_value);
279293 }
280294
295
+static void mlxsw_sp2_afk_encode_block(char *output, int block_index,
296
+ char *block)
297
+{
298
+ u64 block_value = mlxsw_sp2_afk_block_value_get(block);
299
+
300
+ __mlxsw_sp2_afk_block_value_set(output, block_index, block_value);
301
+}
302
+
303
+static void mlxsw_sp2_afk_clear_block(char *output, int block_index)
304
+{
305
+ __mlxsw_sp2_afk_block_value_set(output, block_index, 0);
306
+}
307
+
281308 const struct mlxsw_afk_ops mlxsw_sp2_afk_ops = {
282309 .blocks = mlxsw_sp2_afk_blocks,
283310 .blocks_count = ARRAY_SIZE(mlxsw_sp2_afk_blocks),
284311 .encode_block = mlxsw_sp2_afk_encode_block,
312
+ .clear_block = mlxsw_sp2_afk_clear_block,
285313 };