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"
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;
74 #ifdef X722_A0_SUPPORT
75 case I40E_DEV_ID_X722_A0:
77 case I40E_DEV_ID_KX_X722:
78 case I40E_DEV_ID_QSFP_X722:
79 case I40E_DEV_ID_SFP_X722:
80 case I40E_DEV_ID_1G_BASE_T_X722:
81 case I40E_DEV_ID_10G_BASE_T_X722:
82 case I40E_DEV_ID_SFP_I_X722:
83 hw->mac.type = I40E_MAC_X722;
85 #if defined(INTEGRATED_VF) || defined(VF_DRIVER)
86 case I40E_DEV_ID_X722_VF:
87 #ifdef X722_A0_SUPPORT
88 case I40E_DEV_ID_X722_A0_VF:
90 hw->mac.type = I40E_MAC_X722_VF;
92 #endif /* INTEGRATED_VF || VF_DRIVER */
93 #if defined(INTEGRATED_VF) || defined(VF_DRIVER)
95 case I40E_DEV_ID_VF_HV:
96 case I40E_DEV_ID_ADAPTIVE_VF:
97 hw->mac.type = I40E_MAC_VF;
101 hw->mac.type = I40E_MAC_GENERIC;
105 status = I40E_ERR_DEVICE_NOT_SUPPORTED;
108 DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n",
109 hw->mac.type, status);
114 * i40e_aq_str - convert AQ err code to a string
115 * @hw: pointer to the HW structure
116 * @aq_err: the AQ error code to convert
118 const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err)
123 case I40E_AQ_RC_EPERM:
124 return "I40E_AQ_RC_EPERM";
125 case I40E_AQ_RC_ENOENT:
126 return "I40E_AQ_RC_ENOENT";
127 case I40E_AQ_RC_ESRCH:
128 return "I40E_AQ_RC_ESRCH";
129 case I40E_AQ_RC_EINTR:
130 return "I40E_AQ_RC_EINTR";
132 return "I40E_AQ_RC_EIO";
133 case I40E_AQ_RC_ENXIO:
134 return "I40E_AQ_RC_ENXIO";
135 case I40E_AQ_RC_E2BIG:
136 return "I40E_AQ_RC_E2BIG";
137 case I40E_AQ_RC_EAGAIN:
138 return "I40E_AQ_RC_EAGAIN";
139 case I40E_AQ_RC_ENOMEM:
140 return "I40E_AQ_RC_ENOMEM";
141 case I40E_AQ_RC_EACCES:
142 return "I40E_AQ_RC_EACCES";
143 case I40E_AQ_RC_EFAULT:
144 return "I40E_AQ_RC_EFAULT";
145 case I40E_AQ_RC_EBUSY:
146 return "I40E_AQ_RC_EBUSY";
147 case I40E_AQ_RC_EEXIST:
148 return "I40E_AQ_RC_EEXIST";
149 case I40E_AQ_RC_EINVAL:
150 return "I40E_AQ_RC_EINVAL";
151 case I40E_AQ_RC_ENOTTY:
152 return "I40E_AQ_RC_ENOTTY";
153 case I40E_AQ_RC_ENOSPC:
154 return "I40E_AQ_RC_ENOSPC";
155 case I40E_AQ_RC_ENOSYS:
156 return "I40E_AQ_RC_ENOSYS";
157 case I40E_AQ_RC_ERANGE:
158 return "I40E_AQ_RC_ERANGE";
159 case I40E_AQ_RC_EFLUSHED:
160 return "I40E_AQ_RC_EFLUSHED";
161 case I40E_AQ_RC_BAD_ADDR:
162 return "I40E_AQ_RC_BAD_ADDR";
163 case I40E_AQ_RC_EMODE:
164 return "I40E_AQ_RC_EMODE";
165 case I40E_AQ_RC_EFBIG:
166 return "I40E_AQ_RC_EFBIG";
169 snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
174 * i40e_stat_str - convert status err code to a string
175 * @hw: pointer to the HW structure
176 * @stat_err: the status error code to convert
178 const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err)
184 return "I40E_ERR_NVM";
185 case I40E_ERR_NVM_CHECKSUM:
186 return "I40E_ERR_NVM_CHECKSUM";
188 return "I40E_ERR_PHY";
189 case I40E_ERR_CONFIG:
190 return "I40E_ERR_CONFIG";
192 return "I40E_ERR_PARAM";
193 case I40E_ERR_MAC_TYPE:
194 return "I40E_ERR_MAC_TYPE";
195 case I40E_ERR_UNKNOWN_PHY:
196 return "I40E_ERR_UNKNOWN_PHY";
197 case I40E_ERR_LINK_SETUP:
198 return "I40E_ERR_LINK_SETUP";
199 case I40E_ERR_ADAPTER_STOPPED:
200 return "I40E_ERR_ADAPTER_STOPPED";
201 case I40E_ERR_INVALID_MAC_ADDR:
202 return "I40E_ERR_INVALID_MAC_ADDR";
203 case I40E_ERR_DEVICE_NOT_SUPPORTED:
204 return "I40E_ERR_DEVICE_NOT_SUPPORTED";
205 case I40E_ERR_MASTER_REQUESTS_PENDING:
206 return "I40E_ERR_MASTER_REQUESTS_PENDING";
207 case I40E_ERR_INVALID_LINK_SETTINGS:
208 return "I40E_ERR_INVALID_LINK_SETTINGS";
209 case I40E_ERR_AUTONEG_NOT_COMPLETE:
210 return "I40E_ERR_AUTONEG_NOT_COMPLETE";
211 case I40E_ERR_RESET_FAILED:
212 return "I40E_ERR_RESET_FAILED";
213 case I40E_ERR_SWFW_SYNC:
214 return "I40E_ERR_SWFW_SYNC";
215 case I40E_ERR_NO_AVAILABLE_VSI:
216 return "I40E_ERR_NO_AVAILABLE_VSI";
217 case I40E_ERR_NO_MEMORY:
218 return "I40E_ERR_NO_MEMORY";
219 case I40E_ERR_BAD_PTR:
220 return "I40E_ERR_BAD_PTR";
221 case I40E_ERR_RING_FULL:
222 return "I40E_ERR_RING_FULL";
223 case I40E_ERR_INVALID_PD_ID:
224 return "I40E_ERR_INVALID_PD_ID";
225 case I40E_ERR_INVALID_QP_ID:
226 return "I40E_ERR_INVALID_QP_ID";
227 case I40E_ERR_INVALID_CQ_ID:
228 return "I40E_ERR_INVALID_CQ_ID";
229 case I40E_ERR_INVALID_CEQ_ID:
230 return "I40E_ERR_INVALID_CEQ_ID";
231 case I40E_ERR_INVALID_AEQ_ID:
232 return "I40E_ERR_INVALID_AEQ_ID";
233 case I40E_ERR_INVALID_SIZE:
234 return "I40E_ERR_INVALID_SIZE";
235 case I40E_ERR_INVALID_ARP_INDEX:
236 return "I40E_ERR_INVALID_ARP_INDEX";
237 case I40E_ERR_INVALID_FPM_FUNC_ID:
238 return "I40E_ERR_INVALID_FPM_FUNC_ID";
239 case I40E_ERR_QP_INVALID_MSG_SIZE:
240 return "I40E_ERR_QP_INVALID_MSG_SIZE";
241 case I40E_ERR_QP_TOOMANY_WRS_POSTED:
242 return "I40E_ERR_QP_TOOMANY_WRS_POSTED";
243 case I40E_ERR_INVALID_FRAG_COUNT:
244 return "I40E_ERR_INVALID_FRAG_COUNT";
245 case I40E_ERR_QUEUE_EMPTY:
246 return "I40E_ERR_QUEUE_EMPTY";
247 case I40E_ERR_INVALID_ALIGNMENT:
248 return "I40E_ERR_INVALID_ALIGNMENT";
249 case I40E_ERR_FLUSHED_QUEUE:
250 return "I40E_ERR_FLUSHED_QUEUE";
251 case I40E_ERR_INVALID_PUSH_PAGE_INDEX:
252 return "I40E_ERR_INVALID_PUSH_PAGE_INDEX";
253 case I40E_ERR_INVALID_IMM_DATA_SIZE:
254 return "I40E_ERR_INVALID_IMM_DATA_SIZE";
255 case I40E_ERR_TIMEOUT:
256 return "I40E_ERR_TIMEOUT";
257 case I40E_ERR_OPCODE_MISMATCH:
258 return "I40E_ERR_OPCODE_MISMATCH";
259 case I40E_ERR_CQP_COMPL_ERROR:
260 return "I40E_ERR_CQP_COMPL_ERROR";
261 case I40E_ERR_INVALID_VF_ID:
262 return "I40E_ERR_INVALID_VF_ID";
263 case I40E_ERR_INVALID_HMCFN_ID:
264 return "I40E_ERR_INVALID_HMCFN_ID";
265 case I40E_ERR_BACKING_PAGE_ERROR:
266 return "I40E_ERR_BACKING_PAGE_ERROR";
267 case I40E_ERR_NO_PBLCHUNKS_AVAILABLE:
268 return "I40E_ERR_NO_PBLCHUNKS_AVAILABLE";
269 case I40E_ERR_INVALID_PBLE_INDEX:
270 return "I40E_ERR_INVALID_PBLE_INDEX";
271 case I40E_ERR_INVALID_SD_INDEX:
272 return "I40E_ERR_INVALID_SD_INDEX";
273 case I40E_ERR_INVALID_PAGE_DESC_INDEX:
274 return "I40E_ERR_INVALID_PAGE_DESC_INDEX";
275 case I40E_ERR_INVALID_SD_TYPE:
276 return "I40E_ERR_INVALID_SD_TYPE";
277 case I40E_ERR_MEMCPY_FAILED:
278 return "I40E_ERR_MEMCPY_FAILED";
279 case I40E_ERR_INVALID_HMC_OBJ_INDEX:
280 return "I40E_ERR_INVALID_HMC_OBJ_INDEX";
281 case I40E_ERR_INVALID_HMC_OBJ_COUNT:
282 return "I40E_ERR_INVALID_HMC_OBJ_COUNT";
283 case I40E_ERR_INVALID_SRQ_ARM_LIMIT:
284 return "I40E_ERR_INVALID_SRQ_ARM_LIMIT";
285 case I40E_ERR_SRQ_ENABLED:
286 return "I40E_ERR_SRQ_ENABLED";
287 case I40E_ERR_ADMIN_QUEUE_ERROR:
288 return "I40E_ERR_ADMIN_QUEUE_ERROR";
289 case I40E_ERR_ADMIN_QUEUE_TIMEOUT:
290 return "I40E_ERR_ADMIN_QUEUE_TIMEOUT";
291 case I40E_ERR_BUF_TOO_SHORT:
292 return "I40E_ERR_BUF_TOO_SHORT";
293 case I40E_ERR_ADMIN_QUEUE_FULL:
294 return "I40E_ERR_ADMIN_QUEUE_FULL";
295 case I40E_ERR_ADMIN_QUEUE_NO_WORK:
296 return "I40E_ERR_ADMIN_QUEUE_NO_WORK";
297 case I40E_ERR_BAD_IWARP_CQE:
298 return "I40E_ERR_BAD_IWARP_CQE";
299 case I40E_ERR_NVM_BLANK_MODE:
300 return "I40E_ERR_NVM_BLANK_MODE";
301 case I40E_ERR_NOT_IMPLEMENTED:
302 return "I40E_ERR_NOT_IMPLEMENTED";
303 case I40E_ERR_PE_DOORBELL_NOT_ENABLED:
304 return "I40E_ERR_PE_DOORBELL_NOT_ENABLED";
305 case I40E_ERR_DIAG_TEST_FAILED:
306 return "I40E_ERR_DIAG_TEST_FAILED";
307 case I40E_ERR_NOT_READY:
308 return "I40E_ERR_NOT_READY";
309 case I40E_NOT_SUPPORTED:
310 return "I40E_NOT_SUPPORTED";
311 case I40E_ERR_FIRMWARE_API_VERSION:
312 return "I40E_ERR_FIRMWARE_API_VERSION";
315 snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
321 * @hw: debug mask related to admin queue
323 * @desc: pointer to admin queue descriptor
324 * @buffer: pointer to command buffer
325 * @buf_len: max length of buffer
327 * Dumps debug log about adminq command with descriptor contents.
329 void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
330 void *buffer, u16 buf_len)
332 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
333 u8 *buf = (u8 *)buffer;
337 if ((!(mask & hw->debug_mask)) || (desc == NULL))
340 len = LE16_TO_CPU(aq_desc->datalen);
343 "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
344 LE16_TO_CPU(aq_desc->opcode),
345 LE16_TO_CPU(aq_desc->flags),
346 LE16_TO_CPU(aq_desc->datalen),
347 LE16_TO_CPU(aq_desc->retval));
348 i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
349 LE32_TO_CPU(aq_desc->cookie_high),
350 LE32_TO_CPU(aq_desc->cookie_low));
351 i40e_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
352 LE32_TO_CPU(aq_desc->params.internal.param0),
353 LE32_TO_CPU(aq_desc->params.internal.param1));
354 i40e_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
355 LE32_TO_CPU(aq_desc->params.external.addr_high),
356 LE32_TO_CPU(aq_desc->params.external.addr_low));
358 if ((buffer != NULL) && (aq_desc->datalen != 0)) {
359 i40e_debug(hw, mask, "AQ CMD Buffer:\n");
362 /* write the full 16-byte chunks */
363 for (i = 0; i < (len - 16); i += 16)
365 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
366 i, buf[i], buf[i+1], buf[i+2], buf[i+3],
367 buf[i+4], buf[i+5], buf[i+6], buf[i+7],
368 buf[i+8], buf[i+9], buf[i+10], buf[i+11],
369 buf[i+12], buf[i+13], buf[i+14], buf[i+15]);
370 /* the most we could have left is 16 bytes, pad with zeros */
376 memset(d_buf, 0, sizeof(d_buf));
377 for (j = 0; i < len; j++, i++)
380 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
381 i_sav, d_buf[0], d_buf[1], d_buf[2], d_buf[3],
382 d_buf[4], d_buf[5], d_buf[6], d_buf[7],
383 d_buf[8], d_buf[9], d_buf[10], d_buf[11],
384 d_buf[12], d_buf[13], d_buf[14], d_buf[15]);
390 * i40e_check_asq_alive
391 * @hw: pointer to the hw struct
393 * Returns true if Queue is enabled else false.
395 bool i40e_check_asq_alive(struct i40e_hw *hw)
401 return !!(rd32(hw, hw->aq.asq.len) &
402 I40E_PF_ATQLEN_ATQENABLE_MASK);
404 return !!(rd32(hw, hw->aq.asq.len) &
405 I40E_PF_ATQLEN_ATQENABLE_MASK);
406 #endif /* INTEGRATED_VF */
407 #endif /* PF_DRIVER */
411 return !!(rd32(hw, hw->aq.asq.len) &
412 I40E_VF_ATQLEN1_ATQENABLE_MASK);
414 return !!(rd32(hw, hw->aq.asq.len) &
415 I40E_VF_ATQLEN1_ATQENABLE_MASK);
416 #endif /* INTEGRATED_VF */
417 #endif /* VF_DRIVER */
422 * i40e_aq_queue_shutdown
423 * @hw: pointer to the hw struct
424 * @unloading: is the driver unloading itself
426 * Tell the Firmware that we're shutting down the AdminQ and whether
427 * or not the driver is unloading as well.
429 enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
432 struct i40e_aq_desc desc;
433 struct i40e_aqc_queue_shutdown *cmd =
434 (struct i40e_aqc_queue_shutdown *)&desc.params.raw;
435 enum i40e_status_code status;
437 i40e_fill_default_direct_cmd_desc(&desc,
438 i40e_aqc_opc_queue_shutdown);
441 cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING);
442 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
448 * i40e_aq_get_set_rss_lut
449 * @hw: pointer to the hardware structure
450 * @vsi_id: vsi fw index
451 * @pf_lut: for PF table set true, for VSI table set false
452 * @lut: pointer to the lut buffer provided by the caller
453 * @lut_size: size of the lut buffer
454 * @set: set true to set the table, false to get the table
456 * Internal function to get or set RSS look up table
458 STATIC enum i40e_status_code i40e_aq_get_set_rss_lut(struct i40e_hw *hw,
459 u16 vsi_id, bool pf_lut,
460 u8 *lut, u16 lut_size,
463 enum i40e_status_code status;
464 struct i40e_aq_desc desc;
465 struct i40e_aqc_get_set_rss_lut *cmd_resp =
466 (struct i40e_aqc_get_set_rss_lut *)&desc.params.raw;
469 i40e_fill_default_direct_cmd_desc(&desc,
470 i40e_aqc_opc_set_rss_lut);
472 i40e_fill_default_direct_cmd_desc(&desc,
473 i40e_aqc_opc_get_rss_lut);
475 /* Indirect command */
476 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
477 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
480 CPU_TO_LE16((u16)((vsi_id <<
481 I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
482 I40E_AQC_SET_RSS_LUT_VSI_ID_MASK));
483 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_LUT_VSI_VALID);
486 cmd_resp->flags |= CPU_TO_LE16((u16)
487 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
488 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
489 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
491 cmd_resp->flags |= CPU_TO_LE16((u16)
492 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
493 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
494 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
496 status = i40e_asq_send_command(hw, &desc, lut, lut_size, NULL);
502 * i40e_aq_get_rss_lut
503 * @hw: pointer to the hardware structure
504 * @vsi_id: vsi fw index
505 * @pf_lut: for PF table set true, for VSI table set false
506 * @lut: pointer to the lut buffer provided by the caller
507 * @lut_size: size of the lut buffer
509 * get the RSS lookup table, PF or VSI type
511 enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 vsi_id,
512 bool pf_lut, u8 *lut, u16 lut_size)
514 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
519 * i40e_aq_set_rss_lut
520 * @hw: pointer to the hardware structure
521 * @vsi_id: vsi fw index
522 * @pf_lut: for PF table set true, for VSI table set false
523 * @lut: pointer to the lut buffer provided by the caller
524 * @lut_size: size of the lut buffer
526 * set the RSS lookup table, PF or VSI type
528 enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 vsi_id,
529 bool pf_lut, u8 *lut, u16 lut_size)
531 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, true);
535 * i40e_aq_get_set_rss_key
536 * @hw: pointer to the hw struct
537 * @vsi_id: vsi fw index
538 * @key: pointer to key info struct
539 * @set: set true to set the key, false to get the key
541 * get the RSS key per VSI
543 STATIC enum i40e_status_code i40e_aq_get_set_rss_key(struct i40e_hw *hw,
545 struct i40e_aqc_get_set_rss_key_data *key,
548 enum i40e_status_code status;
549 struct i40e_aq_desc desc;
550 struct i40e_aqc_get_set_rss_key *cmd_resp =
551 (struct i40e_aqc_get_set_rss_key *)&desc.params.raw;
552 u16 key_size = sizeof(struct i40e_aqc_get_set_rss_key_data);
555 i40e_fill_default_direct_cmd_desc(&desc,
556 i40e_aqc_opc_set_rss_key);
558 i40e_fill_default_direct_cmd_desc(&desc,
559 i40e_aqc_opc_get_rss_key);
561 /* Indirect command */
562 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
563 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
566 CPU_TO_LE16((u16)((vsi_id <<
567 I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
568 I40E_AQC_SET_RSS_KEY_VSI_ID_MASK));
569 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_KEY_VSI_VALID);
571 status = i40e_asq_send_command(hw, &desc, key, key_size, NULL);
577 * i40e_aq_get_rss_key
578 * @hw: pointer to the hw struct
579 * @vsi_id: vsi fw index
580 * @key: pointer to key info struct
583 enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
585 struct i40e_aqc_get_set_rss_key_data *key)
587 return i40e_aq_get_set_rss_key(hw, vsi_id, key, false);
591 * i40e_aq_set_rss_key
592 * @hw: pointer to the hw struct
593 * @vsi_id: vsi fw index
594 * @key: pointer to key info struct
596 * set the RSS key per VSI
598 enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
600 struct i40e_aqc_get_set_rss_key_data *key)
602 return i40e_aq_get_set_rss_key(hw, vsi_id, key, true);
605 /* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
606 * hardware to a bit-field that can be used by SW to more easily determine the
609 * Macros are used to shorten the table lines and make this table human
612 * We store the PTYPE in the top byte of the bit field - this is just so that
613 * we can check that the table doesn't have a row missing, as the index into
614 * the table should be the PTYPE.
618 * IF NOT i40e_ptype_lookup[ptype].known
621 * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
622 * Use the rest of the fields to look at the tunnels, inner protocols, etc
624 * Use the enum i40e_rx_l2_ptype to decode the packet type
628 /* macro to make the table lines short */
629 #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
632 I40E_RX_PTYPE_OUTER_##OUTER_IP, \
633 I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \
634 I40E_RX_PTYPE_##OUTER_FRAG, \
635 I40E_RX_PTYPE_TUNNEL_##T, \
636 I40E_RX_PTYPE_TUNNEL_END_##TE, \
637 I40E_RX_PTYPE_##TEF, \
638 I40E_RX_PTYPE_INNER_PROT_##I, \
639 I40E_RX_PTYPE_PAYLOAD_LAYER_##PL }
641 #define I40E_PTT_UNUSED_ENTRY(PTYPE) \
642 { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
644 /* shorter macros makes the table fit but are terse */
645 #define I40E_RX_PTYPE_NOF I40E_RX_PTYPE_NOT_FRAG
646 #define I40E_RX_PTYPE_FRG I40E_RX_PTYPE_FRAG
647 #define I40E_RX_PTYPE_INNER_PROT_TS I40E_RX_PTYPE_INNER_PROT_TIMESYNC
649 /* Lookup table mapping the HW PTYPE to the bit field for decoding */
650 struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
651 /* L2 Packet types */
652 I40E_PTT_UNUSED_ENTRY(0),
653 I40E_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
654 I40E_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2),
655 I40E_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
656 I40E_PTT_UNUSED_ENTRY(4),
657 I40E_PTT_UNUSED_ENTRY(5),
658 I40E_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
659 I40E_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
660 I40E_PTT_UNUSED_ENTRY(8),
661 I40E_PTT_UNUSED_ENTRY(9),
662 I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
663 I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
664 I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
665 I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
666 I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
667 I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
668 I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
669 I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
670 I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
671 I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
672 I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
673 I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
675 /* Non Tunneled IPv4 */
676 I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
677 I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
678 I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4),
679 I40E_PTT_UNUSED_ENTRY(25),
680 I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4),
681 I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
682 I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
685 I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
686 I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
687 I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
688 I40E_PTT_UNUSED_ENTRY(32),
689 I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
690 I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
691 I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
694 I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
695 I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
696 I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
697 I40E_PTT_UNUSED_ENTRY(39),
698 I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
699 I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
700 I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
702 /* IPv4 --> GRE/NAT */
703 I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
705 /* IPv4 --> GRE/NAT --> IPv4 */
706 I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
707 I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
708 I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
709 I40E_PTT_UNUSED_ENTRY(47),
710 I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
711 I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
712 I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
714 /* IPv4 --> GRE/NAT --> IPv6 */
715 I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
716 I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
717 I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
718 I40E_PTT_UNUSED_ENTRY(54),
719 I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
720 I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
721 I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
723 /* IPv4 --> GRE/NAT --> MAC */
724 I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
726 /* IPv4 --> GRE/NAT --> MAC --> IPv4 */
727 I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
728 I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
729 I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
730 I40E_PTT_UNUSED_ENTRY(62),
731 I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
732 I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
733 I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
735 /* IPv4 --> GRE/NAT -> MAC --> IPv6 */
736 I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
737 I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
738 I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
739 I40E_PTT_UNUSED_ENTRY(69),
740 I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
741 I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
742 I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
744 /* IPv4 --> GRE/NAT --> MAC/VLAN */
745 I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
747 /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
748 I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
749 I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
750 I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
751 I40E_PTT_UNUSED_ENTRY(77),
752 I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
753 I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
754 I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
756 /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
757 I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
758 I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
759 I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
760 I40E_PTT_UNUSED_ENTRY(84),
761 I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
762 I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
763 I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
765 /* Non Tunneled IPv6 */
766 I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
767 I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
768 I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY4),
769 I40E_PTT_UNUSED_ENTRY(91),
770 I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
771 I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
772 I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
775 I40E_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
776 I40E_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
777 I40E_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
778 I40E_PTT_UNUSED_ENTRY(98),
779 I40E_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
780 I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
781 I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
784 I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
785 I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
786 I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
787 I40E_PTT_UNUSED_ENTRY(105),
788 I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
789 I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
790 I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
792 /* IPv6 --> GRE/NAT */
793 I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
795 /* IPv6 --> GRE/NAT -> IPv4 */
796 I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
797 I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
798 I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
799 I40E_PTT_UNUSED_ENTRY(113),
800 I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
801 I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
802 I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
804 /* IPv6 --> GRE/NAT -> IPv6 */
805 I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
806 I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
807 I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
808 I40E_PTT_UNUSED_ENTRY(120),
809 I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
810 I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
811 I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
813 /* IPv6 --> GRE/NAT -> MAC */
814 I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
816 /* IPv6 --> GRE/NAT -> MAC -> IPv4 */
817 I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
818 I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
819 I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
820 I40E_PTT_UNUSED_ENTRY(128),
821 I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
822 I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
823 I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
825 /* IPv6 --> GRE/NAT -> MAC -> IPv6 */
826 I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
827 I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
828 I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
829 I40E_PTT_UNUSED_ENTRY(135),
830 I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
831 I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
832 I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
834 /* IPv6 --> GRE/NAT -> MAC/VLAN */
835 I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
837 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
838 I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
839 I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
840 I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
841 I40E_PTT_UNUSED_ENTRY(143),
842 I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
843 I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
844 I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
846 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
847 I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
848 I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
849 I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
850 I40E_PTT_UNUSED_ENTRY(150),
851 I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
852 I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
853 I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
856 I40E_PTT_UNUSED_ENTRY(154),
857 I40E_PTT_UNUSED_ENTRY(155),
858 I40E_PTT_UNUSED_ENTRY(156),
859 I40E_PTT_UNUSED_ENTRY(157),
860 I40E_PTT_UNUSED_ENTRY(158),
861 I40E_PTT_UNUSED_ENTRY(159),
863 I40E_PTT_UNUSED_ENTRY(160),
864 I40E_PTT_UNUSED_ENTRY(161),
865 I40E_PTT_UNUSED_ENTRY(162),
866 I40E_PTT_UNUSED_ENTRY(163),
867 I40E_PTT_UNUSED_ENTRY(164),
868 I40E_PTT_UNUSED_ENTRY(165),
869 I40E_PTT_UNUSED_ENTRY(166),
870 I40E_PTT_UNUSED_ENTRY(167),
871 I40E_PTT_UNUSED_ENTRY(168),
872 I40E_PTT_UNUSED_ENTRY(169),
874 I40E_PTT_UNUSED_ENTRY(170),
875 I40E_PTT_UNUSED_ENTRY(171),
876 I40E_PTT_UNUSED_ENTRY(172),
877 I40E_PTT_UNUSED_ENTRY(173),
878 I40E_PTT_UNUSED_ENTRY(174),
879 I40E_PTT_UNUSED_ENTRY(175),
880 I40E_PTT_UNUSED_ENTRY(176),
881 I40E_PTT_UNUSED_ENTRY(177),
882 I40E_PTT_UNUSED_ENTRY(178),
883 I40E_PTT_UNUSED_ENTRY(179),
885 I40E_PTT_UNUSED_ENTRY(180),
886 I40E_PTT_UNUSED_ENTRY(181),
887 I40E_PTT_UNUSED_ENTRY(182),
888 I40E_PTT_UNUSED_ENTRY(183),
889 I40E_PTT_UNUSED_ENTRY(184),
890 I40E_PTT_UNUSED_ENTRY(185),
891 I40E_PTT_UNUSED_ENTRY(186),
892 I40E_PTT_UNUSED_ENTRY(187),
893 I40E_PTT_UNUSED_ENTRY(188),
894 I40E_PTT_UNUSED_ENTRY(189),
896 I40E_PTT_UNUSED_ENTRY(190),
897 I40E_PTT_UNUSED_ENTRY(191),
898 I40E_PTT_UNUSED_ENTRY(192),
899 I40E_PTT_UNUSED_ENTRY(193),
900 I40E_PTT_UNUSED_ENTRY(194),
901 I40E_PTT_UNUSED_ENTRY(195),
902 I40E_PTT_UNUSED_ENTRY(196),
903 I40E_PTT_UNUSED_ENTRY(197),
904 I40E_PTT_UNUSED_ENTRY(198),
905 I40E_PTT_UNUSED_ENTRY(199),
907 I40E_PTT_UNUSED_ENTRY(200),
908 I40E_PTT_UNUSED_ENTRY(201),
909 I40E_PTT_UNUSED_ENTRY(202),
910 I40E_PTT_UNUSED_ENTRY(203),
911 I40E_PTT_UNUSED_ENTRY(204),
912 I40E_PTT_UNUSED_ENTRY(205),
913 I40E_PTT_UNUSED_ENTRY(206),
914 I40E_PTT_UNUSED_ENTRY(207),
915 I40E_PTT_UNUSED_ENTRY(208),
916 I40E_PTT_UNUSED_ENTRY(209),
918 I40E_PTT_UNUSED_ENTRY(210),
919 I40E_PTT_UNUSED_ENTRY(211),
920 I40E_PTT_UNUSED_ENTRY(212),
921 I40E_PTT_UNUSED_ENTRY(213),
922 I40E_PTT_UNUSED_ENTRY(214),
923 I40E_PTT_UNUSED_ENTRY(215),
924 I40E_PTT_UNUSED_ENTRY(216),
925 I40E_PTT_UNUSED_ENTRY(217),
926 I40E_PTT_UNUSED_ENTRY(218),
927 I40E_PTT_UNUSED_ENTRY(219),
929 I40E_PTT_UNUSED_ENTRY(220),
930 I40E_PTT_UNUSED_ENTRY(221),
931 I40E_PTT_UNUSED_ENTRY(222),
932 I40E_PTT_UNUSED_ENTRY(223),
933 I40E_PTT_UNUSED_ENTRY(224),
934 I40E_PTT_UNUSED_ENTRY(225),
935 I40E_PTT_UNUSED_ENTRY(226),
936 I40E_PTT_UNUSED_ENTRY(227),
937 I40E_PTT_UNUSED_ENTRY(228),
938 I40E_PTT_UNUSED_ENTRY(229),
940 I40E_PTT_UNUSED_ENTRY(230),
941 I40E_PTT_UNUSED_ENTRY(231),
942 I40E_PTT_UNUSED_ENTRY(232),
943 I40E_PTT_UNUSED_ENTRY(233),
944 I40E_PTT_UNUSED_ENTRY(234),
945 I40E_PTT_UNUSED_ENTRY(235),
946 I40E_PTT_UNUSED_ENTRY(236),
947 I40E_PTT_UNUSED_ENTRY(237),
948 I40E_PTT_UNUSED_ENTRY(238),
949 I40E_PTT_UNUSED_ENTRY(239),
951 I40E_PTT_UNUSED_ENTRY(240),
952 I40E_PTT_UNUSED_ENTRY(241),
953 I40E_PTT_UNUSED_ENTRY(242),
954 I40E_PTT_UNUSED_ENTRY(243),
955 I40E_PTT_UNUSED_ENTRY(244),
956 I40E_PTT_UNUSED_ENTRY(245),
957 I40E_PTT_UNUSED_ENTRY(246),
958 I40E_PTT_UNUSED_ENTRY(247),
959 I40E_PTT_UNUSED_ENTRY(248),
960 I40E_PTT_UNUSED_ENTRY(249),
962 I40E_PTT_UNUSED_ENTRY(250),
963 I40E_PTT_UNUSED_ENTRY(251),
964 I40E_PTT_UNUSED_ENTRY(252),
965 I40E_PTT_UNUSED_ENTRY(253),
966 I40E_PTT_UNUSED_ENTRY(254),
967 I40E_PTT_UNUSED_ENTRY(255)
972 * i40e_validate_mac_addr - Validate unicast MAC address
973 * @mac_addr: pointer to MAC address
975 * Tests a MAC address to ensure it is a valid Individual Address
977 enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
979 enum i40e_status_code status = I40E_SUCCESS;
981 DEBUGFUNC("i40e_validate_mac_addr");
983 /* Broadcast addresses ARE multicast addresses
984 * Make sure it is not a multicast address
985 * Reject the zero address
987 if (I40E_IS_MULTICAST(mac_addr) ||
988 (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
989 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
990 status = I40E_ERR_INVALID_MAC_ADDR;
997 * i40e_init_shared_code - Initialize the shared code
998 * @hw: pointer to hardware structure
1000 * This assigns the MAC type and PHY code and inits the NVM.
1001 * Does not touch the hardware. This function must be called prior to any
1002 * other function in the shared code. The i40e_hw structure should be
1003 * memset to 0 prior to calling this function. The following fields in
1004 * hw structure should be filled in prior to calling this function:
1005 * hw_addr, back, device_id, vendor_id, subsystem_device_id,
1006 * subsystem_vendor_id, and revision_id
1008 enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
1010 enum i40e_status_code status = I40E_SUCCESS;
1011 u32 port, ari, func_rid;
1013 DEBUGFUNC("i40e_init_shared_code");
1015 i40e_set_mac_type(hw);
1017 switch (hw->mac.type) {
1018 case I40E_MAC_XL710:
1022 return I40E_ERR_DEVICE_NOT_SUPPORTED;
1025 hw->phy.get_link_info = true;
1027 /* Determine port number and PF number*/
1028 port = (rd32(hw, I40E_PFGEN_PORTNUM) & I40E_PFGEN_PORTNUM_PORT_NUM_MASK)
1029 >> I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT;
1030 hw->port = (u8)port;
1031 ari = (rd32(hw, I40E_GLPCI_CAPSUP) & I40E_GLPCI_CAPSUP_ARI_EN_MASK) >>
1032 I40E_GLPCI_CAPSUP_ARI_EN_SHIFT;
1033 func_rid = rd32(hw, I40E_PF_FUNC_RID);
1035 hw->pf_id = (u8)(func_rid & 0xff);
1037 hw->pf_id = (u8)(func_rid & 0x7);
1039 if (hw->mac.type == I40E_MAC_X722)
1040 hw->flags |= I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE;
1042 status = i40e_init_nvm(hw);
1047 * i40e_aq_mac_address_read - Retrieve the MAC addresses
1048 * @hw: pointer to the hw struct
1049 * @flags: a return indicator of what addresses were added to the addr store
1050 * @addrs: the requestor's mac addr store
1051 * @cmd_details: pointer to command details structure or NULL
1053 STATIC enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw,
1055 struct i40e_aqc_mac_address_read_data *addrs,
1056 struct i40e_asq_cmd_details *cmd_details)
1058 struct i40e_aq_desc desc;
1059 struct i40e_aqc_mac_address_read *cmd_data =
1060 (struct i40e_aqc_mac_address_read *)&desc.params.raw;
1061 enum i40e_status_code status;
1063 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
1064 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
1066 status = i40e_asq_send_command(hw, &desc, addrs,
1067 sizeof(*addrs), cmd_details);
1068 *flags = LE16_TO_CPU(cmd_data->command_flags);
1074 * i40e_aq_mac_address_write - Change the MAC addresses
1075 * @hw: pointer to the hw struct
1076 * @flags: indicates which MAC to be written
1077 * @mac_addr: address to write
1078 * @cmd_details: pointer to command details structure or NULL
1080 enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
1081 u16 flags, u8 *mac_addr,
1082 struct i40e_asq_cmd_details *cmd_details)
1084 struct i40e_aq_desc desc;
1085 struct i40e_aqc_mac_address_write *cmd_data =
1086 (struct i40e_aqc_mac_address_write *)&desc.params.raw;
1087 enum i40e_status_code status;
1089 i40e_fill_default_direct_cmd_desc(&desc,
1090 i40e_aqc_opc_mac_address_write);
1091 cmd_data->command_flags = CPU_TO_LE16(flags);
1092 cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]);
1093 cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) |
1094 ((u32)mac_addr[3] << 16) |
1095 ((u32)mac_addr[4] << 8) |
1098 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1104 * i40e_get_mac_addr - get MAC address
1105 * @hw: pointer to the HW structure
1106 * @mac_addr: pointer to MAC address
1108 * Reads the adapter's MAC address from register
1110 enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1112 struct i40e_aqc_mac_address_read_data addrs;
1113 enum i40e_status_code status;
1116 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1118 if (flags & I40E_AQC_LAN_ADDR_VALID)
1119 i40e_memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac),
1120 I40E_NONDMA_TO_NONDMA);
1126 * i40e_get_port_mac_addr - get Port MAC address
1127 * @hw: pointer to the HW structure
1128 * @mac_addr: pointer to Port MAC address
1130 * Reads the adapter's Port MAC address
1132 enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1134 struct i40e_aqc_mac_address_read_data addrs;
1135 enum i40e_status_code status;
1138 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1142 if (flags & I40E_AQC_PORT_ADDR_VALID)
1143 i40e_memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac),
1144 I40E_NONDMA_TO_NONDMA);
1146 status = I40E_ERR_INVALID_MAC_ADDR;
1152 * i40e_pre_tx_queue_cfg - pre tx queue configure
1153 * @hw: pointer to the HW structure
1154 * @queue: target pf queue index
1155 * @enable: state change request
1157 * Handles hw requirement to indicate intention to enable
1158 * or disable target queue.
1160 void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable)
1162 u32 abs_queue_idx = hw->func_caps.base_queue + queue;
1166 if (abs_queue_idx >= 128) {
1167 reg_block = abs_queue_idx / 128;
1168 abs_queue_idx %= 128;
1171 reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1172 reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1173 reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1176 reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK;
1178 reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1180 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val);
1184 * i40e_get_san_mac_addr - get SAN MAC address
1185 * @hw: pointer to the HW structure
1186 * @mac_addr: pointer to SAN MAC address
1188 * Reads the adapter's SAN MAC address from NVM
1190 enum i40e_status_code i40e_get_san_mac_addr(struct i40e_hw *hw,
1193 struct i40e_aqc_mac_address_read_data addrs;
1194 enum i40e_status_code status;
1197 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1201 if (flags & I40E_AQC_SAN_ADDR_VALID)
1202 i40e_memcpy(mac_addr, &addrs.pf_san_mac, sizeof(addrs.pf_san_mac),
1203 I40E_NONDMA_TO_NONDMA);
1205 status = I40E_ERR_INVALID_MAC_ADDR;
1211 * i40e_read_pba_string - Reads part number string from EEPROM
1212 * @hw: pointer to hardware structure
1213 * @pba_num: stores the part number string from the EEPROM
1214 * @pba_num_size: part number string buffer length
1216 * Reads the part number string from the EEPROM.
1218 enum i40e_status_code i40e_read_pba_string(struct i40e_hw *hw, u8 *pba_num,
1221 enum i40e_status_code status = I40E_SUCCESS;
1227 status = i40e_read_nvm_word(hw, I40E_SR_PBA_FLAGS, &pba_word);
1228 if ((status != I40E_SUCCESS) || (pba_word != 0xFAFA)) {
1229 DEBUGOUT("Failed to read PBA flags or flag is invalid.\n");
1233 status = i40e_read_nvm_word(hw, I40E_SR_PBA_BLOCK_PTR, &pba_ptr);
1234 if (status != I40E_SUCCESS) {
1235 DEBUGOUT("Failed to read PBA Block pointer.\n");
1239 status = i40e_read_nvm_word(hw, pba_ptr, &pba_size);
1240 if (status != I40E_SUCCESS) {
1241 DEBUGOUT("Failed to read PBA Block size.\n");
1245 /* Subtract one to get PBA word count (PBA Size word is included in
1249 if (pba_num_size < (((u32)pba_size * 2) + 1)) {
1250 DEBUGOUT("Buffer to small for PBA data.\n");
1251 return I40E_ERR_PARAM;
1254 for (i = 0; i < pba_size; i++) {
1255 status = i40e_read_nvm_word(hw, (pba_ptr + 1) + i, &pba_word);
1256 if (status != I40E_SUCCESS) {
1257 DEBUGOUT1("Failed to read PBA Block word %d.\n", i);
1261 pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
1262 pba_num[(i * 2) + 1] = pba_word & 0xFF;
1264 pba_num[(pba_size * 2)] = '\0';
1270 * i40e_get_media_type - Gets media type
1271 * @hw: pointer to the hardware structure
1273 STATIC enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
1275 enum i40e_media_type media;
1277 switch (hw->phy.link_info.phy_type) {
1278 case I40E_PHY_TYPE_10GBASE_SR:
1279 case I40E_PHY_TYPE_10GBASE_LR:
1280 case I40E_PHY_TYPE_1000BASE_SX:
1281 case I40E_PHY_TYPE_1000BASE_LX:
1282 case I40E_PHY_TYPE_40GBASE_SR4:
1283 case I40E_PHY_TYPE_40GBASE_LR4:
1284 case I40E_PHY_TYPE_25GBASE_LR:
1285 case I40E_PHY_TYPE_25GBASE_SR:
1286 media = I40E_MEDIA_TYPE_FIBER;
1288 case I40E_PHY_TYPE_100BASE_TX:
1289 case I40E_PHY_TYPE_1000BASE_T:
1290 case I40E_PHY_TYPE_10GBASE_T:
1291 media = I40E_MEDIA_TYPE_BASET;
1293 case I40E_PHY_TYPE_10GBASE_CR1_CU:
1294 case I40E_PHY_TYPE_40GBASE_CR4_CU:
1295 case I40E_PHY_TYPE_10GBASE_CR1:
1296 case I40E_PHY_TYPE_40GBASE_CR4:
1297 case I40E_PHY_TYPE_10GBASE_SFPP_CU:
1298 case I40E_PHY_TYPE_40GBASE_AOC:
1299 case I40E_PHY_TYPE_10GBASE_AOC:
1300 case I40E_PHY_TYPE_25GBASE_CR:
1301 case I40E_PHY_TYPE_25GBASE_AOC:
1302 case I40E_PHY_TYPE_25GBASE_ACC:
1303 media = I40E_MEDIA_TYPE_DA;
1305 case I40E_PHY_TYPE_1000BASE_KX:
1306 case I40E_PHY_TYPE_10GBASE_KX4:
1307 case I40E_PHY_TYPE_10GBASE_KR:
1308 case I40E_PHY_TYPE_40GBASE_KR4:
1309 case I40E_PHY_TYPE_20GBASE_KR2:
1310 case I40E_PHY_TYPE_25GBASE_KR:
1311 media = I40E_MEDIA_TYPE_BACKPLANE;
1313 case I40E_PHY_TYPE_SGMII:
1314 case I40E_PHY_TYPE_XAUI:
1315 case I40E_PHY_TYPE_XFI:
1316 case I40E_PHY_TYPE_XLAUI:
1317 case I40E_PHY_TYPE_XLPPI:
1319 media = I40E_MEDIA_TYPE_UNKNOWN;
1326 #define I40E_PF_RESET_WAIT_COUNT 200
1328 * i40e_pf_reset - Reset the PF
1329 * @hw: pointer to the hardware structure
1331 * Assuming someone else has triggered a global reset,
1332 * assure the global reset is complete and then reset the PF
1334 enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw)
1341 /* Poll for Global Reset steady state in case of recent GRST.
1342 * The grst delay value is in 100ms units, and we'll wait a
1343 * couple counts longer to be sure we don't just miss the end.
1345 grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) &
1346 I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >>
1347 I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
1349 grst_del = grst_del * 20;
1351 for (cnt = 0; cnt < grst_del; cnt++) {
1352 reg = rd32(hw, I40E_GLGEN_RSTAT);
1353 if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
1355 i40e_msec_delay(100);
1357 if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1358 DEBUGOUT("Global reset polling failed to complete.\n");
1359 return I40E_ERR_RESET_FAILED;
1362 /* Now Wait for the FW to be ready */
1363 for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) {
1364 reg = rd32(hw, I40E_GLNVM_ULD);
1365 reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1366 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK);
1367 if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1368 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) {
1369 DEBUGOUT1("Core and Global modules ready %d\n", cnt1);
1372 i40e_msec_delay(10);
1374 if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1375 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) {
1376 DEBUGOUT("wait for FW Reset complete timedout\n");
1377 DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg);
1378 return I40E_ERR_RESET_FAILED;
1381 /* If there was a Global Reset in progress when we got here,
1382 * we don't need to do the PF Reset
1387 reg = rd32(hw, I40E_PFGEN_CTRL);
1388 wr32(hw, I40E_PFGEN_CTRL,
1389 (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
1390 for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) {
1391 reg = rd32(hw, I40E_PFGEN_CTRL);
1392 if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
1394 reg2 = rd32(hw, I40E_GLGEN_RSTAT);
1395 if (reg2 & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1396 DEBUGOUT("Core reset upcoming.\n");
1397 DEBUGOUT1("I40E_GLGEN_RSTAT = 0x%x\n", reg2);
1398 return I40E_ERR_NOT_READY;
1402 if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
1403 DEBUGOUT("PF reset polling failed to complete.\n");
1404 return I40E_ERR_RESET_FAILED;
1408 i40e_clear_pxe_mode(hw);
1411 return I40E_SUCCESS;
1415 * i40e_clear_hw - clear out any left over hw state
1416 * @hw: pointer to the hw struct
1418 * Clear queues and interrupts, typically called at init time,
1419 * but after the capabilities have been found so we know how many
1420 * queues and msix vectors have been allocated.
1422 void i40e_clear_hw(struct i40e_hw *hw)
1424 u32 num_queues, base_queue;
1432 /* get number of interrupts, queues, and vfs */
1433 val = rd32(hw, I40E_GLPCI_CNF2);
1434 num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >>
1435 I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT;
1436 num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >>
1437 I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT;
1439 val = rd32(hw, I40E_PFLAN_QALLOC);
1440 base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >>
1441 I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
1442 j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
1443 I40E_PFLAN_QALLOC_LASTQ_SHIFT;
1444 if (val & I40E_PFLAN_QALLOC_VALID_MASK)
1445 num_queues = (j - base_queue) + 1;
1449 val = rd32(hw, I40E_PF_VT_PFALLOC);
1450 i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >>
1451 I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
1452 j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
1453 I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
1454 if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
1455 num_vfs = (j - i) + 1;
1459 /* stop all the interrupts */
1460 wr32(hw, I40E_PFINT_ICR0_ENA, 0);
1461 val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
1462 for (i = 0; i < num_pf_int - 2; i++)
1463 wr32(hw, I40E_PFINT_DYN_CTLN(i), val);
1465 /* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
1466 val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1467 wr32(hw, I40E_PFINT_LNKLST0, val);
1468 for (i = 0; i < num_pf_int - 2; i++)
1469 wr32(hw, I40E_PFINT_LNKLSTN(i), val);
1470 val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1471 for (i = 0; i < num_vfs; i++)
1472 wr32(hw, I40E_VPINT_LNKLST0(i), val);
1473 for (i = 0; i < num_vf_int - 2; i++)
1474 wr32(hw, I40E_VPINT_LNKLSTN(i), val);
1476 /* warn the HW of the coming Tx disables */
1477 for (i = 0; i < num_queues; i++) {
1478 u32 abs_queue_idx = base_queue + i;
1481 if (abs_queue_idx >= 128) {
1482 reg_block = abs_queue_idx / 128;
1483 abs_queue_idx %= 128;
1486 val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1487 val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1488 val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1489 val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1491 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val);
1493 i40e_usec_delay(400);
1495 /* stop all the queues */
1496 for (i = 0; i < num_queues; i++) {
1497 wr32(hw, I40E_QINT_TQCTL(i), 0);
1498 wr32(hw, I40E_QTX_ENA(i), 0);
1499 wr32(hw, I40E_QINT_RQCTL(i), 0);
1500 wr32(hw, I40E_QRX_ENA(i), 0);
1503 /* short wait for all queue disables to settle */
1504 i40e_usec_delay(50);
1508 * i40e_clear_pxe_mode - clear pxe operations mode
1509 * @hw: pointer to the hw struct
1511 * Make sure all PXE mode settings are cleared, including things
1512 * like descriptor fetch/write-back mode.
1514 void i40e_clear_pxe_mode(struct i40e_hw *hw)
1516 if (i40e_check_asq_alive(hw))
1517 i40e_aq_clear_pxe_mode(hw, NULL);
1521 * i40e_led_is_mine - helper to find matching led
1522 * @hw: pointer to the hw struct
1523 * @idx: index into GPIO registers
1525 * returns: 0 if no match, otherwise the value of the GPIO_CTL register
1527 static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx)
1532 if (!hw->func_caps.led[idx])
1535 gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx));
1536 port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >>
1537 I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
1539 /* if PRT_NUM_NA is 1 then this LED is not port specific, OR
1540 * if it is not our port then ignore
1542 if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) ||
1549 #define I40E_COMBINED_ACTIVITY 0xA
1550 #define I40E_FILTER_ACTIVITY 0xE
1551 #define I40E_LINK_ACTIVITY 0xC
1552 #define I40E_MAC_ACTIVITY 0xD
1553 #define I40E_LED0 22
1556 * i40e_led_get - return current on/off mode
1557 * @hw: pointer to the hw struct
1559 * The value returned is the 'mode' field as defined in the
1560 * GPIO register definitions: 0x0 = off, 0xf = on, and other
1561 * values are variations of possible behaviors relating to
1562 * blink, link, and wire.
1564 u32 i40e_led_get(struct i40e_hw *hw)
1566 u32 current_mode = 0;
1570 /* as per the documentation GPIO 22-29 are the LED
1571 * GPIO pins named LED0..LED7
1573 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1574 u32 gpio_val = i40e_led_is_mine(hw, i);
1579 /* ignore gpio LED src mode entries related to the activity
1582 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1583 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1584 switch (current_mode) {
1585 case I40E_COMBINED_ACTIVITY:
1586 case I40E_FILTER_ACTIVITY:
1587 case I40E_MAC_ACTIVITY:
1593 mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1594 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT;
1602 * i40e_led_set - set new on/off mode
1603 * @hw: pointer to the hw struct
1604 * @mode: 0=off, 0xf=on (else see manual for mode details)
1605 * @blink: true if the LED should blink when on, false if steady
1607 * if this function is used to turn on the blink it should
1608 * be used to disable the blink when restoring the original state.
1610 void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink)
1612 u32 current_mode = 0;
1615 if (mode & 0xfffffff0)
1616 DEBUGOUT1("invalid mode passed in %X\n", mode);
1618 /* as per the documentation GPIO 22-29 are the LED
1619 * GPIO pins named LED0..LED7
1621 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1622 u32 gpio_val = i40e_led_is_mine(hw, i);
1627 /* ignore gpio LED src mode entries related to the activity
1630 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1631 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1632 switch (current_mode) {
1633 case I40E_COMBINED_ACTIVITY:
1634 case I40E_FILTER_ACTIVITY:
1635 case I40E_MAC_ACTIVITY:
1641 gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
1642 /* this & is a bit of paranoia, but serves as a range check */
1643 gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
1644 I40E_GLGEN_GPIO_CTL_LED_MODE_MASK);
1646 if (mode == I40E_LINK_ACTIVITY)
1650 gpio_val |= BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1652 gpio_val &= ~BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1654 wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
1659 /* Admin command wrappers */
1662 * i40e_aq_get_phy_capabilities
1663 * @hw: pointer to the hw struct
1664 * @abilities: structure for PHY capabilities to be filled
1665 * @qualified_modules: report Qualified Modules
1666 * @report_init: report init capabilities (active are default)
1667 * @cmd_details: pointer to command details structure or NULL
1669 * Returns the various PHY abilities supported on the Port.
1671 enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
1672 bool qualified_modules, bool report_init,
1673 struct i40e_aq_get_phy_abilities_resp *abilities,
1674 struct i40e_asq_cmd_details *cmd_details)
1676 struct i40e_aq_desc desc;
1677 enum i40e_status_code status;
1678 u16 max_delay = I40E_MAX_PHY_TIMEOUT, total_delay = 0;
1679 u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
1682 return I40E_ERR_PARAM;
1685 i40e_fill_default_direct_cmd_desc(&desc,
1686 i40e_aqc_opc_get_phy_abilities);
1688 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1689 if (abilities_size > I40E_AQ_LARGE_BUF)
1690 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1692 if (qualified_modules)
1693 desc.params.external.param0 |=
1694 CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
1697 desc.params.external.param0 |=
1698 CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
1700 status = i40e_asq_send_command(hw, &desc, abilities,
1701 abilities_size, cmd_details);
1703 if (status != I40E_SUCCESS)
1706 if (hw->aq.asq_last_status == I40E_AQ_RC_EIO) {
1707 status = I40E_ERR_UNKNOWN_PHY;
1709 } else if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN) {
1712 status = I40E_ERR_TIMEOUT;
1714 } while ((hw->aq.asq_last_status != I40E_AQ_RC_OK) &&
1715 (total_delay < max_delay));
1717 if (status != I40E_SUCCESS)
1721 if (hw->mac.type == I40E_MAC_XL710 &&
1722 hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&
1723 hw->aq.api_min_ver >= I40E_MINOR_VER_GET_LINK_INFO_XL710) {
1724 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
1726 hw->phy.phy_types = LE32_TO_CPU(abilities->phy_type);
1727 hw->phy.phy_types |=
1728 ((u64)abilities->phy_type_ext << 32);
1736 * i40e_aq_set_phy_config
1737 * @hw: pointer to the hw struct
1738 * @config: structure with PHY configuration to be set
1739 * @cmd_details: pointer to command details structure or NULL
1741 * Set the various PHY configuration parameters
1742 * supported on the Port.One or more of the Set PHY config parameters may be
1743 * ignored in an MFP mode as the PF may not have the privilege to set some
1744 * of the PHY Config parameters. This status will be indicated by the
1747 enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
1748 struct i40e_aq_set_phy_config *config,
1749 struct i40e_asq_cmd_details *cmd_details)
1751 struct i40e_aq_desc desc;
1752 struct i40e_aq_set_phy_config *cmd =
1753 (struct i40e_aq_set_phy_config *)&desc.params.raw;
1754 enum i40e_status_code status;
1757 return I40E_ERR_PARAM;
1759 i40e_fill_default_direct_cmd_desc(&desc,
1760 i40e_aqc_opc_set_phy_config);
1764 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1771 * @hw: pointer to the hw struct
1773 * Set the requested flow control mode using set_phy_config.
1775 enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
1776 bool atomic_restart)
1778 enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
1779 struct i40e_aq_get_phy_abilities_resp abilities;
1780 struct i40e_aq_set_phy_config config;
1781 enum i40e_status_code status;
1782 u8 pause_mask = 0x0;
1788 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1789 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1791 case I40E_FC_RX_PAUSE:
1792 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1794 case I40E_FC_TX_PAUSE:
1795 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1801 /* Get the current phy config */
1802 status = i40e_aq_get_phy_capabilities(hw, false, false, &abilities,
1805 *aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
1809 memset(&config, 0, sizeof(config));
1810 /* clear the old pause settings */
1811 config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
1812 ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
1813 /* set the new abilities */
1814 config.abilities |= pause_mask;
1815 /* If the abilities have changed, then set the new config */
1816 if (config.abilities != abilities.abilities) {
1817 /* Auto restart link so settings take effect */
1819 config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
1820 /* Copy over all the old settings */
1821 config.phy_type = abilities.phy_type;
1822 config.phy_type_ext = abilities.phy_type_ext;
1823 config.link_speed = abilities.link_speed;
1824 config.eee_capability = abilities.eee_capability;
1825 config.eeer = abilities.eeer_val;
1826 config.low_power_ctrl = abilities.d3_lpan;
1827 config.fec_config = abilities.fec_cfg_curr_mod_ext_info &
1828 I40E_AQ_PHY_FEC_CONFIG_MASK;
1829 status = i40e_aq_set_phy_config(hw, &config, NULL);
1832 *aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
1834 /* Update the link info */
1835 status = i40e_update_link_info(hw);
1837 /* Wait a little bit (on 40G cards it sometimes takes a really
1838 * long time for link to come back from the atomic reset)
1841 i40e_msec_delay(1000);
1842 status = i40e_update_link_info(hw);
1845 *aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
1851 * i40e_aq_set_mac_config
1852 * @hw: pointer to the hw struct
1853 * @max_frame_size: Maximum Frame Size to be supported by the port
1854 * @crc_en: Tell HW to append a CRC to outgoing frames
1855 * @pacing: Pacing configurations
1856 * @cmd_details: pointer to command details structure or NULL
1858 * Configure MAC settings for frame size, jumbo frame support and the
1859 * addition of a CRC by the hardware.
1861 enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
1863 bool crc_en, u16 pacing,
1864 struct i40e_asq_cmd_details *cmd_details)
1866 struct i40e_aq_desc desc;
1867 struct i40e_aq_set_mac_config *cmd =
1868 (struct i40e_aq_set_mac_config *)&desc.params.raw;
1869 enum i40e_status_code status;
1871 if (max_frame_size == 0)
1872 return I40E_ERR_PARAM;
1874 i40e_fill_default_direct_cmd_desc(&desc,
1875 i40e_aqc_opc_set_mac_config);
1877 cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
1878 cmd->params = ((u8)pacing & 0x0F) << 3;
1880 cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
1882 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1888 * i40e_aq_clear_pxe_mode
1889 * @hw: pointer to the hw struct
1890 * @cmd_details: pointer to command details structure or NULL
1892 * Tell the firmware that the driver is taking over from PXE
1894 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
1895 struct i40e_asq_cmd_details *cmd_details)
1897 enum i40e_status_code status;
1898 struct i40e_aq_desc desc;
1899 struct i40e_aqc_clear_pxe *cmd =
1900 (struct i40e_aqc_clear_pxe *)&desc.params.raw;
1902 i40e_fill_default_direct_cmd_desc(&desc,
1903 i40e_aqc_opc_clear_pxe_mode);
1907 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1909 wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
1915 * i40e_aq_set_link_restart_an
1916 * @hw: pointer to the hw struct
1917 * @enable_link: if true: enable link, if false: disable link
1918 * @cmd_details: pointer to command details structure or NULL
1920 * Sets up the link and restarts the Auto-Negotiation over the link.
1922 enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
1923 bool enable_link, struct i40e_asq_cmd_details *cmd_details)
1925 struct i40e_aq_desc desc;
1926 struct i40e_aqc_set_link_restart_an *cmd =
1927 (struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
1928 enum i40e_status_code status;
1930 i40e_fill_default_direct_cmd_desc(&desc,
1931 i40e_aqc_opc_set_link_restart_an);
1933 cmd->command = I40E_AQ_PHY_RESTART_AN;
1935 cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
1937 cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
1939 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1945 * i40e_aq_get_link_info
1946 * @hw: pointer to the hw struct
1947 * @enable_lse: enable/disable LinkStatusEvent reporting
1948 * @link: pointer to link status structure - optional
1949 * @cmd_details: pointer to command details structure or NULL
1951 * Returns the link status of the adapter.
1953 enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
1954 bool enable_lse, struct i40e_link_status *link,
1955 struct i40e_asq_cmd_details *cmd_details)
1957 struct i40e_aq_desc desc;
1958 struct i40e_aqc_get_link_status *resp =
1959 (struct i40e_aqc_get_link_status *)&desc.params.raw;
1960 struct i40e_link_status *hw_link_info = &hw->phy.link_info;
1961 enum i40e_status_code status;
1962 bool tx_pause, rx_pause;
1965 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
1968 command_flags = I40E_AQ_LSE_ENABLE;
1970 command_flags = I40E_AQ_LSE_DISABLE;
1971 resp->command_flags = CPU_TO_LE16(command_flags);
1973 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1975 if (status != I40E_SUCCESS)
1976 goto aq_get_link_info_exit;
1978 /* save off old link status information */
1979 i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
1980 sizeof(*hw_link_info), I40E_NONDMA_TO_NONDMA);
1982 /* update link status */
1983 hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
1984 hw->phy.media_type = i40e_get_media_type(hw);
1985 hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
1986 hw_link_info->link_info = resp->link_info;
1987 hw_link_info->an_info = resp->an_info;
1988 hw_link_info->fec_info = resp->config & (I40E_AQ_CONFIG_FEC_KR_ENA |
1989 I40E_AQ_CONFIG_FEC_RS_ENA);
1990 hw_link_info->ext_info = resp->ext_info;
1991 hw_link_info->loopback = resp->loopback & I40E_AQ_LOOPBACK_MASK;
1992 hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
1993 hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
1995 /* update fc info */
1996 tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
1997 rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
1998 if (tx_pause & rx_pause)
1999 hw->fc.current_mode = I40E_FC_FULL;
2001 hw->fc.current_mode = I40E_FC_TX_PAUSE;
2003 hw->fc.current_mode = I40E_FC_RX_PAUSE;
2005 hw->fc.current_mode = I40E_FC_NONE;
2007 if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
2008 hw_link_info->crc_enable = true;
2010 hw_link_info->crc_enable = false;
2012 if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_IS_ENABLED))
2013 hw_link_info->lse_enable = true;
2015 hw_link_info->lse_enable = false;
2017 if ((hw->mac.type == I40E_MAC_XL710) &&
2018 (hw->aq.fw_maj_ver < 4 || (hw->aq.fw_maj_ver == 4 &&
2019 hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
2020 hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
2022 if (hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&
2023 hw->aq.api_min_ver >= 7) {
2024 hw->phy.phy_types = LE32_TO_CPU(*(__le32 *)resp->link_type);
2025 hw->phy.phy_types |= ((u64)resp->link_type_ext << 32);
2028 /* save link status information */
2030 i40e_memcpy(link, hw_link_info, sizeof(*hw_link_info),
2031 I40E_NONDMA_TO_NONDMA);
2033 /* flag cleared so helper functions don't call AQ again */
2034 hw->phy.get_link_info = false;
2036 aq_get_link_info_exit:
2041 * i40e_aq_set_phy_int_mask
2042 * @hw: pointer to the hw struct
2043 * @mask: interrupt mask to be set
2044 * @cmd_details: pointer to command details structure or NULL
2046 * Set link interrupt mask.
2048 enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
2050 struct i40e_asq_cmd_details *cmd_details)
2052 struct i40e_aq_desc desc;
2053 struct i40e_aqc_set_phy_int_mask *cmd =
2054 (struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
2055 enum i40e_status_code status;
2057 i40e_fill_default_direct_cmd_desc(&desc,
2058 i40e_aqc_opc_set_phy_int_mask);
2060 cmd->event_mask = CPU_TO_LE16(mask);
2062 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2068 * i40e_aq_get_local_advt_reg
2069 * @hw: pointer to the hw struct
2070 * @advt_reg: local AN advertisement register value
2071 * @cmd_details: pointer to command details structure or NULL
2073 * Get the Local AN advertisement register value.
2075 enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
2077 struct i40e_asq_cmd_details *cmd_details)
2079 struct i40e_aq_desc desc;
2080 struct i40e_aqc_an_advt_reg *resp =
2081 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2082 enum i40e_status_code status;
2084 i40e_fill_default_direct_cmd_desc(&desc,
2085 i40e_aqc_opc_get_local_advt_reg);
2087 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2089 if (status != I40E_SUCCESS)
2090 goto aq_get_local_advt_reg_exit;
2092 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2093 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2095 aq_get_local_advt_reg_exit:
2100 * i40e_aq_set_local_advt_reg
2101 * @hw: pointer to the hw struct
2102 * @advt_reg: local AN advertisement register value
2103 * @cmd_details: pointer to command details structure or NULL
2105 * Get the Local AN advertisement register value.
2107 enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
2109 struct i40e_asq_cmd_details *cmd_details)
2111 struct i40e_aq_desc desc;
2112 struct i40e_aqc_an_advt_reg *cmd =
2113 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2114 enum i40e_status_code status;
2116 i40e_fill_default_direct_cmd_desc(&desc,
2117 i40e_aqc_opc_get_local_advt_reg);
2119 cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
2120 cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
2122 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2128 * i40e_aq_get_partner_advt
2129 * @hw: pointer to the hw struct
2130 * @advt_reg: AN partner advertisement register value
2131 * @cmd_details: pointer to command details structure or NULL
2133 * Get the link partner AN advertisement register value.
2135 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
2137 struct i40e_asq_cmd_details *cmd_details)
2139 struct i40e_aq_desc desc;
2140 struct i40e_aqc_an_advt_reg *resp =
2141 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2142 enum i40e_status_code status;
2144 i40e_fill_default_direct_cmd_desc(&desc,
2145 i40e_aqc_opc_get_partner_advt);
2147 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2149 if (status != I40E_SUCCESS)
2150 goto aq_get_partner_advt_exit;
2152 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2153 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2155 aq_get_partner_advt_exit:
2160 * i40e_aq_set_lb_modes
2161 * @hw: pointer to the hw struct
2162 * @lb_modes: loopback mode to be set
2163 * @cmd_details: pointer to command details structure or NULL
2165 * Sets loopback modes.
2167 enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
2169 struct i40e_asq_cmd_details *cmd_details)
2171 struct i40e_aq_desc desc;
2172 struct i40e_aqc_set_lb_mode *cmd =
2173 (struct i40e_aqc_set_lb_mode *)&desc.params.raw;
2174 enum i40e_status_code status;
2176 i40e_fill_default_direct_cmd_desc(&desc,
2177 i40e_aqc_opc_set_lb_modes);
2179 cmd->lb_mode = CPU_TO_LE16(lb_modes);
2181 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2187 * i40e_aq_set_phy_debug
2188 * @hw: pointer to the hw struct
2189 * @cmd_flags: debug command flags
2190 * @cmd_details: pointer to command details structure or NULL
2192 * Reset the external PHY.
2194 enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
2195 struct i40e_asq_cmd_details *cmd_details)
2197 struct i40e_aq_desc desc;
2198 struct i40e_aqc_set_phy_debug *cmd =
2199 (struct i40e_aqc_set_phy_debug *)&desc.params.raw;
2200 enum i40e_status_code status;
2202 i40e_fill_default_direct_cmd_desc(&desc,
2203 i40e_aqc_opc_set_phy_debug);
2205 cmd->command_flags = cmd_flags;
2207 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2214 * @hw: pointer to the hw struct
2215 * @vsi_ctx: pointer to a vsi context struct
2216 * @cmd_details: pointer to command details structure or NULL
2218 * Add a VSI context to the hardware.
2220 enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
2221 struct i40e_vsi_context *vsi_ctx,
2222 struct i40e_asq_cmd_details *cmd_details)
2224 struct i40e_aq_desc desc;
2225 struct i40e_aqc_add_get_update_vsi *cmd =
2226 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2227 struct i40e_aqc_add_get_update_vsi_completion *resp =
2228 (struct i40e_aqc_add_get_update_vsi_completion *)
2230 enum i40e_status_code status;
2232 i40e_fill_default_direct_cmd_desc(&desc,
2233 i40e_aqc_opc_add_vsi);
2235 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
2236 cmd->connection_type = vsi_ctx->connection_type;
2237 cmd->vf_id = vsi_ctx->vf_num;
2238 cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
2240 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2242 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2243 sizeof(vsi_ctx->info), cmd_details);
2245 if (status != I40E_SUCCESS)
2246 goto aq_add_vsi_exit;
2248 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2249 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2250 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2251 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2258 * i40e_aq_set_default_vsi
2259 * @hw: pointer to the hw struct
2261 * @cmd_details: pointer to command details structure or NULL
2263 enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
2265 struct i40e_asq_cmd_details *cmd_details)
2267 struct i40e_aq_desc desc;
2268 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2269 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2271 enum i40e_status_code status;
2273 i40e_fill_default_direct_cmd_desc(&desc,
2274 i40e_aqc_opc_set_vsi_promiscuous_modes);
2276 cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2277 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2278 cmd->seid = CPU_TO_LE16(seid);
2280 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2286 * i40e_aq_clear_default_vsi
2287 * @hw: pointer to the hw struct
2289 * @cmd_details: pointer to command details structure or NULL
2291 enum i40e_status_code i40e_aq_clear_default_vsi(struct i40e_hw *hw,
2293 struct i40e_asq_cmd_details *cmd_details)
2295 struct i40e_aq_desc desc;
2296 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2297 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2299 enum i40e_status_code status;
2301 i40e_fill_default_direct_cmd_desc(&desc,
2302 i40e_aqc_opc_set_vsi_promiscuous_modes);
2304 cmd->promiscuous_flags = CPU_TO_LE16(0);
2305 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2306 cmd->seid = CPU_TO_LE16(seid);
2308 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2314 * i40e_aq_set_vsi_unicast_promiscuous
2315 * @hw: pointer to the hw struct
2317 * @set: set unicast promiscuous enable/disable
2318 * @cmd_details: pointer to command details structure or NULL
2319 * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
2321 enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
2323 struct i40e_asq_cmd_details *cmd_details,
2324 bool rx_only_promisc)
2326 struct i40e_aq_desc desc;
2327 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2328 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2329 enum i40e_status_code status;
2332 i40e_fill_default_direct_cmd_desc(&desc,
2333 i40e_aqc_opc_set_vsi_promiscuous_modes);
2336 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2337 if (rx_only_promisc &&
2338 (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) ||
2339 (hw->aq.api_maj_ver > 1)))
2340 flags |= I40E_AQC_SET_VSI_PROMISC_TX;
2343 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2345 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2346 if (((hw->aq.api_maj_ver >= 1) && (hw->aq.api_min_ver >= 5)) ||
2347 (hw->aq.api_maj_ver > 1))
2348 cmd->valid_flags |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_TX);
2350 cmd->seid = CPU_TO_LE16(seid);
2351 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2357 * i40e_aq_set_vsi_multicast_promiscuous
2358 * @hw: pointer to the hw struct
2360 * @set: set multicast promiscuous enable/disable
2361 * @cmd_details: pointer to command details structure or NULL
2363 enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
2364 u16 seid, bool set, 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_MULTICAST;
2378 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2380 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2382 cmd->seid = CPU_TO_LE16(seid);
2383 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2389 * i40e_aq_set_vsi_full_promiscuous
2390 * @hw: pointer to the hw struct
2392 * @set: set promiscuous enable/disable
2393 * @cmd_details: pointer to command details structure or NULL
2395 enum i40e_status_code i40e_aq_set_vsi_full_promiscuous(struct i40e_hw *hw,
2397 struct i40e_asq_cmd_details *cmd_details)
2399 struct i40e_aq_desc desc;
2400 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2401 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2402 enum i40e_status_code status;
2405 i40e_fill_default_direct_cmd_desc(&desc,
2406 i40e_aqc_opc_set_vsi_promiscuous_modes);
2409 flags = I40E_AQC_SET_VSI_PROMISC_UNICAST |
2410 I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2411 I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2413 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2415 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST |
2416 I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2417 I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2419 cmd->seid = CPU_TO_LE16(seid);
2420 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2426 * i40e_aq_set_vsi_mc_promisc_on_vlan
2427 * @hw: pointer to the hw struct
2429 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2430 * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
2431 * @cmd_details: pointer to command details structure or NULL
2433 enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
2434 u16 seid, bool enable, u16 vid,
2435 struct i40e_asq_cmd_details *cmd_details)
2437 struct i40e_aq_desc desc;
2438 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2439 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2440 enum i40e_status_code status;
2443 i40e_fill_default_direct_cmd_desc(&desc,
2444 i40e_aqc_opc_set_vsi_promiscuous_modes);
2447 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2449 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2450 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2451 cmd->seid = CPU_TO_LE16(seid);
2452 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2454 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2460 * i40e_aq_set_vsi_uc_promisc_on_vlan
2461 * @hw: pointer to the hw struct
2463 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2464 * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
2465 * @cmd_details: pointer to command details structure or NULL
2467 enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
2468 u16 seid, bool enable, u16 vid,
2469 struct i40e_asq_cmd_details *cmd_details)
2471 struct i40e_aq_desc desc;
2472 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2473 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2474 enum i40e_status_code status;
2477 i40e_fill_default_direct_cmd_desc(&desc,
2478 i40e_aqc_opc_set_vsi_promiscuous_modes);
2481 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2483 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2484 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2485 cmd->seid = CPU_TO_LE16(seid);
2486 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2488 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2494 * i40e_aq_set_vsi_bc_promisc_on_vlan
2495 * @hw: pointer to the hw struct
2497 * @enable: set broadcast promiscuous enable/disable for a given VLAN
2498 * @vid: The VLAN tag filter - capture any broadcast packet with this VLAN tag
2499 * @cmd_details: pointer to command details structure or NULL
2501 enum i40e_status_code i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw *hw,
2502 u16 seid, bool enable, u16 vid,
2503 struct i40e_asq_cmd_details *cmd_details)
2505 struct i40e_aq_desc desc;
2506 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2507 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2508 enum i40e_status_code status;
2511 i40e_fill_default_direct_cmd_desc(&desc,
2512 i40e_aqc_opc_set_vsi_promiscuous_modes);
2515 flags |= I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2517 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2518 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2519 cmd->seid = CPU_TO_LE16(seid);
2520 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2522 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2528 * i40e_aq_set_vsi_broadcast
2529 * @hw: pointer to the hw struct
2531 * @set_filter: true to set filter, false to clear filter
2532 * @cmd_details: pointer to command details structure or NULL
2534 * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
2536 enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
2537 u16 seid, bool set_filter,
2538 struct i40e_asq_cmd_details *cmd_details)
2540 struct i40e_aq_desc desc;
2541 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2542 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2543 enum i40e_status_code status;
2545 i40e_fill_default_direct_cmd_desc(&desc,
2546 i40e_aqc_opc_set_vsi_promiscuous_modes);
2549 cmd->promiscuous_flags
2550 |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2552 cmd->promiscuous_flags
2553 &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2555 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2556 cmd->seid = CPU_TO_LE16(seid);
2557 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2563 * i40e_aq_set_vsi_vlan_promisc - control the VLAN promiscuous setting
2564 * @hw: pointer to the hw struct
2566 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2567 * @cmd_details: pointer to command details structure or NULL
2569 enum i40e_status_code i40e_aq_set_vsi_vlan_promisc(struct i40e_hw *hw,
2570 u16 seid, bool enable,
2571 struct i40e_asq_cmd_details *cmd_details)
2573 struct i40e_aq_desc desc;
2574 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2575 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2576 enum i40e_status_code status;
2579 i40e_fill_default_direct_cmd_desc(&desc,
2580 i40e_aqc_opc_set_vsi_promiscuous_modes);
2582 flags |= I40E_AQC_SET_VSI_PROMISC_VLAN;
2584 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2585 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_VLAN);
2586 cmd->seid = CPU_TO_LE16(seid);
2588 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2594 * i40e_get_vsi_params - get VSI configuration info
2595 * @hw: pointer to the hw struct
2596 * @vsi_ctx: pointer to a vsi context struct
2597 * @cmd_details: pointer to command details structure or NULL
2599 enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
2600 struct i40e_vsi_context *vsi_ctx,
2601 struct i40e_asq_cmd_details *cmd_details)
2603 struct i40e_aq_desc desc;
2604 struct i40e_aqc_add_get_update_vsi *cmd =
2605 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2606 struct i40e_aqc_add_get_update_vsi_completion *resp =
2607 (struct i40e_aqc_add_get_update_vsi_completion *)
2609 enum i40e_status_code status;
2611 UNREFERENCED_1PARAMETER(cmd_details);
2612 i40e_fill_default_direct_cmd_desc(&desc,
2613 i40e_aqc_opc_get_vsi_parameters);
2615 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2617 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2619 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2620 sizeof(vsi_ctx->info), NULL);
2622 if (status != I40E_SUCCESS)
2623 goto aq_get_vsi_params_exit;
2625 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2626 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2627 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2628 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2630 aq_get_vsi_params_exit:
2635 * i40e_aq_update_vsi_params
2636 * @hw: pointer to the hw struct
2637 * @vsi_ctx: pointer to a vsi context struct
2638 * @cmd_details: pointer to command details structure or NULL
2640 * Update a VSI context.
2642 enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
2643 struct i40e_vsi_context *vsi_ctx,
2644 struct i40e_asq_cmd_details *cmd_details)
2646 struct i40e_aq_desc desc;
2647 struct i40e_aqc_add_get_update_vsi *cmd =
2648 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2649 struct i40e_aqc_add_get_update_vsi_completion *resp =
2650 (struct i40e_aqc_add_get_update_vsi_completion *)
2652 enum i40e_status_code status;
2654 i40e_fill_default_direct_cmd_desc(&desc,
2655 i40e_aqc_opc_update_vsi_parameters);
2656 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2658 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2660 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2661 sizeof(vsi_ctx->info), cmd_details);
2663 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2664 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2670 * i40e_aq_get_switch_config
2671 * @hw: pointer to the hardware structure
2672 * @buf: pointer to the result buffer
2673 * @buf_size: length of input buffer
2674 * @start_seid: seid to start for the report, 0 == beginning
2675 * @cmd_details: pointer to command details structure or NULL
2677 * Fill the buf with switch configuration returned from AdminQ command
2679 enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
2680 struct i40e_aqc_get_switch_config_resp *buf,
2681 u16 buf_size, u16 *start_seid,
2682 struct i40e_asq_cmd_details *cmd_details)
2684 struct i40e_aq_desc desc;
2685 struct i40e_aqc_switch_seid *scfg =
2686 (struct i40e_aqc_switch_seid *)&desc.params.raw;
2687 enum i40e_status_code status;
2689 i40e_fill_default_direct_cmd_desc(&desc,
2690 i40e_aqc_opc_get_switch_config);
2691 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2692 if (buf_size > I40E_AQ_LARGE_BUF)
2693 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2694 scfg->seid = CPU_TO_LE16(*start_seid);
2696 status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
2697 *start_seid = LE16_TO_CPU(scfg->seid);
2703 * i40e_aq_set_switch_config
2704 * @hw: pointer to the hardware structure
2705 * @flags: bit flag values to set
2706 * @valid_flags: which bit flags to set
2707 * @cmd_details: pointer to command details structure or NULL
2709 * Set switch configuration bits
2711 enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
2712 u16 flags, u16 valid_flags,
2713 struct i40e_asq_cmd_details *cmd_details)
2715 struct i40e_aq_desc desc;
2716 struct i40e_aqc_set_switch_config *scfg =
2717 (struct i40e_aqc_set_switch_config *)&desc.params.raw;
2718 enum i40e_status_code status;
2720 i40e_fill_default_direct_cmd_desc(&desc,
2721 i40e_aqc_opc_set_switch_config);
2722 scfg->flags = CPU_TO_LE16(flags);
2723 scfg->valid_flags = CPU_TO_LE16(valid_flags);
2724 if (hw->flags & I40E_HW_FLAG_802_1AD_CAPABLE) {
2725 scfg->switch_tag = CPU_TO_LE16(hw->switch_tag);
2726 scfg->first_tag = CPU_TO_LE16(hw->first_tag);
2727 scfg->second_tag = CPU_TO_LE16(hw->second_tag);
2729 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2735 * i40e_aq_get_firmware_version
2736 * @hw: pointer to the hw struct
2737 * @fw_major_version: firmware major version
2738 * @fw_minor_version: firmware minor version
2739 * @fw_build: firmware build number
2740 * @api_major_version: major queue version
2741 * @api_minor_version: minor queue version
2742 * @cmd_details: pointer to command details structure or NULL
2744 * Get the firmware version from the admin queue commands
2746 enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
2747 u16 *fw_major_version, u16 *fw_minor_version,
2749 u16 *api_major_version, u16 *api_minor_version,
2750 struct i40e_asq_cmd_details *cmd_details)
2752 struct i40e_aq_desc desc;
2753 struct i40e_aqc_get_version *resp =
2754 (struct i40e_aqc_get_version *)&desc.params.raw;
2755 enum i40e_status_code status;
2757 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
2759 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2761 if (status == I40E_SUCCESS) {
2762 if (fw_major_version != NULL)
2763 *fw_major_version = LE16_TO_CPU(resp->fw_major);
2764 if (fw_minor_version != NULL)
2765 *fw_minor_version = LE16_TO_CPU(resp->fw_minor);
2766 if (fw_build != NULL)
2767 *fw_build = LE32_TO_CPU(resp->fw_build);
2768 if (api_major_version != NULL)
2769 *api_major_version = LE16_TO_CPU(resp->api_major);
2770 if (api_minor_version != NULL)
2771 *api_minor_version = LE16_TO_CPU(resp->api_minor);
2773 /* A workaround to fix the API version in SW */
2774 if (api_major_version && api_minor_version &&
2775 fw_major_version && fw_minor_version &&
2776 ((*api_major_version == 1) && (*api_minor_version == 1)) &&
2777 (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
2778 (*fw_major_version > 4)))
2779 *api_minor_version = 2;
2786 * i40e_aq_send_driver_version
2787 * @hw: pointer to the hw struct
2788 * @dv: driver's major, minor version
2789 * @cmd_details: pointer to command details structure or NULL
2791 * Send the driver version to the firmware
2793 enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
2794 struct i40e_driver_version *dv,
2795 struct i40e_asq_cmd_details *cmd_details)
2797 struct i40e_aq_desc desc;
2798 struct i40e_aqc_driver_version *cmd =
2799 (struct i40e_aqc_driver_version *)&desc.params.raw;
2800 enum i40e_status_code status;
2804 return I40E_ERR_PARAM;
2806 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
2808 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
2809 cmd->driver_major_ver = dv->major_version;
2810 cmd->driver_minor_ver = dv->minor_version;
2811 cmd->driver_build_ver = dv->build_version;
2812 cmd->driver_subbuild_ver = dv->subbuild_version;
2815 while (len < sizeof(dv->driver_string) &&
2816 (dv->driver_string[len] < 0x80) &&
2817 dv->driver_string[len])
2819 status = i40e_asq_send_command(hw, &desc, dv->driver_string,
2826 * i40e_get_link_status - get status of the HW network link
2827 * @hw: pointer to the hw struct
2828 * @link_up: pointer to bool (true/false = linkup/linkdown)
2830 * Variable link_up true if link is up, false if link is down.
2831 * The variable link_up is invalid if returned value of status != I40E_SUCCESS
2833 * Side effect: LinkStatusEvent reporting becomes enabled
2835 enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
2837 enum i40e_status_code status = I40E_SUCCESS;
2839 if (hw->phy.get_link_info) {
2840 status = i40e_update_link_info(hw);
2842 if (status != I40E_SUCCESS)
2843 i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
2847 *link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
2853 * i40e_updatelink_status - update status of the HW network link
2854 * @hw: pointer to the hw struct
2856 enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
2858 struct i40e_aq_get_phy_abilities_resp abilities;
2859 enum i40e_status_code status = I40E_SUCCESS;
2861 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2865 /* extra checking needed to ensure link info to user is timely */
2866 if ((hw->phy.link_info.link_info & I40E_AQ_MEDIA_AVAILABLE) &&
2867 ((hw->phy.link_info.link_info & I40E_AQ_LINK_UP) ||
2868 !(hw->phy.link_info_old.link_info & I40E_AQ_LINK_UP))) {
2869 status = i40e_aq_get_phy_capabilities(hw, false, false,
2874 hw->phy.link_info.req_fec_info =
2875 abilities.fec_cfg_curr_mod_ext_info &
2876 (I40E_AQ_REQUEST_FEC_KR | I40E_AQ_REQUEST_FEC_RS);
2878 i40e_memcpy(hw->phy.link_info.module_type, &abilities.module_type,
2879 sizeof(hw->phy.link_info.module_type), I40E_NONDMA_TO_NONDMA);
2886 * i40e_get_link_speed
2887 * @hw: pointer to the hw struct
2889 * Returns the link speed of the adapter.
2891 enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
2893 enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
2894 enum i40e_status_code status = I40E_SUCCESS;
2896 if (hw->phy.get_link_info) {
2897 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2899 if (status != I40E_SUCCESS)
2900 goto i40e_link_speed_exit;
2903 speed = hw->phy.link_info.link_speed;
2905 i40e_link_speed_exit:
2910 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2911 * @hw: pointer to the hw struct
2912 * @uplink_seid: the MAC or other gizmo SEID
2913 * @downlink_seid: the VSI SEID
2914 * @enabled_tc: bitmap of TCs to be enabled
2915 * @default_port: true for default port VSI, false for control port
2916 * @veb_seid: pointer to where to put the resulting VEB SEID
2917 * @enable_stats: true to turn on VEB stats
2918 * @cmd_details: pointer to command details structure or NULL
2920 * This asks the FW to add a VEB between the uplink and downlink
2921 * elements. If the uplink SEID is 0, this will be a floating VEB.
2923 enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
2924 u16 downlink_seid, u8 enabled_tc,
2925 bool default_port, u16 *veb_seid,
2927 struct i40e_asq_cmd_details *cmd_details)
2929 struct i40e_aq_desc desc;
2930 struct i40e_aqc_add_veb *cmd =
2931 (struct i40e_aqc_add_veb *)&desc.params.raw;
2932 struct i40e_aqc_add_veb_completion *resp =
2933 (struct i40e_aqc_add_veb_completion *)&desc.params.raw;
2934 enum i40e_status_code status;
2937 /* SEIDs need to either both be set or both be 0 for floating VEB */
2938 if (!!uplink_seid != !!downlink_seid)
2939 return I40E_ERR_PARAM;
2941 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
2943 cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
2944 cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
2945 cmd->enable_tcs = enabled_tc;
2947 veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
2949 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
2951 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
2953 /* reverse logic here: set the bitflag to disable the stats */
2955 veb_flags |= I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS;
2957 cmd->veb_flags = CPU_TO_LE16(veb_flags);
2959 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2961 if (!status && veb_seid)
2962 *veb_seid = LE16_TO_CPU(resp->veb_seid);
2968 * i40e_aq_get_veb_parameters - Retrieve VEB parameters
2969 * @hw: pointer to the hw struct
2970 * @veb_seid: the SEID of the VEB to query
2971 * @switch_id: the uplink switch id
2972 * @floating: set to true if the VEB is floating
2973 * @statistic_index: index of the stats counter block for this VEB
2974 * @vebs_used: number of VEB's used by function
2975 * @vebs_free: total VEB's not reserved by any function
2976 * @cmd_details: pointer to command details structure or NULL
2978 * This retrieves the parameters for a particular VEB, specified by
2979 * uplink_seid, and returns them to the caller.
2981 enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
2982 u16 veb_seid, u16 *switch_id,
2983 bool *floating, u16 *statistic_index,
2984 u16 *vebs_used, u16 *vebs_free,
2985 struct i40e_asq_cmd_details *cmd_details)
2987 struct i40e_aq_desc desc;
2988 struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
2989 (struct i40e_aqc_get_veb_parameters_completion *)
2991 enum i40e_status_code status;
2994 return I40E_ERR_PARAM;
2996 i40e_fill_default_direct_cmd_desc(&desc,
2997 i40e_aqc_opc_get_veb_parameters);
2998 cmd_resp->seid = CPU_TO_LE16(veb_seid);
3000 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3005 *switch_id = LE16_TO_CPU(cmd_resp->switch_id);
3006 if (statistic_index)
3007 *statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
3009 *vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
3011 *vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
3013 u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
3015 if (flags & I40E_AQC_ADD_VEB_FLOATING)
3026 * i40e_aq_add_macvlan
3027 * @hw: pointer to the hw struct
3028 * @seid: VSI for the mac address
3029 * @mv_list: list of macvlans to be added
3030 * @count: length of the list
3031 * @cmd_details: pointer to command details structure or NULL
3033 * Add MAC/VLAN addresses to the HW filtering
3035 enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
3036 struct i40e_aqc_add_macvlan_element_data *mv_list,
3037 u16 count, struct i40e_asq_cmd_details *cmd_details)
3039 struct i40e_aq_desc desc;
3040 struct i40e_aqc_macvlan *cmd =
3041 (struct i40e_aqc_macvlan *)&desc.params.raw;
3042 enum i40e_status_code status;
3046 if (count == 0 || !mv_list || !hw)
3047 return I40E_ERR_PARAM;
3049 buf_size = count * sizeof(*mv_list);
3051 /* prep the rest of the request */
3052 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
3053 cmd->num_addresses = CPU_TO_LE16(count);
3054 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
3058 for (i = 0; i < count; i++)
3059 if (I40E_IS_MULTICAST(mv_list[i].mac_addr))
3061 CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);
3063 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3064 if (buf_size > I40E_AQ_LARGE_BUF)
3065 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3067 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
3074 * i40e_aq_remove_macvlan
3075 * @hw: pointer to the hw struct
3076 * @seid: VSI for the mac address
3077 * @mv_list: list of macvlans to be removed
3078 * @count: length of the list
3079 * @cmd_details: pointer to command details structure or NULL
3081 * Remove MAC/VLAN addresses from the HW filtering
3083 enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
3084 struct i40e_aqc_remove_macvlan_element_data *mv_list,
3085 u16 count, struct i40e_asq_cmd_details *cmd_details)
3087 struct i40e_aq_desc desc;
3088 struct i40e_aqc_macvlan *cmd =
3089 (struct i40e_aqc_macvlan *)&desc.params.raw;
3090 enum i40e_status_code status;
3093 if (count == 0 || !mv_list || !hw)
3094 return I40E_ERR_PARAM;
3096 buf_size = count * sizeof(*mv_list);
3098 /* prep the rest of the request */
3099 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
3100 cmd->num_addresses = CPU_TO_LE16(count);
3101 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
3105 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3106 if (buf_size > I40E_AQ_LARGE_BUF)
3107 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3109 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
3116 * i40e_mirrorrule_op - Internal helper function to add/delete mirror rule
3117 * @hw: pointer to the hw struct
3118 * @opcode: AQ opcode for add or delete mirror rule
3119 * @sw_seid: Switch SEID (to which rule refers)
3120 * @rule_type: Rule Type (ingress/egress/VLAN)
3121 * @id: Destination VSI SEID or Rule ID
3122 * @count: length of the list
3123 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3124 * @cmd_details: pointer to command details structure or NULL
3125 * @rule_id: Rule ID returned from FW
3126 * @rule_used: Number of rules used in internal switch
3127 * @rule_free: Number of rules free in internal switch
3129 * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
3130 * VEBs/VEPA elements only
3132 static enum i40e_status_code i40e_mirrorrule_op(struct i40e_hw *hw,
3133 u16 opcode, u16 sw_seid, u16 rule_type, u16 id,
3134 u16 count, __le16 *mr_list,
3135 struct i40e_asq_cmd_details *cmd_details,
3136 u16 *rule_id, u16 *rules_used, u16 *rules_free)
3138 struct i40e_aq_desc desc;
3139 struct i40e_aqc_add_delete_mirror_rule *cmd =
3140 (struct i40e_aqc_add_delete_mirror_rule *)&desc.params.raw;
3141 struct i40e_aqc_add_delete_mirror_rule_completion *resp =
3142 (struct i40e_aqc_add_delete_mirror_rule_completion *)&desc.params.raw;
3143 enum i40e_status_code status;
3146 buf_size = count * sizeof(*mr_list);
3148 /* prep the rest of the request */
3149 i40e_fill_default_direct_cmd_desc(&desc, opcode);
3150 cmd->seid = CPU_TO_LE16(sw_seid);
3151 cmd->rule_type = CPU_TO_LE16(rule_type &
3152 I40E_AQC_MIRROR_RULE_TYPE_MASK);
3153 cmd->num_entries = CPU_TO_LE16(count);
3154 /* Dest VSI for add, rule_id for delete */
3155 cmd->destination = CPU_TO_LE16(id);
3157 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3159 if (buf_size > I40E_AQ_LARGE_BUF)
3160 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3163 status = i40e_asq_send_command(hw, &desc, mr_list, buf_size,
3165 if (status == I40E_SUCCESS ||
3166 hw->aq.asq_last_status == I40E_AQ_RC_ENOSPC) {
3168 *rule_id = LE16_TO_CPU(resp->rule_id);
3170 *rules_used = LE16_TO_CPU(resp->mirror_rules_used);
3172 *rules_free = LE16_TO_CPU(resp->mirror_rules_free);
3178 * i40e_aq_add_mirrorrule - add a mirror rule
3179 * @hw: pointer to the hw struct
3180 * @sw_seid: Switch SEID (to which rule refers)
3181 * @rule_type: Rule Type (ingress/egress/VLAN)
3182 * @dest_vsi: SEID of VSI to which packets will be mirrored
3183 * @count: length of the list
3184 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3185 * @cmd_details: pointer to command details structure or NULL
3186 * @rule_id: Rule ID returned from FW
3187 * @rule_used: Number of rules used in internal switch
3188 * @rule_free: Number of rules free in internal switch
3190 * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
3192 enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3193 u16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,
3194 struct i40e_asq_cmd_details *cmd_details,
3195 u16 *rule_id, u16 *rules_used, u16 *rules_free)
3197 if (!(rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS ||
3198 rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS)) {
3199 if (count == 0 || !mr_list)
3200 return I40E_ERR_PARAM;
3203 return i40e_mirrorrule_op(hw, i40e_aqc_opc_add_mirror_rule, sw_seid,
3204 rule_type, dest_vsi, count, mr_list,
3205 cmd_details, rule_id, rules_used, rules_free);
3209 * i40e_aq_delete_mirrorrule - delete a mirror rule
3210 * @hw: pointer to the hw struct
3211 * @sw_seid: Switch SEID (to which rule refers)
3212 * @rule_type: Rule Type (ingress/egress/VLAN)
3213 * @count: length of the list
3214 * @rule_id: Rule ID that is returned in the receive desc as part of
3216 * @mr_list: list of mirrored VLAN IDs to be removed
3217 * @cmd_details: pointer to command details structure or NULL
3218 * @rule_used: Number of rules used in internal switch
3219 * @rule_free: Number of rules free in internal switch
3221 * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
3223 enum i40e_status_code i40e_aq_delete_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3224 u16 rule_type, u16 rule_id, u16 count, __le16 *mr_list,
3225 struct i40e_asq_cmd_details *cmd_details,
3226 u16 *rules_used, u16 *rules_free)
3228 /* Rule ID has to be valid except rule_type: INGRESS VLAN mirroring */
3229 if (rule_type == I40E_AQC_MIRROR_RULE_TYPE_VLAN) {
3230 /* count and mr_list shall be valid for rule_type INGRESS VLAN
3231 * mirroring. For other rule_type, count and rule_type should
3234 if (count == 0 || !mr_list)
3235 return I40E_ERR_PARAM;
3238 return i40e_mirrorrule_op(hw, i40e_aqc_opc_delete_mirror_rule, sw_seid,
3239 rule_type, rule_id, count, mr_list,
3240 cmd_details, NULL, rules_used, rules_free);
3244 * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
3245 * @hw: pointer to the hw struct
3246 * @seid: VSI for the vlan filters
3247 * @v_list: list of vlan filters to be added
3248 * @count: length of the list
3249 * @cmd_details: pointer to command details structure or NULL
3251 enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
3252 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3253 u8 count, struct i40e_asq_cmd_details *cmd_details)
3255 struct i40e_aq_desc desc;
3256 struct i40e_aqc_macvlan *cmd =
3257 (struct i40e_aqc_macvlan *)&desc.params.raw;
3258 enum i40e_status_code status;
3261 if (count == 0 || !v_list || !hw)
3262 return I40E_ERR_PARAM;
3264 buf_size = count * sizeof(*v_list);
3266 /* prep the rest of the request */
3267 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
3268 cmd->num_addresses = CPU_TO_LE16(count);
3269 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3273 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3274 if (buf_size > I40E_AQ_LARGE_BUF)
3275 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3277 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3284 * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
3285 * @hw: pointer to the hw struct
3286 * @seid: VSI for the vlan filters
3287 * @v_list: list of macvlans to be removed
3288 * @count: length of the list
3289 * @cmd_details: pointer to command details structure or NULL
3291 enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
3292 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3293 u8 count, struct i40e_asq_cmd_details *cmd_details)
3295 struct i40e_aq_desc desc;
3296 struct i40e_aqc_macvlan *cmd =
3297 (struct i40e_aqc_macvlan *)&desc.params.raw;
3298 enum i40e_status_code status;
3301 if (count == 0 || !v_list || !hw)
3302 return I40E_ERR_PARAM;
3304 buf_size = count * sizeof(*v_list);
3306 /* prep the rest of the request */
3307 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
3308 cmd->num_addresses = CPU_TO_LE16(count);
3309 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3313 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3314 if (buf_size > I40E_AQ_LARGE_BUF)
3315 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3317 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3324 * i40e_aq_send_msg_to_vf
3325 * @hw: pointer to the hardware structure
3326 * @vfid: vf id to send msg
3327 * @v_opcode: opcodes for VF-PF communication
3328 * @v_retval: return error code
3329 * @msg: pointer to the msg buffer
3330 * @msglen: msg length
3331 * @cmd_details: pointer to command details
3335 enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
3336 u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
3337 struct i40e_asq_cmd_details *cmd_details)
3339 struct i40e_aq_desc desc;
3340 struct i40e_aqc_pf_vf_message *cmd =
3341 (struct i40e_aqc_pf_vf_message *)&desc.params.raw;
3342 enum i40e_status_code status;
3344 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
3345 cmd->id = CPU_TO_LE32(vfid);
3346 desc.cookie_high = CPU_TO_LE32(v_opcode);
3347 desc.cookie_low = CPU_TO_LE32(v_retval);
3348 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
3350 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3352 if (msglen > I40E_AQ_LARGE_BUF)
3353 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3354 desc.datalen = CPU_TO_LE16(msglen);
3356 status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
3362 * i40e_aq_debug_read_register
3363 * @hw: pointer to the hw struct
3364 * @reg_addr: register address
3365 * @reg_val: register value
3366 * @cmd_details: pointer to command details structure or NULL
3368 * Read the register using the admin queue commands
3370 enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
3371 u32 reg_addr, u64 *reg_val,
3372 struct i40e_asq_cmd_details *cmd_details)
3374 struct i40e_aq_desc desc;
3375 struct i40e_aqc_debug_reg_read_write *cmd_resp =
3376 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3377 enum i40e_status_code status;
3379 if (reg_val == NULL)
3380 return I40E_ERR_PARAM;
3382 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_read_reg);
3384 cmd_resp->address = CPU_TO_LE32(reg_addr);
3386 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3388 if (status == I40E_SUCCESS) {
3389 *reg_val = ((u64)LE32_TO_CPU(cmd_resp->value_high) << 32) |
3390 (u64)LE32_TO_CPU(cmd_resp->value_low);
3397 * i40e_aq_debug_write_register
3398 * @hw: pointer to the hw struct
3399 * @reg_addr: register address
3400 * @reg_val: register value
3401 * @cmd_details: pointer to command details structure or NULL
3403 * Write to a register using the admin queue commands
3405 enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
3406 u32 reg_addr, u64 reg_val,
3407 struct i40e_asq_cmd_details *cmd_details)
3409 struct i40e_aq_desc desc;
3410 struct i40e_aqc_debug_reg_read_write *cmd =
3411 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3412 enum i40e_status_code status;
3414 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
3416 cmd->address = CPU_TO_LE32(reg_addr);
3417 cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
3418 cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
3420 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3426 * i40e_aq_request_resource
3427 * @hw: pointer to the hw struct
3428 * @resource: resource id
3429 * @access: access type
3430 * @sdp_number: resource number
3431 * @timeout: the maximum time in ms that the driver may hold the resource
3432 * @cmd_details: pointer to command details structure or NULL
3434 * requests common resource using the admin queue commands
3436 enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
3437 enum i40e_aq_resources_ids resource,
3438 enum i40e_aq_resource_access_type access,
3439 u8 sdp_number, u64 *timeout,
3440 struct i40e_asq_cmd_details *cmd_details)
3442 struct i40e_aq_desc desc;
3443 struct i40e_aqc_request_resource *cmd_resp =
3444 (struct i40e_aqc_request_resource *)&desc.params.raw;
3445 enum i40e_status_code status;
3447 DEBUGFUNC("i40e_aq_request_resource");
3449 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
3451 cmd_resp->resource_id = CPU_TO_LE16(resource);
3452 cmd_resp->access_type = CPU_TO_LE16(access);
3453 cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
3455 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3456 /* The completion specifies the maximum time in ms that the driver
3457 * may hold the resource in the Timeout field.
3458 * If the resource is held by someone else, the command completes with
3459 * busy return value and the timeout field indicates the maximum time
3460 * the current owner of the resource has to free it.
3462 if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
3463 *timeout = LE32_TO_CPU(cmd_resp->timeout);
3469 * i40e_aq_release_resource
3470 * @hw: pointer to the hw struct
3471 * @resource: resource id
3472 * @sdp_number: resource number
3473 * @cmd_details: pointer to command details structure or NULL
3475 * release common resource using the admin queue commands
3477 enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
3478 enum i40e_aq_resources_ids resource,
3480 struct i40e_asq_cmd_details *cmd_details)
3482 struct i40e_aq_desc desc;
3483 struct i40e_aqc_request_resource *cmd =
3484 (struct i40e_aqc_request_resource *)&desc.params.raw;
3485 enum i40e_status_code status;
3487 DEBUGFUNC("i40e_aq_release_resource");
3489 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
3491 cmd->resource_id = CPU_TO_LE16(resource);
3492 cmd->resource_number = CPU_TO_LE32(sdp_number);
3494 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3501 * @hw: pointer to the hw struct
3502 * @module_pointer: module pointer location in words from the NVM beginning
3503 * @offset: byte offset from the module beginning
3504 * @length: length of the section to be read (in bytes from the offset)
3505 * @data: command buffer (size [bytes] = length)
3506 * @last_command: tells if this is the last command in a series
3507 * @cmd_details: pointer to command details structure or NULL
3509 * Read the NVM using the admin queue commands
3511 enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
3512 u32 offset, u16 length, void *data,
3514 struct i40e_asq_cmd_details *cmd_details)
3516 struct i40e_aq_desc desc;
3517 struct i40e_aqc_nvm_update *cmd =
3518 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3519 enum i40e_status_code status;
3521 DEBUGFUNC("i40e_aq_read_nvm");
3523 /* In offset the highest byte must be zeroed. */
3524 if (offset & 0xFF000000) {
3525 status = I40E_ERR_PARAM;
3526 goto i40e_aq_read_nvm_exit;
3529 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
3531 /* If this is the last command in a series, set the proper flag. */
3533 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3534 cmd->module_pointer = module_pointer;
3535 cmd->offset = CPU_TO_LE32(offset);
3536 cmd->length = CPU_TO_LE16(length);
3538 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3539 if (length > I40E_AQ_LARGE_BUF)
3540 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3542 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3544 i40e_aq_read_nvm_exit:
3549 * i40e_aq_read_nvm_config - read an nvm config block
3550 * @hw: pointer to the hw struct
3551 * @cmd_flags: NVM access admin command bits
3552 * @field_id: field or feature id
3553 * @data: buffer for result
3554 * @buf_size: buffer size
3555 * @element_count: pointer to count of elements read by FW
3556 * @cmd_details: pointer to command details structure or NULL
3558 enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
3559 u8 cmd_flags, u32 field_id, void *data,
3560 u16 buf_size, u16 *element_count,
3561 struct i40e_asq_cmd_details *cmd_details)
3563 struct i40e_aq_desc desc;
3564 struct i40e_aqc_nvm_config_read *cmd =
3565 (struct i40e_aqc_nvm_config_read *)&desc.params.raw;
3566 enum i40e_status_code status;
3568 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_read);
3569 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF));
3570 if (buf_size > I40E_AQ_LARGE_BUF)
3571 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3573 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3574 cmd->element_id = CPU_TO_LE16((u16)(0xffff & field_id));
3575 if (cmd_flags & I40E_AQ_ANVM_FEATURE_OR_IMMEDIATE_MASK)
3576 cmd->element_id_msw = CPU_TO_LE16((u16)(field_id >> 16));
3578 cmd->element_id_msw = 0;
3580 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3582 if (!status && element_count)
3583 *element_count = LE16_TO_CPU(cmd->element_count);
3589 * i40e_aq_write_nvm_config - write an nvm config block
3590 * @hw: pointer to the hw struct
3591 * @cmd_flags: NVM access admin command bits
3592 * @data: buffer for result
3593 * @buf_size: buffer size
3594 * @element_count: count of elements to be written
3595 * @cmd_details: pointer to command details structure or NULL
3597 enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
3598 u8 cmd_flags, void *data, u16 buf_size,
3600 struct i40e_asq_cmd_details *cmd_details)
3602 struct i40e_aq_desc desc;
3603 struct i40e_aqc_nvm_config_write *cmd =
3604 (struct i40e_aqc_nvm_config_write *)&desc.params.raw;
3605 enum i40e_status_code status;
3607 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_write);
3608 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3609 if (buf_size > I40E_AQ_LARGE_BUF)
3610 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3612 cmd->element_count = CPU_TO_LE16(element_count);
3613 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3614 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3620 * i40e_aq_oem_post_update - triggers an OEM specific flow after update
3621 * @hw: pointer to the hw struct
3622 * @cmd_details: pointer to command details structure or NULL
3624 enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
3625 void *buff, u16 buff_size,
3626 struct i40e_asq_cmd_details *cmd_details)
3628 struct i40e_aq_desc desc;
3629 enum i40e_status_code status;
3631 UNREFERENCED_2PARAMETER(buff, buff_size);
3633 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_oem_post_update);
3634 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3635 if (status && LE16_TO_CPU(desc.retval) == I40E_AQ_RC_ESRCH)
3636 status = I40E_ERR_NOT_IMPLEMENTED;
3643 * @hw: pointer to the hw struct
3644 * @module_pointer: module pointer location in words from the NVM beginning
3645 * @offset: offset in the module (expressed in 4 KB from module's beginning)
3646 * @length: length of the section to be erased (expressed in 4 KB)
3647 * @last_command: tells if this is the last command in a series
3648 * @cmd_details: pointer to command details structure or NULL
3650 * Erase the NVM sector using the admin queue commands
3652 enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
3653 u32 offset, u16 length, bool last_command,
3654 struct i40e_asq_cmd_details *cmd_details)
3656 struct i40e_aq_desc desc;
3657 struct i40e_aqc_nvm_update *cmd =
3658 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3659 enum i40e_status_code status;
3661 DEBUGFUNC("i40e_aq_erase_nvm");
3663 /* In offset the highest byte must be zeroed. */
3664 if (offset & 0xFF000000) {
3665 status = I40E_ERR_PARAM;
3666 goto i40e_aq_erase_nvm_exit;
3669 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
3671 /* If this is the last command in a series, set the proper flag. */
3673 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3674 cmd->module_pointer = module_pointer;
3675 cmd->offset = CPU_TO_LE32(offset);
3676 cmd->length = CPU_TO_LE16(length);
3678 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3680 i40e_aq_erase_nvm_exit:
3685 * i40e_parse_discover_capabilities
3686 * @hw: pointer to the hw struct
3687 * @buff: pointer to a buffer containing device/function capability records
3688 * @cap_count: number of capability records in the list
3689 * @list_type_opc: type of capabilities list to parse
3691 * Parse the device/function capabilities list.
3693 STATIC void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
3695 enum i40e_admin_queue_opc list_type_opc)
3697 struct i40e_aqc_list_capabilities_element_resp *cap;
3698 u32 valid_functions, num_functions;
3699 u32 number, logical_id, phys_id;
3700 struct i40e_hw_capabilities *p;
3705 cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
3707 if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
3708 p = (struct i40e_hw_capabilities *)&hw->dev_caps;
3709 else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
3710 p = (struct i40e_hw_capabilities *)&hw->func_caps;
3714 for (i = 0; i < cap_count; i++, cap++) {
3715 id = LE16_TO_CPU(cap->id);
3716 number = LE32_TO_CPU(cap->number);
3717 logical_id = LE32_TO_CPU(cap->logical_id);
3718 phys_id = LE32_TO_CPU(cap->phys_id);
3719 major_rev = cap->major_rev;
3722 case I40E_AQ_CAP_ID_SWITCH_MODE:
3723 p->switch_mode = number;
3724 i40e_debug(hw, I40E_DEBUG_INIT,
3725 "HW Capability: Switch mode = %d\n",
3728 case I40E_AQ_CAP_ID_MNG_MODE:
3729 p->management_mode = number;
3730 if (major_rev > 1) {
3731 p->mng_protocols_over_mctp = logical_id;
3732 i40e_debug(hw, I40E_DEBUG_INIT,
3733 "HW Capability: Protocols over MCTP = %d\n",
3734 p->mng_protocols_over_mctp);
3736 p->mng_protocols_over_mctp = 0;
3738 i40e_debug(hw, I40E_DEBUG_INIT,
3739 "HW Capability: Management Mode = %d\n",
3740 p->management_mode);
3742 case I40E_AQ_CAP_ID_NPAR_ACTIVE:
3743 p->npar_enable = number;
3744 i40e_debug(hw, I40E_DEBUG_INIT,
3745 "HW Capability: NPAR enable = %d\n",
3748 case I40E_AQ_CAP_ID_OS2BMC_CAP:
3750 i40e_debug(hw, I40E_DEBUG_INIT,
3751 "HW Capability: OS2BMC = %d\n", p->os2bmc);
3753 case I40E_AQ_CAP_ID_FUNCTIONS_VALID:
3754 p->valid_functions = number;
3755 i40e_debug(hw, I40E_DEBUG_INIT,
3756 "HW Capability: Valid Functions = %d\n",
3757 p->valid_functions);
3759 case I40E_AQ_CAP_ID_SRIOV:
3761 p->sr_iov_1_1 = true;
3762 i40e_debug(hw, I40E_DEBUG_INIT,
3763 "HW Capability: SR-IOV = %d\n",
3766 case I40E_AQ_CAP_ID_VF:
3767 p->num_vfs = number;
3768 p->vf_base_id = logical_id;
3769 i40e_debug(hw, I40E_DEBUG_INIT,
3770 "HW Capability: VF count = %d\n",
3772 i40e_debug(hw, I40E_DEBUG_INIT,
3773 "HW Capability: VF base_id = %d\n",
3776 case I40E_AQ_CAP_ID_VMDQ:
3779 i40e_debug(hw, I40E_DEBUG_INIT,
3780 "HW Capability: VMDQ = %d\n", p->vmdq);
3782 case I40E_AQ_CAP_ID_8021QBG:
3784 p->evb_802_1_qbg = true;
3785 i40e_debug(hw, I40E_DEBUG_INIT,
3786 "HW Capability: 802.1Qbg = %d\n", number);
3788 case I40E_AQ_CAP_ID_8021QBR:
3790 p->evb_802_1_qbh = true;
3791 i40e_debug(hw, I40E_DEBUG_INIT,
3792 "HW Capability: 802.1Qbh = %d\n", number);
3794 case I40E_AQ_CAP_ID_VSI:
3795 p->num_vsis = number;
3796 i40e_debug(hw, I40E_DEBUG_INIT,
3797 "HW Capability: VSI count = %d\n",
3800 case I40E_AQ_CAP_ID_DCB:
3803 p->enabled_tcmap = logical_id;
3806 i40e_debug(hw, I40E_DEBUG_INIT,
3807 "HW Capability: DCB = %d\n", p->dcb);
3808 i40e_debug(hw, I40E_DEBUG_INIT,
3809 "HW Capability: TC Mapping = %d\n",
3811 i40e_debug(hw, I40E_DEBUG_INIT,
3812 "HW Capability: TC Max = %d\n", p->maxtc);
3814 case I40E_AQ_CAP_ID_FCOE:
3817 i40e_debug(hw, I40E_DEBUG_INIT,
3818 "HW Capability: FCOE = %d\n", p->fcoe);
3820 case I40E_AQ_CAP_ID_ISCSI:
3823 i40e_debug(hw, I40E_DEBUG_INIT,
3824 "HW Capability: iSCSI = %d\n", p->iscsi);
3826 case I40E_AQ_CAP_ID_RSS:
3828 p->rss_table_size = number;
3829 p->rss_table_entry_width = logical_id;
3830 i40e_debug(hw, I40E_DEBUG_INIT,
3831 "HW Capability: RSS = %d\n", p->rss);
3832 i40e_debug(hw, I40E_DEBUG_INIT,
3833 "HW Capability: RSS table size = %d\n",
3835 i40e_debug(hw, I40E_DEBUG_INIT,
3836 "HW Capability: RSS table width = %d\n",
3837 p->rss_table_entry_width);
3839 case I40E_AQ_CAP_ID_RXQ:
3840 p->num_rx_qp = number;
3841 p->base_queue = phys_id;
3842 i40e_debug(hw, I40E_DEBUG_INIT,
3843 "HW Capability: Rx QP = %d\n", number);
3844 i40e_debug(hw, I40E_DEBUG_INIT,
3845 "HW Capability: base_queue = %d\n",
3848 case I40E_AQ_CAP_ID_TXQ:
3849 p->num_tx_qp = number;
3850 p->base_queue = phys_id;
3851 i40e_debug(hw, I40E_DEBUG_INIT,
3852 "HW Capability: Tx QP = %d\n", number);
3853 i40e_debug(hw, I40E_DEBUG_INIT,
3854 "HW Capability: base_queue = %d\n",
3857 case I40E_AQ_CAP_ID_MSIX:
3858 p->num_msix_vectors = number;
3859 i40e_debug(hw, I40E_DEBUG_INIT,
3860 "HW Capability: MSIX vector count = %d\n",
3861 p->num_msix_vectors);
3863 case I40E_AQ_CAP_ID_VF_MSIX:
3864 p->num_msix_vectors_vf = number;
3865 i40e_debug(hw, I40E_DEBUG_INIT,
3866 "HW Capability: MSIX VF vector count = %d\n",
3867 p->num_msix_vectors_vf);
3869 case I40E_AQ_CAP_ID_FLEX10:
3870 if (major_rev == 1) {
3872 p->flex10_enable = true;
3873 p->flex10_capable = true;
3876 /* Capability revision >= 2 */
3878 p->flex10_enable = true;
3880 p->flex10_capable = true;
3882 p->flex10_mode = logical_id;
3883 p->flex10_status = phys_id;
3884 i40e_debug(hw, I40E_DEBUG_INIT,
3885 "HW Capability: Flex10 mode = %d\n",
3887 i40e_debug(hw, I40E_DEBUG_INIT,
3888 "HW Capability: Flex10 status = %d\n",
3891 case I40E_AQ_CAP_ID_CEM:
3894 i40e_debug(hw, I40E_DEBUG_INIT,
3895 "HW Capability: CEM = %d\n", p->mgmt_cem);
3897 case I40E_AQ_CAP_ID_IWARP:
3900 i40e_debug(hw, I40E_DEBUG_INIT,
3901 "HW Capability: iWARP = %d\n", p->iwarp);
3903 case I40E_AQ_CAP_ID_LED:
3904 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3905 p->led[phys_id] = true;
3906 i40e_debug(hw, I40E_DEBUG_INIT,
3907 "HW Capability: LED - PIN %d\n", phys_id);
3909 case I40E_AQ_CAP_ID_SDP:
3910 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3911 p->sdp[phys_id] = true;
3912 i40e_debug(hw, I40E_DEBUG_INIT,
3913 "HW Capability: SDP - PIN %d\n", phys_id);
3915 case I40E_AQ_CAP_ID_MDIO:
3917 p->mdio_port_num = phys_id;
3918 p->mdio_port_mode = logical_id;
3920 i40e_debug(hw, I40E_DEBUG_INIT,
3921 "HW Capability: MDIO port number = %d\n",
3923 i40e_debug(hw, I40E_DEBUG_INIT,
3924 "HW Capability: MDIO port mode = %d\n",
3927 case I40E_AQ_CAP_ID_1588:
3929 p->ieee_1588 = true;
3930 i40e_debug(hw, I40E_DEBUG_INIT,
3931 "HW Capability: IEEE 1588 = %d\n",
3934 case I40E_AQ_CAP_ID_FLOW_DIRECTOR:
3936 p->fd_filters_guaranteed = number;
3937 p->fd_filters_best_effort = logical_id;
3938 i40e_debug(hw, I40E_DEBUG_INIT,
3939 "HW Capability: Flow Director = 1\n");
3940 i40e_debug(hw, I40E_DEBUG_INIT,
3941 "HW Capability: Guaranteed FD filters = %d\n",
3942 p->fd_filters_guaranteed);
3944 case I40E_AQ_CAP_ID_WSR_PROT:
3945 p->wr_csr_prot = (u64)number;
3946 p->wr_csr_prot |= (u64)logical_id << 32;
3947 i40e_debug(hw, I40E_DEBUG_INIT,
3948 "HW Capability: wr_csr_prot = 0x%llX\n\n",
3949 (p->wr_csr_prot & 0xffff));
3951 case I40E_AQ_CAP_ID_NVM_MGMT:
3952 if (number & I40E_NVM_MGMT_SEC_REV_DISABLED)
3953 p->sec_rev_disabled = true;
3954 if (number & I40E_NVM_MGMT_UPDATE_DISABLED)
3955 p->update_disabled = true;
3957 case I40E_AQ_CAP_ID_WOL_AND_PROXY:
3958 hw->num_wol_proxy_filters = (u16)number;
3959 hw->wol_proxy_vsi_seid = (u16)logical_id;
3960 p->apm_wol_support = phys_id & I40E_WOL_SUPPORT_MASK;
3961 if (phys_id & I40E_ACPI_PROGRAMMING_METHOD_MASK)
3962 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_AQC_FPK;
3964 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_HW_FVL;
3965 p->proxy_support = (phys_id & I40E_PROXY_SUPPORT_MASK) ? 1 : 0;
3966 i40e_debug(hw, I40E_DEBUG_INIT,
3967 "HW Capability: WOL proxy filters = %d\n",
3968 hw->num_wol_proxy_filters);
3976 i40e_debug(hw, I40E_DEBUG_ALL, "device is FCoE capable\n");
3978 /* Always disable FCoE if compiled without the I40E_FCOE_ENA flag */
3981 /* count the enabled ports (aka the "not disabled" ports) */
3983 for (i = 0; i < 4; i++) {
3984 u32 port_cfg_reg = I40E_PRTGEN_CNF + (4 * i);
3987 /* use AQ read to get the physical register offset instead
3988 * of the port relative offset
3990 i40e_aq_debug_read_register(hw, port_cfg_reg, &port_cfg, NULL);
3991 if (!(port_cfg & I40E_PRTGEN_CNF_PORT_DIS_MASK))
3995 valid_functions = p->valid_functions;
3997 while (valid_functions) {
3998 if (valid_functions & 1)
4000 valid_functions >>= 1;
4003 /* partition id is 1-based, and functions are evenly spread
4004 * across the ports as partitions
4006 if (hw->num_ports != 0) {
4007 hw->partition_id = (hw->pf_id / hw->num_ports) + 1;
4008 hw->num_partitions = num_functions / hw->num_ports;
4011 /* additional HW specific goodies that might
4012 * someday be HW version specific
4014 p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
4018 * i40e_aq_discover_capabilities
4019 * @hw: pointer to the hw struct
4020 * @buff: a virtual buffer to hold the capabilities
4021 * @buff_size: Size of the virtual buffer
4022 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
4023 * @list_type_opc: capabilities type to discover - pass in the command opcode
4024 * @cmd_details: pointer to command details structure or NULL
4026 * Get the device capabilities descriptions from the firmware
4028 enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
4029 void *buff, u16 buff_size, u16 *data_size,
4030 enum i40e_admin_queue_opc list_type_opc,
4031 struct i40e_asq_cmd_details *cmd_details)
4033 struct i40e_aqc_list_capabilites *cmd;
4034 struct i40e_aq_desc desc;
4035 enum i40e_status_code status = I40E_SUCCESS;
4037 cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
4039 if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
4040 list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
4041 status = I40E_ERR_PARAM;
4045 i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
4047 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4048 if (buff_size > I40E_AQ_LARGE_BUF)
4049 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4051 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4052 *data_size = LE16_TO_CPU(desc.datalen);
4057 i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
4065 * i40e_aq_update_nvm
4066 * @hw: pointer to the hw struct
4067 * @module_pointer: module pointer location in words from the NVM beginning
4068 * @offset: byte offset from the module beginning
4069 * @length: length of the section to be written (in bytes from the offset)
4070 * @data: command buffer (size [bytes] = length)
4071 * @last_command: tells if this is the last command in a series
4072 * @cmd_details: pointer to command details structure or NULL
4074 * Update the NVM using the admin queue commands
4076 enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
4077 u32 offset, u16 length, void *data,
4079 struct i40e_asq_cmd_details *cmd_details)
4081 struct i40e_aq_desc desc;
4082 struct i40e_aqc_nvm_update *cmd =
4083 (struct i40e_aqc_nvm_update *)&desc.params.raw;
4084 enum i40e_status_code status;
4086 DEBUGFUNC("i40e_aq_update_nvm");
4088 /* In offset the highest byte must be zeroed. */
4089 if (offset & 0xFF000000) {
4090 status = I40E_ERR_PARAM;
4091 goto i40e_aq_update_nvm_exit;
4094 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
4096 /* If this is the last command in a series, set the proper flag. */
4098 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
4099 cmd->module_pointer = module_pointer;
4100 cmd->offset = CPU_TO_LE32(offset);
4101 cmd->length = CPU_TO_LE16(length);
4103 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4104 if (length > I40E_AQ_LARGE_BUF)
4105 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4107 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
4109 i40e_aq_update_nvm_exit:
4114 * i40e_aq_get_lldp_mib
4115 * @hw: pointer to the hw struct
4116 * @bridge_type: type of bridge requested
4117 * @mib_type: Local, Remote or both Local and Remote MIBs
4118 * @buff: pointer to a user supplied buffer to store the MIB block
4119 * @buff_size: size of the buffer (in bytes)
4120 * @local_len : length of the returned Local LLDP MIB
4121 * @remote_len: length of the returned Remote LLDP MIB
4122 * @cmd_details: pointer to command details structure or NULL
4124 * Requests the complete LLDP MIB (entire packet).
4126 enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
4127 u8 mib_type, void *buff, u16 buff_size,
4128 u16 *local_len, u16 *remote_len,
4129 struct i40e_asq_cmd_details *cmd_details)
4131 struct i40e_aq_desc desc;
4132 struct i40e_aqc_lldp_get_mib *cmd =
4133 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
4134 struct i40e_aqc_lldp_get_mib *resp =
4135 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
4136 enum i40e_status_code status;
4138 if (buff_size == 0 || !buff)
4139 return I40E_ERR_PARAM;
4141 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
4142 /* Indirect Command */
4143 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4145 cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
4146 cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4147 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4149 desc.datalen = CPU_TO_LE16(buff_size);
4151 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4152 if (buff_size > I40E_AQ_LARGE_BUF)
4153 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4155 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4157 if (local_len != NULL)
4158 *local_len = LE16_TO_CPU(resp->local_len);
4159 if (remote_len != NULL)
4160 *remote_len = LE16_TO_CPU(resp->remote_len);
4167 * i40e_aq_set_lldp_mib - Set the LLDP MIB
4168 * @hw: pointer to the hw struct
4169 * @mib_type: Local, Remote or both Local and Remote MIBs
4170 * @buff: pointer to a user supplied buffer to store the MIB block
4171 * @buff_size: size of the buffer (in bytes)
4172 * @cmd_details: pointer to command details structure or NULL
4176 enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
4177 u8 mib_type, void *buff, u16 buff_size,
4178 struct i40e_asq_cmd_details *cmd_details)
4180 struct i40e_aq_desc desc;
4181 struct i40e_aqc_lldp_set_local_mib *cmd =
4182 (struct i40e_aqc_lldp_set_local_mib *)&desc.params.raw;
4183 enum i40e_status_code status;
4185 if (buff_size == 0 || !buff)
4186 return I40E_ERR_PARAM;
4188 i40e_fill_default_direct_cmd_desc(&desc,
4189 i40e_aqc_opc_lldp_set_local_mib);
4190 /* Indirect Command */
4191 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4192 if (buff_size > I40E_AQ_LARGE_BUF)
4193 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4194 desc.datalen = CPU_TO_LE16(buff_size);
4196 cmd->type = mib_type;
4197 cmd->length = CPU_TO_LE16(buff_size);
4198 cmd->address_high = CPU_TO_LE32(I40E_HI_WORD((u64)buff));
4199 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buff));
4201 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4206 * i40e_aq_cfg_lldp_mib_change_event
4207 * @hw: pointer to the hw struct
4208 * @enable_update: Enable or Disable event posting
4209 * @cmd_details: pointer to command details structure or NULL
4211 * Enable or Disable posting of an event on ARQ when LLDP MIB
4212 * associated with the interface changes
4214 enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
4216 struct i40e_asq_cmd_details *cmd_details)
4218 struct i40e_aq_desc desc;
4219 struct i40e_aqc_lldp_update_mib *cmd =
4220 (struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
4221 enum i40e_status_code status;
4223 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
4226 cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
4228 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4234 * i40e_aq_add_lldp_tlv
4235 * @hw: pointer to the hw struct
4236 * @bridge_type: type of bridge
4237 * @buff: buffer with TLV to add
4238 * @buff_size: length of the buffer
4239 * @tlv_len: length of the TLV to be added
4240 * @mib_len: length of the LLDP MIB returned in response
4241 * @cmd_details: pointer to command details structure or NULL
4243 * Add the specified TLV to LLDP Local MIB for the given bridge type,
4244 * it is responsibility of the caller to make sure that the TLV is not
4245 * already present in the LLDPDU.
4246 * In return firmware will write the complete LLDP MIB with the newly
4247 * added TLV in the response buffer.
4249 enum i40e_status_code i40e_aq_add_lldp_tlv(struct i40e_hw *hw, u8 bridge_type,
4250 void *buff, u16 buff_size, u16 tlv_len,
4252 struct i40e_asq_cmd_details *cmd_details)
4254 struct i40e_aq_desc desc;
4255 struct i40e_aqc_lldp_add_tlv *cmd =
4256 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4257 enum i40e_status_code status;
4259 if (buff_size == 0 || !buff || tlv_len == 0)
4260 return I40E_ERR_PARAM;
4262 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_add_tlv);
4264 /* Indirect Command */
4265 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4266 if (buff_size > I40E_AQ_LARGE_BUF)
4267 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4268 desc.datalen = CPU_TO_LE16(buff_size);
4270 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4271 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4272 cmd->len = CPU_TO_LE16(tlv_len);
4274 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4276 if (mib_len != NULL)
4277 *mib_len = LE16_TO_CPU(desc.datalen);
4284 * i40e_aq_update_lldp_tlv
4285 * @hw: pointer to the hw struct
4286 * @bridge_type: type of bridge
4287 * @buff: buffer with TLV to update
4288 * @buff_size: size of the buffer holding original and updated TLVs
4289 * @old_len: Length of the Original TLV
4290 * @new_len: Length of the Updated TLV
4291 * @offset: offset of the updated TLV in the buff
4292 * @mib_len: length of the returned LLDP MIB
4293 * @cmd_details: pointer to command details structure or NULL
4295 * Update the specified TLV to the LLDP Local MIB for the given bridge type.
4296 * Firmware will place the complete LLDP MIB in response buffer with the
4299 enum i40e_status_code i40e_aq_update_lldp_tlv(struct i40e_hw *hw,
4300 u8 bridge_type, void *buff, u16 buff_size,
4301 u16 old_len, u16 new_len, u16 offset,
4303 struct i40e_asq_cmd_details *cmd_details)
4305 struct i40e_aq_desc desc;
4306 struct i40e_aqc_lldp_update_tlv *cmd =
4307 (struct i40e_aqc_lldp_update_tlv *)&desc.params.raw;
4308 enum i40e_status_code status;
4310 if (buff_size == 0 || !buff || offset == 0 ||
4311 old_len == 0 || new_len == 0)
4312 return I40E_ERR_PARAM;
4314 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_tlv);
4316 /* Indirect Command */
4317 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4318 if (buff_size > I40E_AQ_LARGE_BUF)
4319 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4320 desc.datalen = CPU_TO_LE16(buff_size);
4322 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4323 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4324 cmd->old_len = CPU_TO_LE16(old_len);
4325 cmd->new_offset = CPU_TO_LE16(offset);
4326 cmd->new_len = CPU_TO_LE16(new_len);
4328 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4330 if (mib_len != NULL)
4331 *mib_len = LE16_TO_CPU(desc.datalen);
4338 * i40e_aq_delete_lldp_tlv
4339 * @hw: pointer to the hw struct
4340 * @bridge_type: type of bridge
4341 * @buff: pointer to a user supplied buffer that has the TLV
4342 * @buff_size: length of the buffer
4343 * @tlv_len: length of the TLV to be deleted
4344 * @mib_len: length of the returned LLDP MIB
4345 * @cmd_details: pointer to command details structure or NULL
4347 * Delete the specified TLV from LLDP Local MIB for the given bridge type.
4348 * The firmware places the entire LLDP MIB in the response buffer.
4350 enum i40e_status_code i40e_aq_delete_lldp_tlv(struct i40e_hw *hw,
4351 u8 bridge_type, void *buff, u16 buff_size,
4352 u16 tlv_len, u16 *mib_len,
4353 struct i40e_asq_cmd_details *cmd_details)
4355 struct i40e_aq_desc desc;
4356 struct i40e_aqc_lldp_add_tlv *cmd =
4357 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4358 enum i40e_status_code status;
4360 if (buff_size == 0 || !buff)
4361 return I40E_ERR_PARAM;
4363 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_delete_tlv);
4365 /* Indirect Command */
4366 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4367 if (buff_size > I40E_AQ_LARGE_BUF)
4368 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4369 desc.datalen = CPU_TO_LE16(buff_size);
4370 cmd->len = CPU_TO_LE16(tlv_len);
4371 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4372 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4374 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4376 if (mib_len != NULL)
4377 *mib_len = LE16_TO_CPU(desc.datalen);
4385 * @hw: pointer to the hw struct
4386 * @shutdown_agent: True if LLDP Agent needs to be Shutdown
4387 * @cmd_details: pointer to command details structure or NULL
4389 * Stop or Shutdown the embedded LLDP Agent
4391 enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
4392 struct i40e_asq_cmd_details *cmd_details)
4394 struct i40e_aq_desc desc;
4395 struct i40e_aqc_lldp_stop *cmd =
4396 (struct i40e_aqc_lldp_stop *)&desc.params.raw;
4397 enum i40e_status_code status;
4399 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
4402 cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
4404 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4410 * i40e_aq_start_lldp
4411 * @hw: pointer to the hw struct
4412 * @cmd_details: pointer to command details structure or NULL
4414 * Start the embedded LLDP Agent on all ports.
4416 enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
4417 struct i40e_asq_cmd_details *cmd_details)
4419 struct i40e_aq_desc desc;
4420 struct i40e_aqc_lldp_start *cmd =
4421 (struct i40e_aqc_lldp_start *)&desc.params.raw;
4422 enum i40e_status_code status;
4424 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
4426 cmd->command = I40E_AQ_LLDP_AGENT_START;
4427 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4433 * i40e_aq_set_dcb_parameters
4434 * @hw: pointer to the hw struct
4435 * @cmd_details: pointer to command details structure or NULL
4436 * @dcb_enable: True if DCB configuration needs to be applied
4439 enum i40e_status_code
4440 i40e_aq_set_dcb_parameters(struct i40e_hw *hw, bool dcb_enable,
4441 struct i40e_asq_cmd_details *cmd_details)
4443 struct i40e_aq_desc desc;
4444 struct i40e_aqc_set_dcb_parameters *cmd =
4445 (struct i40e_aqc_set_dcb_parameters *)&desc.params.raw;
4446 enum i40e_status_code status;
4448 i40e_fill_default_direct_cmd_desc(&desc,
4449 i40e_aqc_opc_set_dcb_parameters);
4452 cmd->valid_flags = I40E_DCB_VALID;
4453 cmd->command = I40E_AQ_DCB_SET_AGENT;
4455 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4461 * i40e_aq_get_cee_dcb_config
4462 * @hw: pointer to the hw struct
4463 * @buff: response buffer that stores CEE operational configuration
4464 * @buff_size: size of the buffer passed
4465 * @cmd_details: pointer to command details structure or NULL
4467 * Get CEE DCBX mode operational configuration from firmware
4469 enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
4470 void *buff, u16 buff_size,
4471 struct i40e_asq_cmd_details *cmd_details)
4473 struct i40e_aq_desc desc;
4474 enum i40e_status_code status;
4476 if (buff_size == 0 || !buff)
4477 return I40E_ERR_PARAM;
4479 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_cee_dcb_cfg);
4481 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4482 status = i40e_asq_send_command(hw, &desc, (void *)buff, buff_size,
4489 * i40e_aq_start_stop_dcbx - Start/Stop DCBx service in FW
4490 * @hw: pointer to the hw struct
4491 * @start_agent: True if DCBx Agent needs to be Started
4492 * False if DCBx Agent needs to be Stopped
4493 * @cmd_details: pointer to command details structure or NULL
4495 * Start/Stop the embedded dcbx Agent
4497 enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
4499 struct i40e_asq_cmd_details *cmd_details)
4501 struct i40e_aq_desc desc;
4502 struct i40e_aqc_lldp_stop_start_specific_agent *cmd =
4503 (struct i40e_aqc_lldp_stop_start_specific_agent *)
4505 enum i40e_status_code status;
4507 i40e_fill_default_direct_cmd_desc(&desc,
4508 i40e_aqc_opc_lldp_stop_start_spec_agent);
4511 cmd->command = I40E_AQC_START_SPECIFIC_AGENT_MASK;
4513 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4519 * i40e_aq_add_udp_tunnel
4520 * @hw: pointer to the hw struct
4521 * @udp_port: the UDP port to add in Host byte order
4522 * @header_len: length of the tunneling header length in DWords
4523 * @protocol_index: protocol index type
4524 * @filter_index: pointer to filter index
4525 * @cmd_details: pointer to command details structure or NULL
4527 * Note: Firmware expects the udp_port value to be in Little Endian format,
4528 * and this function will call CPU_TO_LE16 to convert from Host byte order to
4529 * Little Endian order.
4531 enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
4532 u16 udp_port, u8 protocol_index,
4534 struct i40e_asq_cmd_details *cmd_details)
4536 struct i40e_aq_desc desc;
4537 struct i40e_aqc_add_udp_tunnel *cmd =
4538 (struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
4539 struct i40e_aqc_del_udp_tunnel_completion *resp =
4540 (struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
4541 enum i40e_status_code status;
4543 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
4545 cmd->udp_port = CPU_TO_LE16(udp_port);
4546 cmd->protocol_type = protocol_index;
4548 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4550 if (!status && filter_index)
4551 *filter_index = resp->index;
4557 * i40e_aq_del_udp_tunnel
4558 * @hw: pointer to the hw struct
4559 * @index: filter index
4560 * @cmd_details: pointer to command details structure or NULL
4562 enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
4563 struct i40e_asq_cmd_details *cmd_details)
4565 struct i40e_aq_desc desc;
4566 struct i40e_aqc_remove_udp_tunnel *cmd =
4567 (struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
4568 enum i40e_status_code status;
4570 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
4574 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4580 * i40e_aq_get_switch_resource_alloc (0x0204)
4581 * @hw: pointer to the hw struct
4582 * @num_entries: pointer to u8 to store the number of resource entries returned
4583 * @buf: pointer to a user supplied buffer. This buffer must be large enough
4584 * to store the resource information for all resource types. Each
4585 * resource type is a i40e_aqc_switch_resource_alloc_data structure.
4586 * @count: size, in bytes, of the buffer provided
4587 * @cmd_details: pointer to command details structure or NULL
4589 * Query the resources allocated to a function.
4591 enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
4593 struct i40e_aqc_switch_resource_alloc_element_resp *buf,
4595 struct i40e_asq_cmd_details *cmd_details)
4597 struct i40e_aq_desc desc;
4598 struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
4599 (struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
4600 enum i40e_status_code status;
4601 u16 length = count * sizeof(*buf);
4603 i40e_fill_default_direct_cmd_desc(&desc,
4604 i40e_aqc_opc_get_switch_resource_alloc);
4606 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4607 if (length > I40E_AQ_LARGE_BUF)
4608 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4610 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4612 if (!status && num_entries)
4613 *num_entries = cmd_resp->num_entries;
4619 * i40e_aq_delete_element - Delete switch element
4620 * @hw: pointer to the hw struct
4621 * @seid: the SEID to delete from the switch
4622 * @cmd_details: pointer to command details structure or NULL
4624 * This deletes a switch element from the switch.
4626 enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
4627 struct i40e_asq_cmd_details *cmd_details)
4629 struct i40e_aq_desc desc;
4630 struct i40e_aqc_switch_seid *cmd =
4631 (struct i40e_aqc_switch_seid *)&desc.params.raw;
4632 enum i40e_status_code status;
4635 return I40E_ERR_PARAM;
4637 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
4639 cmd->seid = CPU_TO_LE16(seid);
4641 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4647 * i40e_aq_add_pvirt - Instantiate a Port Virtualizer on a port
4648 * @hw: pointer to the hw struct
4649 * @flags: component flags
4650 * @mac_seid: uplink seid (MAC SEID)
4651 * @vsi_seid: connected vsi seid
4652 * @ret_seid: seid of create pv component
4654 * This instantiates an i40e port virtualizer with specified flags.
4655 * Depending on specified flags the port virtualizer can act as a
4656 * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
4658 enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
4659 u16 mac_seid, u16 vsi_seid,
4662 struct i40e_aq_desc desc;
4663 struct i40e_aqc_add_update_pv *cmd =
4664 (struct i40e_aqc_add_update_pv *)&desc.params.raw;
4665 struct i40e_aqc_add_update_pv_completion *resp =
4666 (struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
4667 enum i40e_status_code status;
4670 return I40E_ERR_PARAM;
4672 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
4673 cmd->command_flags = CPU_TO_LE16(flags);
4674 cmd->uplink_seid = CPU_TO_LE16(mac_seid);
4675 cmd->connected_seid = CPU_TO_LE16(vsi_seid);
4677 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4678 if (!status && ret_seid)
4679 *ret_seid = LE16_TO_CPU(resp->pv_seid);
4685 * i40e_aq_add_tag - Add an S/E-tag
4686 * @hw: pointer to the hw struct
4687 * @direct_to_queue: should s-tag direct flow to a specific queue
4688 * @vsi_seid: VSI SEID to use this tag
4689 * @tag: value of the tag
4690 * @queue_num: queue number, only valid is direct_to_queue is true
4691 * @tags_used: return value, number of tags in use by this PF
4692 * @tags_free: return value, number of unallocated tags
4693 * @cmd_details: pointer to command details structure or NULL
4695 * This associates an S- or E-tag to a VSI in the switch complex. It returns
4696 * the number of tags allocated by the PF, and the number of unallocated
4699 enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
4700 u16 vsi_seid, u16 tag, u16 queue_num,
4701 u16 *tags_used, u16 *tags_free,
4702 struct i40e_asq_cmd_details *cmd_details)
4704 struct i40e_aq_desc desc;
4705 struct i40e_aqc_add_tag *cmd =
4706 (struct i40e_aqc_add_tag *)&desc.params.raw;
4707 struct i40e_aqc_add_remove_tag_completion *resp =
4708 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4709 enum i40e_status_code status;
4712 return I40E_ERR_PARAM;
4714 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
4716 cmd->seid = CPU_TO_LE16(vsi_seid);
4717 cmd->tag = CPU_TO_LE16(tag);
4718 if (direct_to_queue) {
4719 cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
4720 cmd->queue_number = CPU_TO_LE16(queue_num);
4723 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4726 if (tags_used != NULL)
4727 *tags_used = LE16_TO_CPU(resp->tags_used);
4728 if (tags_free != NULL)
4729 *tags_free = LE16_TO_CPU(resp->tags_free);
4736 * i40e_aq_remove_tag - Remove an S- or E-tag
4737 * @hw: pointer to the hw struct
4738 * @vsi_seid: VSI SEID this tag is associated with
4739 * @tag: value of the S-tag to delete
4740 * @tags_used: return value, number of tags in use by this PF
4741 * @tags_free: return value, number of unallocated tags
4742 * @cmd_details: pointer to command details structure or NULL
4744 * This deletes an S- or E-tag from a VSI in the switch complex. It returns
4745 * the number of tags allocated by the PF, and the number of unallocated
4748 enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
4749 u16 tag, u16 *tags_used, u16 *tags_free,
4750 struct i40e_asq_cmd_details *cmd_details)
4752 struct i40e_aq_desc desc;
4753 struct i40e_aqc_remove_tag *cmd =
4754 (struct i40e_aqc_remove_tag *)&desc.params.raw;
4755 struct i40e_aqc_add_remove_tag_completion *resp =
4756 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4757 enum i40e_status_code status;
4760 return I40E_ERR_PARAM;
4762 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
4764 cmd->seid = CPU_TO_LE16(vsi_seid);
4765 cmd->tag = CPU_TO_LE16(tag);
4767 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4770 if (tags_used != NULL)
4771 *tags_used = LE16_TO_CPU(resp->tags_used);
4772 if (tags_free != NULL)
4773 *tags_free = LE16_TO_CPU(resp->tags_free);
4780 * i40e_aq_add_mcast_etag - Add a multicast E-tag
4781 * @hw: pointer to the hw struct
4782 * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
4783 * @etag: value of E-tag to add
4784 * @num_tags_in_buf: number of unicast E-tags in indirect buffer
4785 * @buf: address of indirect buffer
4786 * @tags_used: return value, number of E-tags in use by this port
4787 * @tags_free: return value, number of unallocated M-tags
4788 * @cmd_details: pointer to command details structure or NULL
4790 * This associates a multicast E-tag to a port virtualizer. It will return
4791 * the number of tags allocated by the PF, and the number of unallocated
4794 * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
4795 * num_tags_in_buf long.
4797 enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4798 u16 etag, u8 num_tags_in_buf, void *buf,
4799 u16 *tags_used, u16 *tags_free,
4800 struct i40e_asq_cmd_details *cmd_details)
4802 struct i40e_aq_desc desc;
4803 struct i40e_aqc_add_remove_mcast_etag *cmd =
4804 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4805 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4806 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4807 enum i40e_status_code status;
4808 u16 length = sizeof(u16) * num_tags_in_buf;
4810 if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
4811 return I40E_ERR_PARAM;
4813 i40e_fill_default_direct_cmd_desc(&desc,
4814 i40e_aqc_opc_add_multicast_etag);
4816 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4817 cmd->etag = CPU_TO_LE16(etag);
4818 cmd->num_unicast_etags = num_tags_in_buf;
4820 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4821 if (length > I40E_AQ_LARGE_BUF)
4822 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4824 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4827 if (tags_used != NULL)
4828 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4829 if (tags_free != NULL)
4830 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4837 * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
4838 * @hw: pointer to the hw struct
4839 * @pv_seid: Port Virtualizer SEID this M-tag is associated with
4840 * @etag: value of the E-tag to remove
4841 * @tags_used: return value, number of tags in use by this port
4842 * @tags_free: return value, number of unallocated tags
4843 * @cmd_details: pointer to command details structure or NULL
4845 * This deletes an E-tag from the port virtualizer. It will return
4846 * the number of tags allocated by the port, and the number of unallocated
4849 enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4850 u16 etag, u16 *tags_used, u16 *tags_free,
4851 struct i40e_asq_cmd_details *cmd_details)
4853 struct i40e_aq_desc desc;
4854 struct i40e_aqc_add_remove_mcast_etag *cmd =
4855 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4856 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4857 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4858 enum i40e_status_code status;
4862 return I40E_ERR_PARAM;
4864 i40e_fill_default_direct_cmd_desc(&desc,
4865 i40e_aqc_opc_remove_multicast_etag);
4867 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4868 cmd->etag = CPU_TO_LE16(etag);
4870 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4873 if (tags_used != NULL)
4874 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4875 if (tags_free != NULL)
4876 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4883 * i40e_aq_update_tag - Update an S/E-tag
4884 * @hw: pointer to the hw struct
4885 * @vsi_seid: VSI SEID using this S-tag
4886 * @old_tag: old tag value
4887 * @new_tag: new tag value
4888 * @tags_used: return value, number of tags in use by this PF
4889 * @tags_free: return value, number of unallocated tags
4890 * @cmd_details: pointer to command details structure or NULL
4892 * This updates the value of the tag currently attached to this VSI
4893 * in the switch complex. It will return the number of tags allocated
4894 * by the PF, and the number of unallocated tags available.
4896 enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
4897 u16 old_tag, u16 new_tag, u16 *tags_used,
4899 struct i40e_asq_cmd_details *cmd_details)
4901 struct i40e_aq_desc desc;
4902 struct i40e_aqc_update_tag *cmd =
4903 (struct i40e_aqc_update_tag *)&desc.params.raw;
4904 struct i40e_aqc_update_tag_completion *resp =
4905 (struct i40e_aqc_update_tag_completion *)&desc.params.raw;
4906 enum i40e_status_code status;
4909 return I40E_ERR_PARAM;
4911 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
4913 cmd->seid = CPU_TO_LE16(vsi_seid);
4914 cmd->old_tag = CPU_TO_LE16(old_tag);
4915 cmd->new_tag = CPU_TO_LE16(new_tag);
4917 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4920 if (tags_used != NULL)
4921 *tags_used = LE16_TO_CPU(resp->tags_used);
4922 if (tags_free != NULL)
4923 *tags_free = LE16_TO_CPU(resp->tags_free);
4930 * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
4931 * @hw: pointer to the hw struct
4932 * @tcmap: TC map for request/release any ignore PFC condition
4933 * @request: request or release ignore PFC condition
4934 * @tcmap_ret: return TCs for which PFC is currently ignored
4935 * @cmd_details: pointer to command details structure or NULL
4937 * This sends out request/release to ignore PFC condition for a TC.
4938 * It will return the TCs for which PFC is currently ignored.
4940 enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
4941 bool request, u8 *tcmap_ret,
4942 struct i40e_asq_cmd_details *cmd_details)
4944 struct i40e_aq_desc desc;
4945 struct i40e_aqc_pfc_ignore *cmd_resp =
4946 (struct i40e_aqc_pfc_ignore *)&desc.params.raw;
4947 enum i40e_status_code status;
4949 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
4952 cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
4954 cmd_resp->tc_bitmap = tcmap;
4956 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4959 if (tcmap_ret != NULL)
4960 *tcmap_ret = cmd_resp->tc_bitmap;
4967 * i40e_aq_dcb_updated - DCB Updated Command
4968 * @hw: pointer to the hw struct
4969 * @cmd_details: pointer to command details structure or NULL
4971 * When LLDP is handled in PF this command is used by the PF
4972 * to notify EMP that a DCB setting is modified.
4973 * When LLDP is handled in EMP this command is used by the PF
4974 * to notify EMP whenever one of the following parameters get
4976 * - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
4977 * - PCIRTT in PRTDCB_GENC.PCIRTT
4978 * - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
4979 * EMP will return when the shared RPB settings have been
4980 * recomputed and modified. The retval field in the descriptor
4981 * will be set to 0 when RPB is modified.
4983 enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
4984 struct i40e_asq_cmd_details *cmd_details)
4986 struct i40e_aq_desc desc;
4987 enum i40e_status_code status;
4989 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
4991 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4997 * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
4998 * @hw: pointer to the hw struct
4999 * @seid: defines the SEID of the switch for which the stats are requested
5000 * @vlan_id: the VLAN ID for which the statistics are requested
5001 * @stat_index: index of the statistics counters block assigned to this VLAN
5002 * @cmd_details: pointer to command details structure or NULL
5004 * XL710 supports 128 smonVlanStats counters.This command is used to
5005 * allocate a set of smonVlanStats counters to a specific VLAN in a specific
5008 enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
5009 u16 vlan_id, u16 *stat_index,
5010 struct i40e_asq_cmd_details *cmd_details)
5012 struct i40e_aq_desc desc;
5013 struct i40e_aqc_add_remove_statistics *cmd_resp =
5014 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
5015 enum i40e_status_code status;
5017 if ((seid == 0) || (stat_index == NULL))
5018 return I40E_ERR_PARAM;
5020 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
5022 cmd_resp->seid = CPU_TO_LE16(seid);
5023 cmd_resp->vlan = CPU_TO_LE16(vlan_id);
5025 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5027 if (!status && stat_index)
5028 *stat_index = LE16_TO_CPU(cmd_resp->stat_index);
5034 * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
5035 * @hw: pointer to the hw struct
5036 * @seid: defines the SEID of the switch for which the stats are requested
5037 * @vlan_id: the VLAN ID for which the statistics are requested
5038 * @stat_index: index of the statistics counters block assigned to this VLAN
5039 * @cmd_details: pointer to command details structure or NULL
5041 * XL710 supports 128 smonVlanStats counters.This command is used to
5042 * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
5045 enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
5046 u16 vlan_id, u16 stat_index,
5047 struct i40e_asq_cmd_details *cmd_details)
5049 struct i40e_aq_desc desc;
5050 struct i40e_aqc_add_remove_statistics *cmd =
5051 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
5052 enum i40e_status_code status;
5055 return I40E_ERR_PARAM;
5057 i40e_fill_default_direct_cmd_desc(&desc,
5058 i40e_aqc_opc_remove_statistics);
5060 cmd->seid = CPU_TO_LE16(seid);
5061 cmd->vlan = CPU_TO_LE16(vlan_id);
5062 cmd->stat_index = CPU_TO_LE16(stat_index);
5064 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5070 * i40e_aq_set_port_parameters - set physical port parameters.
5071 * @hw: pointer to the hw struct
5072 * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
5073 * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
5074 * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
5075 * @double_vlan: if set double VLAN is enabled
5076 * @cmd_details: pointer to command details structure or NULL
5078 enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
5079 u16 bad_frame_vsi, bool save_bad_pac,
5080 bool pad_short_pac, bool double_vlan,
5081 struct i40e_asq_cmd_details *cmd_details)
5083 struct i40e_aqc_set_port_parameters *cmd;
5084 enum i40e_status_code status;
5085 struct i40e_aq_desc desc;
5086 u16 command_flags = 0;
5088 cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
5090 i40e_fill_default_direct_cmd_desc(&desc,
5091 i40e_aqc_opc_set_port_parameters);
5093 cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
5095 command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
5097 command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
5099 command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
5100 cmd->command_flags = CPU_TO_LE16(command_flags);
5102 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5108 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
5109 * @hw: pointer to the hw struct
5110 * @seid: seid for the physical port/switching component/vsi
5111 * @buff: Indirect buffer to hold data parameters and response
5112 * @buff_size: Indirect buffer size
5113 * @opcode: Tx scheduler AQ command opcode
5114 * @cmd_details: pointer to command details structure or NULL
5116 * Generic command handler for Tx scheduler AQ commands
5118 static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
5119 void *buff, u16 buff_size,
5120 enum i40e_admin_queue_opc opcode,
5121 struct i40e_asq_cmd_details *cmd_details)
5123 struct i40e_aq_desc desc;
5124 struct i40e_aqc_tx_sched_ind *cmd =
5125 (struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
5126 enum i40e_status_code status;
5127 bool cmd_param_flag = false;
5130 case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
5131 case i40e_aqc_opc_configure_vsi_tc_bw:
5132 case i40e_aqc_opc_enable_switching_comp_ets:
5133 case i40e_aqc_opc_modify_switching_comp_ets:
5134 case i40e_aqc_opc_disable_switching_comp_ets:
5135 case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
5136 case i40e_aqc_opc_configure_switching_comp_bw_config:
5137 cmd_param_flag = true;
5139 case i40e_aqc_opc_query_vsi_bw_config:
5140 case i40e_aqc_opc_query_vsi_ets_sla_config:
5141 case i40e_aqc_opc_query_switching_comp_ets_config:
5142 case i40e_aqc_opc_query_port_ets_config:
5143 case i40e_aqc_opc_query_switching_comp_bw_config:
5144 cmd_param_flag = false;
5147 return I40E_ERR_PARAM;
5150 i40e_fill_default_direct_cmd_desc(&desc, opcode);
5152 /* Indirect command */
5153 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5155 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
5156 if (buff_size > I40E_AQ_LARGE_BUF)
5157 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5159 desc.datalen = CPU_TO_LE16(buff_size);
5161 cmd->vsi_seid = CPU_TO_LE16(seid);
5163 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
5169 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
5170 * @hw: pointer to the hw struct
5172 * @credit: BW limit credits (0 = disabled)
5173 * @max_credit: Max BW limit credits
5174 * @cmd_details: pointer to command details structure or NULL
5176 enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
5177 u16 seid, u16 credit, u8 max_credit,
5178 struct i40e_asq_cmd_details *cmd_details)
5180 struct i40e_aq_desc desc;
5181 struct i40e_aqc_configure_vsi_bw_limit *cmd =
5182 (struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
5183 enum i40e_status_code status;
5185 i40e_fill_default_direct_cmd_desc(&desc,
5186 i40e_aqc_opc_configure_vsi_bw_limit);
5188 cmd->vsi_seid = CPU_TO_LE16(seid);
5189 cmd->credit = CPU_TO_LE16(credit);
5190 cmd->max_credit = max_credit;
5192 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5198 * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
5199 * @hw: pointer to the hw struct
5200 * @seid: switching component seid
5201 * @credit: BW limit credits (0 = disabled)
5202 * @max_bw: Max BW limit credits
5203 * @cmd_details: pointer to command details structure or NULL
5205 enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
5206 u16 seid, u16 credit, u8 max_bw,
5207 struct i40e_asq_cmd_details *cmd_details)
5209 struct i40e_aq_desc desc;
5210 struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
5211 (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
5212 enum i40e_status_code status;
5214 i40e_fill_default_direct_cmd_desc(&desc,
5215 i40e_aqc_opc_configure_switching_comp_bw_limit);
5217 cmd->seid = CPU_TO_LE16(seid);
5218 cmd->credit = CPU_TO_LE16(credit);
5219 cmd->max_bw = max_bw;
5221 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5227 * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
5228 * @hw: pointer to the hw struct
5230 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5231 * @cmd_details: pointer to command details structure or NULL
5233 enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
5235 struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
5236 struct i40e_asq_cmd_details *cmd_details)
5238 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5239 i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
5244 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
5245 * @hw: pointer to the hw struct
5247 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
5248 * @cmd_details: pointer to command details structure or NULL
5250 enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
5252 struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
5253 struct i40e_asq_cmd_details *cmd_details)
5255 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5256 i40e_aqc_opc_configure_vsi_tc_bw,
5261 * i40e_aq_config_switch_comp_ets - Enable/Disable/Modify ETS on the port
5262 * @hw: pointer to the hw struct
5263 * @seid: seid of the switching component connected to Physical Port
5264 * @ets_data: Buffer holding ETS parameters
5265 * @cmd_details: pointer to command details structure or NULL
5267 enum i40e_status_code i40e_aq_config_switch_comp_ets(struct i40e_hw *hw,
5269 struct i40e_aqc_configure_switching_comp_ets_data *ets_data,
5270 enum i40e_admin_queue_opc opcode,
5271 struct i40e_asq_cmd_details *cmd_details)
5273 return i40e_aq_tx_sched_cmd(hw, seid, (void *)ets_data,
5274 sizeof(*ets_data), opcode, cmd_details);
5278 * i40e_aq_config_switch_comp_bw_config - Config Switch comp BW Alloc per TC
5279 * @hw: pointer to the hw struct
5280 * @seid: seid of the switching component
5281 * @bw_data: Buffer holding enabled TCs, relative/absolute TC BW limit/credits
5282 * @cmd_details: pointer to command details structure or NULL
5284 enum i40e_status_code i40e_aq_config_switch_comp_bw_config(struct i40e_hw *hw,
5286 struct i40e_aqc_configure_switching_comp_bw_config_data *bw_data,
5287 struct i40e_asq_cmd_details *cmd_details)
5289 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5290 i40e_aqc_opc_configure_switching_comp_bw_config,
5295 * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
5296 * @hw: pointer to the hw struct
5297 * @seid: seid of the switching component
5298 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5299 * @cmd_details: pointer to command details structure or NULL
5301 enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
5302 struct i40e_hw *hw, u16 seid,
5303 struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
5304 struct i40e_asq_cmd_details *cmd_details)
5306 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5307 i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
5312 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
5313 * @hw: pointer to the hw struct
5314 * @seid: seid of the VSI
5315 * @bw_data: Buffer to hold VSI BW configuration
5316 * @cmd_details: pointer to command details structure or NULL
5318 enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
5320 struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
5321 struct i40e_asq_cmd_details *cmd_details)
5323 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5324 i40e_aqc_opc_query_vsi_bw_config,
5329 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
5330 * @hw: pointer to the hw struct
5331 * @seid: seid of the VSI
5332 * @bw_data: Buffer to hold VSI BW configuration per TC
5333 * @cmd_details: pointer to command details structure or NULL
5335 enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
5337 struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
5338 struct i40e_asq_cmd_details *cmd_details)
5340 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5341 i40e_aqc_opc_query_vsi_ets_sla_config,
5346 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
5347 * @hw: pointer to the hw struct
5348 * @seid: seid of the switching component
5349 * @bw_data: Buffer to hold switching component's per TC BW config
5350 * @cmd_details: pointer to command details structure or NULL
5352 enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
5354 struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
5355 struct i40e_asq_cmd_details *cmd_details)
5357 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5358 i40e_aqc_opc_query_switching_comp_ets_config,
5363 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
5364 * @hw: pointer to the hw struct
5365 * @seid: seid of the VSI or switching component connected to Physical Port
5366 * @bw_data: Buffer to hold current ETS configuration for the Physical Port
5367 * @cmd_details: pointer to command details structure or NULL
5369 enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
5371 struct i40e_aqc_query_port_ets_config_resp *bw_data,
5372 struct i40e_asq_cmd_details *cmd_details)
5374 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5375 i40e_aqc_opc_query_port_ets_config,
5380 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
5381 * @hw: pointer to the hw struct
5382 * @seid: seid of the switching component
5383 * @bw_data: Buffer to hold switching component's BW configuration
5384 * @cmd_details: pointer to command details structure or NULL
5386 enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
5388 struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
5389 struct i40e_asq_cmd_details *cmd_details)
5391 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5392 i40e_aqc_opc_query_switching_comp_bw_config,
5397 * i40e_validate_filter_settings
5398 * @hw: pointer to the hardware structure
5399 * @settings: Filter control settings
5401 * Check and validate the filter control settings passed.
5402 * The function checks for the valid filter/context sizes being
5403 * passed for FCoE and PE.
5405 * Returns I40E_SUCCESS if the values passed are valid and within
5406 * range else returns an error.
5408 STATIC enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
5409 struct i40e_filter_control_settings *settings)
5411 u32 fcoe_cntx_size, fcoe_filt_size;
5412 u32 pe_cntx_size, pe_filt_size;
5417 /* Validate FCoE settings passed */
5418 switch (settings->fcoe_filt_num) {
5419 case I40E_HASH_FILTER_SIZE_1K:
5420 case I40E_HASH_FILTER_SIZE_2K:
5421 case I40E_HASH_FILTER_SIZE_4K:
5422 case I40E_HASH_FILTER_SIZE_8K:
5423 case I40E_HASH_FILTER_SIZE_16K:
5424 case I40E_HASH_FILTER_SIZE_32K:
5425 fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5426 fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
5429 return I40E_ERR_PARAM;
5432 switch (settings->fcoe_cntx_num) {
5433 case I40E_DMA_CNTX_SIZE_512:
5434 case I40E_DMA_CNTX_SIZE_1K:
5435 case I40E_DMA_CNTX_SIZE_2K:
5436 case I40E_DMA_CNTX_SIZE_4K:
5437 fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5438 fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
5441 return I40E_ERR_PARAM;
5444 /* Validate PE settings passed */
5445 switch (settings->pe_filt_num) {
5446 case I40E_HASH_FILTER_SIZE_1K:
5447 case I40E_HASH_FILTER_SIZE_2K:
5448 case I40E_HASH_FILTER_SIZE_4K:
5449 case I40E_HASH_FILTER_SIZE_8K:
5450 case I40E_HASH_FILTER_SIZE_16K:
5451 case I40E_HASH_FILTER_SIZE_32K:
5452 case I40E_HASH_FILTER_SIZE_64K:
5453 case I40E_HASH_FILTER_SIZE_128K:
5454 case I40E_HASH_FILTER_SIZE_256K:
5455 case I40E_HASH_FILTER_SIZE_512K:
5456 case I40E_HASH_FILTER_SIZE_1M:
5457 pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5458 pe_filt_size <<= (u32)settings->pe_filt_num;
5461 return I40E_ERR_PARAM;
5464 switch (settings->pe_cntx_num) {
5465 case I40E_DMA_CNTX_SIZE_512:
5466 case I40E_DMA_CNTX_SIZE_1K:
5467 case I40E_DMA_CNTX_SIZE_2K:
5468 case I40E_DMA_CNTX_SIZE_4K:
5469 case I40E_DMA_CNTX_SIZE_8K:
5470 case I40E_DMA_CNTX_SIZE_16K:
5471 case I40E_DMA_CNTX_SIZE_32K:
5472 case I40E_DMA_CNTX_SIZE_64K:
5473 case I40E_DMA_CNTX_SIZE_128K:
5474 case I40E_DMA_CNTX_SIZE_256K:
5475 pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5476 pe_cntx_size <<= (u32)settings->pe_cntx_num;
5479 return I40E_ERR_PARAM;
5482 /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
5483 val = rd32(hw, I40E_GLHMC_FCOEFMAX);
5484 fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
5485 >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
5486 if (fcoe_filt_size + fcoe_cntx_size > fcoe_fmax)
5487 return I40E_ERR_INVALID_SIZE;
5489 return I40E_SUCCESS;
5493 * i40e_set_filter_control
5494 * @hw: pointer to the hardware structure
5495 * @settings: Filter control settings
5497 * Set the Queue Filters for PE/FCoE and enable filters required
5498 * for a single PF. It is expected that these settings are programmed
5499 * at the driver initialization time.
5501 enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
5502 struct i40e_filter_control_settings *settings)
5504 enum i40e_status_code ret = I40E_SUCCESS;
5505 u32 hash_lut_size = 0;
5509 return I40E_ERR_PARAM;
5511 /* Validate the input settings */
5512 ret = i40e_validate_filter_settings(hw, settings);
5516 /* Read the PF Queue Filter control register */
5517 val = i40e_read_rx_ctl(hw, I40E_PFQF_CTL_0);
5519 /* Program required PE hash buckets for the PF */
5520 val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
5521 val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
5522 I40E_PFQF_CTL_0_PEHSIZE_MASK;
5523 /* Program required PE contexts for the PF */
5524 val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
5525 val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
5526 I40E_PFQF_CTL_0_PEDSIZE_MASK;
5528 /* Program required FCoE hash buckets for the PF */
5529 val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5530 val |= ((u32)settings->fcoe_filt_num <<
5531 I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
5532 I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5533 /* Program required FCoE DDP contexts for the PF */
5534 val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5535 val |= ((u32)settings->fcoe_cntx_num <<
5536 I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
5537 I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5539 /* Program Hash LUT size for the PF */
5540 val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5541 if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
5543 val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
5544 I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5546 /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
5547 if (settings->enable_fdir)
5548 val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
5549 if (settings->enable_ethtype)
5550 val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
5551 if (settings->enable_macvlan)
5552 val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
5554 i40e_write_rx_ctl(hw, I40E_PFQF_CTL_0, val);
5556 return I40E_SUCCESS;
5560 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
5561 * @hw: pointer to the hw struct
5562 * @mac_addr: MAC address to use in the filter
5563 * @ethtype: Ethertype to use in the filter
5564 * @flags: Flags that needs to be applied to the filter
5565 * @vsi_seid: seid of the control VSI
5566 * @queue: VSI queue number to send the packet to
5567 * @is_add: Add control packet filter if True else remove
5568 * @stats: Structure to hold information on control filter counts
5569 * @cmd_details: pointer to command details structure or NULL
5571 * This command will Add or Remove control packet filter for a control VSI.
5572 * In return it will update the total number of perfect filter count in
5575 enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
5576 u8 *mac_addr, u16 ethtype, u16 flags,
5577 u16 vsi_seid, u16 queue, bool is_add,
5578 struct i40e_control_filter_stats *stats,
5579 struct i40e_asq_cmd_details *cmd_details)
5581 struct i40e_aq_desc desc;
5582 struct i40e_aqc_add_remove_control_packet_filter *cmd =
5583 (struct i40e_aqc_add_remove_control_packet_filter *)
5585 struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
5586 (struct i40e_aqc_add_remove_control_packet_filter_completion *)
5588 enum i40e_status_code status;
5591 return I40E_ERR_PARAM;
5594 i40e_fill_default_direct_cmd_desc(&desc,
5595 i40e_aqc_opc_add_control_packet_filter);
5596 cmd->queue = CPU_TO_LE16(queue);
5598 i40e_fill_default_direct_cmd_desc(&desc,
5599 i40e_aqc_opc_remove_control_packet_filter);
5603 i40e_memcpy(cmd->mac, mac_addr, ETH_ALEN,
5604 I40E_NONDMA_TO_NONDMA);
5606 cmd->etype = CPU_TO_LE16(ethtype);
5607 cmd->flags = CPU_TO_LE16(flags);
5608 cmd->seid = CPU_TO_LE16(vsi_seid);
5610 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5612 if (!status && stats) {
5613 stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
5614 stats->etype_used = LE16_TO_CPU(resp->etype_used);
5615 stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
5616 stats->etype_free = LE16_TO_CPU(resp->etype_free);
5623 * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
5624 * @hw: pointer to the hw struct
5625 * @seid: VSI seid to add ethertype filter from
5627 #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
5628 void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
5631 u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
5632 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
5633 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
5634 u16 ethtype = I40E_FLOW_CONTROL_ETHTYPE;
5635 enum i40e_status_code status;
5637 status = i40e_aq_add_rem_control_packet_filter(hw, NULL, ethtype, flag,
5638 seid, 0, true, NULL,
5641 DEBUGOUT("Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
5645 * i40e_fix_up_geneve_vni - adjust Geneve VNI for HW issue
5646 * @filters: list of cloud filters
5647 * @filter_count: length of list
5649 * There's an issue in the device where the Geneve VNI layout needs
5650 * to be shifted 1 byte over from the VxLAN VNI
5652 STATIC void i40e_fix_up_geneve_vni(
5653 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5656 struct i40e_aqc_add_remove_cloud_filters_element_data *f = filters;
5659 for (i = 0; i < filter_count; i++) {
5663 tnl_type = (LE16_TO_CPU(f[i].flags) &
5664 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5665 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5666 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5667 ti = LE32_TO_CPU(f[i].tenant_id);
5668 f[i].tenant_id = CPU_TO_LE32(ti << 8);
5674 * i40e_aq_add_cloud_filters
5675 * @hw: pointer to the hardware structure
5676 * @seid: VSI seid to add cloud filters from
5677 * @filters: Buffer which contains the filters to be added
5678 * @filter_count: number of filters contained in the buffer
5680 * Set the cloud filters for a given VSI. The contents of the
5681 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5682 * in by the caller of the function.
5685 enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
5687 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5690 struct i40e_aq_desc desc;
5691 struct i40e_aqc_add_remove_cloud_filters *cmd =
5692 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5693 enum i40e_status_code status;
5696 i40e_fill_default_direct_cmd_desc(&desc,
5697 i40e_aqc_opc_add_cloud_filters);
5699 buff_len = filter_count * sizeof(*filters);
5700 desc.datalen = CPU_TO_LE16(buff_len);
5701 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5702 cmd->num_filters = filter_count;
5703 cmd->seid = CPU_TO_LE16(seid);
5705 i40e_fix_up_geneve_vni(filters, filter_count);
5707 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5713 * i40e_aq_add_cloud_filters_big_buffer
5714 * @hw: pointer to the hardware structure
5715 * @seid: VSI seid to add cloud filters from
5716 * @filters: Buffer which contains the filters in big buffer to be added
5717 * @filter_count: number of filters contained in the buffer
5719 * Set the cloud filters for a given VSI. The contents of the
5720 * i40e_aqc_add_rm_cloud_filt_elem_ext are filled in by the caller of
5724 enum i40e_status_code i40e_aq_add_cloud_filters_big_buffer(struct i40e_hw *hw,
5726 struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
5729 struct i40e_aq_desc desc;
5730 struct i40e_aqc_add_remove_cloud_filters *cmd =
5731 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5732 enum i40e_status_code status;
5736 i40e_fill_default_direct_cmd_desc(&desc,
5737 i40e_aqc_opc_add_cloud_filters);
5739 buff_len = filter_count * sizeof(*filters);
5740 desc.datalen = CPU_TO_LE16(buff_len);
5741 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5742 cmd->num_filters = filter_count;
5743 cmd->seid = CPU_TO_LE16(seid);
5744 cmd->big_buffer_flag = I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER;
5746 /* adjust Geneve VNI for HW issue */
5747 for (i = 0; i < filter_count; i++) {
5751 tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5752 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5753 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5754 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5755 ti = LE32_TO_CPU(filters[i].element.tenant_id);
5756 filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5760 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5766 * i40e_aq_remove_cloud_filters
5767 * @hw: pointer to the hardware structure
5768 * @seid: VSI seid to remove cloud filters from
5769 * @filters: Buffer which contains the filters to be removed
5770 * @filter_count: number of filters contained in the buffer
5772 * Remove the cloud filters for a given VSI. The contents of the
5773 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5774 * in by the caller of the function.
5777 enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
5779 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5782 struct i40e_aq_desc desc;
5783 struct i40e_aqc_add_remove_cloud_filters *cmd =
5784 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5785 enum i40e_status_code status;
5788 i40e_fill_default_direct_cmd_desc(&desc,
5789 i40e_aqc_opc_remove_cloud_filters);
5791 buff_len = filter_count * sizeof(*filters);
5792 desc.datalen = CPU_TO_LE16(buff_len);
5793 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5794 cmd->num_filters = filter_count;
5795 cmd->seid = CPU_TO_LE16(seid);
5797 i40e_fix_up_geneve_vni(filters, filter_count);
5799 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5805 * i40e_aq_remove_cloud_filters_big_buffer
5806 * @hw: pointer to the hardware structure
5807 * @seid: VSI seid to remove cloud filters from
5808 * @filters: Buffer which contains the filters in big buffer to be removed
5809 * @filter_count: number of filters contained in the buffer
5811 * Remove the cloud filters for a given VSI. The contents of the
5812 * i40e_aqc_add_rm_cloud_filt_elem_ext are filled in by the caller of
5816 enum i40e_status_code i40e_aq_remove_cloud_filters_big_buffer(
5819 struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
5822 struct i40e_aq_desc desc;
5823 struct i40e_aqc_add_remove_cloud_filters *cmd =
5824 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5825 enum i40e_status_code status;
5829 i40e_fill_default_direct_cmd_desc(&desc,
5830 i40e_aqc_opc_remove_cloud_filters);
5832 buff_len = filter_count * sizeof(*filters);
5833 desc.datalen = CPU_TO_LE16(buff_len);
5834 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5835 cmd->num_filters = filter_count;
5836 cmd->seid = CPU_TO_LE16(seid);
5837 cmd->big_buffer_flag = I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER;
5839 /* adjust Geneve VNI for HW issue */
5840 for (i = 0; i < filter_count; i++) {
5844 tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5845 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5846 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5847 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5848 ti = LE32_TO_CPU(filters[i].element.tenant_id);
5849 filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5853 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5859 * i40e_aq_replace_cloud_filters - Replace cloud filter command
5860 * @hw: pointer to the hw struct
5861 * @filters: pointer to the i40e_aqc_replace_cloud_filter_cmd struct
5862 * @cmd_buf: pointer to the i40e_aqc_replace_cloud_filter_cmd_buf struct
5866 i40e_status_code i40e_aq_replace_cloud_filters(struct i40e_hw *hw,
5867 struct i40e_aqc_replace_cloud_filters_cmd *filters,
5868 struct i40e_aqc_replace_cloud_filters_cmd_buf *cmd_buf)
5870 struct i40e_aq_desc desc;
5871 struct i40e_aqc_replace_cloud_filters_cmd *cmd =
5872 (struct i40e_aqc_replace_cloud_filters_cmd *)&desc.params.raw;
5873 enum i40e_status_code status = I40E_SUCCESS;
5876 i40e_fill_default_direct_cmd_desc(&desc,
5877 i40e_aqc_opc_replace_cloud_filters);
5879 desc.datalen = CPU_TO_LE16(32);
5880 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5881 cmd->old_filter_type = filters->old_filter_type;
5882 cmd->new_filter_type = filters->new_filter_type;
5883 cmd->valid_flags = filters->valid_flags;
5884 cmd->tr_bit = filters->tr_bit;
5886 status = i40e_asq_send_command(hw, &desc, cmd_buf,
5887 sizeof(struct i40e_aqc_replace_cloud_filters_cmd_buf), NULL);
5889 /* for get cloud filters command */
5890 for (i = 0; i < 32; i += 4) {
5891 cmd_buf->filters[i / 4].filter_type = cmd_buf->data[i];
5892 cmd_buf->filters[i / 4].input[0] = cmd_buf->data[i + 1];
5893 cmd_buf->filters[i / 4].input[1] = cmd_buf->data[i + 2];
5894 cmd_buf->filters[i / 4].input[2] = cmd_buf->data[i + 3];
5902 * i40e_aq_alternate_write
5903 * @hw: pointer to the hardware structure
5904 * @reg_addr0: address of first dword to be read
5905 * @reg_val0: value to be written under 'reg_addr0'
5906 * @reg_addr1: address of second dword to be read
5907 * @reg_val1: value to be written under 'reg_addr1'
5909 * Write one or two dwords to alternate structure. Fields are indicated
5910 * by 'reg_addr0' and 'reg_addr1' register numbers.
5913 enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
5914 u32 reg_addr0, u32 reg_val0,
5915 u32 reg_addr1, u32 reg_val1)
5917 struct i40e_aq_desc desc;
5918 struct i40e_aqc_alternate_write *cmd_resp =
5919 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5920 enum i40e_status_code status;
5922 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
5923 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5924 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5925 cmd_resp->data0 = CPU_TO_LE32(reg_val0);
5926 cmd_resp->data1 = CPU_TO_LE32(reg_val1);
5928 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5934 * i40e_aq_alternate_write_indirect
5935 * @hw: pointer to the hardware structure
5936 * @addr: address of a first register to be modified
5937 * @dw_count: number of alternate structure fields to write
5938 * @buffer: pointer to the command buffer
5940 * Write 'dw_count' dwords from 'buffer' to alternate structure
5941 * starting at 'addr'.
5944 enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
5945 u32 addr, u32 dw_count, void *buffer)
5947 struct i40e_aq_desc desc;
5948 struct i40e_aqc_alternate_ind_write *cmd_resp =
5949 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5950 enum i40e_status_code status;
5953 return I40E_ERR_PARAM;
5955 /* Indirect command */
5956 i40e_fill_default_direct_cmd_desc(&desc,
5957 i40e_aqc_opc_alternate_write_indirect);
5959 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5960 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5961 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5962 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5964 cmd_resp->address = CPU_TO_LE32(addr);
5965 cmd_resp->length = CPU_TO_LE32(dw_count);
5967 status = i40e_asq_send_command(hw, &desc, buffer,
5968 I40E_LO_DWORD(4*dw_count), NULL);
5974 * i40e_aq_alternate_read
5975 * @hw: pointer to the hardware structure
5976 * @reg_addr0: address of first dword to be read
5977 * @reg_val0: pointer for data read from 'reg_addr0'
5978 * @reg_addr1: address of second dword to be read
5979 * @reg_val1: pointer for data read from 'reg_addr1'
5981 * Read one or two dwords from alternate structure. Fields are indicated
5982 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
5983 * is not passed then only register at 'reg_addr0' is read.
5986 enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
5987 u32 reg_addr0, u32 *reg_val0,
5988 u32 reg_addr1, u32 *reg_val1)
5990 struct i40e_aq_desc desc;
5991 struct i40e_aqc_alternate_write *cmd_resp =
5992 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5993 enum i40e_status_code status;
5995 if (reg_val0 == NULL)
5996 return I40E_ERR_PARAM;
5998 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
5999 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
6000 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
6002 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6004 if (status == I40E_SUCCESS) {
6005 *reg_val0 = LE32_TO_CPU(cmd_resp->data0);
6007 if (reg_val1 != NULL)
6008 *reg_val1 = LE32_TO_CPU(cmd_resp->data1);
6015 * i40e_aq_alternate_read_indirect
6016 * @hw: pointer to the hardware structure
6017 * @addr: address of the alternate structure field
6018 * @dw_count: number of alternate structure fields to read
6019 * @buffer: pointer to the command buffer
6021 * Read 'dw_count' dwords from alternate structure starting at 'addr' and
6022 * place them in 'buffer'. The buffer should be allocated by caller.
6025 enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
6026 u32 addr, u32 dw_count, void *buffer)
6028 struct i40e_aq_desc desc;
6029 struct i40e_aqc_alternate_ind_write *cmd_resp =
6030 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
6031 enum i40e_status_code status;
6034 return I40E_ERR_PARAM;
6036 /* Indirect command */
6037 i40e_fill_default_direct_cmd_desc(&desc,
6038 i40e_aqc_opc_alternate_read_indirect);
6040 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
6041 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
6042 if (dw_count > (I40E_AQ_LARGE_BUF/4))
6043 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6045 cmd_resp->address = CPU_TO_LE32(addr);
6046 cmd_resp->length = CPU_TO_LE32(dw_count);
6048 status = i40e_asq_send_command(hw, &desc, buffer,
6049 I40E_LO_DWORD(4*dw_count), NULL);
6055 * i40e_aq_alternate_clear
6056 * @hw: pointer to the HW structure.
6058 * Clear the alternate structures of the port from which the function
6062 enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
6064 struct i40e_aq_desc desc;
6065 enum i40e_status_code status;
6067 i40e_fill_default_direct_cmd_desc(&desc,
6068 i40e_aqc_opc_alternate_clear_port);
6070 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6076 * i40e_aq_alternate_write_done
6077 * @hw: pointer to the HW structure.
6078 * @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
6079 * @reset_needed: indicates the SW should trigger GLOBAL reset
6081 * Indicates to the FW that alternate structures have been changed.
6084 enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
6085 u8 bios_mode, bool *reset_needed)
6087 struct i40e_aq_desc desc;
6088 struct i40e_aqc_alternate_write_done *cmd =
6089 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
6090 enum i40e_status_code status;
6092 if (reset_needed == NULL)
6093 return I40E_ERR_PARAM;
6095 i40e_fill_default_direct_cmd_desc(&desc,
6096 i40e_aqc_opc_alternate_write_done);
6098 cmd->cmd_flags = CPU_TO_LE16(bios_mode);
6100 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6101 if (!status && reset_needed)
6102 *reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
6103 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
6109 * i40e_aq_set_oem_mode
6110 * @hw: pointer to the HW structure.
6111 * @oem_mode: the OEM mode to be used
6113 * Sets the device to a specific operating mode. Currently the only supported
6114 * mode is no_clp, which causes FW to refrain from using Alternate RAM.
6117 enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
6120 struct i40e_aq_desc desc;
6121 struct i40e_aqc_alternate_write_done *cmd =
6122 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
6123 enum i40e_status_code status;
6125 i40e_fill_default_direct_cmd_desc(&desc,
6126 i40e_aqc_opc_alternate_set_mode);
6128 cmd->cmd_flags = CPU_TO_LE16(oem_mode);
6130 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6136 * i40e_aq_resume_port_tx
6137 * @hw: pointer to the hardware structure
6138 * @cmd_details: pointer to command details structure or NULL
6140 * Resume port's Tx traffic
6142 enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
6143 struct i40e_asq_cmd_details *cmd_details)
6145 struct i40e_aq_desc desc;
6146 enum i40e_status_code status;
6148 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
6150 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6156 * i40e_set_pci_config_data - store PCI bus info
6157 * @hw: pointer to hardware structure
6158 * @link_status: the link status word from PCI config space
6160 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
6162 void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
6164 hw->bus.type = i40e_bus_type_pci_express;
6166 switch (link_status & I40E_PCI_LINK_WIDTH) {
6167 case I40E_PCI_LINK_WIDTH_1:
6168 hw->bus.width = i40e_bus_width_pcie_x1;
6170 case I40E_PCI_LINK_WIDTH_2:
6171 hw->bus.width = i40e_bus_width_pcie_x2;
6173 case I40E_PCI_LINK_WIDTH_4:
6174 hw->bus.width = i40e_bus_width_pcie_x4;
6176 case I40E_PCI_LINK_WIDTH_8:
6177 hw->bus.width = i40e_bus_width_pcie_x8;
6180 hw->bus.width = i40e_bus_width_unknown;
6184 switch (link_status & I40E_PCI_LINK_SPEED) {
6185 case I40E_PCI_LINK_SPEED_2500:
6186 hw->bus.speed = i40e_bus_speed_2500;
6188 case I40E_PCI_LINK_SPEED_5000:
6189 hw->bus.speed = i40e_bus_speed_5000;
6191 case I40E_PCI_LINK_SPEED_8000:
6192 hw->bus.speed = i40e_bus_speed_8000;
6195 hw->bus.speed = i40e_bus_speed_unknown;
6201 * i40e_aq_debug_dump
6202 * @hw: pointer to the hardware structure
6203 * @cluster_id: specific cluster to dump
6204 * @table_id: table id within cluster
6205 * @start_index: index of line in the block to read
6206 * @buff_size: dump buffer size
6207 * @buff: dump buffer
6208 * @ret_buff_size: actual buffer size returned
6209 * @ret_next_table: next block to read
6210 * @ret_next_index: next index to read
6212 * Dump internal FW/HW data for debug purposes.
6215 enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
6216 u8 table_id, u32 start_index, u16 buff_size,
6217 void *buff, u16 *ret_buff_size,
6218 u8 *ret_next_table, u32 *ret_next_index,
6219 struct i40e_asq_cmd_details *cmd_details)
6221 struct i40e_aq_desc desc;
6222 struct i40e_aqc_debug_dump_internals *cmd =
6223 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
6224 struct i40e_aqc_debug_dump_internals *resp =
6225 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
6226 enum i40e_status_code status;
6228 if (buff_size == 0 || !buff)
6229 return I40E_ERR_PARAM;
6231 i40e_fill_default_direct_cmd_desc(&desc,
6232 i40e_aqc_opc_debug_dump_internals);
6233 /* Indirect Command */
6234 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
6235 if (buff_size > I40E_AQ_LARGE_BUF)
6236 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6238 cmd->cluster_id = cluster_id;
6239 cmd->table_id = table_id;
6240 cmd->idx = CPU_TO_LE32(start_index);
6242 desc.datalen = CPU_TO_LE16(buff_size);
6244 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
6246 if (ret_buff_size != NULL)
6247 *ret_buff_size = LE16_TO_CPU(desc.datalen);
6248 if (ret_next_table != NULL)
6249 *ret_next_table = resp->table_id;
6250 if (ret_next_index != NULL)
6251 *ret_next_index = LE32_TO_CPU(resp->idx);
6258 * i40e_read_bw_from_alt_ram
6259 * @hw: pointer to the hardware structure
6260 * @max_bw: pointer for max_bw read
6261 * @min_bw: pointer for min_bw read
6262 * @min_valid: pointer for bool that is true if min_bw is a valid value
6263 * @max_valid: pointer for bool that is true if max_bw is a valid value
6265 * Read bw from the alternate ram for the given pf
6267 enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
6268 u32 *max_bw, u32 *min_bw,
6269 bool *min_valid, bool *max_valid)
6271 enum i40e_status_code status;
6272 u32 max_bw_addr, min_bw_addr;
6274 /* Calculate the address of the min/max bw registers */
6275 max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
6276 I40E_ALT_STRUCT_MAX_BW_OFFSET +
6277 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
6278 min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
6279 I40E_ALT_STRUCT_MIN_BW_OFFSET +
6280 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
6282 /* Read the bandwidths from alt ram */
6283 status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
6284 min_bw_addr, min_bw);
6286 if (*min_bw & I40E_ALT_BW_VALID_MASK)
6291 if (*max_bw & I40E_ALT_BW_VALID_MASK)
6300 * i40e_aq_configure_partition_bw
6301 * @hw: pointer to the hardware structure
6302 * @bw_data: Buffer holding valid pfs and bw limits
6303 * @cmd_details: pointer to command details
6305 * Configure partitions guaranteed/max bw
6307 enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
6308 struct i40e_aqc_configure_partition_bw_data *bw_data,
6309 struct i40e_asq_cmd_details *cmd_details)
6311 enum i40e_status_code status;
6312 struct i40e_aq_desc desc;
6313 u16 bwd_size = sizeof(*bw_data);
6315 i40e_fill_default_direct_cmd_desc(&desc,
6316 i40e_aqc_opc_configure_partition_bw);
6318 /* Indirect command */
6319 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
6320 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
6322 desc.datalen = CPU_TO_LE16(bwd_size);
6324 status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
6330 * i40e_read_phy_register_clause22
6331 * @hw: pointer to the HW structure
6332 * @reg: register address in the page
6333 * @phy_adr: PHY address on MDIO interface
6334 * @value: PHY register value
6336 * Reads specified PHY register value
6338 enum i40e_status_code i40e_read_phy_register_clause22(struct i40e_hw *hw,
6339 u16 reg, u8 phy_addr, u16 *value)
6341 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6342 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6346 command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6347 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6348 (I40E_MDIO_CLAUSE22_OPCODE_READ_MASK) |
6349 (I40E_MDIO_CLAUSE22_STCODE_MASK) |
6350 (I40E_GLGEN_MSCA_MDICMD_MASK);
6351 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6353 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6354 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6355 status = I40E_SUCCESS;
6358 i40e_usec_delay(10);
6363 i40e_debug(hw, I40E_DEBUG_PHY,
6364 "PHY: Can't write command to external PHY.\n");
6366 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6367 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6368 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6375 * i40e_write_phy_register_clause22
6376 * @hw: pointer to the HW structure
6377 * @reg: register address in the page
6378 * @phy_adr: PHY address on MDIO interface
6379 * @value: PHY register value
6381 * Writes specified PHY register value
6383 enum i40e_status_code i40e_write_phy_register_clause22(struct i40e_hw *hw,
6384 u16 reg, u8 phy_addr, u16 value)
6386 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6387 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6391 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6392 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6394 command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6395 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6396 (I40E_MDIO_CLAUSE22_OPCODE_WRITE_MASK) |
6397 (I40E_MDIO_CLAUSE22_STCODE_MASK) |
6398 (I40E_GLGEN_MSCA_MDICMD_MASK);
6400 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6402 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6403 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6404 status = I40E_SUCCESS;
6407 i40e_usec_delay(10);
6415 * i40e_read_phy_register_clause45
6416 * @hw: pointer to the HW structure
6417 * @page: registers page number
6418 * @reg: register address in the page
6419 * @phy_adr: PHY address on MDIO interface
6420 * @value: PHY register value
6422 * Reads specified PHY register value
6424 enum i40e_status_code i40e_read_phy_register_clause45(struct i40e_hw *hw,
6425 u8 page, u16 reg, u8 phy_addr, u16 *value)
6427 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6430 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6432 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6433 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6434 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6435 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6436 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6437 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6438 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6439 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6441 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6442 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6443 status = I40E_SUCCESS;
6446 i40e_usec_delay(10);
6451 i40e_debug(hw, I40E_DEBUG_PHY,
6452 "PHY: Can't write command to external PHY.\n");
6456 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6457 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6458 (I40E_MDIO_CLAUSE45_OPCODE_READ_MASK) |
6459 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6460 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6461 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6462 status = I40E_ERR_TIMEOUT;
6464 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6466 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6467 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6468 status = I40E_SUCCESS;
6471 i40e_usec_delay(10);
6476 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6477 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6478 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6480 i40e_debug(hw, I40E_DEBUG_PHY,
6481 "PHY: Can't read register value from external PHY.\n");
6489 * i40e_write_phy_register_clause45
6490 * @hw: pointer to the HW structure
6491 * @page: registers page number
6492 * @reg: register address in the page
6493 * @phy_adr: PHY address on MDIO interface
6494 * @value: PHY register value
6496 * Writes value to specified PHY register
6498 enum i40e_status_code i40e_write_phy_register_clause45(struct i40e_hw *hw,
6499 u8 page, u16 reg, u8 phy_addr, u16 value)
6501 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6504 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6506 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6507 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6508 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6509 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6510 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6511 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6512 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6513 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6515 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6516 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6517 status = I40E_SUCCESS;
6520 i40e_usec_delay(10);
6524 i40e_debug(hw, I40E_DEBUG_PHY,
6525 "PHY: Can't write command to external PHY.\n");
6529 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6530 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6532 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6533 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6534 (I40E_MDIO_CLAUSE45_OPCODE_WRITE_MASK) |
6535 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6536 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6537 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6538 status = I40E_ERR_TIMEOUT;
6540 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6542 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6543 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6544 status = I40E_SUCCESS;
6547 i40e_usec_delay(10);
6556 * i40e_write_phy_register
6557 * @hw: pointer to the HW structure
6558 * @page: registers page number
6559 * @reg: register address in the page
6560 * @phy_adr: PHY address on MDIO interface
6561 * @value: PHY register value
6563 * Writes value to specified PHY register
6565 enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
6566 u8 page, u16 reg, u8 phy_addr, u16 value)
6568 enum i40e_status_code status;
6570 switch (hw->device_id) {
6571 case I40E_DEV_ID_1G_BASE_T_X722:
6572 status = i40e_write_phy_register_clause22(hw,
6573 reg, phy_addr, value);
6575 case I40E_DEV_ID_10G_BASE_T:
6576 case I40E_DEV_ID_10G_BASE_T4:
6577 case I40E_DEV_ID_10G_BASE_T_X722:
6578 case I40E_DEV_ID_25G_B:
6579 case I40E_DEV_ID_25G_SFP28:
6580 status = i40e_write_phy_register_clause45(hw,
6581 page, reg, phy_addr, value);
6584 status = I40E_ERR_UNKNOWN_PHY;
6592 * i40e_read_phy_register
6593 * @hw: pointer to the HW structure
6594 * @page: registers page number
6595 * @reg: register address in the page
6596 * @phy_adr: PHY address on MDIO interface
6597 * @value: PHY register value
6599 * Reads specified PHY register value
6601 enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
6602 u8 page, u16 reg, u8 phy_addr, u16 *value)
6604 enum i40e_status_code status;
6606 switch (hw->device_id) {
6607 case I40E_DEV_ID_1G_BASE_T_X722:
6608 status = i40e_read_phy_register_clause22(hw, reg, phy_addr,
6611 case I40E_DEV_ID_10G_BASE_T:
6612 case I40E_DEV_ID_10G_BASE_T4:
6613 case I40E_DEV_ID_10G_BASE_T_X722:
6614 case I40E_DEV_ID_25G_B:
6615 case I40E_DEV_ID_25G_SFP28:
6616 status = i40e_read_phy_register_clause45(hw, page, reg,
6620 status = I40E_ERR_UNKNOWN_PHY;
6628 * i40e_get_phy_address
6629 * @hw: pointer to the HW structure
6630 * @dev_num: PHY port num that address we want
6631 * @phy_addr: Returned PHY address
6633 * Gets PHY address for current port
6635 u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num)
6637 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6638 u32 reg_val = rd32(hw, I40E_GLGEN_MDIO_I2C_SEL(port_num));
6640 return (u8)(reg_val >> ((dev_num + 1) * 5)) & 0x1f;
6644 * i40e_blink_phy_led
6645 * @hw: pointer to the HW structure
6646 * @time: time how long led will blinks in secs
6647 * @interval: gap between LED on and off in msecs
6649 * Blinks PHY link LED
6651 enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
6652 u32 time, u32 interval)
6654 enum i40e_status_code status = I40E_SUCCESS;
6659 u16 led_addr = I40E_PHY_LED_PROV_REG_1;
6663 i = rd32(hw, I40E_PFGEN_PORTNUM);
6664 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6665 phy_addr = i40e_get_phy_address(hw, port_num);
6667 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6669 status = i40e_read_phy_register_clause45(hw,
6670 I40E_PHY_COM_REG_PAGE,
6674 goto phy_blinking_end;
6676 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6678 status = i40e_write_phy_register_clause45(hw,
6679 I40E_PHY_COM_REG_PAGE,
6683 goto phy_blinking_end;
6688 if (time > 0 && interval > 0) {
6689 for (i = 0; i < time * 1000; i += interval) {
6690 status = i40e_read_phy_register_clause45(hw,
6691 I40E_PHY_COM_REG_PAGE,
6692 led_addr, phy_addr, &led_reg);
6694 goto restore_config;
6695 if (led_reg & I40E_PHY_LED_MANUAL_ON)
6698 led_reg = I40E_PHY_LED_MANUAL_ON;
6699 status = i40e_write_phy_register_clause45(hw,
6700 I40E_PHY_COM_REG_PAGE,
6701 led_addr, phy_addr, led_reg);
6703 goto restore_config;
6704 i40e_msec_delay(interval);
6709 status = i40e_write_phy_register_clause45(hw,
6710 I40E_PHY_COM_REG_PAGE,
6711 led_addr, phy_addr, led_ctl);
6718 * i40e_led_get_reg - read LED register
6719 * @hw: pointer to the HW structure
6720 * @led_addr: LED register address
6721 * @reg_val: read register value
6723 static enum i40e_status_code i40e_led_get_reg(struct i40e_hw *hw, u16 led_addr,
6726 enum i40e_status_code status;
6730 if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6731 status = i40e_aq_get_phy_register(hw,
6732 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6733 I40E_PHY_COM_REG_PAGE,
6734 I40E_PHY_LED_PROV_REG_1,
6737 phy_addr = i40e_get_phy_address(hw, hw->port);
6738 status = i40e_read_phy_register_clause45(hw,
6739 I40E_PHY_COM_REG_PAGE,
6747 * i40e_led_set_reg - write LED register
6748 * @hw: pointer to the HW structure
6749 * @led_addr: LED register address
6750 * @reg_val: register value to write
6752 static enum i40e_status_code i40e_led_set_reg(struct i40e_hw *hw, u16 led_addr,
6755 enum i40e_status_code status;
6758 if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6759 status = i40e_aq_set_phy_register(hw,
6760 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6761 I40E_PHY_COM_REG_PAGE,
6762 I40E_PHY_LED_PROV_REG_1,
6765 phy_addr = i40e_get_phy_address(hw, hw->port);
6766 status = i40e_write_phy_register_clause45(hw,
6767 I40E_PHY_COM_REG_PAGE,
6776 * i40e_led_get_phy - return current on/off mode
6777 * @hw: pointer to the hw struct
6778 * @led_addr: address of led register to use
6779 * @val: original value of register to use
6782 enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
6785 enum i40e_status_code status = I40E_SUCCESS;
6792 if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6793 status = i40e_aq_get_phy_register(hw,
6794 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6795 I40E_PHY_COM_REG_PAGE,
6796 I40E_PHY_LED_PROV_REG_1,
6798 if (status == I40E_SUCCESS)
6799 *val = (u16)reg_val_aq;
6802 temp_addr = I40E_PHY_LED_PROV_REG_1;
6803 phy_addr = i40e_get_phy_address(hw, hw->port);
6804 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6806 status = i40e_read_phy_register_clause45(hw,
6807 I40E_PHY_COM_REG_PAGE,
6808 temp_addr, phy_addr,
6813 if (reg_val & I40E_PHY_LED_LINK_MODE_MASK) {
6814 *led_addr = temp_addr;
6823 * @hw: pointer to the HW structure
6824 * @on: true or false
6825 * @mode: original val plus bit for set or ignore
6826 * Set led's on or off when controlled by the PHY
6829 enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
6830 u16 led_addr, u32 mode)
6832 enum i40e_status_code status = I40E_SUCCESS;
6836 status = i40e_led_get_reg(hw, led_addr, &led_reg);
6840 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6842 status = i40e_led_set_reg(hw, led_addr, led_reg);
6846 status = i40e_led_get_reg(hw, led_addr, &led_reg);
6848 goto restore_config;
6850 led_reg = I40E_PHY_LED_MANUAL_ON;
6853 status = i40e_led_set_reg(hw, led_addr, led_reg);
6855 goto restore_config;
6856 if (mode & I40E_PHY_LED_MODE_ORIG) {
6857 led_ctl = (mode & I40E_PHY_LED_MODE_MASK);
6858 status = i40e_led_set_reg(hw, led_addr, led_ctl);
6863 status = i40e_led_set_reg(hw, led_addr, led_ctl);
6866 #endif /* PF_DRIVER */
6869 * i40e_aq_rx_ctl_read_register - use FW to read from an Rx control register
6870 * @hw: pointer to the hw struct
6871 * @reg_addr: register address
6872 * @reg_val: ptr to register value
6873 * @cmd_details: pointer to command details structure or NULL
6875 * Use the firmware to read the Rx control register,
6876 * especially useful if the Rx unit is under heavy pressure
6878 enum i40e_status_code i40e_aq_rx_ctl_read_register(struct i40e_hw *hw,
6879 u32 reg_addr, u32 *reg_val,
6880 struct i40e_asq_cmd_details *cmd_details)
6882 struct i40e_aq_desc desc;
6883 struct i40e_aqc_rx_ctl_reg_read_write *cmd_resp =
6884 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6885 enum i40e_status_code status;
6887 if (reg_val == NULL)
6888 return I40E_ERR_PARAM;
6890 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_read);
6892 cmd_resp->address = CPU_TO_LE32(reg_addr);
6894 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6896 if (status == I40E_SUCCESS)
6897 *reg_val = LE32_TO_CPU(cmd_resp->value);
6903 * i40e_read_rx_ctl - read from an Rx control register
6904 * @hw: pointer to the hw struct
6905 * @reg_addr: register address
6907 u32 i40e_read_rx_ctl(struct i40e_hw *hw, u32 reg_addr)
6909 enum i40e_status_code status = I40E_SUCCESS;
6914 use_register = (((hw->aq.api_maj_ver == 1) &&
6915 (hw->aq.api_min_ver < 5)) ||
6916 (hw->mac.type == I40E_MAC_X722));
6917 if (!use_register) {
6919 status = i40e_aq_rx_ctl_read_register(hw, reg_addr, &val, NULL);
6920 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6927 /* if the AQ access failed, try the old-fashioned way */
6928 if (status || use_register)
6929 val = rd32(hw, reg_addr);
6935 * i40e_aq_rx_ctl_write_register
6936 * @hw: pointer to the hw struct
6937 * @reg_addr: register address
6938 * @reg_val: register value
6939 * @cmd_details: pointer to command details structure or NULL
6941 * Use the firmware to write to an Rx control register,
6942 * especially useful if the Rx unit is under heavy pressure
6944 enum i40e_status_code i40e_aq_rx_ctl_write_register(struct i40e_hw *hw,
6945 u32 reg_addr, u32 reg_val,
6946 struct i40e_asq_cmd_details *cmd_details)
6948 struct i40e_aq_desc desc;
6949 struct i40e_aqc_rx_ctl_reg_read_write *cmd =
6950 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6951 enum i40e_status_code status;
6953 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_write);
6955 cmd->address = CPU_TO_LE32(reg_addr);
6956 cmd->value = CPU_TO_LE32(reg_val);
6958 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6964 * i40e_write_rx_ctl - write to an Rx control register
6965 * @hw: pointer to the hw struct
6966 * @reg_addr: register address
6967 * @reg_val: register value
6969 void i40e_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val)
6971 enum i40e_status_code status = I40E_SUCCESS;
6975 use_register = (((hw->aq.api_maj_ver == 1) &&
6976 (hw->aq.api_min_ver < 5)) ||
6977 (hw->mac.type == I40E_MAC_X722));
6978 if (!use_register) {
6980 status = i40e_aq_rx_ctl_write_register(hw, reg_addr,
6982 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6989 /* if the AQ access failed, try the old-fashioned way */
6990 if (status || use_register)
6991 wr32(hw, reg_addr, reg_val);
6995 * i40e_aq_set_phy_register
6996 * @hw: pointer to the hw struct
6997 * @phy_select: select which phy should be accessed
6998 * @dev_addr: PHY device address
6999 * @reg_addr: PHY register address
7000 * @reg_val: new register value
7001 * @cmd_details: pointer to command details structure or NULL
7003 * Write the external PHY register.
7005 enum i40e_status_code i40e_aq_set_phy_register(struct i40e_hw *hw,
7006 u8 phy_select, u8 dev_addr,
7007 u32 reg_addr, u32 reg_val,
7008 struct i40e_asq_cmd_details *cmd_details)
7010 struct i40e_aq_desc desc;
7011 struct i40e_aqc_phy_register_access *cmd =
7012 (struct i40e_aqc_phy_register_access *)&desc.params.raw;
7013 enum i40e_status_code status;
7015 i40e_fill_default_direct_cmd_desc(&desc,
7016 i40e_aqc_opc_set_phy_register);
7018 cmd->phy_interface = phy_select;
7019 cmd->dev_addres = dev_addr;
7020 cmd->reg_address = CPU_TO_LE32(reg_addr);
7021 cmd->reg_value = CPU_TO_LE32(reg_val);
7023 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7029 * i40e_aq_get_phy_register
7030 * @hw: pointer to the hw struct
7031 * @phy_select: select which phy should be accessed
7032 * @dev_addr: PHY device address
7033 * @reg_addr: PHY register address
7034 * @reg_val: read register value
7035 * @cmd_details: pointer to command details structure or NULL
7037 * Read the external PHY register.
7039 enum i40e_status_code i40e_aq_get_phy_register(struct i40e_hw *hw,
7040 u8 phy_select, u8 dev_addr,
7041 u32 reg_addr, u32 *reg_val,
7042 struct i40e_asq_cmd_details *cmd_details)
7044 struct i40e_aq_desc desc;
7045 struct i40e_aqc_phy_register_access *cmd =
7046 (struct i40e_aqc_phy_register_access *)&desc.params.raw;
7047 enum i40e_status_code status;
7049 i40e_fill_default_direct_cmd_desc(&desc,
7050 i40e_aqc_opc_get_phy_register);
7052 cmd->phy_interface = phy_select;
7053 cmd->dev_addres = dev_addr;
7054 cmd->reg_address = CPU_TO_LE32(reg_addr);
7056 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7058 *reg_val = LE32_TO_CPU(cmd->reg_value);
7066 * i40e_aq_send_msg_to_pf
7067 * @hw: pointer to the hardware structure
7068 * @v_opcode: opcodes for VF-PF communication
7069 * @v_retval: return error code
7070 * @msg: pointer to the msg buffer
7071 * @msglen: msg length
7072 * @cmd_details: pointer to command details
7074 * Send message to PF driver using admin queue. By default, this message
7075 * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for
7076 * completion before returning.
7078 enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
7079 enum virtchnl_ops v_opcode,
7080 enum i40e_status_code v_retval,
7081 u8 *msg, u16 msglen,
7082 struct i40e_asq_cmd_details *cmd_details)
7084 struct i40e_aq_desc desc;
7085 struct i40e_asq_cmd_details details;
7086 enum i40e_status_code status;
7088 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
7089 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
7090 desc.cookie_high = CPU_TO_LE32(v_opcode);
7091 desc.cookie_low = CPU_TO_LE32(v_retval);
7093 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF
7094 | I40E_AQ_FLAG_RD));
7095 if (msglen > I40E_AQ_LARGE_BUF)
7096 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7097 desc.datalen = CPU_TO_LE16(msglen);
7100 i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM);
7101 details.async = true;
7102 cmd_details = &details;
7104 status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg,
7105 msglen, cmd_details);
7110 * i40e_vf_parse_hw_config
7111 * @hw: pointer to the hardware structure
7112 * @msg: pointer to the virtual channel VF resource structure
7114 * Given a VF resource message from the PF, populate the hw struct
7115 * with appropriate information.
7117 void i40e_vf_parse_hw_config(struct i40e_hw *hw,
7118 struct virtchnl_vf_resource *msg)
7120 struct virtchnl_vsi_resource *vsi_res;
7123 vsi_res = &msg->vsi_res[0];
7125 hw->dev_caps.num_vsis = msg->num_vsis;
7126 hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
7127 hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
7128 hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
7129 hw->dev_caps.dcb = msg->vf_offload_flags &
7130 VIRTCHNL_VF_OFFLOAD_L2;
7131 hw->dev_caps.iwarp = (msg->vf_offload_flags &
7132 VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0;
7133 for (i = 0; i < msg->num_vsis; i++) {
7134 if (vsi_res->vsi_type == VIRTCHNL_VSI_SRIOV) {
7135 i40e_memcpy(hw->mac.perm_addr,
7136 vsi_res->default_mac_addr,
7138 I40E_NONDMA_TO_NONDMA);
7139 i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
7141 I40E_NONDMA_TO_NONDMA);
7149 * @hw: pointer to the hardware structure
7151 * Send a VF_RESET message to the PF. Does not wait for response from PF
7152 * as none will be forthcoming. Immediately after calling this function,
7153 * the admin queue should be shut down and (optionally) reinitialized.
7155 enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw)
7157 return i40e_aq_send_msg_to_pf(hw, VIRTCHNL_OP_RESET_VF,
7158 I40E_SUCCESS, NULL, 0, NULL);
7160 #endif /* VF_DRIVER */
7163 * i40e_aq_set_arp_proxy_config
7164 * @hw: pointer to the HW structure
7165 * @proxy_config - pointer to proxy config command table struct
7166 * @cmd_details: pointer to command details
7168 * Set ARP offload parameters from pre-populated
7169 * i40e_aqc_arp_proxy_data struct
7171 enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
7172 struct i40e_aqc_arp_proxy_data *proxy_config,
7173 struct i40e_asq_cmd_details *cmd_details)
7175 struct i40e_aq_desc desc;
7176 enum i40e_status_code status;
7179 return I40E_ERR_PARAM;
7181 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_proxy_config);
7183 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7184 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7185 desc.params.external.addr_high =
7186 CPU_TO_LE32(I40E_HI_DWORD((u64)proxy_config));
7187 desc.params.external.addr_low =
7188 CPU_TO_LE32(I40E_LO_DWORD((u64)proxy_config));
7189 desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_arp_proxy_data));
7191 status = i40e_asq_send_command(hw, &desc, proxy_config,
7192 sizeof(struct i40e_aqc_arp_proxy_data),
7199 * i40e_aq_opc_set_ns_proxy_table_entry
7200 * @hw: pointer to the HW structure
7201 * @ns_proxy_table_entry: pointer to NS table entry command struct
7202 * @cmd_details: pointer to command details
7204 * Set IPv6 Neighbor Solicitation (NS) protocol offload parameters
7205 * from pre-populated i40e_aqc_ns_proxy_data struct
7207 enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
7208 struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
7209 struct i40e_asq_cmd_details *cmd_details)
7211 struct i40e_aq_desc desc;
7212 enum i40e_status_code status;
7214 if (!ns_proxy_table_entry)
7215 return I40E_ERR_PARAM;
7217 i40e_fill_default_direct_cmd_desc(&desc,
7218 i40e_aqc_opc_set_ns_proxy_table_entry);
7220 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7221 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7222 desc.params.external.addr_high =
7223 CPU_TO_LE32(I40E_HI_DWORD((u64)ns_proxy_table_entry));
7224 desc.params.external.addr_low =
7225 CPU_TO_LE32(I40E_LO_DWORD((u64)ns_proxy_table_entry));
7226 desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_ns_proxy_data));
7228 status = i40e_asq_send_command(hw, &desc, ns_proxy_table_entry,
7229 sizeof(struct i40e_aqc_ns_proxy_data),
7236 * i40e_aq_set_clear_wol_filter
7237 * @hw: pointer to the hw struct
7238 * @filter_index: index of filter to modify (0-7)
7239 * @filter: buffer containing filter to be set
7240 * @set_filter: true to set filter, false to clear filter
7241 * @no_wol_tco: if true, pass through packets cannot cause wake-up
7242 * if false, pass through packets may cause wake-up
7243 * @filter_valid: true if filter action is valid
7244 * @no_wol_tco_valid: true if no WoL in TCO traffic action valid
7245 * @cmd_details: pointer to command details structure or NULL
7247 * Set or clear WoL filter for port attached to the PF
7249 enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
7251 struct i40e_aqc_set_wol_filter_data *filter,
7252 bool set_filter, bool no_wol_tco,
7253 bool filter_valid, bool no_wol_tco_valid,
7254 struct i40e_asq_cmd_details *cmd_details)
7256 struct i40e_aq_desc desc;
7257 struct i40e_aqc_set_wol_filter *cmd =
7258 (struct i40e_aqc_set_wol_filter *)&desc.params.raw;
7259 enum i40e_status_code status;
7261 u16 valid_flags = 0;
7264 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_wol_filter);
7266 if (filter_index >= I40E_AQC_MAX_NUM_WOL_FILTERS)
7267 return I40E_ERR_PARAM;
7268 cmd->filter_index = CPU_TO_LE16(filter_index);
7272 return I40E_ERR_PARAM;
7274 cmd_flags |= I40E_AQC_SET_WOL_FILTER;
7275 cmd_flags |= I40E_AQC_SET_WOL_FILTER_WOL_PRESERVE_ON_PFR;
7279 cmd_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL;
7280 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
7283 valid_flags |= I40E_AQC_SET_WOL_FILTER_ACTION_VALID;
7284 if (no_wol_tco_valid)
7285 valid_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID;
7286 cmd->valid_flags = CPU_TO_LE16(valid_flags);
7288 buff_len = sizeof(*filter);
7289 desc.datalen = CPU_TO_LE16(buff_len);
7291 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7292 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7294 cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)filter));
7295 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)filter));
7297 status = i40e_asq_send_command(hw, &desc, filter,
7298 buff_len, cmd_details);
7304 * i40e_aq_get_wake_event_reason
7305 * @hw: pointer to the hw struct
7306 * @wake_reason: return value, index of matching filter
7307 * @cmd_details: pointer to command details structure or NULL
7309 * Get information for the reason of a Wake Up event
7311 enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
7313 struct i40e_asq_cmd_details *cmd_details)
7315 struct i40e_aq_desc desc;
7316 struct i40e_aqc_get_wake_reason_completion *resp =
7317 (struct i40e_aqc_get_wake_reason_completion *)&desc.params.raw;
7318 enum i40e_status_code status;
7320 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_wake_reason);
7322 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7324 if (status == I40E_SUCCESS)
7325 *wake_reason = LE16_TO_CPU(resp->wake_reason);
7331 * i40e_aq_clear_all_wol_filters
7332 * @hw: pointer to the hw struct
7333 * @cmd_details: pointer to command details structure or NULL
7335 * Get information for the reason of a Wake Up event
7337 enum i40e_status_code i40e_aq_clear_all_wol_filters(struct i40e_hw *hw,
7338 struct i40e_asq_cmd_details *cmd_details)
7340 struct i40e_aq_desc desc;
7341 enum i40e_status_code status;
7343 i40e_fill_default_direct_cmd_desc(&desc,
7344 i40e_aqc_opc_clear_all_wol_filters);
7346 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7353 * i40e_aq_write_ddp - Write dynamic device personalization (ddp)
7354 * @hw: pointer to the hw struct
7355 * @buff: command buffer (size in bytes = buff_size)
7356 * @buff_size: buffer size in bytes
7357 * @track_id: package tracking id
7358 * @error_offset: returns error offset
7359 * @error_info: returns error information
7360 * @cmd_details: pointer to command details structure or NULL
7363 i40e_status_code i40e_aq_write_ddp(struct i40e_hw *hw, void *buff,
7364 u16 buff_size, u32 track_id,
7365 u32 *error_offset, u32 *error_info,
7366 struct i40e_asq_cmd_details *cmd_details)
7368 struct i40e_aq_desc desc;
7369 struct i40e_aqc_write_personalization_profile *cmd =
7370 (struct i40e_aqc_write_personalization_profile *)
7372 struct i40e_aqc_write_ddp_resp *resp;
7373 enum i40e_status_code status;
7375 i40e_fill_default_direct_cmd_desc(&desc,
7376 i40e_aqc_opc_write_personalization_profile);
7378 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
7379 if (buff_size > I40E_AQ_LARGE_BUF)
7380 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7382 desc.datalen = CPU_TO_LE16(buff_size);
7384 cmd->profile_track_id = CPU_TO_LE32(track_id);
7386 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
7388 resp = (struct i40e_aqc_write_ddp_resp *)&desc.params.raw;
7390 *error_offset = LE32_TO_CPU(resp->error_offset);
7392 *error_info = LE32_TO_CPU(resp->error_info);
7399 * i40e_aq_get_ddp_list - Read dynamic device personalization (ddp)
7400 * @hw: pointer to the hw struct
7401 * @buff: command buffer (size in bytes = buff_size)
7402 * @buff_size: buffer size in bytes
7403 * @cmd_details: pointer to command details structure or NULL
7406 i40e_status_code i40e_aq_get_ddp_list(struct i40e_hw *hw, void *buff,
7407 u16 buff_size, u8 flags,
7408 struct i40e_asq_cmd_details *cmd_details)
7410 struct i40e_aq_desc desc;
7411 struct i40e_aqc_get_applied_profiles *cmd =
7412 (struct i40e_aqc_get_applied_profiles *)&desc.params.raw;
7413 enum i40e_status_code status;
7415 i40e_fill_default_direct_cmd_desc(&desc,
7416 i40e_aqc_opc_get_personalization_profile_list);
7418 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7419 if (buff_size > I40E_AQ_LARGE_BUF)
7420 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7421 desc.datalen = CPU_TO_LE16(buff_size);
7425 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
7431 * i40e_find_segment_in_package
7432 * @segment_type: the segment type to search for (i.e., SEGMENT_TYPE_I40E)
7433 * @pkg_hdr: pointer to the package header to be searched
7435 * This function searches a package file for a particular segment type. On
7436 * success it returns a pointer to the segment header, otherwise it will
7439 struct i40e_generic_seg_header *
7440 i40e_find_segment_in_package(u32 segment_type,
7441 struct i40e_package_header *pkg_hdr)
7443 struct i40e_generic_seg_header *segment;
7446 /* Search all package segments for the requested segment type */
7447 for (i = 0; i < pkg_hdr->segment_count; i++) {
7449 (struct i40e_generic_seg_header *)((u8 *)pkg_hdr +
7450 pkg_hdr->segment_offset[i]);
7452 if (segment->type == segment_type)
7459 /* Get section table in profile */
7460 #define I40E_SECTION_TABLE(profile, sec_tbl) \
7462 struct i40e_profile_segment *p = (profile); \
7465 count = p->device_table_count; \
7466 nvm = (u32 *)&p->device_table[count]; \
7467 sec_tbl = (struct i40e_section_table *)&nvm[nvm[0] + 1]; \
7470 /* Get section header in profile */
7471 #define I40E_SECTION_HEADER(profile, offset) \
7472 (struct i40e_profile_section_header *)((u8 *)(profile) + (offset))
7475 * i40e_find_section_in_profile
7476 * @section_type: the section type to search for (i.e., SECTION_TYPE_NOTE)
7477 * @profile: pointer to the i40e segment header to be searched
7479 * This function searches i40e segment for a particular section type. On
7480 * success it returns a pointer to the section header, otherwise it will
7483 struct i40e_profile_section_header *
7484 i40e_find_section_in_profile(u32 section_type,
7485 struct i40e_profile_segment *profile)
7487 struct i40e_profile_section_header *sec;
7488 struct i40e_section_table *sec_tbl;
7492 if (profile->header.type != SEGMENT_TYPE_I40E)
7495 I40E_SECTION_TABLE(profile, sec_tbl);
7497 for (i = 0; i < sec_tbl->section_count; i++) {
7498 sec_off = sec_tbl->section_offset[i];
7499 sec = I40E_SECTION_HEADER(profile, sec_off);
7500 if (sec->section.type == section_type)
7508 * i40e_ddp_exec_aq_section - Execute generic AQ for DDP
7509 * @hw: pointer to the hw struct
7510 * @aq: command buffer containing all data to execute AQ
7513 i40e_status_code i40e_ddp_exec_aq_section(struct i40e_hw *hw,
7514 struct i40e_profile_aq_section *aq)
7516 enum i40e_status_code status;
7517 struct i40e_aq_desc desc;
7521 i40e_fill_default_direct_cmd_desc(&desc, aq->opcode);
7522 desc.flags |= CPU_TO_LE16(aq->flags);
7523 i40e_memcpy(desc.params.raw, aq->param, sizeof(desc.params.raw),
7524 I40E_NONDMA_TO_NONDMA);
7526 msglen = aq->datalen;
7528 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
7530 if (msglen > I40E_AQ_LARGE_BUF)
7531 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7532 desc.datalen = CPU_TO_LE16(msglen);
7536 status = i40e_asq_send_command(hw, &desc, msg, msglen, NULL);
7538 if (status != I40E_SUCCESS) {
7539 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7540 "unable to exec DDP AQ opcode %u, error %d\n",
7541 aq->opcode, status);
7545 /* copy returned desc to aq_buf */
7546 i40e_memcpy(aq->param, desc.params.raw, sizeof(desc.params.raw),
7547 I40E_NONDMA_TO_NONDMA);
7549 return I40E_SUCCESS;
7553 * i40e_validate_profile
7554 * @hw: pointer to the hardware structure
7555 * @profile: pointer to the profile segment of the package to be validated
7556 * @track_id: package tracking id
7557 * @rollback: flag if the profile is for rollback.
7559 * Validates supported devices and profile's sections.
7561 STATIC enum i40e_status_code
7562 i40e_validate_profile(struct i40e_hw *hw, struct i40e_profile_segment *profile,
7563 u32 track_id, bool rollback)
7565 struct i40e_profile_section_header *sec = NULL;
7566 enum i40e_status_code status = I40E_SUCCESS;
7567 struct i40e_section_table *sec_tbl;
7573 if (track_id == I40E_DDP_TRACKID_INVALID) {
7574 i40e_debug(hw, I40E_DEBUG_PACKAGE, "Invalid track_id\n");
7575 return I40E_NOT_SUPPORTED;
7578 dev_cnt = profile->device_table_count;
7579 for (i = 0; i < dev_cnt; i++) {
7580 vendor_dev_id = profile->device_table[i].vendor_dev_id;
7581 if ((vendor_dev_id >> 16) == I40E_INTEL_VENDOR_ID &&
7582 hw->device_id == (vendor_dev_id & 0xFFFF))
7585 if (dev_cnt && (i == dev_cnt)) {
7586 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7587 "Device doesn't support DDP\n");
7588 return I40E_ERR_DEVICE_NOT_SUPPORTED;
7591 I40E_SECTION_TABLE(profile, sec_tbl);
7593 /* Validate sections types */
7594 for (i = 0; i < sec_tbl->section_count; i++) {
7595 sec_off = sec_tbl->section_offset[i];
7596 sec = I40E_SECTION_HEADER(profile, sec_off);
7598 if (sec->section.type == SECTION_TYPE_MMIO ||
7599 sec->section.type == SECTION_TYPE_AQ ||
7600 sec->section.type == SECTION_TYPE_RB_AQ) {
7601 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7602 "Not a roll-back package\n");
7603 return I40E_NOT_SUPPORTED;
7606 if (sec->section.type == SECTION_TYPE_RB_AQ ||
7607 sec->section.type == SECTION_TYPE_RB_MMIO) {
7608 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7609 "Not an original package\n");
7610 return I40E_NOT_SUPPORTED;
7619 * i40e_write_profile
7620 * @hw: pointer to the hardware structure
7621 * @profile: pointer to the profile segment of the package to be downloaded
7622 * @track_id: package tracking id
7624 * Handles the download of a complete package.
7626 enum i40e_status_code
7627 i40e_write_profile(struct i40e_hw *hw, struct i40e_profile_segment *profile,
7630 enum i40e_status_code status = I40E_SUCCESS;
7631 struct i40e_section_table *sec_tbl;
7632 struct i40e_profile_section_header *sec = NULL;
7633 struct i40e_profile_aq_section *ddp_aq;
7634 u32 section_size = 0;
7635 u32 offset = 0, info = 0;
7639 status = i40e_validate_profile(hw, profile, track_id, false);
7643 I40E_SECTION_TABLE(profile, sec_tbl);
7645 for (i = 0; i < sec_tbl->section_count; i++) {
7646 sec_off = sec_tbl->section_offset[i];
7647 sec = I40E_SECTION_HEADER(profile, sec_off);
7648 /* Process generic admin command */
7649 if (sec->section.type == SECTION_TYPE_AQ) {
7650 ddp_aq = (struct i40e_profile_aq_section *)&sec[1];
7651 status = i40e_ddp_exec_aq_section(hw, ddp_aq);
7653 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7654 "Failed to execute aq: section %d, opcode %u\n",
7658 sec->section.type = SECTION_TYPE_RB_AQ;
7661 /* Skip any non-mmio sections */
7662 if (sec->section.type != SECTION_TYPE_MMIO)
7665 section_size = sec->section.size +
7666 sizeof(struct i40e_profile_section_header);
7668 /* Write MMIO section */
7669 status = i40e_aq_write_ddp(hw, (void *)sec, (u16)section_size,
7670 track_id, &offset, &info, NULL);
7672 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7673 "Failed to write profile: section %d, offset %d, info %d\n",
7682 * i40e_rollback_profile
7683 * @hw: pointer to the hardware structure
7684 * @profile: pointer to the profile segment of the package to be removed
7685 * @track_id: package tracking id
7687 * Rolls back previously loaded package.
7689 enum i40e_status_code
7690 i40e_rollback_profile(struct i40e_hw *hw, struct i40e_profile_segment *profile,
7693 struct i40e_profile_section_header *sec = NULL;
7694 enum i40e_status_code status = I40E_SUCCESS;
7695 struct i40e_section_table *sec_tbl;
7696 u32 offset = 0, info = 0;
7697 u32 section_size = 0;
7701 status = i40e_validate_profile(hw, profile, track_id, true);
7705 I40E_SECTION_TABLE(profile, sec_tbl);
7707 /* For rollback write sections in reverse */
7708 for (i = sec_tbl->section_count - 1; i >= 0; i--) {
7709 sec_off = sec_tbl->section_offset[i];
7710 sec = I40E_SECTION_HEADER(profile, sec_off);
7712 /* Skip any non-rollback sections */
7713 if (sec->section.type != SECTION_TYPE_RB_MMIO)
7716 section_size = sec->section.size +
7717 sizeof(struct i40e_profile_section_header);
7719 /* Write roll-back MMIO section */
7720 status = i40e_aq_write_ddp(hw, (void *)sec, (u16)section_size,
7721 track_id, &offset, &info, NULL);
7723 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7724 "Failed to write profile: section %d, offset %d, info %d\n",
7733 * i40e_add_pinfo_to_list
7734 * @hw: pointer to the hardware structure
7735 * @profile: pointer to the profile segment of the package
7736 * @profile_info_sec: buffer for information section
7737 * @track_id: package tracking id
7739 * Register a profile to the list of loaded profiles.
7741 enum i40e_status_code
7742 i40e_add_pinfo_to_list(struct i40e_hw *hw,
7743 struct i40e_profile_segment *profile,
7744 u8 *profile_info_sec, u32 track_id)
7746 enum i40e_status_code status = I40E_SUCCESS;
7747 struct i40e_profile_section_header *sec = NULL;
7748 struct i40e_profile_info *pinfo;
7749 u32 offset = 0, info = 0;
7751 sec = (struct i40e_profile_section_header *)profile_info_sec;
7753 sec->data_end = sizeof(struct i40e_profile_section_header) +
7754 sizeof(struct i40e_profile_info);
7755 sec->section.type = SECTION_TYPE_INFO;
7756 sec->section.offset = sizeof(struct i40e_profile_section_header);
7757 sec->section.size = sizeof(struct i40e_profile_info);
7758 pinfo = (struct i40e_profile_info *)(profile_info_sec +
7759 sec->section.offset);
7760 pinfo->track_id = track_id;
7761 pinfo->version = profile->version;
7762 pinfo->op = I40E_DDP_ADD_TRACKID;
7763 i40e_memcpy(pinfo->name, profile->name, I40E_DDP_NAME_SIZE,
7764 I40E_NONDMA_TO_NONDMA);
7766 status = i40e_aq_write_ddp(hw, (void *)sec, sec->data_end,
7767 track_id, &offset, &info, NULL);