1 /*******************************************************************************
3 Copyright (c) 2013 - 2015, Intel Corporation
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
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.
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.
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.
32 ***************************************************************************/
34 #include "i40e_type.h"
35 #include "i40e_adminq.h"
36 #include "i40e_prototype.h"
37 #include "i40e_virtchnl.h"
41 * i40e_set_mac_type - Sets MAC type
42 * @hw: pointer to the HW structure
44 * This function sets the mac type of the adapter based on the
45 * vendor ID and device ID stored in the hw structure.
47 #if defined(INTEGRATED_VF) || defined(VF_DRIVER)
48 enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
50 STATIC enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
53 enum i40e_status_code status = I40E_SUCCESS;
55 DEBUGFUNC("i40e_set_mac_type\n");
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;
75 #ifdef X722_A0_SUPPORT
76 case I40E_DEV_ID_X722_A0:
78 case I40E_DEV_ID_KX_X722:
79 case I40E_DEV_ID_QSFP_X722:
80 case I40E_DEV_ID_SFP_X722:
81 case I40E_DEV_ID_1G_BASE_T_X722:
82 case I40E_DEV_ID_10G_BASE_T_X722:
83 case I40E_DEV_ID_SFP_I_X722:
84 hw->mac.type = I40E_MAC_X722;
88 #if defined(INTEGRATED_VF) || defined(VF_DRIVER)
89 case I40E_DEV_ID_X722_VF:
90 case I40E_DEV_ID_X722_VF_HV:
91 #ifdef X722_A0_SUPPORT
92 case I40E_DEV_ID_X722_A0_VF:
94 hw->mac.type = I40E_MAC_X722_VF;
96 #endif /* INTEGRATED_VF || VF_DRIVER */
97 #endif /* X722_SUPPORT */
98 #if defined(INTEGRATED_VF) || defined(VF_DRIVER)
100 case I40E_DEV_ID_VF_HV:
101 hw->mac.type = I40E_MAC_VF;
105 hw->mac.type = I40E_MAC_GENERIC;
109 status = I40E_ERR_DEVICE_NOT_SUPPORTED;
112 DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n",
113 hw->mac.type, status);
117 #ifndef I40E_NDIS_SUPPORT
119 * i40e_aq_str - convert AQ err code to a string
120 * @hw: pointer to the HW structure
121 * @aq_err: the AQ error code to convert
123 const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err)
128 case I40E_AQ_RC_EPERM:
129 return "I40E_AQ_RC_EPERM";
130 case I40E_AQ_RC_ENOENT:
131 return "I40E_AQ_RC_ENOENT";
132 case I40E_AQ_RC_ESRCH:
133 return "I40E_AQ_RC_ESRCH";
134 case I40E_AQ_RC_EINTR:
135 return "I40E_AQ_RC_EINTR";
137 return "I40E_AQ_RC_EIO";
138 case I40E_AQ_RC_ENXIO:
139 return "I40E_AQ_RC_ENXIO";
140 case I40E_AQ_RC_E2BIG:
141 return "I40E_AQ_RC_E2BIG";
142 case I40E_AQ_RC_EAGAIN:
143 return "I40E_AQ_RC_EAGAIN";
144 case I40E_AQ_RC_ENOMEM:
145 return "I40E_AQ_RC_ENOMEM";
146 case I40E_AQ_RC_EACCES:
147 return "I40E_AQ_RC_EACCES";
148 case I40E_AQ_RC_EFAULT:
149 return "I40E_AQ_RC_EFAULT";
150 case I40E_AQ_RC_EBUSY:
151 return "I40E_AQ_RC_EBUSY";
152 case I40E_AQ_RC_EEXIST:
153 return "I40E_AQ_RC_EEXIST";
154 case I40E_AQ_RC_EINVAL:
155 return "I40E_AQ_RC_EINVAL";
156 case I40E_AQ_RC_ENOTTY:
157 return "I40E_AQ_RC_ENOTTY";
158 case I40E_AQ_RC_ENOSPC:
159 return "I40E_AQ_RC_ENOSPC";
160 case I40E_AQ_RC_ENOSYS:
161 return "I40E_AQ_RC_ENOSYS";
162 case I40E_AQ_RC_ERANGE:
163 return "I40E_AQ_RC_ERANGE";
164 case I40E_AQ_RC_EFLUSHED:
165 return "I40E_AQ_RC_EFLUSHED";
166 case I40E_AQ_RC_BAD_ADDR:
167 return "I40E_AQ_RC_BAD_ADDR";
168 case I40E_AQ_RC_EMODE:
169 return "I40E_AQ_RC_EMODE";
170 case I40E_AQ_RC_EFBIG:
171 return "I40E_AQ_RC_EFBIG";
174 snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
179 * i40e_stat_str - convert status err code to a string
180 * @hw: pointer to the HW structure
181 * @stat_err: the status error code to convert
183 const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err)
189 return "I40E_ERR_NVM";
190 case I40E_ERR_NVM_CHECKSUM:
191 return "I40E_ERR_NVM_CHECKSUM";
193 return "I40E_ERR_PHY";
194 case I40E_ERR_CONFIG:
195 return "I40E_ERR_CONFIG";
197 return "I40E_ERR_PARAM";
198 case I40E_ERR_MAC_TYPE:
199 return "I40E_ERR_MAC_TYPE";
200 case I40E_ERR_UNKNOWN_PHY:
201 return "I40E_ERR_UNKNOWN_PHY";
202 case I40E_ERR_LINK_SETUP:
203 return "I40E_ERR_LINK_SETUP";
204 case I40E_ERR_ADAPTER_STOPPED:
205 return "I40E_ERR_ADAPTER_STOPPED";
206 case I40E_ERR_INVALID_MAC_ADDR:
207 return "I40E_ERR_INVALID_MAC_ADDR";
208 case I40E_ERR_DEVICE_NOT_SUPPORTED:
209 return "I40E_ERR_DEVICE_NOT_SUPPORTED";
210 case I40E_ERR_MASTER_REQUESTS_PENDING:
211 return "I40E_ERR_MASTER_REQUESTS_PENDING";
212 case I40E_ERR_INVALID_LINK_SETTINGS:
213 return "I40E_ERR_INVALID_LINK_SETTINGS";
214 case I40E_ERR_AUTONEG_NOT_COMPLETE:
215 return "I40E_ERR_AUTONEG_NOT_COMPLETE";
216 case I40E_ERR_RESET_FAILED:
217 return "I40E_ERR_RESET_FAILED";
218 case I40E_ERR_SWFW_SYNC:
219 return "I40E_ERR_SWFW_SYNC";
220 case I40E_ERR_NO_AVAILABLE_VSI:
221 return "I40E_ERR_NO_AVAILABLE_VSI";
222 case I40E_ERR_NO_MEMORY:
223 return "I40E_ERR_NO_MEMORY";
224 case I40E_ERR_BAD_PTR:
225 return "I40E_ERR_BAD_PTR";
226 case I40E_ERR_RING_FULL:
227 return "I40E_ERR_RING_FULL";
228 case I40E_ERR_INVALID_PD_ID:
229 return "I40E_ERR_INVALID_PD_ID";
230 case I40E_ERR_INVALID_QP_ID:
231 return "I40E_ERR_INVALID_QP_ID";
232 case I40E_ERR_INVALID_CQ_ID:
233 return "I40E_ERR_INVALID_CQ_ID";
234 case I40E_ERR_INVALID_CEQ_ID:
235 return "I40E_ERR_INVALID_CEQ_ID";
236 case I40E_ERR_INVALID_AEQ_ID:
237 return "I40E_ERR_INVALID_AEQ_ID";
238 case I40E_ERR_INVALID_SIZE:
239 return "I40E_ERR_INVALID_SIZE";
240 case I40E_ERR_INVALID_ARP_INDEX:
241 return "I40E_ERR_INVALID_ARP_INDEX";
242 case I40E_ERR_INVALID_FPM_FUNC_ID:
243 return "I40E_ERR_INVALID_FPM_FUNC_ID";
244 case I40E_ERR_QP_INVALID_MSG_SIZE:
245 return "I40E_ERR_QP_INVALID_MSG_SIZE";
246 case I40E_ERR_QP_TOOMANY_WRS_POSTED:
247 return "I40E_ERR_QP_TOOMANY_WRS_POSTED";
248 case I40E_ERR_INVALID_FRAG_COUNT:
249 return "I40E_ERR_INVALID_FRAG_COUNT";
250 case I40E_ERR_QUEUE_EMPTY:
251 return "I40E_ERR_QUEUE_EMPTY";
252 case I40E_ERR_INVALID_ALIGNMENT:
253 return "I40E_ERR_INVALID_ALIGNMENT";
254 case I40E_ERR_FLUSHED_QUEUE:
255 return "I40E_ERR_FLUSHED_QUEUE";
256 case I40E_ERR_INVALID_PUSH_PAGE_INDEX:
257 return "I40E_ERR_INVALID_PUSH_PAGE_INDEX";
258 case I40E_ERR_INVALID_IMM_DATA_SIZE:
259 return "I40E_ERR_INVALID_IMM_DATA_SIZE";
260 case I40E_ERR_TIMEOUT:
261 return "I40E_ERR_TIMEOUT";
262 case I40E_ERR_OPCODE_MISMATCH:
263 return "I40E_ERR_OPCODE_MISMATCH";
264 case I40E_ERR_CQP_COMPL_ERROR:
265 return "I40E_ERR_CQP_COMPL_ERROR";
266 case I40E_ERR_INVALID_VF_ID:
267 return "I40E_ERR_INVALID_VF_ID";
268 case I40E_ERR_INVALID_HMCFN_ID:
269 return "I40E_ERR_INVALID_HMCFN_ID";
270 case I40E_ERR_BACKING_PAGE_ERROR:
271 return "I40E_ERR_BACKING_PAGE_ERROR";
272 case I40E_ERR_NO_PBLCHUNKS_AVAILABLE:
273 return "I40E_ERR_NO_PBLCHUNKS_AVAILABLE";
274 case I40E_ERR_INVALID_PBLE_INDEX:
275 return "I40E_ERR_INVALID_PBLE_INDEX";
276 case I40E_ERR_INVALID_SD_INDEX:
277 return "I40E_ERR_INVALID_SD_INDEX";
278 case I40E_ERR_INVALID_PAGE_DESC_INDEX:
279 return "I40E_ERR_INVALID_PAGE_DESC_INDEX";
280 case I40E_ERR_INVALID_SD_TYPE:
281 return "I40E_ERR_INVALID_SD_TYPE";
282 case I40E_ERR_MEMCPY_FAILED:
283 return "I40E_ERR_MEMCPY_FAILED";
284 case I40E_ERR_INVALID_HMC_OBJ_INDEX:
285 return "I40E_ERR_INVALID_HMC_OBJ_INDEX";
286 case I40E_ERR_INVALID_HMC_OBJ_COUNT:
287 return "I40E_ERR_INVALID_HMC_OBJ_COUNT";
288 case I40E_ERR_INVALID_SRQ_ARM_LIMIT:
289 return "I40E_ERR_INVALID_SRQ_ARM_LIMIT";
290 case I40E_ERR_SRQ_ENABLED:
291 return "I40E_ERR_SRQ_ENABLED";
292 case I40E_ERR_ADMIN_QUEUE_ERROR:
293 return "I40E_ERR_ADMIN_QUEUE_ERROR";
294 case I40E_ERR_ADMIN_QUEUE_TIMEOUT:
295 return "I40E_ERR_ADMIN_QUEUE_TIMEOUT";
296 case I40E_ERR_BUF_TOO_SHORT:
297 return "I40E_ERR_BUF_TOO_SHORT";
298 case I40E_ERR_ADMIN_QUEUE_FULL:
299 return "I40E_ERR_ADMIN_QUEUE_FULL";
300 case I40E_ERR_ADMIN_QUEUE_NO_WORK:
301 return "I40E_ERR_ADMIN_QUEUE_NO_WORK";
302 case I40E_ERR_BAD_IWARP_CQE:
303 return "I40E_ERR_BAD_IWARP_CQE";
304 case I40E_ERR_NVM_BLANK_MODE:
305 return "I40E_ERR_NVM_BLANK_MODE";
306 case I40E_ERR_NOT_IMPLEMENTED:
307 return "I40E_ERR_NOT_IMPLEMENTED";
308 case I40E_ERR_PE_DOORBELL_NOT_ENABLED:
309 return "I40E_ERR_PE_DOORBELL_NOT_ENABLED";
310 case I40E_ERR_DIAG_TEST_FAILED:
311 return "I40E_ERR_DIAG_TEST_FAILED";
312 case I40E_ERR_NOT_READY:
313 return "I40E_ERR_NOT_READY";
314 case I40E_NOT_SUPPORTED:
315 return "I40E_NOT_SUPPORTED";
316 case I40E_ERR_FIRMWARE_API_VERSION:
317 return "I40E_ERR_FIRMWARE_API_VERSION";
320 snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
324 #endif /* I40E_NDIS_SUPPORT */
327 * @hw: debug mask related to admin queue
329 * @desc: pointer to admin queue descriptor
330 * @buffer: pointer to command buffer
331 * @buf_len: max length of buffer
333 * Dumps debug log about adminq command with descriptor contents.
335 void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
336 void *buffer, u16 buf_len)
338 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
339 u16 len = LE16_TO_CPU(aq_desc->datalen);
340 u8 *buf = (u8 *)buffer;
343 if ((!(mask & hw->debug_mask)) || (desc == NULL))
347 "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
348 LE16_TO_CPU(aq_desc->opcode),
349 LE16_TO_CPU(aq_desc->flags),
350 LE16_TO_CPU(aq_desc->datalen),
351 LE16_TO_CPU(aq_desc->retval));
352 i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
353 LE32_TO_CPU(aq_desc->cookie_high),
354 LE32_TO_CPU(aq_desc->cookie_low));
355 i40e_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
356 LE32_TO_CPU(aq_desc->params.internal.param0),
357 LE32_TO_CPU(aq_desc->params.internal.param1));
358 i40e_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
359 LE32_TO_CPU(aq_desc->params.external.addr_high),
360 LE32_TO_CPU(aq_desc->params.external.addr_low));
362 if ((buffer != NULL) && (aq_desc->datalen != 0)) {
363 i40e_debug(hw, mask, "AQ CMD Buffer:\n");
366 /* write the full 16-byte chunks */
367 for (i = 0; i < (len - 16); i += 16)
369 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
370 i, buf[i], buf[i+1], buf[i+2], buf[i+3],
371 buf[i+4], buf[i+5], buf[i+6], buf[i+7],
372 buf[i+8], buf[i+9], buf[i+10], buf[i+11],
373 buf[i+12], buf[i+13], buf[i+14], buf[i+15]);
374 /* the most we could have left is 16 bytes, pad with zeros */
380 memset(d_buf, 0, sizeof(d_buf));
381 for (j = 0; i < len; j++, i++)
384 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
385 i_sav, d_buf[0], d_buf[1], d_buf[2], d_buf[3],
386 d_buf[4], d_buf[5], d_buf[6], d_buf[7],
387 d_buf[8], d_buf[9], d_buf[10], d_buf[11],
388 d_buf[12], d_buf[13], d_buf[14], d_buf[15]);
394 * i40e_check_asq_alive
395 * @hw: pointer to the hw struct
397 * Returns true if Queue is enabled else false.
399 bool i40e_check_asq_alive(struct i40e_hw *hw)
405 return !!(rd32(hw, hw->aq.asq.len) &
406 I40E_PF_ATQLEN_ATQENABLE_MASK);
408 return !!(rd32(hw, hw->aq.asq.len) &
409 I40E_PF_ATQLEN_ATQENABLE_MASK);
410 #endif /* INTEGRATED_VF */
411 #endif /* PF_DRIVER */
415 return !!(rd32(hw, hw->aq.asq.len) &
416 I40E_VF_ATQLEN1_ATQENABLE_MASK);
418 return !!(rd32(hw, hw->aq.asq.len) &
419 I40E_VF_ATQLEN1_ATQENABLE_MASK);
420 #endif /* INTEGRATED_VF */
421 #endif /* VF_DRIVER */
426 * i40e_aq_queue_shutdown
427 * @hw: pointer to the hw struct
428 * @unloading: is the driver unloading itself
430 * Tell the Firmware that we're shutting down the AdminQ and whether
431 * or not the driver is unloading as well.
433 enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
436 struct i40e_aq_desc desc;
437 struct i40e_aqc_queue_shutdown *cmd =
438 (struct i40e_aqc_queue_shutdown *)&desc.params.raw;
439 enum i40e_status_code status;
441 i40e_fill_default_direct_cmd_desc(&desc,
442 i40e_aqc_opc_queue_shutdown);
445 cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING);
446 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
453 * i40e_aq_get_set_rss_lut
454 * @hw: pointer to the hardware structure
455 * @vsi_id: vsi fw index
456 * @pf_lut: for PF table set true, for VSI table set false
457 * @lut: pointer to the lut buffer provided by the caller
458 * @lut_size: size of the lut buffer
459 * @set: set true to set the table, false to get the table
461 * Internal function to get or set RSS look up table
463 STATIC enum i40e_status_code i40e_aq_get_set_rss_lut(struct i40e_hw *hw,
464 u16 vsi_id, bool pf_lut,
465 u8 *lut, u16 lut_size,
468 enum i40e_status_code status;
469 struct i40e_aq_desc desc;
470 struct i40e_aqc_get_set_rss_lut *cmd_resp =
471 (struct i40e_aqc_get_set_rss_lut *)&desc.params.raw;
474 i40e_fill_default_direct_cmd_desc(&desc,
475 i40e_aqc_opc_set_rss_lut);
477 i40e_fill_default_direct_cmd_desc(&desc,
478 i40e_aqc_opc_get_rss_lut);
480 /* Indirect command */
481 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
482 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
485 CPU_TO_LE16((u16)((vsi_id <<
486 I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
487 I40E_AQC_SET_RSS_LUT_VSI_ID_MASK));
488 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_LUT_VSI_VALID);
491 cmd_resp->flags |= CPU_TO_LE16((u16)
492 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
493 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
494 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
496 cmd_resp->flags |= CPU_TO_LE16((u16)
497 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
498 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
499 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
501 status = i40e_asq_send_command(hw, &desc, lut, lut_size, NULL);
507 * i40e_aq_get_rss_lut
508 * @hw: pointer to the hardware structure
509 * @vsi_id: vsi fw index
510 * @pf_lut: for PF table set true, for VSI table set false
511 * @lut: pointer to the lut buffer provided by the caller
512 * @lut_size: size of the lut buffer
514 * get the RSS lookup table, PF or VSI type
516 enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 vsi_id,
517 bool pf_lut, u8 *lut, u16 lut_size)
519 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
524 * i40e_aq_set_rss_lut
525 * @hw: pointer to the hardware structure
526 * @vsi_id: vsi fw index
527 * @pf_lut: for PF table set true, for VSI table set false
528 * @lut: pointer to the lut buffer provided by the caller
529 * @lut_size: size of the lut buffer
531 * set the RSS lookup table, PF or VSI type
533 enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 vsi_id,
534 bool pf_lut, u8 *lut, u16 lut_size)
536 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, true);
540 * i40e_aq_get_set_rss_key
541 * @hw: pointer to the hw struct
542 * @vsi_id: vsi fw index
543 * @key: pointer to key info struct
544 * @set: set true to set the key, false to get the key
546 * get the RSS key per VSI
548 STATIC enum i40e_status_code i40e_aq_get_set_rss_key(struct i40e_hw *hw,
550 struct i40e_aqc_get_set_rss_key_data *key,
553 enum i40e_status_code status;
554 struct i40e_aq_desc desc;
555 struct i40e_aqc_get_set_rss_key *cmd_resp =
556 (struct i40e_aqc_get_set_rss_key *)&desc.params.raw;
557 u16 key_size = sizeof(struct i40e_aqc_get_set_rss_key_data);
560 i40e_fill_default_direct_cmd_desc(&desc,
561 i40e_aqc_opc_set_rss_key);
563 i40e_fill_default_direct_cmd_desc(&desc,
564 i40e_aqc_opc_get_rss_key);
566 /* Indirect command */
567 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
568 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
571 CPU_TO_LE16((u16)((vsi_id <<
572 I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
573 I40E_AQC_SET_RSS_KEY_VSI_ID_MASK));
574 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_KEY_VSI_VALID);
576 status = i40e_asq_send_command(hw, &desc, key, key_size, NULL);
582 * i40e_aq_get_rss_key
583 * @hw: pointer to the hw struct
584 * @vsi_id: vsi fw index
585 * @key: pointer to key info struct
588 enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
590 struct i40e_aqc_get_set_rss_key_data *key)
592 return i40e_aq_get_set_rss_key(hw, vsi_id, key, false);
596 * i40e_aq_set_rss_key
597 * @hw: pointer to the hw struct
598 * @vsi_id: vsi fw index
599 * @key: pointer to key info struct
601 * set the RSS key per VSI
603 enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
605 struct i40e_aqc_get_set_rss_key_data *key)
607 return i40e_aq_get_set_rss_key(hw, vsi_id, key, true);
609 #endif /* X722_SUPPORT */
611 /* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
612 * hardware to a bit-field that can be used by SW to more easily determine the
615 * Macros are used to shorten the table lines and make this table human
618 * We store the PTYPE in the top byte of the bit field - this is just so that
619 * we can check that the table doesn't have a row missing, as the index into
620 * the table should be the PTYPE.
624 * IF NOT i40e_ptype_lookup[ptype].known
627 * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
628 * Use the rest of the fields to look at the tunnels, inner protocols, etc
630 * Use the enum i40e_rx_l2_ptype to decode the packet type
634 /* macro to make the table lines short */
635 #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
638 I40E_RX_PTYPE_OUTER_##OUTER_IP, \
639 I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \
640 I40E_RX_PTYPE_##OUTER_FRAG, \
641 I40E_RX_PTYPE_TUNNEL_##T, \
642 I40E_RX_PTYPE_TUNNEL_END_##TE, \
643 I40E_RX_PTYPE_##TEF, \
644 I40E_RX_PTYPE_INNER_PROT_##I, \
645 I40E_RX_PTYPE_PAYLOAD_LAYER_##PL }
647 #define I40E_PTT_UNUSED_ENTRY(PTYPE) \
648 { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
650 /* shorter macros makes the table fit but are terse */
651 #define I40E_RX_PTYPE_NOF I40E_RX_PTYPE_NOT_FRAG
652 #define I40E_RX_PTYPE_FRG I40E_RX_PTYPE_FRAG
653 #define I40E_RX_PTYPE_INNER_PROT_TS I40E_RX_PTYPE_INNER_PROT_TIMESYNC
655 /* Lookup table mapping the HW PTYPE to the bit field for decoding */
656 struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
657 /* L2 Packet types */
658 I40E_PTT_UNUSED_ENTRY(0),
659 I40E_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
660 I40E_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2),
661 I40E_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
662 I40E_PTT_UNUSED_ENTRY(4),
663 I40E_PTT_UNUSED_ENTRY(5),
664 I40E_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
665 I40E_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
666 I40E_PTT_UNUSED_ENTRY(8),
667 I40E_PTT_UNUSED_ENTRY(9),
668 I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
669 I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
670 I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
671 I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
672 I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
673 I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
674 I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
675 I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
676 I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
677 I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
678 I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
679 I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
681 /* Non Tunneled IPv4 */
682 I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
683 I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
684 I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4),
685 I40E_PTT_UNUSED_ENTRY(25),
686 I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4),
687 I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
688 I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
691 I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
692 I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
693 I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
694 I40E_PTT_UNUSED_ENTRY(32),
695 I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
696 I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
697 I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
700 I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
701 I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
702 I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
703 I40E_PTT_UNUSED_ENTRY(39),
704 I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
705 I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
706 I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
708 /* IPv4 --> GRE/NAT */
709 I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
711 /* IPv4 --> GRE/NAT --> IPv4 */
712 I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
713 I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
714 I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
715 I40E_PTT_UNUSED_ENTRY(47),
716 I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
717 I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
718 I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
720 /* IPv4 --> GRE/NAT --> IPv6 */
721 I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
722 I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
723 I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
724 I40E_PTT_UNUSED_ENTRY(54),
725 I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
726 I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
727 I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
729 /* IPv4 --> GRE/NAT --> MAC */
730 I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
732 /* IPv4 --> GRE/NAT --> MAC --> IPv4 */
733 I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
734 I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
735 I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
736 I40E_PTT_UNUSED_ENTRY(62),
737 I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
738 I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
739 I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
741 /* IPv4 --> GRE/NAT -> MAC --> IPv6 */
742 I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
743 I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
744 I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
745 I40E_PTT_UNUSED_ENTRY(69),
746 I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
747 I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
748 I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
750 /* IPv4 --> GRE/NAT --> MAC/VLAN */
751 I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
753 /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
754 I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
755 I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
756 I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
757 I40E_PTT_UNUSED_ENTRY(77),
758 I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
759 I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
760 I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
762 /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
763 I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
764 I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
765 I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
766 I40E_PTT_UNUSED_ENTRY(84),
767 I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
768 I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
769 I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
771 /* Non Tunneled IPv6 */
772 I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
773 I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
774 I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY4),
775 I40E_PTT_UNUSED_ENTRY(91),
776 I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
777 I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
778 I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
781 I40E_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
782 I40E_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
783 I40E_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
784 I40E_PTT_UNUSED_ENTRY(98),
785 I40E_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
786 I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
787 I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
790 I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
791 I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
792 I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
793 I40E_PTT_UNUSED_ENTRY(105),
794 I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
795 I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
796 I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
798 /* IPv6 --> GRE/NAT */
799 I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
801 /* IPv6 --> GRE/NAT -> IPv4 */
802 I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
803 I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
804 I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
805 I40E_PTT_UNUSED_ENTRY(113),
806 I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
807 I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
808 I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
810 /* IPv6 --> GRE/NAT -> IPv6 */
811 I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
812 I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
813 I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
814 I40E_PTT_UNUSED_ENTRY(120),
815 I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
816 I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
817 I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
819 /* IPv6 --> GRE/NAT -> MAC */
820 I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
822 /* IPv6 --> GRE/NAT -> MAC -> IPv4 */
823 I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
824 I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
825 I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
826 I40E_PTT_UNUSED_ENTRY(128),
827 I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
828 I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
829 I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
831 /* IPv6 --> GRE/NAT -> MAC -> IPv6 */
832 I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
833 I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
834 I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
835 I40E_PTT_UNUSED_ENTRY(135),
836 I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
837 I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
838 I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
840 /* IPv6 --> GRE/NAT -> MAC/VLAN */
841 I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
843 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
844 I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
845 I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
846 I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
847 I40E_PTT_UNUSED_ENTRY(143),
848 I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
849 I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
850 I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
852 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
853 I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
854 I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
855 I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
856 I40E_PTT_UNUSED_ENTRY(150),
857 I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
858 I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
859 I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
862 I40E_PTT_UNUSED_ENTRY(154),
863 I40E_PTT_UNUSED_ENTRY(155),
864 I40E_PTT_UNUSED_ENTRY(156),
865 I40E_PTT_UNUSED_ENTRY(157),
866 I40E_PTT_UNUSED_ENTRY(158),
867 I40E_PTT_UNUSED_ENTRY(159),
869 I40E_PTT_UNUSED_ENTRY(160),
870 I40E_PTT_UNUSED_ENTRY(161),
871 I40E_PTT_UNUSED_ENTRY(162),
872 I40E_PTT_UNUSED_ENTRY(163),
873 I40E_PTT_UNUSED_ENTRY(164),
874 I40E_PTT_UNUSED_ENTRY(165),
875 I40E_PTT_UNUSED_ENTRY(166),
876 I40E_PTT_UNUSED_ENTRY(167),
877 I40E_PTT_UNUSED_ENTRY(168),
878 I40E_PTT_UNUSED_ENTRY(169),
880 I40E_PTT_UNUSED_ENTRY(170),
881 I40E_PTT_UNUSED_ENTRY(171),
882 I40E_PTT_UNUSED_ENTRY(172),
883 I40E_PTT_UNUSED_ENTRY(173),
884 I40E_PTT_UNUSED_ENTRY(174),
885 I40E_PTT_UNUSED_ENTRY(175),
886 I40E_PTT_UNUSED_ENTRY(176),
887 I40E_PTT_UNUSED_ENTRY(177),
888 I40E_PTT_UNUSED_ENTRY(178),
889 I40E_PTT_UNUSED_ENTRY(179),
891 I40E_PTT_UNUSED_ENTRY(180),
892 I40E_PTT_UNUSED_ENTRY(181),
893 I40E_PTT_UNUSED_ENTRY(182),
894 I40E_PTT_UNUSED_ENTRY(183),
895 I40E_PTT_UNUSED_ENTRY(184),
896 I40E_PTT_UNUSED_ENTRY(185),
897 I40E_PTT_UNUSED_ENTRY(186),
898 I40E_PTT_UNUSED_ENTRY(187),
899 I40E_PTT_UNUSED_ENTRY(188),
900 I40E_PTT_UNUSED_ENTRY(189),
902 I40E_PTT_UNUSED_ENTRY(190),
903 I40E_PTT_UNUSED_ENTRY(191),
904 I40E_PTT_UNUSED_ENTRY(192),
905 I40E_PTT_UNUSED_ENTRY(193),
906 I40E_PTT_UNUSED_ENTRY(194),
907 I40E_PTT_UNUSED_ENTRY(195),
908 I40E_PTT_UNUSED_ENTRY(196),
909 I40E_PTT_UNUSED_ENTRY(197),
910 I40E_PTT_UNUSED_ENTRY(198),
911 I40E_PTT_UNUSED_ENTRY(199),
913 I40E_PTT_UNUSED_ENTRY(200),
914 I40E_PTT_UNUSED_ENTRY(201),
915 I40E_PTT_UNUSED_ENTRY(202),
916 I40E_PTT_UNUSED_ENTRY(203),
917 I40E_PTT_UNUSED_ENTRY(204),
918 I40E_PTT_UNUSED_ENTRY(205),
919 I40E_PTT_UNUSED_ENTRY(206),
920 I40E_PTT_UNUSED_ENTRY(207),
921 I40E_PTT_UNUSED_ENTRY(208),
922 I40E_PTT_UNUSED_ENTRY(209),
924 I40E_PTT_UNUSED_ENTRY(210),
925 I40E_PTT_UNUSED_ENTRY(211),
926 I40E_PTT_UNUSED_ENTRY(212),
927 I40E_PTT_UNUSED_ENTRY(213),
928 I40E_PTT_UNUSED_ENTRY(214),
929 I40E_PTT_UNUSED_ENTRY(215),
930 I40E_PTT_UNUSED_ENTRY(216),
931 I40E_PTT_UNUSED_ENTRY(217),
932 I40E_PTT_UNUSED_ENTRY(218),
933 I40E_PTT_UNUSED_ENTRY(219),
935 I40E_PTT_UNUSED_ENTRY(220),
936 I40E_PTT_UNUSED_ENTRY(221),
937 I40E_PTT_UNUSED_ENTRY(222),
938 I40E_PTT_UNUSED_ENTRY(223),
939 I40E_PTT_UNUSED_ENTRY(224),
940 I40E_PTT_UNUSED_ENTRY(225),
941 I40E_PTT_UNUSED_ENTRY(226),
942 I40E_PTT_UNUSED_ENTRY(227),
943 I40E_PTT_UNUSED_ENTRY(228),
944 I40E_PTT_UNUSED_ENTRY(229),
946 I40E_PTT_UNUSED_ENTRY(230),
947 I40E_PTT_UNUSED_ENTRY(231),
948 I40E_PTT_UNUSED_ENTRY(232),
949 I40E_PTT_UNUSED_ENTRY(233),
950 I40E_PTT_UNUSED_ENTRY(234),
951 I40E_PTT_UNUSED_ENTRY(235),
952 I40E_PTT_UNUSED_ENTRY(236),
953 I40E_PTT_UNUSED_ENTRY(237),
954 I40E_PTT_UNUSED_ENTRY(238),
955 I40E_PTT_UNUSED_ENTRY(239),
957 I40E_PTT_UNUSED_ENTRY(240),
958 I40E_PTT_UNUSED_ENTRY(241),
959 I40E_PTT_UNUSED_ENTRY(242),
960 I40E_PTT_UNUSED_ENTRY(243),
961 I40E_PTT_UNUSED_ENTRY(244),
962 I40E_PTT_UNUSED_ENTRY(245),
963 I40E_PTT_UNUSED_ENTRY(246),
964 I40E_PTT_UNUSED_ENTRY(247),
965 I40E_PTT_UNUSED_ENTRY(248),
966 I40E_PTT_UNUSED_ENTRY(249),
968 I40E_PTT_UNUSED_ENTRY(250),
969 I40E_PTT_UNUSED_ENTRY(251),
970 I40E_PTT_UNUSED_ENTRY(252),
971 I40E_PTT_UNUSED_ENTRY(253),
972 I40E_PTT_UNUSED_ENTRY(254),
973 I40E_PTT_UNUSED_ENTRY(255)
978 * i40e_validate_mac_addr - Validate unicast MAC address
979 * @mac_addr: pointer to MAC address
981 * Tests a MAC address to ensure it is a valid Individual Address
983 enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
985 enum i40e_status_code status = I40E_SUCCESS;
987 DEBUGFUNC("i40e_validate_mac_addr");
989 /* Broadcast addresses ARE multicast addresses
990 * Make sure it is not a multicast address
991 * Reject the zero address
993 if (I40E_IS_MULTICAST(mac_addr) ||
994 (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
995 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
996 status = I40E_ERR_INVALID_MAC_ADDR;
1003 * i40e_init_shared_code - Initialize the shared code
1004 * @hw: pointer to hardware structure
1006 * This assigns the MAC type and PHY code and inits the NVM.
1007 * Does not touch the hardware. This function must be called prior to any
1008 * other function in the shared code. The i40e_hw structure should be
1009 * memset to 0 prior to calling this function. The following fields in
1010 * hw structure should be filled in prior to calling this function:
1011 * hw_addr, back, device_id, vendor_id, subsystem_device_id,
1012 * subsystem_vendor_id, and revision_id
1014 enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
1016 enum i40e_status_code status = I40E_SUCCESS;
1017 u32 port, ari, func_rid;
1019 DEBUGFUNC("i40e_init_shared_code");
1021 i40e_set_mac_type(hw);
1023 switch (hw->mac.type) {
1024 case I40E_MAC_XL710:
1030 return I40E_ERR_DEVICE_NOT_SUPPORTED;
1033 hw->phy.get_link_info = true;
1035 /* Determine port number and PF number*/
1036 port = (rd32(hw, I40E_PFGEN_PORTNUM) & I40E_PFGEN_PORTNUM_PORT_NUM_MASK)
1037 >> I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT;
1038 hw->port = (u8)port;
1039 ari = (rd32(hw, I40E_GLPCI_CAPSUP) & I40E_GLPCI_CAPSUP_ARI_EN_MASK) >>
1040 I40E_GLPCI_CAPSUP_ARI_EN_SHIFT;
1041 func_rid = rd32(hw, I40E_PF_FUNC_RID);
1043 hw->pf_id = (u8)(func_rid & 0xff);
1045 hw->pf_id = (u8)(func_rid & 0x7);
1048 if (hw->mac.type == I40E_MAC_X722)
1049 hw->flags |= I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE;
1052 status = i40e_init_nvm(hw);
1057 * i40e_aq_mac_address_read - Retrieve the MAC addresses
1058 * @hw: pointer to the hw struct
1059 * @flags: a return indicator of what addresses were added to the addr store
1060 * @addrs: the requestor's mac addr store
1061 * @cmd_details: pointer to command details structure or NULL
1063 STATIC enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw,
1065 struct i40e_aqc_mac_address_read_data *addrs,
1066 struct i40e_asq_cmd_details *cmd_details)
1068 struct i40e_aq_desc desc;
1069 struct i40e_aqc_mac_address_read *cmd_data =
1070 (struct i40e_aqc_mac_address_read *)&desc.params.raw;
1071 enum i40e_status_code status;
1073 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
1074 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
1076 status = i40e_asq_send_command(hw, &desc, addrs,
1077 sizeof(*addrs), cmd_details);
1078 *flags = LE16_TO_CPU(cmd_data->command_flags);
1084 * i40e_aq_mac_address_write - Change the MAC addresses
1085 * @hw: pointer to the hw struct
1086 * @flags: indicates which MAC to be written
1087 * @mac_addr: address to write
1088 * @cmd_details: pointer to command details structure or NULL
1090 enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
1091 u16 flags, u8 *mac_addr,
1092 struct i40e_asq_cmd_details *cmd_details)
1094 struct i40e_aq_desc desc;
1095 struct i40e_aqc_mac_address_write *cmd_data =
1096 (struct i40e_aqc_mac_address_write *)&desc.params.raw;
1097 enum i40e_status_code status;
1099 i40e_fill_default_direct_cmd_desc(&desc,
1100 i40e_aqc_opc_mac_address_write);
1101 cmd_data->command_flags = CPU_TO_LE16(flags);
1102 cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]);
1103 cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) |
1104 ((u32)mac_addr[3] << 16) |
1105 ((u32)mac_addr[4] << 8) |
1108 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1114 * i40e_get_mac_addr - get MAC address
1115 * @hw: pointer to the HW structure
1116 * @mac_addr: pointer to MAC address
1118 * Reads the adapter's MAC address from register
1120 enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1122 struct i40e_aqc_mac_address_read_data addrs;
1123 enum i40e_status_code status;
1126 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1128 if (flags & I40E_AQC_LAN_ADDR_VALID)
1129 memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac));
1135 * i40e_get_port_mac_addr - get Port MAC address
1136 * @hw: pointer to the HW structure
1137 * @mac_addr: pointer to Port MAC address
1139 * Reads the adapter's Port MAC address
1141 enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1143 struct i40e_aqc_mac_address_read_data addrs;
1144 enum i40e_status_code status;
1147 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1151 if (flags & I40E_AQC_PORT_ADDR_VALID)
1152 memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac));
1154 status = I40E_ERR_INVALID_MAC_ADDR;
1160 * i40e_pre_tx_queue_cfg - pre tx queue configure
1161 * @hw: pointer to the HW structure
1162 * @queue: target pf queue index
1163 * @enable: state change request
1165 * Handles hw requirement to indicate intention to enable
1166 * or disable target queue.
1168 void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable)
1170 u32 abs_queue_idx = hw->func_caps.base_queue + queue;
1174 if (abs_queue_idx >= 128) {
1175 reg_block = abs_queue_idx / 128;
1176 abs_queue_idx %= 128;
1179 reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1180 reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1181 reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1184 reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK;
1186 reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1188 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val);
1192 * i40e_read_pba_string - Reads part number string from EEPROM
1193 * @hw: pointer to hardware structure
1194 * @pba_num: stores the part number string from the EEPROM
1195 * @pba_num_size: part number string buffer length
1197 * Reads the part number string from the EEPROM.
1199 enum i40e_status_code i40e_read_pba_string(struct i40e_hw *hw, u8 *pba_num,
1202 enum i40e_status_code status = I40E_SUCCESS;
1208 status = i40e_read_nvm_word(hw, I40E_SR_PBA_FLAGS, &pba_word);
1209 if ((status != I40E_SUCCESS) || (pba_word != 0xFAFA)) {
1210 DEBUGOUT("Failed to read PBA flags or flag is invalid.\n");
1214 status = i40e_read_nvm_word(hw, I40E_SR_PBA_BLOCK_PTR, &pba_ptr);
1215 if (status != I40E_SUCCESS) {
1216 DEBUGOUT("Failed to read PBA Block pointer.\n");
1220 status = i40e_read_nvm_word(hw, pba_ptr, &pba_size);
1221 if (status != I40E_SUCCESS) {
1222 DEBUGOUT("Failed to read PBA Block size.\n");
1226 /* Subtract one to get PBA word count (PBA Size word is included in
1230 if (pba_num_size < (((u32)pba_size * 2) + 1)) {
1231 DEBUGOUT("Buffer to small for PBA data.\n");
1232 return I40E_ERR_PARAM;
1235 for (i = 0; i < pba_size; i++) {
1236 status = i40e_read_nvm_word(hw, (pba_ptr + 1) + i, &pba_word);
1237 if (status != I40E_SUCCESS) {
1238 DEBUGOUT1("Failed to read PBA Block word %d.\n", i);
1242 pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
1243 pba_num[(i * 2) + 1] = pba_word & 0xFF;
1245 pba_num[(pba_size * 2)] = '\0';
1251 * i40e_get_media_type - Gets media type
1252 * @hw: pointer to the hardware structure
1254 STATIC enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
1256 enum i40e_media_type media;
1258 switch (hw->phy.link_info.phy_type) {
1259 case I40E_PHY_TYPE_10GBASE_SR:
1260 case I40E_PHY_TYPE_10GBASE_LR:
1261 case I40E_PHY_TYPE_1000BASE_SX:
1262 case I40E_PHY_TYPE_1000BASE_LX:
1263 case I40E_PHY_TYPE_40GBASE_SR4:
1264 case I40E_PHY_TYPE_40GBASE_LR4:
1265 media = I40E_MEDIA_TYPE_FIBER;
1267 case I40E_PHY_TYPE_100BASE_TX:
1268 case I40E_PHY_TYPE_1000BASE_T:
1269 case I40E_PHY_TYPE_10GBASE_T:
1270 media = I40E_MEDIA_TYPE_BASET;
1272 case I40E_PHY_TYPE_10GBASE_CR1_CU:
1273 case I40E_PHY_TYPE_40GBASE_CR4_CU:
1274 case I40E_PHY_TYPE_10GBASE_CR1:
1275 case I40E_PHY_TYPE_40GBASE_CR4:
1276 case I40E_PHY_TYPE_10GBASE_SFPP_CU:
1277 case I40E_PHY_TYPE_40GBASE_AOC:
1278 case I40E_PHY_TYPE_10GBASE_AOC:
1279 media = I40E_MEDIA_TYPE_DA;
1281 case I40E_PHY_TYPE_1000BASE_KX:
1282 case I40E_PHY_TYPE_10GBASE_KX4:
1283 case I40E_PHY_TYPE_10GBASE_KR:
1284 case I40E_PHY_TYPE_40GBASE_KR4:
1285 case I40E_PHY_TYPE_20GBASE_KR2:
1286 media = I40E_MEDIA_TYPE_BACKPLANE;
1288 case I40E_PHY_TYPE_SGMII:
1289 case I40E_PHY_TYPE_XAUI:
1290 case I40E_PHY_TYPE_XFI:
1291 case I40E_PHY_TYPE_XLAUI:
1292 case I40E_PHY_TYPE_XLPPI:
1294 media = I40E_MEDIA_TYPE_UNKNOWN;
1301 #define I40E_PF_RESET_WAIT_COUNT 200
1303 * i40e_pf_reset - Reset the PF
1304 * @hw: pointer to the hardware structure
1306 * Assuming someone else has triggered a global reset,
1307 * assure the global reset is complete and then reset the PF
1309 enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw)
1316 /* Poll for Global Reset steady state in case of recent GRST.
1317 * The grst delay value is in 100ms units, and we'll wait a
1318 * couple counts longer to be sure we don't just miss the end.
1320 grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) &
1321 I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >>
1322 I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
1324 grst_del = grst_del * 20;
1326 for (cnt = 0; cnt < grst_del; cnt++) {
1327 reg = rd32(hw, I40E_GLGEN_RSTAT);
1328 if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
1330 i40e_msec_delay(100);
1332 if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1333 DEBUGOUT("Global reset polling failed to complete.\n");
1334 return I40E_ERR_RESET_FAILED;
1337 /* Now Wait for the FW to be ready */
1338 for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) {
1339 reg = rd32(hw, I40E_GLNVM_ULD);
1340 reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1341 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK);
1342 if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1343 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) {
1344 DEBUGOUT1("Core and Global modules ready %d\n", cnt1);
1347 i40e_msec_delay(10);
1349 if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1350 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) {
1351 DEBUGOUT("wait for FW Reset complete timedout\n");
1352 DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg);
1353 return I40E_ERR_RESET_FAILED;
1356 /* If there was a Global Reset in progress when we got here,
1357 * we don't need to do the PF Reset
1360 reg = rd32(hw, I40E_PFGEN_CTRL);
1361 wr32(hw, I40E_PFGEN_CTRL,
1362 (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
1363 for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) {
1364 reg = rd32(hw, I40E_PFGEN_CTRL);
1365 if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
1369 if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
1370 DEBUGOUT("PF reset polling failed to complete.\n");
1371 return I40E_ERR_RESET_FAILED;
1375 i40e_clear_pxe_mode(hw);
1378 return I40E_SUCCESS;
1382 * i40e_clear_hw - clear out any left over hw state
1383 * @hw: pointer to the hw struct
1385 * Clear queues and interrupts, typically called at init time,
1386 * but after the capabilities have been found so we know how many
1387 * queues and msix vectors have been allocated.
1389 void i40e_clear_hw(struct i40e_hw *hw)
1391 u32 num_queues, base_queue;
1399 /* get number of interrupts, queues, and vfs */
1400 val = rd32(hw, I40E_GLPCI_CNF2);
1401 num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >>
1402 I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT;
1403 num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >>
1404 I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT;
1406 val = rd32(hw, I40E_PFLAN_QALLOC);
1407 base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >>
1408 I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
1409 j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
1410 I40E_PFLAN_QALLOC_LASTQ_SHIFT;
1411 if (val & I40E_PFLAN_QALLOC_VALID_MASK)
1412 num_queues = (j - base_queue) + 1;
1416 val = rd32(hw, I40E_PF_VT_PFALLOC);
1417 i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >>
1418 I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
1419 j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
1420 I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
1421 if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
1422 num_vfs = (j - i) + 1;
1426 /* stop all the interrupts */
1427 wr32(hw, I40E_PFINT_ICR0_ENA, 0);
1428 val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
1429 for (i = 0; i < num_pf_int - 2; i++)
1430 wr32(hw, I40E_PFINT_DYN_CTLN(i), val);
1432 /* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
1433 val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1434 wr32(hw, I40E_PFINT_LNKLST0, val);
1435 for (i = 0; i < num_pf_int - 2; i++)
1436 wr32(hw, I40E_PFINT_LNKLSTN(i), val);
1437 val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1438 for (i = 0; i < num_vfs; i++)
1439 wr32(hw, I40E_VPINT_LNKLST0(i), val);
1440 for (i = 0; i < num_vf_int - 2; i++)
1441 wr32(hw, I40E_VPINT_LNKLSTN(i), val);
1443 /* warn the HW of the coming Tx disables */
1444 for (i = 0; i < num_queues; i++) {
1445 u32 abs_queue_idx = base_queue + i;
1448 if (abs_queue_idx >= 128) {
1449 reg_block = abs_queue_idx / 128;
1450 abs_queue_idx %= 128;
1453 val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1454 val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1455 val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1456 val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1458 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val);
1460 i40e_usec_delay(400);
1462 /* stop all the queues */
1463 for (i = 0; i < num_queues; i++) {
1464 wr32(hw, I40E_QINT_TQCTL(i), 0);
1465 wr32(hw, I40E_QTX_ENA(i), 0);
1466 wr32(hw, I40E_QINT_RQCTL(i), 0);
1467 wr32(hw, I40E_QRX_ENA(i), 0);
1470 /* short wait for all queue disables to settle */
1471 i40e_usec_delay(50);
1475 * i40e_clear_pxe_mode - clear pxe operations mode
1476 * @hw: pointer to the hw struct
1478 * Make sure all PXE mode settings are cleared, including things
1479 * like descriptor fetch/write-back mode.
1481 void i40e_clear_pxe_mode(struct i40e_hw *hw)
1483 if (i40e_check_asq_alive(hw))
1484 i40e_aq_clear_pxe_mode(hw, NULL);
1488 * i40e_led_is_mine - helper to find matching led
1489 * @hw: pointer to the hw struct
1490 * @idx: index into GPIO registers
1492 * returns: 0 if no match, otherwise the value of the GPIO_CTL register
1494 static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx)
1499 if (!hw->func_caps.led[idx])
1502 gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx));
1503 port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >>
1504 I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
1506 /* if PRT_NUM_NA is 1 then this LED is not port specific, OR
1507 * if it is not our port then ignore
1509 if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) ||
1516 #define I40E_COMBINED_ACTIVITY 0xA
1517 #define I40E_FILTER_ACTIVITY 0xE
1518 #define I40E_LINK_ACTIVITY 0xC
1519 #define I40E_MAC_ACTIVITY 0xD
1520 #define I40E_LED0 22
1523 * i40e_led_get - return current on/off mode
1524 * @hw: pointer to the hw struct
1526 * The value returned is the 'mode' field as defined in the
1527 * GPIO register definitions: 0x0 = off, 0xf = on, and other
1528 * values are variations of possible behaviors relating to
1529 * blink, link, and wire.
1531 u32 i40e_led_get(struct i40e_hw *hw)
1533 u32 current_mode = 0;
1537 /* as per the documentation GPIO 22-29 are the LED
1538 * GPIO pins named LED0..LED7
1540 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1541 u32 gpio_val = i40e_led_is_mine(hw, i);
1546 /* ignore gpio LED src mode entries related to the activity
1549 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1550 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1551 switch (current_mode) {
1552 case I40E_COMBINED_ACTIVITY:
1553 case I40E_FILTER_ACTIVITY:
1554 case I40E_MAC_ACTIVITY:
1560 mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1561 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT;
1569 * i40e_led_set - set new on/off mode
1570 * @hw: pointer to the hw struct
1571 * @mode: 0=off, 0xf=on (else see manual for mode details)
1572 * @blink: true if the LED should blink when on, false if steady
1574 * if this function is used to turn on the blink it should
1575 * be used to disable the blink when restoring the original state.
1577 void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink)
1579 u32 current_mode = 0;
1582 if (mode & 0xfffffff0)
1583 DEBUGOUT1("invalid mode passed in %X\n", mode);
1585 /* as per the documentation GPIO 22-29 are the LED
1586 * GPIO pins named LED0..LED7
1588 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1589 u32 gpio_val = i40e_led_is_mine(hw, i);
1594 /* ignore gpio LED src mode entries related to the activity
1597 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1598 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1599 switch (current_mode) {
1600 case I40E_COMBINED_ACTIVITY:
1601 case I40E_FILTER_ACTIVITY:
1602 case I40E_MAC_ACTIVITY:
1608 gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
1609 /* this & is a bit of paranoia, but serves as a range check */
1610 gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
1611 I40E_GLGEN_GPIO_CTL_LED_MODE_MASK);
1613 if (mode == I40E_LINK_ACTIVITY)
1617 gpio_val |= BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1619 gpio_val &= ~BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1621 wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
1626 /* Admin command wrappers */
1629 * i40e_aq_get_phy_capabilities
1630 * @hw: pointer to the hw struct
1631 * @abilities: structure for PHY capabilities to be filled
1632 * @qualified_modules: report Qualified Modules
1633 * @report_init: report init capabilities (active are default)
1634 * @cmd_details: pointer to command details structure or NULL
1636 * Returns the various PHY abilities supported on the Port.
1638 enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
1639 bool qualified_modules, bool report_init,
1640 struct i40e_aq_get_phy_abilities_resp *abilities,
1641 struct i40e_asq_cmd_details *cmd_details)
1643 struct i40e_aq_desc desc;
1644 enum i40e_status_code status;
1645 u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
1648 return I40E_ERR_PARAM;
1650 i40e_fill_default_direct_cmd_desc(&desc,
1651 i40e_aqc_opc_get_phy_abilities);
1653 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1654 if (abilities_size > I40E_AQ_LARGE_BUF)
1655 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1657 if (qualified_modules)
1658 desc.params.external.param0 |=
1659 CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
1662 desc.params.external.param0 |=
1663 CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
1665 status = i40e_asq_send_command(hw, &desc, abilities, abilities_size,
1668 if (hw->aq.asq_last_status == I40E_AQ_RC_EIO)
1669 status = I40E_ERR_UNKNOWN_PHY;
1672 hw->phy.phy_types = LE32_TO_CPU(abilities->phy_type);
1673 hw->phy.phy_types |= ((u64)abilities->phy_type_ext << 32);
1680 * i40e_aq_set_phy_config
1681 * @hw: pointer to the hw struct
1682 * @config: structure with PHY configuration to be set
1683 * @cmd_details: pointer to command details structure or NULL
1685 * Set the various PHY configuration parameters
1686 * supported on the Port.One or more of the Set PHY config parameters may be
1687 * ignored in an MFP mode as the PF may not have the privilege to set some
1688 * of the PHY Config parameters. This status will be indicated by the
1691 enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
1692 struct i40e_aq_set_phy_config *config,
1693 struct i40e_asq_cmd_details *cmd_details)
1695 struct i40e_aq_desc desc;
1696 struct i40e_aq_set_phy_config *cmd =
1697 (struct i40e_aq_set_phy_config *)&desc.params.raw;
1698 enum i40e_status_code status;
1701 return I40E_ERR_PARAM;
1703 i40e_fill_default_direct_cmd_desc(&desc,
1704 i40e_aqc_opc_set_phy_config);
1708 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1715 * @hw: pointer to the hw struct
1717 * Set the requested flow control mode using set_phy_config.
1719 enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
1720 bool atomic_restart)
1722 enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
1723 struct i40e_aq_get_phy_abilities_resp abilities;
1724 struct i40e_aq_set_phy_config config;
1725 enum i40e_status_code status;
1726 u8 pause_mask = 0x0;
1732 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1733 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1735 case I40E_FC_RX_PAUSE:
1736 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1738 case I40E_FC_TX_PAUSE:
1739 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1745 /* Get the current phy config */
1746 status = i40e_aq_get_phy_capabilities(hw, false, false, &abilities,
1749 *aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
1753 memset(&config, 0, sizeof(config));
1754 /* clear the old pause settings */
1755 config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
1756 ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
1757 /* set the new abilities */
1758 config.abilities |= pause_mask;
1759 /* If the abilities have changed, then set the new config */
1760 if (config.abilities != abilities.abilities) {
1761 /* Auto restart link so settings take effect */
1763 config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
1764 /* Copy over all the old settings */
1765 config.phy_type = abilities.phy_type;
1766 config.link_speed = abilities.link_speed;
1767 config.eee_capability = abilities.eee_capability;
1768 config.eeer = abilities.eeer_val;
1769 config.low_power_ctrl = abilities.d3_lpan;
1770 status = i40e_aq_set_phy_config(hw, &config, NULL);
1773 *aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
1775 /* Update the link info */
1776 status = i40e_update_link_info(hw);
1778 /* Wait a little bit (on 40G cards it sometimes takes a really
1779 * long time for link to come back from the atomic reset)
1782 i40e_msec_delay(1000);
1783 status = i40e_update_link_info(hw);
1786 *aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
1792 * i40e_aq_set_mac_config
1793 * @hw: pointer to the hw struct
1794 * @max_frame_size: Maximum Frame Size to be supported by the port
1795 * @crc_en: Tell HW to append a CRC to outgoing frames
1796 * @pacing: Pacing configurations
1797 * @cmd_details: pointer to command details structure or NULL
1799 * Configure MAC settings for frame size, jumbo frame support and the
1800 * addition of a CRC by the hardware.
1802 enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
1804 bool crc_en, u16 pacing,
1805 struct i40e_asq_cmd_details *cmd_details)
1807 struct i40e_aq_desc desc;
1808 struct i40e_aq_set_mac_config *cmd =
1809 (struct i40e_aq_set_mac_config *)&desc.params.raw;
1810 enum i40e_status_code status;
1812 if (max_frame_size == 0)
1813 return I40E_ERR_PARAM;
1815 i40e_fill_default_direct_cmd_desc(&desc,
1816 i40e_aqc_opc_set_mac_config);
1818 cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
1819 cmd->params = ((u8)pacing & 0x0F) << 3;
1821 cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
1823 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1829 * i40e_aq_clear_pxe_mode
1830 * @hw: pointer to the hw struct
1831 * @cmd_details: pointer to command details structure or NULL
1833 * Tell the firmware that the driver is taking over from PXE
1835 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
1836 struct i40e_asq_cmd_details *cmd_details)
1838 enum i40e_status_code status;
1839 struct i40e_aq_desc desc;
1840 struct i40e_aqc_clear_pxe *cmd =
1841 (struct i40e_aqc_clear_pxe *)&desc.params.raw;
1843 i40e_fill_default_direct_cmd_desc(&desc,
1844 i40e_aqc_opc_clear_pxe_mode);
1848 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1850 wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
1856 * i40e_aq_set_link_restart_an
1857 * @hw: pointer to the hw struct
1858 * @enable_link: if true: enable link, if false: disable link
1859 * @cmd_details: pointer to command details structure or NULL
1861 * Sets up the link and restarts the Auto-Negotiation over the link.
1863 enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
1864 bool enable_link, struct i40e_asq_cmd_details *cmd_details)
1866 struct i40e_aq_desc desc;
1867 struct i40e_aqc_set_link_restart_an *cmd =
1868 (struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
1869 enum i40e_status_code status;
1871 i40e_fill_default_direct_cmd_desc(&desc,
1872 i40e_aqc_opc_set_link_restart_an);
1874 cmd->command = I40E_AQ_PHY_RESTART_AN;
1876 cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
1878 cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
1880 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1886 * i40e_aq_get_link_info
1887 * @hw: pointer to the hw struct
1888 * @enable_lse: enable/disable LinkStatusEvent reporting
1889 * @link: pointer to link status structure - optional
1890 * @cmd_details: pointer to command details structure or NULL
1892 * Returns the link status of the adapter.
1894 enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
1895 bool enable_lse, struct i40e_link_status *link,
1896 struct i40e_asq_cmd_details *cmd_details)
1898 struct i40e_aq_desc desc;
1899 struct i40e_aqc_get_link_status *resp =
1900 (struct i40e_aqc_get_link_status *)&desc.params.raw;
1901 struct i40e_link_status *hw_link_info = &hw->phy.link_info;
1902 enum i40e_status_code status;
1903 bool tx_pause, rx_pause;
1906 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
1909 command_flags = I40E_AQ_LSE_ENABLE;
1911 command_flags = I40E_AQ_LSE_DISABLE;
1912 resp->command_flags = CPU_TO_LE16(command_flags);
1914 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1916 if (status != I40E_SUCCESS)
1917 goto aq_get_link_info_exit;
1919 /* save off old link status information */
1920 i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
1921 sizeof(*hw_link_info), I40E_NONDMA_TO_NONDMA);
1923 /* update link status */
1924 hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
1925 hw->phy.media_type = i40e_get_media_type(hw);
1926 hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
1927 hw_link_info->link_info = resp->link_info;
1928 hw_link_info->an_info = resp->an_info;
1929 hw_link_info->ext_info = resp->ext_info;
1930 hw_link_info->loopback = resp->loopback;
1931 hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
1932 hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
1934 /* update fc info */
1935 tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
1936 rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
1937 if (tx_pause & rx_pause)
1938 hw->fc.current_mode = I40E_FC_FULL;
1940 hw->fc.current_mode = I40E_FC_TX_PAUSE;
1942 hw->fc.current_mode = I40E_FC_RX_PAUSE;
1944 hw->fc.current_mode = I40E_FC_NONE;
1946 if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
1947 hw_link_info->crc_enable = true;
1949 hw_link_info->crc_enable = false;
1951 if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_ENABLE))
1952 hw_link_info->lse_enable = true;
1954 hw_link_info->lse_enable = false;
1956 if ((hw->aq.fw_maj_ver < 4 || (hw->aq.fw_maj_ver == 4 &&
1957 hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
1958 hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
1960 /* save link status information */
1962 i40e_memcpy(link, hw_link_info, sizeof(*hw_link_info),
1963 I40E_NONDMA_TO_NONDMA);
1965 /* flag cleared so helper functions don't call AQ again */
1966 hw->phy.get_link_info = false;
1968 aq_get_link_info_exit:
1973 * i40e_aq_set_phy_int_mask
1974 * @hw: pointer to the hw struct
1975 * @mask: interrupt mask to be set
1976 * @cmd_details: pointer to command details structure or NULL
1978 * Set link interrupt mask.
1980 enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
1982 struct i40e_asq_cmd_details *cmd_details)
1984 struct i40e_aq_desc desc;
1985 struct i40e_aqc_set_phy_int_mask *cmd =
1986 (struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
1987 enum i40e_status_code status;
1989 i40e_fill_default_direct_cmd_desc(&desc,
1990 i40e_aqc_opc_set_phy_int_mask);
1992 cmd->event_mask = CPU_TO_LE16(mask);
1994 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2000 * i40e_aq_get_local_advt_reg
2001 * @hw: pointer to the hw struct
2002 * @advt_reg: local AN advertisement register value
2003 * @cmd_details: pointer to command details structure or NULL
2005 * Get the Local AN advertisement register value.
2007 enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
2009 struct i40e_asq_cmd_details *cmd_details)
2011 struct i40e_aq_desc desc;
2012 struct i40e_aqc_an_advt_reg *resp =
2013 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2014 enum i40e_status_code status;
2016 i40e_fill_default_direct_cmd_desc(&desc,
2017 i40e_aqc_opc_get_local_advt_reg);
2019 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2021 if (status != I40E_SUCCESS)
2022 goto aq_get_local_advt_reg_exit;
2024 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2025 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2027 aq_get_local_advt_reg_exit:
2032 * i40e_aq_set_local_advt_reg
2033 * @hw: pointer to the hw struct
2034 * @advt_reg: local AN advertisement register value
2035 * @cmd_details: pointer to command details structure or NULL
2037 * Get the Local AN advertisement register value.
2039 enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
2041 struct i40e_asq_cmd_details *cmd_details)
2043 struct i40e_aq_desc desc;
2044 struct i40e_aqc_an_advt_reg *cmd =
2045 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2046 enum i40e_status_code status;
2048 i40e_fill_default_direct_cmd_desc(&desc,
2049 i40e_aqc_opc_get_local_advt_reg);
2051 cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
2052 cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
2054 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2060 * i40e_aq_get_partner_advt
2061 * @hw: pointer to the hw struct
2062 * @advt_reg: AN partner advertisement register value
2063 * @cmd_details: pointer to command details structure or NULL
2065 * Get the link partner AN advertisement register value.
2067 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
2069 struct i40e_asq_cmd_details *cmd_details)
2071 struct i40e_aq_desc desc;
2072 struct i40e_aqc_an_advt_reg *resp =
2073 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2074 enum i40e_status_code status;
2076 i40e_fill_default_direct_cmd_desc(&desc,
2077 i40e_aqc_opc_get_partner_advt);
2079 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2081 if (status != I40E_SUCCESS)
2082 goto aq_get_partner_advt_exit;
2084 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2085 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2087 aq_get_partner_advt_exit:
2092 * i40e_aq_set_lb_modes
2093 * @hw: pointer to the hw struct
2094 * @lb_modes: loopback mode to be set
2095 * @cmd_details: pointer to command details structure or NULL
2097 * Sets loopback modes.
2099 enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
2101 struct i40e_asq_cmd_details *cmd_details)
2103 struct i40e_aq_desc desc;
2104 struct i40e_aqc_set_lb_mode *cmd =
2105 (struct i40e_aqc_set_lb_mode *)&desc.params.raw;
2106 enum i40e_status_code status;
2108 i40e_fill_default_direct_cmd_desc(&desc,
2109 i40e_aqc_opc_set_lb_modes);
2111 cmd->lb_mode = CPU_TO_LE16(lb_modes);
2113 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2119 * i40e_aq_set_phy_debug
2120 * @hw: pointer to the hw struct
2121 * @cmd_flags: debug command flags
2122 * @cmd_details: pointer to command details structure or NULL
2124 * Reset the external PHY.
2126 enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
2127 struct i40e_asq_cmd_details *cmd_details)
2129 struct i40e_aq_desc desc;
2130 struct i40e_aqc_set_phy_debug *cmd =
2131 (struct i40e_aqc_set_phy_debug *)&desc.params.raw;
2132 enum i40e_status_code status;
2134 i40e_fill_default_direct_cmd_desc(&desc,
2135 i40e_aqc_opc_set_phy_debug);
2137 cmd->command_flags = cmd_flags;
2139 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2146 * @hw: pointer to the hw struct
2147 * @vsi_ctx: pointer to a vsi context struct
2148 * @cmd_details: pointer to command details structure or NULL
2150 * Add a VSI context to the hardware.
2152 enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
2153 struct i40e_vsi_context *vsi_ctx,
2154 struct i40e_asq_cmd_details *cmd_details)
2156 struct i40e_aq_desc desc;
2157 struct i40e_aqc_add_get_update_vsi *cmd =
2158 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2159 struct i40e_aqc_add_get_update_vsi_completion *resp =
2160 (struct i40e_aqc_add_get_update_vsi_completion *)
2162 enum i40e_status_code status;
2164 i40e_fill_default_direct_cmd_desc(&desc,
2165 i40e_aqc_opc_add_vsi);
2167 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
2168 cmd->connection_type = vsi_ctx->connection_type;
2169 cmd->vf_id = vsi_ctx->vf_num;
2170 cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
2172 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2174 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2175 sizeof(vsi_ctx->info), cmd_details);
2177 if (status != I40E_SUCCESS)
2178 goto aq_add_vsi_exit;
2180 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2181 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2182 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2183 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2190 * i40e_aq_set_default_vsi
2191 * @hw: pointer to the hw struct
2193 * @cmd_details: pointer to command details structure or NULL
2195 enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
2197 struct i40e_asq_cmd_details *cmd_details)
2199 struct i40e_aq_desc desc;
2200 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2201 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2203 enum i40e_status_code status;
2205 i40e_fill_default_direct_cmd_desc(&desc,
2206 i40e_aqc_opc_set_vsi_promiscuous_modes);
2208 cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2209 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2210 cmd->seid = CPU_TO_LE16(seid);
2212 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2218 * i40e_aq_clear_default_vsi
2219 * @hw: pointer to the hw struct
2221 * @cmd_details: pointer to command details structure or NULL
2223 enum i40e_status_code i40e_aq_clear_default_vsi(struct i40e_hw *hw,
2225 struct i40e_asq_cmd_details *cmd_details)
2227 struct i40e_aq_desc desc;
2228 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2229 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2231 enum i40e_status_code status;
2233 i40e_fill_default_direct_cmd_desc(&desc,
2234 i40e_aqc_opc_set_vsi_promiscuous_modes);
2236 cmd->promiscuous_flags = CPU_TO_LE16(0);
2237 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2238 cmd->seid = CPU_TO_LE16(seid);
2240 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2246 * i40e_aq_set_vsi_unicast_promiscuous
2247 * @hw: pointer to the hw struct
2249 * @set: set unicast promiscuous enable/disable
2250 * @cmd_details: pointer to command details structure or NULL
2251 * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
2253 enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
2255 struct i40e_asq_cmd_details *cmd_details,
2256 bool rx_only_promisc)
2258 struct i40e_aq_desc desc;
2259 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2260 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2261 enum i40e_status_code status;
2264 i40e_fill_default_direct_cmd_desc(&desc,
2265 i40e_aqc_opc_set_vsi_promiscuous_modes);
2268 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2269 if (rx_only_promisc &&
2270 (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) ||
2271 (hw->aq.api_maj_ver > 1)))
2272 flags |= I40E_AQC_SET_VSI_PROMISC_TX;
2275 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2277 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2278 if (((hw->aq.api_maj_ver >= 1) && (hw->aq.api_min_ver >= 5)) ||
2279 (hw->aq.api_maj_ver > 1))
2280 cmd->valid_flags |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_TX);
2282 cmd->seid = CPU_TO_LE16(seid);
2283 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2289 * i40e_aq_set_vsi_multicast_promiscuous
2290 * @hw: pointer to the hw struct
2292 * @set: set multicast promiscuous enable/disable
2293 * @cmd_details: pointer to command details structure or NULL
2295 enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
2296 u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
2298 struct i40e_aq_desc desc;
2299 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2300 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2301 enum i40e_status_code status;
2304 i40e_fill_default_direct_cmd_desc(&desc,
2305 i40e_aqc_opc_set_vsi_promiscuous_modes);
2308 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2310 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2312 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2314 cmd->seid = CPU_TO_LE16(seid);
2315 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2321 * i40e_aq_set_vsi_mc_promisc_on_vlan
2322 * @hw: pointer to the hw struct
2324 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2325 * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
2326 * @cmd_details: pointer to command details structure or NULL
2328 enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
2329 u16 seid, bool enable, u16 vid,
2330 struct i40e_asq_cmd_details *cmd_details)
2332 struct i40e_aq_desc desc;
2333 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2334 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2335 enum i40e_status_code status;
2338 i40e_fill_default_direct_cmd_desc(&desc,
2339 i40e_aqc_opc_set_vsi_promiscuous_modes);
2342 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2344 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2345 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2346 cmd->seid = CPU_TO_LE16(seid);
2347 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2349 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2355 * i40e_aq_set_vsi_uc_promisc_on_vlan
2356 * @hw: pointer to the hw struct
2358 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2359 * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
2360 * @cmd_details: pointer to command details structure or NULL
2362 enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
2363 u16 seid, bool enable, u16 vid,
2364 struct i40e_asq_cmd_details *cmd_details)
2366 struct i40e_aq_desc desc;
2367 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2368 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2369 enum i40e_status_code status;
2372 i40e_fill_default_direct_cmd_desc(&desc,
2373 i40e_aqc_opc_set_vsi_promiscuous_modes);
2376 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2378 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2379 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2380 cmd->seid = CPU_TO_LE16(seid);
2381 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2383 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2389 * i40e_aq_set_vsi_broadcast
2390 * @hw: pointer to the hw struct
2392 * @set_filter: true to set filter, false to clear filter
2393 * @cmd_details: pointer to command details structure or NULL
2395 * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
2397 enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
2398 u16 seid, bool set_filter,
2399 struct i40e_asq_cmd_details *cmd_details)
2401 struct i40e_aq_desc desc;
2402 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2403 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2404 enum i40e_status_code status;
2406 i40e_fill_default_direct_cmd_desc(&desc,
2407 i40e_aqc_opc_set_vsi_promiscuous_modes);
2410 cmd->promiscuous_flags
2411 |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2413 cmd->promiscuous_flags
2414 &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2416 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2417 cmd->seid = CPU_TO_LE16(seid);
2418 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2424 * i40e_aq_set_vsi_vlan_promisc - control the VLAN promiscuous setting
2425 * @hw: pointer to the hw struct
2427 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2428 * @cmd_details: pointer to command details structure or NULL
2430 enum i40e_status_code i40e_aq_set_vsi_vlan_promisc(struct i40e_hw *hw,
2431 u16 seid, bool enable,
2432 struct i40e_asq_cmd_details *cmd_details)
2434 struct i40e_aq_desc desc;
2435 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2436 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2437 enum i40e_status_code status;
2440 i40e_fill_default_direct_cmd_desc(&desc,
2441 i40e_aqc_opc_set_vsi_promiscuous_modes);
2443 flags |= I40E_AQC_SET_VSI_PROMISC_VLAN;
2445 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2446 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_VLAN);
2447 cmd->seid = CPU_TO_LE16(seid);
2449 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2455 * i40e_get_vsi_params - get VSI configuration info
2456 * @hw: pointer to the hw struct
2457 * @vsi_ctx: pointer to a vsi context struct
2458 * @cmd_details: pointer to command details structure or NULL
2460 enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
2461 struct i40e_vsi_context *vsi_ctx,
2462 struct i40e_asq_cmd_details *cmd_details)
2464 struct i40e_aq_desc desc;
2465 struct i40e_aqc_add_get_update_vsi *cmd =
2466 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2467 struct i40e_aqc_add_get_update_vsi_completion *resp =
2468 (struct i40e_aqc_add_get_update_vsi_completion *)
2470 enum i40e_status_code status;
2472 UNREFERENCED_1PARAMETER(cmd_details);
2473 i40e_fill_default_direct_cmd_desc(&desc,
2474 i40e_aqc_opc_get_vsi_parameters);
2476 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2478 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2480 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2481 sizeof(vsi_ctx->info), NULL);
2483 if (status != I40E_SUCCESS)
2484 goto aq_get_vsi_params_exit;
2486 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2487 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2488 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2489 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2491 aq_get_vsi_params_exit:
2496 * i40e_aq_update_vsi_params
2497 * @hw: pointer to the hw struct
2498 * @vsi_ctx: pointer to a vsi context struct
2499 * @cmd_details: pointer to command details structure or NULL
2501 * Update a VSI context.
2503 enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
2504 struct i40e_vsi_context *vsi_ctx,
2505 struct i40e_asq_cmd_details *cmd_details)
2507 struct i40e_aq_desc desc;
2508 struct i40e_aqc_add_get_update_vsi *cmd =
2509 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2510 struct i40e_aqc_add_get_update_vsi_completion *resp =
2511 (struct i40e_aqc_add_get_update_vsi_completion *)
2513 enum i40e_status_code status;
2515 i40e_fill_default_direct_cmd_desc(&desc,
2516 i40e_aqc_opc_update_vsi_parameters);
2517 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2519 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2521 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2522 sizeof(vsi_ctx->info), cmd_details);
2524 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2525 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2531 * i40e_aq_get_switch_config
2532 * @hw: pointer to the hardware structure
2533 * @buf: pointer to the result buffer
2534 * @buf_size: length of input buffer
2535 * @start_seid: seid to start for the report, 0 == beginning
2536 * @cmd_details: pointer to command details structure or NULL
2538 * Fill the buf with switch configuration returned from AdminQ command
2540 enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
2541 struct i40e_aqc_get_switch_config_resp *buf,
2542 u16 buf_size, u16 *start_seid,
2543 struct i40e_asq_cmd_details *cmd_details)
2545 struct i40e_aq_desc desc;
2546 struct i40e_aqc_switch_seid *scfg =
2547 (struct i40e_aqc_switch_seid *)&desc.params.raw;
2548 enum i40e_status_code status;
2550 i40e_fill_default_direct_cmd_desc(&desc,
2551 i40e_aqc_opc_get_switch_config);
2552 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2553 if (buf_size > I40E_AQ_LARGE_BUF)
2554 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2555 scfg->seid = CPU_TO_LE16(*start_seid);
2557 status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
2558 *start_seid = LE16_TO_CPU(scfg->seid);
2564 * i40e_aq_set_switch_config
2565 * @hw: pointer to the hardware structure
2566 * @flags: bit flag values to set
2567 * @valid_flags: which bit flags to set
2568 * @cmd_details: pointer to command details structure or NULL
2570 * Set switch configuration bits
2572 enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
2573 u16 flags, u16 valid_flags,
2574 struct i40e_asq_cmd_details *cmd_details)
2576 struct i40e_aq_desc desc;
2577 struct i40e_aqc_set_switch_config *scfg =
2578 (struct i40e_aqc_set_switch_config *)&desc.params.raw;
2579 enum i40e_status_code status;
2581 i40e_fill_default_direct_cmd_desc(&desc,
2582 i40e_aqc_opc_set_switch_config);
2583 scfg->flags = CPU_TO_LE16(flags);
2584 scfg->valid_flags = CPU_TO_LE16(valid_flags);
2586 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2592 * i40e_aq_get_firmware_version
2593 * @hw: pointer to the hw struct
2594 * @fw_major_version: firmware major version
2595 * @fw_minor_version: firmware minor version
2596 * @fw_build: firmware build number
2597 * @api_major_version: major queue version
2598 * @api_minor_version: minor queue version
2599 * @cmd_details: pointer to command details structure or NULL
2601 * Get the firmware version from the admin queue commands
2603 enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
2604 u16 *fw_major_version, u16 *fw_minor_version,
2606 u16 *api_major_version, u16 *api_minor_version,
2607 struct i40e_asq_cmd_details *cmd_details)
2609 struct i40e_aq_desc desc;
2610 struct i40e_aqc_get_version *resp =
2611 (struct i40e_aqc_get_version *)&desc.params.raw;
2612 enum i40e_status_code status;
2614 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
2616 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2618 if (status == I40E_SUCCESS) {
2619 if (fw_major_version != NULL)
2620 *fw_major_version = LE16_TO_CPU(resp->fw_major);
2621 if (fw_minor_version != NULL)
2622 *fw_minor_version = LE16_TO_CPU(resp->fw_minor);
2623 if (fw_build != NULL)
2624 *fw_build = LE32_TO_CPU(resp->fw_build);
2625 if (api_major_version != NULL)
2626 *api_major_version = LE16_TO_CPU(resp->api_major);
2627 if (api_minor_version != NULL)
2628 *api_minor_version = LE16_TO_CPU(resp->api_minor);
2630 /* A workaround to fix the API version in SW */
2631 if (api_major_version && api_minor_version &&
2632 fw_major_version && fw_minor_version &&
2633 ((*api_major_version == 1) && (*api_minor_version == 1)) &&
2634 (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
2635 (*fw_major_version > 4)))
2636 *api_minor_version = 2;
2643 * i40e_aq_send_driver_version
2644 * @hw: pointer to the hw struct
2645 * @dv: driver's major, minor version
2646 * @cmd_details: pointer to command details structure or NULL
2648 * Send the driver version to the firmware
2650 enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
2651 struct i40e_driver_version *dv,
2652 struct i40e_asq_cmd_details *cmd_details)
2654 struct i40e_aq_desc desc;
2655 struct i40e_aqc_driver_version *cmd =
2656 (struct i40e_aqc_driver_version *)&desc.params.raw;
2657 enum i40e_status_code status;
2661 return I40E_ERR_PARAM;
2663 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
2665 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
2666 cmd->driver_major_ver = dv->major_version;
2667 cmd->driver_minor_ver = dv->minor_version;
2668 cmd->driver_build_ver = dv->build_version;
2669 cmd->driver_subbuild_ver = dv->subbuild_version;
2672 while (len < sizeof(dv->driver_string) &&
2673 (dv->driver_string[len] < 0x80) &&
2674 dv->driver_string[len])
2676 status = i40e_asq_send_command(hw, &desc, dv->driver_string,
2683 * i40e_get_link_status - get status of the HW network link
2684 * @hw: pointer to the hw struct
2685 * @link_up: pointer to bool (true/false = linkup/linkdown)
2687 * Variable link_up true if link is up, false if link is down.
2688 * The variable link_up is invalid if returned value of status != I40E_SUCCESS
2690 * Side effect: LinkStatusEvent reporting becomes enabled
2692 enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
2694 enum i40e_status_code status = I40E_SUCCESS;
2696 if (hw->phy.get_link_info) {
2697 status = i40e_update_link_info(hw);
2699 if (status != I40E_SUCCESS)
2700 i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
2704 *link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
2710 * i40e_updatelink_status - update status of the HW network link
2711 * @hw: pointer to the hw struct
2713 enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
2715 struct i40e_aq_get_phy_abilities_resp abilities;
2716 enum i40e_status_code status = I40E_SUCCESS;
2718 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2722 if (hw->phy.link_info.link_info & I40E_AQ_MEDIA_AVAILABLE) {
2723 status = i40e_aq_get_phy_capabilities(hw, false, false,
2728 memcpy(hw->phy.link_info.module_type, &abilities.module_type,
2729 sizeof(hw->phy.link_info.module_type));
2736 * i40e_get_link_speed
2737 * @hw: pointer to the hw struct
2739 * Returns the link speed of the adapter.
2741 enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
2743 enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
2744 enum i40e_status_code status = I40E_SUCCESS;
2746 if (hw->phy.get_link_info) {
2747 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2749 if (status != I40E_SUCCESS)
2750 goto i40e_link_speed_exit;
2753 speed = hw->phy.link_info.link_speed;
2755 i40e_link_speed_exit:
2760 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2761 * @hw: pointer to the hw struct
2762 * @uplink_seid: the MAC or other gizmo SEID
2763 * @downlink_seid: the VSI SEID
2764 * @enabled_tc: bitmap of TCs to be enabled
2765 * @default_port: true for default port VSI, false for control port
2766 * @veb_seid: pointer to where to put the resulting VEB SEID
2767 * @enable_stats: true to turn on VEB stats
2768 * @cmd_details: pointer to command details structure or NULL
2770 * This asks the FW to add a VEB between the uplink and downlink
2771 * elements. If the uplink SEID is 0, this will be a floating VEB.
2773 enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
2774 u16 downlink_seid, u8 enabled_tc,
2775 bool default_port, u16 *veb_seid,
2777 struct i40e_asq_cmd_details *cmd_details)
2779 struct i40e_aq_desc desc;
2780 struct i40e_aqc_add_veb *cmd =
2781 (struct i40e_aqc_add_veb *)&desc.params.raw;
2782 struct i40e_aqc_add_veb_completion *resp =
2783 (struct i40e_aqc_add_veb_completion *)&desc.params.raw;
2784 enum i40e_status_code status;
2787 /* SEIDs need to either both be set or both be 0 for floating VEB */
2788 if (!!uplink_seid != !!downlink_seid)
2789 return I40E_ERR_PARAM;
2791 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
2793 cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
2794 cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
2795 cmd->enable_tcs = enabled_tc;
2797 veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
2799 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
2801 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
2803 /* reverse logic here: set the bitflag to disable the stats */
2805 veb_flags |= I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS;
2807 cmd->veb_flags = CPU_TO_LE16(veb_flags);
2809 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2811 if (!status && veb_seid)
2812 *veb_seid = LE16_TO_CPU(resp->veb_seid);
2818 * i40e_aq_get_veb_parameters - Retrieve VEB parameters
2819 * @hw: pointer to the hw struct
2820 * @veb_seid: the SEID of the VEB to query
2821 * @switch_id: the uplink switch id
2822 * @floating: set to true if the VEB is floating
2823 * @statistic_index: index of the stats counter block for this VEB
2824 * @vebs_used: number of VEB's used by function
2825 * @vebs_free: total VEB's not reserved by any function
2826 * @cmd_details: pointer to command details structure or NULL
2828 * This retrieves the parameters for a particular VEB, specified by
2829 * uplink_seid, and returns them to the caller.
2831 enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
2832 u16 veb_seid, u16 *switch_id,
2833 bool *floating, u16 *statistic_index,
2834 u16 *vebs_used, u16 *vebs_free,
2835 struct i40e_asq_cmd_details *cmd_details)
2837 struct i40e_aq_desc desc;
2838 struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
2839 (struct i40e_aqc_get_veb_parameters_completion *)
2841 enum i40e_status_code status;
2844 return I40E_ERR_PARAM;
2846 i40e_fill_default_direct_cmd_desc(&desc,
2847 i40e_aqc_opc_get_veb_parameters);
2848 cmd_resp->seid = CPU_TO_LE16(veb_seid);
2850 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2855 *switch_id = LE16_TO_CPU(cmd_resp->switch_id);
2856 if (statistic_index)
2857 *statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
2859 *vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
2861 *vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
2863 u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
2865 if (flags & I40E_AQC_ADD_VEB_FLOATING)
2876 * i40e_aq_add_macvlan
2877 * @hw: pointer to the hw struct
2878 * @seid: VSI for the mac address
2879 * @mv_list: list of macvlans to be added
2880 * @count: length of the list
2881 * @cmd_details: pointer to command details structure or NULL
2883 * Add MAC/VLAN addresses to the HW filtering
2885 enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
2886 struct i40e_aqc_add_macvlan_element_data *mv_list,
2887 u16 count, struct i40e_asq_cmd_details *cmd_details)
2889 struct i40e_aq_desc desc;
2890 struct i40e_aqc_macvlan *cmd =
2891 (struct i40e_aqc_macvlan *)&desc.params.raw;
2892 enum i40e_status_code status;
2896 if (count == 0 || !mv_list || !hw)
2897 return I40E_ERR_PARAM;
2899 buf_size = count * sizeof(*mv_list);
2901 /* prep the rest of the request */
2902 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
2903 cmd->num_addresses = CPU_TO_LE16(count);
2904 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2908 for (i = 0; i < count; i++)
2909 if (I40E_IS_MULTICAST(mv_list[i].mac_addr))
2911 CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);
2913 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2914 if (buf_size > I40E_AQ_LARGE_BUF)
2915 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2917 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2924 * i40e_aq_remove_macvlan
2925 * @hw: pointer to the hw struct
2926 * @seid: VSI for the mac address
2927 * @mv_list: list of macvlans to be removed
2928 * @count: length of the list
2929 * @cmd_details: pointer to command details structure or NULL
2931 * Remove MAC/VLAN addresses from the HW filtering
2933 enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
2934 struct i40e_aqc_remove_macvlan_element_data *mv_list,
2935 u16 count, struct i40e_asq_cmd_details *cmd_details)
2937 struct i40e_aq_desc desc;
2938 struct i40e_aqc_macvlan *cmd =
2939 (struct i40e_aqc_macvlan *)&desc.params.raw;
2940 enum i40e_status_code status;
2943 if (count == 0 || !mv_list || !hw)
2944 return I40E_ERR_PARAM;
2946 buf_size = count * sizeof(*mv_list);
2948 /* prep the rest of the request */
2949 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
2950 cmd->num_addresses = CPU_TO_LE16(count);
2951 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2955 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2956 if (buf_size > I40E_AQ_LARGE_BUF)
2957 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2959 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2966 * i40e_mirrorrule_op - Internal helper function to add/delete mirror rule
2967 * @hw: pointer to the hw struct
2968 * @opcode: AQ opcode for add or delete mirror rule
2969 * @sw_seid: Switch SEID (to which rule refers)
2970 * @rule_type: Rule Type (ingress/egress/VLAN)
2971 * @id: Destination VSI SEID or Rule ID
2972 * @count: length of the list
2973 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
2974 * @cmd_details: pointer to command details structure or NULL
2975 * @rule_id: Rule ID returned from FW
2976 * @rule_used: Number of rules used in internal switch
2977 * @rule_free: Number of rules free in internal switch
2979 * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
2980 * VEBs/VEPA elements only
2982 static enum i40e_status_code i40e_mirrorrule_op(struct i40e_hw *hw,
2983 u16 opcode, u16 sw_seid, u16 rule_type, u16 id,
2984 u16 count, __le16 *mr_list,
2985 struct i40e_asq_cmd_details *cmd_details,
2986 u16 *rule_id, u16 *rules_used, u16 *rules_free)
2988 struct i40e_aq_desc desc;
2989 struct i40e_aqc_add_delete_mirror_rule *cmd =
2990 (struct i40e_aqc_add_delete_mirror_rule *)&desc.params.raw;
2991 struct i40e_aqc_add_delete_mirror_rule_completion *resp =
2992 (struct i40e_aqc_add_delete_mirror_rule_completion *)&desc.params.raw;
2993 enum i40e_status_code status;
2996 buf_size = count * sizeof(*mr_list);
2998 /* prep the rest of the request */
2999 i40e_fill_default_direct_cmd_desc(&desc, opcode);
3000 cmd->seid = CPU_TO_LE16(sw_seid);
3001 cmd->rule_type = CPU_TO_LE16(rule_type &
3002 I40E_AQC_MIRROR_RULE_TYPE_MASK);
3003 cmd->num_entries = CPU_TO_LE16(count);
3004 /* Dest VSI for add, rule_id for delete */
3005 cmd->destination = CPU_TO_LE16(id);
3007 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3009 if (buf_size > I40E_AQ_LARGE_BUF)
3010 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3013 status = i40e_asq_send_command(hw, &desc, mr_list, buf_size,
3015 if (status == I40E_SUCCESS ||
3016 hw->aq.asq_last_status == I40E_AQ_RC_ENOSPC) {
3018 *rule_id = LE16_TO_CPU(resp->rule_id);
3020 *rules_used = LE16_TO_CPU(resp->mirror_rules_used);
3022 *rules_free = LE16_TO_CPU(resp->mirror_rules_free);
3028 * i40e_aq_add_mirrorrule - add a mirror rule
3029 * @hw: pointer to the hw struct
3030 * @sw_seid: Switch SEID (to which rule refers)
3031 * @rule_type: Rule Type (ingress/egress/VLAN)
3032 * @dest_vsi: SEID of VSI to which packets will be mirrored
3033 * @count: length of the list
3034 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3035 * @cmd_details: pointer to command details structure or NULL
3036 * @rule_id: Rule ID returned from FW
3037 * @rule_used: Number of rules used in internal switch
3038 * @rule_free: Number of rules free in internal switch
3040 * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
3042 enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3043 u16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,
3044 struct i40e_asq_cmd_details *cmd_details,
3045 u16 *rule_id, u16 *rules_used, u16 *rules_free)
3047 if (!(rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS ||
3048 rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS)) {
3049 if (count == 0 || !mr_list)
3050 return I40E_ERR_PARAM;
3053 return i40e_mirrorrule_op(hw, i40e_aqc_opc_add_mirror_rule, sw_seid,
3054 rule_type, dest_vsi, count, mr_list,
3055 cmd_details, rule_id, rules_used, rules_free);
3059 * i40e_aq_delete_mirrorrule - delete a mirror rule
3060 * @hw: pointer to the hw struct
3061 * @sw_seid: Switch SEID (to which rule refers)
3062 * @rule_type: Rule Type (ingress/egress/VLAN)
3063 * @count: length of the list
3064 * @rule_id: Rule ID that is returned in the receive desc as part of
3066 * @mr_list: list of mirrored VLAN IDs to be removed
3067 * @cmd_details: pointer to command details structure or NULL
3068 * @rule_used: Number of rules used in internal switch
3069 * @rule_free: Number of rules free in internal switch
3071 * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
3073 enum i40e_status_code i40e_aq_delete_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3074 u16 rule_type, u16 rule_id, u16 count, __le16 *mr_list,
3075 struct i40e_asq_cmd_details *cmd_details,
3076 u16 *rules_used, u16 *rules_free)
3078 /* Rule ID has to be valid except rule_type: INGRESS VLAN mirroring */
3079 if (rule_type == I40E_AQC_MIRROR_RULE_TYPE_VLAN) {
3080 /* count and mr_list shall be valid for rule_type INGRESS VLAN
3081 * mirroring. For other rule_type, count and rule_type should
3084 if (count == 0 || !mr_list)
3085 return I40E_ERR_PARAM;
3088 return i40e_mirrorrule_op(hw, i40e_aqc_opc_delete_mirror_rule, sw_seid,
3089 rule_type, rule_id, count, mr_list,
3090 cmd_details, NULL, rules_used, rules_free);
3094 * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
3095 * @hw: pointer to the hw struct
3096 * @seid: VSI for the vlan filters
3097 * @v_list: list of vlan filters to be added
3098 * @count: length of the list
3099 * @cmd_details: pointer to command details structure or NULL
3101 enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
3102 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3103 u8 count, struct i40e_asq_cmd_details *cmd_details)
3105 struct i40e_aq_desc desc;
3106 struct i40e_aqc_macvlan *cmd =
3107 (struct i40e_aqc_macvlan *)&desc.params.raw;
3108 enum i40e_status_code status;
3111 if (count == 0 || !v_list || !hw)
3112 return I40E_ERR_PARAM;
3114 buf_size = count * sizeof(*v_list);
3116 /* prep the rest of the request */
3117 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
3118 cmd->num_addresses = CPU_TO_LE16(count);
3119 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3123 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3124 if (buf_size > I40E_AQ_LARGE_BUF)
3125 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3127 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3134 * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
3135 * @hw: pointer to the hw struct
3136 * @seid: VSI for the vlan filters
3137 * @v_list: list of macvlans to be removed
3138 * @count: length of the list
3139 * @cmd_details: pointer to command details structure or NULL
3141 enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
3142 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3143 u8 count, struct i40e_asq_cmd_details *cmd_details)
3145 struct i40e_aq_desc desc;
3146 struct i40e_aqc_macvlan *cmd =
3147 (struct i40e_aqc_macvlan *)&desc.params.raw;
3148 enum i40e_status_code status;
3151 if (count == 0 || !v_list || !hw)
3152 return I40E_ERR_PARAM;
3154 buf_size = count * sizeof(*v_list);
3156 /* prep the rest of the request */
3157 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
3158 cmd->num_addresses = CPU_TO_LE16(count);
3159 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3163 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3164 if (buf_size > I40E_AQ_LARGE_BUF)
3165 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3167 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3174 * i40e_aq_send_msg_to_vf
3175 * @hw: pointer to the hardware structure
3176 * @vfid: vf id to send msg
3177 * @v_opcode: opcodes for VF-PF communication
3178 * @v_retval: return error code
3179 * @msg: pointer to the msg buffer
3180 * @msglen: msg length
3181 * @cmd_details: pointer to command details
3185 enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
3186 u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
3187 struct i40e_asq_cmd_details *cmd_details)
3189 struct i40e_aq_desc desc;
3190 struct i40e_aqc_pf_vf_message *cmd =
3191 (struct i40e_aqc_pf_vf_message *)&desc.params.raw;
3192 enum i40e_status_code status;
3194 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
3195 cmd->id = CPU_TO_LE32(vfid);
3196 desc.cookie_high = CPU_TO_LE32(v_opcode);
3197 desc.cookie_low = CPU_TO_LE32(v_retval);
3198 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
3200 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3202 if (msglen > I40E_AQ_LARGE_BUF)
3203 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3204 desc.datalen = CPU_TO_LE16(msglen);
3206 status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
3212 * i40e_aq_debug_read_register
3213 * @hw: pointer to the hw struct
3214 * @reg_addr: register address
3215 * @reg_val: register value
3216 * @cmd_details: pointer to command details structure or NULL
3218 * Read the register using the admin queue commands
3220 enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
3221 u32 reg_addr, u64 *reg_val,
3222 struct i40e_asq_cmd_details *cmd_details)
3224 struct i40e_aq_desc desc;
3225 struct i40e_aqc_debug_reg_read_write *cmd_resp =
3226 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3227 enum i40e_status_code status;
3229 if (reg_val == NULL)
3230 return I40E_ERR_PARAM;
3232 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_read_reg);
3234 cmd_resp->address = CPU_TO_LE32(reg_addr);
3236 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3238 if (status == I40E_SUCCESS) {
3239 *reg_val = ((u64)LE32_TO_CPU(cmd_resp->value_high) << 32) |
3240 (u64)LE32_TO_CPU(cmd_resp->value_low);
3247 * i40e_aq_debug_write_register
3248 * @hw: pointer to the hw struct
3249 * @reg_addr: register address
3250 * @reg_val: register value
3251 * @cmd_details: pointer to command details structure or NULL
3253 * Write to a register using the admin queue commands
3255 enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
3256 u32 reg_addr, u64 reg_val,
3257 struct i40e_asq_cmd_details *cmd_details)
3259 struct i40e_aq_desc desc;
3260 struct i40e_aqc_debug_reg_read_write *cmd =
3261 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3262 enum i40e_status_code status;
3264 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
3266 cmd->address = CPU_TO_LE32(reg_addr);
3267 cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
3268 cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
3270 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3276 * i40e_aq_request_resource
3277 * @hw: pointer to the hw struct
3278 * @resource: resource id
3279 * @access: access type
3280 * @sdp_number: resource number
3281 * @timeout: the maximum time in ms that the driver may hold the resource
3282 * @cmd_details: pointer to command details structure or NULL
3284 * requests common resource using the admin queue commands
3286 enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
3287 enum i40e_aq_resources_ids resource,
3288 enum i40e_aq_resource_access_type access,
3289 u8 sdp_number, u64 *timeout,
3290 struct i40e_asq_cmd_details *cmd_details)
3292 struct i40e_aq_desc desc;
3293 struct i40e_aqc_request_resource *cmd_resp =
3294 (struct i40e_aqc_request_resource *)&desc.params.raw;
3295 enum i40e_status_code status;
3297 DEBUGFUNC("i40e_aq_request_resource");
3299 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
3301 cmd_resp->resource_id = CPU_TO_LE16(resource);
3302 cmd_resp->access_type = CPU_TO_LE16(access);
3303 cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
3305 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3306 /* The completion specifies the maximum time in ms that the driver
3307 * may hold the resource in the Timeout field.
3308 * If the resource is held by someone else, the command completes with
3309 * busy return value and the timeout field indicates the maximum time
3310 * the current owner of the resource has to free it.
3312 if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
3313 *timeout = LE32_TO_CPU(cmd_resp->timeout);
3319 * i40e_aq_release_resource
3320 * @hw: pointer to the hw struct
3321 * @resource: resource id
3322 * @sdp_number: resource number
3323 * @cmd_details: pointer to command details structure or NULL
3325 * release common resource using the admin queue commands
3327 enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
3328 enum i40e_aq_resources_ids resource,
3330 struct i40e_asq_cmd_details *cmd_details)
3332 struct i40e_aq_desc desc;
3333 struct i40e_aqc_request_resource *cmd =
3334 (struct i40e_aqc_request_resource *)&desc.params.raw;
3335 enum i40e_status_code status;
3337 DEBUGFUNC("i40e_aq_release_resource");
3339 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
3341 cmd->resource_id = CPU_TO_LE16(resource);
3342 cmd->resource_number = CPU_TO_LE32(sdp_number);
3344 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3351 * @hw: pointer to the hw struct
3352 * @module_pointer: module pointer location in words from the NVM beginning
3353 * @offset: byte offset from the module beginning
3354 * @length: length of the section to be read (in bytes from the offset)
3355 * @data: command buffer (size [bytes] = length)
3356 * @last_command: tells if this is the last command in a series
3357 * @cmd_details: pointer to command details structure or NULL
3359 * Read the NVM using the admin queue commands
3361 enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
3362 u32 offset, u16 length, void *data,
3364 struct i40e_asq_cmd_details *cmd_details)
3366 struct i40e_aq_desc desc;
3367 struct i40e_aqc_nvm_update *cmd =
3368 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3369 enum i40e_status_code status;
3371 DEBUGFUNC("i40e_aq_read_nvm");
3373 /* In offset the highest byte must be zeroed. */
3374 if (offset & 0xFF000000) {
3375 status = I40E_ERR_PARAM;
3376 goto i40e_aq_read_nvm_exit;
3379 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
3381 /* If this is the last command in a series, set the proper flag. */
3383 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3384 cmd->module_pointer = module_pointer;
3385 cmd->offset = CPU_TO_LE32(offset);
3386 cmd->length = CPU_TO_LE16(length);
3388 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3389 if (length > I40E_AQ_LARGE_BUF)
3390 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3392 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3394 i40e_aq_read_nvm_exit:
3399 * i40e_aq_read_nvm_config - read an nvm config block
3400 * @hw: pointer to the hw struct
3401 * @cmd_flags: NVM access admin command bits
3402 * @field_id: field or feature id
3403 * @data: buffer for result
3404 * @buf_size: buffer size
3405 * @element_count: pointer to count of elements read by FW
3406 * @cmd_details: pointer to command details structure or NULL
3408 enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
3409 u8 cmd_flags, u32 field_id, void *data,
3410 u16 buf_size, u16 *element_count,
3411 struct i40e_asq_cmd_details *cmd_details)
3413 struct i40e_aq_desc desc;
3414 struct i40e_aqc_nvm_config_read *cmd =
3415 (struct i40e_aqc_nvm_config_read *)&desc.params.raw;
3416 enum i40e_status_code status;
3418 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_read);
3419 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF));
3420 if (buf_size > I40E_AQ_LARGE_BUF)
3421 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3423 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3424 cmd->element_id = CPU_TO_LE16((u16)(0xffff & field_id));
3425 if (cmd_flags & I40E_AQ_ANVM_FEATURE_OR_IMMEDIATE_MASK)
3426 cmd->element_id_msw = CPU_TO_LE16((u16)(field_id >> 16));
3428 cmd->element_id_msw = 0;
3430 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3432 if (!status && element_count)
3433 *element_count = LE16_TO_CPU(cmd->element_count);
3439 * i40e_aq_write_nvm_config - write an nvm config block
3440 * @hw: pointer to the hw struct
3441 * @cmd_flags: NVM access admin command bits
3442 * @data: buffer for result
3443 * @buf_size: buffer size
3444 * @element_count: count of elements to be written
3445 * @cmd_details: pointer to command details structure or NULL
3447 enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
3448 u8 cmd_flags, void *data, u16 buf_size,
3450 struct i40e_asq_cmd_details *cmd_details)
3452 struct i40e_aq_desc desc;
3453 struct i40e_aqc_nvm_config_write *cmd =
3454 (struct i40e_aqc_nvm_config_write *)&desc.params.raw;
3455 enum i40e_status_code status;
3457 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_write);
3458 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3459 if (buf_size > I40E_AQ_LARGE_BUF)
3460 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3462 cmd->element_count = CPU_TO_LE16(element_count);
3463 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3464 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3470 * i40e_aq_oem_post_update - triggers an OEM specific flow after update
3471 * @hw: pointer to the hw struct
3472 * @cmd_details: pointer to command details structure or NULL
3474 enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
3475 void *buff, u16 buff_size,
3476 struct i40e_asq_cmd_details *cmd_details)
3478 struct i40e_aq_desc desc;
3479 enum i40e_status_code status;
3481 UNREFERENCED_2PARAMETER(buff, buff_size);
3483 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_oem_post_update);
3484 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3485 if (status && LE16_TO_CPU(desc.retval) == I40E_AQ_RC_ESRCH)
3486 status = I40E_ERR_NOT_IMPLEMENTED;
3493 * @hw: pointer to the hw struct
3494 * @module_pointer: module pointer location in words from the NVM beginning
3495 * @offset: offset in the module (expressed in 4 KB from module's beginning)
3496 * @length: length of the section to be erased (expressed in 4 KB)
3497 * @last_command: tells if this is the last command in a series
3498 * @cmd_details: pointer to command details structure or NULL
3500 * Erase the NVM sector using the admin queue commands
3502 enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
3503 u32 offset, u16 length, bool last_command,
3504 struct i40e_asq_cmd_details *cmd_details)
3506 struct i40e_aq_desc desc;
3507 struct i40e_aqc_nvm_update *cmd =
3508 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3509 enum i40e_status_code status;
3511 DEBUGFUNC("i40e_aq_erase_nvm");
3513 /* In offset the highest byte must be zeroed. */
3514 if (offset & 0xFF000000) {
3515 status = I40E_ERR_PARAM;
3516 goto i40e_aq_erase_nvm_exit;
3519 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
3521 /* If this is the last command in a series, set the proper flag. */
3523 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3524 cmd->module_pointer = module_pointer;
3525 cmd->offset = CPU_TO_LE32(offset);
3526 cmd->length = CPU_TO_LE16(length);
3528 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3530 i40e_aq_erase_nvm_exit:
3535 * i40e_parse_discover_capabilities
3536 * @hw: pointer to the hw struct
3537 * @buff: pointer to a buffer containing device/function capability records
3538 * @cap_count: number of capability records in the list
3539 * @list_type_opc: type of capabilities list to parse
3541 * Parse the device/function capabilities list.
3543 STATIC void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
3545 enum i40e_admin_queue_opc list_type_opc)
3547 struct i40e_aqc_list_capabilities_element_resp *cap;
3548 u32 valid_functions, num_functions;
3549 u32 number, logical_id, phys_id;
3550 struct i40e_hw_capabilities *p;
3555 cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
3557 if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
3558 p = (struct i40e_hw_capabilities *)&hw->dev_caps;
3559 else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
3560 p = (struct i40e_hw_capabilities *)&hw->func_caps;
3564 for (i = 0; i < cap_count; i++, cap++) {
3565 id = LE16_TO_CPU(cap->id);
3566 number = LE32_TO_CPU(cap->number);
3567 logical_id = LE32_TO_CPU(cap->logical_id);
3568 phys_id = LE32_TO_CPU(cap->phys_id);
3569 major_rev = cap->major_rev;
3572 case I40E_AQ_CAP_ID_SWITCH_MODE:
3573 p->switch_mode = number;
3574 i40e_debug(hw, I40E_DEBUG_INIT,
3575 "HW Capability: Switch mode = %d\n",
3578 case I40E_AQ_CAP_ID_MNG_MODE:
3579 p->management_mode = number;
3580 i40e_debug(hw, I40E_DEBUG_INIT,
3581 "HW Capability: Management Mode = %d\n",
3582 p->management_mode);
3584 case I40E_AQ_CAP_ID_NPAR_ACTIVE:
3585 p->npar_enable = number;
3586 i40e_debug(hw, I40E_DEBUG_INIT,
3587 "HW Capability: NPAR enable = %d\n",
3590 case I40E_AQ_CAP_ID_OS2BMC_CAP:
3592 i40e_debug(hw, I40E_DEBUG_INIT,
3593 "HW Capability: OS2BMC = %d\n", p->os2bmc);
3595 case I40E_AQ_CAP_ID_FUNCTIONS_VALID:
3596 p->valid_functions = number;
3597 i40e_debug(hw, I40E_DEBUG_INIT,
3598 "HW Capability: Valid Functions = %d\n",
3599 p->valid_functions);
3601 case I40E_AQ_CAP_ID_SRIOV:
3603 p->sr_iov_1_1 = true;
3604 i40e_debug(hw, I40E_DEBUG_INIT,
3605 "HW Capability: SR-IOV = %d\n",
3608 case I40E_AQ_CAP_ID_VF:
3609 p->num_vfs = number;
3610 p->vf_base_id = logical_id;
3611 i40e_debug(hw, I40E_DEBUG_INIT,
3612 "HW Capability: VF count = %d\n",
3614 i40e_debug(hw, I40E_DEBUG_INIT,
3615 "HW Capability: VF base_id = %d\n",
3618 case I40E_AQ_CAP_ID_VMDQ:
3621 i40e_debug(hw, I40E_DEBUG_INIT,
3622 "HW Capability: VMDQ = %d\n", p->vmdq);
3624 case I40E_AQ_CAP_ID_8021QBG:
3626 p->evb_802_1_qbg = true;
3627 i40e_debug(hw, I40E_DEBUG_INIT,
3628 "HW Capability: 802.1Qbg = %d\n", number);
3630 case I40E_AQ_CAP_ID_8021QBR:
3632 p->evb_802_1_qbh = true;
3633 i40e_debug(hw, I40E_DEBUG_INIT,
3634 "HW Capability: 802.1Qbh = %d\n", number);
3636 case I40E_AQ_CAP_ID_VSI:
3637 p->num_vsis = number;
3638 i40e_debug(hw, I40E_DEBUG_INIT,
3639 "HW Capability: VSI count = %d\n",
3642 case I40E_AQ_CAP_ID_DCB:
3645 p->enabled_tcmap = logical_id;
3648 i40e_debug(hw, I40E_DEBUG_INIT,
3649 "HW Capability: DCB = %d\n", p->dcb);
3650 i40e_debug(hw, I40E_DEBUG_INIT,
3651 "HW Capability: TC Mapping = %d\n",
3653 i40e_debug(hw, I40E_DEBUG_INIT,
3654 "HW Capability: TC Max = %d\n", p->maxtc);
3656 case I40E_AQ_CAP_ID_FCOE:
3659 i40e_debug(hw, I40E_DEBUG_INIT,
3660 "HW Capability: FCOE = %d\n", p->fcoe);
3662 case I40E_AQ_CAP_ID_ISCSI:
3665 i40e_debug(hw, I40E_DEBUG_INIT,
3666 "HW Capability: iSCSI = %d\n", p->iscsi);
3668 case I40E_AQ_CAP_ID_RSS:
3670 p->rss_table_size = number;
3671 p->rss_table_entry_width = logical_id;
3672 i40e_debug(hw, I40E_DEBUG_INIT,
3673 "HW Capability: RSS = %d\n", p->rss);
3674 i40e_debug(hw, I40E_DEBUG_INIT,
3675 "HW Capability: RSS table size = %d\n",
3677 i40e_debug(hw, I40E_DEBUG_INIT,
3678 "HW Capability: RSS table width = %d\n",
3679 p->rss_table_entry_width);
3681 case I40E_AQ_CAP_ID_RXQ:
3682 p->num_rx_qp = number;
3683 p->base_queue = phys_id;
3684 i40e_debug(hw, I40E_DEBUG_INIT,
3685 "HW Capability: Rx QP = %d\n", number);
3686 i40e_debug(hw, I40E_DEBUG_INIT,
3687 "HW Capability: base_queue = %d\n",
3690 case I40E_AQ_CAP_ID_TXQ:
3691 p->num_tx_qp = number;
3692 p->base_queue = phys_id;
3693 i40e_debug(hw, I40E_DEBUG_INIT,
3694 "HW Capability: Tx QP = %d\n", number);
3695 i40e_debug(hw, I40E_DEBUG_INIT,
3696 "HW Capability: base_queue = %d\n",
3699 case I40E_AQ_CAP_ID_MSIX:
3700 p->num_msix_vectors = number;
3701 i40e_debug(hw, I40E_DEBUG_INIT,
3702 "HW Capability: MSIX vector count = %d\n",
3703 p->num_msix_vectors);
3705 case I40E_AQ_CAP_ID_VF_MSIX:
3706 p->num_msix_vectors_vf = number;
3707 i40e_debug(hw, I40E_DEBUG_INIT,
3708 "HW Capability: MSIX VF vector count = %d\n",
3709 p->num_msix_vectors_vf);
3711 case I40E_AQ_CAP_ID_FLEX10:
3712 if (major_rev == 1) {
3714 p->flex10_enable = true;
3715 p->flex10_capable = true;
3718 /* Capability revision >= 2 */
3720 p->flex10_enable = true;
3722 p->flex10_capable = true;
3724 p->flex10_mode = logical_id;
3725 p->flex10_status = phys_id;
3726 i40e_debug(hw, I40E_DEBUG_INIT,
3727 "HW Capability: Flex10 mode = %d\n",
3729 i40e_debug(hw, I40E_DEBUG_INIT,
3730 "HW Capability: Flex10 status = %d\n",
3733 case I40E_AQ_CAP_ID_CEM:
3736 i40e_debug(hw, I40E_DEBUG_INIT,
3737 "HW Capability: CEM = %d\n", p->mgmt_cem);
3739 case I40E_AQ_CAP_ID_IWARP:
3742 i40e_debug(hw, I40E_DEBUG_INIT,
3743 "HW Capability: iWARP = %d\n", p->iwarp);
3745 case I40E_AQ_CAP_ID_LED:
3746 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3747 p->led[phys_id] = true;
3748 i40e_debug(hw, I40E_DEBUG_INIT,
3749 "HW Capability: LED - PIN %d\n", phys_id);
3751 case I40E_AQ_CAP_ID_SDP:
3752 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3753 p->sdp[phys_id] = true;
3754 i40e_debug(hw, I40E_DEBUG_INIT,
3755 "HW Capability: SDP - PIN %d\n", phys_id);
3757 case I40E_AQ_CAP_ID_MDIO:
3759 p->mdio_port_num = phys_id;
3760 p->mdio_port_mode = logical_id;
3762 i40e_debug(hw, I40E_DEBUG_INIT,
3763 "HW Capability: MDIO port number = %d\n",
3765 i40e_debug(hw, I40E_DEBUG_INIT,
3766 "HW Capability: MDIO port mode = %d\n",
3769 case I40E_AQ_CAP_ID_1588:
3771 p->ieee_1588 = true;
3772 i40e_debug(hw, I40E_DEBUG_INIT,
3773 "HW Capability: IEEE 1588 = %d\n",
3776 case I40E_AQ_CAP_ID_FLOW_DIRECTOR:
3778 p->fd_filters_guaranteed = number;
3779 p->fd_filters_best_effort = logical_id;
3780 i40e_debug(hw, I40E_DEBUG_INIT,
3781 "HW Capability: Flow Director = 1\n");
3782 i40e_debug(hw, I40E_DEBUG_INIT,
3783 "HW Capability: Guaranteed FD filters = %d\n",
3784 p->fd_filters_guaranteed);
3786 case I40E_AQ_CAP_ID_WSR_PROT:
3787 p->wr_csr_prot = (u64)number;
3788 p->wr_csr_prot |= (u64)logical_id << 32;
3789 i40e_debug(hw, I40E_DEBUG_INIT,
3790 "HW Capability: wr_csr_prot = 0x%llX\n\n",
3791 (p->wr_csr_prot & 0xffff));
3793 case I40E_AQ_CAP_ID_NVM_MGMT:
3794 if (number & I40E_NVM_MGMT_SEC_REV_DISABLED)
3795 p->sec_rev_disabled = true;
3796 if (number & I40E_NVM_MGMT_UPDATE_DISABLED)
3797 p->update_disabled = true;
3800 case I40E_AQ_CAP_ID_WOL_AND_PROXY:
3801 hw->num_wol_proxy_filters = (u16)number;
3802 hw->wol_proxy_vsi_seid = (u16)logical_id;
3803 p->apm_wol_support = phys_id & I40E_WOL_SUPPORT_MASK;
3804 if (phys_id & I40E_ACPI_PROGRAMMING_METHOD_MASK)
3805 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_AQC_FPK;
3807 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_HW_FVL;
3808 p->proxy_support = (phys_id & I40E_PROXY_SUPPORT_MASK) ? 1 : 0;
3809 p->proxy_support = p->proxy_support;
3810 i40e_debug(hw, I40E_DEBUG_INIT,
3811 "HW Capability: WOL proxy filters = %d\n",
3812 hw->num_wol_proxy_filters);
3821 i40e_debug(hw, I40E_DEBUG_ALL, "device is FCoE capable\n");
3823 /* Always disable FCoE if compiled without the I40E_FCOE_ENA flag */
3826 /* count the enabled ports (aka the "not disabled" ports) */
3828 for (i = 0; i < 4; i++) {
3829 u32 port_cfg_reg = I40E_PRTGEN_CNF + (4 * i);
3832 /* use AQ read to get the physical register offset instead
3833 * of the port relative offset
3835 i40e_aq_debug_read_register(hw, port_cfg_reg, &port_cfg, NULL);
3836 if (!(port_cfg & I40E_PRTGEN_CNF_PORT_DIS_MASK))
3840 valid_functions = p->valid_functions;
3842 while (valid_functions) {
3843 if (valid_functions & 1)
3845 valid_functions >>= 1;
3848 /* partition id is 1-based, and functions are evenly spread
3849 * across the ports as partitions
3851 hw->partition_id = (hw->pf_id / hw->num_ports) + 1;
3852 hw->num_partitions = num_functions / hw->num_ports;
3854 /* additional HW specific goodies that might
3855 * someday be HW version specific
3857 p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
3861 * i40e_aq_discover_capabilities
3862 * @hw: pointer to the hw struct
3863 * @buff: a virtual buffer to hold the capabilities
3864 * @buff_size: Size of the virtual buffer
3865 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
3866 * @list_type_opc: capabilities type to discover - pass in the command opcode
3867 * @cmd_details: pointer to command details structure or NULL
3869 * Get the device capabilities descriptions from the firmware
3871 enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
3872 void *buff, u16 buff_size, u16 *data_size,
3873 enum i40e_admin_queue_opc list_type_opc,
3874 struct i40e_asq_cmd_details *cmd_details)
3876 struct i40e_aqc_list_capabilites *cmd;
3877 struct i40e_aq_desc desc;
3878 enum i40e_status_code status = I40E_SUCCESS;
3880 cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
3882 if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
3883 list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
3884 status = I40E_ERR_PARAM;
3888 i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
3890 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3891 if (buff_size > I40E_AQ_LARGE_BUF)
3892 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3894 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3895 *data_size = LE16_TO_CPU(desc.datalen);
3900 i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
3908 * i40e_aq_update_nvm
3909 * @hw: pointer to the hw struct
3910 * @module_pointer: module pointer location in words from the NVM beginning
3911 * @offset: byte offset from the module beginning
3912 * @length: length of the section to be written (in bytes from the offset)
3913 * @data: command buffer (size [bytes] = length)
3914 * @last_command: tells if this is the last command in a series
3915 * @cmd_details: pointer to command details structure or NULL
3917 * Update the NVM using the admin queue commands
3919 enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
3920 u32 offset, u16 length, void *data,
3922 struct i40e_asq_cmd_details *cmd_details)
3924 struct i40e_aq_desc desc;
3925 struct i40e_aqc_nvm_update *cmd =
3926 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3927 enum i40e_status_code status;
3929 DEBUGFUNC("i40e_aq_update_nvm");
3931 /* In offset the highest byte must be zeroed. */
3932 if (offset & 0xFF000000) {
3933 status = I40E_ERR_PARAM;
3934 goto i40e_aq_update_nvm_exit;
3937 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
3939 /* If this is the last command in a series, set the proper flag. */
3941 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3942 cmd->module_pointer = module_pointer;
3943 cmd->offset = CPU_TO_LE32(offset);
3944 cmd->length = CPU_TO_LE16(length);
3946 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3947 if (length > I40E_AQ_LARGE_BUF)
3948 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3950 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3952 i40e_aq_update_nvm_exit:
3957 * i40e_aq_get_lldp_mib
3958 * @hw: pointer to the hw struct
3959 * @bridge_type: type of bridge requested
3960 * @mib_type: Local, Remote or both Local and Remote MIBs
3961 * @buff: pointer to a user supplied buffer to store the MIB block
3962 * @buff_size: size of the buffer (in bytes)
3963 * @local_len : length of the returned Local LLDP MIB
3964 * @remote_len: length of the returned Remote LLDP MIB
3965 * @cmd_details: pointer to command details structure or NULL
3967 * Requests the complete LLDP MIB (entire packet).
3969 enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
3970 u8 mib_type, void *buff, u16 buff_size,
3971 u16 *local_len, u16 *remote_len,
3972 struct i40e_asq_cmd_details *cmd_details)
3974 struct i40e_aq_desc desc;
3975 struct i40e_aqc_lldp_get_mib *cmd =
3976 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
3977 struct i40e_aqc_lldp_get_mib *resp =
3978 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
3979 enum i40e_status_code status;
3981 if (buff_size == 0 || !buff)
3982 return I40E_ERR_PARAM;
3984 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
3985 /* Indirect Command */
3986 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3988 cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
3989 cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3990 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3992 desc.datalen = CPU_TO_LE16(buff_size);
3994 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3995 if (buff_size > I40E_AQ_LARGE_BUF)
3996 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3998 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4000 if (local_len != NULL)
4001 *local_len = LE16_TO_CPU(resp->local_len);
4002 if (remote_len != NULL)
4003 *remote_len = LE16_TO_CPU(resp->remote_len);
4010 * i40e_aq_set_lldp_mib - Set the LLDP MIB
4011 * @hw: pointer to the hw struct
4012 * @mib_type: Local, Remote or both Local and Remote MIBs
4013 * @buff: pointer to a user supplied buffer to store the MIB block
4014 * @buff_size: size of the buffer (in bytes)
4015 * @cmd_details: pointer to command details structure or NULL
4019 enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
4020 u8 mib_type, void *buff, u16 buff_size,
4021 struct i40e_asq_cmd_details *cmd_details)
4023 struct i40e_aq_desc desc;
4024 struct i40e_aqc_lldp_set_local_mib *cmd =
4025 (struct i40e_aqc_lldp_set_local_mib *)&desc.params.raw;
4026 enum i40e_status_code status;
4028 if (buff_size == 0 || !buff)
4029 return I40E_ERR_PARAM;
4031 i40e_fill_default_direct_cmd_desc(&desc,
4032 i40e_aqc_opc_lldp_set_local_mib);
4033 /* Indirect Command */
4034 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4035 if (buff_size > I40E_AQ_LARGE_BUF)
4036 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4037 desc.datalen = CPU_TO_LE16(buff_size);
4039 cmd->type = mib_type;
4040 cmd->length = CPU_TO_LE16(buff_size);
4041 cmd->address_high = CPU_TO_LE32(I40E_HI_WORD((u64)buff));
4042 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buff));
4044 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4049 * i40e_aq_cfg_lldp_mib_change_event
4050 * @hw: pointer to the hw struct
4051 * @enable_update: Enable or Disable event posting
4052 * @cmd_details: pointer to command details structure or NULL
4054 * Enable or Disable posting of an event on ARQ when LLDP MIB
4055 * associated with the interface changes
4057 enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
4059 struct i40e_asq_cmd_details *cmd_details)
4061 struct i40e_aq_desc desc;
4062 struct i40e_aqc_lldp_update_mib *cmd =
4063 (struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
4064 enum i40e_status_code status;
4066 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
4069 cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
4071 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4077 * i40e_aq_add_lldp_tlv
4078 * @hw: pointer to the hw struct
4079 * @bridge_type: type of bridge
4080 * @buff: buffer with TLV to add
4081 * @buff_size: length of the buffer
4082 * @tlv_len: length of the TLV to be added
4083 * @mib_len: length of the LLDP MIB returned in response
4084 * @cmd_details: pointer to command details structure or NULL
4086 * Add the specified TLV to LLDP Local MIB for the given bridge type,
4087 * it is responsibility of the caller to make sure that the TLV is not
4088 * already present in the LLDPDU.
4089 * In return firmware will write the complete LLDP MIB with the newly
4090 * added TLV in the response buffer.
4092 enum i40e_status_code i40e_aq_add_lldp_tlv(struct i40e_hw *hw, u8 bridge_type,
4093 void *buff, u16 buff_size, u16 tlv_len,
4095 struct i40e_asq_cmd_details *cmd_details)
4097 struct i40e_aq_desc desc;
4098 struct i40e_aqc_lldp_add_tlv *cmd =
4099 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4100 enum i40e_status_code status;
4102 if (buff_size == 0 || !buff || tlv_len == 0)
4103 return I40E_ERR_PARAM;
4105 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_add_tlv);
4107 /* Indirect Command */
4108 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4109 if (buff_size > I40E_AQ_LARGE_BUF)
4110 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4111 desc.datalen = CPU_TO_LE16(buff_size);
4113 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4114 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4115 cmd->len = CPU_TO_LE16(tlv_len);
4117 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4119 if (mib_len != NULL)
4120 *mib_len = LE16_TO_CPU(desc.datalen);
4127 * i40e_aq_update_lldp_tlv
4128 * @hw: pointer to the hw struct
4129 * @bridge_type: type of bridge
4130 * @buff: buffer with TLV to update
4131 * @buff_size: size of the buffer holding original and updated TLVs
4132 * @old_len: Length of the Original TLV
4133 * @new_len: Length of the Updated TLV
4134 * @offset: offset of the updated TLV in the buff
4135 * @mib_len: length of the returned LLDP MIB
4136 * @cmd_details: pointer to command details structure or NULL
4138 * Update the specified TLV to the LLDP Local MIB for the given bridge type.
4139 * Firmware will place the complete LLDP MIB in response buffer with the
4142 enum i40e_status_code i40e_aq_update_lldp_tlv(struct i40e_hw *hw,
4143 u8 bridge_type, void *buff, u16 buff_size,
4144 u16 old_len, u16 new_len, u16 offset,
4146 struct i40e_asq_cmd_details *cmd_details)
4148 struct i40e_aq_desc desc;
4149 struct i40e_aqc_lldp_update_tlv *cmd =
4150 (struct i40e_aqc_lldp_update_tlv *)&desc.params.raw;
4151 enum i40e_status_code status;
4153 if (buff_size == 0 || !buff || offset == 0 ||
4154 old_len == 0 || new_len == 0)
4155 return I40E_ERR_PARAM;
4157 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_tlv);
4159 /* Indirect Command */
4160 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4161 if (buff_size > I40E_AQ_LARGE_BUF)
4162 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4163 desc.datalen = CPU_TO_LE16(buff_size);
4165 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4166 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4167 cmd->old_len = CPU_TO_LE16(old_len);
4168 cmd->new_offset = CPU_TO_LE16(offset);
4169 cmd->new_len = CPU_TO_LE16(new_len);
4171 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4173 if (mib_len != NULL)
4174 *mib_len = LE16_TO_CPU(desc.datalen);
4181 * i40e_aq_delete_lldp_tlv
4182 * @hw: pointer to the hw struct
4183 * @bridge_type: type of bridge
4184 * @buff: pointer to a user supplied buffer that has the TLV
4185 * @buff_size: length of the buffer
4186 * @tlv_len: length of the TLV to be deleted
4187 * @mib_len: length of the returned LLDP MIB
4188 * @cmd_details: pointer to command details structure or NULL
4190 * Delete the specified TLV from LLDP Local MIB for the given bridge type.
4191 * The firmware places the entire LLDP MIB in the response buffer.
4193 enum i40e_status_code i40e_aq_delete_lldp_tlv(struct i40e_hw *hw,
4194 u8 bridge_type, void *buff, u16 buff_size,
4195 u16 tlv_len, u16 *mib_len,
4196 struct i40e_asq_cmd_details *cmd_details)
4198 struct i40e_aq_desc desc;
4199 struct i40e_aqc_lldp_add_tlv *cmd =
4200 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4201 enum i40e_status_code status;
4203 if (buff_size == 0 || !buff)
4204 return I40E_ERR_PARAM;
4206 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_delete_tlv);
4208 /* Indirect Command */
4209 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4210 if (buff_size > I40E_AQ_LARGE_BUF)
4211 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4212 desc.datalen = CPU_TO_LE16(buff_size);
4213 cmd->len = CPU_TO_LE16(tlv_len);
4214 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4215 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4217 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4219 if (mib_len != NULL)
4220 *mib_len = LE16_TO_CPU(desc.datalen);
4228 * @hw: pointer to the hw struct
4229 * @shutdown_agent: True if LLDP Agent needs to be Shutdown
4230 * @cmd_details: pointer to command details structure or NULL
4232 * Stop or Shutdown the embedded LLDP Agent
4234 enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
4235 struct i40e_asq_cmd_details *cmd_details)
4237 struct i40e_aq_desc desc;
4238 struct i40e_aqc_lldp_stop *cmd =
4239 (struct i40e_aqc_lldp_stop *)&desc.params.raw;
4240 enum i40e_status_code status;
4242 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
4245 cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
4247 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4253 * i40e_aq_start_lldp
4254 * @hw: pointer to the hw struct
4255 * @cmd_details: pointer to command details structure or NULL
4257 * Start the embedded LLDP Agent on all ports.
4259 enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
4260 struct i40e_asq_cmd_details *cmd_details)
4262 struct i40e_aq_desc desc;
4263 struct i40e_aqc_lldp_start *cmd =
4264 (struct i40e_aqc_lldp_start *)&desc.params.raw;
4265 enum i40e_status_code status;
4267 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
4269 cmd->command = I40E_AQ_LLDP_AGENT_START;
4271 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4277 * i40e_aq_get_cee_dcb_config
4278 * @hw: pointer to the hw struct
4279 * @buff: response buffer that stores CEE operational configuration
4280 * @buff_size: size of the buffer passed
4281 * @cmd_details: pointer to command details structure or NULL
4283 * Get CEE DCBX mode operational configuration from firmware
4285 enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
4286 void *buff, u16 buff_size,
4287 struct i40e_asq_cmd_details *cmd_details)
4289 struct i40e_aq_desc desc;
4290 enum i40e_status_code status;
4292 if (buff_size == 0 || !buff)
4293 return I40E_ERR_PARAM;
4295 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_cee_dcb_cfg);
4297 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4298 status = i40e_asq_send_command(hw, &desc, (void *)buff, buff_size,
4305 * i40e_aq_start_stop_dcbx - Start/Stop DCBx service in FW
4306 * @hw: pointer to the hw struct
4307 * @start_agent: True if DCBx Agent needs to be Started
4308 * False if DCBx Agent needs to be Stopped
4309 * @cmd_details: pointer to command details structure or NULL
4311 * Start/Stop the embedded dcbx Agent
4313 enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
4315 struct i40e_asq_cmd_details *cmd_details)
4317 struct i40e_aq_desc desc;
4318 struct i40e_aqc_lldp_stop_start_specific_agent *cmd =
4319 (struct i40e_aqc_lldp_stop_start_specific_agent *)
4321 enum i40e_status_code status;
4323 i40e_fill_default_direct_cmd_desc(&desc,
4324 i40e_aqc_opc_lldp_stop_start_spec_agent);
4327 cmd->command = I40E_AQC_START_SPECIFIC_AGENT_MASK;
4329 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4335 * i40e_aq_add_udp_tunnel
4336 * @hw: pointer to the hw struct
4337 * @udp_port: the UDP port to add
4338 * @header_len: length of the tunneling header length in DWords
4339 * @protocol_index: protocol index type
4340 * @filter_index: pointer to filter index
4341 * @cmd_details: pointer to command details structure or NULL
4343 enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
4344 u16 udp_port, u8 protocol_index,
4346 struct i40e_asq_cmd_details *cmd_details)
4348 struct i40e_aq_desc desc;
4349 struct i40e_aqc_add_udp_tunnel *cmd =
4350 (struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
4351 struct i40e_aqc_del_udp_tunnel_completion *resp =
4352 (struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
4353 enum i40e_status_code status;
4355 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
4357 cmd->udp_port = CPU_TO_LE16(udp_port);
4358 cmd->protocol_type = protocol_index;
4360 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4362 if (!status && filter_index)
4363 *filter_index = resp->index;
4369 * i40e_aq_del_udp_tunnel
4370 * @hw: pointer to the hw struct
4371 * @index: filter index
4372 * @cmd_details: pointer to command details structure or NULL
4374 enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
4375 struct i40e_asq_cmd_details *cmd_details)
4377 struct i40e_aq_desc desc;
4378 struct i40e_aqc_remove_udp_tunnel *cmd =
4379 (struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
4380 enum i40e_status_code status;
4382 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
4386 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4392 * i40e_aq_get_switch_resource_alloc (0x0204)
4393 * @hw: pointer to the hw struct
4394 * @num_entries: pointer to u8 to store the number of resource entries returned
4395 * @buf: pointer to a user supplied buffer. This buffer must be large enough
4396 * to store the resource information for all resource types. Each
4397 * resource type is a i40e_aqc_switch_resource_alloc_data structure.
4398 * @count: size, in bytes, of the buffer provided
4399 * @cmd_details: pointer to command details structure or NULL
4401 * Query the resources allocated to a function.
4403 enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
4405 struct i40e_aqc_switch_resource_alloc_element_resp *buf,
4407 struct i40e_asq_cmd_details *cmd_details)
4409 struct i40e_aq_desc desc;
4410 struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
4411 (struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
4412 enum i40e_status_code status;
4413 u16 length = count * sizeof(*buf);
4415 i40e_fill_default_direct_cmd_desc(&desc,
4416 i40e_aqc_opc_get_switch_resource_alloc);
4418 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4419 if (length > I40E_AQ_LARGE_BUF)
4420 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4422 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4424 if (!status && num_entries)
4425 *num_entries = cmd_resp->num_entries;
4431 * i40e_aq_delete_element - Delete switch element
4432 * @hw: pointer to the hw struct
4433 * @seid: the SEID to delete from the switch
4434 * @cmd_details: pointer to command details structure or NULL
4436 * This deletes a switch element from the switch.
4438 enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
4439 struct i40e_asq_cmd_details *cmd_details)
4441 struct i40e_aq_desc desc;
4442 struct i40e_aqc_switch_seid *cmd =
4443 (struct i40e_aqc_switch_seid *)&desc.params.raw;
4444 enum i40e_status_code status;
4447 return I40E_ERR_PARAM;
4449 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
4451 cmd->seid = CPU_TO_LE16(seid);
4453 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4459 * i40e_aq_add_pvirt - Instantiate a Port Virtualizer on a port
4460 * @hw: pointer to the hw struct
4461 * @flags: component flags
4462 * @mac_seid: uplink seid (MAC SEID)
4463 * @vsi_seid: connected vsi seid
4464 * @ret_seid: seid of create pv component
4466 * This instantiates an i40e port virtualizer with specified flags.
4467 * Depending on specified flags the port virtualizer can act as a
4468 * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
4470 enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
4471 u16 mac_seid, u16 vsi_seid,
4474 struct i40e_aq_desc desc;
4475 struct i40e_aqc_add_update_pv *cmd =
4476 (struct i40e_aqc_add_update_pv *)&desc.params.raw;
4477 struct i40e_aqc_add_update_pv_completion *resp =
4478 (struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
4479 enum i40e_status_code status;
4482 return I40E_ERR_PARAM;
4484 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
4485 cmd->command_flags = CPU_TO_LE16(flags);
4486 cmd->uplink_seid = CPU_TO_LE16(mac_seid);
4487 cmd->connected_seid = CPU_TO_LE16(vsi_seid);
4489 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4490 if (!status && ret_seid)
4491 *ret_seid = LE16_TO_CPU(resp->pv_seid);
4497 * i40e_aq_add_tag - Add an S/E-tag
4498 * @hw: pointer to the hw struct
4499 * @direct_to_queue: should s-tag direct flow to a specific queue
4500 * @vsi_seid: VSI SEID to use this tag
4501 * @tag: value of the tag
4502 * @queue_num: queue number, only valid is direct_to_queue is true
4503 * @tags_used: return value, number of tags in use by this PF
4504 * @tags_free: return value, number of unallocated tags
4505 * @cmd_details: pointer to command details structure or NULL
4507 * This associates an S- or E-tag to a VSI in the switch complex. It returns
4508 * the number of tags allocated by the PF, and the number of unallocated
4511 enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
4512 u16 vsi_seid, u16 tag, u16 queue_num,
4513 u16 *tags_used, u16 *tags_free,
4514 struct i40e_asq_cmd_details *cmd_details)
4516 struct i40e_aq_desc desc;
4517 struct i40e_aqc_add_tag *cmd =
4518 (struct i40e_aqc_add_tag *)&desc.params.raw;
4519 struct i40e_aqc_add_remove_tag_completion *resp =
4520 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4521 enum i40e_status_code status;
4524 return I40E_ERR_PARAM;
4526 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
4528 cmd->seid = CPU_TO_LE16(vsi_seid);
4529 cmd->tag = CPU_TO_LE16(tag);
4530 if (direct_to_queue) {
4531 cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
4532 cmd->queue_number = CPU_TO_LE16(queue_num);
4535 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4538 if (tags_used != NULL)
4539 *tags_used = LE16_TO_CPU(resp->tags_used);
4540 if (tags_free != NULL)
4541 *tags_free = LE16_TO_CPU(resp->tags_free);
4548 * i40e_aq_remove_tag - Remove an S- or E-tag
4549 * @hw: pointer to the hw struct
4550 * @vsi_seid: VSI SEID this tag is associated with
4551 * @tag: value of the S-tag to delete
4552 * @tags_used: return value, number of tags in use by this PF
4553 * @tags_free: return value, number of unallocated tags
4554 * @cmd_details: pointer to command details structure or NULL
4556 * This deletes an S- or E-tag from a VSI in the switch complex. It returns
4557 * the number of tags allocated by the PF, and the number of unallocated
4560 enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
4561 u16 tag, u16 *tags_used, u16 *tags_free,
4562 struct i40e_asq_cmd_details *cmd_details)
4564 struct i40e_aq_desc desc;
4565 struct i40e_aqc_remove_tag *cmd =
4566 (struct i40e_aqc_remove_tag *)&desc.params.raw;
4567 struct i40e_aqc_add_remove_tag_completion *resp =
4568 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4569 enum i40e_status_code status;
4572 return I40E_ERR_PARAM;
4574 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
4576 cmd->seid = CPU_TO_LE16(vsi_seid);
4577 cmd->tag = CPU_TO_LE16(tag);
4579 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4582 if (tags_used != NULL)
4583 *tags_used = LE16_TO_CPU(resp->tags_used);
4584 if (tags_free != NULL)
4585 *tags_free = LE16_TO_CPU(resp->tags_free);
4592 * i40e_aq_add_mcast_etag - Add a multicast E-tag
4593 * @hw: pointer to the hw struct
4594 * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
4595 * @etag: value of E-tag to add
4596 * @num_tags_in_buf: number of unicast E-tags in indirect buffer
4597 * @buf: address of indirect buffer
4598 * @tags_used: return value, number of E-tags in use by this port
4599 * @tags_free: return value, number of unallocated M-tags
4600 * @cmd_details: pointer to command details structure or NULL
4602 * This associates a multicast E-tag to a port virtualizer. It will return
4603 * the number of tags allocated by the PF, and the number of unallocated
4606 * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
4607 * num_tags_in_buf long.
4609 enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4610 u16 etag, u8 num_tags_in_buf, void *buf,
4611 u16 *tags_used, u16 *tags_free,
4612 struct i40e_asq_cmd_details *cmd_details)
4614 struct i40e_aq_desc desc;
4615 struct i40e_aqc_add_remove_mcast_etag *cmd =
4616 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4617 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4618 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4619 enum i40e_status_code status;
4620 u16 length = sizeof(u16) * num_tags_in_buf;
4622 if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
4623 return I40E_ERR_PARAM;
4625 i40e_fill_default_direct_cmd_desc(&desc,
4626 i40e_aqc_opc_add_multicast_etag);
4628 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4629 cmd->etag = CPU_TO_LE16(etag);
4630 cmd->num_unicast_etags = num_tags_in_buf;
4632 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4633 if (length > I40E_AQ_LARGE_BUF)
4634 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4636 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4639 if (tags_used != NULL)
4640 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4641 if (tags_free != NULL)
4642 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4649 * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
4650 * @hw: pointer to the hw struct
4651 * @pv_seid: Port Virtualizer SEID this M-tag is associated with
4652 * @etag: value of the E-tag to remove
4653 * @tags_used: return value, number of tags in use by this port
4654 * @tags_free: return value, number of unallocated tags
4655 * @cmd_details: pointer to command details structure or NULL
4657 * This deletes an E-tag from the port virtualizer. It will return
4658 * the number of tags allocated by the port, and the number of unallocated
4661 enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4662 u16 etag, u16 *tags_used, u16 *tags_free,
4663 struct i40e_asq_cmd_details *cmd_details)
4665 struct i40e_aq_desc desc;
4666 struct i40e_aqc_add_remove_mcast_etag *cmd =
4667 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4668 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4669 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4670 enum i40e_status_code status;
4674 return I40E_ERR_PARAM;
4676 i40e_fill_default_direct_cmd_desc(&desc,
4677 i40e_aqc_opc_remove_multicast_etag);
4679 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4680 cmd->etag = CPU_TO_LE16(etag);
4682 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4685 if (tags_used != NULL)
4686 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4687 if (tags_free != NULL)
4688 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4695 * i40e_aq_update_tag - Update an S/E-tag
4696 * @hw: pointer to the hw struct
4697 * @vsi_seid: VSI SEID using this S-tag
4698 * @old_tag: old tag value
4699 * @new_tag: new tag value
4700 * @tags_used: return value, number of tags in use by this PF
4701 * @tags_free: return value, number of unallocated tags
4702 * @cmd_details: pointer to command details structure or NULL
4704 * This updates the value of the tag currently attached to this VSI
4705 * in the switch complex. It will return the number of tags allocated
4706 * by the PF, and the number of unallocated tags available.
4708 enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
4709 u16 old_tag, u16 new_tag, u16 *tags_used,
4711 struct i40e_asq_cmd_details *cmd_details)
4713 struct i40e_aq_desc desc;
4714 struct i40e_aqc_update_tag *cmd =
4715 (struct i40e_aqc_update_tag *)&desc.params.raw;
4716 struct i40e_aqc_update_tag_completion *resp =
4717 (struct i40e_aqc_update_tag_completion *)&desc.params.raw;
4718 enum i40e_status_code status;
4721 return I40E_ERR_PARAM;
4723 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
4725 cmd->seid = CPU_TO_LE16(vsi_seid);
4726 cmd->old_tag = CPU_TO_LE16(old_tag);
4727 cmd->new_tag = CPU_TO_LE16(new_tag);
4729 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4732 if (tags_used != NULL)
4733 *tags_used = LE16_TO_CPU(resp->tags_used);
4734 if (tags_free != NULL)
4735 *tags_free = LE16_TO_CPU(resp->tags_free);
4742 * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
4743 * @hw: pointer to the hw struct
4744 * @tcmap: TC map for request/release any ignore PFC condition
4745 * @request: request or release ignore PFC condition
4746 * @tcmap_ret: return TCs for which PFC is currently ignored
4747 * @cmd_details: pointer to command details structure or NULL
4749 * This sends out request/release to ignore PFC condition for a TC.
4750 * It will return the TCs for which PFC is currently ignored.
4752 enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
4753 bool request, u8 *tcmap_ret,
4754 struct i40e_asq_cmd_details *cmd_details)
4756 struct i40e_aq_desc desc;
4757 struct i40e_aqc_pfc_ignore *cmd_resp =
4758 (struct i40e_aqc_pfc_ignore *)&desc.params.raw;
4759 enum i40e_status_code status;
4761 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
4764 cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
4766 cmd_resp->tc_bitmap = tcmap;
4768 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4771 if (tcmap_ret != NULL)
4772 *tcmap_ret = cmd_resp->tc_bitmap;
4779 * i40e_aq_dcb_updated - DCB Updated Command
4780 * @hw: pointer to the hw struct
4781 * @cmd_details: pointer to command details structure or NULL
4783 * When LLDP is handled in PF this command is used by the PF
4784 * to notify EMP that a DCB setting is modified.
4785 * When LLDP is handled in EMP this command is used by the PF
4786 * to notify EMP whenever one of the following parameters get
4788 * - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
4789 * - PCIRTT in PRTDCB_GENC.PCIRTT
4790 * - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
4791 * EMP will return when the shared RPB settings have been
4792 * recomputed and modified. The retval field in the descriptor
4793 * will be set to 0 when RPB is modified.
4795 enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
4796 struct i40e_asq_cmd_details *cmd_details)
4798 struct i40e_aq_desc desc;
4799 enum i40e_status_code status;
4801 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
4803 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4809 * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
4810 * @hw: pointer to the hw struct
4811 * @seid: defines the SEID of the switch for which the stats are requested
4812 * @vlan_id: the VLAN ID for which the statistics are requested
4813 * @stat_index: index of the statistics counters block assigned to this VLAN
4814 * @cmd_details: pointer to command details structure or NULL
4816 * XL710 supports 128 smonVlanStats counters.This command is used to
4817 * allocate a set of smonVlanStats counters to a specific VLAN in a specific
4820 enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
4821 u16 vlan_id, u16 *stat_index,
4822 struct i40e_asq_cmd_details *cmd_details)
4824 struct i40e_aq_desc desc;
4825 struct i40e_aqc_add_remove_statistics *cmd_resp =
4826 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4827 enum i40e_status_code status;
4829 if ((seid == 0) || (stat_index == NULL))
4830 return I40E_ERR_PARAM;
4832 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
4834 cmd_resp->seid = CPU_TO_LE16(seid);
4835 cmd_resp->vlan = CPU_TO_LE16(vlan_id);
4837 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4839 if (!status && stat_index)
4840 *stat_index = LE16_TO_CPU(cmd_resp->stat_index);
4846 * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
4847 * @hw: pointer to the hw struct
4848 * @seid: defines the SEID of the switch for which the stats are requested
4849 * @vlan_id: the VLAN ID for which the statistics are requested
4850 * @stat_index: index of the statistics counters block assigned to this VLAN
4851 * @cmd_details: pointer to command details structure or NULL
4853 * XL710 supports 128 smonVlanStats counters.This command is used to
4854 * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
4857 enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
4858 u16 vlan_id, u16 stat_index,
4859 struct i40e_asq_cmd_details *cmd_details)
4861 struct i40e_aq_desc desc;
4862 struct i40e_aqc_add_remove_statistics *cmd =
4863 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4864 enum i40e_status_code status;
4867 return I40E_ERR_PARAM;
4869 i40e_fill_default_direct_cmd_desc(&desc,
4870 i40e_aqc_opc_remove_statistics);
4872 cmd->seid = CPU_TO_LE16(seid);
4873 cmd->vlan = CPU_TO_LE16(vlan_id);
4874 cmd->stat_index = CPU_TO_LE16(stat_index);
4876 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4882 * i40e_aq_set_port_parameters - set physical port parameters.
4883 * @hw: pointer to the hw struct
4884 * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
4885 * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
4886 * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
4887 * @double_vlan: if set double VLAN is enabled
4888 * @cmd_details: pointer to command details structure or NULL
4890 enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
4891 u16 bad_frame_vsi, bool save_bad_pac,
4892 bool pad_short_pac, bool double_vlan,
4893 struct i40e_asq_cmd_details *cmd_details)
4895 struct i40e_aqc_set_port_parameters *cmd;
4896 enum i40e_status_code status;
4897 struct i40e_aq_desc desc;
4898 u16 command_flags = 0;
4900 cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
4902 i40e_fill_default_direct_cmd_desc(&desc,
4903 i40e_aqc_opc_set_port_parameters);
4905 cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
4907 command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
4909 command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
4911 command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
4912 cmd->command_flags = CPU_TO_LE16(command_flags);
4914 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4920 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
4921 * @hw: pointer to the hw struct
4922 * @seid: seid for the physical port/switching component/vsi
4923 * @buff: Indirect buffer to hold data parameters and response
4924 * @buff_size: Indirect buffer size
4925 * @opcode: Tx scheduler AQ command opcode
4926 * @cmd_details: pointer to command details structure or NULL
4928 * Generic command handler for Tx scheduler AQ commands
4930 static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
4931 void *buff, u16 buff_size,
4932 enum i40e_admin_queue_opc opcode,
4933 struct i40e_asq_cmd_details *cmd_details)
4935 struct i40e_aq_desc desc;
4936 struct i40e_aqc_tx_sched_ind *cmd =
4937 (struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
4938 enum i40e_status_code status;
4939 bool cmd_param_flag = false;
4942 case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
4943 case i40e_aqc_opc_configure_vsi_tc_bw:
4944 case i40e_aqc_opc_enable_switching_comp_ets:
4945 case i40e_aqc_opc_modify_switching_comp_ets:
4946 case i40e_aqc_opc_disable_switching_comp_ets:
4947 case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
4948 case i40e_aqc_opc_configure_switching_comp_bw_config:
4949 cmd_param_flag = true;
4951 case i40e_aqc_opc_query_vsi_bw_config:
4952 case i40e_aqc_opc_query_vsi_ets_sla_config:
4953 case i40e_aqc_opc_query_switching_comp_ets_config:
4954 case i40e_aqc_opc_query_port_ets_config:
4955 case i40e_aqc_opc_query_switching_comp_bw_config:
4956 cmd_param_flag = false;
4959 return I40E_ERR_PARAM;
4962 i40e_fill_default_direct_cmd_desc(&desc, opcode);
4964 /* Indirect command */
4965 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4967 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
4968 if (buff_size > I40E_AQ_LARGE_BUF)
4969 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4971 desc.datalen = CPU_TO_LE16(buff_size);
4973 cmd->vsi_seid = CPU_TO_LE16(seid);
4975 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4981 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
4982 * @hw: pointer to the hw struct
4984 * @credit: BW limit credits (0 = disabled)
4985 * @max_credit: Max BW limit credits
4986 * @cmd_details: pointer to command details structure or NULL
4988 enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
4989 u16 seid, u16 credit, u8 max_credit,
4990 struct i40e_asq_cmd_details *cmd_details)
4992 struct i40e_aq_desc desc;
4993 struct i40e_aqc_configure_vsi_bw_limit *cmd =
4994 (struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
4995 enum i40e_status_code status;
4997 i40e_fill_default_direct_cmd_desc(&desc,
4998 i40e_aqc_opc_configure_vsi_bw_limit);
5000 cmd->vsi_seid = CPU_TO_LE16(seid);
5001 cmd->credit = CPU_TO_LE16(credit);
5002 cmd->max_credit = max_credit;
5004 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5010 * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
5011 * @hw: pointer to the hw struct
5012 * @seid: switching component seid
5013 * @credit: BW limit credits (0 = disabled)
5014 * @max_bw: Max BW limit credits
5015 * @cmd_details: pointer to command details structure or NULL
5017 enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
5018 u16 seid, u16 credit, u8 max_bw,
5019 struct i40e_asq_cmd_details *cmd_details)
5021 struct i40e_aq_desc desc;
5022 struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
5023 (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
5024 enum i40e_status_code status;
5026 i40e_fill_default_direct_cmd_desc(&desc,
5027 i40e_aqc_opc_configure_switching_comp_bw_limit);
5029 cmd->seid = CPU_TO_LE16(seid);
5030 cmd->credit = CPU_TO_LE16(credit);
5031 cmd->max_bw = max_bw;
5033 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5039 * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
5040 * @hw: pointer to the hw struct
5042 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5043 * @cmd_details: pointer to command details structure or NULL
5045 enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
5047 struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
5048 struct i40e_asq_cmd_details *cmd_details)
5050 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5051 i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
5056 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
5057 * @hw: pointer to the hw struct
5059 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
5060 * @cmd_details: pointer to command details structure or NULL
5062 enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
5064 struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
5065 struct i40e_asq_cmd_details *cmd_details)
5067 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5068 i40e_aqc_opc_configure_vsi_tc_bw,
5073 * i40e_aq_config_switch_comp_ets - Enable/Disable/Modify ETS on the port
5074 * @hw: pointer to the hw struct
5075 * @seid: seid of the switching component connected to Physical Port
5076 * @ets_data: Buffer holding ETS parameters
5077 * @cmd_details: pointer to command details structure or NULL
5079 enum i40e_status_code i40e_aq_config_switch_comp_ets(struct i40e_hw *hw,
5081 struct i40e_aqc_configure_switching_comp_ets_data *ets_data,
5082 enum i40e_admin_queue_opc opcode,
5083 struct i40e_asq_cmd_details *cmd_details)
5085 return i40e_aq_tx_sched_cmd(hw, seid, (void *)ets_data,
5086 sizeof(*ets_data), opcode, cmd_details);
5090 * i40e_aq_config_switch_comp_bw_config - Config Switch comp BW Alloc per TC
5091 * @hw: pointer to the hw struct
5092 * @seid: seid of the switching component
5093 * @bw_data: Buffer holding enabled TCs, relative/absolute TC BW limit/credits
5094 * @cmd_details: pointer to command details structure or NULL
5096 enum i40e_status_code i40e_aq_config_switch_comp_bw_config(struct i40e_hw *hw,
5098 struct i40e_aqc_configure_switching_comp_bw_config_data *bw_data,
5099 struct i40e_asq_cmd_details *cmd_details)
5101 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5102 i40e_aqc_opc_configure_switching_comp_bw_config,
5107 * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
5108 * @hw: pointer to the hw struct
5109 * @seid: seid of the switching component
5110 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5111 * @cmd_details: pointer to command details structure or NULL
5113 enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
5114 struct i40e_hw *hw, u16 seid,
5115 struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
5116 struct i40e_asq_cmd_details *cmd_details)
5118 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5119 i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
5124 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
5125 * @hw: pointer to the hw struct
5126 * @seid: seid of the VSI
5127 * @bw_data: Buffer to hold VSI BW configuration
5128 * @cmd_details: pointer to command details structure or NULL
5130 enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
5132 struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
5133 struct i40e_asq_cmd_details *cmd_details)
5135 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5136 i40e_aqc_opc_query_vsi_bw_config,
5141 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
5142 * @hw: pointer to the hw struct
5143 * @seid: seid of the VSI
5144 * @bw_data: Buffer to hold VSI BW configuration per TC
5145 * @cmd_details: pointer to command details structure or NULL
5147 enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
5149 struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
5150 struct i40e_asq_cmd_details *cmd_details)
5152 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5153 i40e_aqc_opc_query_vsi_ets_sla_config,
5158 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
5159 * @hw: pointer to the hw struct
5160 * @seid: seid of the switching component
5161 * @bw_data: Buffer to hold switching component's per TC BW config
5162 * @cmd_details: pointer to command details structure or NULL
5164 enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
5166 struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
5167 struct i40e_asq_cmd_details *cmd_details)
5169 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5170 i40e_aqc_opc_query_switching_comp_ets_config,
5175 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
5176 * @hw: pointer to the hw struct
5177 * @seid: seid of the VSI or switching component connected to Physical Port
5178 * @bw_data: Buffer to hold current ETS configuration for the Physical Port
5179 * @cmd_details: pointer to command details structure or NULL
5181 enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
5183 struct i40e_aqc_query_port_ets_config_resp *bw_data,
5184 struct i40e_asq_cmd_details *cmd_details)
5186 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5187 i40e_aqc_opc_query_port_ets_config,
5192 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
5193 * @hw: pointer to the hw struct
5194 * @seid: seid of the switching component
5195 * @bw_data: Buffer to hold switching component's BW configuration
5196 * @cmd_details: pointer to command details structure or NULL
5198 enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
5200 struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
5201 struct i40e_asq_cmd_details *cmd_details)
5203 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5204 i40e_aqc_opc_query_switching_comp_bw_config,
5209 * i40e_validate_filter_settings
5210 * @hw: pointer to the hardware structure
5211 * @settings: Filter control settings
5213 * Check and validate the filter control settings passed.
5214 * The function checks for the valid filter/context sizes being
5215 * passed for FCoE and PE.
5217 * Returns I40E_SUCCESS if the values passed are valid and within
5218 * range else returns an error.
5220 STATIC enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
5221 struct i40e_filter_control_settings *settings)
5223 u32 fcoe_cntx_size, fcoe_filt_size;
5224 u32 pe_cntx_size, pe_filt_size;
5229 /* Validate FCoE settings passed */
5230 switch (settings->fcoe_filt_num) {
5231 case I40E_HASH_FILTER_SIZE_1K:
5232 case I40E_HASH_FILTER_SIZE_2K:
5233 case I40E_HASH_FILTER_SIZE_4K:
5234 case I40E_HASH_FILTER_SIZE_8K:
5235 case I40E_HASH_FILTER_SIZE_16K:
5236 case I40E_HASH_FILTER_SIZE_32K:
5237 fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5238 fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
5241 return I40E_ERR_PARAM;
5244 switch (settings->fcoe_cntx_num) {
5245 case I40E_DMA_CNTX_SIZE_512:
5246 case I40E_DMA_CNTX_SIZE_1K:
5247 case I40E_DMA_CNTX_SIZE_2K:
5248 case I40E_DMA_CNTX_SIZE_4K:
5249 fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5250 fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
5253 return I40E_ERR_PARAM;
5256 /* Validate PE settings passed */
5257 switch (settings->pe_filt_num) {
5258 case I40E_HASH_FILTER_SIZE_1K:
5259 case I40E_HASH_FILTER_SIZE_2K:
5260 case I40E_HASH_FILTER_SIZE_4K:
5261 case I40E_HASH_FILTER_SIZE_8K:
5262 case I40E_HASH_FILTER_SIZE_16K:
5263 case I40E_HASH_FILTER_SIZE_32K:
5264 case I40E_HASH_FILTER_SIZE_64K:
5265 case I40E_HASH_FILTER_SIZE_128K:
5266 case I40E_HASH_FILTER_SIZE_256K:
5267 case I40E_HASH_FILTER_SIZE_512K:
5268 case I40E_HASH_FILTER_SIZE_1M:
5269 pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5270 pe_filt_size <<= (u32)settings->pe_filt_num;
5273 return I40E_ERR_PARAM;
5276 switch (settings->pe_cntx_num) {
5277 case I40E_DMA_CNTX_SIZE_512:
5278 case I40E_DMA_CNTX_SIZE_1K:
5279 case I40E_DMA_CNTX_SIZE_2K:
5280 case I40E_DMA_CNTX_SIZE_4K:
5281 case I40E_DMA_CNTX_SIZE_8K:
5282 case I40E_DMA_CNTX_SIZE_16K:
5283 case I40E_DMA_CNTX_SIZE_32K:
5284 case I40E_DMA_CNTX_SIZE_64K:
5285 case I40E_DMA_CNTX_SIZE_128K:
5286 case I40E_DMA_CNTX_SIZE_256K:
5287 pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5288 pe_cntx_size <<= (u32)settings->pe_cntx_num;
5291 return I40E_ERR_PARAM;
5294 /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
5295 val = rd32(hw, I40E_GLHMC_FCOEFMAX);
5296 fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
5297 >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
5298 if (fcoe_filt_size + fcoe_cntx_size > fcoe_fmax)
5299 return I40E_ERR_INVALID_SIZE;
5301 return I40E_SUCCESS;
5305 * i40e_set_filter_control
5306 * @hw: pointer to the hardware structure
5307 * @settings: Filter control settings
5309 * Set the Queue Filters for PE/FCoE and enable filters required
5310 * for a single PF. It is expected that these settings are programmed
5311 * at the driver initialization time.
5313 enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
5314 struct i40e_filter_control_settings *settings)
5316 enum i40e_status_code ret = I40E_SUCCESS;
5317 u32 hash_lut_size = 0;
5321 return I40E_ERR_PARAM;
5323 /* Validate the input settings */
5324 ret = i40e_validate_filter_settings(hw, settings);
5328 /* Read the PF Queue Filter control register */
5329 val = i40e_read_rx_ctl(hw, I40E_PFQF_CTL_0);
5331 /* Program required PE hash buckets for the PF */
5332 val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
5333 val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
5334 I40E_PFQF_CTL_0_PEHSIZE_MASK;
5335 /* Program required PE contexts for the PF */
5336 val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
5337 val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
5338 I40E_PFQF_CTL_0_PEDSIZE_MASK;
5340 /* Program required FCoE hash buckets for the PF */
5341 val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5342 val |= ((u32)settings->fcoe_filt_num <<
5343 I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
5344 I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5345 /* Program required FCoE DDP contexts for the PF */
5346 val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5347 val |= ((u32)settings->fcoe_cntx_num <<
5348 I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
5349 I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5351 /* Program Hash LUT size for the PF */
5352 val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5353 if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
5355 val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
5356 I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5358 /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
5359 if (settings->enable_fdir)
5360 val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
5361 if (settings->enable_ethtype)
5362 val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
5363 if (settings->enable_macvlan)
5364 val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
5366 i40e_write_rx_ctl(hw, I40E_PFQF_CTL_0, val);
5368 return I40E_SUCCESS;
5372 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
5373 * @hw: pointer to the hw struct
5374 * @mac_addr: MAC address to use in the filter
5375 * @ethtype: Ethertype to use in the filter
5376 * @flags: Flags that needs to be applied to the filter
5377 * @vsi_seid: seid of the control VSI
5378 * @queue: VSI queue number to send the packet to
5379 * @is_add: Add control packet filter if True else remove
5380 * @stats: Structure to hold information on control filter counts
5381 * @cmd_details: pointer to command details structure or NULL
5383 * This command will Add or Remove control packet filter for a control VSI.
5384 * In return it will update the total number of perfect filter count in
5387 enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
5388 u8 *mac_addr, u16 ethtype, u16 flags,
5389 u16 vsi_seid, u16 queue, bool is_add,
5390 struct i40e_control_filter_stats *stats,
5391 struct i40e_asq_cmd_details *cmd_details)
5393 struct i40e_aq_desc desc;
5394 struct i40e_aqc_add_remove_control_packet_filter *cmd =
5395 (struct i40e_aqc_add_remove_control_packet_filter *)
5397 struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
5398 (struct i40e_aqc_add_remove_control_packet_filter_completion *)
5400 enum i40e_status_code status;
5403 return I40E_ERR_PARAM;
5406 i40e_fill_default_direct_cmd_desc(&desc,
5407 i40e_aqc_opc_add_control_packet_filter);
5408 cmd->queue = CPU_TO_LE16(queue);
5410 i40e_fill_default_direct_cmd_desc(&desc,
5411 i40e_aqc_opc_remove_control_packet_filter);
5415 i40e_memcpy(cmd->mac, mac_addr, I40E_ETH_LENGTH_OF_ADDRESS,
5416 I40E_NONDMA_TO_NONDMA);
5418 cmd->etype = CPU_TO_LE16(ethtype);
5419 cmd->flags = CPU_TO_LE16(flags);
5420 cmd->seid = CPU_TO_LE16(vsi_seid);
5422 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5424 if (!status && stats) {
5425 stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
5426 stats->etype_used = LE16_TO_CPU(resp->etype_used);
5427 stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
5428 stats->etype_free = LE16_TO_CPU(resp->etype_free);
5435 * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
5436 * @hw: pointer to the hw struct
5437 * @seid: VSI seid to add ethertype filter from
5439 #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
5440 void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
5443 u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
5444 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
5445 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
5446 u16 ethtype = I40E_FLOW_CONTROL_ETHTYPE;
5447 enum i40e_status_code status;
5449 status = i40e_aq_add_rem_control_packet_filter(hw, NULL, ethtype, flag,
5450 seid, 0, true, NULL,
5453 DEBUGOUT("Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
5457 * i40e_fix_up_geneve_vni - adjust Geneve VNI for HW issue
5458 * @filters: list of cloud filters
5459 * @filter_count: length of list
5461 * There's an issue in the device where the Geneve VNI layout needs
5462 * to be shifted 1 byte over from the VxLAN VNI
5464 STATIC void i40e_fix_up_geneve_vni(
5465 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5468 struct i40e_aqc_add_remove_cloud_filters_element_data *f = filters;
5471 for (i = 0; i < filter_count; i++) {
5475 tnl_type = (LE16_TO_CPU(f[i].flags) &
5476 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5477 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5478 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5479 ti = LE32_TO_CPU(f[i].tenant_id);
5480 f[i].tenant_id = CPU_TO_LE32(ti << 8);
5486 * i40e_aq_add_cloud_filters
5487 * @hw: pointer to the hardware structure
5488 * @seid: VSI seid to add cloud filters from
5489 * @filters: Buffer which contains the filters to be added
5490 * @filter_count: number of filters contained in the buffer
5492 * Set the cloud filters for a given VSI. The contents of the
5493 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5494 * in by the caller of the function.
5497 enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
5499 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5502 struct i40e_aq_desc desc;
5503 struct i40e_aqc_add_remove_cloud_filters *cmd =
5504 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5505 enum i40e_status_code status;
5508 i40e_fill_default_direct_cmd_desc(&desc,
5509 i40e_aqc_opc_add_cloud_filters);
5511 buff_len = filter_count * sizeof(*filters);
5512 desc.datalen = CPU_TO_LE16(buff_len);
5513 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5514 cmd->num_filters = filter_count;
5515 cmd->seid = CPU_TO_LE16(seid);
5517 i40e_fix_up_geneve_vni(filters, filter_count);
5519 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5525 * i40e_aq_remove_cloud_filters
5526 * @hw: pointer to the hardware structure
5527 * @seid: VSI seid to remove cloud filters from
5528 * @filters: Buffer which contains the filters to be removed
5529 * @filter_count: number of filters contained in the buffer
5531 * Remove the cloud filters for a given VSI. The contents of the
5532 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5533 * in by the caller of the function.
5536 enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
5538 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5541 struct i40e_aq_desc desc;
5542 struct i40e_aqc_add_remove_cloud_filters *cmd =
5543 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5544 enum i40e_status_code status;
5547 i40e_fill_default_direct_cmd_desc(&desc,
5548 i40e_aqc_opc_remove_cloud_filters);
5550 buff_len = filter_count * sizeof(*filters);
5551 desc.datalen = CPU_TO_LE16(buff_len);
5552 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5553 cmd->num_filters = filter_count;
5554 cmd->seid = CPU_TO_LE16(seid);
5556 i40e_fix_up_geneve_vni(filters, filter_count);
5558 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5564 * i40e_aq_alternate_write
5565 * @hw: pointer to the hardware structure
5566 * @reg_addr0: address of first dword to be read
5567 * @reg_val0: value to be written under 'reg_addr0'
5568 * @reg_addr1: address of second dword to be read
5569 * @reg_val1: value to be written under 'reg_addr1'
5571 * Write one or two dwords to alternate structure. Fields are indicated
5572 * by 'reg_addr0' and 'reg_addr1' register numbers.
5575 enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
5576 u32 reg_addr0, u32 reg_val0,
5577 u32 reg_addr1, u32 reg_val1)
5579 struct i40e_aq_desc desc;
5580 struct i40e_aqc_alternate_write *cmd_resp =
5581 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5582 enum i40e_status_code status;
5584 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
5585 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5586 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5587 cmd_resp->data0 = CPU_TO_LE32(reg_val0);
5588 cmd_resp->data1 = CPU_TO_LE32(reg_val1);
5590 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5596 * i40e_aq_alternate_write_indirect
5597 * @hw: pointer to the hardware structure
5598 * @addr: address of a first register to be modified
5599 * @dw_count: number of alternate structure fields to write
5600 * @buffer: pointer to the command buffer
5602 * Write 'dw_count' dwords from 'buffer' to alternate structure
5603 * starting at 'addr'.
5606 enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
5607 u32 addr, u32 dw_count, void *buffer)
5609 struct i40e_aq_desc desc;
5610 struct i40e_aqc_alternate_ind_write *cmd_resp =
5611 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5612 enum i40e_status_code status;
5615 return I40E_ERR_PARAM;
5617 /* Indirect command */
5618 i40e_fill_default_direct_cmd_desc(&desc,
5619 i40e_aqc_opc_alternate_write_indirect);
5621 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5622 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5623 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5624 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5626 cmd_resp->address = CPU_TO_LE32(addr);
5627 cmd_resp->length = CPU_TO_LE32(dw_count);
5629 status = i40e_asq_send_command(hw, &desc, buffer,
5630 I40E_LO_DWORD(4*dw_count), NULL);
5636 * i40e_aq_alternate_read
5637 * @hw: pointer to the hardware structure
5638 * @reg_addr0: address of first dword to be read
5639 * @reg_val0: pointer for data read from 'reg_addr0'
5640 * @reg_addr1: address of second dword to be read
5641 * @reg_val1: pointer for data read from 'reg_addr1'
5643 * Read one or two dwords from alternate structure. Fields are indicated
5644 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
5645 * is not passed then only register at 'reg_addr0' is read.
5648 enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
5649 u32 reg_addr0, u32 *reg_val0,
5650 u32 reg_addr1, u32 *reg_val1)
5652 struct i40e_aq_desc desc;
5653 struct i40e_aqc_alternate_write *cmd_resp =
5654 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5655 enum i40e_status_code status;
5657 if (reg_val0 == NULL)
5658 return I40E_ERR_PARAM;
5660 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
5661 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5662 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5664 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5666 if (status == I40E_SUCCESS) {
5667 *reg_val0 = LE32_TO_CPU(cmd_resp->data0);
5669 if (reg_val1 != NULL)
5670 *reg_val1 = LE32_TO_CPU(cmd_resp->data1);
5677 * i40e_aq_alternate_read_indirect
5678 * @hw: pointer to the hardware structure
5679 * @addr: address of the alternate structure field
5680 * @dw_count: number of alternate structure fields to read
5681 * @buffer: pointer to the command buffer
5683 * Read 'dw_count' dwords from alternate structure starting at 'addr' and
5684 * place them in 'buffer'. The buffer should be allocated by caller.
5687 enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
5688 u32 addr, u32 dw_count, void *buffer)
5690 struct i40e_aq_desc desc;
5691 struct i40e_aqc_alternate_ind_write *cmd_resp =
5692 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5693 enum i40e_status_code status;
5696 return I40E_ERR_PARAM;
5698 /* Indirect command */
5699 i40e_fill_default_direct_cmd_desc(&desc,
5700 i40e_aqc_opc_alternate_read_indirect);
5702 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5703 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5704 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5705 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5707 cmd_resp->address = CPU_TO_LE32(addr);
5708 cmd_resp->length = CPU_TO_LE32(dw_count);
5710 status = i40e_asq_send_command(hw, &desc, buffer,
5711 I40E_LO_DWORD(4*dw_count), NULL);
5717 * i40e_aq_alternate_clear
5718 * @hw: pointer to the HW structure.
5720 * Clear the alternate structures of the port from which the function
5724 enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
5726 struct i40e_aq_desc desc;
5727 enum i40e_status_code status;
5729 i40e_fill_default_direct_cmd_desc(&desc,
5730 i40e_aqc_opc_alternate_clear_port);
5732 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5738 * i40e_aq_alternate_write_done
5739 * @hw: pointer to the HW structure.
5740 * @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
5741 * @reset_needed: indicates the SW should trigger GLOBAL reset
5743 * Indicates to the FW that alternate structures have been changed.
5746 enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
5747 u8 bios_mode, bool *reset_needed)
5749 struct i40e_aq_desc desc;
5750 struct i40e_aqc_alternate_write_done *cmd =
5751 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
5752 enum i40e_status_code status;
5754 if (reset_needed == NULL)
5755 return I40E_ERR_PARAM;
5757 i40e_fill_default_direct_cmd_desc(&desc,
5758 i40e_aqc_opc_alternate_write_done);
5760 cmd->cmd_flags = CPU_TO_LE16(bios_mode);
5762 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5763 if (!status && reset_needed)
5764 *reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
5765 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
5771 * i40e_aq_set_oem_mode
5772 * @hw: pointer to the HW structure.
5773 * @oem_mode: the OEM mode to be used
5775 * Sets the device to a specific operating mode. Currently the only supported
5776 * mode is no_clp, which causes FW to refrain from using Alternate RAM.
5779 enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
5782 struct i40e_aq_desc desc;
5783 struct i40e_aqc_alternate_write_done *cmd =
5784 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
5785 enum i40e_status_code status;
5787 i40e_fill_default_direct_cmd_desc(&desc,
5788 i40e_aqc_opc_alternate_set_mode);
5790 cmd->cmd_flags = CPU_TO_LE16(oem_mode);
5792 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5798 * i40e_aq_resume_port_tx
5799 * @hw: pointer to the hardware structure
5800 * @cmd_details: pointer to command details structure or NULL
5802 * Resume port's Tx traffic
5804 enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
5805 struct i40e_asq_cmd_details *cmd_details)
5807 struct i40e_aq_desc desc;
5808 enum i40e_status_code status;
5810 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
5812 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5818 * i40e_set_pci_config_data - store PCI bus info
5819 * @hw: pointer to hardware structure
5820 * @link_status: the link status word from PCI config space
5822 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
5824 void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
5826 hw->bus.type = i40e_bus_type_pci_express;
5828 switch (link_status & I40E_PCI_LINK_WIDTH) {
5829 case I40E_PCI_LINK_WIDTH_1:
5830 hw->bus.width = i40e_bus_width_pcie_x1;
5832 case I40E_PCI_LINK_WIDTH_2:
5833 hw->bus.width = i40e_bus_width_pcie_x2;
5835 case I40E_PCI_LINK_WIDTH_4:
5836 hw->bus.width = i40e_bus_width_pcie_x4;
5838 case I40E_PCI_LINK_WIDTH_8:
5839 hw->bus.width = i40e_bus_width_pcie_x8;
5842 hw->bus.width = i40e_bus_width_unknown;
5846 switch (link_status & I40E_PCI_LINK_SPEED) {
5847 case I40E_PCI_LINK_SPEED_2500:
5848 hw->bus.speed = i40e_bus_speed_2500;
5850 case I40E_PCI_LINK_SPEED_5000:
5851 hw->bus.speed = i40e_bus_speed_5000;
5853 case I40E_PCI_LINK_SPEED_8000:
5854 hw->bus.speed = i40e_bus_speed_8000;
5857 hw->bus.speed = i40e_bus_speed_unknown;
5863 * i40e_aq_debug_dump
5864 * @hw: pointer to the hardware structure
5865 * @cluster_id: specific cluster to dump
5866 * @table_id: table id within cluster
5867 * @start_index: index of line in the block to read
5868 * @buff_size: dump buffer size
5869 * @buff: dump buffer
5870 * @ret_buff_size: actual buffer size returned
5871 * @ret_next_table: next block to read
5872 * @ret_next_index: next index to read
5874 * Dump internal FW/HW data for debug purposes.
5877 enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
5878 u8 table_id, u32 start_index, u16 buff_size,
5879 void *buff, u16 *ret_buff_size,
5880 u8 *ret_next_table, u32 *ret_next_index,
5881 struct i40e_asq_cmd_details *cmd_details)
5883 struct i40e_aq_desc desc;
5884 struct i40e_aqc_debug_dump_internals *cmd =
5885 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
5886 struct i40e_aqc_debug_dump_internals *resp =
5887 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
5888 enum i40e_status_code status;
5890 if (buff_size == 0 || !buff)
5891 return I40E_ERR_PARAM;
5893 i40e_fill_default_direct_cmd_desc(&desc,
5894 i40e_aqc_opc_debug_dump_internals);
5895 /* Indirect Command */
5896 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5897 if (buff_size > I40E_AQ_LARGE_BUF)
5898 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5900 cmd->cluster_id = cluster_id;
5901 cmd->table_id = table_id;
5902 cmd->idx = CPU_TO_LE32(start_index);
5904 desc.datalen = CPU_TO_LE16(buff_size);
5906 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
5908 if (ret_buff_size != NULL)
5909 *ret_buff_size = LE16_TO_CPU(desc.datalen);
5910 if (ret_next_table != NULL)
5911 *ret_next_table = resp->table_id;
5912 if (ret_next_index != NULL)
5913 *ret_next_index = LE32_TO_CPU(resp->idx);
5920 * i40e_read_bw_from_alt_ram
5921 * @hw: pointer to the hardware structure
5922 * @max_bw: pointer for max_bw read
5923 * @min_bw: pointer for min_bw read
5924 * @min_valid: pointer for bool that is true if min_bw is a valid value
5925 * @max_valid: pointer for bool that is true if max_bw is a valid value
5927 * Read bw from the alternate ram for the given pf
5929 enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
5930 u32 *max_bw, u32 *min_bw,
5931 bool *min_valid, bool *max_valid)
5933 enum i40e_status_code status;
5934 u32 max_bw_addr, min_bw_addr;
5936 /* Calculate the address of the min/max bw registers */
5937 max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
5938 I40E_ALT_STRUCT_MAX_BW_OFFSET +
5939 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
5940 min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
5941 I40E_ALT_STRUCT_MIN_BW_OFFSET +
5942 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
5944 /* Read the bandwidths from alt ram */
5945 status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
5946 min_bw_addr, min_bw);
5948 if (*min_bw & I40E_ALT_BW_VALID_MASK)
5953 if (*max_bw & I40E_ALT_BW_VALID_MASK)
5962 * i40e_aq_configure_partition_bw
5963 * @hw: pointer to the hardware structure
5964 * @bw_data: Buffer holding valid pfs and bw limits
5965 * @cmd_details: pointer to command details
5967 * Configure partitions guaranteed/max bw
5969 enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
5970 struct i40e_aqc_configure_partition_bw_data *bw_data,
5971 struct i40e_asq_cmd_details *cmd_details)
5973 enum i40e_status_code status;
5974 struct i40e_aq_desc desc;
5975 u16 bwd_size = sizeof(*bw_data);
5977 i40e_fill_default_direct_cmd_desc(&desc,
5978 i40e_aqc_opc_configure_partition_bw);
5980 /* Indirect command */
5981 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5982 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
5984 if (bwd_size > I40E_AQ_LARGE_BUF)
5985 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5987 desc.datalen = CPU_TO_LE16(bwd_size);
5989 status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
5995 * i40e_read_phy_register
5996 * @hw: pointer to the HW structure
5997 * @page: registers page number
5998 * @reg: register address in the page
5999 * @phy_adr: PHY address on MDIO interface
6000 * @value: PHY register value
6002 * Reads specified PHY register value
6004 enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
6005 u8 page, u16 reg, u8 phy_addr,
6008 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6011 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6013 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6014 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6015 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6016 (I40E_MDIO_OPCODE_ADDRESS) |
6017 (I40E_MDIO_STCODE) |
6018 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6019 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6020 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6022 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6023 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6024 status = I40E_SUCCESS;
6027 i40e_usec_delay(10);
6032 i40e_debug(hw, I40E_DEBUG_PHY,
6033 "PHY: Can't write command to external PHY.\n");
6037 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6038 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6039 (I40E_MDIO_OPCODE_READ) |
6040 (I40E_MDIO_STCODE) |
6041 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6042 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6043 status = I40E_ERR_TIMEOUT;
6045 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6047 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6048 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6049 status = I40E_SUCCESS;
6052 i40e_usec_delay(10);
6057 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6058 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6059 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6061 i40e_debug(hw, I40E_DEBUG_PHY,
6062 "PHY: Can't read register value from external PHY.\n");
6070 * i40e_write_phy_register
6071 * @hw: pointer to the HW structure
6072 * @page: registers page number
6073 * @reg: register address in the page
6074 * @phy_adr: PHY address on MDIO interface
6075 * @value: PHY register value
6077 * Writes value to specified PHY register
6079 enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
6080 u8 page, u16 reg, u8 phy_addr,
6083 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6086 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6088 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6089 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6090 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6091 (I40E_MDIO_OPCODE_ADDRESS) |
6092 (I40E_MDIO_STCODE) |
6093 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6094 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6095 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6097 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6098 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6099 status = I40E_SUCCESS;
6102 i40e_usec_delay(10);
6106 i40e_debug(hw, I40E_DEBUG_PHY,
6107 "PHY: Can't write command to external PHY.\n");
6111 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6112 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6114 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6115 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6116 (I40E_MDIO_OPCODE_WRITE) |
6117 (I40E_MDIO_STCODE) |
6118 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6119 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6120 status = I40E_ERR_TIMEOUT;
6122 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6124 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6125 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6126 status = I40E_SUCCESS;
6129 i40e_usec_delay(10);
6138 * i40e_get_phy_address
6139 * @hw: pointer to the HW structure
6140 * @dev_num: PHY port num that address we want
6141 * @phy_addr: Returned PHY address
6143 * Gets PHY address for current port
6145 u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num)
6147 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6148 u32 reg_val = rd32(hw, I40E_GLGEN_MDIO_I2C_SEL(port_num));
6150 return (u8)(reg_val >> ((dev_num + 1) * 5)) & 0x1f;
6154 * i40e_blink_phy_led
6155 * @hw: pointer to the HW structure
6156 * @time: time how long led will blinks in secs
6157 * @interval: gap between LED on and off in msecs
6159 * Blinks PHY link LED
6161 enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
6162 u32 time, u32 interval)
6164 enum i40e_status_code status = I40E_SUCCESS;
6169 u16 led_addr = I40E_PHY_LED_PROV_REG_1;
6173 i = rd32(hw, I40E_PFGEN_PORTNUM);
6174 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6175 phy_addr = i40e_get_phy_address(hw, port_num);
6177 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6179 status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6180 led_addr, phy_addr, &led_reg);
6182 goto phy_blinking_end;
6184 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6186 status = i40e_write_phy_register(hw,
6187 I40E_PHY_COM_REG_PAGE,
6191 goto phy_blinking_end;
6196 if (time > 0 && interval > 0) {
6197 for (i = 0; i < time * 1000; i += interval) {
6198 status = i40e_read_phy_register(hw,
6199 I40E_PHY_COM_REG_PAGE,
6203 goto restore_config;
6204 if (led_reg & I40E_PHY_LED_MANUAL_ON)
6207 led_reg = I40E_PHY_LED_MANUAL_ON;
6208 status = i40e_write_phy_register(hw,
6209 I40E_PHY_COM_REG_PAGE,
6213 goto restore_config;
6214 i40e_msec_delay(interval);
6219 status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE, led_addr,
6227 * i40e_led_get_phy - return current on/off mode
6228 * @hw: pointer to the hw struct
6229 * @led_addr: address of led register to use
6230 * @val: original value of register to use
6233 enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
6236 enum i40e_status_code status = I40E_SUCCESS;
6244 temp_addr = I40E_PHY_LED_PROV_REG_1;
6245 i = rd32(hw, I40E_PFGEN_PORTNUM);
6246 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6247 phy_addr = i40e_get_phy_address(hw, port_num);
6249 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6251 status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6252 temp_addr, phy_addr, ®_val);
6256 if (reg_val & I40E_PHY_LED_LINK_MODE_MASK) {
6257 *led_addr = temp_addr;
6266 * @hw: pointer to the HW structure
6267 * @on: true or false
6268 * @mode: original val plus bit for set or ignore
6269 * Set led's on or off when controlled by the PHY
6272 enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
6273 u16 led_addr, u32 mode)
6275 enum i40e_status_code status = I40E_SUCCESS;
6282 i = rd32(hw, I40E_PFGEN_PORTNUM);
6283 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6284 phy_addr = i40e_get_phy_address(hw, port_num);
6286 status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE, led_addr,
6287 phy_addr, &led_reg);
6291 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6293 status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6294 led_addr, phy_addr, led_reg);
6298 status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6299 led_addr, phy_addr, &led_reg);
6301 goto restore_config;
6303 led_reg = I40E_PHY_LED_MANUAL_ON;
6306 status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6307 led_addr, phy_addr, led_reg);
6309 goto restore_config;
6310 if (mode & I40E_PHY_LED_MODE_ORIG) {
6311 led_ctl = (mode & I40E_PHY_LED_MODE_MASK);
6312 status = i40e_write_phy_register(hw,
6313 I40E_PHY_COM_REG_PAGE,
6314 led_addr, phy_addr, led_ctl);
6318 status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE, led_addr,
6322 #endif /* PF_DRIVER */
6325 * i40e_aq_rx_ctl_read_register - use FW to read from an Rx control register
6326 * @hw: pointer to the hw struct
6327 * @reg_addr: register address
6328 * @reg_val: ptr to register value
6329 * @cmd_details: pointer to command details structure or NULL
6331 * Use the firmware to read the Rx control register,
6332 * especially useful if the Rx unit is under heavy pressure
6334 enum i40e_status_code i40e_aq_rx_ctl_read_register(struct i40e_hw *hw,
6335 u32 reg_addr, u32 *reg_val,
6336 struct i40e_asq_cmd_details *cmd_details)
6338 struct i40e_aq_desc desc;
6339 struct i40e_aqc_rx_ctl_reg_read_write *cmd_resp =
6340 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6341 enum i40e_status_code status;
6343 if (reg_val == NULL)
6344 return I40E_ERR_PARAM;
6346 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_read);
6348 cmd_resp->address = CPU_TO_LE32(reg_addr);
6350 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6352 if (status == I40E_SUCCESS)
6353 *reg_val = LE32_TO_CPU(cmd_resp->value);
6359 * i40e_read_rx_ctl - read from an Rx control register
6360 * @hw: pointer to the hw struct
6361 * @reg_addr: register address
6363 u32 i40e_read_rx_ctl(struct i40e_hw *hw, u32 reg_addr)
6365 enum i40e_status_code status = I40E_SUCCESS;
6370 use_register = (hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver < 5);
6371 if (!use_register) {
6373 status = i40e_aq_rx_ctl_read_register(hw, reg_addr, &val, NULL);
6374 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6381 /* if the AQ access failed, try the old-fashioned way */
6382 if (status || use_register)
6383 val = rd32(hw, reg_addr);
6389 * i40e_aq_rx_ctl_write_register
6390 * @hw: pointer to the hw struct
6391 * @reg_addr: register address
6392 * @reg_val: register value
6393 * @cmd_details: pointer to command details structure or NULL
6395 * Use the firmware to write to an Rx control register,
6396 * especially useful if the Rx unit is under heavy pressure
6398 enum i40e_status_code i40e_aq_rx_ctl_write_register(struct i40e_hw *hw,
6399 u32 reg_addr, u32 reg_val,
6400 struct i40e_asq_cmd_details *cmd_details)
6402 struct i40e_aq_desc desc;
6403 struct i40e_aqc_rx_ctl_reg_read_write *cmd =
6404 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6405 enum i40e_status_code status;
6407 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_write);
6409 cmd->address = CPU_TO_LE32(reg_addr);
6410 cmd->value = CPU_TO_LE32(reg_val);
6412 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6418 * i40e_write_rx_ctl - write to an Rx control register
6419 * @hw: pointer to the hw struct
6420 * @reg_addr: register address
6421 * @reg_val: register value
6423 void i40e_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val)
6425 enum i40e_status_code status = I40E_SUCCESS;
6429 use_register = (hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver < 5);
6430 if (!use_register) {
6432 status = i40e_aq_rx_ctl_write_register(hw, reg_addr,
6434 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6441 /* if the AQ access failed, try the old-fashioned way */
6442 if (status || use_register)
6443 wr32(hw, reg_addr, reg_val);
6448 * i40e_aq_send_msg_to_pf
6449 * @hw: pointer to the hardware structure
6450 * @v_opcode: opcodes for VF-PF communication
6451 * @v_retval: return error code
6452 * @msg: pointer to the msg buffer
6453 * @msglen: msg length
6454 * @cmd_details: pointer to command details
6456 * Send message to PF driver using admin queue. By default, this message
6457 * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for
6458 * completion before returning.
6460 enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
6461 enum i40e_virtchnl_ops v_opcode,
6462 enum i40e_status_code v_retval,
6463 u8 *msg, u16 msglen,
6464 struct i40e_asq_cmd_details *cmd_details)
6466 struct i40e_aq_desc desc;
6467 struct i40e_asq_cmd_details details;
6468 enum i40e_status_code status;
6470 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
6471 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
6472 desc.cookie_high = CPU_TO_LE32(v_opcode);
6473 desc.cookie_low = CPU_TO_LE32(v_retval);
6475 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF
6476 | I40E_AQ_FLAG_RD));
6477 if (msglen > I40E_AQ_LARGE_BUF)
6478 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6479 desc.datalen = CPU_TO_LE16(msglen);
6482 i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM);
6483 details.async = true;
6484 cmd_details = &details;
6486 status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg,
6487 msglen, cmd_details);
6492 * i40e_vf_parse_hw_config
6493 * @hw: pointer to the hardware structure
6494 * @msg: pointer to the virtual channel VF resource structure
6496 * Given a VF resource message from the PF, populate the hw struct
6497 * with appropriate information.
6499 void i40e_vf_parse_hw_config(struct i40e_hw *hw,
6500 struct i40e_virtchnl_vf_resource *msg)
6502 struct i40e_virtchnl_vsi_resource *vsi_res;
6505 vsi_res = &msg->vsi_res[0];
6507 hw->dev_caps.num_vsis = msg->num_vsis;
6508 hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
6509 hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
6510 hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
6511 hw->dev_caps.dcb = msg->vf_offload_flags &
6512 I40E_VIRTCHNL_VF_OFFLOAD_L2;
6513 hw->dev_caps.fcoe = (msg->vf_offload_flags &
6514 I40E_VIRTCHNL_VF_OFFLOAD_FCOE) ? 1 : 0;
6515 hw->dev_caps.iwarp = (msg->vf_offload_flags &
6516 I40E_VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0;
6517 for (i = 0; i < msg->num_vsis; i++) {
6518 if (vsi_res->vsi_type == I40E_VSI_SRIOV) {
6519 i40e_memcpy(hw->mac.perm_addr,
6520 vsi_res->default_mac_addr,
6521 I40E_ETH_LENGTH_OF_ADDRESS,
6522 I40E_NONDMA_TO_NONDMA);
6523 i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
6524 I40E_ETH_LENGTH_OF_ADDRESS,
6525 I40E_NONDMA_TO_NONDMA);
6533 * @hw: pointer to the hardware structure
6535 * Send a VF_RESET message to the PF. Does not wait for response from PF
6536 * as none will be forthcoming. Immediately after calling this function,
6537 * the admin queue should be shut down and (optionally) reinitialized.
6539 enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw)
6541 return i40e_aq_send_msg_to_pf(hw, I40E_VIRTCHNL_OP_RESET_VF,
6542 I40E_SUCCESS, NULL, 0, NULL);
6544 #endif /* VF_DRIVER */
6548 * i40e_aq_set_arp_proxy_config
6549 * @hw: pointer to the HW structure
6550 * @proxy_config - pointer to proxy config command table struct
6551 * @cmd_details: pointer to command details
6553 * Set ARP offload parameters from pre-populated
6554 * i40e_aqc_arp_proxy_data struct
6556 enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
6557 struct i40e_aqc_arp_proxy_data *proxy_config,
6558 struct i40e_asq_cmd_details *cmd_details)
6560 struct i40e_aq_desc desc;
6561 enum i40e_status_code status;
6564 return I40E_ERR_PARAM;
6566 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_proxy_config);
6568 desc.params.external.addr_high =
6569 CPU_TO_LE32(I40E_HI_DWORD((u64)proxy_config));
6570 desc.params.external.addr_low =
6571 CPU_TO_LE32(I40E_LO_DWORD((u64)proxy_config));
6573 status = i40e_asq_send_command(hw, &desc, proxy_config,
6574 sizeof(struct i40e_aqc_arp_proxy_data),
6581 * i40e_aq_opc_set_ns_proxy_table_entry
6582 * @hw: pointer to the HW structure
6583 * @ns_proxy_table_entry: pointer to NS table entry command struct
6584 * @cmd_details: pointer to command details
6586 * Set IPv6 Neighbor Solicitation (NS) protocol offload parameters
6587 * from pre-populated i40e_aqc_ns_proxy_data struct
6589 enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
6590 struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
6591 struct i40e_asq_cmd_details *cmd_details)
6593 struct i40e_aq_desc desc;
6594 enum i40e_status_code status;
6596 if (!ns_proxy_table_entry)
6597 return I40E_ERR_PARAM;
6599 i40e_fill_default_direct_cmd_desc(&desc,
6600 i40e_aqc_opc_set_ns_proxy_table_entry);
6602 desc.params.external.addr_high =
6603 CPU_TO_LE32(I40E_HI_DWORD((u64)ns_proxy_table_entry));
6604 desc.params.external.addr_low =
6605 CPU_TO_LE32(I40E_LO_DWORD((u64)ns_proxy_table_entry));
6607 status = i40e_asq_send_command(hw, &desc, ns_proxy_table_entry,
6608 sizeof(struct i40e_aqc_ns_proxy_data),
6615 * i40e_aq_set_clear_wol_filter
6616 * @hw: pointer to the hw struct
6617 * @filter_index: index of filter to modify (0-7)
6618 * @filter: buffer containing filter to be set
6619 * @set_filter: true to set filter, false to clear filter
6620 * @no_wol_tco: if true, pass through packets cannot cause wake-up
6621 * if false, pass through packets may cause wake-up
6622 * @filter_valid: true if filter action is valid
6623 * @no_wol_tco_valid: true if no WoL in TCO traffic action valid
6624 * @cmd_details: pointer to command details structure or NULL
6626 * Set or clear WoL filter for port attached to the PF
6628 enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
6630 struct i40e_aqc_set_wol_filter_data *filter,
6631 bool set_filter, bool no_wol_tco,
6632 bool filter_valid, bool no_wol_tco_valid,
6633 struct i40e_asq_cmd_details *cmd_details)
6635 struct i40e_aq_desc desc;
6636 struct i40e_aqc_set_wol_filter *cmd =
6637 (struct i40e_aqc_set_wol_filter *)&desc.params.raw;
6638 enum i40e_status_code status;
6640 u16 valid_flags = 0;
6643 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_wol_filter);
6645 if (filter_index >= I40E_AQC_MAX_NUM_WOL_FILTERS)
6646 return I40E_ERR_PARAM;
6647 cmd->filter_index = CPU_TO_LE16(filter_index);
6651 return I40E_ERR_PARAM;
6652 cmd_flags |= I40E_AQC_SET_WOL_FILTER;
6653 buff_len = sizeof(*filter);
6656 cmd_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL;
6657 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
6660 valid_flags |= I40E_AQC_SET_WOL_FILTER_ACTION_VALID;
6661 if (no_wol_tco_valid)
6662 valid_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID;
6663 cmd->valid_flags = CPU_TO_LE16(valid_flags);
6665 cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)filter));
6666 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)filter));
6668 status = i40e_asq_send_command(hw, &desc, filter,
6669 buff_len, cmd_details);
6675 * i40e_aq_get_wake_event_reason
6676 * @hw: pointer to the hw struct
6677 * @wake_reason: return value, index of matching filter
6678 * @cmd_details: pointer to command details structure or NULL
6680 * Get information for the reason of a Wake Up event
6682 enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
6684 struct i40e_asq_cmd_details *cmd_details)
6686 struct i40e_aq_desc desc;
6687 struct i40e_aqc_get_wake_reason_completion *resp =
6688 (struct i40e_aqc_get_wake_reason_completion *)&desc.params.raw;
6689 enum i40e_status_code status;
6691 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_wake_reason);
6693 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6695 if (status == I40E_SUCCESS)
6696 *wake_reason = LE16_TO_CPU(resp->wake_reason);
6701 #endif /* X722_SUPPORT */