Commit | Line | Data |
---|---|---|
d358aa9a GR |
1 | /******************************************************************************* |
2 | * | |
3 | * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver | |
b831607d | 4 | * Copyright(c) 2013 - 2014 Intel Corporation. |
d358aa9a GR |
5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | |
7 | * under the terms and conditions of the GNU General Public License, | |
8 | * version 2, as published by the Free Software Foundation. | |
9 | * | |
10 | * This program is distributed in the hope it will be useful, but WITHOUT | |
11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
13 | * more details. | |
14 | * | |
b831607d JB |
15 | * You should have received a copy of the GNU General Public License along |
16 | * with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 | * | |
d358aa9a GR |
18 | * The full GNU General Public License is included in this distribution in |
19 | * the file called "COPYING". | |
20 | * | |
21 | * Contact Information: | |
22 | * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> | |
23 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | |
24 | * | |
25 | ******************************************************************************/ | |
26 | ||
27 | #include "i40e_type.h" | |
28 | #include "i40e_adminq.h" | |
29 | #include "i40e_prototype.h" | |
30 | #include "i40e_virtchnl.h" | |
31 | ||
32 | /** | |
33 | * i40e_set_mac_type - Sets MAC type | |
34 | * @hw: pointer to the HW structure | |
35 | * | |
36 | * This function sets the mac type of the adapter based on the | |
37 | * vendor ID and device ID stored in the hw structure. | |
38 | **/ | |
39 | i40e_status i40e_set_mac_type(struct i40e_hw *hw) | |
40 | { | |
41 | i40e_status status = 0; | |
42 | ||
43 | if (hw->vendor_id == PCI_VENDOR_ID_INTEL) { | |
44 | switch (hw->device_id) { | |
ab60085e SN |
45 | case I40E_DEV_ID_SFP_XL710: |
46 | case I40E_DEV_ID_SFP_X710: | |
47 | case I40E_DEV_ID_QEMU: | |
48 | case I40E_DEV_ID_KX_A: | |
49 | case I40E_DEV_ID_KX_B: | |
50 | case I40E_DEV_ID_KX_C: | |
51 | case I40E_DEV_ID_KX_D: | |
52 | case I40E_DEV_ID_QSFP_A: | |
53 | case I40E_DEV_ID_QSFP_B: | |
54 | case I40E_DEV_ID_QSFP_C: | |
d358aa9a GR |
55 | hw->mac.type = I40E_MAC_XL710; |
56 | break; | |
ab60085e SN |
57 | case I40E_DEV_ID_VF: |
58 | case I40E_DEV_ID_VF_HV: | |
d358aa9a GR |
59 | hw->mac.type = I40E_MAC_VF; |
60 | break; | |
61 | default: | |
62 | hw->mac.type = I40E_MAC_GENERIC; | |
63 | break; | |
64 | } | |
65 | } else { | |
66 | status = I40E_ERR_DEVICE_NOT_SUPPORTED; | |
67 | } | |
68 | ||
69 | hw_dbg(hw, "i40e_set_mac_type found mac: %d, returns: %d\n", | |
70 | hw->mac.type, status); | |
71 | return status; | |
72 | } | |
73 | ||
74 | /** | |
75 | * i40evf_debug_aq | |
76 | * @hw: debug mask related to admin queue | |
77 | * @mask: debug mask | |
78 | * @desc: pointer to admin queue descriptor | |
79 | * @buffer: pointer to command buffer | |
80 | * | |
81 | * Dumps debug log about adminq command with descriptor contents. | |
82 | **/ | |
83 | void i40evf_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc, | |
84 | void *buffer) | |
85 | { | |
86 | struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc; | |
87 | u8 *aq_buffer = (u8 *)buffer; | |
88 | u32 data[4]; | |
89 | u32 i = 0; | |
90 | ||
91 | if ((!(mask & hw->debug_mask)) || (desc == NULL)) | |
92 | return; | |
93 | ||
94 | i40e_debug(hw, mask, | |
95 | "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n", | |
96 | aq_desc->opcode, aq_desc->flags, aq_desc->datalen, | |
97 | aq_desc->retval); | |
98 | i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n", | |
99 | aq_desc->cookie_high, aq_desc->cookie_low); | |
100 | i40e_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n", | |
101 | aq_desc->params.internal.param0, | |
102 | aq_desc->params.internal.param1); | |
103 | i40e_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n", | |
104 | aq_desc->params.external.addr_high, | |
105 | aq_desc->params.external.addr_low); | |
106 | ||
107 | if ((buffer != NULL) && (aq_desc->datalen != 0)) { | |
108 | memset(data, 0, sizeof(data)); | |
109 | i40e_debug(hw, mask, "AQ CMD Buffer:\n"); | |
110 | for (i = 0; i < le16_to_cpu(aq_desc->datalen); i++) { | |
111 | data[((i % 16) / 4)] |= | |
112 | ((u32)aq_buffer[i]) << (8 * (i % 4)); | |
113 | if ((i % 16) == 15) { | |
114 | i40e_debug(hw, mask, | |
115 | "\t0x%04X %08X %08X %08X %08X\n", | |
116 | i - 15, data[0], data[1], data[2], | |
117 | data[3]); | |
118 | memset(data, 0, sizeof(data)); | |
119 | } | |
120 | } | |
121 | if ((i % 16) != 0) | |
122 | i40e_debug(hw, mask, "\t0x%04X %08X %08X %08X %08X\n", | |
123 | i - (i % 16), data[0], data[1], data[2], | |
124 | data[3]); | |
125 | } | |
126 | } | |
127 | ||
128 | /** | |
129 | * i40evf_check_asq_alive | |
130 | * @hw: pointer to the hw struct | |
131 | * | |
132 | * Returns true if Queue is enabled else false. | |
133 | **/ | |
134 | bool i40evf_check_asq_alive(struct i40e_hw *hw) | |
135 | { | |
136 | return !!(rd32(hw, hw->aq.asq.len) & I40E_PF_ATQLEN_ATQENABLE_MASK); | |
137 | } | |
138 | ||
139 | /** | |
140 | * i40evf_aq_queue_shutdown | |
141 | * @hw: pointer to the hw struct | |
142 | * @unloading: is the driver unloading itself | |
143 | * | |
144 | * Tell the Firmware that we're shutting down the AdminQ and whether | |
145 | * or not the driver is unloading as well. | |
146 | **/ | |
147 | i40e_status i40evf_aq_queue_shutdown(struct i40e_hw *hw, | |
148 | bool unloading) | |
149 | { | |
150 | struct i40e_aq_desc desc; | |
151 | struct i40e_aqc_queue_shutdown *cmd = | |
152 | (struct i40e_aqc_queue_shutdown *)&desc.params.raw; | |
153 | i40e_status status; | |
154 | ||
155 | i40evf_fill_default_direct_cmd_desc(&desc, | |
156 | i40e_aqc_opc_queue_shutdown); | |
157 | ||
158 | if (unloading) | |
159 | cmd->driver_unloading = cpu_to_le32(I40E_AQ_DRIVER_UNLOADING); | |
160 | status = i40evf_asq_send_command(hw, &desc, NULL, 0, NULL); | |
161 | ||
162 | return status; | |
163 | } | |
164 | ||
165 | ||
37a622c1 | 166 | /* The i40evf_ptype_lookup table is used to convert from the 8-bit ptype in the |
206812b5 JB |
167 | * hardware to a bit-field that can be used by SW to more easily determine the |
168 | * packet type. | |
169 | * | |
170 | * Macros are used to shorten the table lines and make this table human | |
171 | * readable. | |
172 | * | |
173 | * We store the PTYPE in the top byte of the bit field - this is just so that | |
174 | * we can check that the table doesn't have a row missing, as the index into | |
175 | * the table should be the PTYPE. | |
176 | * | |
177 | * Typical work flow: | |
178 | * | |
37a622c1 | 179 | * IF NOT i40evf_ptype_lookup[ptype].known |
206812b5 JB |
180 | * THEN |
181 | * Packet is unknown | |
37a622c1 | 182 | * ELSE IF i40evf_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP |
206812b5 JB |
183 | * Use the rest of the fields to look at the tunnels, inner protocols, etc |
184 | * ELSE | |
185 | * Use the enum i40e_rx_l2_ptype to decode the packet type | |
186 | * ENDIF | |
187 | */ | |
188 | ||
189 | /* macro to make the table lines short */ | |
190 | #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\ | |
191 | { PTYPE, \ | |
192 | 1, \ | |
193 | I40E_RX_PTYPE_OUTER_##OUTER_IP, \ | |
194 | I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \ | |
195 | I40E_RX_PTYPE_##OUTER_FRAG, \ | |
196 | I40E_RX_PTYPE_TUNNEL_##T, \ | |
197 | I40E_RX_PTYPE_TUNNEL_END_##TE, \ | |
198 | I40E_RX_PTYPE_##TEF, \ | |
199 | I40E_RX_PTYPE_INNER_PROT_##I, \ | |
200 | I40E_RX_PTYPE_PAYLOAD_LAYER_##PL } | |
201 | ||
202 | #define I40E_PTT_UNUSED_ENTRY(PTYPE) \ | |
203 | { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 } | |
204 | ||
205 | /* shorter macros makes the table fit but are terse */ | |
206 | #define I40E_RX_PTYPE_NOF I40E_RX_PTYPE_NOT_FRAG | |
207 | #define I40E_RX_PTYPE_FRG I40E_RX_PTYPE_FRAG | |
208 | #define I40E_RX_PTYPE_INNER_PROT_TS I40E_RX_PTYPE_INNER_PROT_TIMESYNC | |
209 | ||
210 | /* Lookup table mapping the HW PTYPE to the bit field for decoding */ | |
37a622c1 | 211 | struct i40e_rx_ptype_decoded i40evf_ptype_lookup[] = { |
206812b5 JB |
212 | /* L2 Packet types */ |
213 | I40E_PTT_UNUSED_ENTRY(0), | |
214 | I40E_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), | |
215 | I40E_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2), | |
216 | I40E_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), | |
217 | I40E_PTT_UNUSED_ENTRY(4), | |
218 | I40E_PTT_UNUSED_ENTRY(5), | |
219 | I40E_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), | |
220 | I40E_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), | |
221 | I40E_PTT_UNUSED_ENTRY(8), | |
222 | I40E_PTT_UNUSED_ENTRY(9), | |
223 | I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), | |
224 | I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE), | |
225 | I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
226 | I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
227 | I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
228 | I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
229 | I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
230 | I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
231 | I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
232 | I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
233 | I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
234 | I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), | |
235 | ||
236 | /* Non Tunneled IPv4 */ | |
237 | I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3), | |
238 | I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3), | |
239 | I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4), | |
240 | I40E_PTT_UNUSED_ENTRY(25), | |
241 | I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4), | |
242 | I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4), | |
243 | I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4), | |
244 | ||
245 | /* IPv4 --> IPv4 */ | |
246 | I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3), | |
247 | I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3), | |
248 | I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4), | |
249 | I40E_PTT_UNUSED_ENTRY(32), | |
250 | I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4), | |
251 | I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4), | |
252 | I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4), | |
253 | ||
254 | /* IPv4 --> IPv6 */ | |
255 | I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3), | |
256 | I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3), | |
257 | I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4), | |
258 | I40E_PTT_UNUSED_ENTRY(39), | |
259 | I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4), | |
260 | I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4), | |
261 | I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4), | |
262 | ||
263 | /* IPv4 --> GRE/NAT */ | |
264 | I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3), | |
265 | ||
266 | /* IPv4 --> GRE/NAT --> IPv4 */ | |
267 | I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3), | |
268 | I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3), | |
269 | I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4), | |
270 | I40E_PTT_UNUSED_ENTRY(47), | |
271 | I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4), | |
272 | I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4), | |
273 | I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4), | |
274 | ||
275 | /* IPv4 --> GRE/NAT --> IPv6 */ | |
276 | I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3), | |
277 | I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3), | |
278 | I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4), | |
279 | I40E_PTT_UNUSED_ENTRY(54), | |
280 | I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4), | |
281 | I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4), | |
282 | I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4), | |
283 | ||
284 | /* IPv4 --> GRE/NAT --> MAC */ | |
285 | I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3), | |
286 | ||
287 | /* IPv4 --> GRE/NAT --> MAC --> IPv4 */ | |
288 | I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3), | |
289 | I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3), | |
290 | I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4), | |
291 | I40E_PTT_UNUSED_ENTRY(62), | |
292 | I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4), | |
293 | I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4), | |
294 | I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4), | |
295 | ||
296 | /* IPv4 --> GRE/NAT -> MAC --> IPv6 */ | |
297 | I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3), | |
298 | I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3), | |
299 | I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4), | |
300 | I40E_PTT_UNUSED_ENTRY(69), | |
301 | I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4), | |
302 | I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4), | |
303 | I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4), | |
304 | ||
305 | /* IPv4 --> GRE/NAT --> MAC/VLAN */ | |
306 | I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3), | |
307 | ||
308 | /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */ | |
309 | I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3), | |
310 | I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3), | |
311 | I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4), | |
312 | I40E_PTT_UNUSED_ENTRY(77), | |
313 | I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4), | |
314 | I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4), | |
315 | I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4), | |
316 | ||
317 | /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */ | |
318 | I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3), | |
319 | I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3), | |
320 | I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4), | |
321 | I40E_PTT_UNUSED_ENTRY(84), | |
322 | I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4), | |
323 | I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4), | |
324 | I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4), | |
325 | ||
326 | /* Non Tunneled IPv6 */ | |
327 | I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3), | |
328 | I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3), | |
329 | I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY3), | |
330 | I40E_PTT_UNUSED_ENTRY(91), | |
331 | I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4), | |
332 | I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4), | |
333 | I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4), | |
334 | ||
335 | /* IPv6 --> IPv4 */ | |
336 | I40E_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3), | |
337 | I40E_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3), | |
338 | I40E_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4), | |
339 | I40E_PTT_UNUSED_ENTRY(98), | |
340 | I40E_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4), | |
341 | I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4), | |
342 | I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4), | |
343 | ||
344 | /* IPv6 --> IPv6 */ | |
345 | I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3), | |
346 | I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3), | |
347 | I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4), | |
348 | I40E_PTT_UNUSED_ENTRY(105), | |
349 | I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4), | |
350 | I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4), | |
351 | I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4), | |
352 | ||
353 | /* IPv6 --> GRE/NAT */ | |
354 | I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3), | |
355 | ||
356 | /* IPv6 --> GRE/NAT -> IPv4 */ | |
357 | I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3), | |
358 | I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3), | |
359 | I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4), | |
360 | I40E_PTT_UNUSED_ENTRY(113), | |
361 | I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4), | |
362 | I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4), | |
363 | I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4), | |
364 | ||
365 | /* IPv6 --> GRE/NAT -> IPv6 */ | |
366 | I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3), | |
367 | I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3), | |
368 | I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4), | |
369 | I40E_PTT_UNUSED_ENTRY(120), | |
370 | I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4), | |
371 | I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4), | |
372 | I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4), | |
373 | ||
374 | /* IPv6 --> GRE/NAT -> MAC */ | |
375 | I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3), | |
376 | ||
377 | /* IPv6 --> GRE/NAT -> MAC -> IPv4 */ | |
378 | I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3), | |
379 | I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3), | |
380 | I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4), | |
381 | I40E_PTT_UNUSED_ENTRY(128), | |
382 | I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4), | |
383 | I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4), | |
384 | I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4), | |
385 | ||
386 | /* IPv6 --> GRE/NAT -> MAC -> IPv6 */ | |
387 | I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3), | |
388 | I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3), | |
389 | I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4), | |
390 | I40E_PTT_UNUSED_ENTRY(135), | |
391 | I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4), | |
392 | I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4), | |
393 | I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4), | |
394 | ||
395 | /* IPv6 --> GRE/NAT -> MAC/VLAN */ | |
396 | I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3), | |
397 | ||
398 | /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */ | |
399 | I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3), | |
400 | I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3), | |
401 | I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4), | |
402 | I40E_PTT_UNUSED_ENTRY(143), | |
403 | I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4), | |
404 | I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4), | |
405 | I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4), | |
406 | ||
407 | /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */ | |
408 | I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3), | |
409 | I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3), | |
410 | I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4), | |
411 | I40E_PTT_UNUSED_ENTRY(150), | |
412 | I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4), | |
413 | I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4), | |
414 | I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4), | |
415 | ||
416 | /* unused entries */ | |
417 | I40E_PTT_UNUSED_ENTRY(154), | |
418 | I40E_PTT_UNUSED_ENTRY(155), | |
419 | I40E_PTT_UNUSED_ENTRY(156), | |
420 | I40E_PTT_UNUSED_ENTRY(157), | |
421 | I40E_PTT_UNUSED_ENTRY(158), | |
422 | I40E_PTT_UNUSED_ENTRY(159), | |
423 | ||
424 | I40E_PTT_UNUSED_ENTRY(160), | |
425 | I40E_PTT_UNUSED_ENTRY(161), | |
426 | I40E_PTT_UNUSED_ENTRY(162), | |
427 | I40E_PTT_UNUSED_ENTRY(163), | |
428 | I40E_PTT_UNUSED_ENTRY(164), | |
429 | I40E_PTT_UNUSED_ENTRY(165), | |
430 | I40E_PTT_UNUSED_ENTRY(166), | |
431 | I40E_PTT_UNUSED_ENTRY(167), | |
432 | I40E_PTT_UNUSED_ENTRY(168), | |
433 | I40E_PTT_UNUSED_ENTRY(169), | |
434 | ||
435 | I40E_PTT_UNUSED_ENTRY(170), | |
436 | I40E_PTT_UNUSED_ENTRY(171), | |
437 | I40E_PTT_UNUSED_ENTRY(172), | |
438 | I40E_PTT_UNUSED_ENTRY(173), | |
439 | I40E_PTT_UNUSED_ENTRY(174), | |
440 | I40E_PTT_UNUSED_ENTRY(175), | |
441 | I40E_PTT_UNUSED_ENTRY(176), | |
442 | I40E_PTT_UNUSED_ENTRY(177), | |
443 | I40E_PTT_UNUSED_ENTRY(178), | |
444 | I40E_PTT_UNUSED_ENTRY(179), | |
445 | ||
446 | I40E_PTT_UNUSED_ENTRY(180), | |
447 | I40E_PTT_UNUSED_ENTRY(181), | |
448 | I40E_PTT_UNUSED_ENTRY(182), | |
449 | I40E_PTT_UNUSED_ENTRY(183), | |
450 | I40E_PTT_UNUSED_ENTRY(184), | |
451 | I40E_PTT_UNUSED_ENTRY(185), | |
452 | I40E_PTT_UNUSED_ENTRY(186), | |
453 | I40E_PTT_UNUSED_ENTRY(187), | |
454 | I40E_PTT_UNUSED_ENTRY(188), | |
455 | I40E_PTT_UNUSED_ENTRY(189), | |
456 | ||
457 | I40E_PTT_UNUSED_ENTRY(190), | |
458 | I40E_PTT_UNUSED_ENTRY(191), | |
459 | I40E_PTT_UNUSED_ENTRY(192), | |
460 | I40E_PTT_UNUSED_ENTRY(193), | |
461 | I40E_PTT_UNUSED_ENTRY(194), | |
462 | I40E_PTT_UNUSED_ENTRY(195), | |
463 | I40E_PTT_UNUSED_ENTRY(196), | |
464 | I40E_PTT_UNUSED_ENTRY(197), | |
465 | I40E_PTT_UNUSED_ENTRY(198), | |
466 | I40E_PTT_UNUSED_ENTRY(199), | |
467 | ||
468 | I40E_PTT_UNUSED_ENTRY(200), | |
469 | I40E_PTT_UNUSED_ENTRY(201), | |
470 | I40E_PTT_UNUSED_ENTRY(202), | |
471 | I40E_PTT_UNUSED_ENTRY(203), | |
472 | I40E_PTT_UNUSED_ENTRY(204), | |
473 | I40E_PTT_UNUSED_ENTRY(205), | |
474 | I40E_PTT_UNUSED_ENTRY(206), | |
475 | I40E_PTT_UNUSED_ENTRY(207), | |
476 | I40E_PTT_UNUSED_ENTRY(208), | |
477 | I40E_PTT_UNUSED_ENTRY(209), | |
478 | ||
479 | I40E_PTT_UNUSED_ENTRY(210), | |
480 | I40E_PTT_UNUSED_ENTRY(211), | |
481 | I40E_PTT_UNUSED_ENTRY(212), | |
482 | I40E_PTT_UNUSED_ENTRY(213), | |
483 | I40E_PTT_UNUSED_ENTRY(214), | |
484 | I40E_PTT_UNUSED_ENTRY(215), | |
485 | I40E_PTT_UNUSED_ENTRY(216), | |
486 | I40E_PTT_UNUSED_ENTRY(217), | |
487 | I40E_PTT_UNUSED_ENTRY(218), | |
488 | I40E_PTT_UNUSED_ENTRY(219), | |
489 | ||
490 | I40E_PTT_UNUSED_ENTRY(220), | |
491 | I40E_PTT_UNUSED_ENTRY(221), | |
492 | I40E_PTT_UNUSED_ENTRY(222), | |
493 | I40E_PTT_UNUSED_ENTRY(223), | |
494 | I40E_PTT_UNUSED_ENTRY(224), | |
495 | I40E_PTT_UNUSED_ENTRY(225), | |
496 | I40E_PTT_UNUSED_ENTRY(226), | |
497 | I40E_PTT_UNUSED_ENTRY(227), | |
498 | I40E_PTT_UNUSED_ENTRY(228), | |
499 | I40E_PTT_UNUSED_ENTRY(229), | |
500 | ||
501 | I40E_PTT_UNUSED_ENTRY(230), | |
502 | I40E_PTT_UNUSED_ENTRY(231), | |
503 | I40E_PTT_UNUSED_ENTRY(232), | |
504 | I40E_PTT_UNUSED_ENTRY(233), | |
505 | I40E_PTT_UNUSED_ENTRY(234), | |
506 | I40E_PTT_UNUSED_ENTRY(235), | |
507 | I40E_PTT_UNUSED_ENTRY(236), | |
508 | I40E_PTT_UNUSED_ENTRY(237), | |
509 | I40E_PTT_UNUSED_ENTRY(238), | |
510 | I40E_PTT_UNUSED_ENTRY(239), | |
511 | ||
512 | I40E_PTT_UNUSED_ENTRY(240), | |
513 | I40E_PTT_UNUSED_ENTRY(241), | |
514 | I40E_PTT_UNUSED_ENTRY(242), | |
515 | I40E_PTT_UNUSED_ENTRY(243), | |
516 | I40E_PTT_UNUSED_ENTRY(244), | |
517 | I40E_PTT_UNUSED_ENTRY(245), | |
518 | I40E_PTT_UNUSED_ENTRY(246), | |
519 | I40E_PTT_UNUSED_ENTRY(247), | |
520 | I40E_PTT_UNUSED_ENTRY(248), | |
521 | I40E_PTT_UNUSED_ENTRY(249), | |
522 | ||
523 | I40E_PTT_UNUSED_ENTRY(250), | |
524 | I40E_PTT_UNUSED_ENTRY(251), | |
525 | I40E_PTT_UNUSED_ENTRY(252), | |
526 | I40E_PTT_UNUSED_ENTRY(253), | |
527 | I40E_PTT_UNUSED_ENTRY(254), | |
528 | I40E_PTT_UNUSED_ENTRY(255) | |
529 | }; | |
530 | ||
531 | ||
d358aa9a GR |
532 | /** |
533 | * i40e_aq_send_msg_to_pf | |
534 | * @hw: pointer to the hardware structure | |
535 | * @v_opcode: opcodes for VF-PF communication | |
536 | * @v_retval: return error code | |
537 | * @msg: pointer to the msg buffer | |
538 | * @msglen: msg length | |
539 | * @cmd_details: pointer to command details | |
540 | * | |
541 | * Send message to PF driver using admin queue. By default, this message | |
542 | * is sent asynchronously, i.e. i40evf_asq_send_command() does not wait for | |
543 | * completion before returning. | |
544 | **/ | |
545 | i40e_status i40e_aq_send_msg_to_pf(struct i40e_hw *hw, | |
546 | enum i40e_virtchnl_ops v_opcode, | |
547 | i40e_status v_retval, | |
548 | u8 *msg, u16 msglen, | |
549 | struct i40e_asq_cmd_details *cmd_details) | |
550 | { | |
551 | struct i40e_aq_desc desc; | |
552 | i40e_status status; | |
553 | ||
554 | i40evf_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf); | |
555 | desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_SI); | |
556 | desc.cookie_high = cpu_to_le32(v_opcode); | |
557 | desc.cookie_low = cpu_to_le32(v_retval); | |
558 | if (msglen) { | |
559 | desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | |
560 | | I40E_AQ_FLAG_RD)); | |
561 | if (msglen > I40E_AQ_LARGE_BUF) | |
562 | desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB); | |
563 | desc.datalen = cpu_to_le16(msglen); | |
564 | } | |
565 | if (!cmd_details) { | |
566 | struct i40e_asq_cmd_details details; | |
567 | memset(&details, 0, sizeof(details)); | |
568 | details.async = true; | |
569 | cmd_details = &details; | |
570 | } | |
b58f2f72 | 571 | status = i40evf_asq_send_command(hw, &desc, msg, msglen, cmd_details); |
d358aa9a GR |
572 | return status; |
573 | } | |
574 | ||
575 | /** | |
576 | * i40e_vf_parse_hw_config | |
577 | * @hw: pointer to the hardware structure | |
578 | * @msg: pointer to the virtual channel VF resource structure | |
579 | * | |
580 | * Given a VF resource message from the PF, populate the hw struct | |
581 | * with appropriate information. | |
582 | **/ | |
583 | void i40e_vf_parse_hw_config(struct i40e_hw *hw, | |
584 | struct i40e_virtchnl_vf_resource *msg) | |
585 | { | |
586 | struct i40e_virtchnl_vsi_resource *vsi_res; | |
587 | int i; | |
588 | ||
589 | vsi_res = &msg->vsi_res[0]; | |
590 | ||
591 | hw->dev_caps.num_vsis = msg->num_vsis; | |
592 | hw->dev_caps.num_rx_qp = msg->num_queue_pairs; | |
593 | hw->dev_caps.num_tx_qp = msg->num_queue_pairs; | |
594 | hw->dev_caps.num_msix_vectors_vf = msg->max_vectors; | |
595 | hw->dev_caps.dcb = msg->vf_offload_flags & | |
596 | I40E_VIRTCHNL_VF_OFFLOAD_L2; | |
597 | hw->dev_caps.fcoe = (msg->vf_offload_flags & | |
598 | I40E_VIRTCHNL_VF_OFFLOAD_FCOE) ? 1 : 0; | |
599 | for (i = 0; i < msg->num_vsis; i++) { | |
600 | if (vsi_res->vsi_type == I40E_VSI_SRIOV) { | |
601 | memcpy(hw->mac.perm_addr, vsi_res->default_mac_addr, | |
602 | ETH_ALEN); | |
603 | memcpy(hw->mac.addr, vsi_res->default_mac_addr, | |
604 | ETH_ALEN); | |
605 | } | |
606 | vsi_res++; | |
607 | } | |
608 | } | |
609 | ||
610 | /** | |
611 | * i40e_vf_reset | |
612 | * @hw: pointer to the hardware structure | |
613 | * | |
614 | * Send a VF_RESET message to the PF. Does not wait for response from PF | |
615 | * as none will be forthcoming. Immediately after calling this function, | |
616 | * the admin queue should be shut down and (optionally) reinitialized. | |
617 | **/ | |
618 | i40e_status i40e_vf_reset(struct i40e_hw *hw) | |
619 | { | |
620 | return i40e_aq_send_msg_to_pf(hw, I40E_VIRTCHNL_OP_RESET_VF, | |
621 | 0, NULL, 0, NULL); | |
622 | } |