]> git.proxmox.com Git - ceph.git/blob - ceph/src/seastar/dpdk/drivers/net/i40e/base/i40e_common.c
update sources to ceph Nautilus 14.2.1
[ceph.git] / ceph / src / seastar / dpdk / drivers / net / i40e / base / i40e_common.c
1 /*******************************************************************************
2
3 Copyright (c) 2013 - 2015, Intel Corporation
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
11
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15
16 3. Neither the name of the Intel Corporation nor the names of its
17 contributors may be used to endorse or promote products derived from
18 this software without specific prior written permission.
19
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
31
32 ***************************************************************************/
33
34 #include "i40e_type.h"
35 #include "i40e_adminq.h"
36 #include "i40e_prototype.h"
37 #include "i40e_virtchnl.h"
38
39
40 /**
41 * i40e_set_mac_type - Sets MAC type
42 * @hw: pointer to the HW structure
43 *
44 * This function sets the mac type of the adapter based on the
45 * vendor ID and device ID stored in the hw structure.
46 **/
47 #if defined(INTEGRATED_VF) || defined(VF_DRIVER)
48 enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
49 #else
50 STATIC enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
51 #endif
52 {
53 enum i40e_status_code status = I40E_SUCCESS;
54
55 DEBUGFUNC("i40e_set_mac_type\n");
56
57 if (hw->vendor_id == I40E_INTEL_VENDOR_ID) {
58 switch (hw->device_id) {
59 case I40E_DEV_ID_SFP_XL710:
60 case I40E_DEV_ID_QEMU:
61 case I40E_DEV_ID_KX_B:
62 case I40E_DEV_ID_KX_C:
63 case I40E_DEV_ID_QSFP_A:
64 case I40E_DEV_ID_QSFP_B:
65 case I40E_DEV_ID_QSFP_C:
66 case I40E_DEV_ID_10G_BASE_T:
67 case I40E_DEV_ID_10G_BASE_T4:
68 case I40E_DEV_ID_20G_KR2:
69 case I40E_DEV_ID_20G_KR2_A:
70 case I40E_DEV_ID_25G_B:
71 case I40E_DEV_ID_25G_SFP28:
72 hw->mac.type = I40E_MAC_XL710;
73 break;
74 #ifdef X722_A0_SUPPORT
75 case I40E_DEV_ID_X722_A0:
76 #endif
77 case I40E_DEV_ID_KX_X722:
78 case I40E_DEV_ID_QSFP_X722:
79 case I40E_DEV_ID_SFP_X722:
80 case I40E_DEV_ID_1G_BASE_T_X722:
81 case I40E_DEV_ID_10G_BASE_T_X722:
82 case I40E_DEV_ID_SFP_I_X722:
83 hw->mac.type = I40E_MAC_X722;
84 break;
85 #if defined(INTEGRATED_VF) || defined(VF_DRIVER)
86 case I40E_DEV_ID_X722_VF:
87 #ifdef X722_A0_SUPPORT
88 case I40E_DEV_ID_X722_A0_VF:
89 #endif
90 hw->mac.type = I40E_MAC_X722_VF;
91 break;
92 #endif /* INTEGRATED_VF || VF_DRIVER */
93 #if defined(INTEGRATED_VF) || defined(VF_DRIVER)
94 case I40E_DEV_ID_VF:
95 case I40E_DEV_ID_VF_HV:
96 hw->mac.type = I40E_MAC_VF;
97 break;
98 #endif
99 default:
100 hw->mac.type = I40E_MAC_GENERIC;
101 break;
102 }
103 } else {
104 status = I40E_ERR_DEVICE_NOT_SUPPORTED;
105 }
106
107 DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n",
108 hw->mac.type, status);
109 return status;
110 }
111
112 /**
113 * i40e_aq_str - convert AQ err code to a string
114 * @hw: pointer to the HW structure
115 * @aq_err: the AQ error code to convert
116 **/
117 const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err)
118 {
119 switch (aq_err) {
120 case I40E_AQ_RC_OK:
121 return "OK";
122 case I40E_AQ_RC_EPERM:
123 return "I40E_AQ_RC_EPERM";
124 case I40E_AQ_RC_ENOENT:
125 return "I40E_AQ_RC_ENOENT";
126 case I40E_AQ_RC_ESRCH:
127 return "I40E_AQ_RC_ESRCH";
128 case I40E_AQ_RC_EINTR:
129 return "I40E_AQ_RC_EINTR";
130 case I40E_AQ_RC_EIO:
131 return "I40E_AQ_RC_EIO";
132 case I40E_AQ_RC_ENXIO:
133 return "I40E_AQ_RC_ENXIO";
134 case I40E_AQ_RC_E2BIG:
135 return "I40E_AQ_RC_E2BIG";
136 case I40E_AQ_RC_EAGAIN:
137 return "I40E_AQ_RC_EAGAIN";
138 case I40E_AQ_RC_ENOMEM:
139 return "I40E_AQ_RC_ENOMEM";
140 case I40E_AQ_RC_EACCES:
141 return "I40E_AQ_RC_EACCES";
142 case I40E_AQ_RC_EFAULT:
143 return "I40E_AQ_RC_EFAULT";
144 case I40E_AQ_RC_EBUSY:
145 return "I40E_AQ_RC_EBUSY";
146 case I40E_AQ_RC_EEXIST:
147 return "I40E_AQ_RC_EEXIST";
148 case I40E_AQ_RC_EINVAL:
149 return "I40E_AQ_RC_EINVAL";
150 case I40E_AQ_RC_ENOTTY:
151 return "I40E_AQ_RC_ENOTTY";
152 case I40E_AQ_RC_ENOSPC:
153 return "I40E_AQ_RC_ENOSPC";
154 case I40E_AQ_RC_ENOSYS:
155 return "I40E_AQ_RC_ENOSYS";
156 case I40E_AQ_RC_ERANGE:
157 return "I40E_AQ_RC_ERANGE";
158 case I40E_AQ_RC_EFLUSHED:
159 return "I40E_AQ_RC_EFLUSHED";
160 case I40E_AQ_RC_BAD_ADDR:
161 return "I40E_AQ_RC_BAD_ADDR";
162 case I40E_AQ_RC_EMODE:
163 return "I40E_AQ_RC_EMODE";
164 case I40E_AQ_RC_EFBIG:
165 return "I40E_AQ_RC_EFBIG";
166 }
167
168 snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
169 return hw->err_str;
170 }
171
172 /**
173 * i40e_stat_str - convert status err code to a string
174 * @hw: pointer to the HW structure
175 * @stat_err: the status error code to convert
176 **/
177 const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err)
178 {
179 switch (stat_err) {
180 case I40E_SUCCESS:
181 return "OK";
182 case I40E_ERR_NVM:
183 return "I40E_ERR_NVM";
184 case I40E_ERR_NVM_CHECKSUM:
185 return "I40E_ERR_NVM_CHECKSUM";
186 case I40E_ERR_PHY:
187 return "I40E_ERR_PHY";
188 case I40E_ERR_CONFIG:
189 return "I40E_ERR_CONFIG";
190 case I40E_ERR_PARAM:
191 return "I40E_ERR_PARAM";
192 case I40E_ERR_MAC_TYPE:
193 return "I40E_ERR_MAC_TYPE";
194 case I40E_ERR_UNKNOWN_PHY:
195 return "I40E_ERR_UNKNOWN_PHY";
196 case I40E_ERR_LINK_SETUP:
197 return "I40E_ERR_LINK_SETUP";
198 case I40E_ERR_ADAPTER_STOPPED:
199 return "I40E_ERR_ADAPTER_STOPPED";
200 case I40E_ERR_INVALID_MAC_ADDR:
201 return "I40E_ERR_INVALID_MAC_ADDR";
202 case I40E_ERR_DEVICE_NOT_SUPPORTED:
203 return "I40E_ERR_DEVICE_NOT_SUPPORTED";
204 case I40E_ERR_MASTER_REQUESTS_PENDING:
205 return "I40E_ERR_MASTER_REQUESTS_PENDING";
206 case I40E_ERR_INVALID_LINK_SETTINGS:
207 return "I40E_ERR_INVALID_LINK_SETTINGS";
208 case I40E_ERR_AUTONEG_NOT_COMPLETE:
209 return "I40E_ERR_AUTONEG_NOT_COMPLETE";
210 case I40E_ERR_RESET_FAILED:
211 return "I40E_ERR_RESET_FAILED";
212 case I40E_ERR_SWFW_SYNC:
213 return "I40E_ERR_SWFW_SYNC";
214 case I40E_ERR_NO_AVAILABLE_VSI:
215 return "I40E_ERR_NO_AVAILABLE_VSI";
216 case I40E_ERR_NO_MEMORY:
217 return "I40E_ERR_NO_MEMORY";
218 case I40E_ERR_BAD_PTR:
219 return "I40E_ERR_BAD_PTR";
220 case I40E_ERR_RING_FULL:
221 return "I40E_ERR_RING_FULL";
222 case I40E_ERR_INVALID_PD_ID:
223 return "I40E_ERR_INVALID_PD_ID";
224 case I40E_ERR_INVALID_QP_ID:
225 return "I40E_ERR_INVALID_QP_ID";
226 case I40E_ERR_INVALID_CQ_ID:
227 return "I40E_ERR_INVALID_CQ_ID";
228 case I40E_ERR_INVALID_CEQ_ID:
229 return "I40E_ERR_INVALID_CEQ_ID";
230 case I40E_ERR_INVALID_AEQ_ID:
231 return "I40E_ERR_INVALID_AEQ_ID";
232 case I40E_ERR_INVALID_SIZE:
233 return "I40E_ERR_INVALID_SIZE";
234 case I40E_ERR_INVALID_ARP_INDEX:
235 return "I40E_ERR_INVALID_ARP_INDEX";
236 case I40E_ERR_INVALID_FPM_FUNC_ID:
237 return "I40E_ERR_INVALID_FPM_FUNC_ID";
238 case I40E_ERR_QP_INVALID_MSG_SIZE:
239 return "I40E_ERR_QP_INVALID_MSG_SIZE";
240 case I40E_ERR_QP_TOOMANY_WRS_POSTED:
241 return "I40E_ERR_QP_TOOMANY_WRS_POSTED";
242 case I40E_ERR_INVALID_FRAG_COUNT:
243 return "I40E_ERR_INVALID_FRAG_COUNT";
244 case I40E_ERR_QUEUE_EMPTY:
245 return "I40E_ERR_QUEUE_EMPTY";
246 case I40E_ERR_INVALID_ALIGNMENT:
247 return "I40E_ERR_INVALID_ALIGNMENT";
248 case I40E_ERR_FLUSHED_QUEUE:
249 return "I40E_ERR_FLUSHED_QUEUE";
250 case I40E_ERR_INVALID_PUSH_PAGE_INDEX:
251 return "I40E_ERR_INVALID_PUSH_PAGE_INDEX";
252 case I40E_ERR_INVALID_IMM_DATA_SIZE:
253 return "I40E_ERR_INVALID_IMM_DATA_SIZE";
254 case I40E_ERR_TIMEOUT:
255 return "I40E_ERR_TIMEOUT";
256 case I40E_ERR_OPCODE_MISMATCH:
257 return "I40E_ERR_OPCODE_MISMATCH";
258 case I40E_ERR_CQP_COMPL_ERROR:
259 return "I40E_ERR_CQP_COMPL_ERROR";
260 case I40E_ERR_INVALID_VF_ID:
261 return "I40E_ERR_INVALID_VF_ID";
262 case I40E_ERR_INVALID_HMCFN_ID:
263 return "I40E_ERR_INVALID_HMCFN_ID";
264 case I40E_ERR_BACKING_PAGE_ERROR:
265 return "I40E_ERR_BACKING_PAGE_ERROR";
266 case I40E_ERR_NO_PBLCHUNKS_AVAILABLE:
267 return "I40E_ERR_NO_PBLCHUNKS_AVAILABLE";
268 case I40E_ERR_INVALID_PBLE_INDEX:
269 return "I40E_ERR_INVALID_PBLE_INDEX";
270 case I40E_ERR_INVALID_SD_INDEX:
271 return "I40E_ERR_INVALID_SD_INDEX";
272 case I40E_ERR_INVALID_PAGE_DESC_INDEX:
273 return "I40E_ERR_INVALID_PAGE_DESC_INDEX";
274 case I40E_ERR_INVALID_SD_TYPE:
275 return "I40E_ERR_INVALID_SD_TYPE";
276 case I40E_ERR_MEMCPY_FAILED:
277 return "I40E_ERR_MEMCPY_FAILED";
278 case I40E_ERR_INVALID_HMC_OBJ_INDEX:
279 return "I40E_ERR_INVALID_HMC_OBJ_INDEX";
280 case I40E_ERR_INVALID_HMC_OBJ_COUNT:
281 return "I40E_ERR_INVALID_HMC_OBJ_COUNT";
282 case I40E_ERR_INVALID_SRQ_ARM_LIMIT:
283 return "I40E_ERR_INVALID_SRQ_ARM_LIMIT";
284 case I40E_ERR_SRQ_ENABLED:
285 return "I40E_ERR_SRQ_ENABLED";
286 case I40E_ERR_ADMIN_QUEUE_ERROR:
287 return "I40E_ERR_ADMIN_QUEUE_ERROR";
288 case I40E_ERR_ADMIN_QUEUE_TIMEOUT:
289 return "I40E_ERR_ADMIN_QUEUE_TIMEOUT";
290 case I40E_ERR_BUF_TOO_SHORT:
291 return "I40E_ERR_BUF_TOO_SHORT";
292 case I40E_ERR_ADMIN_QUEUE_FULL:
293 return "I40E_ERR_ADMIN_QUEUE_FULL";
294 case I40E_ERR_ADMIN_QUEUE_NO_WORK:
295 return "I40E_ERR_ADMIN_QUEUE_NO_WORK";
296 case I40E_ERR_BAD_IWARP_CQE:
297 return "I40E_ERR_BAD_IWARP_CQE";
298 case I40E_ERR_NVM_BLANK_MODE:
299 return "I40E_ERR_NVM_BLANK_MODE";
300 case I40E_ERR_NOT_IMPLEMENTED:
301 return "I40E_ERR_NOT_IMPLEMENTED";
302 case I40E_ERR_PE_DOORBELL_NOT_ENABLED:
303 return "I40E_ERR_PE_DOORBELL_NOT_ENABLED";
304 case I40E_ERR_DIAG_TEST_FAILED:
305 return "I40E_ERR_DIAG_TEST_FAILED";
306 case I40E_ERR_NOT_READY:
307 return "I40E_ERR_NOT_READY";
308 case I40E_NOT_SUPPORTED:
309 return "I40E_NOT_SUPPORTED";
310 case I40E_ERR_FIRMWARE_API_VERSION:
311 return "I40E_ERR_FIRMWARE_API_VERSION";
312 }
313
314 snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
315 return hw->err_str;
316 }
317
318 /**
319 * i40e_debug_aq
320 * @hw: debug mask related to admin queue
321 * @mask: debug mask
322 * @desc: pointer to admin queue descriptor
323 * @buffer: pointer to command buffer
324 * @buf_len: max length of buffer
325 *
326 * Dumps debug log about adminq command with descriptor contents.
327 **/
328 void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
329 void *buffer, u16 buf_len)
330 {
331 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
332 u16 len = LE16_TO_CPU(aq_desc->datalen);
333 u8 *buf = (u8 *)buffer;
334 u16 i = 0;
335
336 if ((!(mask & hw->debug_mask)) || (desc == NULL))
337 return;
338
339 i40e_debug(hw, mask,
340 "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
341 LE16_TO_CPU(aq_desc->opcode),
342 LE16_TO_CPU(aq_desc->flags),
343 LE16_TO_CPU(aq_desc->datalen),
344 LE16_TO_CPU(aq_desc->retval));
345 i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
346 LE32_TO_CPU(aq_desc->cookie_high),
347 LE32_TO_CPU(aq_desc->cookie_low));
348 i40e_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
349 LE32_TO_CPU(aq_desc->params.internal.param0),
350 LE32_TO_CPU(aq_desc->params.internal.param1));
351 i40e_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
352 LE32_TO_CPU(aq_desc->params.external.addr_high),
353 LE32_TO_CPU(aq_desc->params.external.addr_low));
354
355 if ((buffer != NULL) && (aq_desc->datalen != 0)) {
356 i40e_debug(hw, mask, "AQ CMD Buffer:\n");
357 if (buf_len < len)
358 len = buf_len;
359 /* write the full 16-byte chunks */
360 for (i = 0; i < (len - 16); i += 16)
361 i40e_debug(hw, mask,
362 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
363 i, buf[i], buf[i+1], buf[i+2], buf[i+3],
364 buf[i+4], buf[i+5], buf[i+6], buf[i+7],
365 buf[i+8], buf[i+9], buf[i+10], buf[i+11],
366 buf[i+12], buf[i+13], buf[i+14], buf[i+15]);
367 /* the most we could have left is 16 bytes, pad with zeros */
368 if (i < len) {
369 char d_buf[16];
370 int j, i_sav;
371
372 i_sav = i;
373 memset(d_buf, 0, sizeof(d_buf));
374 for (j = 0; i < len; j++, i++)
375 d_buf[j] = buf[i];
376 i40e_debug(hw, mask,
377 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
378 i_sav, d_buf[0], d_buf[1], d_buf[2], d_buf[3],
379 d_buf[4], d_buf[5], d_buf[6], d_buf[7],
380 d_buf[8], d_buf[9], d_buf[10], d_buf[11],
381 d_buf[12], d_buf[13], d_buf[14], d_buf[15]);
382 }
383 }
384 }
385
386 /**
387 * i40e_check_asq_alive
388 * @hw: pointer to the hw struct
389 *
390 * Returns true if Queue is enabled else false.
391 **/
392 bool i40e_check_asq_alive(struct i40e_hw *hw)
393 {
394 if (hw->aq.asq.len)
395 #ifdef PF_DRIVER
396 #ifdef INTEGRATED_VF
397 if (!i40e_is_vf(hw))
398 return !!(rd32(hw, hw->aq.asq.len) &
399 I40E_PF_ATQLEN_ATQENABLE_MASK);
400 #else
401 return !!(rd32(hw, hw->aq.asq.len) &
402 I40E_PF_ATQLEN_ATQENABLE_MASK);
403 #endif /* INTEGRATED_VF */
404 #endif /* PF_DRIVER */
405 #ifdef VF_DRIVER
406 #ifdef INTEGRATED_VF
407 if (i40e_is_vf(hw))
408 return !!(rd32(hw, hw->aq.asq.len) &
409 I40E_VF_ATQLEN1_ATQENABLE_MASK);
410 #else
411 return !!(rd32(hw, hw->aq.asq.len) &
412 I40E_VF_ATQLEN1_ATQENABLE_MASK);
413 #endif /* INTEGRATED_VF */
414 #endif /* VF_DRIVER */
415 return false;
416 }
417
418 /**
419 * i40e_aq_queue_shutdown
420 * @hw: pointer to the hw struct
421 * @unloading: is the driver unloading itself
422 *
423 * Tell the Firmware that we're shutting down the AdminQ and whether
424 * or not the driver is unloading as well.
425 **/
426 enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
427 bool unloading)
428 {
429 struct i40e_aq_desc desc;
430 struct i40e_aqc_queue_shutdown *cmd =
431 (struct i40e_aqc_queue_shutdown *)&desc.params.raw;
432 enum i40e_status_code status;
433
434 i40e_fill_default_direct_cmd_desc(&desc,
435 i40e_aqc_opc_queue_shutdown);
436
437 if (unloading)
438 cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING);
439 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
440
441 return status;
442 }
443
444 /**
445 * i40e_aq_get_set_rss_lut
446 * @hw: pointer to the hardware structure
447 * @vsi_id: vsi fw index
448 * @pf_lut: for PF table set true, for VSI table set false
449 * @lut: pointer to the lut buffer provided by the caller
450 * @lut_size: size of the lut buffer
451 * @set: set true to set the table, false to get the table
452 *
453 * Internal function to get or set RSS look up table
454 **/
455 STATIC enum i40e_status_code i40e_aq_get_set_rss_lut(struct i40e_hw *hw,
456 u16 vsi_id, bool pf_lut,
457 u8 *lut, u16 lut_size,
458 bool set)
459 {
460 enum i40e_status_code status;
461 struct i40e_aq_desc desc;
462 struct i40e_aqc_get_set_rss_lut *cmd_resp =
463 (struct i40e_aqc_get_set_rss_lut *)&desc.params.raw;
464
465 if (set)
466 i40e_fill_default_direct_cmd_desc(&desc,
467 i40e_aqc_opc_set_rss_lut);
468 else
469 i40e_fill_default_direct_cmd_desc(&desc,
470 i40e_aqc_opc_get_rss_lut);
471
472 /* Indirect command */
473 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
474 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
475
476 cmd_resp->vsi_id =
477 CPU_TO_LE16((u16)((vsi_id <<
478 I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
479 I40E_AQC_SET_RSS_LUT_VSI_ID_MASK));
480 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_LUT_VSI_VALID);
481
482 if (pf_lut)
483 cmd_resp->flags |= CPU_TO_LE16((u16)
484 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
485 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
486 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
487 else
488 cmd_resp->flags |= CPU_TO_LE16((u16)
489 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
490 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
491 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
492
493 status = i40e_asq_send_command(hw, &desc, lut, lut_size, NULL);
494
495 return status;
496 }
497
498 /**
499 * i40e_aq_get_rss_lut
500 * @hw: pointer to the hardware structure
501 * @vsi_id: vsi fw index
502 * @pf_lut: for PF table set true, for VSI table set false
503 * @lut: pointer to the lut buffer provided by the caller
504 * @lut_size: size of the lut buffer
505 *
506 * get the RSS lookup table, PF or VSI type
507 **/
508 enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 vsi_id,
509 bool pf_lut, u8 *lut, u16 lut_size)
510 {
511 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
512 false);
513 }
514
515 /**
516 * i40e_aq_set_rss_lut
517 * @hw: pointer to the hardware structure
518 * @vsi_id: vsi fw index
519 * @pf_lut: for PF table set true, for VSI table set false
520 * @lut: pointer to the lut buffer provided by the caller
521 * @lut_size: size of the lut buffer
522 *
523 * set the RSS lookup table, PF or VSI type
524 **/
525 enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 vsi_id,
526 bool pf_lut, u8 *lut, u16 lut_size)
527 {
528 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, true);
529 }
530
531 /**
532 * i40e_aq_get_set_rss_key
533 * @hw: pointer to the hw struct
534 * @vsi_id: vsi fw index
535 * @key: pointer to key info struct
536 * @set: set true to set the key, false to get the key
537 *
538 * get the RSS key per VSI
539 **/
540 STATIC enum i40e_status_code i40e_aq_get_set_rss_key(struct i40e_hw *hw,
541 u16 vsi_id,
542 struct i40e_aqc_get_set_rss_key_data *key,
543 bool set)
544 {
545 enum i40e_status_code status;
546 struct i40e_aq_desc desc;
547 struct i40e_aqc_get_set_rss_key *cmd_resp =
548 (struct i40e_aqc_get_set_rss_key *)&desc.params.raw;
549 u16 key_size = sizeof(struct i40e_aqc_get_set_rss_key_data);
550
551 if (set)
552 i40e_fill_default_direct_cmd_desc(&desc,
553 i40e_aqc_opc_set_rss_key);
554 else
555 i40e_fill_default_direct_cmd_desc(&desc,
556 i40e_aqc_opc_get_rss_key);
557
558 /* Indirect command */
559 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
560 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
561
562 cmd_resp->vsi_id =
563 CPU_TO_LE16((u16)((vsi_id <<
564 I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
565 I40E_AQC_SET_RSS_KEY_VSI_ID_MASK));
566 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_KEY_VSI_VALID);
567
568 status = i40e_asq_send_command(hw, &desc, key, key_size, NULL);
569
570 return status;
571 }
572
573 /**
574 * i40e_aq_get_rss_key
575 * @hw: pointer to the hw struct
576 * @vsi_id: vsi fw index
577 * @key: pointer to key info struct
578 *
579 **/
580 enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
581 u16 vsi_id,
582 struct i40e_aqc_get_set_rss_key_data *key)
583 {
584 return i40e_aq_get_set_rss_key(hw, vsi_id, key, false);
585 }
586
587 /**
588 * i40e_aq_set_rss_key
589 * @hw: pointer to the hw struct
590 * @vsi_id: vsi fw index
591 * @key: pointer to key info struct
592 *
593 * set the RSS key per VSI
594 **/
595 enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
596 u16 vsi_id,
597 struct i40e_aqc_get_set_rss_key_data *key)
598 {
599 return i40e_aq_get_set_rss_key(hw, vsi_id, key, true);
600 }
601
602 /* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
603 * hardware to a bit-field that can be used by SW to more easily determine the
604 * packet type.
605 *
606 * Macros are used to shorten the table lines and make this table human
607 * readable.
608 *
609 * We store the PTYPE in the top byte of the bit field - this is just so that
610 * we can check that the table doesn't have a row missing, as the index into
611 * the table should be the PTYPE.
612 *
613 * Typical work flow:
614 *
615 * IF NOT i40e_ptype_lookup[ptype].known
616 * THEN
617 * Packet is unknown
618 * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
619 * Use the rest of the fields to look at the tunnels, inner protocols, etc
620 * ELSE
621 * Use the enum i40e_rx_l2_ptype to decode the packet type
622 * ENDIF
623 */
624
625 /* macro to make the table lines short */
626 #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
627 { PTYPE, \
628 1, \
629 I40E_RX_PTYPE_OUTER_##OUTER_IP, \
630 I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \
631 I40E_RX_PTYPE_##OUTER_FRAG, \
632 I40E_RX_PTYPE_TUNNEL_##T, \
633 I40E_RX_PTYPE_TUNNEL_END_##TE, \
634 I40E_RX_PTYPE_##TEF, \
635 I40E_RX_PTYPE_INNER_PROT_##I, \
636 I40E_RX_PTYPE_PAYLOAD_LAYER_##PL }
637
638 #define I40E_PTT_UNUSED_ENTRY(PTYPE) \
639 { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
640
641 /* shorter macros makes the table fit but are terse */
642 #define I40E_RX_PTYPE_NOF I40E_RX_PTYPE_NOT_FRAG
643 #define I40E_RX_PTYPE_FRG I40E_RX_PTYPE_FRAG
644 #define I40E_RX_PTYPE_INNER_PROT_TS I40E_RX_PTYPE_INNER_PROT_TIMESYNC
645
646 /* Lookup table mapping the HW PTYPE to the bit field for decoding */
647 struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
648 /* L2 Packet types */
649 I40E_PTT_UNUSED_ENTRY(0),
650 I40E_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
651 I40E_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2),
652 I40E_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
653 I40E_PTT_UNUSED_ENTRY(4),
654 I40E_PTT_UNUSED_ENTRY(5),
655 I40E_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
656 I40E_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
657 I40E_PTT_UNUSED_ENTRY(8),
658 I40E_PTT_UNUSED_ENTRY(9),
659 I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
660 I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
661 I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
662 I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
663 I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
664 I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
665 I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
666 I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
667 I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
668 I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
669 I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
670 I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
671
672 /* Non Tunneled IPv4 */
673 I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
674 I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
675 I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4),
676 I40E_PTT_UNUSED_ENTRY(25),
677 I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4),
678 I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
679 I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
680
681 /* IPv4 --> IPv4 */
682 I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
683 I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
684 I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
685 I40E_PTT_UNUSED_ENTRY(32),
686 I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
687 I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
688 I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
689
690 /* IPv4 --> IPv6 */
691 I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
692 I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
693 I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
694 I40E_PTT_UNUSED_ENTRY(39),
695 I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
696 I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
697 I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
698
699 /* IPv4 --> GRE/NAT */
700 I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
701
702 /* IPv4 --> GRE/NAT --> IPv4 */
703 I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
704 I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
705 I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
706 I40E_PTT_UNUSED_ENTRY(47),
707 I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
708 I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
709 I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
710
711 /* IPv4 --> GRE/NAT --> IPv6 */
712 I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
713 I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
714 I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
715 I40E_PTT_UNUSED_ENTRY(54),
716 I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
717 I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
718 I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
719
720 /* IPv4 --> GRE/NAT --> MAC */
721 I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
722
723 /* IPv4 --> GRE/NAT --> MAC --> IPv4 */
724 I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
725 I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
726 I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
727 I40E_PTT_UNUSED_ENTRY(62),
728 I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
729 I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
730 I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
731
732 /* IPv4 --> GRE/NAT -> MAC --> IPv6 */
733 I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
734 I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
735 I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
736 I40E_PTT_UNUSED_ENTRY(69),
737 I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
738 I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
739 I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
740
741 /* IPv4 --> GRE/NAT --> MAC/VLAN */
742 I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
743
744 /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
745 I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
746 I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
747 I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
748 I40E_PTT_UNUSED_ENTRY(77),
749 I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
750 I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
751 I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
752
753 /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
754 I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
755 I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
756 I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
757 I40E_PTT_UNUSED_ENTRY(84),
758 I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
759 I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
760 I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
761
762 /* Non Tunneled IPv6 */
763 I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
764 I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
765 I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY4),
766 I40E_PTT_UNUSED_ENTRY(91),
767 I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
768 I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
769 I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
770
771 /* IPv6 --> IPv4 */
772 I40E_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
773 I40E_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
774 I40E_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
775 I40E_PTT_UNUSED_ENTRY(98),
776 I40E_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
777 I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
778 I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
779
780 /* IPv6 --> IPv6 */
781 I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
782 I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
783 I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
784 I40E_PTT_UNUSED_ENTRY(105),
785 I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
786 I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
787 I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
788
789 /* IPv6 --> GRE/NAT */
790 I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
791
792 /* IPv6 --> GRE/NAT -> IPv4 */
793 I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
794 I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
795 I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
796 I40E_PTT_UNUSED_ENTRY(113),
797 I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
798 I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
799 I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
800
801 /* IPv6 --> GRE/NAT -> IPv6 */
802 I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
803 I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
804 I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
805 I40E_PTT_UNUSED_ENTRY(120),
806 I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
807 I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
808 I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
809
810 /* IPv6 --> GRE/NAT -> MAC */
811 I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
812
813 /* IPv6 --> GRE/NAT -> MAC -> IPv4 */
814 I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
815 I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
816 I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
817 I40E_PTT_UNUSED_ENTRY(128),
818 I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
819 I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
820 I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
821
822 /* IPv6 --> GRE/NAT -> MAC -> IPv6 */
823 I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
824 I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
825 I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
826 I40E_PTT_UNUSED_ENTRY(135),
827 I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
828 I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
829 I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
830
831 /* IPv6 --> GRE/NAT -> MAC/VLAN */
832 I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
833
834 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
835 I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
836 I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
837 I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
838 I40E_PTT_UNUSED_ENTRY(143),
839 I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
840 I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
841 I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
842
843 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
844 I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
845 I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
846 I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
847 I40E_PTT_UNUSED_ENTRY(150),
848 I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
849 I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
850 I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
851
852 /* unused entries */
853 I40E_PTT_UNUSED_ENTRY(154),
854 I40E_PTT_UNUSED_ENTRY(155),
855 I40E_PTT_UNUSED_ENTRY(156),
856 I40E_PTT_UNUSED_ENTRY(157),
857 I40E_PTT_UNUSED_ENTRY(158),
858 I40E_PTT_UNUSED_ENTRY(159),
859
860 I40E_PTT_UNUSED_ENTRY(160),
861 I40E_PTT_UNUSED_ENTRY(161),
862 I40E_PTT_UNUSED_ENTRY(162),
863 I40E_PTT_UNUSED_ENTRY(163),
864 I40E_PTT_UNUSED_ENTRY(164),
865 I40E_PTT_UNUSED_ENTRY(165),
866 I40E_PTT_UNUSED_ENTRY(166),
867 I40E_PTT_UNUSED_ENTRY(167),
868 I40E_PTT_UNUSED_ENTRY(168),
869 I40E_PTT_UNUSED_ENTRY(169),
870
871 I40E_PTT_UNUSED_ENTRY(170),
872 I40E_PTT_UNUSED_ENTRY(171),
873 I40E_PTT_UNUSED_ENTRY(172),
874 I40E_PTT_UNUSED_ENTRY(173),
875 I40E_PTT_UNUSED_ENTRY(174),
876 I40E_PTT_UNUSED_ENTRY(175),
877 I40E_PTT_UNUSED_ENTRY(176),
878 I40E_PTT_UNUSED_ENTRY(177),
879 I40E_PTT_UNUSED_ENTRY(178),
880 I40E_PTT_UNUSED_ENTRY(179),
881
882 I40E_PTT_UNUSED_ENTRY(180),
883 I40E_PTT_UNUSED_ENTRY(181),
884 I40E_PTT_UNUSED_ENTRY(182),
885 I40E_PTT_UNUSED_ENTRY(183),
886 I40E_PTT_UNUSED_ENTRY(184),
887 I40E_PTT_UNUSED_ENTRY(185),
888 I40E_PTT_UNUSED_ENTRY(186),
889 I40E_PTT_UNUSED_ENTRY(187),
890 I40E_PTT_UNUSED_ENTRY(188),
891 I40E_PTT_UNUSED_ENTRY(189),
892
893 I40E_PTT_UNUSED_ENTRY(190),
894 I40E_PTT_UNUSED_ENTRY(191),
895 I40E_PTT_UNUSED_ENTRY(192),
896 I40E_PTT_UNUSED_ENTRY(193),
897 I40E_PTT_UNUSED_ENTRY(194),
898 I40E_PTT_UNUSED_ENTRY(195),
899 I40E_PTT_UNUSED_ENTRY(196),
900 I40E_PTT_UNUSED_ENTRY(197),
901 I40E_PTT_UNUSED_ENTRY(198),
902 I40E_PTT_UNUSED_ENTRY(199),
903
904 I40E_PTT_UNUSED_ENTRY(200),
905 I40E_PTT_UNUSED_ENTRY(201),
906 I40E_PTT_UNUSED_ENTRY(202),
907 I40E_PTT_UNUSED_ENTRY(203),
908 I40E_PTT_UNUSED_ENTRY(204),
909 I40E_PTT_UNUSED_ENTRY(205),
910 I40E_PTT_UNUSED_ENTRY(206),
911 I40E_PTT_UNUSED_ENTRY(207),
912 I40E_PTT_UNUSED_ENTRY(208),
913 I40E_PTT_UNUSED_ENTRY(209),
914
915 I40E_PTT_UNUSED_ENTRY(210),
916 I40E_PTT_UNUSED_ENTRY(211),
917 I40E_PTT_UNUSED_ENTRY(212),
918 I40E_PTT_UNUSED_ENTRY(213),
919 I40E_PTT_UNUSED_ENTRY(214),
920 I40E_PTT_UNUSED_ENTRY(215),
921 I40E_PTT_UNUSED_ENTRY(216),
922 I40E_PTT_UNUSED_ENTRY(217),
923 I40E_PTT_UNUSED_ENTRY(218),
924 I40E_PTT_UNUSED_ENTRY(219),
925
926 I40E_PTT_UNUSED_ENTRY(220),
927 I40E_PTT_UNUSED_ENTRY(221),
928 I40E_PTT_UNUSED_ENTRY(222),
929 I40E_PTT_UNUSED_ENTRY(223),
930 I40E_PTT_UNUSED_ENTRY(224),
931 I40E_PTT_UNUSED_ENTRY(225),
932 I40E_PTT_UNUSED_ENTRY(226),
933 I40E_PTT_UNUSED_ENTRY(227),
934 I40E_PTT_UNUSED_ENTRY(228),
935 I40E_PTT_UNUSED_ENTRY(229),
936
937 I40E_PTT_UNUSED_ENTRY(230),
938 I40E_PTT_UNUSED_ENTRY(231),
939 I40E_PTT_UNUSED_ENTRY(232),
940 I40E_PTT_UNUSED_ENTRY(233),
941 I40E_PTT_UNUSED_ENTRY(234),
942 I40E_PTT_UNUSED_ENTRY(235),
943 I40E_PTT_UNUSED_ENTRY(236),
944 I40E_PTT_UNUSED_ENTRY(237),
945 I40E_PTT_UNUSED_ENTRY(238),
946 I40E_PTT_UNUSED_ENTRY(239),
947
948 I40E_PTT_UNUSED_ENTRY(240),
949 I40E_PTT_UNUSED_ENTRY(241),
950 I40E_PTT_UNUSED_ENTRY(242),
951 I40E_PTT_UNUSED_ENTRY(243),
952 I40E_PTT_UNUSED_ENTRY(244),
953 I40E_PTT_UNUSED_ENTRY(245),
954 I40E_PTT_UNUSED_ENTRY(246),
955 I40E_PTT_UNUSED_ENTRY(247),
956 I40E_PTT_UNUSED_ENTRY(248),
957 I40E_PTT_UNUSED_ENTRY(249),
958
959 I40E_PTT_UNUSED_ENTRY(250),
960 I40E_PTT_UNUSED_ENTRY(251),
961 I40E_PTT_UNUSED_ENTRY(252),
962 I40E_PTT_UNUSED_ENTRY(253),
963 I40E_PTT_UNUSED_ENTRY(254),
964 I40E_PTT_UNUSED_ENTRY(255)
965 };
966
967
968 /**
969 * i40e_validate_mac_addr - Validate unicast MAC address
970 * @mac_addr: pointer to MAC address
971 *
972 * Tests a MAC address to ensure it is a valid Individual Address
973 **/
974 enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
975 {
976 enum i40e_status_code status = I40E_SUCCESS;
977
978 DEBUGFUNC("i40e_validate_mac_addr");
979
980 /* Broadcast addresses ARE multicast addresses
981 * Make sure it is not a multicast address
982 * Reject the zero address
983 */
984 if (I40E_IS_MULTICAST(mac_addr) ||
985 (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
986 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
987 status = I40E_ERR_INVALID_MAC_ADDR;
988
989 return status;
990 }
991 #ifdef PF_DRIVER
992
993 /**
994 * i40e_init_shared_code - Initialize the shared code
995 * @hw: pointer to hardware structure
996 *
997 * This assigns the MAC type and PHY code and inits the NVM.
998 * Does not touch the hardware. This function must be called prior to any
999 * other function in the shared code. The i40e_hw structure should be
1000 * memset to 0 prior to calling this function. The following fields in
1001 * hw structure should be filled in prior to calling this function:
1002 * hw_addr, back, device_id, vendor_id, subsystem_device_id,
1003 * subsystem_vendor_id, and revision_id
1004 **/
1005 enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
1006 {
1007 enum i40e_status_code status = I40E_SUCCESS;
1008 u32 port, ari, func_rid;
1009
1010 DEBUGFUNC("i40e_init_shared_code");
1011
1012 i40e_set_mac_type(hw);
1013
1014 switch (hw->mac.type) {
1015 case I40E_MAC_XL710:
1016 case I40E_MAC_X722:
1017 break;
1018 default:
1019 return I40E_ERR_DEVICE_NOT_SUPPORTED;
1020 }
1021
1022 hw->phy.get_link_info = true;
1023
1024 /* Determine port number and PF number*/
1025 port = (rd32(hw, I40E_PFGEN_PORTNUM) & I40E_PFGEN_PORTNUM_PORT_NUM_MASK)
1026 >> I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT;
1027 hw->port = (u8)port;
1028 ari = (rd32(hw, I40E_GLPCI_CAPSUP) & I40E_GLPCI_CAPSUP_ARI_EN_MASK) >>
1029 I40E_GLPCI_CAPSUP_ARI_EN_SHIFT;
1030 func_rid = rd32(hw, I40E_PF_FUNC_RID);
1031 if (ari)
1032 hw->pf_id = (u8)(func_rid & 0xff);
1033 else
1034 hw->pf_id = (u8)(func_rid & 0x7);
1035
1036 if (hw->mac.type == I40E_MAC_X722)
1037 hw->flags |= I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE;
1038
1039 status = i40e_init_nvm(hw);
1040 return status;
1041 }
1042
1043 /**
1044 * i40e_aq_mac_address_read - Retrieve the MAC addresses
1045 * @hw: pointer to the hw struct
1046 * @flags: a return indicator of what addresses were added to the addr store
1047 * @addrs: the requestor's mac addr store
1048 * @cmd_details: pointer to command details structure or NULL
1049 **/
1050 STATIC enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw,
1051 u16 *flags,
1052 struct i40e_aqc_mac_address_read_data *addrs,
1053 struct i40e_asq_cmd_details *cmd_details)
1054 {
1055 struct i40e_aq_desc desc;
1056 struct i40e_aqc_mac_address_read *cmd_data =
1057 (struct i40e_aqc_mac_address_read *)&desc.params.raw;
1058 enum i40e_status_code status;
1059
1060 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
1061 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
1062
1063 status = i40e_asq_send_command(hw, &desc, addrs,
1064 sizeof(*addrs), cmd_details);
1065 *flags = LE16_TO_CPU(cmd_data->command_flags);
1066
1067 return status;
1068 }
1069
1070 /**
1071 * i40e_aq_mac_address_write - Change the MAC addresses
1072 * @hw: pointer to the hw struct
1073 * @flags: indicates which MAC to be written
1074 * @mac_addr: address to write
1075 * @cmd_details: pointer to command details structure or NULL
1076 **/
1077 enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
1078 u16 flags, u8 *mac_addr,
1079 struct i40e_asq_cmd_details *cmd_details)
1080 {
1081 struct i40e_aq_desc desc;
1082 struct i40e_aqc_mac_address_write *cmd_data =
1083 (struct i40e_aqc_mac_address_write *)&desc.params.raw;
1084 enum i40e_status_code status;
1085
1086 i40e_fill_default_direct_cmd_desc(&desc,
1087 i40e_aqc_opc_mac_address_write);
1088 cmd_data->command_flags = CPU_TO_LE16(flags);
1089 cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]);
1090 cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) |
1091 ((u32)mac_addr[3] << 16) |
1092 ((u32)mac_addr[4] << 8) |
1093 mac_addr[5]);
1094
1095 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1096
1097 return status;
1098 }
1099
1100 /**
1101 * i40e_get_mac_addr - get MAC address
1102 * @hw: pointer to the HW structure
1103 * @mac_addr: pointer to MAC address
1104 *
1105 * Reads the adapter's MAC address from register
1106 **/
1107 enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1108 {
1109 struct i40e_aqc_mac_address_read_data addrs;
1110 enum i40e_status_code status;
1111 u16 flags = 0;
1112
1113 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1114
1115 if (flags & I40E_AQC_LAN_ADDR_VALID)
1116 i40e_memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac),
1117 I40E_NONDMA_TO_NONDMA);
1118
1119 return status;
1120 }
1121
1122 /**
1123 * i40e_get_port_mac_addr - get Port MAC address
1124 * @hw: pointer to the HW structure
1125 * @mac_addr: pointer to Port MAC address
1126 *
1127 * Reads the adapter's Port MAC address
1128 **/
1129 enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1130 {
1131 struct i40e_aqc_mac_address_read_data addrs;
1132 enum i40e_status_code status;
1133 u16 flags = 0;
1134
1135 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1136 if (status)
1137 return status;
1138
1139 if (flags & I40E_AQC_PORT_ADDR_VALID)
1140 i40e_memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac),
1141 I40E_NONDMA_TO_NONDMA);
1142 else
1143 status = I40E_ERR_INVALID_MAC_ADDR;
1144
1145 return status;
1146 }
1147
1148 /**
1149 * i40e_pre_tx_queue_cfg - pre tx queue configure
1150 * @hw: pointer to the HW structure
1151 * @queue: target pf queue index
1152 * @enable: state change request
1153 *
1154 * Handles hw requirement to indicate intention to enable
1155 * or disable target queue.
1156 **/
1157 void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable)
1158 {
1159 u32 abs_queue_idx = hw->func_caps.base_queue + queue;
1160 u32 reg_block = 0;
1161 u32 reg_val;
1162
1163 if (abs_queue_idx >= 128) {
1164 reg_block = abs_queue_idx / 128;
1165 abs_queue_idx %= 128;
1166 }
1167
1168 reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1169 reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1170 reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1171
1172 if (enable)
1173 reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK;
1174 else
1175 reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1176
1177 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val);
1178 }
1179
1180 /**
1181 * i40e_get_san_mac_addr - get SAN MAC address
1182 * @hw: pointer to the HW structure
1183 * @mac_addr: pointer to SAN MAC address
1184 *
1185 * Reads the adapter's SAN MAC address from NVM
1186 **/
1187 enum i40e_status_code i40e_get_san_mac_addr(struct i40e_hw *hw,
1188 u8 *mac_addr)
1189 {
1190 struct i40e_aqc_mac_address_read_data addrs;
1191 enum i40e_status_code status;
1192 u16 flags = 0;
1193
1194 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1195 if (status)
1196 return status;
1197
1198 if (flags & I40E_AQC_SAN_ADDR_VALID)
1199 i40e_memcpy(mac_addr, &addrs.pf_san_mac, sizeof(addrs.pf_san_mac),
1200 I40E_NONDMA_TO_NONDMA);
1201 else
1202 status = I40E_ERR_INVALID_MAC_ADDR;
1203
1204 return status;
1205 }
1206
1207 /**
1208 * i40e_read_pba_string - Reads part number string from EEPROM
1209 * @hw: pointer to hardware structure
1210 * @pba_num: stores the part number string from the EEPROM
1211 * @pba_num_size: part number string buffer length
1212 *
1213 * Reads the part number string from the EEPROM.
1214 **/
1215 enum i40e_status_code i40e_read_pba_string(struct i40e_hw *hw, u8 *pba_num,
1216 u32 pba_num_size)
1217 {
1218 enum i40e_status_code status = I40E_SUCCESS;
1219 u16 pba_word = 0;
1220 u16 pba_size = 0;
1221 u16 pba_ptr = 0;
1222 u16 i = 0;
1223
1224 status = i40e_read_nvm_word(hw, I40E_SR_PBA_FLAGS, &pba_word);
1225 if ((status != I40E_SUCCESS) || (pba_word != 0xFAFA)) {
1226 DEBUGOUT("Failed to read PBA flags or flag is invalid.\n");
1227 return status;
1228 }
1229
1230 status = i40e_read_nvm_word(hw, I40E_SR_PBA_BLOCK_PTR, &pba_ptr);
1231 if (status != I40E_SUCCESS) {
1232 DEBUGOUT("Failed to read PBA Block pointer.\n");
1233 return status;
1234 }
1235
1236 status = i40e_read_nvm_word(hw, pba_ptr, &pba_size);
1237 if (status != I40E_SUCCESS) {
1238 DEBUGOUT("Failed to read PBA Block size.\n");
1239 return status;
1240 }
1241
1242 /* Subtract one to get PBA word count (PBA Size word is included in
1243 * total size)
1244 */
1245 pba_size--;
1246 if (pba_num_size < (((u32)pba_size * 2) + 1)) {
1247 DEBUGOUT("Buffer to small for PBA data.\n");
1248 return I40E_ERR_PARAM;
1249 }
1250
1251 for (i = 0; i < pba_size; i++) {
1252 status = i40e_read_nvm_word(hw, (pba_ptr + 1) + i, &pba_word);
1253 if (status != I40E_SUCCESS) {
1254 DEBUGOUT1("Failed to read PBA Block word %d.\n", i);
1255 return status;
1256 }
1257
1258 pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
1259 pba_num[(i * 2) + 1] = pba_word & 0xFF;
1260 }
1261 pba_num[(pba_size * 2)] = '\0';
1262
1263 return status;
1264 }
1265
1266 /**
1267 * i40e_get_media_type - Gets media type
1268 * @hw: pointer to the hardware structure
1269 **/
1270 STATIC enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
1271 {
1272 enum i40e_media_type media;
1273
1274 switch (hw->phy.link_info.phy_type) {
1275 case I40E_PHY_TYPE_10GBASE_SR:
1276 case I40E_PHY_TYPE_10GBASE_LR:
1277 case I40E_PHY_TYPE_1000BASE_SX:
1278 case I40E_PHY_TYPE_1000BASE_LX:
1279 case I40E_PHY_TYPE_40GBASE_SR4:
1280 case I40E_PHY_TYPE_40GBASE_LR4:
1281 case I40E_PHY_TYPE_25GBASE_LR:
1282 case I40E_PHY_TYPE_25GBASE_SR:
1283 media = I40E_MEDIA_TYPE_FIBER;
1284 break;
1285 case I40E_PHY_TYPE_100BASE_TX:
1286 case I40E_PHY_TYPE_1000BASE_T:
1287 case I40E_PHY_TYPE_10GBASE_T:
1288 media = I40E_MEDIA_TYPE_BASET;
1289 break;
1290 case I40E_PHY_TYPE_10GBASE_CR1_CU:
1291 case I40E_PHY_TYPE_40GBASE_CR4_CU:
1292 case I40E_PHY_TYPE_10GBASE_CR1:
1293 case I40E_PHY_TYPE_40GBASE_CR4:
1294 case I40E_PHY_TYPE_10GBASE_SFPP_CU:
1295 case I40E_PHY_TYPE_40GBASE_AOC:
1296 case I40E_PHY_TYPE_10GBASE_AOC:
1297 case I40E_PHY_TYPE_25GBASE_CR:
1298 media = I40E_MEDIA_TYPE_DA;
1299 break;
1300 case I40E_PHY_TYPE_1000BASE_KX:
1301 case I40E_PHY_TYPE_10GBASE_KX4:
1302 case I40E_PHY_TYPE_10GBASE_KR:
1303 case I40E_PHY_TYPE_40GBASE_KR4:
1304 case I40E_PHY_TYPE_20GBASE_KR2:
1305 case I40E_PHY_TYPE_25GBASE_KR:
1306 media = I40E_MEDIA_TYPE_BACKPLANE;
1307 break;
1308 case I40E_PHY_TYPE_SGMII:
1309 case I40E_PHY_TYPE_XAUI:
1310 case I40E_PHY_TYPE_XFI:
1311 case I40E_PHY_TYPE_XLAUI:
1312 case I40E_PHY_TYPE_XLPPI:
1313 default:
1314 media = I40E_MEDIA_TYPE_UNKNOWN;
1315 break;
1316 }
1317
1318 return media;
1319 }
1320
1321 #define I40E_PF_RESET_WAIT_COUNT 200
1322 /**
1323 * i40e_pf_reset - Reset the PF
1324 * @hw: pointer to the hardware structure
1325 *
1326 * Assuming someone else has triggered a global reset,
1327 * assure the global reset is complete and then reset the PF
1328 **/
1329 enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw)
1330 {
1331 u32 cnt = 0;
1332 u32 cnt1 = 0;
1333 u32 reg = 0;
1334 u32 grst_del;
1335
1336 /* Poll for Global Reset steady state in case of recent GRST.
1337 * The grst delay value is in 100ms units, and we'll wait a
1338 * couple counts longer to be sure we don't just miss the end.
1339 */
1340 grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) &
1341 I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >>
1342 I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
1343
1344 grst_del = grst_del * 20;
1345
1346 for (cnt = 0; cnt < grst_del; cnt++) {
1347 reg = rd32(hw, I40E_GLGEN_RSTAT);
1348 if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
1349 break;
1350 i40e_msec_delay(100);
1351 }
1352 if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1353 DEBUGOUT("Global reset polling failed to complete.\n");
1354 return I40E_ERR_RESET_FAILED;
1355 }
1356
1357 /* Now Wait for the FW to be ready */
1358 for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) {
1359 reg = rd32(hw, I40E_GLNVM_ULD);
1360 reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1361 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK);
1362 if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1363 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) {
1364 DEBUGOUT1("Core and Global modules ready %d\n", cnt1);
1365 break;
1366 }
1367 i40e_msec_delay(10);
1368 }
1369 if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1370 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) {
1371 DEBUGOUT("wait for FW Reset complete timedout\n");
1372 DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg);
1373 return I40E_ERR_RESET_FAILED;
1374 }
1375
1376 /* If there was a Global Reset in progress when we got here,
1377 * we don't need to do the PF Reset
1378 */
1379 if (!cnt) {
1380 reg = rd32(hw, I40E_PFGEN_CTRL);
1381 wr32(hw, I40E_PFGEN_CTRL,
1382 (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
1383 for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) {
1384 reg = rd32(hw, I40E_PFGEN_CTRL);
1385 if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
1386 break;
1387 i40e_msec_delay(1);
1388 }
1389 if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
1390 DEBUGOUT("PF reset polling failed to complete.\n");
1391 return I40E_ERR_RESET_FAILED;
1392 }
1393 }
1394
1395 i40e_clear_pxe_mode(hw);
1396
1397
1398 return I40E_SUCCESS;
1399 }
1400
1401 /**
1402 * i40e_clear_hw - clear out any left over hw state
1403 * @hw: pointer to the hw struct
1404 *
1405 * Clear queues and interrupts, typically called at init time,
1406 * but after the capabilities have been found so we know how many
1407 * queues and msix vectors have been allocated.
1408 **/
1409 void i40e_clear_hw(struct i40e_hw *hw)
1410 {
1411 u32 num_queues, base_queue;
1412 u32 num_pf_int;
1413 u32 num_vf_int;
1414 u32 num_vfs;
1415 u32 i, j;
1416 u32 val;
1417 u32 eol = 0x7ff;
1418
1419 /* get number of interrupts, queues, and vfs */
1420 val = rd32(hw, I40E_GLPCI_CNF2);
1421 num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >>
1422 I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT;
1423 num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >>
1424 I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT;
1425
1426 val = rd32(hw, I40E_PFLAN_QALLOC);
1427 base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >>
1428 I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
1429 j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
1430 I40E_PFLAN_QALLOC_LASTQ_SHIFT;
1431 if (val & I40E_PFLAN_QALLOC_VALID_MASK)
1432 num_queues = (j - base_queue) + 1;
1433 else
1434 num_queues = 0;
1435
1436 val = rd32(hw, I40E_PF_VT_PFALLOC);
1437 i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >>
1438 I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
1439 j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
1440 I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
1441 if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
1442 num_vfs = (j - i) + 1;
1443 else
1444 num_vfs = 0;
1445
1446 /* stop all the interrupts */
1447 wr32(hw, I40E_PFINT_ICR0_ENA, 0);
1448 val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
1449 for (i = 0; i < num_pf_int - 2; i++)
1450 wr32(hw, I40E_PFINT_DYN_CTLN(i), val);
1451
1452 /* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
1453 val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1454 wr32(hw, I40E_PFINT_LNKLST0, val);
1455 for (i = 0; i < num_pf_int - 2; i++)
1456 wr32(hw, I40E_PFINT_LNKLSTN(i), val);
1457 val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1458 for (i = 0; i < num_vfs; i++)
1459 wr32(hw, I40E_VPINT_LNKLST0(i), val);
1460 for (i = 0; i < num_vf_int - 2; i++)
1461 wr32(hw, I40E_VPINT_LNKLSTN(i), val);
1462
1463 /* warn the HW of the coming Tx disables */
1464 for (i = 0; i < num_queues; i++) {
1465 u32 abs_queue_idx = base_queue + i;
1466 u32 reg_block = 0;
1467
1468 if (abs_queue_idx >= 128) {
1469 reg_block = abs_queue_idx / 128;
1470 abs_queue_idx %= 128;
1471 }
1472
1473 val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1474 val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1475 val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1476 val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1477
1478 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val);
1479 }
1480 i40e_usec_delay(400);
1481
1482 /* stop all the queues */
1483 for (i = 0; i < num_queues; i++) {
1484 wr32(hw, I40E_QINT_TQCTL(i), 0);
1485 wr32(hw, I40E_QTX_ENA(i), 0);
1486 wr32(hw, I40E_QINT_RQCTL(i), 0);
1487 wr32(hw, I40E_QRX_ENA(i), 0);
1488 }
1489
1490 /* short wait for all queue disables to settle */
1491 i40e_usec_delay(50);
1492 }
1493
1494 /**
1495 * i40e_clear_pxe_mode - clear pxe operations mode
1496 * @hw: pointer to the hw struct
1497 *
1498 * Make sure all PXE mode settings are cleared, including things
1499 * like descriptor fetch/write-back mode.
1500 **/
1501 void i40e_clear_pxe_mode(struct i40e_hw *hw)
1502 {
1503 if (i40e_check_asq_alive(hw))
1504 i40e_aq_clear_pxe_mode(hw, NULL);
1505 }
1506
1507 /**
1508 * i40e_led_is_mine - helper to find matching led
1509 * @hw: pointer to the hw struct
1510 * @idx: index into GPIO registers
1511 *
1512 * returns: 0 if no match, otherwise the value of the GPIO_CTL register
1513 */
1514 static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx)
1515 {
1516 u32 gpio_val = 0;
1517 u32 port;
1518
1519 if (!hw->func_caps.led[idx])
1520 return 0;
1521
1522 gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx));
1523 port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >>
1524 I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
1525
1526 /* if PRT_NUM_NA is 1 then this LED is not port specific, OR
1527 * if it is not our port then ignore
1528 */
1529 if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) ||
1530 (port != hw->port))
1531 return 0;
1532
1533 return gpio_val;
1534 }
1535
1536 #define I40E_COMBINED_ACTIVITY 0xA
1537 #define I40E_FILTER_ACTIVITY 0xE
1538 #define I40E_LINK_ACTIVITY 0xC
1539 #define I40E_MAC_ACTIVITY 0xD
1540 #define I40E_LED0 22
1541
1542 /**
1543 * i40e_led_get - return current on/off mode
1544 * @hw: pointer to the hw struct
1545 *
1546 * The value returned is the 'mode' field as defined in the
1547 * GPIO register definitions: 0x0 = off, 0xf = on, and other
1548 * values are variations of possible behaviors relating to
1549 * blink, link, and wire.
1550 **/
1551 u32 i40e_led_get(struct i40e_hw *hw)
1552 {
1553 u32 current_mode = 0;
1554 u32 mode = 0;
1555 int i;
1556
1557 /* as per the documentation GPIO 22-29 are the LED
1558 * GPIO pins named LED0..LED7
1559 */
1560 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1561 u32 gpio_val = i40e_led_is_mine(hw, i);
1562
1563 if (!gpio_val)
1564 continue;
1565
1566 /* ignore gpio LED src mode entries related to the activity
1567 * LEDs
1568 */
1569 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1570 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1571 switch (current_mode) {
1572 case I40E_COMBINED_ACTIVITY:
1573 case I40E_FILTER_ACTIVITY:
1574 case I40E_MAC_ACTIVITY:
1575 continue;
1576 default:
1577 break;
1578 }
1579
1580 mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1581 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT;
1582 break;
1583 }
1584
1585 return mode;
1586 }
1587
1588 /**
1589 * i40e_led_set - set new on/off mode
1590 * @hw: pointer to the hw struct
1591 * @mode: 0=off, 0xf=on (else see manual for mode details)
1592 * @blink: true if the LED should blink when on, false if steady
1593 *
1594 * if this function is used to turn on the blink it should
1595 * be used to disable the blink when restoring the original state.
1596 **/
1597 void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink)
1598 {
1599 u32 current_mode = 0;
1600 int i;
1601
1602 if (mode & 0xfffffff0)
1603 DEBUGOUT1("invalid mode passed in %X\n", mode);
1604
1605 /* as per the documentation GPIO 22-29 are the LED
1606 * GPIO pins named LED0..LED7
1607 */
1608 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1609 u32 gpio_val = i40e_led_is_mine(hw, i);
1610
1611 if (!gpio_val)
1612 continue;
1613
1614 /* ignore gpio LED src mode entries related to the activity
1615 * LEDs
1616 */
1617 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1618 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1619 switch (current_mode) {
1620 case I40E_COMBINED_ACTIVITY:
1621 case I40E_FILTER_ACTIVITY:
1622 case I40E_MAC_ACTIVITY:
1623 continue;
1624 default:
1625 break;
1626 }
1627
1628 gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
1629 /* this & is a bit of paranoia, but serves as a range check */
1630 gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
1631 I40E_GLGEN_GPIO_CTL_LED_MODE_MASK);
1632
1633 if (mode == I40E_LINK_ACTIVITY)
1634 blink = false;
1635
1636 if (blink)
1637 gpio_val |= BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1638 else
1639 gpio_val &= ~BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1640
1641 wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
1642 break;
1643 }
1644 }
1645
1646 /* Admin command wrappers */
1647
1648 /**
1649 * i40e_aq_get_phy_capabilities
1650 * @hw: pointer to the hw struct
1651 * @abilities: structure for PHY capabilities to be filled
1652 * @qualified_modules: report Qualified Modules
1653 * @report_init: report init capabilities (active are default)
1654 * @cmd_details: pointer to command details structure or NULL
1655 *
1656 * Returns the various PHY abilities supported on the Port.
1657 **/
1658 enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
1659 bool qualified_modules, bool report_init,
1660 struct i40e_aq_get_phy_abilities_resp *abilities,
1661 struct i40e_asq_cmd_details *cmd_details)
1662 {
1663 struct i40e_aq_desc desc;
1664 enum i40e_status_code status;
1665 u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
1666
1667 if (!abilities)
1668 return I40E_ERR_PARAM;
1669
1670 i40e_fill_default_direct_cmd_desc(&desc,
1671 i40e_aqc_opc_get_phy_abilities);
1672
1673 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1674 if (abilities_size > I40E_AQ_LARGE_BUF)
1675 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1676
1677 if (qualified_modules)
1678 desc.params.external.param0 |=
1679 CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
1680
1681 if (report_init)
1682 desc.params.external.param0 |=
1683 CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
1684
1685 status = i40e_asq_send_command(hw, &desc, abilities, abilities_size,
1686 cmd_details);
1687
1688 if (hw->aq.asq_last_status == I40E_AQ_RC_EIO)
1689 status = I40E_ERR_UNKNOWN_PHY;
1690
1691 if (report_init) {
1692 hw->phy.phy_types = LE32_TO_CPU(abilities->phy_type);
1693 hw->phy.phy_types |= ((u64)abilities->phy_type_ext << 32);
1694 }
1695
1696 return status;
1697 }
1698
1699 /**
1700 * i40e_aq_set_phy_config
1701 * @hw: pointer to the hw struct
1702 * @config: structure with PHY configuration to be set
1703 * @cmd_details: pointer to command details structure or NULL
1704 *
1705 * Set the various PHY configuration parameters
1706 * supported on the Port.One or more of the Set PHY config parameters may be
1707 * ignored in an MFP mode as the PF may not have the privilege to set some
1708 * of the PHY Config parameters. This status will be indicated by the
1709 * command response.
1710 **/
1711 enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
1712 struct i40e_aq_set_phy_config *config,
1713 struct i40e_asq_cmd_details *cmd_details)
1714 {
1715 struct i40e_aq_desc desc;
1716 struct i40e_aq_set_phy_config *cmd =
1717 (struct i40e_aq_set_phy_config *)&desc.params.raw;
1718 enum i40e_status_code status;
1719
1720 if (!config)
1721 return I40E_ERR_PARAM;
1722
1723 i40e_fill_default_direct_cmd_desc(&desc,
1724 i40e_aqc_opc_set_phy_config);
1725
1726 *cmd = *config;
1727
1728 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1729
1730 return status;
1731 }
1732
1733 /**
1734 * i40e_set_fc
1735 * @hw: pointer to the hw struct
1736 *
1737 * Set the requested flow control mode using set_phy_config.
1738 **/
1739 enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
1740 bool atomic_restart)
1741 {
1742 enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
1743 struct i40e_aq_get_phy_abilities_resp abilities;
1744 struct i40e_aq_set_phy_config config;
1745 enum i40e_status_code status;
1746 u8 pause_mask = 0x0;
1747
1748 *aq_failures = 0x0;
1749
1750 switch (fc_mode) {
1751 case I40E_FC_FULL:
1752 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1753 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1754 break;
1755 case I40E_FC_RX_PAUSE:
1756 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1757 break;
1758 case I40E_FC_TX_PAUSE:
1759 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1760 break;
1761 default:
1762 break;
1763 }
1764
1765 /* Get the current phy config */
1766 status = i40e_aq_get_phy_capabilities(hw, false, false, &abilities,
1767 NULL);
1768 if (status) {
1769 *aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
1770 return status;
1771 }
1772
1773 memset(&config, 0, sizeof(config));
1774 /* clear the old pause settings */
1775 config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
1776 ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
1777 /* set the new abilities */
1778 config.abilities |= pause_mask;
1779 /* If the abilities have changed, then set the new config */
1780 if (config.abilities != abilities.abilities) {
1781 /* Auto restart link so settings take effect */
1782 if (atomic_restart)
1783 config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
1784 /* Copy over all the old settings */
1785 config.phy_type = abilities.phy_type;
1786 config.phy_type_ext = abilities.phy_type_ext;
1787 config.link_speed = abilities.link_speed;
1788 config.eee_capability = abilities.eee_capability;
1789 config.eeer = abilities.eeer_val;
1790 config.low_power_ctrl = abilities.d3_lpan;
1791 config.fec_config = abilities.fec_cfg_curr_mod_ext_info &
1792 I40E_AQ_PHY_FEC_CONFIG_MASK;
1793 status = i40e_aq_set_phy_config(hw, &config, NULL);
1794
1795 if (status)
1796 *aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
1797 }
1798 /* Update the link info */
1799 status = i40e_update_link_info(hw);
1800 if (status) {
1801 /* Wait a little bit (on 40G cards it sometimes takes a really
1802 * long time for link to come back from the atomic reset)
1803 * and try once more
1804 */
1805 i40e_msec_delay(1000);
1806 status = i40e_update_link_info(hw);
1807 }
1808 if (status)
1809 *aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
1810
1811 return status;
1812 }
1813
1814 /**
1815 * i40e_aq_set_mac_config
1816 * @hw: pointer to the hw struct
1817 * @max_frame_size: Maximum Frame Size to be supported by the port
1818 * @crc_en: Tell HW to append a CRC to outgoing frames
1819 * @pacing: Pacing configurations
1820 * @cmd_details: pointer to command details structure or NULL
1821 *
1822 * Configure MAC settings for frame size, jumbo frame support and the
1823 * addition of a CRC by the hardware.
1824 **/
1825 enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
1826 u16 max_frame_size,
1827 bool crc_en, u16 pacing,
1828 struct i40e_asq_cmd_details *cmd_details)
1829 {
1830 struct i40e_aq_desc desc;
1831 struct i40e_aq_set_mac_config *cmd =
1832 (struct i40e_aq_set_mac_config *)&desc.params.raw;
1833 enum i40e_status_code status;
1834
1835 if (max_frame_size == 0)
1836 return I40E_ERR_PARAM;
1837
1838 i40e_fill_default_direct_cmd_desc(&desc,
1839 i40e_aqc_opc_set_mac_config);
1840
1841 cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
1842 cmd->params = ((u8)pacing & 0x0F) << 3;
1843 if (crc_en)
1844 cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
1845
1846 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1847
1848 return status;
1849 }
1850
1851 /**
1852 * i40e_aq_clear_pxe_mode
1853 * @hw: pointer to the hw struct
1854 * @cmd_details: pointer to command details structure or NULL
1855 *
1856 * Tell the firmware that the driver is taking over from PXE
1857 **/
1858 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
1859 struct i40e_asq_cmd_details *cmd_details)
1860 {
1861 enum i40e_status_code status;
1862 struct i40e_aq_desc desc;
1863 struct i40e_aqc_clear_pxe *cmd =
1864 (struct i40e_aqc_clear_pxe *)&desc.params.raw;
1865
1866 i40e_fill_default_direct_cmd_desc(&desc,
1867 i40e_aqc_opc_clear_pxe_mode);
1868
1869 cmd->rx_cnt = 0x2;
1870
1871 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1872
1873 wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
1874
1875 return status;
1876 }
1877
1878 /**
1879 * i40e_aq_set_link_restart_an
1880 * @hw: pointer to the hw struct
1881 * @enable_link: if true: enable link, if false: disable link
1882 * @cmd_details: pointer to command details structure or NULL
1883 *
1884 * Sets up the link and restarts the Auto-Negotiation over the link.
1885 **/
1886 enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
1887 bool enable_link, struct i40e_asq_cmd_details *cmd_details)
1888 {
1889 struct i40e_aq_desc desc;
1890 struct i40e_aqc_set_link_restart_an *cmd =
1891 (struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
1892 enum i40e_status_code status;
1893
1894 i40e_fill_default_direct_cmd_desc(&desc,
1895 i40e_aqc_opc_set_link_restart_an);
1896
1897 cmd->command = I40E_AQ_PHY_RESTART_AN;
1898 if (enable_link)
1899 cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
1900 else
1901 cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
1902
1903 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1904
1905 return status;
1906 }
1907
1908 /**
1909 * i40e_aq_get_link_info
1910 * @hw: pointer to the hw struct
1911 * @enable_lse: enable/disable LinkStatusEvent reporting
1912 * @link: pointer to link status structure - optional
1913 * @cmd_details: pointer to command details structure or NULL
1914 *
1915 * Returns the link status of the adapter.
1916 **/
1917 enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
1918 bool enable_lse, struct i40e_link_status *link,
1919 struct i40e_asq_cmd_details *cmd_details)
1920 {
1921 struct i40e_aq_desc desc;
1922 struct i40e_aqc_get_link_status *resp =
1923 (struct i40e_aqc_get_link_status *)&desc.params.raw;
1924 struct i40e_link_status *hw_link_info = &hw->phy.link_info;
1925 enum i40e_status_code status;
1926 bool tx_pause, rx_pause;
1927 u16 command_flags;
1928
1929 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
1930
1931 if (enable_lse)
1932 command_flags = I40E_AQ_LSE_ENABLE;
1933 else
1934 command_flags = I40E_AQ_LSE_DISABLE;
1935 resp->command_flags = CPU_TO_LE16(command_flags);
1936
1937 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1938
1939 if (status != I40E_SUCCESS)
1940 goto aq_get_link_info_exit;
1941
1942 /* save off old link status information */
1943 i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
1944 sizeof(*hw_link_info), I40E_NONDMA_TO_NONDMA);
1945
1946 /* update link status */
1947 hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
1948 hw->phy.media_type = i40e_get_media_type(hw);
1949 hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
1950 hw_link_info->link_info = resp->link_info;
1951 hw_link_info->an_info = resp->an_info;
1952 hw_link_info->fec_info = resp->config & (I40E_AQ_CONFIG_FEC_KR_ENA |
1953 I40E_AQ_CONFIG_FEC_RS_ENA);
1954 hw_link_info->ext_info = resp->ext_info;
1955 hw_link_info->loopback = resp->loopback;
1956 hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
1957 hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
1958
1959 /* update fc info */
1960 tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
1961 rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
1962 if (tx_pause & rx_pause)
1963 hw->fc.current_mode = I40E_FC_FULL;
1964 else if (tx_pause)
1965 hw->fc.current_mode = I40E_FC_TX_PAUSE;
1966 else if (rx_pause)
1967 hw->fc.current_mode = I40E_FC_RX_PAUSE;
1968 else
1969 hw->fc.current_mode = I40E_FC_NONE;
1970
1971 if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
1972 hw_link_info->crc_enable = true;
1973 else
1974 hw_link_info->crc_enable = false;
1975
1976 if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_IS_ENABLED))
1977 hw_link_info->lse_enable = true;
1978 else
1979 hw_link_info->lse_enable = false;
1980
1981 if ((hw->mac.type == I40E_MAC_XL710) &&
1982 (hw->aq.fw_maj_ver < 4 || (hw->aq.fw_maj_ver == 4 &&
1983 hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
1984 hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
1985
1986 /* save link status information */
1987 if (link)
1988 i40e_memcpy(link, hw_link_info, sizeof(*hw_link_info),
1989 I40E_NONDMA_TO_NONDMA);
1990
1991 /* flag cleared so helper functions don't call AQ again */
1992 hw->phy.get_link_info = false;
1993
1994 aq_get_link_info_exit:
1995 return status;
1996 }
1997
1998 /**
1999 * i40e_aq_set_phy_int_mask
2000 * @hw: pointer to the hw struct
2001 * @mask: interrupt mask to be set
2002 * @cmd_details: pointer to command details structure or NULL
2003 *
2004 * Set link interrupt mask.
2005 **/
2006 enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
2007 u16 mask,
2008 struct i40e_asq_cmd_details *cmd_details)
2009 {
2010 struct i40e_aq_desc desc;
2011 struct i40e_aqc_set_phy_int_mask *cmd =
2012 (struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
2013 enum i40e_status_code status;
2014
2015 i40e_fill_default_direct_cmd_desc(&desc,
2016 i40e_aqc_opc_set_phy_int_mask);
2017
2018 cmd->event_mask = CPU_TO_LE16(mask);
2019
2020 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2021
2022 return status;
2023 }
2024
2025 /**
2026 * i40e_aq_get_local_advt_reg
2027 * @hw: pointer to the hw struct
2028 * @advt_reg: local AN advertisement register value
2029 * @cmd_details: pointer to command details structure or NULL
2030 *
2031 * Get the Local AN advertisement register value.
2032 **/
2033 enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
2034 u64 *advt_reg,
2035 struct i40e_asq_cmd_details *cmd_details)
2036 {
2037 struct i40e_aq_desc desc;
2038 struct i40e_aqc_an_advt_reg *resp =
2039 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2040 enum i40e_status_code status;
2041
2042 i40e_fill_default_direct_cmd_desc(&desc,
2043 i40e_aqc_opc_get_local_advt_reg);
2044
2045 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2046
2047 if (status != I40E_SUCCESS)
2048 goto aq_get_local_advt_reg_exit;
2049
2050 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2051 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2052
2053 aq_get_local_advt_reg_exit:
2054 return status;
2055 }
2056
2057 /**
2058 * i40e_aq_set_local_advt_reg
2059 * @hw: pointer to the hw struct
2060 * @advt_reg: local AN advertisement register value
2061 * @cmd_details: pointer to command details structure or NULL
2062 *
2063 * Get the Local AN advertisement register value.
2064 **/
2065 enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
2066 u64 advt_reg,
2067 struct i40e_asq_cmd_details *cmd_details)
2068 {
2069 struct i40e_aq_desc desc;
2070 struct i40e_aqc_an_advt_reg *cmd =
2071 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2072 enum i40e_status_code status;
2073
2074 i40e_fill_default_direct_cmd_desc(&desc,
2075 i40e_aqc_opc_get_local_advt_reg);
2076
2077 cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
2078 cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
2079
2080 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2081
2082 return status;
2083 }
2084
2085 /**
2086 * i40e_aq_get_partner_advt
2087 * @hw: pointer to the hw struct
2088 * @advt_reg: AN partner advertisement register value
2089 * @cmd_details: pointer to command details structure or NULL
2090 *
2091 * Get the link partner AN advertisement register value.
2092 **/
2093 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
2094 u64 *advt_reg,
2095 struct i40e_asq_cmd_details *cmd_details)
2096 {
2097 struct i40e_aq_desc desc;
2098 struct i40e_aqc_an_advt_reg *resp =
2099 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2100 enum i40e_status_code status;
2101
2102 i40e_fill_default_direct_cmd_desc(&desc,
2103 i40e_aqc_opc_get_partner_advt);
2104
2105 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2106
2107 if (status != I40E_SUCCESS)
2108 goto aq_get_partner_advt_exit;
2109
2110 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2111 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2112
2113 aq_get_partner_advt_exit:
2114 return status;
2115 }
2116
2117 /**
2118 * i40e_aq_set_lb_modes
2119 * @hw: pointer to the hw struct
2120 * @lb_modes: loopback mode to be set
2121 * @cmd_details: pointer to command details structure or NULL
2122 *
2123 * Sets loopback modes.
2124 **/
2125 enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
2126 u16 lb_modes,
2127 struct i40e_asq_cmd_details *cmd_details)
2128 {
2129 struct i40e_aq_desc desc;
2130 struct i40e_aqc_set_lb_mode *cmd =
2131 (struct i40e_aqc_set_lb_mode *)&desc.params.raw;
2132 enum i40e_status_code status;
2133
2134 i40e_fill_default_direct_cmd_desc(&desc,
2135 i40e_aqc_opc_set_lb_modes);
2136
2137 cmd->lb_mode = CPU_TO_LE16(lb_modes);
2138
2139 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2140
2141 return status;
2142 }
2143
2144 /**
2145 * i40e_aq_set_phy_debug
2146 * @hw: pointer to the hw struct
2147 * @cmd_flags: debug command flags
2148 * @cmd_details: pointer to command details structure or NULL
2149 *
2150 * Reset the external PHY.
2151 **/
2152 enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
2153 struct i40e_asq_cmd_details *cmd_details)
2154 {
2155 struct i40e_aq_desc desc;
2156 struct i40e_aqc_set_phy_debug *cmd =
2157 (struct i40e_aqc_set_phy_debug *)&desc.params.raw;
2158 enum i40e_status_code status;
2159
2160 i40e_fill_default_direct_cmd_desc(&desc,
2161 i40e_aqc_opc_set_phy_debug);
2162
2163 cmd->command_flags = cmd_flags;
2164
2165 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2166
2167 return status;
2168 }
2169
2170 /**
2171 * i40e_aq_add_vsi
2172 * @hw: pointer to the hw struct
2173 * @vsi_ctx: pointer to a vsi context struct
2174 * @cmd_details: pointer to command details structure or NULL
2175 *
2176 * Add a VSI context to the hardware.
2177 **/
2178 enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
2179 struct i40e_vsi_context *vsi_ctx,
2180 struct i40e_asq_cmd_details *cmd_details)
2181 {
2182 struct i40e_aq_desc desc;
2183 struct i40e_aqc_add_get_update_vsi *cmd =
2184 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2185 struct i40e_aqc_add_get_update_vsi_completion *resp =
2186 (struct i40e_aqc_add_get_update_vsi_completion *)
2187 &desc.params.raw;
2188 enum i40e_status_code status;
2189
2190 i40e_fill_default_direct_cmd_desc(&desc,
2191 i40e_aqc_opc_add_vsi);
2192
2193 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
2194 cmd->connection_type = vsi_ctx->connection_type;
2195 cmd->vf_id = vsi_ctx->vf_num;
2196 cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
2197
2198 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2199
2200 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2201 sizeof(vsi_ctx->info), cmd_details);
2202
2203 if (status != I40E_SUCCESS)
2204 goto aq_add_vsi_exit;
2205
2206 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2207 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2208 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2209 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2210
2211 aq_add_vsi_exit:
2212 return status;
2213 }
2214
2215 /**
2216 * i40e_aq_set_default_vsi
2217 * @hw: pointer to the hw struct
2218 * @seid: vsi number
2219 * @cmd_details: pointer to command details structure or NULL
2220 **/
2221 enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
2222 u16 seid,
2223 struct i40e_asq_cmd_details *cmd_details)
2224 {
2225 struct i40e_aq_desc desc;
2226 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2227 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2228 &desc.params.raw;
2229 enum i40e_status_code status;
2230
2231 i40e_fill_default_direct_cmd_desc(&desc,
2232 i40e_aqc_opc_set_vsi_promiscuous_modes);
2233
2234 cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2235 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2236 cmd->seid = CPU_TO_LE16(seid);
2237
2238 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2239
2240 return status;
2241 }
2242
2243 /**
2244 * i40e_aq_clear_default_vsi
2245 * @hw: pointer to the hw struct
2246 * @seid: vsi number
2247 * @cmd_details: pointer to command details structure or NULL
2248 **/
2249 enum i40e_status_code i40e_aq_clear_default_vsi(struct i40e_hw *hw,
2250 u16 seid,
2251 struct i40e_asq_cmd_details *cmd_details)
2252 {
2253 struct i40e_aq_desc desc;
2254 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2255 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2256 &desc.params.raw;
2257 enum i40e_status_code status;
2258
2259 i40e_fill_default_direct_cmd_desc(&desc,
2260 i40e_aqc_opc_set_vsi_promiscuous_modes);
2261
2262 cmd->promiscuous_flags = CPU_TO_LE16(0);
2263 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2264 cmd->seid = CPU_TO_LE16(seid);
2265
2266 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2267
2268 return status;
2269 }
2270
2271 /**
2272 * i40e_aq_set_vsi_unicast_promiscuous
2273 * @hw: pointer to the hw struct
2274 * @seid: vsi number
2275 * @set: set unicast promiscuous enable/disable
2276 * @cmd_details: pointer to command details structure or NULL
2277 * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
2278 **/
2279 enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
2280 u16 seid, bool set,
2281 struct i40e_asq_cmd_details *cmd_details,
2282 bool rx_only_promisc)
2283 {
2284 struct i40e_aq_desc desc;
2285 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2286 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2287 enum i40e_status_code status;
2288 u16 flags = 0;
2289
2290 i40e_fill_default_direct_cmd_desc(&desc,
2291 i40e_aqc_opc_set_vsi_promiscuous_modes);
2292
2293 if (set) {
2294 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2295 if (rx_only_promisc &&
2296 (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) ||
2297 (hw->aq.api_maj_ver > 1)))
2298 flags |= I40E_AQC_SET_VSI_PROMISC_TX;
2299 }
2300
2301 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2302
2303 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2304 if (((hw->aq.api_maj_ver >= 1) && (hw->aq.api_min_ver >= 5)) ||
2305 (hw->aq.api_maj_ver > 1))
2306 cmd->valid_flags |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_TX);
2307
2308 cmd->seid = CPU_TO_LE16(seid);
2309 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2310
2311 return status;
2312 }
2313
2314 /**
2315 * i40e_aq_set_vsi_multicast_promiscuous
2316 * @hw: pointer to the hw struct
2317 * @seid: vsi number
2318 * @set: set multicast promiscuous enable/disable
2319 * @cmd_details: pointer to command details structure or NULL
2320 **/
2321 enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
2322 u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
2323 {
2324 struct i40e_aq_desc desc;
2325 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2326 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2327 enum i40e_status_code status;
2328 u16 flags = 0;
2329
2330 i40e_fill_default_direct_cmd_desc(&desc,
2331 i40e_aqc_opc_set_vsi_promiscuous_modes);
2332
2333 if (set)
2334 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2335
2336 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2337
2338 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2339
2340 cmd->seid = CPU_TO_LE16(seid);
2341 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2342
2343 return status;
2344 }
2345
2346 /**
2347 * i40e_aq_set_vsi_full_promiscuous
2348 * @hw: pointer to the hw struct
2349 * @seid: VSI number
2350 * @set: set promiscuous enable/disable
2351 * @cmd_details: pointer to command details structure or NULL
2352 **/
2353 enum i40e_status_code i40e_aq_set_vsi_full_promiscuous(struct i40e_hw *hw,
2354 u16 seid, bool set,
2355 struct i40e_asq_cmd_details *cmd_details)
2356 {
2357 struct i40e_aq_desc desc;
2358 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2359 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2360 enum i40e_status_code status;
2361 u16 flags = 0;
2362
2363 i40e_fill_default_direct_cmd_desc(&desc,
2364 i40e_aqc_opc_set_vsi_promiscuous_modes);
2365
2366 if (set)
2367 flags = I40E_AQC_SET_VSI_PROMISC_UNICAST |
2368 I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2369 I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2370
2371 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2372
2373 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST |
2374 I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2375 I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2376
2377 cmd->seid = CPU_TO_LE16(seid);
2378 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2379
2380 return status;
2381 }
2382
2383 /**
2384 * i40e_aq_set_vsi_mc_promisc_on_vlan
2385 * @hw: pointer to the hw struct
2386 * @seid: vsi number
2387 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2388 * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
2389 * @cmd_details: pointer to command details structure or NULL
2390 **/
2391 enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
2392 u16 seid, bool enable, u16 vid,
2393 struct i40e_asq_cmd_details *cmd_details)
2394 {
2395 struct i40e_aq_desc desc;
2396 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2397 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2398 enum i40e_status_code status;
2399 u16 flags = 0;
2400
2401 i40e_fill_default_direct_cmd_desc(&desc,
2402 i40e_aqc_opc_set_vsi_promiscuous_modes);
2403
2404 if (enable)
2405 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2406
2407 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2408 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2409 cmd->seid = CPU_TO_LE16(seid);
2410 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2411
2412 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2413
2414 return status;
2415 }
2416
2417 /**
2418 * i40e_aq_set_vsi_uc_promisc_on_vlan
2419 * @hw: pointer to the hw struct
2420 * @seid: vsi number
2421 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2422 * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
2423 * @cmd_details: pointer to command details structure or NULL
2424 **/
2425 enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
2426 u16 seid, bool enable, u16 vid,
2427 struct i40e_asq_cmd_details *cmd_details)
2428 {
2429 struct i40e_aq_desc desc;
2430 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2431 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2432 enum i40e_status_code status;
2433 u16 flags = 0;
2434
2435 i40e_fill_default_direct_cmd_desc(&desc,
2436 i40e_aqc_opc_set_vsi_promiscuous_modes);
2437
2438 if (enable)
2439 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2440
2441 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2442 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2443 cmd->seid = CPU_TO_LE16(seid);
2444 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2445
2446 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2447
2448 return status;
2449 }
2450
2451 /**
2452 * i40e_aq_set_vsi_bc_promisc_on_vlan
2453 * @hw: pointer to the hw struct
2454 * @seid: vsi number
2455 * @enable: set broadcast promiscuous enable/disable for a given VLAN
2456 * @vid: The VLAN tag filter - capture any broadcast packet with this VLAN tag
2457 * @cmd_details: pointer to command details structure or NULL
2458 **/
2459 enum i40e_status_code i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw *hw,
2460 u16 seid, bool enable, u16 vid,
2461 struct i40e_asq_cmd_details *cmd_details)
2462 {
2463 struct i40e_aq_desc desc;
2464 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2465 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2466 enum i40e_status_code status;
2467 u16 flags = 0;
2468
2469 i40e_fill_default_direct_cmd_desc(&desc,
2470 i40e_aqc_opc_set_vsi_promiscuous_modes);
2471
2472 if (enable)
2473 flags |= I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2474
2475 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2476 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2477 cmd->seid = CPU_TO_LE16(seid);
2478 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2479
2480 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2481
2482 return status;
2483 }
2484
2485 /**
2486 * i40e_aq_set_vsi_broadcast
2487 * @hw: pointer to the hw struct
2488 * @seid: vsi number
2489 * @set_filter: true to set filter, false to clear filter
2490 * @cmd_details: pointer to command details structure or NULL
2491 *
2492 * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
2493 **/
2494 enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
2495 u16 seid, bool set_filter,
2496 struct i40e_asq_cmd_details *cmd_details)
2497 {
2498 struct i40e_aq_desc desc;
2499 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2500 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2501 enum i40e_status_code status;
2502
2503 i40e_fill_default_direct_cmd_desc(&desc,
2504 i40e_aqc_opc_set_vsi_promiscuous_modes);
2505
2506 if (set_filter)
2507 cmd->promiscuous_flags
2508 |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2509 else
2510 cmd->promiscuous_flags
2511 &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2512
2513 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2514 cmd->seid = CPU_TO_LE16(seid);
2515 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2516
2517 return status;
2518 }
2519
2520 /**
2521 * i40e_aq_set_vsi_vlan_promisc - control the VLAN promiscuous setting
2522 * @hw: pointer to the hw struct
2523 * @seid: vsi number
2524 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2525 * @cmd_details: pointer to command details structure or NULL
2526 **/
2527 enum i40e_status_code i40e_aq_set_vsi_vlan_promisc(struct i40e_hw *hw,
2528 u16 seid, bool enable,
2529 struct i40e_asq_cmd_details *cmd_details)
2530 {
2531 struct i40e_aq_desc desc;
2532 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2533 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2534 enum i40e_status_code status;
2535 u16 flags = 0;
2536
2537 i40e_fill_default_direct_cmd_desc(&desc,
2538 i40e_aqc_opc_set_vsi_promiscuous_modes);
2539 if (enable)
2540 flags |= I40E_AQC_SET_VSI_PROMISC_VLAN;
2541
2542 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2543 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_VLAN);
2544 cmd->seid = CPU_TO_LE16(seid);
2545
2546 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2547
2548 return status;
2549 }
2550
2551 /**
2552 * i40e_get_vsi_params - get VSI configuration info
2553 * @hw: pointer to the hw struct
2554 * @vsi_ctx: pointer to a vsi context struct
2555 * @cmd_details: pointer to command details structure or NULL
2556 **/
2557 enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
2558 struct i40e_vsi_context *vsi_ctx,
2559 struct i40e_asq_cmd_details *cmd_details)
2560 {
2561 struct i40e_aq_desc desc;
2562 struct i40e_aqc_add_get_update_vsi *cmd =
2563 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2564 struct i40e_aqc_add_get_update_vsi_completion *resp =
2565 (struct i40e_aqc_add_get_update_vsi_completion *)
2566 &desc.params.raw;
2567 enum i40e_status_code status;
2568
2569 UNREFERENCED_1PARAMETER(cmd_details);
2570 i40e_fill_default_direct_cmd_desc(&desc,
2571 i40e_aqc_opc_get_vsi_parameters);
2572
2573 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2574
2575 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2576
2577 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2578 sizeof(vsi_ctx->info), NULL);
2579
2580 if (status != I40E_SUCCESS)
2581 goto aq_get_vsi_params_exit;
2582
2583 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2584 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2585 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2586 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2587
2588 aq_get_vsi_params_exit:
2589 return status;
2590 }
2591
2592 /**
2593 * i40e_aq_update_vsi_params
2594 * @hw: pointer to the hw struct
2595 * @vsi_ctx: pointer to a vsi context struct
2596 * @cmd_details: pointer to command details structure or NULL
2597 *
2598 * Update a VSI context.
2599 **/
2600 enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
2601 struct i40e_vsi_context *vsi_ctx,
2602 struct i40e_asq_cmd_details *cmd_details)
2603 {
2604 struct i40e_aq_desc desc;
2605 struct i40e_aqc_add_get_update_vsi *cmd =
2606 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2607 struct i40e_aqc_add_get_update_vsi_completion *resp =
2608 (struct i40e_aqc_add_get_update_vsi_completion *)
2609 &desc.params.raw;
2610 enum i40e_status_code status;
2611
2612 i40e_fill_default_direct_cmd_desc(&desc,
2613 i40e_aqc_opc_update_vsi_parameters);
2614 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2615
2616 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2617
2618 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2619 sizeof(vsi_ctx->info), cmd_details);
2620
2621 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2622 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2623
2624 return status;
2625 }
2626
2627 /**
2628 * i40e_aq_get_switch_config
2629 * @hw: pointer to the hardware structure
2630 * @buf: pointer to the result buffer
2631 * @buf_size: length of input buffer
2632 * @start_seid: seid to start for the report, 0 == beginning
2633 * @cmd_details: pointer to command details structure or NULL
2634 *
2635 * Fill the buf with switch configuration returned from AdminQ command
2636 **/
2637 enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
2638 struct i40e_aqc_get_switch_config_resp *buf,
2639 u16 buf_size, u16 *start_seid,
2640 struct i40e_asq_cmd_details *cmd_details)
2641 {
2642 struct i40e_aq_desc desc;
2643 struct i40e_aqc_switch_seid *scfg =
2644 (struct i40e_aqc_switch_seid *)&desc.params.raw;
2645 enum i40e_status_code status;
2646
2647 i40e_fill_default_direct_cmd_desc(&desc,
2648 i40e_aqc_opc_get_switch_config);
2649 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2650 if (buf_size > I40E_AQ_LARGE_BUF)
2651 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2652 scfg->seid = CPU_TO_LE16(*start_seid);
2653
2654 status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
2655 *start_seid = LE16_TO_CPU(scfg->seid);
2656
2657 return status;
2658 }
2659
2660 /**
2661 * i40e_aq_set_switch_config
2662 * @hw: pointer to the hardware structure
2663 * @flags: bit flag values to set
2664 * @valid_flags: which bit flags to set
2665 * @cmd_details: pointer to command details structure or NULL
2666 *
2667 * Set switch configuration bits
2668 **/
2669 enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
2670 u16 flags, u16 valid_flags,
2671 struct i40e_asq_cmd_details *cmd_details)
2672 {
2673 struct i40e_aq_desc desc;
2674 struct i40e_aqc_set_switch_config *scfg =
2675 (struct i40e_aqc_set_switch_config *)&desc.params.raw;
2676 enum i40e_status_code status;
2677
2678 i40e_fill_default_direct_cmd_desc(&desc,
2679 i40e_aqc_opc_set_switch_config);
2680 scfg->flags = CPU_TO_LE16(flags);
2681 scfg->valid_flags = CPU_TO_LE16(valid_flags);
2682
2683 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2684
2685 return status;
2686 }
2687
2688 /**
2689 * i40e_aq_get_firmware_version
2690 * @hw: pointer to the hw struct
2691 * @fw_major_version: firmware major version
2692 * @fw_minor_version: firmware minor version
2693 * @fw_build: firmware build number
2694 * @api_major_version: major queue version
2695 * @api_minor_version: minor queue version
2696 * @cmd_details: pointer to command details structure or NULL
2697 *
2698 * Get the firmware version from the admin queue commands
2699 **/
2700 enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
2701 u16 *fw_major_version, u16 *fw_minor_version,
2702 u32 *fw_build,
2703 u16 *api_major_version, u16 *api_minor_version,
2704 struct i40e_asq_cmd_details *cmd_details)
2705 {
2706 struct i40e_aq_desc desc;
2707 struct i40e_aqc_get_version *resp =
2708 (struct i40e_aqc_get_version *)&desc.params.raw;
2709 enum i40e_status_code status;
2710
2711 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
2712
2713 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2714
2715 if (status == I40E_SUCCESS) {
2716 if (fw_major_version != NULL)
2717 *fw_major_version = LE16_TO_CPU(resp->fw_major);
2718 if (fw_minor_version != NULL)
2719 *fw_minor_version = LE16_TO_CPU(resp->fw_minor);
2720 if (fw_build != NULL)
2721 *fw_build = LE32_TO_CPU(resp->fw_build);
2722 if (api_major_version != NULL)
2723 *api_major_version = LE16_TO_CPU(resp->api_major);
2724 if (api_minor_version != NULL)
2725 *api_minor_version = LE16_TO_CPU(resp->api_minor);
2726
2727 /* A workaround to fix the API version in SW */
2728 if (api_major_version && api_minor_version &&
2729 fw_major_version && fw_minor_version &&
2730 ((*api_major_version == 1) && (*api_minor_version == 1)) &&
2731 (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
2732 (*fw_major_version > 4)))
2733 *api_minor_version = 2;
2734 }
2735
2736 return status;
2737 }
2738
2739 /**
2740 * i40e_aq_send_driver_version
2741 * @hw: pointer to the hw struct
2742 * @dv: driver's major, minor version
2743 * @cmd_details: pointer to command details structure or NULL
2744 *
2745 * Send the driver version to the firmware
2746 **/
2747 enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
2748 struct i40e_driver_version *dv,
2749 struct i40e_asq_cmd_details *cmd_details)
2750 {
2751 struct i40e_aq_desc desc;
2752 struct i40e_aqc_driver_version *cmd =
2753 (struct i40e_aqc_driver_version *)&desc.params.raw;
2754 enum i40e_status_code status;
2755 u16 len;
2756
2757 if (dv == NULL)
2758 return I40E_ERR_PARAM;
2759
2760 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
2761
2762 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
2763 cmd->driver_major_ver = dv->major_version;
2764 cmd->driver_minor_ver = dv->minor_version;
2765 cmd->driver_build_ver = dv->build_version;
2766 cmd->driver_subbuild_ver = dv->subbuild_version;
2767
2768 len = 0;
2769 while (len < sizeof(dv->driver_string) &&
2770 (dv->driver_string[len] < 0x80) &&
2771 dv->driver_string[len])
2772 len++;
2773 status = i40e_asq_send_command(hw, &desc, dv->driver_string,
2774 len, cmd_details);
2775
2776 return status;
2777 }
2778
2779 /**
2780 * i40e_get_link_status - get status of the HW network link
2781 * @hw: pointer to the hw struct
2782 * @link_up: pointer to bool (true/false = linkup/linkdown)
2783 *
2784 * Variable link_up true if link is up, false if link is down.
2785 * The variable link_up is invalid if returned value of status != I40E_SUCCESS
2786 *
2787 * Side effect: LinkStatusEvent reporting becomes enabled
2788 **/
2789 enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
2790 {
2791 enum i40e_status_code status = I40E_SUCCESS;
2792
2793 if (hw->phy.get_link_info) {
2794 status = i40e_update_link_info(hw);
2795
2796 if (status != I40E_SUCCESS)
2797 i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
2798 status);
2799 }
2800
2801 *link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
2802
2803 return status;
2804 }
2805
2806 /**
2807 * i40e_updatelink_status - update status of the HW network link
2808 * @hw: pointer to the hw struct
2809 **/
2810 enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
2811 {
2812 struct i40e_aq_get_phy_abilities_resp abilities;
2813 enum i40e_status_code status = I40E_SUCCESS;
2814
2815 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2816 if (status)
2817 return status;
2818
2819 /* extra checking needed to ensure link info to user is timely */
2820 if ((hw->phy.link_info.link_info & I40E_AQ_MEDIA_AVAILABLE) &&
2821 ((hw->phy.link_info.link_info & I40E_AQ_LINK_UP) ||
2822 !(hw->phy.link_info_old.link_info & I40E_AQ_LINK_UP))) {
2823 status = i40e_aq_get_phy_capabilities(hw, false, false,
2824 &abilities, NULL);
2825 if (status)
2826 return status;
2827
2828 i40e_memcpy(hw->phy.link_info.module_type, &abilities.module_type,
2829 sizeof(hw->phy.link_info.module_type), I40E_NONDMA_TO_NONDMA);
2830 }
2831 return status;
2832 }
2833
2834
2835 /**
2836 * i40e_get_link_speed
2837 * @hw: pointer to the hw struct
2838 *
2839 * Returns the link speed of the adapter.
2840 **/
2841 enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
2842 {
2843 enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
2844 enum i40e_status_code status = I40E_SUCCESS;
2845
2846 if (hw->phy.get_link_info) {
2847 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2848
2849 if (status != I40E_SUCCESS)
2850 goto i40e_link_speed_exit;
2851 }
2852
2853 speed = hw->phy.link_info.link_speed;
2854
2855 i40e_link_speed_exit:
2856 return speed;
2857 }
2858
2859 /**
2860 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2861 * @hw: pointer to the hw struct
2862 * @uplink_seid: the MAC or other gizmo SEID
2863 * @downlink_seid: the VSI SEID
2864 * @enabled_tc: bitmap of TCs to be enabled
2865 * @default_port: true for default port VSI, false for control port
2866 * @veb_seid: pointer to where to put the resulting VEB SEID
2867 * @enable_stats: true to turn on VEB stats
2868 * @cmd_details: pointer to command details structure or NULL
2869 *
2870 * This asks the FW to add a VEB between the uplink and downlink
2871 * elements. If the uplink SEID is 0, this will be a floating VEB.
2872 **/
2873 enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
2874 u16 downlink_seid, u8 enabled_tc,
2875 bool default_port, u16 *veb_seid,
2876 bool enable_stats,
2877 struct i40e_asq_cmd_details *cmd_details)
2878 {
2879 struct i40e_aq_desc desc;
2880 struct i40e_aqc_add_veb *cmd =
2881 (struct i40e_aqc_add_veb *)&desc.params.raw;
2882 struct i40e_aqc_add_veb_completion *resp =
2883 (struct i40e_aqc_add_veb_completion *)&desc.params.raw;
2884 enum i40e_status_code status;
2885 u16 veb_flags = 0;
2886
2887 /* SEIDs need to either both be set or both be 0 for floating VEB */
2888 if (!!uplink_seid != !!downlink_seid)
2889 return I40E_ERR_PARAM;
2890
2891 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
2892
2893 cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
2894 cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
2895 cmd->enable_tcs = enabled_tc;
2896 if (!uplink_seid)
2897 veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
2898 if (default_port)
2899 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
2900 else
2901 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
2902
2903 /* reverse logic here: set the bitflag to disable the stats */
2904 if (!enable_stats)
2905 veb_flags |= I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS;
2906
2907 cmd->veb_flags = CPU_TO_LE16(veb_flags);
2908
2909 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2910
2911 if (!status && veb_seid)
2912 *veb_seid = LE16_TO_CPU(resp->veb_seid);
2913
2914 return status;
2915 }
2916
2917 /**
2918 * i40e_aq_get_veb_parameters - Retrieve VEB parameters
2919 * @hw: pointer to the hw struct
2920 * @veb_seid: the SEID of the VEB to query
2921 * @switch_id: the uplink switch id
2922 * @floating: set to true if the VEB is floating
2923 * @statistic_index: index of the stats counter block for this VEB
2924 * @vebs_used: number of VEB's used by function
2925 * @vebs_free: total VEB's not reserved by any function
2926 * @cmd_details: pointer to command details structure or NULL
2927 *
2928 * This retrieves the parameters for a particular VEB, specified by
2929 * uplink_seid, and returns them to the caller.
2930 **/
2931 enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
2932 u16 veb_seid, u16 *switch_id,
2933 bool *floating, u16 *statistic_index,
2934 u16 *vebs_used, u16 *vebs_free,
2935 struct i40e_asq_cmd_details *cmd_details)
2936 {
2937 struct i40e_aq_desc desc;
2938 struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
2939 (struct i40e_aqc_get_veb_parameters_completion *)
2940 &desc.params.raw;
2941 enum i40e_status_code status;
2942
2943 if (veb_seid == 0)
2944 return I40E_ERR_PARAM;
2945
2946 i40e_fill_default_direct_cmd_desc(&desc,
2947 i40e_aqc_opc_get_veb_parameters);
2948 cmd_resp->seid = CPU_TO_LE16(veb_seid);
2949
2950 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2951 if (status)
2952 goto get_veb_exit;
2953
2954 if (switch_id)
2955 *switch_id = LE16_TO_CPU(cmd_resp->switch_id);
2956 if (statistic_index)
2957 *statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
2958 if (vebs_used)
2959 *vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
2960 if (vebs_free)
2961 *vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
2962 if (floating) {
2963 u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
2964
2965 if (flags & I40E_AQC_ADD_VEB_FLOATING)
2966 *floating = true;
2967 else
2968 *floating = false;
2969 }
2970
2971 get_veb_exit:
2972 return status;
2973 }
2974
2975 /**
2976 * i40e_aq_add_macvlan
2977 * @hw: pointer to the hw struct
2978 * @seid: VSI for the mac address
2979 * @mv_list: list of macvlans to be added
2980 * @count: length of the list
2981 * @cmd_details: pointer to command details structure or NULL
2982 *
2983 * Add MAC/VLAN addresses to the HW filtering
2984 **/
2985 enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
2986 struct i40e_aqc_add_macvlan_element_data *mv_list,
2987 u16 count, struct i40e_asq_cmd_details *cmd_details)
2988 {
2989 struct i40e_aq_desc desc;
2990 struct i40e_aqc_macvlan *cmd =
2991 (struct i40e_aqc_macvlan *)&desc.params.raw;
2992 enum i40e_status_code status;
2993 u16 buf_size;
2994 int i;
2995
2996 if (count == 0 || !mv_list || !hw)
2997 return I40E_ERR_PARAM;
2998
2999 buf_size = count * sizeof(*mv_list);
3000
3001 /* prep the rest of the request */
3002 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
3003 cmd->num_addresses = CPU_TO_LE16(count);
3004 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
3005 cmd->seid[1] = 0;
3006 cmd->seid[2] = 0;
3007
3008 for (i = 0; i < count; i++)
3009 if (I40E_IS_MULTICAST(mv_list[i].mac_addr))
3010 mv_list[i].flags |=
3011 CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);
3012
3013 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3014 if (buf_size > I40E_AQ_LARGE_BUF)
3015 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3016
3017 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
3018 cmd_details);
3019
3020 return status;
3021 }
3022
3023 /**
3024 * i40e_aq_remove_macvlan
3025 * @hw: pointer to the hw struct
3026 * @seid: VSI for the mac address
3027 * @mv_list: list of macvlans to be removed
3028 * @count: length of the list
3029 * @cmd_details: pointer to command details structure or NULL
3030 *
3031 * Remove MAC/VLAN addresses from the HW filtering
3032 **/
3033 enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
3034 struct i40e_aqc_remove_macvlan_element_data *mv_list,
3035 u16 count, struct i40e_asq_cmd_details *cmd_details)
3036 {
3037 struct i40e_aq_desc desc;
3038 struct i40e_aqc_macvlan *cmd =
3039 (struct i40e_aqc_macvlan *)&desc.params.raw;
3040 enum i40e_status_code status;
3041 u16 buf_size;
3042
3043 if (count == 0 || !mv_list || !hw)
3044 return I40E_ERR_PARAM;
3045
3046 buf_size = count * sizeof(*mv_list);
3047
3048 /* prep the rest of the request */
3049 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
3050 cmd->num_addresses = CPU_TO_LE16(count);
3051 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
3052 cmd->seid[1] = 0;
3053 cmd->seid[2] = 0;
3054
3055 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3056 if (buf_size > I40E_AQ_LARGE_BUF)
3057 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3058
3059 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
3060 cmd_details);
3061
3062 return status;
3063 }
3064
3065 /**
3066 * i40e_mirrorrule_op - Internal helper function to add/delete mirror rule
3067 * @hw: pointer to the hw struct
3068 * @opcode: AQ opcode for add or delete mirror rule
3069 * @sw_seid: Switch SEID (to which rule refers)
3070 * @rule_type: Rule Type (ingress/egress/VLAN)
3071 * @id: Destination VSI SEID or Rule ID
3072 * @count: length of the list
3073 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3074 * @cmd_details: pointer to command details structure or NULL
3075 * @rule_id: Rule ID returned from FW
3076 * @rule_used: Number of rules used in internal switch
3077 * @rule_free: Number of rules free in internal switch
3078 *
3079 * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
3080 * VEBs/VEPA elements only
3081 **/
3082 static enum i40e_status_code i40e_mirrorrule_op(struct i40e_hw *hw,
3083 u16 opcode, u16 sw_seid, u16 rule_type, u16 id,
3084 u16 count, __le16 *mr_list,
3085 struct i40e_asq_cmd_details *cmd_details,
3086 u16 *rule_id, u16 *rules_used, u16 *rules_free)
3087 {
3088 struct i40e_aq_desc desc;
3089 struct i40e_aqc_add_delete_mirror_rule *cmd =
3090 (struct i40e_aqc_add_delete_mirror_rule *)&desc.params.raw;
3091 struct i40e_aqc_add_delete_mirror_rule_completion *resp =
3092 (struct i40e_aqc_add_delete_mirror_rule_completion *)&desc.params.raw;
3093 enum i40e_status_code status;
3094 u16 buf_size;
3095
3096 buf_size = count * sizeof(*mr_list);
3097
3098 /* prep the rest of the request */
3099 i40e_fill_default_direct_cmd_desc(&desc, opcode);
3100 cmd->seid = CPU_TO_LE16(sw_seid);
3101 cmd->rule_type = CPU_TO_LE16(rule_type &
3102 I40E_AQC_MIRROR_RULE_TYPE_MASK);
3103 cmd->num_entries = CPU_TO_LE16(count);
3104 /* Dest VSI for add, rule_id for delete */
3105 cmd->destination = CPU_TO_LE16(id);
3106 if (mr_list) {
3107 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3108 I40E_AQ_FLAG_RD));
3109 if (buf_size > I40E_AQ_LARGE_BUF)
3110 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3111 }
3112
3113 status = i40e_asq_send_command(hw, &desc, mr_list, buf_size,
3114 cmd_details);
3115 if (status == I40E_SUCCESS ||
3116 hw->aq.asq_last_status == I40E_AQ_RC_ENOSPC) {
3117 if (rule_id)
3118 *rule_id = LE16_TO_CPU(resp->rule_id);
3119 if (rules_used)
3120 *rules_used = LE16_TO_CPU(resp->mirror_rules_used);
3121 if (rules_free)
3122 *rules_free = LE16_TO_CPU(resp->mirror_rules_free);
3123 }
3124 return status;
3125 }
3126
3127 /**
3128 * i40e_aq_add_mirrorrule - add a mirror rule
3129 * @hw: pointer to the hw struct
3130 * @sw_seid: Switch SEID (to which rule refers)
3131 * @rule_type: Rule Type (ingress/egress/VLAN)
3132 * @dest_vsi: SEID of VSI to which packets will be mirrored
3133 * @count: length of the list
3134 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3135 * @cmd_details: pointer to command details structure or NULL
3136 * @rule_id: Rule ID returned from FW
3137 * @rule_used: Number of rules used in internal switch
3138 * @rule_free: Number of rules free in internal switch
3139 *
3140 * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
3141 **/
3142 enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3143 u16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,
3144 struct i40e_asq_cmd_details *cmd_details,
3145 u16 *rule_id, u16 *rules_used, u16 *rules_free)
3146 {
3147 if (!(rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS ||
3148 rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS)) {
3149 if (count == 0 || !mr_list)
3150 return I40E_ERR_PARAM;
3151 }
3152
3153 return i40e_mirrorrule_op(hw, i40e_aqc_opc_add_mirror_rule, sw_seid,
3154 rule_type, dest_vsi, count, mr_list,
3155 cmd_details, rule_id, rules_used, rules_free);
3156 }
3157
3158 /**
3159 * i40e_aq_delete_mirrorrule - delete a mirror rule
3160 * @hw: pointer to the hw struct
3161 * @sw_seid: Switch SEID (to which rule refers)
3162 * @rule_type: Rule Type (ingress/egress/VLAN)
3163 * @count: length of the list
3164 * @rule_id: Rule ID that is returned in the receive desc as part of
3165 * add_mirrorrule.
3166 * @mr_list: list of mirrored VLAN IDs to be removed
3167 * @cmd_details: pointer to command details structure or NULL
3168 * @rule_used: Number of rules used in internal switch
3169 * @rule_free: Number of rules free in internal switch
3170 *
3171 * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
3172 **/
3173 enum i40e_status_code i40e_aq_delete_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3174 u16 rule_type, u16 rule_id, u16 count, __le16 *mr_list,
3175 struct i40e_asq_cmd_details *cmd_details,
3176 u16 *rules_used, u16 *rules_free)
3177 {
3178 /* Rule ID has to be valid except rule_type: INGRESS VLAN mirroring */
3179 if (rule_type == I40E_AQC_MIRROR_RULE_TYPE_VLAN) {
3180 /* count and mr_list shall be valid for rule_type INGRESS VLAN
3181 * mirroring. For other rule_type, count and rule_type should
3182 * not matter.
3183 */
3184 if (count == 0 || !mr_list)
3185 return I40E_ERR_PARAM;
3186 }
3187
3188 return i40e_mirrorrule_op(hw, i40e_aqc_opc_delete_mirror_rule, sw_seid,
3189 rule_type, rule_id, count, mr_list,
3190 cmd_details, NULL, rules_used, rules_free);
3191 }
3192
3193 /**
3194 * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
3195 * @hw: pointer to the hw struct
3196 * @seid: VSI for the vlan filters
3197 * @v_list: list of vlan filters to be added
3198 * @count: length of the list
3199 * @cmd_details: pointer to command details structure or NULL
3200 **/
3201 enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
3202 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3203 u8 count, struct i40e_asq_cmd_details *cmd_details)
3204 {
3205 struct i40e_aq_desc desc;
3206 struct i40e_aqc_macvlan *cmd =
3207 (struct i40e_aqc_macvlan *)&desc.params.raw;
3208 enum i40e_status_code status;
3209 u16 buf_size;
3210
3211 if (count == 0 || !v_list || !hw)
3212 return I40E_ERR_PARAM;
3213
3214 buf_size = count * sizeof(*v_list);
3215
3216 /* prep the rest of the request */
3217 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
3218 cmd->num_addresses = CPU_TO_LE16(count);
3219 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3220 cmd->seid[1] = 0;
3221 cmd->seid[2] = 0;
3222
3223 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3224 if (buf_size > I40E_AQ_LARGE_BUF)
3225 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3226
3227 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3228 cmd_details);
3229
3230 return status;
3231 }
3232
3233 /**
3234 * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
3235 * @hw: pointer to the hw struct
3236 * @seid: VSI for the vlan filters
3237 * @v_list: list of macvlans to be removed
3238 * @count: length of the list
3239 * @cmd_details: pointer to command details structure or NULL
3240 **/
3241 enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
3242 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3243 u8 count, struct i40e_asq_cmd_details *cmd_details)
3244 {
3245 struct i40e_aq_desc desc;
3246 struct i40e_aqc_macvlan *cmd =
3247 (struct i40e_aqc_macvlan *)&desc.params.raw;
3248 enum i40e_status_code status;
3249 u16 buf_size;
3250
3251 if (count == 0 || !v_list || !hw)
3252 return I40E_ERR_PARAM;
3253
3254 buf_size = count * sizeof(*v_list);
3255
3256 /* prep the rest of the request */
3257 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
3258 cmd->num_addresses = CPU_TO_LE16(count);
3259 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3260 cmd->seid[1] = 0;
3261 cmd->seid[2] = 0;
3262
3263 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3264 if (buf_size > I40E_AQ_LARGE_BUF)
3265 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3266
3267 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3268 cmd_details);
3269
3270 return status;
3271 }
3272
3273 /**
3274 * i40e_aq_send_msg_to_vf
3275 * @hw: pointer to the hardware structure
3276 * @vfid: vf id to send msg
3277 * @v_opcode: opcodes for VF-PF communication
3278 * @v_retval: return error code
3279 * @msg: pointer to the msg buffer
3280 * @msglen: msg length
3281 * @cmd_details: pointer to command details
3282 *
3283 * send msg to vf
3284 **/
3285 enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
3286 u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
3287 struct i40e_asq_cmd_details *cmd_details)
3288 {
3289 struct i40e_aq_desc desc;
3290 struct i40e_aqc_pf_vf_message *cmd =
3291 (struct i40e_aqc_pf_vf_message *)&desc.params.raw;
3292 enum i40e_status_code status;
3293
3294 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
3295 cmd->id = CPU_TO_LE32(vfid);
3296 desc.cookie_high = CPU_TO_LE32(v_opcode);
3297 desc.cookie_low = CPU_TO_LE32(v_retval);
3298 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
3299 if (msglen) {
3300 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3301 I40E_AQ_FLAG_RD));
3302 if (msglen > I40E_AQ_LARGE_BUF)
3303 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3304 desc.datalen = CPU_TO_LE16(msglen);
3305 }
3306 status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
3307
3308 return status;
3309 }
3310
3311 /**
3312 * i40e_aq_debug_read_register
3313 * @hw: pointer to the hw struct
3314 * @reg_addr: register address
3315 * @reg_val: register value
3316 * @cmd_details: pointer to command details structure or NULL
3317 *
3318 * Read the register using the admin queue commands
3319 **/
3320 enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
3321 u32 reg_addr, u64 *reg_val,
3322 struct i40e_asq_cmd_details *cmd_details)
3323 {
3324 struct i40e_aq_desc desc;
3325 struct i40e_aqc_debug_reg_read_write *cmd_resp =
3326 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3327 enum i40e_status_code status;
3328
3329 if (reg_val == NULL)
3330 return I40E_ERR_PARAM;
3331
3332 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_read_reg);
3333
3334 cmd_resp->address = CPU_TO_LE32(reg_addr);
3335
3336 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3337
3338 if (status == I40E_SUCCESS) {
3339 *reg_val = ((u64)LE32_TO_CPU(cmd_resp->value_high) << 32) |
3340 (u64)LE32_TO_CPU(cmd_resp->value_low);
3341 }
3342
3343 return status;
3344 }
3345
3346 /**
3347 * i40e_aq_debug_write_register
3348 * @hw: pointer to the hw struct
3349 * @reg_addr: register address
3350 * @reg_val: register value
3351 * @cmd_details: pointer to command details structure or NULL
3352 *
3353 * Write to a register using the admin queue commands
3354 **/
3355 enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
3356 u32 reg_addr, u64 reg_val,
3357 struct i40e_asq_cmd_details *cmd_details)
3358 {
3359 struct i40e_aq_desc desc;
3360 struct i40e_aqc_debug_reg_read_write *cmd =
3361 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3362 enum i40e_status_code status;
3363
3364 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
3365
3366 cmd->address = CPU_TO_LE32(reg_addr);
3367 cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
3368 cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
3369
3370 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3371
3372 return status;
3373 }
3374
3375 /**
3376 * i40e_aq_request_resource
3377 * @hw: pointer to the hw struct
3378 * @resource: resource id
3379 * @access: access type
3380 * @sdp_number: resource number
3381 * @timeout: the maximum time in ms that the driver may hold the resource
3382 * @cmd_details: pointer to command details structure or NULL
3383 *
3384 * requests common resource using the admin queue commands
3385 **/
3386 enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
3387 enum i40e_aq_resources_ids resource,
3388 enum i40e_aq_resource_access_type access,
3389 u8 sdp_number, u64 *timeout,
3390 struct i40e_asq_cmd_details *cmd_details)
3391 {
3392 struct i40e_aq_desc desc;
3393 struct i40e_aqc_request_resource *cmd_resp =
3394 (struct i40e_aqc_request_resource *)&desc.params.raw;
3395 enum i40e_status_code status;
3396
3397 DEBUGFUNC("i40e_aq_request_resource");
3398
3399 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
3400
3401 cmd_resp->resource_id = CPU_TO_LE16(resource);
3402 cmd_resp->access_type = CPU_TO_LE16(access);
3403 cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
3404
3405 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3406 /* The completion specifies the maximum time in ms that the driver
3407 * may hold the resource in the Timeout field.
3408 * If the resource is held by someone else, the command completes with
3409 * busy return value and the timeout field indicates the maximum time
3410 * the current owner of the resource has to free it.
3411 */
3412 if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
3413 *timeout = LE32_TO_CPU(cmd_resp->timeout);
3414
3415 return status;
3416 }
3417
3418 /**
3419 * i40e_aq_release_resource
3420 * @hw: pointer to the hw struct
3421 * @resource: resource id
3422 * @sdp_number: resource number
3423 * @cmd_details: pointer to command details structure or NULL
3424 *
3425 * release common resource using the admin queue commands
3426 **/
3427 enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
3428 enum i40e_aq_resources_ids resource,
3429 u8 sdp_number,
3430 struct i40e_asq_cmd_details *cmd_details)
3431 {
3432 struct i40e_aq_desc desc;
3433 struct i40e_aqc_request_resource *cmd =
3434 (struct i40e_aqc_request_resource *)&desc.params.raw;
3435 enum i40e_status_code status;
3436
3437 DEBUGFUNC("i40e_aq_release_resource");
3438
3439 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
3440
3441 cmd->resource_id = CPU_TO_LE16(resource);
3442 cmd->resource_number = CPU_TO_LE32(sdp_number);
3443
3444 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3445
3446 return status;
3447 }
3448
3449 /**
3450 * i40e_aq_read_nvm
3451 * @hw: pointer to the hw struct
3452 * @module_pointer: module pointer location in words from the NVM beginning
3453 * @offset: byte offset from the module beginning
3454 * @length: length of the section to be read (in bytes from the offset)
3455 * @data: command buffer (size [bytes] = length)
3456 * @last_command: tells if this is the last command in a series
3457 * @cmd_details: pointer to command details structure or NULL
3458 *
3459 * Read the NVM using the admin queue commands
3460 **/
3461 enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
3462 u32 offset, u16 length, void *data,
3463 bool last_command,
3464 struct i40e_asq_cmd_details *cmd_details)
3465 {
3466 struct i40e_aq_desc desc;
3467 struct i40e_aqc_nvm_update *cmd =
3468 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3469 enum i40e_status_code status;
3470
3471 DEBUGFUNC("i40e_aq_read_nvm");
3472
3473 /* In offset the highest byte must be zeroed. */
3474 if (offset & 0xFF000000) {
3475 status = I40E_ERR_PARAM;
3476 goto i40e_aq_read_nvm_exit;
3477 }
3478
3479 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
3480
3481 /* If this is the last command in a series, set the proper flag. */
3482 if (last_command)
3483 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3484 cmd->module_pointer = module_pointer;
3485 cmd->offset = CPU_TO_LE32(offset);
3486 cmd->length = CPU_TO_LE16(length);
3487
3488 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3489 if (length > I40E_AQ_LARGE_BUF)
3490 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3491
3492 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3493
3494 i40e_aq_read_nvm_exit:
3495 return status;
3496 }
3497
3498 /**
3499 * i40e_aq_read_nvm_config - read an nvm config block
3500 * @hw: pointer to the hw struct
3501 * @cmd_flags: NVM access admin command bits
3502 * @field_id: field or feature id
3503 * @data: buffer for result
3504 * @buf_size: buffer size
3505 * @element_count: pointer to count of elements read by FW
3506 * @cmd_details: pointer to command details structure or NULL
3507 **/
3508 enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
3509 u8 cmd_flags, u32 field_id, void *data,
3510 u16 buf_size, u16 *element_count,
3511 struct i40e_asq_cmd_details *cmd_details)
3512 {
3513 struct i40e_aq_desc desc;
3514 struct i40e_aqc_nvm_config_read *cmd =
3515 (struct i40e_aqc_nvm_config_read *)&desc.params.raw;
3516 enum i40e_status_code status;
3517
3518 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_read);
3519 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF));
3520 if (buf_size > I40E_AQ_LARGE_BUF)
3521 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3522
3523 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3524 cmd->element_id = CPU_TO_LE16((u16)(0xffff & field_id));
3525 if (cmd_flags & I40E_AQ_ANVM_FEATURE_OR_IMMEDIATE_MASK)
3526 cmd->element_id_msw = CPU_TO_LE16((u16)(field_id >> 16));
3527 else
3528 cmd->element_id_msw = 0;
3529
3530 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3531
3532 if (!status && element_count)
3533 *element_count = LE16_TO_CPU(cmd->element_count);
3534
3535 return status;
3536 }
3537
3538 /**
3539 * i40e_aq_write_nvm_config - write an nvm config block
3540 * @hw: pointer to the hw struct
3541 * @cmd_flags: NVM access admin command bits
3542 * @data: buffer for result
3543 * @buf_size: buffer size
3544 * @element_count: count of elements to be written
3545 * @cmd_details: pointer to command details structure or NULL
3546 **/
3547 enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
3548 u8 cmd_flags, void *data, u16 buf_size,
3549 u16 element_count,
3550 struct i40e_asq_cmd_details *cmd_details)
3551 {
3552 struct i40e_aq_desc desc;
3553 struct i40e_aqc_nvm_config_write *cmd =
3554 (struct i40e_aqc_nvm_config_write *)&desc.params.raw;
3555 enum i40e_status_code status;
3556
3557 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_write);
3558 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3559 if (buf_size > I40E_AQ_LARGE_BUF)
3560 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3561
3562 cmd->element_count = CPU_TO_LE16(element_count);
3563 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3564 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3565
3566 return status;
3567 }
3568
3569 /**
3570 * i40e_aq_oem_post_update - triggers an OEM specific flow after update
3571 * @hw: pointer to the hw struct
3572 * @cmd_details: pointer to command details structure or NULL
3573 **/
3574 enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
3575 void *buff, u16 buff_size,
3576 struct i40e_asq_cmd_details *cmd_details)
3577 {
3578 struct i40e_aq_desc desc;
3579 enum i40e_status_code status;
3580
3581 UNREFERENCED_2PARAMETER(buff, buff_size);
3582
3583 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_oem_post_update);
3584 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3585 if (status && LE16_TO_CPU(desc.retval) == I40E_AQ_RC_ESRCH)
3586 status = I40E_ERR_NOT_IMPLEMENTED;
3587
3588 return status;
3589 }
3590
3591 /**
3592 * i40e_aq_erase_nvm
3593 * @hw: pointer to the hw struct
3594 * @module_pointer: module pointer location in words from the NVM beginning
3595 * @offset: offset in the module (expressed in 4 KB from module's beginning)
3596 * @length: length of the section to be erased (expressed in 4 KB)
3597 * @last_command: tells if this is the last command in a series
3598 * @cmd_details: pointer to command details structure or NULL
3599 *
3600 * Erase the NVM sector using the admin queue commands
3601 **/
3602 enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
3603 u32 offset, u16 length, bool last_command,
3604 struct i40e_asq_cmd_details *cmd_details)
3605 {
3606 struct i40e_aq_desc desc;
3607 struct i40e_aqc_nvm_update *cmd =
3608 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3609 enum i40e_status_code status;
3610
3611 DEBUGFUNC("i40e_aq_erase_nvm");
3612
3613 /* In offset the highest byte must be zeroed. */
3614 if (offset & 0xFF000000) {
3615 status = I40E_ERR_PARAM;
3616 goto i40e_aq_erase_nvm_exit;
3617 }
3618
3619 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
3620
3621 /* If this is the last command in a series, set the proper flag. */
3622 if (last_command)
3623 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3624 cmd->module_pointer = module_pointer;
3625 cmd->offset = CPU_TO_LE32(offset);
3626 cmd->length = CPU_TO_LE16(length);
3627
3628 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3629
3630 i40e_aq_erase_nvm_exit:
3631 return status;
3632 }
3633
3634 /**
3635 * i40e_parse_discover_capabilities
3636 * @hw: pointer to the hw struct
3637 * @buff: pointer to a buffer containing device/function capability records
3638 * @cap_count: number of capability records in the list
3639 * @list_type_opc: type of capabilities list to parse
3640 *
3641 * Parse the device/function capabilities list.
3642 **/
3643 STATIC void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
3644 u32 cap_count,
3645 enum i40e_admin_queue_opc list_type_opc)
3646 {
3647 struct i40e_aqc_list_capabilities_element_resp *cap;
3648 u32 valid_functions, num_functions;
3649 u32 number, logical_id, phys_id;
3650 struct i40e_hw_capabilities *p;
3651 u8 major_rev;
3652 u32 i = 0;
3653 u16 id;
3654
3655 cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
3656
3657 if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
3658 p = (struct i40e_hw_capabilities *)&hw->dev_caps;
3659 else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
3660 p = (struct i40e_hw_capabilities *)&hw->func_caps;
3661 else
3662 return;
3663
3664 for (i = 0; i < cap_count; i++, cap++) {
3665 id = LE16_TO_CPU(cap->id);
3666 number = LE32_TO_CPU(cap->number);
3667 logical_id = LE32_TO_CPU(cap->logical_id);
3668 phys_id = LE32_TO_CPU(cap->phys_id);
3669 major_rev = cap->major_rev;
3670
3671 switch (id) {
3672 case I40E_AQ_CAP_ID_SWITCH_MODE:
3673 p->switch_mode = number;
3674 i40e_debug(hw, I40E_DEBUG_INIT,
3675 "HW Capability: Switch mode = %d\n",
3676 p->switch_mode);
3677 break;
3678 case I40E_AQ_CAP_ID_MNG_MODE:
3679 p->management_mode = number;
3680 if (major_rev > 1) {
3681 p->mng_protocols_over_mctp = logical_id;
3682 i40e_debug(hw, I40E_DEBUG_INIT,
3683 "HW Capability: Protocols over MCTP = %d\n",
3684 p->mng_protocols_over_mctp);
3685 } else {
3686 p->mng_protocols_over_mctp = 0;
3687 }
3688 i40e_debug(hw, I40E_DEBUG_INIT,
3689 "HW Capability: Management Mode = %d\n",
3690 p->management_mode);
3691 break;
3692 case I40E_AQ_CAP_ID_NPAR_ACTIVE:
3693 p->npar_enable = number;
3694 i40e_debug(hw, I40E_DEBUG_INIT,
3695 "HW Capability: NPAR enable = %d\n",
3696 p->npar_enable);
3697 break;
3698 case I40E_AQ_CAP_ID_OS2BMC_CAP:
3699 p->os2bmc = number;
3700 i40e_debug(hw, I40E_DEBUG_INIT,
3701 "HW Capability: OS2BMC = %d\n", p->os2bmc);
3702 break;
3703 case I40E_AQ_CAP_ID_FUNCTIONS_VALID:
3704 p->valid_functions = number;
3705 i40e_debug(hw, I40E_DEBUG_INIT,
3706 "HW Capability: Valid Functions = %d\n",
3707 p->valid_functions);
3708 break;
3709 case I40E_AQ_CAP_ID_SRIOV:
3710 if (number == 1)
3711 p->sr_iov_1_1 = true;
3712 i40e_debug(hw, I40E_DEBUG_INIT,
3713 "HW Capability: SR-IOV = %d\n",
3714 p->sr_iov_1_1);
3715 break;
3716 case I40E_AQ_CAP_ID_VF:
3717 p->num_vfs = number;
3718 p->vf_base_id = logical_id;
3719 i40e_debug(hw, I40E_DEBUG_INIT,
3720 "HW Capability: VF count = %d\n",
3721 p->num_vfs);
3722 i40e_debug(hw, I40E_DEBUG_INIT,
3723 "HW Capability: VF base_id = %d\n",
3724 p->vf_base_id);
3725 break;
3726 case I40E_AQ_CAP_ID_VMDQ:
3727 if (number == 1)
3728 p->vmdq = true;
3729 i40e_debug(hw, I40E_DEBUG_INIT,
3730 "HW Capability: VMDQ = %d\n", p->vmdq);
3731 break;
3732 case I40E_AQ_CAP_ID_8021QBG:
3733 if (number == 1)
3734 p->evb_802_1_qbg = true;
3735 i40e_debug(hw, I40E_DEBUG_INIT,
3736 "HW Capability: 802.1Qbg = %d\n", number);
3737 break;
3738 case I40E_AQ_CAP_ID_8021QBR:
3739 if (number == 1)
3740 p->evb_802_1_qbh = true;
3741 i40e_debug(hw, I40E_DEBUG_INIT,
3742 "HW Capability: 802.1Qbh = %d\n", number);
3743 break;
3744 case I40E_AQ_CAP_ID_VSI:
3745 p->num_vsis = number;
3746 i40e_debug(hw, I40E_DEBUG_INIT,
3747 "HW Capability: VSI count = %d\n",
3748 p->num_vsis);
3749 break;
3750 case I40E_AQ_CAP_ID_DCB:
3751 if (number == 1) {
3752 p->dcb = true;
3753 p->enabled_tcmap = logical_id;
3754 p->maxtc = phys_id;
3755 }
3756 i40e_debug(hw, I40E_DEBUG_INIT,
3757 "HW Capability: DCB = %d\n", p->dcb);
3758 i40e_debug(hw, I40E_DEBUG_INIT,
3759 "HW Capability: TC Mapping = %d\n",
3760 logical_id);
3761 i40e_debug(hw, I40E_DEBUG_INIT,
3762 "HW Capability: TC Max = %d\n", p->maxtc);
3763 break;
3764 case I40E_AQ_CAP_ID_FCOE:
3765 if (number == 1)
3766 p->fcoe = true;
3767 i40e_debug(hw, I40E_DEBUG_INIT,
3768 "HW Capability: FCOE = %d\n", p->fcoe);
3769 break;
3770 case I40E_AQ_CAP_ID_ISCSI:
3771 if (number == 1)
3772 p->iscsi = true;
3773 i40e_debug(hw, I40E_DEBUG_INIT,
3774 "HW Capability: iSCSI = %d\n", p->iscsi);
3775 break;
3776 case I40E_AQ_CAP_ID_RSS:
3777 p->rss = true;
3778 p->rss_table_size = number;
3779 p->rss_table_entry_width = logical_id;
3780 i40e_debug(hw, I40E_DEBUG_INIT,
3781 "HW Capability: RSS = %d\n", p->rss);
3782 i40e_debug(hw, I40E_DEBUG_INIT,
3783 "HW Capability: RSS table size = %d\n",
3784 p->rss_table_size);
3785 i40e_debug(hw, I40E_DEBUG_INIT,
3786 "HW Capability: RSS table width = %d\n",
3787 p->rss_table_entry_width);
3788 break;
3789 case I40E_AQ_CAP_ID_RXQ:
3790 p->num_rx_qp = number;
3791 p->base_queue = phys_id;
3792 i40e_debug(hw, I40E_DEBUG_INIT,
3793 "HW Capability: Rx QP = %d\n", number);
3794 i40e_debug(hw, I40E_DEBUG_INIT,
3795 "HW Capability: base_queue = %d\n",
3796 p->base_queue);
3797 break;
3798 case I40E_AQ_CAP_ID_TXQ:
3799 p->num_tx_qp = number;
3800 p->base_queue = phys_id;
3801 i40e_debug(hw, I40E_DEBUG_INIT,
3802 "HW Capability: Tx QP = %d\n", number);
3803 i40e_debug(hw, I40E_DEBUG_INIT,
3804 "HW Capability: base_queue = %d\n",
3805 p->base_queue);
3806 break;
3807 case I40E_AQ_CAP_ID_MSIX:
3808 p->num_msix_vectors = number;
3809 i40e_debug(hw, I40E_DEBUG_INIT,
3810 "HW Capability: MSIX vector count = %d\n",
3811 p->num_msix_vectors);
3812 break;
3813 case I40E_AQ_CAP_ID_VF_MSIX:
3814 p->num_msix_vectors_vf = number;
3815 i40e_debug(hw, I40E_DEBUG_INIT,
3816 "HW Capability: MSIX VF vector count = %d\n",
3817 p->num_msix_vectors_vf);
3818 break;
3819 case I40E_AQ_CAP_ID_FLEX10:
3820 if (major_rev == 1) {
3821 if (number == 1) {
3822 p->flex10_enable = true;
3823 p->flex10_capable = true;
3824 }
3825 } else {
3826 /* Capability revision >= 2 */
3827 if (number & 1)
3828 p->flex10_enable = true;
3829 if (number & 2)
3830 p->flex10_capable = true;
3831 }
3832 p->flex10_mode = logical_id;
3833 p->flex10_status = phys_id;
3834 i40e_debug(hw, I40E_DEBUG_INIT,
3835 "HW Capability: Flex10 mode = %d\n",
3836 p->flex10_mode);
3837 i40e_debug(hw, I40E_DEBUG_INIT,
3838 "HW Capability: Flex10 status = %d\n",
3839 p->flex10_status);
3840 break;
3841 case I40E_AQ_CAP_ID_CEM:
3842 if (number == 1)
3843 p->mgmt_cem = true;
3844 i40e_debug(hw, I40E_DEBUG_INIT,
3845 "HW Capability: CEM = %d\n", p->mgmt_cem);
3846 break;
3847 case I40E_AQ_CAP_ID_IWARP:
3848 if (number == 1)
3849 p->iwarp = true;
3850 i40e_debug(hw, I40E_DEBUG_INIT,
3851 "HW Capability: iWARP = %d\n", p->iwarp);
3852 break;
3853 case I40E_AQ_CAP_ID_LED:
3854 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3855 p->led[phys_id] = true;
3856 i40e_debug(hw, I40E_DEBUG_INIT,
3857 "HW Capability: LED - PIN %d\n", phys_id);
3858 break;
3859 case I40E_AQ_CAP_ID_SDP:
3860 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3861 p->sdp[phys_id] = true;
3862 i40e_debug(hw, I40E_DEBUG_INIT,
3863 "HW Capability: SDP - PIN %d\n", phys_id);
3864 break;
3865 case I40E_AQ_CAP_ID_MDIO:
3866 if (number == 1) {
3867 p->mdio_port_num = phys_id;
3868 p->mdio_port_mode = logical_id;
3869 }
3870 i40e_debug(hw, I40E_DEBUG_INIT,
3871 "HW Capability: MDIO port number = %d\n",
3872 p->mdio_port_num);
3873 i40e_debug(hw, I40E_DEBUG_INIT,
3874 "HW Capability: MDIO port mode = %d\n",
3875 p->mdio_port_mode);
3876 break;
3877 case I40E_AQ_CAP_ID_1588:
3878 if (number == 1)
3879 p->ieee_1588 = true;
3880 i40e_debug(hw, I40E_DEBUG_INIT,
3881 "HW Capability: IEEE 1588 = %d\n",
3882 p->ieee_1588);
3883 break;
3884 case I40E_AQ_CAP_ID_FLOW_DIRECTOR:
3885 p->fd = true;
3886 p->fd_filters_guaranteed = number;
3887 p->fd_filters_best_effort = logical_id;
3888 i40e_debug(hw, I40E_DEBUG_INIT,
3889 "HW Capability: Flow Director = 1\n");
3890 i40e_debug(hw, I40E_DEBUG_INIT,
3891 "HW Capability: Guaranteed FD filters = %d\n",
3892 p->fd_filters_guaranteed);
3893 break;
3894 case I40E_AQ_CAP_ID_WSR_PROT:
3895 p->wr_csr_prot = (u64)number;
3896 p->wr_csr_prot |= (u64)logical_id << 32;
3897 i40e_debug(hw, I40E_DEBUG_INIT,
3898 "HW Capability: wr_csr_prot = 0x%llX\n\n",
3899 (p->wr_csr_prot & 0xffff));
3900 break;
3901 case I40E_AQ_CAP_ID_NVM_MGMT:
3902 if (number & I40E_NVM_MGMT_SEC_REV_DISABLED)
3903 p->sec_rev_disabled = true;
3904 if (number & I40E_NVM_MGMT_UPDATE_DISABLED)
3905 p->update_disabled = true;
3906 break;
3907 case I40E_AQ_CAP_ID_WOL_AND_PROXY:
3908 hw->num_wol_proxy_filters = (u16)number;
3909 hw->wol_proxy_vsi_seid = (u16)logical_id;
3910 p->apm_wol_support = phys_id & I40E_WOL_SUPPORT_MASK;
3911 if (phys_id & I40E_ACPI_PROGRAMMING_METHOD_MASK)
3912 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_AQC_FPK;
3913 else
3914 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_HW_FVL;
3915 p->proxy_support = (phys_id & I40E_PROXY_SUPPORT_MASK) ? 1 : 0;
3916 i40e_debug(hw, I40E_DEBUG_INIT,
3917 "HW Capability: WOL proxy filters = %d\n",
3918 hw->num_wol_proxy_filters);
3919 break;
3920 default:
3921 break;
3922 }
3923 }
3924
3925 if (p->fcoe)
3926 i40e_debug(hw, I40E_DEBUG_ALL, "device is FCoE capable\n");
3927
3928 /* Always disable FCoE if compiled without the I40E_FCOE_ENA flag */
3929 p->fcoe = false;
3930
3931 /* count the enabled ports (aka the "not disabled" ports) */
3932 hw->num_ports = 0;
3933 for (i = 0; i < 4; i++) {
3934 u32 port_cfg_reg = I40E_PRTGEN_CNF + (4 * i);
3935 u64 port_cfg = 0;
3936
3937 /* use AQ read to get the physical register offset instead
3938 * of the port relative offset
3939 */
3940 i40e_aq_debug_read_register(hw, port_cfg_reg, &port_cfg, NULL);
3941 if (!(port_cfg & I40E_PRTGEN_CNF_PORT_DIS_MASK))
3942 hw->num_ports++;
3943 }
3944
3945 valid_functions = p->valid_functions;
3946 num_functions = 0;
3947 while (valid_functions) {
3948 if (valid_functions & 1)
3949 num_functions++;
3950 valid_functions >>= 1;
3951 }
3952
3953 /* partition id is 1-based, and functions are evenly spread
3954 * across the ports as partitions
3955 */
3956 if (hw->num_ports != 0) {
3957 hw->partition_id = (hw->pf_id / hw->num_ports) + 1;
3958 hw->num_partitions = num_functions / hw->num_ports;
3959 }
3960
3961 /* additional HW specific goodies that might
3962 * someday be HW version specific
3963 */
3964 p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
3965 }
3966
3967 /**
3968 * i40e_aq_discover_capabilities
3969 * @hw: pointer to the hw struct
3970 * @buff: a virtual buffer to hold the capabilities
3971 * @buff_size: Size of the virtual buffer
3972 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
3973 * @list_type_opc: capabilities type to discover - pass in the command opcode
3974 * @cmd_details: pointer to command details structure or NULL
3975 *
3976 * Get the device capabilities descriptions from the firmware
3977 **/
3978 enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
3979 void *buff, u16 buff_size, u16 *data_size,
3980 enum i40e_admin_queue_opc list_type_opc,
3981 struct i40e_asq_cmd_details *cmd_details)
3982 {
3983 struct i40e_aqc_list_capabilites *cmd;
3984 struct i40e_aq_desc desc;
3985 enum i40e_status_code status = I40E_SUCCESS;
3986
3987 cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
3988
3989 if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
3990 list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
3991 status = I40E_ERR_PARAM;
3992 goto exit;
3993 }
3994
3995 i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
3996
3997 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3998 if (buff_size > I40E_AQ_LARGE_BUF)
3999 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4000
4001 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4002 *data_size = LE16_TO_CPU(desc.datalen);
4003
4004 if (status)
4005 goto exit;
4006
4007 i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
4008 list_type_opc);
4009
4010 exit:
4011 return status;
4012 }
4013
4014 /**
4015 * i40e_aq_update_nvm
4016 * @hw: pointer to the hw struct
4017 * @module_pointer: module pointer location in words from the NVM beginning
4018 * @offset: byte offset from the module beginning
4019 * @length: length of the section to be written (in bytes from the offset)
4020 * @data: command buffer (size [bytes] = length)
4021 * @last_command: tells if this is the last command in a series
4022 * @cmd_details: pointer to command details structure or NULL
4023 *
4024 * Update the NVM using the admin queue commands
4025 **/
4026 enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
4027 u32 offset, u16 length, void *data,
4028 bool last_command,
4029 struct i40e_asq_cmd_details *cmd_details)
4030 {
4031 struct i40e_aq_desc desc;
4032 struct i40e_aqc_nvm_update *cmd =
4033 (struct i40e_aqc_nvm_update *)&desc.params.raw;
4034 enum i40e_status_code status;
4035
4036 DEBUGFUNC("i40e_aq_update_nvm");
4037
4038 /* In offset the highest byte must be zeroed. */
4039 if (offset & 0xFF000000) {
4040 status = I40E_ERR_PARAM;
4041 goto i40e_aq_update_nvm_exit;
4042 }
4043
4044 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
4045
4046 /* If this is the last command in a series, set the proper flag. */
4047 if (last_command)
4048 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
4049 cmd->module_pointer = module_pointer;
4050 cmd->offset = CPU_TO_LE32(offset);
4051 cmd->length = CPU_TO_LE16(length);
4052
4053 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4054 if (length > I40E_AQ_LARGE_BUF)
4055 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4056
4057 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
4058
4059 i40e_aq_update_nvm_exit:
4060 return status;
4061 }
4062
4063 /**
4064 * i40e_aq_get_lldp_mib
4065 * @hw: pointer to the hw struct
4066 * @bridge_type: type of bridge requested
4067 * @mib_type: Local, Remote or both Local and Remote MIBs
4068 * @buff: pointer to a user supplied buffer to store the MIB block
4069 * @buff_size: size of the buffer (in bytes)
4070 * @local_len : length of the returned Local LLDP MIB
4071 * @remote_len: length of the returned Remote LLDP MIB
4072 * @cmd_details: pointer to command details structure or NULL
4073 *
4074 * Requests the complete LLDP MIB (entire packet).
4075 **/
4076 enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
4077 u8 mib_type, void *buff, u16 buff_size,
4078 u16 *local_len, u16 *remote_len,
4079 struct i40e_asq_cmd_details *cmd_details)
4080 {
4081 struct i40e_aq_desc desc;
4082 struct i40e_aqc_lldp_get_mib *cmd =
4083 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
4084 struct i40e_aqc_lldp_get_mib *resp =
4085 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
4086 enum i40e_status_code status;
4087
4088 if (buff_size == 0 || !buff)
4089 return I40E_ERR_PARAM;
4090
4091 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
4092 /* Indirect Command */
4093 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4094
4095 cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
4096 cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4097 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4098
4099 desc.datalen = CPU_TO_LE16(buff_size);
4100
4101 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4102 if (buff_size > I40E_AQ_LARGE_BUF)
4103 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4104
4105 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4106 if (!status) {
4107 if (local_len != NULL)
4108 *local_len = LE16_TO_CPU(resp->local_len);
4109 if (remote_len != NULL)
4110 *remote_len = LE16_TO_CPU(resp->remote_len);
4111 }
4112
4113 return status;
4114 }
4115
4116 /**
4117 * i40e_aq_set_lldp_mib - Set the LLDP MIB
4118 * @hw: pointer to the hw struct
4119 * @mib_type: Local, Remote or both Local and Remote MIBs
4120 * @buff: pointer to a user supplied buffer to store the MIB block
4121 * @buff_size: size of the buffer (in bytes)
4122 * @cmd_details: pointer to command details structure or NULL
4123 *
4124 * Set the LLDP MIB.
4125 **/
4126 enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
4127 u8 mib_type, void *buff, u16 buff_size,
4128 struct i40e_asq_cmd_details *cmd_details)
4129 {
4130 struct i40e_aq_desc desc;
4131 struct i40e_aqc_lldp_set_local_mib *cmd =
4132 (struct i40e_aqc_lldp_set_local_mib *)&desc.params.raw;
4133 enum i40e_status_code status;
4134
4135 if (buff_size == 0 || !buff)
4136 return I40E_ERR_PARAM;
4137
4138 i40e_fill_default_direct_cmd_desc(&desc,
4139 i40e_aqc_opc_lldp_set_local_mib);
4140 /* Indirect Command */
4141 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4142 if (buff_size > I40E_AQ_LARGE_BUF)
4143 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4144 desc.datalen = CPU_TO_LE16(buff_size);
4145
4146 cmd->type = mib_type;
4147 cmd->length = CPU_TO_LE16(buff_size);
4148 cmd->address_high = CPU_TO_LE32(I40E_HI_WORD((u64)buff));
4149 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buff));
4150
4151 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4152 return status;
4153 }
4154
4155 /**
4156 * i40e_aq_cfg_lldp_mib_change_event
4157 * @hw: pointer to the hw struct
4158 * @enable_update: Enable or Disable event posting
4159 * @cmd_details: pointer to command details structure or NULL
4160 *
4161 * Enable or Disable posting of an event on ARQ when LLDP MIB
4162 * associated with the interface changes
4163 **/
4164 enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
4165 bool enable_update,
4166 struct i40e_asq_cmd_details *cmd_details)
4167 {
4168 struct i40e_aq_desc desc;
4169 struct i40e_aqc_lldp_update_mib *cmd =
4170 (struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
4171 enum i40e_status_code status;
4172
4173 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
4174
4175 if (!enable_update)
4176 cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
4177
4178 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4179
4180 return status;
4181 }
4182
4183 /**
4184 * i40e_aq_add_lldp_tlv
4185 * @hw: pointer to the hw struct
4186 * @bridge_type: type of bridge
4187 * @buff: buffer with TLV to add
4188 * @buff_size: length of the buffer
4189 * @tlv_len: length of the TLV to be added
4190 * @mib_len: length of the LLDP MIB returned in response
4191 * @cmd_details: pointer to command details structure or NULL
4192 *
4193 * Add the specified TLV to LLDP Local MIB for the given bridge type,
4194 * it is responsibility of the caller to make sure that the TLV is not
4195 * already present in the LLDPDU.
4196 * In return firmware will write the complete LLDP MIB with the newly
4197 * added TLV in the response buffer.
4198 **/
4199 enum i40e_status_code i40e_aq_add_lldp_tlv(struct i40e_hw *hw, u8 bridge_type,
4200 void *buff, u16 buff_size, u16 tlv_len,
4201 u16 *mib_len,
4202 struct i40e_asq_cmd_details *cmd_details)
4203 {
4204 struct i40e_aq_desc desc;
4205 struct i40e_aqc_lldp_add_tlv *cmd =
4206 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4207 enum i40e_status_code status;
4208
4209 if (buff_size == 0 || !buff || tlv_len == 0)
4210 return I40E_ERR_PARAM;
4211
4212 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_add_tlv);
4213
4214 /* Indirect Command */
4215 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4216 if (buff_size > I40E_AQ_LARGE_BUF)
4217 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4218 desc.datalen = CPU_TO_LE16(buff_size);
4219
4220 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4221 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4222 cmd->len = CPU_TO_LE16(tlv_len);
4223
4224 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4225 if (!status) {
4226 if (mib_len != NULL)
4227 *mib_len = LE16_TO_CPU(desc.datalen);
4228 }
4229
4230 return status;
4231 }
4232
4233 /**
4234 * i40e_aq_update_lldp_tlv
4235 * @hw: pointer to the hw struct
4236 * @bridge_type: type of bridge
4237 * @buff: buffer with TLV to update
4238 * @buff_size: size of the buffer holding original and updated TLVs
4239 * @old_len: Length of the Original TLV
4240 * @new_len: Length of the Updated TLV
4241 * @offset: offset of the updated TLV in the buff
4242 * @mib_len: length of the returned LLDP MIB
4243 * @cmd_details: pointer to command details structure or NULL
4244 *
4245 * Update the specified TLV to the LLDP Local MIB for the given bridge type.
4246 * Firmware will place the complete LLDP MIB in response buffer with the
4247 * updated TLV.
4248 **/
4249 enum i40e_status_code i40e_aq_update_lldp_tlv(struct i40e_hw *hw,
4250 u8 bridge_type, void *buff, u16 buff_size,
4251 u16 old_len, u16 new_len, u16 offset,
4252 u16 *mib_len,
4253 struct i40e_asq_cmd_details *cmd_details)
4254 {
4255 struct i40e_aq_desc desc;
4256 struct i40e_aqc_lldp_update_tlv *cmd =
4257 (struct i40e_aqc_lldp_update_tlv *)&desc.params.raw;
4258 enum i40e_status_code status;
4259
4260 if (buff_size == 0 || !buff || offset == 0 ||
4261 old_len == 0 || new_len == 0)
4262 return I40E_ERR_PARAM;
4263
4264 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_tlv);
4265
4266 /* Indirect Command */
4267 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4268 if (buff_size > I40E_AQ_LARGE_BUF)
4269 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4270 desc.datalen = CPU_TO_LE16(buff_size);
4271
4272 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4273 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4274 cmd->old_len = CPU_TO_LE16(old_len);
4275 cmd->new_offset = CPU_TO_LE16(offset);
4276 cmd->new_len = CPU_TO_LE16(new_len);
4277
4278 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4279 if (!status) {
4280 if (mib_len != NULL)
4281 *mib_len = LE16_TO_CPU(desc.datalen);
4282 }
4283
4284 return status;
4285 }
4286
4287 /**
4288 * i40e_aq_delete_lldp_tlv
4289 * @hw: pointer to the hw struct
4290 * @bridge_type: type of bridge
4291 * @buff: pointer to a user supplied buffer that has the TLV
4292 * @buff_size: length of the buffer
4293 * @tlv_len: length of the TLV to be deleted
4294 * @mib_len: length of the returned LLDP MIB
4295 * @cmd_details: pointer to command details structure or NULL
4296 *
4297 * Delete the specified TLV from LLDP Local MIB for the given bridge type.
4298 * The firmware places the entire LLDP MIB in the response buffer.
4299 **/
4300 enum i40e_status_code i40e_aq_delete_lldp_tlv(struct i40e_hw *hw,
4301 u8 bridge_type, void *buff, u16 buff_size,
4302 u16 tlv_len, u16 *mib_len,
4303 struct i40e_asq_cmd_details *cmd_details)
4304 {
4305 struct i40e_aq_desc desc;
4306 struct i40e_aqc_lldp_add_tlv *cmd =
4307 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4308 enum i40e_status_code status;
4309
4310 if (buff_size == 0 || !buff)
4311 return I40E_ERR_PARAM;
4312
4313 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_delete_tlv);
4314
4315 /* Indirect Command */
4316 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4317 if (buff_size > I40E_AQ_LARGE_BUF)
4318 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4319 desc.datalen = CPU_TO_LE16(buff_size);
4320 cmd->len = CPU_TO_LE16(tlv_len);
4321 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4322 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4323
4324 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4325 if (!status) {
4326 if (mib_len != NULL)
4327 *mib_len = LE16_TO_CPU(desc.datalen);
4328 }
4329
4330 return status;
4331 }
4332
4333 /**
4334 * i40e_aq_stop_lldp
4335 * @hw: pointer to the hw struct
4336 * @shutdown_agent: True if LLDP Agent needs to be Shutdown
4337 * @cmd_details: pointer to command details structure or NULL
4338 *
4339 * Stop or Shutdown the embedded LLDP Agent
4340 **/
4341 enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
4342 struct i40e_asq_cmd_details *cmd_details)
4343 {
4344 struct i40e_aq_desc desc;
4345 struct i40e_aqc_lldp_stop *cmd =
4346 (struct i40e_aqc_lldp_stop *)&desc.params.raw;
4347 enum i40e_status_code status;
4348
4349 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
4350
4351 if (shutdown_agent)
4352 cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
4353
4354 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4355
4356 return status;
4357 }
4358
4359 /**
4360 * i40e_aq_start_lldp
4361 * @hw: pointer to the hw struct
4362 * @cmd_details: pointer to command details structure or NULL
4363 *
4364 * Start the embedded LLDP Agent on all ports.
4365 **/
4366 enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
4367 struct i40e_asq_cmd_details *cmd_details)
4368 {
4369 struct i40e_aq_desc desc;
4370 struct i40e_aqc_lldp_start *cmd =
4371 (struct i40e_aqc_lldp_start *)&desc.params.raw;
4372 enum i40e_status_code status;
4373
4374 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
4375
4376 cmd->command = I40E_AQ_LLDP_AGENT_START;
4377
4378 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4379
4380 return status;
4381 }
4382
4383 /**
4384 * i40e_aq_get_cee_dcb_config
4385 * @hw: pointer to the hw struct
4386 * @buff: response buffer that stores CEE operational configuration
4387 * @buff_size: size of the buffer passed
4388 * @cmd_details: pointer to command details structure or NULL
4389 *
4390 * Get CEE DCBX mode operational configuration from firmware
4391 **/
4392 enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
4393 void *buff, u16 buff_size,
4394 struct i40e_asq_cmd_details *cmd_details)
4395 {
4396 struct i40e_aq_desc desc;
4397 enum i40e_status_code status;
4398
4399 if (buff_size == 0 || !buff)
4400 return I40E_ERR_PARAM;
4401
4402 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_cee_dcb_cfg);
4403
4404 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4405 status = i40e_asq_send_command(hw, &desc, (void *)buff, buff_size,
4406 cmd_details);
4407
4408 return status;
4409 }
4410
4411 /**
4412 * i40e_aq_start_stop_dcbx - Start/Stop DCBx service in FW
4413 * @hw: pointer to the hw struct
4414 * @start_agent: True if DCBx Agent needs to be Started
4415 * False if DCBx Agent needs to be Stopped
4416 * @cmd_details: pointer to command details structure or NULL
4417 *
4418 * Start/Stop the embedded dcbx Agent
4419 **/
4420 enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
4421 bool start_agent,
4422 struct i40e_asq_cmd_details *cmd_details)
4423 {
4424 struct i40e_aq_desc desc;
4425 struct i40e_aqc_lldp_stop_start_specific_agent *cmd =
4426 (struct i40e_aqc_lldp_stop_start_specific_agent *)
4427 &desc.params.raw;
4428 enum i40e_status_code status;
4429
4430 i40e_fill_default_direct_cmd_desc(&desc,
4431 i40e_aqc_opc_lldp_stop_start_spec_agent);
4432
4433 if (start_agent)
4434 cmd->command = I40E_AQC_START_SPECIFIC_AGENT_MASK;
4435
4436 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4437
4438 return status;
4439 }
4440
4441 /**
4442 * i40e_aq_add_udp_tunnel
4443 * @hw: pointer to the hw struct
4444 * @udp_port: the UDP port to add in Host byte order
4445 * @header_len: length of the tunneling header length in DWords
4446 * @protocol_index: protocol index type
4447 * @filter_index: pointer to filter index
4448 * @cmd_details: pointer to command details structure or NULL
4449 *
4450 * Note: Firmware expects the udp_port value to be in Little Endian format,
4451 * and this function will call CPU_TO_LE16 to convert from Host byte order to
4452 * Little Endian order.
4453 **/
4454 enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
4455 u16 udp_port, u8 protocol_index,
4456 u8 *filter_index,
4457 struct i40e_asq_cmd_details *cmd_details)
4458 {
4459 struct i40e_aq_desc desc;
4460 struct i40e_aqc_add_udp_tunnel *cmd =
4461 (struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
4462 struct i40e_aqc_del_udp_tunnel_completion *resp =
4463 (struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
4464 enum i40e_status_code status;
4465
4466 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
4467
4468 cmd->udp_port = CPU_TO_LE16(udp_port);
4469 cmd->protocol_type = protocol_index;
4470
4471 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4472
4473 if (!status && filter_index)
4474 *filter_index = resp->index;
4475
4476 return status;
4477 }
4478
4479 /**
4480 * i40e_aq_del_udp_tunnel
4481 * @hw: pointer to the hw struct
4482 * @index: filter index
4483 * @cmd_details: pointer to command details structure or NULL
4484 **/
4485 enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
4486 struct i40e_asq_cmd_details *cmd_details)
4487 {
4488 struct i40e_aq_desc desc;
4489 struct i40e_aqc_remove_udp_tunnel *cmd =
4490 (struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
4491 enum i40e_status_code status;
4492
4493 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
4494
4495 cmd->index = index;
4496
4497 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4498
4499 return status;
4500 }
4501
4502 /**
4503 * i40e_aq_get_switch_resource_alloc (0x0204)
4504 * @hw: pointer to the hw struct
4505 * @num_entries: pointer to u8 to store the number of resource entries returned
4506 * @buf: pointer to a user supplied buffer. This buffer must be large enough
4507 * to store the resource information for all resource types. Each
4508 * resource type is a i40e_aqc_switch_resource_alloc_data structure.
4509 * @count: size, in bytes, of the buffer provided
4510 * @cmd_details: pointer to command details structure or NULL
4511 *
4512 * Query the resources allocated to a function.
4513 **/
4514 enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
4515 u8 *num_entries,
4516 struct i40e_aqc_switch_resource_alloc_element_resp *buf,
4517 u16 count,
4518 struct i40e_asq_cmd_details *cmd_details)
4519 {
4520 struct i40e_aq_desc desc;
4521 struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
4522 (struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
4523 enum i40e_status_code status;
4524 u16 length = count * sizeof(*buf);
4525
4526 i40e_fill_default_direct_cmd_desc(&desc,
4527 i40e_aqc_opc_get_switch_resource_alloc);
4528
4529 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4530 if (length > I40E_AQ_LARGE_BUF)
4531 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4532
4533 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4534
4535 if (!status && num_entries)
4536 *num_entries = cmd_resp->num_entries;
4537
4538 return status;
4539 }
4540
4541 /**
4542 * i40e_aq_delete_element - Delete switch element
4543 * @hw: pointer to the hw struct
4544 * @seid: the SEID to delete from the switch
4545 * @cmd_details: pointer to command details structure or NULL
4546 *
4547 * This deletes a switch element from the switch.
4548 **/
4549 enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
4550 struct i40e_asq_cmd_details *cmd_details)
4551 {
4552 struct i40e_aq_desc desc;
4553 struct i40e_aqc_switch_seid *cmd =
4554 (struct i40e_aqc_switch_seid *)&desc.params.raw;
4555 enum i40e_status_code status;
4556
4557 if (seid == 0)
4558 return I40E_ERR_PARAM;
4559
4560 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
4561
4562 cmd->seid = CPU_TO_LE16(seid);
4563
4564 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4565
4566 return status;
4567 }
4568
4569 /**
4570 * i40e_aq_add_pvirt - Instantiate a Port Virtualizer on a port
4571 * @hw: pointer to the hw struct
4572 * @flags: component flags
4573 * @mac_seid: uplink seid (MAC SEID)
4574 * @vsi_seid: connected vsi seid
4575 * @ret_seid: seid of create pv component
4576 *
4577 * This instantiates an i40e port virtualizer with specified flags.
4578 * Depending on specified flags the port virtualizer can act as a
4579 * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
4580 */
4581 enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
4582 u16 mac_seid, u16 vsi_seid,
4583 u16 *ret_seid)
4584 {
4585 struct i40e_aq_desc desc;
4586 struct i40e_aqc_add_update_pv *cmd =
4587 (struct i40e_aqc_add_update_pv *)&desc.params.raw;
4588 struct i40e_aqc_add_update_pv_completion *resp =
4589 (struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
4590 enum i40e_status_code status;
4591
4592 if (vsi_seid == 0)
4593 return I40E_ERR_PARAM;
4594
4595 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
4596 cmd->command_flags = CPU_TO_LE16(flags);
4597 cmd->uplink_seid = CPU_TO_LE16(mac_seid);
4598 cmd->connected_seid = CPU_TO_LE16(vsi_seid);
4599
4600 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4601 if (!status && ret_seid)
4602 *ret_seid = LE16_TO_CPU(resp->pv_seid);
4603
4604 return status;
4605 }
4606
4607 /**
4608 * i40e_aq_add_tag - Add an S/E-tag
4609 * @hw: pointer to the hw struct
4610 * @direct_to_queue: should s-tag direct flow to a specific queue
4611 * @vsi_seid: VSI SEID to use this tag
4612 * @tag: value of the tag
4613 * @queue_num: queue number, only valid is direct_to_queue is true
4614 * @tags_used: return value, number of tags in use by this PF
4615 * @tags_free: return value, number of unallocated tags
4616 * @cmd_details: pointer to command details structure or NULL
4617 *
4618 * This associates an S- or E-tag to a VSI in the switch complex. It returns
4619 * the number of tags allocated by the PF, and the number of unallocated
4620 * tags available.
4621 **/
4622 enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
4623 u16 vsi_seid, u16 tag, u16 queue_num,
4624 u16 *tags_used, u16 *tags_free,
4625 struct i40e_asq_cmd_details *cmd_details)
4626 {
4627 struct i40e_aq_desc desc;
4628 struct i40e_aqc_add_tag *cmd =
4629 (struct i40e_aqc_add_tag *)&desc.params.raw;
4630 struct i40e_aqc_add_remove_tag_completion *resp =
4631 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4632 enum i40e_status_code status;
4633
4634 if (vsi_seid == 0)
4635 return I40E_ERR_PARAM;
4636
4637 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
4638
4639 cmd->seid = CPU_TO_LE16(vsi_seid);
4640 cmd->tag = CPU_TO_LE16(tag);
4641 if (direct_to_queue) {
4642 cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
4643 cmd->queue_number = CPU_TO_LE16(queue_num);
4644 }
4645
4646 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4647
4648 if (!status) {
4649 if (tags_used != NULL)
4650 *tags_used = LE16_TO_CPU(resp->tags_used);
4651 if (tags_free != NULL)
4652 *tags_free = LE16_TO_CPU(resp->tags_free);
4653 }
4654
4655 return status;
4656 }
4657
4658 /**
4659 * i40e_aq_remove_tag - Remove an S- or E-tag
4660 * @hw: pointer to the hw struct
4661 * @vsi_seid: VSI SEID this tag is associated with
4662 * @tag: value of the S-tag to delete
4663 * @tags_used: return value, number of tags in use by this PF
4664 * @tags_free: return value, number of unallocated tags
4665 * @cmd_details: pointer to command details structure or NULL
4666 *
4667 * This deletes an S- or E-tag from a VSI in the switch complex. It returns
4668 * the number of tags allocated by the PF, and the number of unallocated
4669 * tags available.
4670 **/
4671 enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
4672 u16 tag, u16 *tags_used, u16 *tags_free,
4673 struct i40e_asq_cmd_details *cmd_details)
4674 {
4675 struct i40e_aq_desc desc;
4676 struct i40e_aqc_remove_tag *cmd =
4677 (struct i40e_aqc_remove_tag *)&desc.params.raw;
4678 struct i40e_aqc_add_remove_tag_completion *resp =
4679 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4680 enum i40e_status_code status;
4681
4682 if (vsi_seid == 0)
4683 return I40E_ERR_PARAM;
4684
4685 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
4686
4687 cmd->seid = CPU_TO_LE16(vsi_seid);
4688 cmd->tag = CPU_TO_LE16(tag);
4689
4690 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4691
4692 if (!status) {
4693 if (tags_used != NULL)
4694 *tags_used = LE16_TO_CPU(resp->tags_used);
4695 if (tags_free != NULL)
4696 *tags_free = LE16_TO_CPU(resp->tags_free);
4697 }
4698
4699 return status;
4700 }
4701
4702 /**
4703 * i40e_aq_add_mcast_etag - Add a multicast E-tag
4704 * @hw: pointer to the hw struct
4705 * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
4706 * @etag: value of E-tag to add
4707 * @num_tags_in_buf: number of unicast E-tags in indirect buffer
4708 * @buf: address of indirect buffer
4709 * @tags_used: return value, number of E-tags in use by this port
4710 * @tags_free: return value, number of unallocated M-tags
4711 * @cmd_details: pointer to command details structure or NULL
4712 *
4713 * This associates a multicast E-tag to a port virtualizer. It will return
4714 * the number of tags allocated by the PF, and the number of unallocated
4715 * tags available.
4716 *
4717 * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
4718 * num_tags_in_buf long.
4719 **/
4720 enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4721 u16 etag, u8 num_tags_in_buf, void *buf,
4722 u16 *tags_used, u16 *tags_free,
4723 struct i40e_asq_cmd_details *cmd_details)
4724 {
4725 struct i40e_aq_desc desc;
4726 struct i40e_aqc_add_remove_mcast_etag *cmd =
4727 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4728 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4729 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4730 enum i40e_status_code status;
4731 u16 length = sizeof(u16) * num_tags_in_buf;
4732
4733 if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
4734 return I40E_ERR_PARAM;
4735
4736 i40e_fill_default_direct_cmd_desc(&desc,
4737 i40e_aqc_opc_add_multicast_etag);
4738
4739 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4740 cmd->etag = CPU_TO_LE16(etag);
4741 cmd->num_unicast_etags = num_tags_in_buf;
4742
4743 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4744 if (length > I40E_AQ_LARGE_BUF)
4745 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4746
4747 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4748
4749 if (!status) {
4750 if (tags_used != NULL)
4751 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4752 if (tags_free != NULL)
4753 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4754 }
4755
4756 return status;
4757 }
4758
4759 /**
4760 * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
4761 * @hw: pointer to the hw struct
4762 * @pv_seid: Port Virtualizer SEID this M-tag is associated with
4763 * @etag: value of the E-tag to remove
4764 * @tags_used: return value, number of tags in use by this port
4765 * @tags_free: return value, number of unallocated tags
4766 * @cmd_details: pointer to command details structure or NULL
4767 *
4768 * This deletes an E-tag from the port virtualizer. It will return
4769 * the number of tags allocated by the port, and the number of unallocated
4770 * tags available.
4771 **/
4772 enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4773 u16 etag, u16 *tags_used, u16 *tags_free,
4774 struct i40e_asq_cmd_details *cmd_details)
4775 {
4776 struct i40e_aq_desc desc;
4777 struct i40e_aqc_add_remove_mcast_etag *cmd =
4778 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4779 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4780 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4781 enum i40e_status_code status;
4782
4783
4784 if (pv_seid == 0)
4785 return I40E_ERR_PARAM;
4786
4787 i40e_fill_default_direct_cmd_desc(&desc,
4788 i40e_aqc_opc_remove_multicast_etag);
4789
4790 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4791 cmd->etag = CPU_TO_LE16(etag);
4792
4793 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4794
4795 if (!status) {
4796 if (tags_used != NULL)
4797 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4798 if (tags_free != NULL)
4799 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4800 }
4801
4802 return status;
4803 }
4804
4805 /**
4806 * i40e_aq_update_tag - Update an S/E-tag
4807 * @hw: pointer to the hw struct
4808 * @vsi_seid: VSI SEID using this S-tag
4809 * @old_tag: old tag value
4810 * @new_tag: new tag value
4811 * @tags_used: return value, number of tags in use by this PF
4812 * @tags_free: return value, number of unallocated tags
4813 * @cmd_details: pointer to command details structure or NULL
4814 *
4815 * This updates the value of the tag currently attached to this VSI
4816 * in the switch complex. It will return the number of tags allocated
4817 * by the PF, and the number of unallocated tags available.
4818 **/
4819 enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
4820 u16 old_tag, u16 new_tag, u16 *tags_used,
4821 u16 *tags_free,
4822 struct i40e_asq_cmd_details *cmd_details)
4823 {
4824 struct i40e_aq_desc desc;
4825 struct i40e_aqc_update_tag *cmd =
4826 (struct i40e_aqc_update_tag *)&desc.params.raw;
4827 struct i40e_aqc_update_tag_completion *resp =
4828 (struct i40e_aqc_update_tag_completion *)&desc.params.raw;
4829 enum i40e_status_code status;
4830
4831 if (vsi_seid == 0)
4832 return I40E_ERR_PARAM;
4833
4834 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
4835
4836 cmd->seid = CPU_TO_LE16(vsi_seid);
4837 cmd->old_tag = CPU_TO_LE16(old_tag);
4838 cmd->new_tag = CPU_TO_LE16(new_tag);
4839
4840 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4841
4842 if (!status) {
4843 if (tags_used != NULL)
4844 *tags_used = LE16_TO_CPU(resp->tags_used);
4845 if (tags_free != NULL)
4846 *tags_free = LE16_TO_CPU(resp->tags_free);
4847 }
4848
4849 return status;
4850 }
4851
4852 /**
4853 * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
4854 * @hw: pointer to the hw struct
4855 * @tcmap: TC map for request/release any ignore PFC condition
4856 * @request: request or release ignore PFC condition
4857 * @tcmap_ret: return TCs for which PFC is currently ignored
4858 * @cmd_details: pointer to command details structure or NULL
4859 *
4860 * This sends out request/release to ignore PFC condition for a TC.
4861 * It will return the TCs for which PFC is currently ignored.
4862 **/
4863 enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
4864 bool request, u8 *tcmap_ret,
4865 struct i40e_asq_cmd_details *cmd_details)
4866 {
4867 struct i40e_aq_desc desc;
4868 struct i40e_aqc_pfc_ignore *cmd_resp =
4869 (struct i40e_aqc_pfc_ignore *)&desc.params.raw;
4870 enum i40e_status_code status;
4871
4872 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
4873
4874 if (request)
4875 cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
4876
4877 cmd_resp->tc_bitmap = tcmap;
4878
4879 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4880
4881 if (!status) {
4882 if (tcmap_ret != NULL)
4883 *tcmap_ret = cmd_resp->tc_bitmap;
4884 }
4885
4886 return status;
4887 }
4888
4889 /**
4890 * i40e_aq_dcb_updated - DCB Updated Command
4891 * @hw: pointer to the hw struct
4892 * @cmd_details: pointer to command details structure or NULL
4893 *
4894 * When LLDP is handled in PF this command is used by the PF
4895 * to notify EMP that a DCB setting is modified.
4896 * When LLDP is handled in EMP this command is used by the PF
4897 * to notify EMP whenever one of the following parameters get
4898 * modified:
4899 * - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
4900 * - PCIRTT in PRTDCB_GENC.PCIRTT
4901 * - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
4902 * EMP will return when the shared RPB settings have been
4903 * recomputed and modified. The retval field in the descriptor
4904 * will be set to 0 when RPB is modified.
4905 **/
4906 enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
4907 struct i40e_asq_cmd_details *cmd_details)
4908 {
4909 struct i40e_aq_desc desc;
4910 enum i40e_status_code status;
4911
4912 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
4913
4914 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4915
4916 return status;
4917 }
4918
4919 /**
4920 * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
4921 * @hw: pointer to the hw struct
4922 * @seid: defines the SEID of the switch for which the stats are requested
4923 * @vlan_id: the VLAN ID for which the statistics are requested
4924 * @stat_index: index of the statistics counters block assigned to this VLAN
4925 * @cmd_details: pointer to command details structure or NULL
4926 *
4927 * XL710 supports 128 smonVlanStats counters.This command is used to
4928 * allocate a set of smonVlanStats counters to a specific VLAN in a specific
4929 * switch.
4930 **/
4931 enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
4932 u16 vlan_id, u16 *stat_index,
4933 struct i40e_asq_cmd_details *cmd_details)
4934 {
4935 struct i40e_aq_desc desc;
4936 struct i40e_aqc_add_remove_statistics *cmd_resp =
4937 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4938 enum i40e_status_code status;
4939
4940 if ((seid == 0) || (stat_index == NULL))
4941 return I40E_ERR_PARAM;
4942
4943 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
4944
4945 cmd_resp->seid = CPU_TO_LE16(seid);
4946 cmd_resp->vlan = CPU_TO_LE16(vlan_id);
4947
4948 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4949
4950 if (!status && stat_index)
4951 *stat_index = LE16_TO_CPU(cmd_resp->stat_index);
4952
4953 return status;
4954 }
4955
4956 /**
4957 * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
4958 * @hw: pointer to the hw struct
4959 * @seid: defines the SEID of the switch for which the stats are requested
4960 * @vlan_id: the VLAN ID for which the statistics are requested
4961 * @stat_index: index of the statistics counters block assigned to this VLAN
4962 * @cmd_details: pointer to command details structure or NULL
4963 *
4964 * XL710 supports 128 smonVlanStats counters.This command is used to
4965 * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
4966 * switch.
4967 **/
4968 enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
4969 u16 vlan_id, u16 stat_index,
4970 struct i40e_asq_cmd_details *cmd_details)
4971 {
4972 struct i40e_aq_desc desc;
4973 struct i40e_aqc_add_remove_statistics *cmd =
4974 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4975 enum i40e_status_code status;
4976
4977 if (seid == 0)
4978 return I40E_ERR_PARAM;
4979
4980 i40e_fill_default_direct_cmd_desc(&desc,
4981 i40e_aqc_opc_remove_statistics);
4982
4983 cmd->seid = CPU_TO_LE16(seid);
4984 cmd->vlan = CPU_TO_LE16(vlan_id);
4985 cmd->stat_index = CPU_TO_LE16(stat_index);
4986
4987 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4988
4989 return status;
4990 }
4991
4992 /**
4993 * i40e_aq_set_port_parameters - set physical port parameters.
4994 * @hw: pointer to the hw struct
4995 * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
4996 * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
4997 * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
4998 * @double_vlan: if set double VLAN is enabled
4999 * @cmd_details: pointer to command details structure or NULL
5000 **/
5001 enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
5002 u16 bad_frame_vsi, bool save_bad_pac,
5003 bool pad_short_pac, bool double_vlan,
5004 struct i40e_asq_cmd_details *cmd_details)
5005 {
5006 struct i40e_aqc_set_port_parameters *cmd;
5007 enum i40e_status_code status;
5008 struct i40e_aq_desc desc;
5009 u16 command_flags = 0;
5010
5011 cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
5012
5013 i40e_fill_default_direct_cmd_desc(&desc,
5014 i40e_aqc_opc_set_port_parameters);
5015
5016 cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
5017 if (save_bad_pac)
5018 command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
5019 if (pad_short_pac)
5020 command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
5021 if (double_vlan)
5022 command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
5023 cmd->command_flags = CPU_TO_LE16(command_flags);
5024
5025 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5026
5027 return status;
5028 }
5029
5030 /**
5031 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
5032 * @hw: pointer to the hw struct
5033 * @seid: seid for the physical port/switching component/vsi
5034 * @buff: Indirect buffer to hold data parameters and response
5035 * @buff_size: Indirect buffer size
5036 * @opcode: Tx scheduler AQ command opcode
5037 * @cmd_details: pointer to command details structure or NULL
5038 *
5039 * Generic command handler for Tx scheduler AQ commands
5040 **/
5041 static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
5042 void *buff, u16 buff_size,
5043 enum i40e_admin_queue_opc opcode,
5044 struct i40e_asq_cmd_details *cmd_details)
5045 {
5046 struct i40e_aq_desc desc;
5047 struct i40e_aqc_tx_sched_ind *cmd =
5048 (struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
5049 enum i40e_status_code status;
5050 bool cmd_param_flag = false;
5051
5052 switch (opcode) {
5053 case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
5054 case i40e_aqc_opc_configure_vsi_tc_bw:
5055 case i40e_aqc_opc_enable_switching_comp_ets:
5056 case i40e_aqc_opc_modify_switching_comp_ets:
5057 case i40e_aqc_opc_disable_switching_comp_ets:
5058 case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
5059 case i40e_aqc_opc_configure_switching_comp_bw_config:
5060 cmd_param_flag = true;
5061 break;
5062 case i40e_aqc_opc_query_vsi_bw_config:
5063 case i40e_aqc_opc_query_vsi_ets_sla_config:
5064 case i40e_aqc_opc_query_switching_comp_ets_config:
5065 case i40e_aqc_opc_query_port_ets_config:
5066 case i40e_aqc_opc_query_switching_comp_bw_config:
5067 cmd_param_flag = false;
5068 break;
5069 default:
5070 return I40E_ERR_PARAM;
5071 }
5072
5073 i40e_fill_default_direct_cmd_desc(&desc, opcode);
5074
5075 /* Indirect command */
5076 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5077 if (cmd_param_flag)
5078 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
5079 if (buff_size > I40E_AQ_LARGE_BUF)
5080 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5081
5082 desc.datalen = CPU_TO_LE16(buff_size);
5083
5084 cmd->vsi_seid = CPU_TO_LE16(seid);
5085
5086 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
5087
5088 return status;
5089 }
5090
5091 /**
5092 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
5093 * @hw: pointer to the hw struct
5094 * @seid: VSI seid
5095 * @credit: BW limit credits (0 = disabled)
5096 * @max_credit: Max BW limit credits
5097 * @cmd_details: pointer to command details structure or NULL
5098 **/
5099 enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
5100 u16 seid, u16 credit, u8 max_credit,
5101 struct i40e_asq_cmd_details *cmd_details)
5102 {
5103 struct i40e_aq_desc desc;
5104 struct i40e_aqc_configure_vsi_bw_limit *cmd =
5105 (struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
5106 enum i40e_status_code status;
5107
5108 i40e_fill_default_direct_cmd_desc(&desc,
5109 i40e_aqc_opc_configure_vsi_bw_limit);
5110
5111 cmd->vsi_seid = CPU_TO_LE16(seid);
5112 cmd->credit = CPU_TO_LE16(credit);
5113 cmd->max_credit = max_credit;
5114
5115 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5116
5117 return status;
5118 }
5119
5120 /**
5121 * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
5122 * @hw: pointer to the hw struct
5123 * @seid: switching component seid
5124 * @credit: BW limit credits (0 = disabled)
5125 * @max_bw: Max BW limit credits
5126 * @cmd_details: pointer to command details structure or NULL
5127 **/
5128 enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
5129 u16 seid, u16 credit, u8 max_bw,
5130 struct i40e_asq_cmd_details *cmd_details)
5131 {
5132 struct i40e_aq_desc desc;
5133 struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
5134 (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
5135 enum i40e_status_code status;
5136
5137 i40e_fill_default_direct_cmd_desc(&desc,
5138 i40e_aqc_opc_configure_switching_comp_bw_limit);
5139
5140 cmd->seid = CPU_TO_LE16(seid);
5141 cmd->credit = CPU_TO_LE16(credit);
5142 cmd->max_bw = max_bw;
5143
5144 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5145
5146 return status;
5147 }
5148
5149 /**
5150 * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
5151 * @hw: pointer to the hw struct
5152 * @seid: VSI seid
5153 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5154 * @cmd_details: pointer to command details structure or NULL
5155 **/
5156 enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
5157 u16 seid,
5158 struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
5159 struct i40e_asq_cmd_details *cmd_details)
5160 {
5161 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5162 i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
5163 cmd_details);
5164 }
5165
5166 /**
5167 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
5168 * @hw: pointer to the hw struct
5169 * @seid: VSI seid
5170 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
5171 * @cmd_details: pointer to command details structure or NULL
5172 **/
5173 enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
5174 u16 seid,
5175 struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
5176 struct i40e_asq_cmd_details *cmd_details)
5177 {
5178 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5179 i40e_aqc_opc_configure_vsi_tc_bw,
5180 cmd_details);
5181 }
5182
5183 /**
5184 * i40e_aq_config_switch_comp_ets - Enable/Disable/Modify ETS on the port
5185 * @hw: pointer to the hw struct
5186 * @seid: seid of the switching component connected to Physical Port
5187 * @ets_data: Buffer holding ETS parameters
5188 * @cmd_details: pointer to command details structure or NULL
5189 **/
5190 enum i40e_status_code i40e_aq_config_switch_comp_ets(struct i40e_hw *hw,
5191 u16 seid,
5192 struct i40e_aqc_configure_switching_comp_ets_data *ets_data,
5193 enum i40e_admin_queue_opc opcode,
5194 struct i40e_asq_cmd_details *cmd_details)
5195 {
5196 return i40e_aq_tx_sched_cmd(hw, seid, (void *)ets_data,
5197 sizeof(*ets_data), opcode, cmd_details);
5198 }
5199
5200 /**
5201 * i40e_aq_config_switch_comp_bw_config - Config Switch comp BW Alloc per TC
5202 * @hw: pointer to the hw struct
5203 * @seid: seid of the switching component
5204 * @bw_data: Buffer holding enabled TCs, relative/absolute TC BW limit/credits
5205 * @cmd_details: pointer to command details structure or NULL
5206 **/
5207 enum i40e_status_code i40e_aq_config_switch_comp_bw_config(struct i40e_hw *hw,
5208 u16 seid,
5209 struct i40e_aqc_configure_switching_comp_bw_config_data *bw_data,
5210 struct i40e_asq_cmd_details *cmd_details)
5211 {
5212 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5213 i40e_aqc_opc_configure_switching_comp_bw_config,
5214 cmd_details);
5215 }
5216
5217 /**
5218 * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
5219 * @hw: pointer to the hw struct
5220 * @seid: seid of the switching component
5221 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5222 * @cmd_details: pointer to command details structure or NULL
5223 **/
5224 enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
5225 struct i40e_hw *hw, u16 seid,
5226 struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
5227 struct i40e_asq_cmd_details *cmd_details)
5228 {
5229 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5230 i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
5231 cmd_details);
5232 }
5233
5234 /**
5235 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
5236 * @hw: pointer to the hw struct
5237 * @seid: seid of the VSI
5238 * @bw_data: Buffer to hold VSI BW configuration
5239 * @cmd_details: pointer to command details structure or NULL
5240 **/
5241 enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
5242 u16 seid,
5243 struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
5244 struct i40e_asq_cmd_details *cmd_details)
5245 {
5246 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5247 i40e_aqc_opc_query_vsi_bw_config,
5248 cmd_details);
5249 }
5250
5251 /**
5252 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
5253 * @hw: pointer to the hw struct
5254 * @seid: seid of the VSI
5255 * @bw_data: Buffer to hold VSI BW configuration per TC
5256 * @cmd_details: pointer to command details structure or NULL
5257 **/
5258 enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
5259 u16 seid,
5260 struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
5261 struct i40e_asq_cmd_details *cmd_details)
5262 {
5263 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5264 i40e_aqc_opc_query_vsi_ets_sla_config,
5265 cmd_details);
5266 }
5267
5268 /**
5269 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
5270 * @hw: pointer to the hw struct
5271 * @seid: seid of the switching component
5272 * @bw_data: Buffer to hold switching component's per TC BW config
5273 * @cmd_details: pointer to command details structure or NULL
5274 **/
5275 enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
5276 u16 seid,
5277 struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
5278 struct i40e_asq_cmd_details *cmd_details)
5279 {
5280 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5281 i40e_aqc_opc_query_switching_comp_ets_config,
5282 cmd_details);
5283 }
5284
5285 /**
5286 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
5287 * @hw: pointer to the hw struct
5288 * @seid: seid of the VSI or switching component connected to Physical Port
5289 * @bw_data: Buffer to hold current ETS configuration for the Physical Port
5290 * @cmd_details: pointer to command details structure or NULL
5291 **/
5292 enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
5293 u16 seid,
5294 struct i40e_aqc_query_port_ets_config_resp *bw_data,
5295 struct i40e_asq_cmd_details *cmd_details)
5296 {
5297 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5298 i40e_aqc_opc_query_port_ets_config,
5299 cmd_details);
5300 }
5301
5302 /**
5303 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
5304 * @hw: pointer to the hw struct
5305 * @seid: seid of the switching component
5306 * @bw_data: Buffer to hold switching component's BW configuration
5307 * @cmd_details: pointer to command details structure or NULL
5308 **/
5309 enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
5310 u16 seid,
5311 struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
5312 struct i40e_asq_cmd_details *cmd_details)
5313 {
5314 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5315 i40e_aqc_opc_query_switching_comp_bw_config,
5316 cmd_details);
5317 }
5318
5319 /**
5320 * i40e_validate_filter_settings
5321 * @hw: pointer to the hardware structure
5322 * @settings: Filter control settings
5323 *
5324 * Check and validate the filter control settings passed.
5325 * The function checks for the valid filter/context sizes being
5326 * passed for FCoE and PE.
5327 *
5328 * Returns I40E_SUCCESS if the values passed are valid and within
5329 * range else returns an error.
5330 **/
5331 STATIC enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
5332 struct i40e_filter_control_settings *settings)
5333 {
5334 u32 fcoe_cntx_size, fcoe_filt_size;
5335 u32 pe_cntx_size, pe_filt_size;
5336 u32 fcoe_fmax;
5337
5338 u32 val;
5339
5340 /* Validate FCoE settings passed */
5341 switch (settings->fcoe_filt_num) {
5342 case I40E_HASH_FILTER_SIZE_1K:
5343 case I40E_HASH_FILTER_SIZE_2K:
5344 case I40E_HASH_FILTER_SIZE_4K:
5345 case I40E_HASH_FILTER_SIZE_8K:
5346 case I40E_HASH_FILTER_SIZE_16K:
5347 case I40E_HASH_FILTER_SIZE_32K:
5348 fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5349 fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
5350 break;
5351 default:
5352 return I40E_ERR_PARAM;
5353 }
5354
5355 switch (settings->fcoe_cntx_num) {
5356 case I40E_DMA_CNTX_SIZE_512:
5357 case I40E_DMA_CNTX_SIZE_1K:
5358 case I40E_DMA_CNTX_SIZE_2K:
5359 case I40E_DMA_CNTX_SIZE_4K:
5360 fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5361 fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
5362 break;
5363 default:
5364 return I40E_ERR_PARAM;
5365 }
5366
5367 /* Validate PE settings passed */
5368 switch (settings->pe_filt_num) {
5369 case I40E_HASH_FILTER_SIZE_1K:
5370 case I40E_HASH_FILTER_SIZE_2K:
5371 case I40E_HASH_FILTER_SIZE_4K:
5372 case I40E_HASH_FILTER_SIZE_8K:
5373 case I40E_HASH_FILTER_SIZE_16K:
5374 case I40E_HASH_FILTER_SIZE_32K:
5375 case I40E_HASH_FILTER_SIZE_64K:
5376 case I40E_HASH_FILTER_SIZE_128K:
5377 case I40E_HASH_FILTER_SIZE_256K:
5378 case I40E_HASH_FILTER_SIZE_512K:
5379 case I40E_HASH_FILTER_SIZE_1M:
5380 pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5381 pe_filt_size <<= (u32)settings->pe_filt_num;
5382 break;
5383 default:
5384 return I40E_ERR_PARAM;
5385 }
5386
5387 switch (settings->pe_cntx_num) {
5388 case I40E_DMA_CNTX_SIZE_512:
5389 case I40E_DMA_CNTX_SIZE_1K:
5390 case I40E_DMA_CNTX_SIZE_2K:
5391 case I40E_DMA_CNTX_SIZE_4K:
5392 case I40E_DMA_CNTX_SIZE_8K:
5393 case I40E_DMA_CNTX_SIZE_16K:
5394 case I40E_DMA_CNTX_SIZE_32K:
5395 case I40E_DMA_CNTX_SIZE_64K:
5396 case I40E_DMA_CNTX_SIZE_128K:
5397 case I40E_DMA_CNTX_SIZE_256K:
5398 pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5399 pe_cntx_size <<= (u32)settings->pe_cntx_num;
5400 break;
5401 default:
5402 return I40E_ERR_PARAM;
5403 }
5404
5405 /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
5406 val = rd32(hw, I40E_GLHMC_FCOEFMAX);
5407 fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
5408 >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
5409 if (fcoe_filt_size + fcoe_cntx_size > fcoe_fmax)
5410 return I40E_ERR_INVALID_SIZE;
5411
5412 return I40E_SUCCESS;
5413 }
5414
5415 /**
5416 * i40e_set_filter_control
5417 * @hw: pointer to the hardware structure
5418 * @settings: Filter control settings
5419 *
5420 * Set the Queue Filters for PE/FCoE and enable filters required
5421 * for a single PF. It is expected that these settings are programmed
5422 * at the driver initialization time.
5423 **/
5424 enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
5425 struct i40e_filter_control_settings *settings)
5426 {
5427 enum i40e_status_code ret = I40E_SUCCESS;
5428 u32 hash_lut_size = 0;
5429 u32 val;
5430
5431 if (!settings)
5432 return I40E_ERR_PARAM;
5433
5434 /* Validate the input settings */
5435 ret = i40e_validate_filter_settings(hw, settings);
5436 if (ret)
5437 return ret;
5438
5439 /* Read the PF Queue Filter control register */
5440 val = i40e_read_rx_ctl(hw, I40E_PFQF_CTL_0);
5441
5442 /* Program required PE hash buckets for the PF */
5443 val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
5444 val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
5445 I40E_PFQF_CTL_0_PEHSIZE_MASK;
5446 /* Program required PE contexts for the PF */
5447 val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
5448 val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
5449 I40E_PFQF_CTL_0_PEDSIZE_MASK;
5450
5451 /* Program required FCoE hash buckets for the PF */
5452 val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5453 val |= ((u32)settings->fcoe_filt_num <<
5454 I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
5455 I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5456 /* Program required FCoE DDP contexts for the PF */
5457 val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5458 val |= ((u32)settings->fcoe_cntx_num <<
5459 I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
5460 I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5461
5462 /* Program Hash LUT size for the PF */
5463 val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5464 if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
5465 hash_lut_size = 1;
5466 val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
5467 I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5468
5469 /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
5470 if (settings->enable_fdir)
5471 val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
5472 if (settings->enable_ethtype)
5473 val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
5474 if (settings->enable_macvlan)
5475 val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
5476
5477 i40e_write_rx_ctl(hw, I40E_PFQF_CTL_0, val);
5478
5479 return I40E_SUCCESS;
5480 }
5481
5482 /**
5483 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
5484 * @hw: pointer to the hw struct
5485 * @mac_addr: MAC address to use in the filter
5486 * @ethtype: Ethertype to use in the filter
5487 * @flags: Flags that needs to be applied to the filter
5488 * @vsi_seid: seid of the control VSI
5489 * @queue: VSI queue number to send the packet to
5490 * @is_add: Add control packet filter if True else remove
5491 * @stats: Structure to hold information on control filter counts
5492 * @cmd_details: pointer to command details structure or NULL
5493 *
5494 * This command will Add or Remove control packet filter for a control VSI.
5495 * In return it will update the total number of perfect filter count in
5496 * the stats member.
5497 **/
5498 enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
5499 u8 *mac_addr, u16 ethtype, u16 flags,
5500 u16 vsi_seid, u16 queue, bool is_add,
5501 struct i40e_control_filter_stats *stats,
5502 struct i40e_asq_cmd_details *cmd_details)
5503 {
5504 struct i40e_aq_desc desc;
5505 struct i40e_aqc_add_remove_control_packet_filter *cmd =
5506 (struct i40e_aqc_add_remove_control_packet_filter *)
5507 &desc.params.raw;
5508 struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
5509 (struct i40e_aqc_add_remove_control_packet_filter_completion *)
5510 &desc.params.raw;
5511 enum i40e_status_code status;
5512
5513 if (vsi_seid == 0)
5514 return I40E_ERR_PARAM;
5515
5516 if (is_add) {
5517 i40e_fill_default_direct_cmd_desc(&desc,
5518 i40e_aqc_opc_add_control_packet_filter);
5519 cmd->queue = CPU_TO_LE16(queue);
5520 } else {
5521 i40e_fill_default_direct_cmd_desc(&desc,
5522 i40e_aqc_opc_remove_control_packet_filter);
5523 }
5524
5525 if (mac_addr)
5526 i40e_memcpy(cmd->mac, mac_addr, I40E_ETH_LENGTH_OF_ADDRESS,
5527 I40E_NONDMA_TO_NONDMA);
5528
5529 cmd->etype = CPU_TO_LE16(ethtype);
5530 cmd->flags = CPU_TO_LE16(flags);
5531 cmd->seid = CPU_TO_LE16(vsi_seid);
5532
5533 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5534
5535 if (!status && stats) {
5536 stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
5537 stats->etype_used = LE16_TO_CPU(resp->etype_used);
5538 stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
5539 stats->etype_free = LE16_TO_CPU(resp->etype_free);
5540 }
5541
5542 return status;
5543 }
5544
5545 /**
5546 * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
5547 * @hw: pointer to the hw struct
5548 * @seid: VSI seid to add ethertype filter from
5549 **/
5550 #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
5551 void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
5552 u16 seid)
5553 {
5554 u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
5555 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
5556 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
5557 u16 ethtype = I40E_FLOW_CONTROL_ETHTYPE;
5558 enum i40e_status_code status;
5559
5560 status = i40e_aq_add_rem_control_packet_filter(hw, NULL, ethtype, flag,
5561 seid, 0, true, NULL,
5562 NULL);
5563 if (status)
5564 DEBUGOUT("Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
5565 }
5566
5567 /**
5568 * i40e_fix_up_geneve_vni - adjust Geneve VNI for HW issue
5569 * @filters: list of cloud filters
5570 * @filter_count: length of list
5571 *
5572 * There's an issue in the device where the Geneve VNI layout needs
5573 * to be shifted 1 byte over from the VxLAN VNI
5574 **/
5575 STATIC void i40e_fix_up_geneve_vni(
5576 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5577 u8 filter_count)
5578 {
5579 struct i40e_aqc_add_remove_cloud_filters_element_data *f = filters;
5580 int i;
5581
5582 for (i = 0; i < filter_count; i++) {
5583 u16 tnl_type;
5584 u32 ti;
5585
5586 tnl_type = (LE16_TO_CPU(f[i].flags) &
5587 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5588 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5589 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5590 ti = LE32_TO_CPU(f[i].tenant_id);
5591 f[i].tenant_id = CPU_TO_LE32(ti << 8);
5592 }
5593 }
5594 }
5595
5596 /**
5597 * i40e_aq_add_cloud_filters
5598 * @hw: pointer to the hardware structure
5599 * @seid: VSI seid to add cloud filters from
5600 * @filters: Buffer which contains the filters to be added
5601 * @filter_count: number of filters contained in the buffer
5602 *
5603 * Set the cloud filters for a given VSI. The contents of the
5604 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5605 * in by the caller of the function.
5606 *
5607 **/
5608 enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
5609 u16 seid,
5610 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5611 u8 filter_count)
5612 {
5613 struct i40e_aq_desc desc;
5614 struct i40e_aqc_add_remove_cloud_filters *cmd =
5615 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5616 enum i40e_status_code status;
5617 u16 buff_len;
5618
5619 i40e_fill_default_direct_cmd_desc(&desc,
5620 i40e_aqc_opc_add_cloud_filters);
5621
5622 buff_len = filter_count * sizeof(*filters);
5623 desc.datalen = CPU_TO_LE16(buff_len);
5624 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5625 cmd->num_filters = filter_count;
5626 cmd->seid = CPU_TO_LE16(seid);
5627
5628 i40e_fix_up_geneve_vni(filters, filter_count);
5629
5630 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5631
5632 return status;
5633 }
5634
5635 /**
5636 * i40e_aq_add_cloud_filters_big_buffer
5637 * @hw: pointer to the hardware structure
5638 * @seid: VSI seid to add cloud filters from
5639 * @filters: Buffer which contains the filters in big buffer to be added
5640 * @filter_count: number of filters contained in the buffer
5641 *
5642 * Set the cloud filters for a given VSI. The contents of the
5643 * i40e_aqc_add_rm_cloud_filt_elem_ext are filled in by the caller of
5644 * the function.
5645 *
5646 **/
5647 enum i40e_status_code i40e_aq_add_cloud_filters_big_buffer(struct i40e_hw *hw,
5648 u16 seid,
5649 struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
5650 u8 filter_count)
5651 {
5652 struct i40e_aq_desc desc;
5653 struct i40e_aqc_add_remove_cloud_filters *cmd =
5654 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5655 enum i40e_status_code status;
5656 u16 buff_len;
5657 int i;
5658
5659 i40e_fill_default_direct_cmd_desc(&desc,
5660 i40e_aqc_opc_add_cloud_filters);
5661
5662 buff_len = filter_count * sizeof(*filters);
5663 desc.datalen = CPU_TO_LE16(buff_len);
5664 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5665 cmd->num_filters = filter_count;
5666 cmd->seid = CPU_TO_LE16(seid);
5667 cmd->big_buffer_flag = I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER;
5668
5669 /* adjust Geneve VNI for HW issue */
5670 for (i = 0; i < filter_count; i++) {
5671 u16 tnl_type;
5672 u32 ti;
5673
5674 tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5675 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5676 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5677 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5678 ti = LE32_TO_CPU(filters[i].element.tenant_id);
5679 filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5680 }
5681 }
5682
5683 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5684
5685 return status;
5686 }
5687
5688 /**
5689 * i40e_aq_remove_cloud_filters
5690 * @hw: pointer to the hardware structure
5691 * @seid: VSI seid to remove cloud filters from
5692 * @filters: Buffer which contains the filters to be removed
5693 * @filter_count: number of filters contained in the buffer
5694 *
5695 * Remove the cloud filters for a given VSI. The contents of the
5696 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5697 * in by the caller of the function.
5698 *
5699 **/
5700 enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
5701 u16 seid,
5702 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5703 u8 filter_count)
5704 {
5705 struct i40e_aq_desc desc;
5706 struct i40e_aqc_add_remove_cloud_filters *cmd =
5707 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5708 enum i40e_status_code status;
5709 u16 buff_len;
5710
5711 i40e_fill_default_direct_cmd_desc(&desc,
5712 i40e_aqc_opc_remove_cloud_filters);
5713
5714 buff_len = filter_count * sizeof(*filters);
5715 desc.datalen = CPU_TO_LE16(buff_len);
5716 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5717 cmd->num_filters = filter_count;
5718 cmd->seid = CPU_TO_LE16(seid);
5719
5720 i40e_fix_up_geneve_vni(filters, filter_count);
5721
5722 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5723
5724 return status;
5725 }
5726
5727 /**
5728 * i40e_aq_remove_cloud_filters_big_buffer
5729 * @hw: pointer to the hardware structure
5730 * @seid: VSI seid to remove cloud filters from
5731 * @filters: Buffer which contains the filters in big buffer to be removed
5732 * @filter_count: number of filters contained in the buffer
5733 *
5734 * Remove the cloud filters for a given VSI. The contents of the
5735 * i40e_aqc_add_rm_cloud_filt_elem_ext are filled in by the caller of
5736 * the function.
5737 *
5738 **/
5739 enum i40e_status_code i40e_aq_remove_cloud_filters_big_buffer(
5740 struct i40e_hw *hw,
5741 u16 seid,
5742 struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
5743 u8 filter_count)
5744 {
5745 struct i40e_aq_desc desc;
5746 struct i40e_aqc_add_remove_cloud_filters *cmd =
5747 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5748 enum i40e_status_code status;
5749 u16 buff_len;
5750 int i;
5751
5752 i40e_fill_default_direct_cmd_desc(&desc,
5753 i40e_aqc_opc_remove_cloud_filters);
5754
5755 buff_len = filter_count * sizeof(*filters);
5756 desc.datalen = CPU_TO_LE16(buff_len);
5757 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5758 cmd->num_filters = filter_count;
5759 cmd->seid = CPU_TO_LE16(seid);
5760 cmd->big_buffer_flag = I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER;
5761
5762 /* adjust Geneve VNI for HW issue */
5763 for (i = 0; i < filter_count; i++) {
5764 u16 tnl_type;
5765 u32 ti;
5766
5767 tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5768 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5769 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5770 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5771 ti = LE32_TO_CPU(filters[i].element.tenant_id);
5772 filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5773 }
5774 }
5775
5776 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5777
5778 return status;
5779 }
5780
5781 /**
5782 * i40e_aq_replace_cloud_filters - Replace cloud filter command
5783 * @hw: pointer to the hw struct
5784 * @filters: pointer to the i40e_aqc_replace_cloud_filter_cmd struct
5785 * @cmd_buf: pointer to the i40e_aqc_replace_cloud_filter_cmd_buf struct
5786 *
5787 **/
5788 enum
5789 i40e_status_code i40e_aq_replace_cloud_filters(struct i40e_hw *hw,
5790 struct i40e_aqc_replace_cloud_filters_cmd *filters,
5791 struct i40e_aqc_replace_cloud_filters_cmd_buf *cmd_buf)
5792 {
5793 struct i40e_aq_desc desc;
5794 struct i40e_aqc_replace_cloud_filters_cmd *cmd =
5795 (struct i40e_aqc_replace_cloud_filters_cmd *)&desc.params.raw;
5796 enum i40e_status_code status = I40E_SUCCESS;
5797 int i = 0;
5798
5799 i40e_fill_default_direct_cmd_desc(&desc,
5800 i40e_aqc_opc_replace_cloud_filters);
5801
5802 desc.datalen = CPU_TO_LE16(32);
5803 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5804 cmd->old_filter_type = filters->old_filter_type;
5805 cmd->new_filter_type = filters->new_filter_type;
5806 cmd->valid_flags = filters->valid_flags;
5807 cmd->tr_bit = filters->tr_bit;
5808
5809 status = i40e_asq_send_command(hw, &desc, cmd_buf,
5810 sizeof(struct i40e_aqc_replace_cloud_filters_cmd_buf), NULL);
5811
5812 /* for get cloud filters command */
5813 for (i = 0; i < 32; i += 4) {
5814 cmd_buf->filters[i / 4].filter_type = cmd_buf->data[i];
5815 cmd_buf->filters[i / 4].input[0] = cmd_buf->data[i + 1];
5816 cmd_buf->filters[i / 4].input[1] = cmd_buf->data[i + 2];
5817 cmd_buf->filters[i / 4].input[2] = cmd_buf->data[i + 3];
5818 }
5819
5820 return status;
5821 }
5822
5823
5824 /**
5825 * i40e_aq_alternate_write
5826 * @hw: pointer to the hardware structure
5827 * @reg_addr0: address of first dword to be read
5828 * @reg_val0: value to be written under 'reg_addr0'
5829 * @reg_addr1: address of second dword to be read
5830 * @reg_val1: value to be written under 'reg_addr1'
5831 *
5832 * Write one or two dwords to alternate structure. Fields are indicated
5833 * by 'reg_addr0' and 'reg_addr1' register numbers.
5834 *
5835 **/
5836 enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
5837 u32 reg_addr0, u32 reg_val0,
5838 u32 reg_addr1, u32 reg_val1)
5839 {
5840 struct i40e_aq_desc desc;
5841 struct i40e_aqc_alternate_write *cmd_resp =
5842 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5843 enum i40e_status_code status;
5844
5845 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
5846 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5847 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5848 cmd_resp->data0 = CPU_TO_LE32(reg_val0);
5849 cmd_resp->data1 = CPU_TO_LE32(reg_val1);
5850
5851 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5852
5853 return status;
5854 }
5855
5856 /**
5857 * i40e_aq_alternate_write_indirect
5858 * @hw: pointer to the hardware structure
5859 * @addr: address of a first register to be modified
5860 * @dw_count: number of alternate structure fields to write
5861 * @buffer: pointer to the command buffer
5862 *
5863 * Write 'dw_count' dwords from 'buffer' to alternate structure
5864 * starting at 'addr'.
5865 *
5866 **/
5867 enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
5868 u32 addr, u32 dw_count, void *buffer)
5869 {
5870 struct i40e_aq_desc desc;
5871 struct i40e_aqc_alternate_ind_write *cmd_resp =
5872 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5873 enum i40e_status_code status;
5874
5875 if (buffer == NULL)
5876 return I40E_ERR_PARAM;
5877
5878 /* Indirect command */
5879 i40e_fill_default_direct_cmd_desc(&desc,
5880 i40e_aqc_opc_alternate_write_indirect);
5881
5882 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5883 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5884 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5885 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5886
5887 cmd_resp->address = CPU_TO_LE32(addr);
5888 cmd_resp->length = CPU_TO_LE32(dw_count);
5889
5890 status = i40e_asq_send_command(hw, &desc, buffer,
5891 I40E_LO_DWORD(4*dw_count), NULL);
5892
5893 return status;
5894 }
5895
5896 /**
5897 * i40e_aq_alternate_read
5898 * @hw: pointer to the hardware structure
5899 * @reg_addr0: address of first dword to be read
5900 * @reg_val0: pointer for data read from 'reg_addr0'
5901 * @reg_addr1: address of second dword to be read
5902 * @reg_val1: pointer for data read from 'reg_addr1'
5903 *
5904 * Read one or two dwords from alternate structure. Fields are indicated
5905 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
5906 * is not passed then only register at 'reg_addr0' is read.
5907 *
5908 **/
5909 enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
5910 u32 reg_addr0, u32 *reg_val0,
5911 u32 reg_addr1, u32 *reg_val1)
5912 {
5913 struct i40e_aq_desc desc;
5914 struct i40e_aqc_alternate_write *cmd_resp =
5915 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5916 enum i40e_status_code status;
5917
5918 if (reg_val0 == NULL)
5919 return I40E_ERR_PARAM;
5920
5921 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
5922 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5923 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5924
5925 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5926
5927 if (status == I40E_SUCCESS) {
5928 *reg_val0 = LE32_TO_CPU(cmd_resp->data0);
5929
5930 if (reg_val1 != NULL)
5931 *reg_val1 = LE32_TO_CPU(cmd_resp->data1);
5932 }
5933
5934 return status;
5935 }
5936
5937 /**
5938 * i40e_aq_alternate_read_indirect
5939 * @hw: pointer to the hardware structure
5940 * @addr: address of the alternate structure field
5941 * @dw_count: number of alternate structure fields to read
5942 * @buffer: pointer to the command buffer
5943 *
5944 * Read 'dw_count' dwords from alternate structure starting at 'addr' and
5945 * place them in 'buffer'. The buffer should be allocated by caller.
5946 *
5947 **/
5948 enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
5949 u32 addr, u32 dw_count, void *buffer)
5950 {
5951 struct i40e_aq_desc desc;
5952 struct i40e_aqc_alternate_ind_write *cmd_resp =
5953 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5954 enum i40e_status_code status;
5955
5956 if (buffer == NULL)
5957 return I40E_ERR_PARAM;
5958
5959 /* Indirect command */
5960 i40e_fill_default_direct_cmd_desc(&desc,
5961 i40e_aqc_opc_alternate_read_indirect);
5962
5963 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5964 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5965 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5966 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5967
5968 cmd_resp->address = CPU_TO_LE32(addr);
5969 cmd_resp->length = CPU_TO_LE32(dw_count);
5970
5971 status = i40e_asq_send_command(hw, &desc, buffer,
5972 I40E_LO_DWORD(4*dw_count), NULL);
5973
5974 return status;
5975 }
5976
5977 /**
5978 * i40e_aq_alternate_clear
5979 * @hw: pointer to the HW structure.
5980 *
5981 * Clear the alternate structures of the port from which the function
5982 * is called.
5983 *
5984 **/
5985 enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
5986 {
5987 struct i40e_aq_desc desc;
5988 enum i40e_status_code status;
5989
5990 i40e_fill_default_direct_cmd_desc(&desc,
5991 i40e_aqc_opc_alternate_clear_port);
5992
5993 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5994
5995 return status;
5996 }
5997
5998 /**
5999 * i40e_aq_alternate_write_done
6000 * @hw: pointer to the HW structure.
6001 * @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
6002 * @reset_needed: indicates the SW should trigger GLOBAL reset
6003 *
6004 * Indicates to the FW that alternate structures have been changed.
6005 *
6006 **/
6007 enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
6008 u8 bios_mode, bool *reset_needed)
6009 {
6010 struct i40e_aq_desc desc;
6011 struct i40e_aqc_alternate_write_done *cmd =
6012 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
6013 enum i40e_status_code status;
6014
6015 if (reset_needed == NULL)
6016 return I40E_ERR_PARAM;
6017
6018 i40e_fill_default_direct_cmd_desc(&desc,
6019 i40e_aqc_opc_alternate_write_done);
6020
6021 cmd->cmd_flags = CPU_TO_LE16(bios_mode);
6022
6023 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6024 if (!status && reset_needed)
6025 *reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
6026 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
6027
6028 return status;
6029 }
6030
6031 /**
6032 * i40e_aq_set_oem_mode
6033 * @hw: pointer to the HW structure.
6034 * @oem_mode: the OEM mode to be used
6035 *
6036 * Sets the device to a specific operating mode. Currently the only supported
6037 * mode is no_clp, which causes FW to refrain from using Alternate RAM.
6038 *
6039 **/
6040 enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
6041 u8 oem_mode)
6042 {
6043 struct i40e_aq_desc desc;
6044 struct i40e_aqc_alternate_write_done *cmd =
6045 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
6046 enum i40e_status_code status;
6047
6048 i40e_fill_default_direct_cmd_desc(&desc,
6049 i40e_aqc_opc_alternate_set_mode);
6050
6051 cmd->cmd_flags = CPU_TO_LE16(oem_mode);
6052
6053 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6054
6055 return status;
6056 }
6057
6058 /**
6059 * i40e_aq_resume_port_tx
6060 * @hw: pointer to the hardware structure
6061 * @cmd_details: pointer to command details structure or NULL
6062 *
6063 * Resume port's Tx traffic
6064 **/
6065 enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
6066 struct i40e_asq_cmd_details *cmd_details)
6067 {
6068 struct i40e_aq_desc desc;
6069 enum i40e_status_code status;
6070
6071 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
6072
6073 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6074
6075 return status;
6076 }
6077
6078 /**
6079 * i40e_set_pci_config_data - store PCI bus info
6080 * @hw: pointer to hardware structure
6081 * @link_status: the link status word from PCI config space
6082 *
6083 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
6084 **/
6085 void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
6086 {
6087 hw->bus.type = i40e_bus_type_pci_express;
6088
6089 switch (link_status & I40E_PCI_LINK_WIDTH) {
6090 case I40E_PCI_LINK_WIDTH_1:
6091 hw->bus.width = i40e_bus_width_pcie_x1;
6092 break;
6093 case I40E_PCI_LINK_WIDTH_2:
6094 hw->bus.width = i40e_bus_width_pcie_x2;
6095 break;
6096 case I40E_PCI_LINK_WIDTH_4:
6097 hw->bus.width = i40e_bus_width_pcie_x4;
6098 break;
6099 case I40E_PCI_LINK_WIDTH_8:
6100 hw->bus.width = i40e_bus_width_pcie_x8;
6101 break;
6102 default:
6103 hw->bus.width = i40e_bus_width_unknown;
6104 break;
6105 }
6106
6107 switch (link_status & I40E_PCI_LINK_SPEED) {
6108 case I40E_PCI_LINK_SPEED_2500:
6109 hw->bus.speed = i40e_bus_speed_2500;
6110 break;
6111 case I40E_PCI_LINK_SPEED_5000:
6112 hw->bus.speed = i40e_bus_speed_5000;
6113 break;
6114 case I40E_PCI_LINK_SPEED_8000:
6115 hw->bus.speed = i40e_bus_speed_8000;
6116 break;
6117 default:
6118 hw->bus.speed = i40e_bus_speed_unknown;
6119 break;
6120 }
6121 }
6122
6123 /**
6124 * i40e_aq_debug_dump
6125 * @hw: pointer to the hardware structure
6126 * @cluster_id: specific cluster to dump
6127 * @table_id: table id within cluster
6128 * @start_index: index of line in the block to read
6129 * @buff_size: dump buffer size
6130 * @buff: dump buffer
6131 * @ret_buff_size: actual buffer size returned
6132 * @ret_next_table: next block to read
6133 * @ret_next_index: next index to read
6134 *
6135 * Dump internal FW/HW data for debug purposes.
6136 *
6137 **/
6138 enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
6139 u8 table_id, u32 start_index, u16 buff_size,
6140 void *buff, u16 *ret_buff_size,
6141 u8 *ret_next_table, u32 *ret_next_index,
6142 struct i40e_asq_cmd_details *cmd_details)
6143 {
6144 struct i40e_aq_desc desc;
6145 struct i40e_aqc_debug_dump_internals *cmd =
6146 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
6147 struct i40e_aqc_debug_dump_internals *resp =
6148 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
6149 enum i40e_status_code status;
6150
6151 if (buff_size == 0 || !buff)
6152 return I40E_ERR_PARAM;
6153
6154 i40e_fill_default_direct_cmd_desc(&desc,
6155 i40e_aqc_opc_debug_dump_internals);
6156 /* Indirect Command */
6157 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
6158 if (buff_size > I40E_AQ_LARGE_BUF)
6159 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6160
6161 cmd->cluster_id = cluster_id;
6162 cmd->table_id = table_id;
6163 cmd->idx = CPU_TO_LE32(start_index);
6164
6165 desc.datalen = CPU_TO_LE16(buff_size);
6166
6167 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
6168 if (!status) {
6169 if (ret_buff_size != NULL)
6170 *ret_buff_size = LE16_TO_CPU(desc.datalen);
6171 if (ret_next_table != NULL)
6172 *ret_next_table = resp->table_id;
6173 if (ret_next_index != NULL)
6174 *ret_next_index = LE32_TO_CPU(resp->idx);
6175 }
6176
6177 return status;
6178 }
6179
6180 /**
6181 * i40e_read_bw_from_alt_ram
6182 * @hw: pointer to the hardware structure
6183 * @max_bw: pointer for max_bw read
6184 * @min_bw: pointer for min_bw read
6185 * @min_valid: pointer for bool that is true if min_bw is a valid value
6186 * @max_valid: pointer for bool that is true if max_bw is a valid value
6187 *
6188 * Read bw from the alternate ram for the given pf
6189 **/
6190 enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
6191 u32 *max_bw, u32 *min_bw,
6192 bool *min_valid, bool *max_valid)
6193 {
6194 enum i40e_status_code status;
6195 u32 max_bw_addr, min_bw_addr;
6196
6197 /* Calculate the address of the min/max bw registers */
6198 max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
6199 I40E_ALT_STRUCT_MAX_BW_OFFSET +
6200 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
6201 min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
6202 I40E_ALT_STRUCT_MIN_BW_OFFSET +
6203 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
6204
6205 /* Read the bandwidths from alt ram */
6206 status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
6207 min_bw_addr, min_bw);
6208
6209 if (*min_bw & I40E_ALT_BW_VALID_MASK)
6210 *min_valid = true;
6211 else
6212 *min_valid = false;
6213
6214 if (*max_bw & I40E_ALT_BW_VALID_MASK)
6215 *max_valid = true;
6216 else
6217 *max_valid = false;
6218
6219 return status;
6220 }
6221
6222 /**
6223 * i40e_aq_configure_partition_bw
6224 * @hw: pointer to the hardware structure
6225 * @bw_data: Buffer holding valid pfs and bw limits
6226 * @cmd_details: pointer to command details
6227 *
6228 * Configure partitions guaranteed/max bw
6229 **/
6230 enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
6231 struct i40e_aqc_configure_partition_bw_data *bw_data,
6232 struct i40e_asq_cmd_details *cmd_details)
6233 {
6234 enum i40e_status_code status;
6235 struct i40e_aq_desc desc;
6236 u16 bwd_size = sizeof(*bw_data);
6237
6238 i40e_fill_default_direct_cmd_desc(&desc,
6239 i40e_aqc_opc_configure_partition_bw);
6240
6241 /* Indirect command */
6242 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
6243 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
6244
6245 desc.datalen = CPU_TO_LE16(bwd_size);
6246
6247 status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
6248
6249 return status;
6250 }
6251
6252 /**
6253 * i40e_read_phy_register_clause22
6254 * @hw: pointer to the HW structure
6255 * @reg: register address in the page
6256 * @phy_adr: PHY address on MDIO interface
6257 * @value: PHY register value
6258 *
6259 * Reads specified PHY register value
6260 **/
6261 enum i40e_status_code i40e_read_phy_register_clause22(struct i40e_hw *hw,
6262 u16 reg, u8 phy_addr, u16 *value)
6263 {
6264 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6265 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6266 u32 command = 0;
6267 u16 retry = 1000;
6268
6269 command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6270 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6271 (I40E_MDIO_CLAUSE22_OPCODE_READ_MASK) |
6272 (I40E_MDIO_CLAUSE22_STCODE_MASK) |
6273 (I40E_GLGEN_MSCA_MDICMD_MASK);
6274 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6275 do {
6276 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6277 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6278 status = I40E_SUCCESS;
6279 break;
6280 }
6281 i40e_usec_delay(10);
6282 retry--;
6283 } while (retry);
6284
6285 if (status) {
6286 i40e_debug(hw, I40E_DEBUG_PHY,
6287 "PHY: Can't write command to external PHY.\n");
6288 } else {
6289 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6290 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6291 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6292 }
6293
6294 return status;
6295 }
6296
6297 /**
6298 * i40e_write_phy_register_clause22
6299 * @hw: pointer to the HW structure
6300 * @reg: register address in the page
6301 * @phy_adr: PHY address on MDIO interface
6302 * @value: PHY register value
6303 *
6304 * Writes specified PHY register value
6305 **/
6306 enum i40e_status_code i40e_write_phy_register_clause22(struct i40e_hw *hw,
6307 u16 reg, u8 phy_addr, u16 value)
6308 {
6309 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6310 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6311 u32 command = 0;
6312 u16 retry = 1000;
6313
6314 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6315 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6316
6317 command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6318 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6319 (I40E_MDIO_CLAUSE22_OPCODE_WRITE_MASK) |
6320 (I40E_MDIO_CLAUSE22_STCODE_MASK) |
6321 (I40E_GLGEN_MSCA_MDICMD_MASK);
6322
6323 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6324 do {
6325 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6326 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6327 status = I40E_SUCCESS;
6328 break;
6329 }
6330 i40e_usec_delay(10);
6331 retry--;
6332 } while (retry);
6333
6334 return status;
6335 }
6336
6337 /**
6338 * i40e_read_phy_register_clause45
6339 * @hw: pointer to the HW structure
6340 * @page: registers page number
6341 * @reg: register address in the page
6342 * @phy_adr: PHY address on MDIO interface
6343 * @value: PHY register value
6344 *
6345 * Reads specified PHY register value
6346 **/
6347 enum i40e_status_code i40e_read_phy_register_clause45(struct i40e_hw *hw,
6348 u8 page, u16 reg, u8 phy_addr, u16 *value)
6349 {
6350 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6351 u32 command = 0;
6352 u16 retry = 1000;
6353 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6354
6355 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6356 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6357 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6358 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6359 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6360 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6361 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6362 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6363 do {
6364 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6365 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6366 status = I40E_SUCCESS;
6367 break;
6368 }
6369 i40e_usec_delay(10);
6370 retry--;
6371 } while (retry);
6372
6373 if (status) {
6374 i40e_debug(hw, I40E_DEBUG_PHY,
6375 "PHY: Can't write command to external PHY.\n");
6376 goto phy_read_end;
6377 }
6378
6379 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6380 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6381 (I40E_MDIO_CLAUSE45_OPCODE_READ_MASK) |
6382 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6383 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6384 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6385 status = I40E_ERR_TIMEOUT;
6386 retry = 1000;
6387 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6388 do {
6389 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6390 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6391 status = I40E_SUCCESS;
6392 break;
6393 }
6394 i40e_usec_delay(10);
6395 retry--;
6396 } while (retry);
6397
6398 if (!status) {
6399 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6400 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6401 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6402 } else {
6403 i40e_debug(hw, I40E_DEBUG_PHY,
6404 "PHY: Can't read register value from external PHY.\n");
6405 }
6406
6407 phy_read_end:
6408 return status;
6409 }
6410
6411 /**
6412 * i40e_write_phy_register_clause45
6413 * @hw: pointer to the HW structure
6414 * @page: registers page number
6415 * @reg: register address in the page
6416 * @phy_adr: PHY address on MDIO interface
6417 * @value: PHY register value
6418 *
6419 * Writes value to specified PHY register
6420 **/
6421 enum i40e_status_code i40e_write_phy_register_clause45(struct i40e_hw *hw,
6422 u8 page, u16 reg, u8 phy_addr, u16 value)
6423 {
6424 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6425 u32 command = 0;
6426 u16 retry = 1000;
6427 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6428
6429 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6430 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6431 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6432 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6433 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6434 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6435 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6436 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6437 do {
6438 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6439 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6440 status = I40E_SUCCESS;
6441 break;
6442 }
6443 i40e_usec_delay(10);
6444 retry--;
6445 } while (retry);
6446 if (status) {
6447 i40e_debug(hw, I40E_DEBUG_PHY,
6448 "PHY: Can't write command to external PHY.\n");
6449 goto phy_write_end;
6450 }
6451
6452 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6453 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6454
6455 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6456 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6457 (I40E_MDIO_CLAUSE45_OPCODE_WRITE_MASK) |
6458 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6459 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6460 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6461 status = I40E_ERR_TIMEOUT;
6462 retry = 1000;
6463 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6464 do {
6465 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6466 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6467 status = I40E_SUCCESS;
6468 break;
6469 }
6470 i40e_usec_delay(10);
6471 retry--;
6472 } while (retry);
6473
6474 phy_write_end:
6475 return status;
6476 }
6477
6478 /**
6479 * i40e_write_phy_register
6480 * @hw: pointer to the HW structure
6481 * @page: registers page number
6482 * @reg: register address in the page
6483 * @phy_adr: PHY address on MDIO interface
6484 * @value: PHY register value
6485 *
6486 * Writes value to specified PHY register
6487 **/
6488 enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
6489 u8 page, u16 reg, u8 phy_addr, u16 value)
6490 {
6491 enum i40e_status_code status;
6492
6493 switch (hw->device_id) {
6494 case I40E_DEV_ID_1G_BASE_T_X722:
6495 status = i40e_write_phy_register_clause22(hw,
6496 reg, phy_addr, value);
6497 break;
6498 case I40E_DEV_ID_10G_BASE_T:
6499 case I40E_DEV_ID_10G_BASE_T4:
6500 case I40E_DEV_ID_10G_BASE_T_X722:
6501 case I40E_DEV_ID_25G_B:
6502 case I40E_DEV_ID_25G_SFP28:
6503 status = i40e_write_phy_register_clause45(hw,
6504 page, reg, phy_addr, value);
6505 break;
6506 default:
6507 status = I40E_ERR_UNKNOWN_PHY;
6508 break;
6509 }
6510
6511 return status;
6512 }
6513
6514 /**
6515 * i40e_read_phy_register
6516 * @hw: pointer to the HW structure
6517 * @page: registers page number
6518 * @reg: register address in the page
6519 * @phy_adr: PHY address on MDIO interface
6520 * @value: PHY register value
6521 *
6522 * Reads specified PHY register value
6523 **/
6524 enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
6525 u8 page, u16 reg, u8 phy_addr, u16 *value)
6526 {
6527 enum i40e_status_code status;
6528
6529 switch (hw->device_id) {
6530 case I40E_DEV_ID_1G_BASE_T_X722:
6531 status = i40e_read_phy_register_clause22(hw, reg, phy_addr,
6532 value);
6533 break;
6534 case I40E_DEV_ID_10G_BASE_T:
6535 case I40E_DEV_ID_10G_BASE_T4:
6536 case I40E_DEV_ID_10G_BASE_T_X722:
6537 case I40E_DEV_ID_25G_B:
6538 case I40E_DEV_ID_25G_SFP28:
6539 status = i40e_read_phy_register_clause45(hw, page, reg,
6540 phy_addr, value);
6541 break;
6542 default:
6543 status = I40E_ERR_UNKNOWN_PHY;
6544 break;
6545 }
6546
6547 return status;
6548 }
6549
6550 /**
6551 * i40e_get_phy_address
6552 * @hw: pointer to the HW structure
6553 * @dev_num: PHY port num that address we want
6554 * @phy_addr: Returned PHY address
6555 *
6556 * Gets PHY address for current port
6557 **/
6558 u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num)
6559 {
6560 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6561 u32 reg_val = rd32(hw, I40E_GLGEN_MDIO_I2C_SEL(port_num));
6562
6563 return (u8)(reg_val >> ((dev_num + 1) * 5)) & 0x1f;
6564 }
6565
6566 /**
6567 * i40e_blink_phy_led
6568 * @hw: pointer to the HW structure
6569 * @time: time how long led will blinks in secs
6570 * @interval: gap between LED on and off in msecs
6571 *
6572 * Blinks PHY link LED
6573 **/
6574 enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
6575 u32 time, u32 interval)
6576 {
6577 enum i40e_status_code status = I40E_SUCCESS;
6578 u32 i;
6579 u16 led_ctl = 0;
6580 u16 gpio_led_port;
6581 u16 led_reg;
6582 u16 led_addr = I40E_PHY_LED_PROV_REG_1;
6583 u8 phy_addr = 0;
6584 u8 port_num;
6585
6586 i = rd32(hw, I40E_PFGEN_PORTNUM);
6587 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6588 phy_addr = i40e_get_phy_address(hw, port_num);
6589
6590 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6591 led_addr++) {
6592 status = i40e_read_phy_register_clause45(hw,
6593 I40E_PHY_COM_REG_PAGE,
6594 led_addr, phy_addr,
6595 &led_reg);
6596 if (status)
6597 goto phy_blinking_end;
6598 led_ctl = led_reg;
6599 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6600 led_reg = 0;
6601 status = i40e_write_phy_register_clause45(hw,
6602 I40E_PHY_COM_REG_PAGE,
6603 led_addr, phy_addr,
6604 led_reg);
6605 if (status)
6606 goto phy_blinking_end;
6607 break;
6608 }
6609 }
6610
6611 if (time > 0 && interval > 0) {
6612 for (i = 0; i < time * 1000; i += interval) {
6613 status = i40e_read_phy_register_clause45(hw,
6614 I40E_PHY_COM_REG_PAGE,
6615 led_addr, phy_addr, &led_reg);
6616 if (status)
6617 goto restore_config;
6618 if (led_reg & I40E_PHY_LED_MANUAL_ON)
6619 led_reg = 0;
6620 else
6621 led_reg = I40E_PHY_LED_MANUAL_ON;
6622 status = i40e_write_phy_register_clause45(hw,
6623 I40E_PHY_COM_REG_PAGE,
6624 led_addr, phy_addr, led_reg);
6625 if (status)
6626 goto restore_config;
6627 i40e_msec_delay(interval);
6628 }
6629 }
6630
6631 restore_config:
6632 status = i40e_write_phy_register_clause45(hw,
6633 I40E_PHY_COM_REG_PAGE,
6634 led_addr, phy_addr, led_ctl);
6635
6636 phy_blinking_end:
6637 return status;
6638 }
6639
6640 /**
6641 * i40e_led_get_phy - return current on/off mode
6642 * @hw: pointer to the hw struct
6643 * @led_addr: address of led register to use
6644 * @val: original value of register to use
6645 *
6646 **/
6647 enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
6648 u16 *val)
6649 {
6650 enum i40e_status_code status = I40E_SUCCESS;
6651 u16 gpio_led_port;
6652 u8 phy_addr = 0;
6653 u16 reg_val;
6654 u16 temp_addr;
6655 u8 port_num;
6656 u32 i;
6657
6658 temp_addr = I40E_PHY_LED_PROV_REG_1;
6659 i = rd32(hw, I40E_PFGEN_PORTNUM);
6660 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6661 phy_addr = i40e_get_phy_address(hw, port_num);
6662
6663 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6664 temp_addr++) {
6665 status = i40e_read_phy_register_clause45(hw,
6666 I40E_PHY_COM_REG_PAGE,
6667 temp_addr, phy_addr,
6668 &reg_val);
6669 if (status)
6670 return status;
6671 *val = reg_val;
6672 if (reg_val & I40E_PHY_LED_LINK_MODE_MASK) {
6673 *led_addr = temp_addr;
6674 break;
6675 }
6676 }
6677 return status;
6678 }
6679
6680 /**
6681 * i40e_led_set_phy
6682 * @hw: pointer to the HW structure
6683 * @on: true or false
6684 * @mode: original val plus bit for set or ignore
6685 * Set led's on or off when controlled by the PHY
6686 *
6687 **/
6688 enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
6689 u16 led_addr, u32 mode)
6690 {
6691 enum i40e_status_code status = I40E_SUCCESS;
6692 u16 led_ctl = 0;
6693 u16 led_reg = 0;
6694 u8 phy_addr = 0;
6695 u8 port_num;
6696 u32 i;
6697
6698 i = rd32(hw, I40E_PFGEN_PORTNUM);
6699 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6700 phy_addr = i40e_get_phy_address(hw, port_num);
6701 status = i40e_read_phy_register_clause45(hw, I40E_PHY_COM_REG_PAGE,
6702 led_addr, phy_addr, &led_reg);
6703 if (status)
6704 return status;
6705 led_ctl = led_reg;
6706 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6707 led_reg = 0;
6708 status = i40e_write_phy_register_clause45(hw,
6709 I40E_PHY_COM_REG_PAGE,
6710 led_addr, phy_addr,
6711 led_reg);
6712 if (status)
6713 return status;
6714 }
6715 status = i40e_read_phy_register_clause45(hw, I40E_PHY_COM_REG_PAGE,
6716 led_addr, phy_addr, &led_reg);
6717 if (status)
6718 goto restore_config;
6719 if (on)
6720 led_reg = I40E_PHY_LED_MANUAL_ON;
6721 else
6722 led_reg = 0;
6723 status = i40e_write_phy_register_clause45(hw, I40E_PHY_COM_REG_PAGE,
6724 led_addr, phy_addr, led_reg);
6725 if (status)
6726 goto restore_config;
6727 if (mode & I40E_PHY_LED_MODE_ORIG) {
6728 led_ctl = (mode & I40E_PHY_LED_MODE_MASK);
6729 status = i40e_write_phy_register_clause45(hw,
6730 I40E_PHY_COM_REG_PAGE,
6731 led_addr, phy_addr, led_ctl);
6732 }
6733 return status;
6734 restore_config:
6735 status = i40e_write_phy_register_clause45(hw, I40E_PHY_COM_REG_PAGE,
6736 led_addr, phy_addr, led_ctl);
6737 return status;
6738 }
6739 #endif /* PF_DRIVER */
6740
6741 /**
6742 * i40e_aq_rx_ctl_read_register - use FW to read from an Rx control register
6743 * @hw: pointer to the hw struct
6744 * @reg_addr: register address
6745 * @reg_val: ptr to register value
6746 * @cmd_details: pointer to command details structure or NULL
6747 *
6748 * Use the firmware to read the Rx control register,
6749 * especially useful if the Rx unit is under heavy pressure
6750 **/
6751 enum i40e_status_code i40e_aq_rx_ctl_read_register(struct i40e_hw *hw,
6752 u32 reg_addr, u32 *reg_val,
6753 struct i40e_asq_cmd_details *cmd_details)
6754 {
6755 struct i40e_aq_desc desc;
6756 struct i40e_aqc_rx_ctl_reg_read_write *cmd_resp =
6757 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6758 enum i40e_status_code status;
6759
6760 if (reg_val == NULL)
6761 return I40E_ERR_PARAM;
6762
6763 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_read);
6764
6765 cmd_resp->address = CPU_TO_LE32(reg_addr);
6766
6767 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6768
6769 if (status == I40E_SUCCESS)
6770 *reg_val = LE32_TO_CPU(cmd_resp->value);
6771
6772 return status;
6773 }
6774
6775 /**
6776 * i40e_read_rx_ctl - read from an Rx control register
6777 * @hw: pointer to the hw struct
6778 * @reg_addr: register address
6779 **/
6780 u32 i40e_read_rx_ctl(struct i40e_hw *hw, u32 reg_addr)
6781 {
6782 enum i40e_status_code status = I40E_SUCCESS;
6783 bool use_register;
6784 int retry = 5;
6785 u32 val = 0;
6786
6787 use_register = (((hw->aq.api_maj_ver == 1) &&
6788 (hw->aq.api_min_ver < 5)) ||
6789 (hw->mac.type == I40E_MAC_X722));
6790 if (!use_register) {
6791 do_retry:
6792 status = i40e_aq_rx_ctl_read_register(hw, reg_addr, &val, NULL);
6793 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6794 i40e_msec_delay(1);
6795 retry--;
6796 goto do_retry;
6797 }
6798 }
6799
6800 /* if the AQ access failed, try the old-fashioned way */
6801 if (status || use_register)
6802 val = rd32(hw, reg_addr);
6803
6804 return val;
6805 }
6806
6807 /**
6808 * i40e_aq_rx_ctl_write_register
6809 * @hw: pointer to the hw struct
6810 * @reg_addr: register address
6811 * @reg_val: register value
6812 * @cmd_details: pointer to command details structure or NULL
6813 *
6814 * Use the firmware to write to an Rx control register,
6815 * especially useful if the Rx unit is under heavy pressure
6816 **/
6817 enum i40e_status_code i40e_aq_rx_ctl_write_register(struct i40e_hw *hw,
6818 u32 reg_addr, u32 reg_val,
6819 struct i40e_asq_cmd_details *cmd_details)
6820 {
6821 struct i40e_aq_desc desc;
6822 struct i40e_aqc_rx_ctl_reg_read_write *cmd =
6823 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6824 enum i40e_status_code status;
6825
6826 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_write);
6827
6828 cmd->address = CPU_TO_LE32(reg_addr);
6829 cmd->value = CPU_TO_LE32(reg_val);
6830
6831 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6832
6833 return status;
6834 }
6835
6836 /**
6837 * i40e_write_rx_ctl - write to an Rx control register
6838 * @hw: pointer to the hw struct
6839 * @reg_addr: register address
6840 * @reg_val: register value
6841 **/
6842 void i40e_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val)
6843 {
6844 enum i40e_status_code status = I40E_SUCCESS;
6845 bool use_register;
6846 int retry = 5;
6847
6848 use_register = (((hw->aq.api_maj_ver == 1) &&
6849 (hw->aq.api_min_ver < 5)) ||
6850 (hw->mac.type == I40E_MAC_X722));
6851 if (!use_register) {
6852 do_retry:
6853 status = i40e_aq_rx_ctl_write_register(hw, reg_addr,
6854 reg_val, NULL);
6855 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6856 i40e_msec_delay(1);
6857 retry--;
6858 goto do_retry;
6859 }
6860 }
6861
6862 /* if the AQ access failed, try the old-fashioned way */
6863 if (status || use_register)
6864 wr32(hw, reg_addr, reg_val);
6865 }
6866 #ifdef VF_DRIVER
6867
6868 /**
6869 * i40e_aq_send_msg_to_pf
6870 * @hw: pointer to the hardware structure
6871 * @v_opcode: opcodes for VF-PF communication
6872 * @v_retval: return error code
6873 * @msg: pointer to the msg buffer
6874 * @msglen: msg length
6875 * @cmd_details: pointer to command details
6876 *
6877 * Send message to PF driver using admin queue. By default, this message
6878 * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for
6879 * completion before returning.
6880 **/
6881 enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
6882 enum i40e_virtchnl_ops v_opcode,
6883 enum i40e_status_code v_retval,
6884 u8 *msg, u16 msglen,
6885 struct i40e_asq_cmd_details *cmd_details)
6886 {
6887 struct i40e_aq_desc desc;
6888 struct i40e_asq_cmd_details details;
6889 enum i40e_status_code status;
6890
6891 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
6892 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
6893 desc.cookie_high = CPU_TO_LE32(v_opcode);
6894 desc.cookie_low = CPU_TO_LE32(v_retval);
6895 if (msglen) {
6896 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF
6897 | I40E_AQ_FLAG_RD));
6898 if (msglen > I40E_AQ_LARGE_BUF)
6899 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6900 desc.datalen = CPU_TO_LE16(msglen);
6901 }
6902 if (!cmd_details) {
6903 i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM);
6904 details.async = true;
6905 cmd_details = &details;
6906 }
6907 status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg,
6908 msglen, cmd_details);
6909 return status;
6910 }
6911
6912 /**
6913 * i40e_vf_parse_hw_config
6914 * @hw: pointer to the hardware structure
6915 * @msg: pointer to the virtual channel VF resource structure
6916 *
6917 * Given a VF resource message from the PF, populate the hw struct
6918 * with appropriate information.
6919 **/
6920 void i40e_vf_parse_hw_config(struct i40e_hw *hw,
6921 struct i40e_virtchnl_vf_resource *msg)
6922 {
6923 struct i40e_virtchnl_vsi_resource *vsi_res;
6924 int i;
6925
6926 vsi_res = &msg->vsi_res[0];
6927
6928 hw->dev_caps.num_vsis = msg->num_vsis;
6929 hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
6930 hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
6931 hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
6932 hw->dev_caps.dcb = msg->vf_offload_flags &
6933 I40E_VIRTCHNL_VF_OFFLOAD_L2;
6934 hw->dev_caps.fcoe = (msg->vf_offload_flags &
6935 I40E_VIRTCHNL_VF_OFFLOAD_FCOE) ? 1 : 0;
6936 hw->dev_caps.iwarp = (msg->vf_offload_flags &
6937 I40E_VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0;
6938 for (i = 0; i < msg->num_vsis; i++) {
6939 if (vsi_res->vsi_type == I40E_VSI_SRIOV) {
6940 i40e_memcpy(hw->mac.perm_addr,
6941 vsi_res->default_mac_addr,
6942 I40E_ETH_LENGTH_OF_ADDRESS,
6943 I40E_NONDMA_TO_NONDMA);
6944 i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
6945 I40E_ETH_LENGTH_OF_ADDRESS,
6946 I40E_NONDMA_TO_NONDMA);
6947 }
6948 vsi_res++;
6949 }
6950 }
6951
6952 /**
6953 * i40e_vf_reset
6954 * @hw: pointer to the hardware structure
6955 *
6956 * Send a VF_RESET message to the PF. Does not wait for response from PF
6957 * as none will be forthcoming. Immediately after calling this function,
6958 * the admin queue should be shut down and (optionally) reinitialized.
6959 **/
6960 enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw)
6961 {
6962 return i40e_aq_send_msg_to_pf(hw, I40E_VIRTCHNL_OP_RESET_VF,
6963 I40E_SUCCESS, NULL, 0, NULL);
6964 }
6965 #endif /* VF_DRIVER */
6966
6967 /**
6968 * i40e_aq_set_arp_proxy_config
6969 * @hw: pointer to the HW structure
6970 * @proxy_config - pointer to proxy config command table struct
6971 * @cmd_details: pointer to command details
6972 *
6973 * Set ARP offload parameters from pre-populated
6974 * i40e_aqc_arp_proxy_data struct
6975 **/
6976 enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
6977 struct i40e_aqc_arp_proxy_data *proxy_config,
6978 struct i40e_asq_cmd_details *cmd_details)
6979 {
6980 struct i40e_aq_desc desc;
6981 enum i40e_status_code status;
6982
6983 if (!proxy_config)
6984 return I40E_ERR_PARAM;
6985
6986 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_proxy_config);
6987
6988 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
6989 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
6990 desc.params.external.addr_high =
6991 CPU_TO_LE32(I40E_HI_DWORD((u64)proxy_config));
6992 desc.params.external.addr_low =
6993 CPU_TO_LE32(I40E_LO_DWORD((u64)proxy_config));
6994 desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_arp_proxy_data));
6995
6996 status = i40e_asq_send_command(hw, &desc, proxy_config,
6997 sizeof(struct i40e_aqc_arp_proxy_data),
6998 cmd_details);
6999
7000 return status;
7001 }
7002
7003 /**
7004 * i40e_aq_opc_set_ns_proxy_table_entry
7005 * @hw: pointer to the HW structure
7006 * @ns_proxy_table_entry: pointer to NS table entry command struct
7007 * @cmd_details: pointer to command details
7008 *
7009 * Set IPv6 Neighbor Solicitation (NS) protocol offload parameters
7010 * from pre-populated i40e_aqc_ns_proxy_data struct
7011 **/
7012 enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
7013 struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
7014 struct i40e_asq_cmd_details *cmd_details)
7015 {
7016 struct i40e_aq_desc desc;
7017 enum i40e_status_code status;
7018
7019 if (!ns_proxy_table_entry)
7020 return I40E_ERR_PARAM;
7021
7022 i40e_fill_default_direct_cmd_desc(&desc,
7023 i40e_aqc_opc_set_ns_proxy_table_entry);
7024
7025 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7026 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7027 desc.params.external.addr_high =
7028 CPU_TO_LE32(I40E_HI_DWORD((u64)ns_proxy_table_entry));
7029 desc.params.external.addr_low =
7030 CPU_TO_LE32(I40E_LO_DWORD((u64)ns_proxy_table_entry));
7031 desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_ns_proxy_data));
7032
7033 status = i40e_asq_send_command(hw, &desc, ns_proxy_table_entry,
7034 sizeof(struct i40e_aqc_ns_proxy_data),
7035 cmd_details);
7036
7037 return status;
7038 }
7039
7040 /**
7041 * i40e_aq_set_clear_wol_filter
7042 * @hw: pointer to the hw struct
7043 * @filter_index: index of filter to modify (0-7)
7044 * @filter: buffer containing filter to be set
7045 * @set_filter: true to set filter, false to clear filter
7046 * @no_wol_tco: if true, pass through packets cannot cause wake-up
7047 * if false, pass through packets may cause wake-up
7048 * @filter_valid: true if filter action is valid
7049 * @no_wol_tco_valid: true if no WoL in TCO traffic action valid
7050 * @cmd_details: pointer to command details structure or NULL
7051 *
7052 * Set or clear WoL filter for port attached to the PF
7053 **/
7054 enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
7055 u8 filter_index,
7056 struct i40e_aqc_set_wol_filter_data *filter,
7057 bool set_filter, bool no_wol_tco,
7058 bool filter_valid, bool no_wol_tco_valid,
7059 struct i40e_asq_cmd_details *cmd_details)
7060 {
7061 struct i40e_aq_desc desc;
7062 struct i40e_aqc_set_wol_filter *cmd =
7063 (struct i40e_aqc_set_wol_filter *)&desc.params.raw;
7064 enum i40e_status_code status;
7065 u16 cmd_flags = 0;
7066 u16 valid_flags = 0;
7067 u16 buff_len = 0;
7068
7069 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_wol_filter);
7070
7071 if (filter_index >= I40E_AQC_MAX_NUM_WOL_FILTERS)
7072 return I40E_ERR_PARAM;
7073 cmd->filter_index = CPU_TO_LE16(filter_index);
7074
7075 if (set_filter) {
7076 if (!filter)
7077 return I40E_ERR_PARAM;
7078
7079 cmd_flags |= I40E_AQC_SET_WOL_FILTER;
7080 cmd_flags |= I40E_AQC_SET_WOL_FILTER_WOL_PRESERVE_ON_PFR;
7081 }
7082
7083 if (no_wol_tco)
7084 cmd_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL;
7085 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
7086
7087 if (filter_valid)
7088 valid_flags |= I40E_AQC_SET_WOL_FILTER_ACTION_VALID;
7089 if (no_wol_tco_valid)
7090 valid_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID;
7091 cmd->valid_flags = CPU_TO_LE16(valid_flags);
7092
7093 buff_len = sizeof(*filter);
7094 desc.datalen = CPU_TO_LE16(buff_len);
7095
7096 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7097 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7098
7099 cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)filter));
7100 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)filter));
7101
7102 status = i40e_asq_send_command(hw, &desc, filter,
7103 buff_len, cmd_details);
7104
7105 return status;
7106 }
7107
7108 /**
7109 * i40e_aq_get_wake_event_reason
7110 * @hw: pointer to the hw struct
7111 * @wake_reason: return value, index of matching filter
7112 * @cmd_details: pointer to command details structure or NULL
7113 *
7114 * Get information for the reason of a Wake Up event
7115 **/
7116 enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
7117 u16 *wake_reason,
7118 struct i40e_asq_cmd_details *cmd_details)
7119 {
7120 struct i40e_aq_desc desc;
7121 struct i40e_aqc_get_wake_reason_completion *resp =
7122 (struct i40e_aqc_get_wake_reason_completion *)&desc.params.raw;
7123 enum i40e_status_code status;
7124
7125 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_wake_reason);
7126
7127 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7128
7129 if (status == I40E_SUCCESS)
7130 *wake_reason = LE16_TO_CPU(resp->wake_reason);
7131
7132 return status;
7133 }
7134
7135 /**
7136 * i40e_aq_clear_all_wol_filters
7137 * @hw: pointer to the hw struct
7138 * @cmd_details: pointer to command details structure or NULL
7139 *
7140 * Get information for the reason of a Wake Up event
7141 **/
7142 enum i40e_status_code i40e_aq_clear_all_wol_filters(struct i40e_hw *hw,
7143 struct i40e_asq_cmd_details *cmd_details)
7144 {
7145 struct i40e_aq_desc desc;
7146 enum i40e_status_code status;
7147
7148 i40e_fill_default_direct_cmd_desc(&desc,
7149 i40e_aqc_opc_clear_all_wol_filters);
7150
7151 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7152
7153 return status;
7154 }
7155
7156
7157 /**
7158 * i40e_aq_write_ddp - Write dynamic device personalization (ddp)
7159 * @hw: pointer to the hw struct
7160 * @buff: command buffer (size in bytes = buff_size)
7161 * @buff_size: buffer size in bytes
7162 * @track_id: package tracking id
7163 * @error_offset: returns error offset
7164 * @error_info: returns error information
7165 * @cmd_details: pointer to command details structure or NULL
7166 **/
7167 enum
7168 i40e_status_code i40e_aq_write_ddp(struct i40e_hw *hw, void *buff,
7169 u16 buff_size, u32 track_id,
7170 u32 *error_offset, u32 *error_info,
7171 struct i40e_asq_cmd_details *cmd_details)
7172 {
7173 struct i40e_aq_desc desc;
7174 struct i40e_aqc_write_personalization_profile *cmd =
7175 (struct i40e_aqc_write_personalization_profile *)
7176 &desc.params.raw;
7177 struct i40e_aqc_write_ddp_resp *resp;
7178 enum i40e_status_code status;
7179
7180 i40e_fill_default_direct_cmd_desc(&desc,
7181 i40e_aqc_opc_write_personalization_profile);
7182
7183 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
7184 if (buff_size > I40E_AQ_LARGE_BUF)
7185 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7186
7187 desc.datalen = CPU_TO_LE16(buff_size);
7188
7189 cmd->profile_track_id = CPU_TO_LE32(track_id);
7190
7191 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
7192 if (!status) {
7193 resp = (struct i40e_aqc_write_ddp_resp *)&desc.params.raw;
7194 if (error_offset)
7195 *error_offset = LE32_TO_CPU(resp->error_offset);
7196 if (error_info)
7197 *error_info = LE32_TO_CPU(resp->error_info);
7198 }
7199
7200 return status;
7201 }
7202
7203 /**
7204 * i40e_aq_get_ddp_list - Read dynamic device personalization (ddp)
7205 * @hw: pointer to the hw struct
7206 * @buff: command buffer (size in bytes = buff_size)
7207 * @buff_size: buffer size in bytes
7208 * @cmd_details: pointer to command details structure or NULL
7209 **/
7210 enum
7211 i40e_status_code i40e_aq_get_ddp_list(struct i40e_hw *hw, void *buff,
7212 u16 buff_size, u8 flags,
7213 struct i40e_asq_cmd_details *cmd_details)
7214 {
7215 struct i40e_aq_desc desc;
7216 struct i40e_aqc_get_applied_profiles *cmd =
7217 (struct i40e_aqc_get_applied_profiles *)&desc.params.raw;
7218 enum i40e_status_code status;
7219
7220 i40e_fill_default_direct_cmd_desc(&desc,
7221 i40e_aqc_opc_get_personalization_profile_list);
7222
7223 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7224 if (buff_size > I40E_AQ_LARGE_BUF)
7225 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7226 desc.datalen = CPU_TO_LE16(buff_size);
7227
7228 cmd->flags = flags;
7229
7230 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
7231
7232 return status;
7233 }
7234
7235 /**
7236 * i40e_find_segment_in_package
7237 * @segment_type: the segment type to search for (i.e., SEGMENT_TYPE_I40E)
7238 * @pkg_hdr: pointer to the package header to be searched
7239 *
7240 * This function searches a package file for a particular segment type. On
7241 * success it returns a pointer to the segment header, otherwise it will
7242 * return NULL.
7243 **/
7244 struct i40e_generic_seg_header *
7245 i40e_find_segment_in_package(u32 segment_type,
7246 struct i40e_package_header *pkg_hdr)
7247 {
7248 struct i40e_generic_seg_header *segment;
7249 u32 i;
7250
7251 /* Search all package segments for the requested segment type */
7252 for (i = 0; i < pkg_hdr->segment_count; i++) {
7253 segment =
7254 (struct i40e_generic_seg_header *)((u8 *)pkg_hdr +
7255 pkg_hdr->segment_offset[i]);
7256
7257 if (segment->type == segment_type)
7258 return segment;
7259 }
7260
7261 return NULL;
7262 }
7263
7264 /**
7265 * i40e_write_profile
7266 * @hw: pointer to the hardware structure
7267 * @profile: pointer to the profile segment of the package to be downloaded
7268 * @track_id: package tracking id
7269 *
7270 * Handles the download of a complete package.
7271 */
7272 enum i40e_status_code
7273 i40e_write_profile(struct i40e_hw *hw, struct i40e_profile_segment *profile,
7274 u32 track_id)
7275 {
7276 enum i40e_status_code status = I40E_SUCCESS;
7277 struct i40e_section_table *sec_tbl;
7278 struct i40e_profile_section_header *sec = NULL;
7279 u32 dev_cnt;
7280 u32 vendor_dev_id;
7281 u32 *nvm;
7282 u32 section_size = 0;
7283 u32 offset = 0, info = 0;
7284 u32 i;
7285
7286 if (!track_id) {
7287 i40e_debug(hw, I40E_DEBUG_PACKAGE, "Track_id can't be 0.");
7288 return I40E_NOT_SUPPORTED;
7289 }
7290
7291 dev_cnt = profile->device_table_count;
7292
7293 for (i = 0; i < dev_cnt; i++) {
7294 vendor_dev_id = profile->device_table[i].vendor_dev_id;
7295 if ((vendor_dev_id >> 16) == I40E_INTEL_VENDOR_ID)
7296 if (hw->device_id == (vendor_dev_id & 0xFFFF))
7297 break;
7298 }
7299 if (i == dev_cnt) {
7300 i40e_debug(hw, I40E_DEBUG_PACKAGE, "Device doesn't support DDP");
7301 return I40E_ERR_DEVICE_NOT_SUPPORTED;
7302 }
7303
7304 nvm = (u32 *)&profile->device_table[dev_cnt];
7305 sec_tbl = (struct i40e_section_table *)&nvm[nvm[0] + 1];
7306
7307 for (i = 0; i < sec_tbl->section_count; i++) {
7308 sec = (struct i40e_profile_section_header *)((u8 *)profile +
7309 sec_tbl->section_offset[i]);
7310
7311 /* Skip 'AQ', 'note' and 'name' sections */
7312 if (sec->section.type != SECTION_TYPE_MMIO)
7313 continue;
7314
7315 section_size = sec->section.size +
7316 sizeof(struct i40e_profile_section_header);
7317
7318 /* Write profile */
7319 status = i40e_aq_write_ddp(hw, (void *)sec, (u16)section_size,
7320 track_id, &offset, &info, NULL);
7321 if (status) {
7322 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7323 "Failed to write profile: offset %d, info %d",
7324 offset, info);
7325 break;
7326 }
7327 }
7328 return status;
7329 }
7330
7331 /**
7332 * i40e_add_pinfo_to_list
7333 * @hw: pointer to the hardware structure
7334 * @profile: pointer to the profile segment of the package
7335 * @profile_info_sec: buffer for information section
7336 * @track_id: package tracking id
7337 *
7338 * Register a profile to the list of loaded profiles.
7339 */
7340 enum i40e_status_code
7341 i40e_add_pinfo_to_list(struct i40e_hw *hw,
7342 struct i40e_profile_segment *profile,
7343 u8 *profile_info_sec, u32 track_id)
7344 {
7345 enum i40e_status_code status = I40E_SUCCESS;
7346 struct i40e_profile_section_header *sec = NULL;
7347 struct i40e_profile_info *pinfo;
7348 u32 offset = 0, info = 0;
7349
7350 sec = (struct i40e_profile_section_header *)profile_info_sec;
7351 sec->tbl_size = 1;
7352 sec->data_end = sizeof(struct i40e_profile_section_header) +
7353 sizeof(struct i40e_profile_info);
7354 sec->section.type = SECTION_TYPE_INFO;
7355 sec->section.offset = sizeof(struct i40e_profile_section_header);
7356 sec->section.size = sizeof(struct i40e_profile_info);
7357 pinfo = (struct i40e_profile_info *)(profile_info_sec +
7358 sec->section.offset);
7359 pinfo->track_id = track_id;
7360 pinfo->version = profile->version;
7361 pinfo->op = I40E_DDP_ADD_TRACKID;
7362 memcpy(pinfo->name, profile->name, I40E_DDP_NAME_SIZE);
7363
7364 status = i40e_aq_write_ddp(hw, (void *)sec, sec->data_end,
7365 track_id, &offset, &info, NULL);
7366 return status;
7367 }