| .. | .. |
|---|
| 33 | 33 | MLXSW_AFK_ELEMENT_IP_TTL_, |
|---|
| 34 | 34 | MLXSW_AFK_ELEMENT_IP_ECN, |
|---|
| 35 | 35 | MLXSW_AFK_ELEMENT_IP_DSCP, |
|---|
| 36 | + MLXSW_AFK_ELEMENT_VIRT_ROUTER_8_10, |
|---|
| 37 | + MLXSW_AFK_ELEMENT_VIRT_ROUTER_0_7, |
|---|
| 36 | 38 | MLXSW_AFK_ELEMENT_MAX, |
|---|
| 37 | 39 | }; |
|---|
| 38 | 40 | |
|---|
| .. | .. |
|---|
| 67 | 69 | MLXSW_AFK_ELEMENT_INFO(MLXSW_AFK_ELEMENT_TYPE_BUF, \ |
|---|
| 68 | 70 | _element, _offset, 0, _size) |
|---|
| 69 | 71 | |
|---|
| 70 | | -/* For the purpose of the driver, define an internal storage scratchpad |
|---|
| 71 | | - * that will be used to store key/mask values. For each defined element type |
|---|
| 72 | | - * define an internal storage geometry. |
|---|
| 73 | | - */ |
|---|
| 74 | | -static const struct mlxsw_afk_element_info mlxsw_afk_element_infos[] = { |
|---|
| 75 | | - MLXSW_AFK_ELEMENT_INFO_U32(SRC_SYS_PORT, 0x00, 16, 8), |
|---|
| 76 | | - MLXSW_AFK_ELEMENT_INFO_BUF(DMAC_32_47, 0x04, 2), |
|---|
| 77 | | - MLXSW_AFK_ELEMENT_INFO_BUF(DMAC_0_31, 0x06, 4), |
|---|
| 78 | | - MLXSW_AFK_ELEMENT_INFO_BUF(SMAC_32_47, 0x0A, 2), |
|---|
| 79 | | - MLXSW_AFK_ELEMENT_INFO_BUF(SMAC_0_31, 0x0C, 4), |
|---|
| 80 | | - MLXSW_AFK_ELEMENT_INFO_U32(ETHERTYPE, 0x00, 0, 16), |
|---|
| 81 | | - MLXSW_AFK_ELEMENT_INFO_U32(IP_PROTO, 0x10, 0, 8), |
|---|
| 82 | | - MLXSW_AFK_ELEMENT_INFO_U32(VID, 0x10, 8, 12), |
|---|
| 83 | | - MLXSW_AFK_ELEMENT_INFO_U32(PCP, 0x10, 20, 3), |
|---|
| 84 | | - MLXSW_AFK_ELEMENT_INFO_U32(TCP_FLAGS, 0x10, 23, 9), |
|---|
| 85 | | - MLXSW_AFK_ELEMENT_INFO_U32(DST_L4_PORT, 0x14, 0, 16), |
|---|
| 86 | | - MLXSW_AFK_ELEMENT_INFO_U32(SRC_L4_PORT, 0x14, 16, 16), |
|---|
| 87 | | - MLXSW_AFK_ELEMENT_INFO_U32(IP_TTL_, 0x18, 0, 8), |
|---|
| 88 | | - MLXSW_AFK_ELEMENT_INFO_U32(IP_ECN, 0x18, 9, 2), |
|---|
| 89 | | - MLXSW_AFK_ELEMENT_INFO_U32(IP_DSCP, 0x18, 11, 6), |
|---|
| 90 | | - MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_96_127, 0x20, 4), |
|---|
| 91 | | - MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_64_95, 0x24, 4), |
|---|
| 92 | | - MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_32_63, 0x28, 4), |
|---|
| 93 | | - MLXSW_AFK_ELEMENT_INFO_BUF(SRC_IP_0_31, 0x2C, 4), |
|---|
| 94 | | - MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_96_127, 0x30, 4), |
|---|
| 95 | | - MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_64_95, 0x34, 4), |
|---|
| 96 | | - MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_32_63, 0x38, 4), |
|---|
| 97 | | - MLXSW_AFK_ELEMENT_INFO_BUF(DST_IP_0_31, 0x3C, 4), |
|---|
| 98 | | -}; |
|---|
| 99 | | - |
|---|
| 100 | 72 | #define MLXSW_AFK_ELEMENT_STORAGE_SIZE 0x40 |
|---|
| 101 | 73 | |
|---|
| 102 | 74 | struct mlxsw_afk_element_inst { /* element instance in actual block */ |
|---|
| 103 | | - const struct mlxsw_afk_element_info *info; |
|---|
| 75 | + enum mlxsw_afk_element element; |
|---|
| 104 | 76 | enum mlxsw_afk_element_type type; |
|---|
| 105 | 77 | struct mlxsw_item item; /* element geometry in block */ |
|---|
| 78 | + int u32_key_diff; /* in case value needs to be adjusted before write |
|---|
| 79 | + * this diff is here to handle that |
|---|
| 80 | + */ |
|---|
| 81 | + bool avoid_size_check; |
|---|
| 106 | 82 | }; |
|---|
| 107 | 83 | |
|---|
| 108 | | -#define MLXSW_AFK_ELEMENT_INST(_type, _element, _offset, _shift, _size) \ |
|---|
| 84 | +#define MLXSW_AFK_ELEMENT_INST(_type, _element, _offset, \ |
|---|
| 85 | + _shift, _size, _u32_key_diff, _avoid_size_check) \ |
|---|
| 109 | 86 | { \ |
|---|
| 110 | | - .info = &mlxsw_afk_element_infos[MLXSW_AFK_ELEMENT_##_element], \ |
|---|
| 87 | + .element = MLXSW_AFK_ELEMENT_##_element, \ |
|---|
| 111 | 88 | .type = _type, \ |
|---|
| 112 | 89 | .item = { \ |
|---|
| 113 | 90 | .offset = _offset, \ |
|---|
| .. | .. |
|---|
| 115 | 92 | .size = {.bits = _size}, \ |
|---|
| 116 | 93 | .name = #_element, \ |
|---|
| 117 | 94 | }, \ |
|---|
| 95 | + .u32_key_diff = _u32_key_diff, \ |
|---|
| 96 | + .avoid_size_check = _avoid_size_check, \ |
|---|
| 118 | 97 | } |
|---|
| 119 | 98 | |
|---|
| 120 | 99 | #define MLXSW_AFK_ELEMENT_INST_U32(_element, _offset, _shift, _size) \ |
|---|
| 121 | 100 | MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_U32, \ |
|---|
| 122 | | - _element, _offset, _shift, _size) |
|---|
| 101 | + _element, _offset, _shift, _size, 0, false) |
|---|
| 102 | + |
|---|
| 103 | +#define MLXSW_AFK_ELEMENT_INST_EXT_U32(_element, _offset, \ |
|---|
| 104 | + _shift, _size, _key_diff, \ |
|---|
| 105 | + _avoid_size_check) \ |
|---|
| 106 | + MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_U32, \ |
|---|
| 107 | + _element, _offset, _shift, _size, \ |
|---|
| 108 | + _key_diff, _avoid_size_check) |
|---|
| 123 | 109 | |
|---|
| 124 | 110 | #define MLXSW_AFK_ELEMENT_INST_BUF(_element, _offset, _size) \ |
|---|
| 125 | 111 | MLXSW_AFK_ELEMENT_INST(MLXSW_AFK_ELEMENT_TYPE_BUF, \ |
|---|
| 126 | | - _element, _offset, 0, _size) |
|---|
| 112 | + _element, _offset, 0, _size, 0, false) |
|---|
| 127 | 113 | |
|---|
| 128 | 114 | struct mlxsw_afk_block { |
|---|
| 129 | 115 | u16 encoding; /* block ID */ |
|---|
| .. | .. |
|---|
| 188 | 174 | struct mlxsw_afk_ops { |
|---|
| 189 | 175 | const struct mlxsw_afk_block *blocks; |
|---|
| 190 | 176 | unsigned int blocks_count; |
|---|
| 191 | | - void (*encode_block)(char *block, int block_index, char *output); |
|---|
| 177 | + void (*encode_block)(char *output, int block_index, char *block); |
|---|
| 178 | + void (*clear_block)(char *output, int block_index); |
|---|
| 192 | 179 | }; |
|---|
| 193 | 180 | |
|---|
| 194 | 181 | struct mlxsw_afk *mlxsw_afk_create(unsigned int max_blocks, |
|---|
| .. | .. |
|---|
| 228 | 215 | void mlxsw_afk_encode(struct mlxsw_afk *mlxsw_afk, |
|---|
| 229 | 216 | struct mlxsw_afk_key_info *key_info, |
|---|
| 230 | 217 | struct mlxsw_afk_element_values *values, |
|---|
| 231 | | - char *key, char *mask, int block_start, int block_end); |
|---|
| 218 | + char *key, char *mask); |
|---|
| 219 | +void mlxsw_afk_clear(struct mlxsw_afk *mlxsw_afk, char *key, |
|---|
| 220 | + int block_start, int block_end); |
|---|
| 232 | 221 | |
|---|
| 233 | 222 | #endif |
|---|