| .. | .. |
|---|
| 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 | }; |
|---|