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