.. | .. |
---|
12 | 12 | MLXSW_AFK_ELEMENT_INST_BUF(DMAC_0_31, 0x02, 4), |
---|
13 | 13 | MLXSW_AFK_ELEMENT_INST_U32(PCP, 0x08, 13, 3), |
---|
14 | 14 | 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), |
---|
16 | 16 | }; |
---|
17 | 17 | |
---|
18 | 18 | static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_l2_smac[] = { |
---|
.. | .. |
---|
20 | 20 | MLXSW_AFK_ELEMENT_INST_BUF(SMAC_0_31, 0x02, 4), |
---|
21 | 21 | MLXSW_AFK_ELEMENT_INST_U32(PCP, 0x08, 13, 3), |
---|
22 | 22 | 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), |
---|
24 | 24 | }; |
---|
25 | 25 | |
---|
26 | 26 | static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_l2_smac_ex[] = { |
---|
.. | .. |
---|
32 | 32 | static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_sip[] = { |
---|
33 | 33 | MLXSW_AFK_ELEMENT_INST_BUF(SRC_IP_0_31, 0x00, 4), |
---|
34 | 34 | 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), |
---|
36 | 36 | }; |
---|
37 | 37 | |
---|
38 | 38 | static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_dip[] = { |
---|
39 | 39 | MLXSW_AFK_ELEMENT_INST_BUF(DST_IP_0_31, 0x00, 4), |
---|
40 | 40 | 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), |
---|
42 | 42 | }; |
---|
43 | 43 | |
---|
44 | 44 | static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4[] = { |
---|
.. | .. |
---|
98 | 98 | |
---|
99 | 99 | #define MLXSW_SP1_AFK_KEY_BLOCK_SIZE 16 |
---|
100 | 100 | |
---|
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) |
---|
103 | 103 | { |
---|
104 | 104 | unsigned int offset = block_index * MLXSW_SP1_AFK_KEY_BLOCK_SIZE; |
---|
105 | 105 | char *output_indexed = output + offset; |
---|
.. | .. |
---|
107 | 107 | memcpy(output_indexed, block, MLXSW_SP1_AFK_KEY_BLOCK_SIZE); |
---|
108 | 108 | } |
---|
109 | 109 | |
---|
| 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 | + |
---|
110 | 118 | const struct mlxsw_afk_ops mlxsw_sp1_afk_ops = { |
---|
111 | 119 | .blocks = mlxsw_sp1_afk_blocks, |
---|
112 | 120 | .blocks_count = ARRAY_SIZE(mlxsw_sp1_afk_blocks), |
---|
113 | 121 | .encode_block = mlxsw_sp1_afk_encode_block, |
---|
| 122 | + .clear_block = mlxsw_sp1_afk_clear_block, |
---|
114 | 123 | }; |
---|
115 | 124 | |
---|
116 | 125 | static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_0[] = { |
---|
.. | .. |
---|
140 | 149 | |
---|
141 | 150 | static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_mac_5[] = { |
---|
142 | 151 | 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 */ |
---|
144 | 153 | }; |
---|
145 | 154 | |
---|
146 | 155 | static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv4_0[] = { |
---|
.. | .. |
---|
156 | 165 | MLXSW_AFK_ELEMENT_INST_U32(IP_ECN, 0x04, 6, 2), |
---|
157 | 166 | MLXSW_AFK_ELEMENT_INST_U32(IP_TTL_, 0x04, 8, 8), |
---|
158 | 167 | 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), |
---|
159 | 173 | }; |
---|
160 | 174 | |
---|
161 | 175 | static struct mlxsw_afk_element_inst mlxsw_sp_afk_element_info_ipv6_0[] = { |
---|
.. | .. |
---|
201 | 215 | MLXSW_AFK_BLOCK(0x38, mlxsw_sp_afk_element_info_ipv4_0), |
---|
202 | 216 | MLXSW_AFK_BLOCK(0x39, mlxsw_sp_afk_element_info_ipv4_1), |
---|
203 | 217 | MLXSW_AFK_BLOCK(0x3A, mlxsw_sp_afk_element_info_ipv4_2), |
---|
| 218 | + MLXSW_AFK_BLOCK(0x3C, mlxsw_sp_afk_element_info_ipv4_4), |
---|
204 | 219 | MLXSW_AFK_BLOCK(0x40, mlxsw_sp_afk_element_info_ipv6_0), |
---|
205 | 220 | MLXSW_AFK_BLOCK(0x41, mlxsw_sp_afk_element_info_ipv6_1), |
---|
206 | 221 | MLXSW_AFK_BLOCK(0x42, mlxsw_sp_afk_element_info_ipv6_2), |
---|
.. | .. |
---|
263 | 278 | MLXSW_SP2_AFK_BLOCK_LAYOUT(block11, 0x00, 12), |
---|
264 | 279 | }; |
---|
265 | 280 | |
---|
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) |
---|
268 | 283 | { |
---|
269 | | - u64 block_value = mlxsw_sp2_afk_block_value_get(block); |
---|
270 | 284 | const struct mlxsw_sp2_afk_block_layout *block_layout; |
---|
271 | 285 | |
---|
272 | 286 | if (WARN_ON(block_index < 0 || |
---|
.. | .. |
---|
278 | 292 | &block_layout->item, 0, block_value); |
---|
279 | 293 | } |
---|
280 | 294 | |
---|
| 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 | + |
---|
281 | 308 | const struct mlxsw_afk_ops mlxsw_sp2_afk_ops = { |
---|
282 | 309 | .blocks = mlxsw_sp2_afk_blocks, |
---|
283 | 310 | .blocks_count = ARRAY_SIZE(mlxsw_sp2_afk_blocks), |
---|
284 | 311 | .encode_block = mlxsw_sp2_afk_encode_block, |
---|
| 312 | + .clear_block = mlxsw_sp2_afk_clear_block, |
---|
285 | 313 | }; |
---|