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 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
1681 return I40E_ERR_PARAM;
1683 i40e_fill_default_direct_cmd_desc(&desc,
1684 i40e_aqc_opc_get_phy_abilities);
1686 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1687 if (abilities_size > I40E_AQ_LARGE_BUF)
1688 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1690 if (qualified_modules)
1691 desc.params.external.param0 |=
1692 CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
1695 desc.params.external.param0 |=
1696 CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
1698 status = i40e_asq_send_command(hw, &desc, abilities, abilities_size,
1701 if (hw->aq.asq_last_status == I40E_AQ_RC_EIO)
1702 status = I40E_ERR_UNKNOWN_PHY;
1705 if (hw->mac.type == I40E_MAC_XL710 &&
1706 hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&
1707 hw->aq.api_min_ver >= I40E_MINOR_VER_GET_LINK_INFO_XL710) {
1708 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
1710 hw->phy.phy_types = LE32_TO_CPU(abilities->phy_type);
1711 hw->phy.phy_types |=
1712 ((u64)abilities->phy_type_ext << 32);
1720 * i40e_aq_set_phy_config
1721 * @hw: pointer to the hw struct
1722 * @config: structure with PHY configuration to be set
1723 * @cmd_details: pointer to command details structure or NULL
1725 * Set the various PHY configuration parameters
1726 * supported on the Port.One or more of the Set PHY config parameters may be
1727 * ignored in an MFP mode as the PF may not have the privilege to set some
1728 * of the PHY Config parameters. This status will be indicated by the
1731 enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
1732 struct i40e_aq_set_phy_config *config,
1733 struct i40e_asq_cmd_details *cmd_details)
1735 struct i40e_aq_desc desc;
1736 struct i40e_aq_set_phy_config *cmd =
1737 (struct i40e_aq_set_phy_config *)&desc.params.raw;
1738 enum i40e_status_code status;
1741 return I40E_ERR_PARAM;
1743 i40e_fill_default_direct_cmd_desc(&desc,
1744 i40e_aqc_opc_set_phy_config);
1748 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1755 * @hw: pointer to the hw struct
1757 * Set the requested flow control mode using set_phy_config.
1759 enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
1760 bool atomic_restart)
1762 enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
1763 struct i40e_aq_get_phy_abilities_resp abilities;
1764 struct i40e_aq_set_phy_config config;
1765 enum i40e_status_code status;
1766 u8 pause_mask = 0x0;
1772 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1773 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1775 case I40E_FC_RX_PAUSE:
1776 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1778 case I40E_FC_TX_PAUSE:
1779 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1785 /* Get the current phy config */
1786 status = i40e_aq_get_phy_capabilities(hw, false, false, &abilities,
1789 *aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
1793 memset(&config, 0, sizeof(config));
1794 /* clear the old pause settings */
1795 config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
1796 ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
1797 /* set the new abilities */
1798 config.abilities |= pause_mask;
1799 /* If the abilities have changed, then set the new config */
1800 if (config.abilities != abilities.abilities) {
1801 /* Auto restart link so settings take effect */
1803 config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
1804 /* Copy over all the old settings */
1805 config.phy_type = abilities.phy_type;
1806 config.phy_type_ext = abilities.phy_type_ext;
1807 config.link_speed = abilities.link_speed;
1808 config.eee_capability = abilities.eee_capability;
1809 config.eeer = abilities.eeer_val;
1810 config.low_power_ctrl = abilities.d3_lpan;
1811 config.fec_config = abilities.fec_cfg_curr_mod_ext_info &
1812 I40E_AQ_PHY_FEC_CONFIG_MASK;
1813 status = i40e_aq_set_phy_config(hw, &config, NULL);
1816 *aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
1818 /* Update the link info */
1819 status = i40e_update_link_info(hw);
1821 /* Wait a little bit (on 40G cards it sometimes takes a really
1822 * long time for link to come back from the atomic reset)
1825 i40e_msec_delay(1000);
1826 status = i40e_update_link_info(hw);
1829 *aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
1835 * i40e_aq_set_mac_config
1836 * @hw: pointer to the hw struct
1837 * @max_frame_size: Maximum Frame Size to be supported by the port
1838 * @crc_en: Tell HW to append a CRC to outgoing frames
1839 * @pacing: Pacing configurations
1840 * @cmd_details: pointer to command details structure or NULL
1842 * Configure MAC settings for frame size, jumbo frame support and the
1843 * addition of a CRC by the hardware.
1845 enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
1847 bool crc_en, u16 pacing,
1848 struct i40e_asq_cmd_details *cmd_details)
1850 struct i40e_aq_desc desc;
1851 struct i40e_aq_set_mac_config *cmd =
1852 (struct i40e_aq_set_mac_config *)&desc.params.raw;
1853 enum i40e_status_code status;
1855 if (max_frame_size == 0)
1856 return I40E_ERR_PARAM;
1858 i40e_fill_default_direct_cmd_desc(&desc,
1859 i40e_aqc_opc_set_mac_config);
1861 cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
1862 cmd->params = ((u8)pacing & 0x0F) << 3;
1864 cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
1866 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1872 * i40e_aq_clear_pxe_mode
1873 * @hw: pointer to the hw struct
1874 * @cmd_details: pointer to command details structure or NULL
1876 * Tell the firmware that the driver is taking over from PXE
1878 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
1879 struct i40e_asq_cmd_details *cmd_details)
1881 enum i40e_status_code status;
1882 struct i40e_aq_desc desc;
1883 struct i40e_aqc_clear_pxe *cmd =
1884 (struct i40e_aqc_clear_pxe *)&desc.params.raw;
1886 i40e_fill_default_direct_cmd_desc(&desc,
1887 i40e_aqc_opc_clear_pxe_mode);
1891 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1893 wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
1899 * i40e_aq_set_link_restart_an
1900 * @hw: pointer to the hw struct
1901 * @enable_link: if true: enable link, if false: disable link
1902 * @cmd_details: pointer to command details structure or NULL
1904 * Sets up the link and restarts the Auto-Negotiation over the link.
1906 enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
1907 bool enable_link, struct i40e_asq_cmd_details *cmd_details)
1909 struct i40e_aq_desc desc;
1910 struct i40e_aqc_set_link_restart_an *cmd =
1911 (struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
1912 enum i40e_status_code status;
1914 i40e_fill_default_direct_cmd_desc(&desc,
1915 i40e_aqc_opc_set_link_restart_an);
1917 cmd->command = I40E_AQ_PHY_RESTART_AN;
1919 cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
1921 cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
1923 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1929 * i40e_aq_get_link_info
1930 * @hw: pointer to the hw struct
1931 * @enable_lse: enable/disable LinkStatusEvent reporting
1932 * @link: pointer to link status structure - optional
1933 * @cmd_details: pointer to command details structure or NULL
1935 * Returns the link status of the adapter.
1937 enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
1938 bool enable_lse, struct i40e_link_status *link,
1939 struct i40e_asq_cmd_details *cmd_details)
1941 struct i40e_aq_desc desc;
1942 struct i40e_aqc_get_link_status *resp =
1943 (struct i40e_aqc_get_link_status *)&desc.params.raw;
1944 struct i40e_link_status *hw_link_info = &hw->phy.link_info;
1945 enum i40e_status_code status;
1946 bool tx_pause, rx_pause;
1949 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
1952 command_flags = I40E_AQ_LSE_ENABLE;
1954 command_flags = I40E_AQ_LSE_DISABLE;
1955 resp->command_flags = CPU_TO_LE16(command_flags);
1957 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1959 if (status != I40E_SUCCESS)
1960 goto aq_get_link_info_exit;
1962 /* save off old link status information */
1963 i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
1964 sizeof(*hw_link_info), I40E_NONDMA_TO_NONDMA);
1966 /* update link status */
1967 hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
1968 hw->phy.media_type = i40e_get_media_type(hw);
1969 hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
1970 hw_link_info->link_info = resp->link_info;
1971 hw_link_info->an_info = resp->an_info;
1972 hw_link_info->fec_info = resp->config & (I40E_AQ_CONFIG_FEC_KR_ENA |
1973 I40E_AQ_CONFIG_FEC_RS_ENA);
1974 hw_link_info->ext_info = resp->ext_info;
1975 hw_link_info->loopback = resp->loopback & I40E_AQ_LOOPBACK_MASK;
1976 hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
1977 hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
1979 /* update fc info */
1980 tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
1981 rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
1982 if (tx_pause & rx_pause)
1983 hw->fc.current_mode = I40E_FC_FULL;
1985 hw->fc.current_mode = I40E_FC_TX_PAUSE;
1987 hw->fc.current_mode = I40E_FC_RX_PAUSE;
1989 hw->fc.current_mode = I40E_FC_NONE;
1991 if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
1992 hw_link_info->crc_enable = true;
1994 hw_link_info->crc_enable = false;
1996 if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_IS_ENABLED))
1997 hw_link_info->lse_enable = true;
1999 hw_link_info->lse_enable = false;
2001 if ((hw->mac.type == I40E_MAC_XL710) &&
2002 (hw->aq.fw_maj_ver < 4 || (hw->aq.fw_maj_ver == 4 &&
2003 hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
2004 hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
2006 if (hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&
2007 hw->aq.api_min_ver >= 7) {
2008 hw->phy.phy_types = LE32_TO_CPU(*(__le32 *)resp->link_type);
2009 hw->phy.phy_types |= ((u64)resp->link_type_ext << 32);
2012 /* save link status information */
2014 i40e_memcpy(link, hw_link_info, sizeof(*hw_link_info),
2015 I40E_NONDMA_TO_NONDMA);
2017 /* flag cleared so helper functions don't call AQ again */
2018 hw->phy.get_link_info = false;
2020 aq_get_link_info_exit:
2025 * i40e_aq_set_phy_int_mask
2026 * @hw: pointer to the hw struct
2027 * @mask: interrupt mask to be set
2028 * @cmd_details: pointer to command details structure or NULL
2030 * Set link interrupt mask.
2032 enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
2034 struct i40e_asq_cmd_details *cmd_details)
2036 struct i40e_aq_desc desc;
2037 struct i40e_aqc_set_phy_int_mask *cmd =
2038 (struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
2039 enum i40e_status_code status;
2041 i40e_fill_default_direct_cmd_desc(&desc,
2042 i40e_aqc_opc_set_phy_int_mask);
2044 cmd->event_mask = CPU_TO_LE16(mask);
2046 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2052 * i40e_aq_get_local_advt_reg
2053 * @hw: pointer to the hw struct
2054 * @advt_reg: local AN advertisement register value
2055 * @cmd_details: pointer to command details structure or NULL
2057 * Get the Local AN advertisement register value.
2059 enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
2061 struct i40e_asq_cmd_details *cmd_details)
2063 struct i40e_aq_desc desc;
2064 struct i40e_aqc_an_advt_reg *resp =
2065 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2066 enum i40e_status_code status;
2068 i40e_fill_default_direct_cmd_desc(&desc,
2069 i40e_aqc_opc_get_local_advt_reg);
2071 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2073 if (status != I40E_SUCCESS)
2074 goto aq_get_local_advt_reg_exit;
2076 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2077 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2079 aq_get_local_advt_reg_exit:
2084 * i40e_aq_set_local_advt_reg
2085 * @hw: pointer to the hw struct
2086 * @advt_reg: local AN advertisement register value
2087 * @cmd_details: pointer to command details structure or NULL
2089 * Get the Local AN advertisement register value.
2091 enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
2093 struct i40e_asq_cmd_details *cmd_details)
2095 struct i40e_aq_desc desc;
2096 struct i40e_aqc_an_advt_reg *cmd =
2097 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2098 enum i40e_status_code status;
2100 i40e_fill_default_direct_cmd_desc(&desc,
2101 i40e_aqc_opc_get_local_advt_reg);
2103 cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
2104 cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
2106 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2112 * i40e_aq_get_partner_advt
2113 * @hw: pointer to the hw struct
2114 * @advt_reg: AN partner advertisement register value
2115 * @cmd_details: pointer to command details structure or NULL
2117 * Get the link partner AN advertisement register value.
2119 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
2121 struct i40e_asq_cmd_details *cmd_details)
2123 struct i40e_aq_desc desc;
2124 struct i40e_aqc_an_advt_reg *resp =
2125 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2126 enum i40e_status_code status;
2128 i40e_fill_default_direct_cmd_desc(&desc,
2129 i40e_aqc_opc_get_partner_advt);
2131 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2133 if (status != I40E_SUCCESS)
2134 goto aq_get_partner_advt_exit;
2136 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2137 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2139 aq_get_partner_advt_exit:
2144 * i40e_aq_set_lb_modes
2145 * @hw: pointer to the hw struct
2146 * @lb_modes: loopback mode to be set
2147 * @cmd_details: pointer to command details structure or NULL
2149 * Sets loopback modes.
2151 enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
2153 struct i40e_asq_cmd_details *cmd_details)
2155 struct i40e_aq_desc desc;
2156 struct i40e_aqc_set_lb_mode *cmd =
2157 (struct i40e_aqc_set_lb_mode *)&desc.params.raw;
2158 enum i40e_status_code status;
2160 i40e_fill_default_direct_cmd_desc(&desc,
2161 i40e_aqc_opc_set_lb_modes);
2163 cmd->lb_mode = CPU_TO_LE16(lb_modes);
2165 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2171 * i40e_aq_set_phy_debug
2172 * @hw: pointer to the hw struct
2173 * @cmd_flags: debug command flags
2174 * @cmd_details: pointer to command details structure or NULL
2176 * Reset the external PHY.
2178 enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
2179 struct i40e_asq_cmd_details *cmd_details)
2181 struct i40e_aq_desc desc;
2182 struct i40e_aqc_set_phy_debug *cmd =
2183 (struct i40e_aqc_set_phy_debug *)&desc.params.raw;
2184 enum i40e_status_code status;
2186 i40e_fill_default_direct_cmd_desc(&desc,
2187 i40e_aqc_opc_set_phy_debug);
2189 cmd->command_flags = cmd_flags;
2191 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2198 * @hw: pointer to the hw struct
2199 * @vsi_ctx: pointer to a vsi context struct
2200 * @cmd_details: pointer to command details structure or NULL
2202 * Add a VSI context to the hardware.
2204 enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
2205 struct i40e_vsi_context *vsi_ctx,
2206 struct i40e_asq_cmd_details *cmd_details)
2208 struct i40e_aq_desc desc;
2209 struct i40e_aqc_add_get_update_vsi *cmd =
2210 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2211 struct i40e_aqc_add_get_update_vsi_completion *resp =
2212 (struct i40e_aqc_add_get_update_vsi_completion *)
2214 enum i40e_status_code status;
2216 i40e_fill_default_direct_cmd_desc(&desc,
2217 i40e_aqc_opc_add_vsi);
2219 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
2220 cmd->connection_type = vsi_ctx->connection_type;
2221 cmd->vf_id = vsi_ctx->vf_num;
2222 cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
2224 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2226 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2227 sizeof(vsi_ctx->info), cmd_details);
2229 if (status != I40E_SUCCESS)
2230 goto aq_add_vsi_exit;
2232 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2233 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2234 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2235 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2242 * i40e_aq_set_default_vsi
2243 * @hw: pointer to the hw struct
2245 * @cmd_details: pointer to command details structure or NULL
2247 enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
2249 struct i40e_asq_cmd_details *cmd_details)
2251 struct i40e_aq_desc desc;
2252 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2253 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2255 enum i40e_status_code status;
2257 i40e_fill_default_direct_cmd_desc(&desc,
2258 i40e_aqc_opc_set_vsi_promiscuous_modes);
2260 cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2261 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2262 cmd->seid = CPU_TO_LE16(seid);
2264 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2270 * i40e_aq_clear_default_vsi
2271 * @hw: pointer to the hw struct
2273 * @cmd_details: pointer to command details structure or NULL
2275 enum i40e_status_code i40e_aq_clear_default_vsi(struct i40e_hw *hw,
2277 struct i40e_asq_cmd_details *cmd_details)
2279 struct i40e_aq_desc desc;
2280 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2281 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2283 enum i40e_status_code status;
2285 i40e_fill_default_direct_cmd_desc(&desc,
2286 i40e_aqc_opc_set_vsi_promiscuous_modes);
2288 cmd->promiscuous_flags = CPU_TO_LE16(0);
2289 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2290 cmd->seid = CPU_TO_LE16(seid);
2292 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2298 * i40e_aq_set_vsi_unicast_promiscuous
2299 * @hw: pointer to the hw struct
2301 * @set: set unicast promiscuous enable/disable
2302 * @cmd_details: pointer to command details structure or NULL
2303 * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
2305 enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
2307 struct i40e_asq_cmd_details *cmd_details,
2308 bool rx_only_promisc)
2310 struct i40e_aq_desc desc;
2311 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2312 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2313 enum i40e_status_code status;
2316 i40e_fill_default_direct_cmd_desc(&desc,
2317 i40e_aqc_opc_set_vsi_promiscuous_modes);
2320 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2321 if (rx_only_promisc &&
2322 (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) ||
2323 (hw->aq.api_maj_ver > 1)))
2324 flags |= I40E_AQC_SET_VSI_PROMISC_TX;
2327 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2329 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2330 if (((hw->aq.api_maj_ver >= 1) && (hw->aq.api_min_ver >= 5)) ||
2331 (hw->aq.api_maj_ver > 1))
2332 cmd->valid_flags |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_TX);
2334 cmd->seid = CPU_TO_LE16(seid);
2335 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2341 * i40e_aq_set_vsi_multicast_promiscuous
2342 * @hw: pointer to the hw struct
2344 * @set: set multicast promiscuous enable/disable
2345 * @cmd_details: pointer to command details structure or NULL
2347 enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
2348 u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
2350 struct i40e_aq_desc desc;
2351 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2352 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2353 enum i40e_status_code status;
2356 i40e_fill_default_direct_cmd_desc(&desc,
2357 i40e_aqc_opc_set_vsi_promiscuous_modes);
2360 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2362 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2364 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2366 cmd->seid = CPU_TO_LE16(seid);
2367 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2373 * i40e_aq_set_vsi_full_promiscuous
2374 * @hw: pointer to the hw struct
2376 * @set: set promiscuous enable/disable
2377 * @cmd_details: pointer to command details structure or NULL
2379 enum i40e_status_code i40e_aq_set_vsi_full_promiscuous(struct i40e_hw *hw,
2381 struct i40e_asq_cmd_details *cmd_details)
2383 struct i40e_aq_desc desc;
2384 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2385 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2386 enum i40e_status_code status;
2389 i40e_fill_default_direct_cmd_desc(&desc,
2390 i40e_aqc_opc_set_vsi_promiscuous_modes);
2393 flags = I40E_AQC_SET_VSI_PROMISC_UNICAST |
2394 I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2395 I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2397 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2399 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST |
2400 I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2401 I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2403 cmd->seid = CPU_TO_LE16(seid);
2404 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2410 * i40e_aq_set_vsi_mc_promisc_on_vlan
2411 * @hw: pointer to the hw struct
2413 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2414 * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
2415 * @cmd_details: pointer to command details structure or NULL
2417 enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
2418 u16 seid, bool enable, u16 vid,
2419 struct i40e_asq_cmd_details *cmd_details)
2421 struct i40e_aq_desc desc;
2422 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2423 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2424 enum i40e_status_code status;
2427 i40e_fill_default_direct_cmd_desc(&desc,
2428 i40e_aqc_opc_set_vsi_promiscuous_modes);
2431 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2433 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2434 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2435 cmd->seid = CPU_TO_LE16(seid);
2436 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2438 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2444 * i40e_aq_set_vsi_uc_promisc_on_vlan
2445 * @hw: pointer to the hw struct
2447 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2448 * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
2449 * @cmd_details: pointer to command details structure or NULL
2451 enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
2452 u16 seid, bool enable, u16 vid,
2453 struct i40e_asq_cmd_details *cmd_details)
2455 struct i40e_aq_desc desc;
2456 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2457 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2458 enum i40e_status_code status;
2461 i40e_fill_default_direct_cmd_desc(&desc,
2462 i40e_aqc_opc_set_vsi_promiscuous_modes);
2465 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2467 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2468 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2469 cmd->seid = CPU_TO_LE16(seid);
2470 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2472 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2478 * i40e_aq_set_vsi_bc_promisc_on_vlan
2479 * @hw: pointer to the hw struct
2481 * @enable: set broadcast promiscuous enable/disable for a given VLAN
2482 * @vid: The VLAN tag filter - capture any broadcast packet with this VLAN tag
2483 * @cmd_details: pointer to command details structure or NULL
2485 enum i40e_status_code i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw *hw,
2486 u16 seid, bool enable, u16 vid,
2487 struct i40e_asq_cmd_details *cmd_details)
2489 struct i40e_aq_desc desc;
2490 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2491 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2492 enum i40e_status_code status;
2495 i40e_fill_default_direct_cmd_desc(&desc,
2496 i40e_aqc_opc_set_vsi_promiscuous_modes);
2499 flags |= I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2501 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2502 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2503 cmd->seid = CPU_TO_LE16(seid);
2504 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2506 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2512 * i40e_aq_set_vsi_broadcast
2513 * @hw: pointer to the hw struct
2515 * @set_filter: true to set filter, false to clear filter
2516 * @cmd_details: pointer to command details structure or NULL
2518 * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
2520 enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
2521 u16 seid, bool set_filter,
2522 struct i40e_asq_cmd_details *cmd_details)
2524 struct i40e_aq_desc desc;
2525 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2526 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2527 enum i40e_status_code status;
2529 i40e_fill_default_direct_cmd_desc(&desc,
2530 i40e_aqc_opc_set_vsi_promiscuous_modes);
2533 cmd->promiscuous_flags
2534 |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2536 cmd->promiscuous_flags
2537 &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2539 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2540 cmd->seid = CPU_TO_LE16(seid);
2541 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2547 * i40e_aq_set_vsi_vlan_promisc - control the VLAN promiscuous setting
2548 * @hw: pointer to the hw struct
2550 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2551 * @cmd_details: pointer to command details structure or NULL
2553 enum i40e_status_code i40e_aq_set_vsi_vlan_promisc(struct i40e_hw *hw,
2554 u16 seid, bool enable,
2555 struct i40e_asq_cmd_details *cmd_details)
2557 struct i40e_aq_desc desc;
2558 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2559 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2560 enum i40e_status_code status;
2563 i40e_fill_default_direct_cmd_desc(&desc,
2564 i40e_aqc_opc_set_vsi_promiscuous_modes);
2566 flags |= I40E_AQC_SET_VSI_PROMISC_VLAN;
2568 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2569 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_VLAN);
2570 cmd->seid = CPU_TO_LE16(seid);
2572 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2578 * i40e_get_vsi_params - get VSI configuration info
2579 * @hw: pointer to the hw struct
2580 * @vsi_ctx: pointer to a vsi context struct
2581 * @cmd_details: pointer to command details structure or NULL
2583 enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
2584 struct i40e_vsi_context *vsi_ctx,
2585 struct i40e_asq_cmd_details *cmd_details)
2587 struct i40e_aq_desc desc;
2588 struct i40e_aqc_add_get_update_vsi *cmd =
2589 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2590 struct i40e_aqc_add_get_update_vsi_completion *resp =
2591 (struct i40e_aqc_add_get_update_vsi_completion *)
2593 enum i40e_status_code status;
2595 UNREFERENCED_1PARAMETER(cmd_details);
2596 i40e_fill_default_direct_cmd_desc(&desc,
2597 i40e_aqc_opc_get_vsi_parameters);
2599 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2601 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2603 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2604 sizeof(vsi_ctx->info), NULL);
2606 if (status != I40E_SUCCESS)
2607 goto aq_get_vsi_params_exit;
2609 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2610 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2611 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2612 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2614 aq_get_vsi_params_exit:
2619 * i40e_aq_update_vsi_params
2620 * @hw: pointer to the hw struct
2621 * @vsi_ctx: pointer to a vsi context struct
2622 * @cmd_details: pointer to command details structure or NULL
2624 * Update a VSI context.
2626 enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
2627 struct i40e_vsi_context *vsi_ctx,
2628 struct i40e_asq_cmd_details *cmd_details)
2630 struct i40e_aq_desc desc;
2631 struct i40e_aqc_add_get_update_vsi *cmd =
2632 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2633 struct i40e_aqc_add_get_update_vsi_completion *resp =
2634 (struct i40e_aqc_add_get_update_vsi_completion *)
2636 enum i40e_status_code status;
2638 i40e_fill_default_direct_cmd_desc(&desc,
2639 i40e_aqc_opc_update_vsi_parameters);
2640 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2642 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2644 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2645 sizeof(vsi_ctx->info), cmd_details);
2647 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2648 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2654 * i40e_aq_get_switch_config
2655 * @hw: pointer to the hardware structure
2656 * @buf: pointer to the result buffer
2657 * @buf_size: length of input buffer
2658 * @start_seid: seid to start for the report, 0 == beginning
2659 * @cmd_details: pointer to command details structure or NULL
2661 * Fill the buf with switch configuration returned from AdminQ command
2663 enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
2664 struct i40e_aqc_get_switch_config_resp *buf,
2665 u16 buf_size, u16 *start_seid,
2666 struct i40e_asq_cmd_details *cmd_details)
2668 struct i40e_aq_desc desc;
2669 struct i40e_aqc_switch_seid *scfg =
2670 (struct i40e_aqc_switch_seid *)&desc.params.raw;
2671 enum i40e_status_code status;
2673 i40e_fill_default_direct_cmd_desc(&desc,
2674 i40e_aqc_opc_get_switch_config);
2675 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2676 if (buf_size > I40E_AQ_LARGE_BUF)
2677 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2678 scfg->seid = CPU_TO_LE16(*start_seid);
2680 status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
2681 *start_seid = LE16_TO_CPU(scfg->seid);
2687 * i40e_aq_set_switch_config
2688 * @hw: pointer to the hardware structure
2689 * @flags: bit flag values to set
2690 * @valid_flags: which bit flags to set
2691 * @cmd_details: pointer to command details structure or NULL
2693 * Set switch configuration bits
2695 enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
2696 u16 flags, u16 valid_flags,
2697 struct i40e_asq_cmd_details *cmd_details)
2699 struct i40e_aq_desc desc;
2700 struct i40e_aqc_set_switch_config *scfg =
2701 (struct i40e_aqc_set_switch_config *)&desc.params.raw;
2702 enum i40e_status_code status;
2704 i40e_fill_default_direct_cmd_desc(&desc,
2705 i40e_aqc_opc_set_switch_config);
2706 scfg->flags = CPU_TO_LE16(flags);
2707 scfg->valid_flags = CPU_TO_LE16(valid_flags);
2708 if (hw->flags & I40E_HW_FLAG_802_1AD_CAPABLE) {
2709 scfg->switch_tag = CPU_TO_LE16(hw->switch_tag);
2710 scfg->first_tag = CPU_TO_LE16(hw->first_tag);
2711 scfg->second_tag = CPU_TO_LE16(hw->second_tag);
2713 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2719 * i40e_aq_get_firmware_version
2720 * @hw: pointer to the hw struct
2721 * @fw_major_version: firmware major version
2722 * @fw_minor_version: firmware minor version
2723 * @fw_build: firmware build number
2724 * @api_major_version: major queue version
2725 * @api_minor_version: minor queue version
2726 * @cmd_details: pointer to command details structure or NULL
2728 * Get the firmware version from the admin queue commands
2730 enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
2731 u16 *fw_major_version, u16 *fw_minor_version,
2733 u16 *api_major_version, u16 *api_minor_version,
2734 struct i40e_asq_cmd_details *cmd_details)
2736 struct i40e_aq_desc desc;
2737 struct i40e_aqc_get_version *resp =
2738 (struct i40e_aqc_get_version *)&desc.params.raw;
2739 enum i40e_status_code status;
2741 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
2743 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2745 if (status == I40E_SUCCESS) {
2746 if (fw_major_version != NULL)
2747 *fw_major_version = LE16_TO_CPU(resp->fw_major);
2748 if (fw_minor_version != NULL)
2749 *fw_minor_version = LE16_TO_CPU(resp->fw_minor);
2750 if (fw_build != NULL)
2751 *fw_build = LE32_TO_CPU(resp->fw_build);
2752 if (api_major_version != NULL)
2753 *api_major_version = LE16_TO_CPU(resp->api_major);
2754 if (api_minor_version != NULL)
2755 *api_minor_version = LE16_TO_CPU(resp->api_minor);
2757 /* A workaround to fix the API version in SW */
2758 if (api_major_version && api_minor_version &&
2759 fw_major_version && fw_minor_version &&
2760 ((*api_major_version == 1) && (*api_minor_version == 1)) &&
2761 (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
2762 (*fw_major_version > 4)))
2763 *api_minor_version = 2;
2770 * i40e_aq_send_driver_version
2771 * @hw: pointer to the hw struct
2772 * @dv: driver's major, minor version
2773 * @cmd_details: pointer to command details structure or NULL
2775 * Send the driver version to the firmware
2777 enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
2778 struct i40e_driver_version *dv,
2779 struct i40e_asq_cmd_details *cmd_details)
2781 struct i40e_aq_desc desc;
2782 struct i40e_aqc_driver_version *cmd =
2783 (struct i40e_aqc_driver_version *)&desc.params.raw;
2784 enum i40e_status_code status;
2788 return I40E_ERR_PARAM;
2790 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
2792 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
2793 cmd->driver_major_ver = dv->major_version;
2794 cmd->driver_minor_ver = dv->minor_version;
2795 cmd->driver_build_ver = dv->build_version;
2796 cmd->driver_subbuild_ver = dv->subbuild_version;
2799 while (len < sizeof(dv->driver_string) &&
2800 (dv->driver_string[len] < 0x80) &&
2801 dv->driver_string[len])
2803 status = i40e_asq_send_command(hw, &desc, dv->driver_string,
2810 * i40e_get_link_status - get status of the HW network link
2811 * @hw: pointer to the hw struct
2812 * @link_up: pointer to bool (true/false = linkup/linkdown)
2814 * Variable link_up true if link is up, false if link is down.
2815 * The variable link_up is invalid if returned value of status != I40E_SUCCESS
2817 * Side effect: LinkStatusEvent reporting becomes enabled
2819 enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
2821 enum i40e_status_code status = I40E_SUCCESS;
2823 if (hw->phy.get_link_info) {
2824 status = i40e_update_link_info(hw);
2826 if (status != I40E_SUCCESS)
2827 i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
2831 *link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
2837 * i40e_updatelink_status - update status of the HW network link
2838 * @hw: pointer to the hw struct
2840 enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
2842 struct i40e_aq_get_phy_abilities_resp abilities;
2843 enum i40e_status_code status = I40E_SUCCESS;
2845 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2849 /* extra checking needed to ensure link info to user is timely */
2850 if ((hw->phy.link_info.link_info & I40E_AQ_MEDIA_AVAILABLE) &&
2851 ((hw->phy.link_info.link_info & I40E_AQ_LINK_UP) ||
2852 !(hw->phy.link_info_old.link_info & I40E_AQ_LINK_UP))) {
2853 status = i40e_aq_get_phy_capabilities(hw, false, false,
2858 hw->phy.link_info.req_fec_info =
2859 abilities.fec_cfg_curr_mod_ext_info &
2860 (I40E_AQ_REQUEST_FEC_KR | I40E_AQ_REQUEST_FEC_RS);
2862 i40e_memcpy(hw->phy.link_info.module_type, &abilities.module_type,
2863 sizeof(hw->phy.link_info.module_type), I40E_NONDMA_TO_NONDMA);
2870 * i40e_get_link_speed
2871 * @hw: pointer to the hw struct
2873 * Returns the link speed of the adapter.
2875 enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
2877 enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
2878 enum i40e_status_code status = I40E_SUCCESS;
2880 if (hw->phy.get_link_info) {
2881 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2883 if (status != I40E_SUCCESS)
2884 goto i40e_link_speed_exit;
2887 speed = hw->phy.link_info.link_speed;
2889 i40e_link_speed_exit:
2894 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2895 * @hw: pointer to the hw struct
2896 * @uplink_seid: the MAC or other gizmo SEID
2897 * @downlink_seid: the VSI SEID
2898 * @enabled_tc: bitmap of TCs to be enabled
2899 * @default_port: true for default port VSI, false for control port
2900 * @veb_seid: pointer to where to put the resulting VEB SEID
2901 * @enable_stats: true to turn on VEB stats
2902 * @cmd_details: pointer to command details structure or NULL
2904 * This asks the FW to add a VEB between the uplink and downlink
2905 * elements. If the uplink SEID is 0, this will be a floating VEB.
2907 enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
2908 u16 downlink_seid, u8 enabled_tc,
2909 bool default_port, u16 *veb_seid,
2911 struct i40e_asq_cmd_details *cmd_details)
2913 struct i40e_aq_desc desc;
2914 struct i40e_aqc_add_veb *cmd =
2915 (struct i40e_aqc_add_veb *)&desc.params.raw;
2916 struct i40e_aqc_add_veb_completion *resp =
2917 (struct i40e_aqc_add_veb_completion *)&desc.params.raw;
2918 enum i40e_status_code status;
2921 /* SEIDs need to either both be set or both be 0 for floating VEB */
2922 if (!!uplink_seid != !!downlink_seid)
2923 return I40E_ERR_PARAM;
2925 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
2927 cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
2928 cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
2929 cmd->enable_tcs = enabled_tc;
2931 veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
2933 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
2935 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
2937 /* reverse logic here: set the bitflag to disable the stats */
2939 veb_flags |= I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS;
2941 cmd->veb_flags = CPU_TO_LE16(veb_flags);
2943 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2945 if (!status && veb_seid)
2946 *veb_seid = LE16_TO_CPU(resp->veb_seid);
2952 * i40e_aq_get_veb_parameters - Retrieve VEB parameters
2953 * @hw: pointer to the hw struct
2954 * @veb_seid: the SEID of the VEB to query
2955 * @switch_id: the uplink switch id
2956 * @floating: set to true if the VEB is floating
2957 * @statistic_index: index of the stats counter block for this VEB
2958 * @vebs_used: number of VEB's used by function
2959 * @vebs_free: total VEB's not reserved by any function
2960 * @cmd_details: pointer to command details structure or NULL
2962 * This retrieves the parameters for a particular VEB, specified by
2963 * uplink_seid, and returns them to the caller.
2965 enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
2966 u16 veb_seid, u16 *switch_id,
2967 bool *floating, u16 *statistic_index,
2968 u16 *vebs_used, u16 *vebs_free,
2969 struct i40e_asq_cmd_details *cmd_details)
2971 struct i40e_aq_desc desc;
2972 struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
2973 (struct i40e_aqc_get_veb_parameters_completion *)
2975 enum i40e_status_code status;
2978 return I40E_ERR_PARAM;
2980 i40e_fill_default_direct_cmd_desc(&desc,
2981 i40e_aqc_opc_get_veb_parameters);
2982 cmd_resp->seid = CPU_TO_LE16(veb_seid);
2984 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2989 *switch_id = LE16_TO_CPU(cmd_resp->switch_id);
2990 if (statistic_index)
2991 *statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
2993 *vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
2995 *vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
2997 u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
2999 if (flags & I40E_AQC_ADD_VEB_FLOATING)
3010 * i40e_aq_add_macvlan
3011 * @hw: pointer to the hw struct
3012 * @seid: VSI for the mac address
3013 * @mv_list: list of macvlans to be added
3014 * @count: length of the list
3015 * @cmd_details: pointer to command details structure or NULL
3017 * Add MAC/VLAN addresses to the HW filtering
3019 enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
3020 struct i40e_aqc_add_macvlan_element_data *mv_list,
3021 u16 count, struct i40e_asq_cmd_details *cmd_details)
3023 struct i40e_aq_desc desc;
3024 struct i40e_aqc_macvlan *cmd =
3025 (struct i40e_aqc_macvlan *)&desc.params.raw;
3026 enum i40e_status_code status;
3030 if (count == 0 || !mv_list || !hw)
3031 return I40E_ERR_PARAM;
3033 buf_size = count * sizeof(*mv_list);
3035 /* prep the rest of the request */
3036 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
3037 cmd->num_addresses = CPU_TO_LE16(count);
3038 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
3042 for (i = 0; i < count; i++)
3043 if (I40E_IS_MULTICAST(mv_list[i].mac_addr))
3045 CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);
3047 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3048 if (buf_size > I40E_AQ_LARGE_BUF)
3049 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3051 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
3058 * i40e_aq_remove_macvlan
3059 * @hw: pointer to the hw struct
3060 * @seid: VSI for the mac address
3061 * @mv_list: list of macvlans to be removed
3062 * @count: length of the list
3063 * @cmd_details: pointer to command details structure or NULL
3065 * Remove MAC/VLAN addresses from the HW filtering
3067 enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
3068 struct i40e_aqc_remove_macvlan_element_data *mv_list,
3069 u16 count, struct i40e_asq_cmd_details *cmd_details)
3071 struct i40e_aq_desc desc;
3072 struct i40e_aqc_macvlan *cmd =
3073 (struct i40e_aqc_macvlan *)&desc.params.raw;
3074 enum i40e_status_code status;
3077 if (count == 0 || !mv_list || !hw)
3078 return I40E_ERR_PARAM;
3080 buf_size = count * sizeof(*mv_list);
3082 /* prep the rest of the request */
3083 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
3084 cmd->num_addresses = CPU_TO_LE16(count);
3085 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
3089 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3090 if (buf_size > I40E_AQ_LARGE_BUF)
3091 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3093 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
3100 * i40e_mirrorrule_op - Internal helper function to add/delete mirror rule
3101 * @hw: pointer to the hw struct
3102 * @opcode: AQ opcode for add or delete mirror rule
3103 * @sw_seid: Switch SEID (to which rule refers)
3104 * @rule_type: Rule Type (ingress/egress/VLAN)
3105 * @id: Destination VSI SEID or Rule ID
3106 * @count: length of the list
3107 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3108 * @cmd_details: pointer to command details structure or NULL
3109 * @rule_id: Rule ID returned from FW
3110 * @rule_used: Number of rules used in internal switch
3111 * @rule_free: Number of rules free in internal switch
3113 * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
3114 * VEBs/VEPA elements only
3116 static enum i40e_status_code i40e_mirrorrule_op(struct i40e_hw *hw,
3117 u16 opcode, u16 sw_seid, u16 rule_type, u16 id,
3118 u16 count, __le16 *mr_list,
3119 struct i40e_asq_cmd_details *cmd_details,
3120 u16 *rule_id, u16 *rules_used, u16 *rules_free)
3122 struct i40e_aq_desc desc;
3123 struct i40e_aqc_add_delete_mirror_rule *cmd =
3124 (struct i40e_aqc_add_delete_mirror_rule *)&desc.params.raw;
3125 struct i40e_aqc_add_delete_mirror_rule_completion *resp =
3126 (struct i40e_aqc_add_delete_mirror_rule_completion *)&desc.params.raw;
3127 enum i40e_status_code status;
3130 buf_size = count * sizeof(*mr_list);
3132 /* prep the rest of the request */
3133 i40e_fill_default_direct_cmd_desc(&desc, opcode);
3134 cmd->seid = CPU_TO_LE16(sw_seid);
3135 cmd->rule_type = CPU_TO_LE16(rule_type &
3136 I40E_AQC_MIRROR_RULE_TYPE_MASK);
3137 cmd->num_entries = CPU_TO_LE16(count);
3138 /* Dest VSI for add, rule_id for delete */
3139 cmd->destination = CPU_TO_LE16(id);
3141 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3143 if (buf_size > I40E_AQ_LARGE_BUF)
3144 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3147 status = i40e_asq_send_command(hw, &desc, mr_list, buf_size,
3149 if (status == I40E_SUCCESS ||
3150 hw->aq.asq_last_status == I40E_AQ_RC_ENOSPC) {
3152 *rule_id = LE16_TO_CPU(resp->rule_id);
3154 *rules_used = LE16_TO_CPU(resp->mirror_rules_used);
3156 *rules_free = LE16_TO_CPU(resp->mirror_rules_free);
3162 * i40e_aq_add_mirrorrule - add a mirror rule
3163 * @hw: pointer to the hw struct
3164 * @sw_seid: Switch SEID (to which rule refers)
3165 * @rule_type: Rule Type (ingress/egress/VLAN)
3166 * @dest_vsi: SEID of VSI to which packets will be mirrored
3167 * @count: length of the list
3168 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3169 * @cmd_details: pointer to command details structure or NULL
3170 * @rule_id: Rule ID returned from FW
3171 * @rule_used: Number of rules used in internal switch
3172 * @rule_free: Number of rules free in internal switch
3174 * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
3176 enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3177 u16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,
3178 struct i40e_asq_cmd_details *cmd_details,
3179 u16 *rule_id, u16 *rules_used, u16 *rules_free)
3181 if (!(rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS ||
3182 rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS)) {
3183 if (count == 0 || !mr_list)
3184 return I40E_ERR_PARAM;
3187 return i40e_mirrorrule_op(hw, i40e_aqc_opc_add_mirror_rule, sw_seid,
3188 rule_type, dest_vsi, count, mr_list,
3189 cmd_details, rule_id, rules_used, rules_free);
3193 * i40e_aq_delete_mirrorrule - delete a mirror rule
3194 * @hw: pointer to the hw struct
3195 * @sw_seid: Switch SEID (to which rule refers)
3196 * @rule_type: Rule Type (ingress/egress/VLAN)
3197 * @count: length of the list
3198 * @rule_id: Rule ID that is returned in the receive desc as part of
3200 * @mr_list: list of mirrored VLAN IDs to be removed
3201 * @cmd_details: pointer to command details structure or NULL
3202 * @rule_used: Number of rules used in internal switch
3203 * @rule_free: Number of rules free in internal switch
3205 * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
3207 enum i40e_status_code i40e_aq_delete_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3208 u16 rule_type, u16 rule_id, u16 count, __le16 *mr_list,
3209 struct i40e_asq_cmd_details *cmd_details,
3210 u16 *rules_used, u16 *rules_free)
3212 /* Rule ID has to be valid except rule_type: INGRESS VLAN mirroring */
3213 if (rule_type == I40E_AQC_MIRROR_RULE_TYPE_VLAN) {
3214 /* count and mr_list shall be valid for rule_type INGRESS VLAN
3215 * mirroring. For other rule_type, count and rule_type should
3218 if (count == 0 || !mr_list)
3219 return I40E_ERR_PARAM;
3222 return i40e_mirrorrule_op(hw, i40e_aqc_opc_delete_mirror_rule, sw_seid,
3223 rule_type, rule_id, count, mr_list,
3224 cmd_details, NULL, rules_used, rules_free);
3228 * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
3229 * @hw: pointer to the hw struct
3230 * @seid: VSI for the vlan filters
3231 * @v_list: list of vlan filters to be added
3232 * @count: length of the list
3233 * @cmd_details: pointer to command details structure or NULL
3235 enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
3236 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3237 u8 count, struct i40e_asq_cmd_details *cmd_details)
3239 struct i40e_aq_desc desc;
3240 struct i40e_aqc_macvlan *cmd =
3241 (struct i40e_aqc_macvlan *)&desc.params.raw;
3242 enum i40e_status_code status;
3245 if (count == 0 || !v_list || !hw)
3246 return I40E_ERR_PARAM;
3248 buf_size = count * sizeof(*v_list);
3250 /* prep the rest of the request */
3251 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
3252 cmd->num_addresses = CPU_TO_LE16(count);
3253 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3257 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3258 if (buf_size > I40E_AQ_LARGE_BUF)
3259 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3261 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3268 * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
3269 * @hw: pointer to the hw struct
3270 * @seid: VSI for the vlan filters
3271 * @v_list: list of macvlans to be removed
3272 * @count: length of the list
3273 * @cmd_details: pointer to command details structure or NULL
3275 enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
3276 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3277 u8 count, struct i40e_asq_cmd_details *cmd_details)
3279 struct i40e_aq_desc desc;
3280 struct i40e_aqc_macvlan *cmd =
3281 (struct i40e_aqc_macvlan *)&desc.params.raw;
3282 enum i40e_status_code status;
3285 if (count == 0 || !v_list || !hw)
3286 return I40E_ERR_PARAM;
3288 buf_size = count * sizeof(*v_list);
3290 /* prep the rest of the request */
3291 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
3292 cmd->num_addresses = CPU_TO_LE16(count);
3293 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3297 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3298 if (buf_size > I40E_AQ_LARGE_BUF)
3299 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3301 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3308 * i40e_aq_send_msg_to_vf
3309 * @hw: pointer to the hardware structure
3310 * @vfid: vf id to send msg
3311 * @v_opcode: opcodes for VF-PF communication
3312 * @v_retval: return error code
3313 * @msg: pointer to the msg buffer
3314 * @msglen: msg length
3315 * @cmd_details: pointer to command details
3319 enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
3320 u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
3321 struct i40e_asq_cmd_details *cmd_details)
3323 struct i40e_aq_desc desc;
3324 struct i40e_aqc_pf_vf_message *cmd =
3325 (struct i40e_aqc_pf_vf_message *)&desc.params.raw;
3326 enum i40e_status_code status;
3328 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
3329 cmd->id = CPU_TO_LE32(vfid);
3330 desc.cookie_high = CPU_TO_LE32(v_opcode);
3331 desc.cookie_low = CPU_TO_LE32(v_retval);
3332 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
3334 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3336 if (msglen > I40E_AQ_LARGE_BUF)
3337 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3338 desc.datalen = CPU_TO_LE16(msglen);
3340 status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
3346 * i40e_aq_debug_read_register
3347 * @hw: pointer to the hw struct
3348 * @reg_addr: register address
3349 * @reg_val: register value
3350 * @cmd_details: pointer to command details structure or NULL
3352 * Read the register using the admin queue commands
3354 enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
3355 u32 reg_addr, u64 *reg_val,
3356 struct i40e_asq_cmd_details *cmd_details)
3358 struct i40e_aq_desc desc;
3359 struct i40e_aqc_debug_reg_read_write *cmd_resp =
3360 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3361 enum i40e_status_code status;
3363 if (reg_val == NULL)
3364 return I40E_ERR_PARAM;
3366 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_read_reg);
3368 cmd_resp->address = CPU_TO_LE32(reg_addr);
3370 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3372 if (status == I40E_SUCCESS) {
3373 *reg_val = ((u64)LE32_TO_CPU(cmd_resp->value_high) << 32) |
3374 (u64)LE32_TO_CPU(cmd_resp->value_low);
3381 * i40e_aq_debug_write_register
3382 * @hw: pointer to the hw struct
3383 * @reg_addr: register address
3384 * @reg_val: register value
3385 * @cmd_details: pointer to command details structure or NULL
3387 * Write to a register using the admin queue commands
3389 enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
3390 u32 reg_addr, u64 reg_val,
3391 struct i40e_asq_cmd_details *cmd_details)
3393 struct i40e_aq_desc desc;
3394 struct i40e_aqc_debug_reg_read_write *cmd =
3395 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3396 enum i40e_status_code status;
3398 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
3400 cmd->address = CPU_TO_LE32(reg_addr);
3401 cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
3402 cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
3404 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3410 * i40e_aq_request_resource
3411 * @hw: pointer to the hw struct
3412 * @resource: resource id
3413 * @access: access type
3414 * @sdp_number: resource number
3415 * @timeout: the maximum time in ms that the driver may hold the resource
3416 * @cmd_details: pointer to command details structure or NULL
3418 * requests common resource using the admin queue commands
3420 enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
3421 enum i40e_aq_resources_ids resource,
3422 enum i40e_aq_resource_access_type access,
3423 u8 sdp_number, u64 *timeout,
3424 struct i40e_asq_cmd_details *cmd_details)
3426 struct i40e_aq_desc desc;
3427 struct i40e_aqc_request_resource *cmd_resp =
3428 (struct i40e_aqc_request_resource *)&desc.params.raw;
3429 enum i40e_status_code status;
3431 DEBUGFUNC("i40e_aq_request_resource");
3433 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
3435 cmd_resp->resource_id = CPU_TO_LE16(resource);
3436 cmd_resp->access_type = CPU_TO_LE16(access);
3437 cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
3439 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3440 /* The completion specifies the maximum time in ms that the driver
3441 * may hold the resource in the Timeout field.
3442 * If the resource is held by someone else, the command completes with
3443 * busy return value and the timeout field indicates the maximum time
3444 * the current owner of the resource has to free it.
3446 if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
3447 *timeout = LE32_TO_CPU(cmd_resp->timeout);
3453 * i40e_aq_release_resource
3454 * @hw: pointer to the hw struct
3455 * @resource: resource id
3456 * @sdp_number: resource number
3457 * @cmd_details: pointer to command details structure or NULL
3459 * release common resource using the admin queue commands
3461 enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
3462 enum i40e_aq_resources_ids resource,
3464 struct i40e_asq_cmd_details *cmd_details)
3466 struct i40e_aq_desc desc;
3467 struct i40e_aqc_request_resource *cmd =
3468 (struct i40e_aqc_request_resource *)&desc.params.raw;
3469 enum i40e_status_code status;
3471 DEBUGFUNC("i40e_aq_release_resource");
3473 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
3475 cmd->resource_id = CPU_TO_LE16(resource);
3476 cmd->resource_number = CPU_TO_LE32(sdp_number);
3478 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3485 * @hw: pointer to the hw struct
3486 * @module_pointer: module pointer location in words from the NVM beginning
3487 * @offset: byte offset from the module beginning
3488 * @length: length of the section to be read (in bytes from the offset)
3489 * @data: command buffer (size [bytes] = length)
3490 * @last_command: tells if this is the last command in a series
3491 * @cmd_details: pointer to command details structure or NULL
3493 * Read the NVM using the admin queue commands
3495 enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
3496 u32 offset, u16 length, void *data,
3498 struct i40e_asq_cmd_details *cmd_details)
3500 struct i40e_aq_desc desc;
3501 struct i40e_aqc_nvm_update *cmd =
3502 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3503 enum i40e_status_code status;
3505 DEBUGFUNC("i40e_aq_read_nvm");
3507 /* In offset the highest byte must be zeroed. */
3508 if (offset & 0xFF000000) {
3509 status = I40E_ERR_PARAM;
3510 goto i40e_aq_read_nvm_exit;
3513 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
3515 /* If this is the last command in a series, set the proper flag. */
3517 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3518 cmd->module_pointer = module_pointer;
3519 cmd->offset = CPU_TO_LE32(offset);
3520 cmd->length = CPU_TO_LE16(length);
3522 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3523 if (length > I40E_AQ_LARGE_BUF)
3524 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3526 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3528 i40e_aq_read_nvm_exit:
3533 * i40e_aq_read_nvm_config - read an nvm config block
3534 * @hw: pointer to the hw struct
3535 * @cmd_flags: NVM access admin command bits
3536 * @field_id: field or feature id
3537 * @data: buffer for result
3538 * @buf_size: buffer size
3539 * @element_count: pointer to count of elements read by FW
3540 * @cmd_details: pointer to command details structure or NULL
3542 enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
3543 u8 cmd_flags, u32 field_id, void *data,
3544 u16 buf_size, u16 *element_count,
3545 struct i40e_asq_cmd_details *cmd_details)
3547 struct i40e_aq_desc desc;
3548 struct i40e_aqc_nvm_config_read *cmd =
3549 (struct i40e_aqc_nvm_config_read *)&desc.params.raw;
3550 enum i40e_status_code status;
3552 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_read);
3553 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF));
3554 if (buf_size > I40E_AQ_LARGE_BUF)
3555 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3557 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3558 cmd->element_id = CPU_TO_LE16((u16)(0xffff & field_id));
3559 if (cmd_flags & I40E_AQ_ANVM_FEATURE_OR_IMMEDIATE_MASK)
3560 cmd->element_id_msw = CPU_TO_LE16((u16)(field_id >> 16));
3562 cmd->element_id_msw = 0;
3564 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3566 if (!status && element_count)
3567 *element_count = LE16_TO_CPU(cmd->element_count);
3573 * i40e_aq_write_nvm_config - write an nvm config block
3574 * @hw: pointer to the hw struct
3575 * @cmd_flags: NVM access admin command bits
3576 * @data: buffer for result
3577 * @buf_size: buffer size
3578 * @element_count: count of elements to be written
3579 * @cmd_details: pointer to command details structure or NULL
3581 enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
3582 u8 cmd_flags, void *data, u16 buf_size,
3584 struct i40e_asq_cmd_details *cmd_details)
3586 struct i40e_aq_desc desc;
3587 struct i40e_aqc_nvm_config_write *cmd =
3588 (struct i40e_aqc_nvm_config_write *)&desc.params.raw;
3589 enum i40e_status_code status;
3591 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_write);
3592 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3593 if (buf_size > I40E_AQ_LARGE_BUF)
3594 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3596 cmd->element_count = CPU_TO_LE16(element_count);
3597 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3598 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3604 * i40e_aq_oem_post_update - triggers an OEM specific flow after update
3605 * @hw: pointer to the hw struct
3606 * @cmd_details: pointer to command details structure or NULL
3608 enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
3609 void *buff, u16 buff_size,
3610 struct i40e_asq_cmd_details *cmd_details)
3612 struct i40e_aq_desc desc;
3613 enum i40e_status_code status;
3615 UNREFERENCED_2PARAMETER(buff, buff_size);
3617 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_oem_post_update);
3618 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3619 if (status && LE16_TO_CPU(desc.retval) == I40E_AQ_RC_ESRCH)
3620 status = I40E_ERR_NOT_IMPLEMENTED;
3627 * @hw: pointer to the hw struct
3628 * @module_pointer: module pointer location in words from the NVM beginning
3629 * @offset: offset in the module (expressed in 4 KB from module's beginning)
3630 * @length: length of the section to be erased (expressed in 4 KB)
3631 * @last_command: tells if this is the last command in a series
3632 * @cmd_details: pointer to command details structure or NULL
3634 * Erase the NVM sector using the admin queue commands
3636 enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
3637 u32 offset, u16 length, bool last_command,
3638 struct i40e_asq_cmd_details *cmd_details)
3640 struct i40e_aq_desc desc;
3641 struct i40e_aqc_nvm_update *cmd =
3642 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3643 enum i40e_status_code status;
3645 DEBUGFUNC("i40e_aq_erase_nvm");
3647 /* In offset the highest byte must be zeroed. */
3648 if (offset & 0xFF000000) {
3649 status = I40E_ERR_PARAM;
3650 goto i40e_aq_erase_nvm_exit;
3653 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
3655 /* If this is the last command in a series, set the proper flag. */
3657 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3658 cmd->module_pointer = module_pointer;
3659 cmd->offset = CPU_TO_LE32(offset);
3660 cmd->length = CPU_TO_LE16(length);
3662 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3664 i40e_aq_erase_nvm_exit:
3669 * i40e_parse_discover_capabilities
3670 * @hw: pointer to the hw struct
3671 * @buff: pointer to a buffer containing device/function capability records
3672 * @cap_count: number of capability records in the list
3673 * @list_type_opc: type of capabilities list to parse
3675 * Parse the device/function capabilities list.
3677 STATIC void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
3679 enum i40e_admin_queue_opc list_type_opc)
3681 struct i40e_aqc_list_capabilities_element_resp *cap;
3682 u32 valid_functions, num_functions;
3683 u32 number, logical_id, phys_id;
3684 struct i40e_hw_capabilities *p;
3689 cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
3691 if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
3692 p = (struct i40e_hw_capabilities *)&hw->dev_caps;
3693 else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
3694 p = (struct i40e_hw_capabilities *)&hw->func_caps;
3698 for (i = 0; i < cap_count; i++, cap++) {
3699 id = LE16_TO_CPU(cap->id);
3700 number = LE32_TO_CPU(cap->number);
3701 logical_id = LE32_TO_CPU(cap->logical_id);
3702 phys_id = LE32_TO_CPU(cap->phys_id);
3703 major_rev = cap->major_rev;
3706 case I40E_AQ_CAP_ID_SWITCH_MODE:
3707 p->switch_mode = number;
3708 i40e_debug(hw, I40E_DEBUG_INIT,
3709 "HW Capability: Switch mode = %d\n",
3712 case I40E_AQ_CAP_ID_MNG_MODE:
3713 p->management_mode = number;
3714 if (major_rev > 1) {
3715 p->mng_protocols_over_mctp = logical_id;
3716 i40e_debug(hw, I40E_DEBUG_INIT,
3717 "HW Capability: Protocols over MCTP = %d\n",
3718 p->mng_protocols_over_mctp);
3720 p->mng_protocols_over_mctp = 0;
3722 i40e_debug(hw, I40E_DEBUG_INIT,
3723 "HW Capability: Management Mode = %d\n",
3724 p->management_mode);
3726 case I40E_AQ_CAP_ID_NPAR_ACTIVE:
3727 p->npar_enable = number;
3728 i40e_debug(hw, I40E_DEBUG_INIT,
3729 "HW Capability: NPAR enable = %d\n",
3732 case I40E_AQ_CAP_ID_OS2BMC_CAP:
3734 i40e_debug(hw, I40E_DEBUG_INIT,
3735 "HW Capability: OS2BMC = %d\n", p->os2bmc);
3737 case I40E_AQ_CAP_ID_FUNCTIONS_VALID:
3738 p->valid_functions = number;
3739 i40e_debug(hw, I40E_DEBUG_INIT,
3740 "HW Capability: Valid Functions = %d\n",
3741 p->valid_functions);
3743 case I40E_AQ_CAP_ID_SRIOV:
3745 p->sr_iov_1_1 = true;
3746 i40e_debug(hw, I40E_DEBUG_INIT,
3747 "HW Capability: SR-IOV = %d\n",
3750 case I40E_AQ_CAP_ID_VF:
3751 p->num_vfs = number;
3752 p->vf_base_id = logical_id;
3753 i40e_debug(hw, I40E_DEBUG_INIT,
3754 "HW Capability: VF count = %d\n",
3756 i40e_debug(hw, I40E_DEBUG_INIT,
3757 "HW Capability: VF base_id = %d\n",
3760 case I40E_AQ_CAP_ID_VMDQ:
3763 i40e_debug(hw, I40E_DEBUG_INIT,
3764 "HW Capability: VMDQ = %d\n", p->vmdq);
3766 case I40E_AQ_CAP_ID_8021QBG:
3768 p->evb_802_1_qbg = true;
3769 i40e_debug(hw, I40E_DEBUG_INIT,
3770 "HW Capability: 802.1Qbg = %d\n", number);
3772 case I40E_AQ_CAP_ID_8021QBR:
3774 p->evb_802_1_qbh = true;
3775 i40e_debug(hw, I40E_DEBUG_INIT,
3776 "HW Capability: 802.1Qbh = %d\n", number);
3778 case I40E_AQ_CAP_ID_VSI:
3779 p->num_vsis = number;
3780 i40e_debug(hw, I40E_DEBUG_INIT,
3781 "HW Capability: VSI count = %d\n",
3784 case I40E_AQ_CAP_ID_DCB:
3787 p->enabled_tcmap = logical_id;
3790 i40e_debug(hw, I40E_DEBUG_INIT,
3791 "HW Capability: DCB = %d\n", p->dcb);
3792 i40e_debug(hw, I40E_DEBUG_INIT,
3793 "HW Capability: TC Mapping = %d\n",
3795 i40e_debug(hw, I40E_DEBUG_INIT,
3796 "HW Capability: TC Max = %d\n", p->maxtc);
3798 case I40E_AQ_CAP_ID_FCOE:
3801 i40e_debug(hw, I40E_DEBUG_INIT,
3802 "HW Capability: FCOE = %d\n", p->fcoe);
3804 case I40E_AQ_CAP_ID_ISCSI:
3807 i40e_debug(hw, I40E_DEBUG_INIT,
3808 "HW Capability: iSCSI = %d\n", p->iscsi);
3810 case I40E_AQ_CAP_ID_RSS:
3812 p->rss_table_size = number;
3813 p->rss_table_entry_width = logical_id;
3814 i40e_debug(hw, I40E_DEBUG_INIT,
3815 "HW Capability: RSS = %d\n", p->rss);
3816 i40e_debug(hw, I40E_DEBUG_INIT,
3817 "HW Capability: RSS table size = %d\n",
3819 i40e_debug(hw, I40E_DEBUG_INIT,
3820 "HW Capability: RSS table width = %d\n",
3821 p->rss_table_entry_width);
3823 case I40E_AQ_CAP_ID_RXQ:
3824 p->num_rx_qp = number;
3825 p->base_queue = phys_id;
3826 i40e_debug(hw, I40E_DEBUG_INIT,
3827 "HW Capability: Rx QP = %d\n", number);
3828 i40e_debug(hw, I40E_DEBUG_INIT,
3829 "HW Capability: base_queue = %d\n",
3832 case I40E_AQ_CAP_ID_TXQ:
3833 p->num_tx_qp = number;
3834 p->base_queue = phys_id;
3835 i40e_debug(hw, I40E_DEBUG_INIT,
3836 "HW Capability: Tx QP = %d\n", number);
3837 i40e_debug(hw, I40E_DEBUG_INIT,
3838 "HW Capability: base_queue = %d\n",
3841 case I40E_AQ_CAP_ID_MSIX:
3842 p->num_msix_vectors = number;
3843 i40e_debug(hw, I40E_DEBUG_INIT,
3844 "HW Capability: MSIX vector count = %d\n",
3845 p->num_msix_vectors);
3847 case I40E_AQ_CAP_ID_VF_MSIX:
3848 p->num_msix_vectors_vf = number;
3849 i40e_debug(hw, I40E_DEBUG_INIT,
3850 "HW Capability: MSIX VF vector count = %d\n",
3851 p->num_msix_vectors_vf);
3853 case I40E_AQ_CAP_ID_FLEX10:
3854 if (major_rev == 1) {
3856 p->flex10_enable = true;
3857 p->flex10_capable = true;
3860 /* Capability revision >= 2 */
3862 p->flex10_enable = true;
3864 p->flex10_capable = true;
3866 p->flex10_mode = logical_id;
3867 p->flex10_status = phys_id;
3868 i40e_debug(hw, I40E_DEBUG_INIT,
3869 "HW Capability: Flex10 mode = %d\n",
3871 i40e_debug(hw, I40E_DEBUG_INIT,
3872 "HW Capability: Flex10 status = %d\n",
3875 case I40E_AQ_CAP_ID_CEM:
3878 i40e_debug(hw, I40E_DEBUG_INIT,
3879 "HW Capability: CEM = %d\n", p->mgmt_cem);
3881 case I40E_AQ_CAP_ID_IWARP:
3884 i40e_debug(hw, I40E_DEBUG_INIT,
3885 "HW Capability: iWARP = %d\n", p->iwarp);
3887 case I40E_AQ_CAP_ID_LED:
3888 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3889 p->led[phys_id] = true;
3890 i40e_debug(hw, I40E_DEBUG_INIT,
3891 "HW Capability: LED - PIN %d\n", phys_id);
3893 case I40E_AQ_CAP_ID_SDP:
3894 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3895 p->sdp[phys_id] = true;
3896 i40e_debug(hw, I40E_DEBUG_INIT,
3897 "HW Capability: SDP - PIN %d\n", phys_id);
3899 case I40E_AQ_CAP_ID_MDIO:
3901 p->mdio_port_num = phys_id;
3902 p->mdio_port_mode = logical_id;
3904 i40e_debug(hw, I40E_DEBUG_INIT,
3905 "HW Capability: MDIO port number = %d\n",
3907 i40e_debug(hw, I40E_DEBUG_INIT,
3908 "HW Capability: MDIO port mode = %d\n",
3911 case I40E_AQ_CAP_ID_1588:
3913 p->ieee_1588 = true;
3914 i40e_debug(hw, I40E_DEBUG_INIT,
3915 "HW Capability: IEEE 1588 = %d\n",
3918 case I40E_AQ_CAP_ID_FLOW_DIRECTOR:
3920 p->fd_filters_guaranteed = number;
3921 p->fd_filters_best_effort = logical_id;
3922 i40e_debug(hw, I40E_DEBUG_INIT,
3923 "HW Capability: Flow Director = 1\n");
3924 i40e_debug(hw, I40E_DEBUG_INIT,
3925 "HW Capability: Guaranteed FD filters = %d\n",
3926 p->fd_filters_guaranteed);
3928 case I40E_AQ_CAP_ID_WSR_PROT:
3929 p->wr_csr_prot = (u64)number;
3930 p->wr_csr_prot |= (u64)logical_id << 32;
3931 i40e_debug(hw, I40E_DEBUG_INIT,
3932 "HW Capability: wr_csr_prot = 0x%llX\n\n",
3933 (p->wr_csr_prot & 0xffff));
3935 case I40E_AQ_CAP_ID_NVM_MGMT:
3936 if (number & I40E_NVM_MGMT_SEC_REV_DISABLED)
3937 p->sec_rev_disabled = true;
3938 if (number & I40E_NVM_MGMT_UPDATE_DISABLED)
3939 p->update_disabled = true;
3941 case I40E_AQ_CAP_ID_WOL_AND_PROXY:
3942 hw->num_wol_proxy_filters = (u16)number;
3943 hw->wol_proxy_vsi_seid = (u16)logical_id;
3944 p->apm_wol_support = phys_id & I40E_WOL_SUPPORT_MASK;
3945 if (phys_id & I40E_ACPI_PROGRAMMING_METHOD_MASK)
3946 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_AQC_FPK;
3948 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_HW_FVL;
3949 p->proxy_support = (phys_id & I40E_PROXY_SUPPORT_MASK) ? 1 : 0;
3950 i40e_debug(hw, I40E_DEBUG_INIT,
3951 "HW Capability: WOL proxy filters = %d\n",
3952 hw->num_wol_proxy_filters);
3960 i40e_debug(hw, I40E_DEBUG_ALL, "device is FCoE capable\n");
3962 /* Always disable FCoE if compiled without the I40E_FCOE_ENA flag */
3965 /* count the enabled ports (aka the "not disabled" ports) */
3967 for (i = 0; i < 4; i++) {
3968 u32 port_cfg_reg = I40E_PRTGEN_CNF + (4 * i);
3971 /* use AQ read to get the physical register offset instead
3972 * of the port relative offset
3974 i40e_aq_debug_read_register(hw, port_cfg_reg, &port_cfg, NULL);
3975 if (!(port_cfg & I40E_PRTGEN_CNF_PORT_DIS_MASK))
3979 valid_functions = p->valid_functions;
3981 while (valid_functions) {
3982 if (valid_functions & 1)
3984 valid_functions >>= 1;
3987 /* partition id is 1-based, and functions are evenly spread
3988 * across the ports as partitions
3990 if (hw->num_ports != 0) {
3991 hw->partition_id = (hw->pf_id / hw->num_ports) + 1;
3992 hw->num_partitions = num_functions / hw->num_ports;
3995 /* additional HW specific goodies that might
3996 * someday be HW version specific
3998 p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
4002 * i40e_aq_discover_capabilities
4003 * @hw: pointer to the hw struct
4004 * @buff: a virtual buffer to hold the capabilities
4005 * @buff_size: Size of the virtual buffer
4006 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
4007 * @list_type_opc: capabilities type to discover - pass in the command opcode
4008 * @cmd_details: pointer to command details structure or NULL
4010 * Get the device capabilities descriptions from the firmware
4012 enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
4013 void *buff, u16 buff_size, u16 *data_size,
4014 enum i40e_admin_queue_opc list_type_opc,
4015 struct i40e_asq_cmd_details *cmd_details)
4017 struct i40e_aqc_list_capabilites *cmd;
4018 struct i40e_aq_desc desc;
4019 enum i40e_status_code status = I40E_SUCCESS;
4021 cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
4023 if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
4024 list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
4025 status = I40E_ERR_PARAM;
4029 i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
4031 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4032 if (buff_size > I40E_AQ_LARGE_BUF)
4033 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4035 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4036 *data_size = LE16_TO_CPU(desc.datalen);
4041 i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
4049 * i40e_aq_update_nvm
4050 * @hw: pointer to the hw struct
4051 * @module_pointer: module pointer location in words from the NVM beginning
4052 * @offset: byte offset from the module beginning
4053 * @length: length of the section to be written (in bytes from the offset)
4054 * @data: command buffer (size [bytes] = length)
4055 * @last_command: tells if this is the last command in a series
4056 * @cmd_details: pointer to command details structure or NULL
4058 * Update the NVM using the admin queue commands
4060 enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
4061 u32 offset, u16 length, void *data,
4063 struct i40e_asq_cmd_details *cmd_details)
4065 struct i40e_aq_desc desc;
4066 struct i40e_aqc_nvm_update *cmd =
4067 (struct i40e_aqc_nvm_update *)&desc.params.raw;
4068 enum i40e_status_code status;
4070 DEBUGFUNC("i40e_aq_update_nvm");
4072 /* In offset the highest byte must be zeroed. */
4073 if (offset & 0xFF000000) {
4074 status = I40E_ERR_PARAM;
4075 goto i40e_aq_update_nvm_exit;
4078 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
4080 /* If this is the last command in a series, set the proper flag. */
4082 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
4083 cmd->module_pointer = module_pointer;
4084 cmd->offset = CPU_TO_LE32(offset);
4085 cmd->length = CPU_TO_LE16(length);
4087 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4088 if (length > I40E_AQ_LARGE_BUF)
4089 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4091 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
4093 i40e_aq_update_nvm_exit:
4098 * i40e_aq_get_lldp_mib
4099 * @hw: pointer to the hw struct
4100 * @bridge_type: type of bridge requested
4101 * @mib_type: Local, Remote or both Local and Remote MIBs
4102 * @buff: pointer to a user supplied buffer to store the MIB block
4103 * @buff_size: size of the buffer (in bytes)
4104 * @local_len : length of the returned Local LLDP MIB
4105 * @remote_len: length of the returned Remote LLDP MIB
4106 * @cmd_details: pointer to command details structure or NULL
4108 * Requests the complete LLDP MIB (entire packet).
4110 enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
4111 u8 mib_type, void *buff, u16 buff_size,
4112 u16 *local_len, u16 *remote_len,
4113 struct i40e_asq_cmd_details *cmd_details)
4115 struct i40e_aq_desc desc;
4116 struct i40e_aqc_lldp_get_mib *cmd =
4117 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
4118 struct i40e_aqc_lldp_get_mib *resp =
4119 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
4120 enum i40e_status_code status;
4122 if (buff_size == 0 || !buff)
4123 return I40E_ERR_PARAM;
4125 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
4126 /* Indirect Command */
4127 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4129 cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
4130 cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4131 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4133 desc.datalen = CPU_TO_LE16(buff_size);
4135 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4136 if (buff_size > I40E_AQ_LARGE_BUF)
4137 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4139 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4141 if (local_len != NULL)
4142 *local_len = LE16_TO_CPU(resp->local_len);
4143 if (remote_len != NULL)
4144 *remote_len = LE16_TO_CPU(resp->remote_len);
4151 * i40e_aq_set_lldp_mib - Set the LLDP MIB
4152 * @hw: pointer to the hw struct
4153 * @mib_type: Local, Remote or both Local and Remote MIBs
4154 * @buff: pointer to a user supplied buffer to store the MIB block
4155 * @buff_size: size of the buffer (in bytes)
4156 * @cmd_details: pointer to command details structure or NULL
4160 enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
4161 u8 mib_type, void *buff, u16 buff_size,
4162 struct i40e_asq_cmd_details *cmd_details)
4164 struct i40e_aq_desc desc;
4165 struct i40e_aqc_lldp_set_local_mib *cmd =
4166 (struct i40e_aqc_lldp_set_local_mib *)&desc.params.raw;
4167 enum i40e_status_code status;
4169 if (buff_size == 0 || !buff)
4170 return I40E_ERR_PARAM;
4172 i40e_fill_default_direct_cmd_desc(&desc,
4173 i40e_aqc_opc_lldp_set_local_mib);
4174 /* Indirect Command */
4175 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4176 if (buff_size > I40E_AQ_LARGE_BUF)
4177 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4178 desc.datalen = CPU_TO_LE16(buff_size);
4180 cmd->type = mib_type;
4181 cmd->length = CPU_TO_LE16(buff_size);
4182 cmd->address_high = CPU_TO_LE32(I40E_HI_WORD((u64)buff));
4183 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buff));
4185 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4190 * i40e_aq_cfg_lldp_mib_change_event
4191 * @hw: pointer to the hw struct
4192 * @enable_update: Enable or Disable event posting
4193 * @cmd_details: pointer to command details structure or NULL
4195 * Enable or Disable posting of an event on ARQ when LLDP MIB
4196 * associated with the interface changes
4198 enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
4200 struct i40e_asq_cmd_details *cmd_details)
4202 struct i40e_aq_desc desc;
4203 struct i40e_aqc_lldp_update_mib *cmd =
4204 (struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
4205 enum i40e_status_code status;
4207 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
4210 cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
4212 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4218 * i40e_aq_add_lldp_tlv
4219 * @hw: pointer to the hw struct
4220 * @bridge_type: type of bridge
4221 * @buff: buffer with TLV to add
4222 * @buff_size: length of the buffer
4223 * @tlv_len: length of the TLV to be added
4224 * @mib_len: length of the LLDP MIB returned in response
4225 * @cmd_details: pointer to command details structure or NULL
4227 * Add the specified TLV to LLDP Local MIB for the given bridge type,
4228 * it is responsibility of the caller to make sure that the TLV is not
4229 * already present in the LLDPDU.
4230 * In return firmware will write the complete LLDP MIB with the newly
4231 * added TLV in the response buffer.
4233 enum i40e_status_code i40e_aq_add_lldp_tlv(struct i40e_hw *hw, u8 bridge_type,
4234 void *buff, u16 buff_size, u16 tlv_len,
4236 struct i40e_asq_cmd_details *cmd_details)
4238 struct i40e_aq_desc desc;
4239 struct i40e_aqc_lldp_add_tlv *cmd =
4240 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4241 enum i40e_status_code status;
4243 if (buff_size == 0 || !buff || tlv_len == 0)
4244 return I40E_ERR_PARAM;
4246 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_add_tlv);
4248 /* Indirect Command */
4249 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4250 if (buff_size > I40E_AQ_LARGE_BUF)
4251 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4252 desc.datalen = CPU_TO_LE16(buff_size);
4254 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4255 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4256 cmd->len = CPU_TO_LE16(tlv_len);
4258 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4260 if (mib_len != NULL)
4261 *mib_len = LE16_TO_CPU(desc.datalen);
4268 * i40e_aq_update_lldp_tlv
4269 * @hw: pointer to the hw struct
4270 * @bridge_type: type of bridge
4271 * @buff: buffer with TLV to update
4272 * @buff_size: size of the buffer holding original and updated TLVs
4273 * @old_len: Length of the Original TLV
4274 * @new_len: Length of the Updated TLV
4275 * @offset: offset of the updated TLV in the buff
4276 * @mib_len: length of the returned LLDP MIB
4277 * @cmd_details: pointer to command details structure or NULL
4279 * Update the specified TLV to the LLDP Local MIB for the given bridge type.
4280 * Firmware will place the complete LLDP MIB in response buffer with the
4283 enum i40e_status_code i40e_aq_update_lldp_tlv(struct i40e_hw *hw,
4284 u8 bridge_type, void *buff, u16 buff_size,
4285 u16 old_len, u16 new_len, u16 offset,
4287 struct i40e_asq_cmd_details *cmd_details)
4289 struct i40e_aq_desc desc;
4290 struct i40e_aqc_lldp_update_tlv *cmd =
4291 (struct i40e_aqc_lldp_update_tlv *)&desc.params.raw;
4292 enum i40e_status_code status;
4294 if (buff_size == 0 || !buff || offset == 0 ||
4295 old_len == 0 || new_len == 0)
4296 return I40E_ERR_PARAM;
4298 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_tlv);
4300 /* Indirect Command */
4301 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4302 if (buff_size > I40E_AQ_LARGE_BUF)
4303 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4304 desc.datalen = CPU_TO_LE16(buff_size);
4306 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4307 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4308 cmd->old_len = CPU_TO_LE16(old_len);
4309 cmd->new_offset = CPU_TO_LE16(offset);
4310 cmd->new_len = CPU_TO_LE16(new_len);
4312 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4314 if (mib_len != NULL)
4315 *mib_len = LE16_TO_CPU(desc.datalen);
4322 * i40e_aq_delete_lldp_tlv
4323 * @hw: pointer to the hw struct
4324 * @bridge_type: type of bridge
4325 * @buff: pointer to a user supplied buffer that has the TLV
4326 * @buff_size: length of the buffer
4327 * @tlv_len: length of the TLV to be deleted
4328 * @mib_len: length of the returned LLDP MIB
4329 * @cmd_details: pointer to command details structure or NULL
4331 * Delete the specified TLV from LLDP Local MIB for the given bridge type.
4332 * The firmware places the entire LLDP MIB in the response buffer.
4334 enum i40e_status_code i40e_aq_delete_lldp_tlv(struct i40e_hw *hw,
4335 u8 bridge_type, void *buff, u16 buff_size,
4336 u16 tlv_len, u16 *mib_len,
4337 struct i40e_asq_cmd_details *cmd_details)
4339 struct i40e_aq_desc desc;
4340 struct i40e_aqc_lldp_add_tlv *cmd =
4341 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4342 enum i40e_status_code status;
4344 if (buff_size == 0 || !buff)
4345 return I40E_ERR_PARAM;
4347 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_delete_tlv);
4349 /* Indirect Command */
4350 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4351 if (buff_size > I40E_AQ_LARGE_BUF)
4352 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4353 desc.datalen = CPU_TO_LE16(buff_size);
4354 cmd->len = CPU_TO_LE16(tlv_len);
4355 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4356 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4358 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4360 if (mib_len != NULL)
4361 *mib_len = LE16_TO_CPU(desc.datalen);
4369 * @hw: pointer to the hw struct
4370 * @shutdown_agent: True if LLDP Agent needs to be Shutdown
4371 * @cmd_details: pointer to command details structure or NULL
4373 * Stop or Shutdown the embedded LLDP Agent
4375 enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
4376 struct i40e_asq_cmd_details *cmd_details)
4378 struct i40e_aq_desc desc;
4379 struct i40e_aqc_lldp_stop *cmd =
4380 (struct i40e_aqc_lldp_stop *)&desc.params.raw;
4381 enum i40e_status_code status;
4383 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
4386 cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
4388 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4394 * i40e_aq_start_lldp
4395 * @hw: pointer to the hw struct
4396 * @cmd_details: pointer to command details structure or NULL
4398 * Start the embedded LLDP Agent on all ports.
4400 enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
4401 struct i40e_asq_cmd_details *cmd_details)
4403 struct i40e_aq_desc desc;
4404 struct i40e_aqc_lldp_start *cmd =
4405 (struct i40e_aqc_lldp_start *)&desc.params.raw;
4406 enum i40e_status_code status;
4408 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
4410 cmd->command = I40E_AQ_LLDP_AGENT_START;
4412 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4418 * i40e_aq_get_cee_dcb_config
4419 * @hw: pointer to the hw struct
4420 * @buff: response buffer that stores CEE operational configuration
4421 * @buff_size: size of the buffer passed
4422 * @cmd_details: pointer to command details structure or NULL
4424 * Get CEE DCBX mode operational configuration from firmware
4426 enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
4427 void *buff, u16 buff_size,
4428 struct i40e_asq_cmd_details *cmd_details)
4430 struct i40e_aq_desc desc;
4431 enum i40e_status_code status;
4433 if (buff_size == 0 || !buff)
4434 return I40E_ERR_PARAM;
4436 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_cee_dcb_cfg);
4438 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4439 status = i40e_asq_send_command(hw, &desc, (void *)buff, buff_size,
4446 * i40e_aq_start_stop_dcbx - Start/Stop DCBx service in FW
4447 * @hw: pointer to the hw struct
4448 * @start_agent: True if DCBx Agent needs to be Started
4449 * False if DCBx Agent needs to be Stopped
4450 * @cmd_details: pointer to command details structure or NULL
4452 * Start/Stop the embedded dcbx Agent
4454 enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
4456 struct i40e_asq_cmd_details *cmd_details)
4458 struct i40e_aq_desc desc;
4459 struct i40e_aqc_lldp_stop_start_specific_agent *cmd =
4460 (struct i40e_aqc_lldp_stop_start_specific_agent *)
4462 enum i40e_status_code status;
4464 i40e_fill_default_direct_cmd_desc(&desc,
4465 i40e_aqc_opc_lldp_stop_start_spec_agent);
4468 cmd->command = I40E_AQC_START_SPECIFIC_AGENT_MASK;
4470 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4476 * i40e_aq_add_udp_tunnel
4477 * @hw: pointer to the hw struct
4478 * @udp_port: the UDP port to add in Host byte order
4479 * @header_len: length of the tunneling header length in DWords
4480 * @protocol_index: protocol index type
4481 * @filter_index: pointer to filter index
4482 * @cmd_details: pointer to command details structure or NULL
4484 * Note: Firmware expects the udp_port value to be in Little Endian format,
4485 * and this function will call CPU_TO_LE16 to convert from Host byte order to
4486 * Little Endian order.
4488 enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
4489 u16 udp_port, u8 protocol_index,
4491 struct i40e_asq_cmd_details *cmd_details)
4493 struct i40e_aq_desc desc;
4494 struct i40e_aqc_add_udp_tunnel *cmd =
4495 (struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
4496 struct i40e_aqc_del_udp_tunnel_completion *resp =
4497 (struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
4498 enum i40e_status_code status;
4500 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
4502 cmd->udp_port = CPU_TO_LE16(udp_port);
4503 cmd->protocol_type = protocol_index;
4505 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4507 if (!status && filter_index)
4508 *filter_index = resp->index;
4514 * i40e_aq_del_udp_tunnel
4515 * @hw: pointer to the hw struct
4516 * @index: filter index
4517 * @cmd_details: pointer to command details structure or NULL
4519 enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
4520 struct i40e_asq_cmd_details *cmd_details)
4522 struct i40e_aq_desc desc;
4523 struct i40e_aqc_remove_udp_tunnel *cmd =
4524 (struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
4525 enum i40e_status_code status;
4527 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
4531 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4537 * i40e_aq_get_switch_resource_alloc (0x0204)
4538 * @hw: pointer to the hw struct
4539 * @num_entries: pointer to u8 to store the number of resource entries returned
4540 * @buf: pointer to a user supplied buffer. This buffer must be large enough
4541 * to store the resource information for all resource types. Each
4542 * resource type is a i40e_aqc_switch_resource_alloc_data structure.
4543 * @count: size, in bytes, of the buffer provided
4544 * @cmd_details: pointer to command details structure or NULL
4546 * Query the resources allocated to a function.
4548 enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
4550 struct i40e_aqc_switch_resource_alloc_element_resp *buf,
4552 struct i40e_asq_cmd_details *cmd_details)
4554 struct i40e_aq_desc desc;
4555 struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
4556 (struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
4557 enum i40e_status_code status;
4558 u16 length = count * sizeof(*buf);
4560 i40e_fill_default_direct_cmd_desc(&desc,
4561 i40e_aqc_opc_get_switch_resource_alloc);
4563 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4564 if (length > I40E_AQ_LARGE_BUF)
4565 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4567 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4569 if (!status && num_entries)
4570 *num_entries = cmd_resp->num_entries;
4576 * i40e_aq_delete_element - Delete switch element
4577 * @hw: pointer to the hw struct
4578 * @seid: the SEID to delete from the switch
4579 * @cmd_details: pointer to command details structure or NULL
4581 * This deletes a switch element from the switch.
4583 enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
4584 struct i40e_asq_cmd_details *cmd_details)
4586 struct i40e_aq_desc desc;
4587 struct i40e_aqc_switch_seid *cmd =
4588 (struct i40e_aqc_switch_seid *)&desc.params.raw;
4589 enum i40e_status_code status;
4592 return I40E_ERR_PARAM;
4594 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
4596 cmd->seid = CPU_TO_LE16(seid);
4598 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4604 * i40e_aq_add_pvirt - Instantiate a Port Virtualizer on a port
4605 * @hw: pointer to the hw struct
4606 * @flags: component flags
4607 * @mac_seid: uplink seid (MAC SEID)
4608 * @vsi_seid: connected vsi seid
4609 * @ret_seid: seid of create pv component
4611 * This instantiates an i40e port virtualizer with specified flags.
4612 * Depending on specified flags the port virtualizer can act as a
4613 * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
4615 enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
4616 u16 mac_seid, u16 vsi_seid,
4619 struct i40e_aq_desc desc;
4620 struct i40e_aqc_add_update_pv *cmd =
4621 (struct i40e_aqc_add_update_pv *)&desc.params.raw;
4622 struct i40e_aqc_add_update_pv_completion *resp =
4623 (struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
4624 enum i40e_status_code status;
4627 return I40E_ERR_PARAM;
4629 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
4630 cmd->command_flags = CPU_TO_LE16(flags);
4631 cmd->uplink_seid = CPU_TO_LE16(mac_seid);
4632 cmd->connected_seid = CPU_TO_LE16(vsi_seid);
4634 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4635 if (!status && ret_seid)
4636 *ret_seid = LE16_TO_CPU(resp->pv_seid);
4642 * i40e_aq_add_tag - Add an S/E-tag
4643 * @hw: pointer to the hw struct
4644 * @direct_to_queue: should s-tag direct flow to a specific queue
4645 * @vsi_seid: VSI SEID to use this tag
4646 * @tag: value of the tag
4647 * @queue_num: queue number, only valid is direct_to_queue is true
4648 * @tags_used: return value, number of tags in use by this PF
4649 * @tags_free: return value, number of unallocated tags
4650 * @cmd_details: pointer to command details structure or NULL
4652 * This associates an S- or E-tag to a VSI in the switch complex. It returns
4653 * the number of tags allocated by the PF, and the number of unallocated
4656 enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
4657 u16 vsi_seid, u16 tag, u16 queue_num,
4658 u16 *tags_used, u16 *tags_free,
4659 struct i40e_asq_cmd_details *cmd_details)
4661 struct i40e_aq_desc desc;
4662 struct i40e_aqc_add_tag *cmd =
4663 (struct i40e_aqc_add_tag *)&desc.params.raw;
4664 struct i40e_aqc_add_remove_tag_completion *resp =
4665 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4666 enum i40e_status_code status;
4669 return I40E_ERR_PARAM;
4671 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
4673 cmd->seid = CPU_TO_LE16(vsi_seid);
4674 cmd->tag = CPU_TO_LE16(tag);
4675 if (direct_to_queue) {
4676 cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
4677 cmd->queue_number = CPU_TO_LE16(queue_num);
4680 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4683 if (tags_used != NULL)
4684 *tags_used = LE16_TO_CPU(resp->tags_used);
4685 if (tags_free != NULL)
4686 *tags_free = LE16_TO_CPU(resp->tags_free);
4693 * i40e_aq_remove_tag - Remove an S- or E-tag
4694 * @hw: pointer to the hw struct
4695 * @vsi_seid: VSI SEID this tag is associated with
4696 * @tag: value of the S-tag to delete
4697 * @tags_used: return value, number of tags in use by this PF
4698 * @tags_free: return value, number of unallocated tags
4699 * @cmd_details: pointer to command details structure or NULL
4701 * This deletes an S- or E-tag from a VSI in the switch complex. It returns
4702 * the number of tags allocated by the PF, and the number of unallocated
4705 enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
4706 u16 tag, u16 *tags_used, u16 *tags_free,
4707 struct i40e_asq_cmd_details *cmd_details)
4709 struct i40e_aq_desc desc;
4710 struct i40e_aqc_remove_tag *cmd =
4711 (struct i40e_aqc_remove_tag *)&desc.params.raw;
4712 struct i40e_aqc_add_remove_tag_completion *resp =
4713 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4714 enum i40e_status_code status;
4717 return I40E_ERR_PARAM;
4719 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
4721 cmd->seid = CPU_TO_LE16(vsi_seid);
4722 cmd->tag = CPU_TO_LE16(tag);
4724 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4727 if (tags_used != NULL)
4728 *tags_used = LE16_TO_CPU(resp->tags_used);
4729 if (tags_free != NULL)
4730 *tags_free = LE16_TO_CPU(resp->tags_free);
4737 * i40e_aq_add_mcast_etag - Add a multicast E-tag
4738 * @hw: pointer to the hw struct
4739 * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
4740 * @etag: value of E-tag to add
4741 * @num_tags_in_buf: number of unicast E-tags in indirect buffer
4742 * @buf: address of indirect buffer
4743 * @tags_used: return value, number of E-tags in use by this port
4744 * @tags_free: return value, number of unallocated M-tags
4745 * @cmd_details: pointer to command details structure or NULL
4747 * This associates a multicast E-tag to a port virtualizer. It will return
4748 * the number of tags allocated by the PF, and the number of unallocated
4751 * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
4752 * num_tags_in_buf long.
4754 enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4755 u16 etag, u8 num_tags_in_buf, void *buf,
4756 u16 *tags_used, u16 *tags_free,
4757 struct i40e_asq_cmd_details *cmd_details)
4759 struct i40e_aq_desc desc;
4760 struct i40e_aqc_add_remove_mcast_etag *cmd =
4761 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4762 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4763 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4764 enum i40e_status_code status;
4765 u16 length = sizeof(u16) * num_tags_in_buf;
4767 if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
4768 return I40E_ERR_PARAM;
4770 i40e_fill_default_direct_cmd_desc(&desc,
4771 i40e_aqc_opc_add_multicast_etag);
4773 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4774 cmd->etag = CPU_TO_LE16(etag);
4775 cmd->num_unicast_etags = num_tags_in_buf;
4777 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4778 if (length > I40E_AQ_LARGE_BUF)
4779 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4781 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4784 if (tags_used != NULL)
4785 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4786 if (tags_free != NULL)
4787 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4794 * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
4795 * @hw: pointer to the hw struct
4796 * @pv_seid: Port Virtualizer SEID this M-tag is associated with
4797 * @etag: value of the E-tag to remove
4798 * @tags_used: return value, number of tags in use by this port
4799 * @tags_free: return value, number of unallocated tags
4800 * @cmd_details: pointer to command details structure or NULL
4802 * This deletes an E-tag from the port virtualizer. It will return
4803 * the number of tags allocated by the port, and the number of unallocated
4806 enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4807 u16 etag, u16 *tags_used, u16 *tags_free,
4808 struct i40e_asq_cmd_details *cmd_details)
4810 struct i40e_aq_desc desc;
4811 struct i40e_aqc_add_remove_mcast_etag *cmd =
4812 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4813 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4814 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4815 enum i40e_status_code status;
4819 return I40E_ERR_PARAM;
4821 i40e_fill_default_direct_cmd_desc(&desc,
4822 i40e_aqc_opc_remove_multicast_etag);
4824 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4825 cmd->etag = CPU_TO_LE16(etag);
4827 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4830 if (tags_used != NULL)
4831 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4832 if (tags_free != NULL)
4833 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4840 * i40e_aq_update_tag - Update an S/E-tag
4841 * @hw: pointer to the hw struct
4842 * @vsi_seid: VSI SEID using this S-tag
4843 * @old_tag: old tag value
4844 * @new_tag: new tag value
4845 * @tags_used: return value, number of tags in use by this PF
4846 * @tags_free: return value, number of unallocated tags
4847 * @cmd_details: pointer to command details structure or NULL
4849 * This updates the value of the tag currently attached to this VSI
4850 * in the switch complex. It will return the number of tags allocated
4851 * by the PF, and the number of unallocated tags available.
4853 enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
4854 u16 old_tag, u16 new_tag, u16 *tags_used,
4856 struct i40e_asq_cmd_details *cmd_details)
4858 struct i40e_aq_desc desc;
4859 struct i40e_aqc_update_tag *cmd =
4860 (struct i40e_aqc_update_tag *)&desc.params.raw;
4861 struct i40e_aqc_update_tag_completion *resp =
4862 (struct i40e_aqc_update_tag_completion *)&desc.params.raw;
4863 enum i40e_status_code status;
4866 return I40E_ERR_PARAM;
4868 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
4870 cmd->seid = CPU_TO_LE16(vsi_seid);
4871 cmd->old_tag = CPU_TO_LE16(old_tag);
4872 cmd->new_tag = CPU_TO_LE16(new_tag);
4874 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4877 if (tags_used != NULL)
4878 *tags_used = LE16_TO_CPU(resp->tags_used);
4879 if (tags_free != NULL)
4880 *tags_free = LE16_TO_CPU(resp->tags_free);
4887 * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
4888 * @hw: pointer to the hw struct
4889 * @tcmap: TC map for request/release any ignore PFC condition
4890 * @request: request or release ignore PFC condition
4891 * @tcmap_ret: return TCs for which PFC is currently ignored
4892 * @cmd_details: pointer to command details structure or NULL
4894 * This sends out request/release to ignore PFC condition for a TC.
4895 * It will return the TCs for which PFC is currently ignored.
4897 enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
4898 bool request, u8 *tcmap_ret,
4899 struct i40e_asq_cmd_details *cmd_details)
4901 struct i40e_aq_desc desc;
4902 struct i40e_aqc_pfc_ignore *cmd_resp =
4903 (struct i40e_aqc_pfc_ignore *)&desc.params.raw;
4904 enum i40e_status_code status;
4906 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
4909 cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
4911 cmd_resp->tc_bitmap = tcmap;
4913 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4916 if (tcmap_ret != NULL)
4917 *tcmap_ret = cmd_resp->tc_bitmap;
4924 * i40e_aq_dcb_updated - DCB Updated Command
4925 * @hw: pointer to the hw struct
4926 * @cmd_details: pointer to command details structure or NULL
4928 * When LLDP is handled in PF this command is used by the PF
4929 * to notify EMP that a DCB setting is modified.
4930 * When LLDP is handled in EMP this command is used by the PF
4931 * to notify EMP whenever one of the following parameters get
4933 * - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
4934 * - PCIRTT in PRTDCB_GENC.PCIRTT
4935 * - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
4936 * EMP will return when the shared RPB settings have been
4937 * recomputed and modified. The retval field in the descriptor
4938 * will be set to 0 when RPB is modified.
4940 enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
4941 struct i40e_asq_cmd_details *cmd_details)
4943 struct i40e_aq_desc desc;
4944 enum i40e_status_code status;
4946 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
4948 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4954 * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
4955 * @hw: pointer to the hw struct
4956 * @seid: defines the SEID of the switch for which the stats are requested
4957 * @vlan_id: the VLAN ID for which the statistics are requested
4958 * @stat_index: index of the statistics counters block assigned to this VLAN
4959 * @cmd_details: pointer to command details structure or NULL
4961 * XL710 supports 128 smonVlanStats counters.This command is used to
4962 * allocate a set of smonVlanStats counters to a specific VLAN in a specific
4965 enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
4966 u16 vlan_id, u16 *stat_index,
4967 struct i40e_asq_cmd_details *cmd_details)
4969 struct i40e_aq_desc desc;
4970 struct i40e_aqc_add_remove_statistics *cmd_resp =
4971 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4972 enum i40e_status_code status;
4974 if ((seid == 0) || (stat_index == NULL))
4975 return I40E_ERR_PARAM;
4977 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
4979 cmd_resp->seid = CPU_TO_LE16(seid);
4980 cmd_resp->vlan = CPU_TO_LE16(vlan_id);
4982 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4984 if (!status && stat_index)
4985 *stat_index = LE16_TO_CPU(cmd_resp->stat_index);
4991 * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
4992 * @hw: pointer to the hw struct
4993 * @seid: defines the SEID of the switch for which the stats are requested
4994 * @vlan_id: the VLAN ID for which the statistics are requested
4995 * @stat_index: index of the statistics counters block assigned to this VLAN
4996 * @cmd_details: pointer to command details structure or NULL
4998 * XL710 supports 128 smonVlanStats counters.This command is used to
4999 * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
5002 enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
5003 u16 vlan_id, u16 stat_index,
5004 struct i40e_asq_cmd_details *cmd_details)
5006 struct i40e_aq_desc desc;
5007 struct i40e_aqc_add_remove_statistics *cmd =
5008 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
5009 enum i40e_status_code status;
5012 return I40E_ERR_PARAM;
5014 i40e_fill_default_direct_cmd_desc(&desc,
5015 i40e_aqc_opc_remove_statistics);
5017 cmd->seid = CPU_TO_LE16(seid);
5018 cmd->vlan = CPU_TO_LE16(vlan_id);
5019 cmd->stat_index = CPU_TO_LE16(stat_index);
5021 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5027 * i40e_aq_set_port_parameters - set physical port parameters.
5028 * @hw: pointer to the hw struct
5029 * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
5030 * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
5031 * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
5032 * @double_vlan: if set double VLAN is enabled
5033 * @cmd_details: pointer to command details structure or NULL
5035 enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
5036 u16 bad_frame_vsi, bool save_bad_pac,
5037 bool pad_short_pac, bool double_vlan,
5038 struct i40e_asq_cmd_details *cmd_details)
5040 struct i40e_aqc_set_port_parameters *cmd;
5041 enum i40e_status_code status;
5042 struct i40e_aq_desc desc;
5043 u16 command_flags = 0;
5045 cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
5047 i40e_fill_default_direct_cmd_desc(&desc,
5048 i40e_aqc_opc_set_port_parameters);
5050 cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
5052 command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
5054 command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
5056 command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
5057 cmd->command_flags = CPU_TO_LE16(command_flags);
5059 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5065 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
5066 * @hw: pointer to the hw struct
5067 * @seid: seid for the physical port/switching component/vsi
5068 * @buff: Indirect buffer to hold data parameters and response
5069 * @buff_size: Indirect buffer size
5070 * @opcode: Tx scheduler AQ command opcode
5071 * @cmd_details: pointer to command details structure or NULL
5073 * Generic command handler for Tx scheduler AQ commands
5075 static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
5076 void *buff, u16 buff_size,
5077 enum i40e_admin_queue_opc opcode,
5078 struct i40e_asq_cmd_details *cmd_details)
5080 struct i40e_aq_desc desc;
5081 struct i40e_aqc_tx_sched_ind *cmd =
5082 (struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
5083 enum i40e_status_code status;
5084 bool cmd_param_flag = false;
5087 case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
5088 case i40e_aqc_opc_configure_vsi_tc_bw:
5089 case i40e_aqc_opc_enable_switching_comp_ets:
5090 case i40e_aqc_opc_modify_switching_comp_ets:
5091 case i40e_aqc_opc_disable_switching_comp_ets:
5092 case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
5093 case i40e_aqc_opc_configure_switching_comp_bw_config:
5094 cmd_param_flag = true;
5096 case i40e_aqc_opc_query_vsi_bw_config:
5097 case i40e_aqc_opc_query_vsi_ets_sla_config:
5098 case i40e_aqc_opc_query_switching_comp_ets_config:
5099 case i40e_aqc_opc_query_port_ets_config:
5100 case i40e_aqc_opc_query_switching_comp_bw_config:
5101 cmd_param_flag = false;
5104 return I40E_ERR_PARAM;
5107 i40e_fill_default_direct_cmd_desc(&desc, opcode);
5109 /* Indirect command */
5110 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5112 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
5113 if (buff_size > I40E_AQ_LARGE_BUF)
5114 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5116 desc.datalen = CPU_TO_LE16(buff_size);
5118 cmd->vsi_seid = CPU_TO_LE16(seid);
5120 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
5126 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
5127 * @hw: pointer to the hw struct
5129 * @credit: BW limit credits (0 = disabled)
5130 * @max_credit: Max BW limit credits
5131 * @cmd_details: pointer to command details structure or NULL
5133 enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
5134 u16 seid, u16 credit, u8 max_credit,
5135 struct i40e_asq_cmd_details *cmd_details)
5137 struct i40e_aq_desc desc;
5138 struct i40e_aqc_configure_vsi_bw_limit *cmd =
5139 (struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
5140 enum i40e_status_code status;
5142 i40e_fill_default_direct_cmd_desc(&desc,
5143 i40e_aqc_opc_configure_vsi_bw_limit);
5145 cmd->vsi_seid = CPU_TO_LE16(seid);
5146 cmd->credit = CPU_TO_LE16(credit);
5147 cmd->max_credit = max_credit;
5149 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5155 * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
5156 * @hw: pointer to the hw struct
5157 * @seid: switching component seid
5158 * @credit: BW limit credits (0 = disabled)
5159 * @max_bw: Max BW limit credits
5160 * @cmd_details: pointer to command details structure or NULL
5162 enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
5163 u16 seid, u16 credit, u8 max_bw,
5164 struct i40e_asq_cmd_details *cmd_details)
5166 struct i40e_aq_desc desc;
5167 struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
5168 (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
5169 enum i40e_status_code status;
5171 i40e_fill_default_direct_cmd_desc(&desc,
5172 i40e_aqc_opc_configure_switching_comp_bw_limit);
5174 cmd->seid = CPU_TO_LE16(seid);
5175 cmd->credit = CPU_TO_LE16(credit);
5176 cmd->max_bw = max_bw;
5178 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5184 * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
5185 * @hw: pointer to the hw struct
5187 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5188 * @cmd_details: pointer to command details structure or NULL
5190 enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
5192 struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
5193 struct i40e_asq_cmd_details *cmd_details)
5195 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5196 i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
5201 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
5202 * @hw: pointer to the hw struct
5204 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
5205 * @cmd_details: pointer to command details structure or NULL
5207 enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
5209 struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
5210 struct i40e_asq_cmd_details *cmd_details)
5212 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5213 i40e_aqc_opc_configure_vsi_tc_bw,
5218 * i40e_aq_config_switch_comp_ets - Enable/Disable/Modify ETS on the port
5219 * @hw: pointer to the hw struct
5220 * @seid: seid of the switching component connected to Physical Port
5221 * @ets_data: Buffer holding ETS parameters
5222 * @cmd_details: pointer to command details structure or NULL
5224 enum i40e_status_code i40e_aq_config_switch_comp_ets(struct i40e_hw *hw,
5226 struct i40e_aqc_configure_switching_comp_ets_data *ets_data,
5227 enum i40e_admin_queue_opc opcode,
5228 struct i40e_asq_cmd_details *cmd_details)
5230 return i40e_aq_tx_sched_cmd(hw, seid, (void *)ets_data,
5231 sizeof(*ets_data), opcode, cmd_details);
5235 * i40e_aq_config_switch_comp_bw_config - Config Switch comp BW Alloc per TC
5236 * @hw: pointer to the hw struct
5237 * @seid: seid of the switching component
5238 * @bw_data: Buffer holding enabled TCs, relative/absolute TC BW limit/credits
5239 * @cmd_details: pointer to command details structure or NULL
5241 enum i40e_status_code i40e_aq_config_switch_comp_bw_config(struct i40e_hw *hw,
5243 struct i40e_aqc_configure_switching_comp_bw_config_data *bw_data,
5244 struct i40e_asq_cmd_details *cmd_details)
5246 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5247 i40e_aqc_opc_configure_switching_comp_bw_config,
5252 * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
5253 * @hw: pointer to the hw struct
5254 * @seid: seid of the switching component
5255 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5256 * @cmd_details: pointer to command details structure or NULL
5258 enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
5259 struct i40e_hw *hw, u16 seid,
5260 struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
5261 struct i40e_asq_cmd_details *cmd_details)
5263 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5264 i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
5269 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
5270 * @hw: pointer to the hw struct
5271 * @seid: seid of the VSI
5272 * @bw_data: Buffer to hold VSI BW configuration
5273 * @cmd_details: pointer to command details structure or NULL
5275 enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
5277 struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
5278 struct i40e_asq_cmd_details *cmd_details)
5280 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5281 i40e_aqc_opc_query_vsi_bw_config,
5286 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
5287 * @hw: pointer to the hw struct
5288 * @seid: seid of the VSI
5289 * @bw_data: Buffer to hold VSI BW configuration per TC
5290 * @cmd_details: pointer to command details structure or NULL
5292 enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
5294 struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
5295 struct i40e_asq_cmd_details *cmd_details)
5297 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5298 i40e_aqc_opc_query_vsi_ets_sla_config,
5303 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
5304 * @hw: pointer to the hw struct
5305 * @seid: seid of the switching component
5306 * @bw_data: Buffer to hold switching component's per TC BW config
5307 * @cmd_details: pointer to command details structure or NULL
5309 enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
5311 struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
5312 struct i40e_asq_cmd_details *cmd_details)
5314 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5315 i40e_aqc_opc_query_switching_comp_ets_config,
5320 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
5321 * @hw: pointer to the hw struct
5322 * @seid: seid of the VSI or switching component connected to Physical Port
5323 * @bw_data: Buffer to hold current ETS configuration for the Physical Port
5324 * @cmd_details: pointer to command details structure or NULL
5326 enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
5328 struct i40e_aqc_query_port_ets_config_resp *bw_data,
5329 struct i40e_asq_cmd_details *cmd_details)
5331 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5332 i40e_aqc_opc_query_port_ets_config,
5337 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
5338 * @hw: pointer to the hw struct
5339 * @seid: seid of the switching component
5340 * @bw_data: Buffer to hold switching component's BW configuration
5341 * @cmd_details: pointer to command details structure or NULL
5343 enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
5345 struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
5346 struct i40e_asq_cmd_details *cmd_details)
5348 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5349 i40e_aqc_opc_query_switching_comp_bw_config,
5354 * i40e_validate_filter_settings
5355 * @hw: pointer to the hardware structure
5356 * @settings: Filter control settings
5358 * Check and validate the filter control settings passed.
5359 * The function checks for the valid filter/context sizes being
5360 * passed for FCoE and PE.
5362 * Returns I40E_SUCCESS if the values passed are valid and within
5363 * range else returns an error.
5365 STATIC enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
5366 struct i40e_filter_control_settings *settings)
5368 u32 fcoe_cntx_size, fcoe_filt_size;
5369 u32 pe_cntx_size, pe_filt_size;
5374 /* Validate FCoE settings passed */
5375 switch (settings->fcoe_filt_num) {
5376 case I40E_HASH_FILTER_SIZE_1K:
5377 case I40E_HASH_FILTER_SIZE_2K:
5378 case I40E_HASH_FILTER_SIZE_4K:
5379 case I40E_HASH_FILTER_SIZE_8K:
5380 case I40E_HASH_FILTER_SIZE_16K:
5381 case I40E_HASH_FILTER_SIZE_32K:
5382 fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5383 fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
5386 return I40E_ERR_PARAM;
5389 switch (settings->fcoe_cntx_num) {
5390 case I40E_DMA_CNTX_SIZE_512:
5391 case I40E_DMA_CNTX_SIZE_1K:
5392 case I40E_DMA_CNTX_SIZE_2K:
5393 case I40E_DMA_CNTX_SIZE_4K:
5394 fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5395 fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
5398 return I40E_ERR_PARAM;
5401 /* Validate PE settings passed */
5402 switch (settings->pe_filt_num) {
5403 case I40E_HASH_FILTER_SIZE_1K:
5404 case I40E_HASH_FILTER_SIZE_2K:
5405 case I40E_HASH_FILTER_SIZE_4K:
5406 case I40E_HASH_FILTER_SIZE_8K:
5407 case I40E_HASH_FILTER_SIZE_16K:
5408 case I40E_HASH_FILTER_SIZE_32K:
5409 case I40E_HASH_FILTER_SIZE_64K:
5410 case I40E_HASH_FILTER_SIZE_128K:
5411 case I40E_HASH_FILTER_SIZE_256K:
5412 case I40E_HASH_FILTER_SIZE_512K:
5413 case I40E_HASH_FILTER_SIZE_1M:
5414 pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5415 pe_filt_size <<= (u32)settings->pe_filt_num;
5418 return I40E_ERR_PARAM;
5421 switch (settings->pe_cntx_num) {
5422 case I40E_DMA_CNTX_SIZE_512:
5423 case I40E_DMA_CNTX_SIZE_1K:
5424 case I40E_DMA_CNTX_SIZE_2K:
5425 case I40E_DMA_CNTX_SIZE_4K:
5426 case I40E_DMA_CNTX_SIZE_8K:
5427 case I40E_DMA_CNTX_SIZE_16K:
5428 case I40E_DMA_CNTX_SIZE_32K:
5429 case I40E_DMA_CNTX_SIZE_64K:
5430 case I40E_DMA_CNTX_SIZE_128K:
5431 case I40E_DMA_CNTX_SIZE_256K:
5432 pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5433 pe_cntx_size <<= (u32)settings->pe_cntx_num;
5436 return I40E_ERR_PARAM;
5439 /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
5440 val = rd32(hw, I40E_GLHMC_FCOEFMAX);
5441 fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
5442 >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
5443 if (fcoe_filt_size + fcoe_cntx_size > fcoe_fmax)
5444 return I40E_ERR_INVALID_SIZE;
5446 return I40E_SUCCESS;
5450 * i40e_set_filter_control
5451 * @hw: pointer to the hardware structure
5452 * @settings: Filter control settings
5454 * Set the Queue Filters for PE/FCoE and enable filters required
5455 * for a single PF. It is expected that these settings are programmed
5456 * at the driver initialization time.
5458 enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
5459 struct i40e_filter_control_settings *settings)
5461 enum i40e_status_code ret = I40E_SUCCESS;
5462 u32 hash_lut_size = 0;
5466 return I40E_ERR_PARAM;
5468 /* Validate the input settings */
5469 ret = i40e_validate_filter_settings(hw, settings);
5473 /* Read the PF Queue Filter control register */
5474 val = i40e_read_rx_ctl(hw, I40E_PFQF_CTL_0);
5476 /* Program required PE hash buckets for the PF */
5477 val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
5478 val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
5479 I40E_PFQF_CTL_0_PEHSIZE_MASK;
5480 /* Program required PE contexts for the PF */
5481 val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
5482 val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
5483 I40E_PFQF_CTL_0_PEDSIZE_MASK;
5485 /* Program required FCoE hash buckets for the PF */
5486 val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5487 val |= ((u32)settings->fcoe_filt_num <<
5488 I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
5489 I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5490 /* Program required FCoE DDP contexts for the PF */
5491 val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5492 val |= ((u32)settings->fcoe_cntx_num <<
5493 I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
5494 I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5496 /* Program Hash LUT size for the PF */
5497 val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5498 if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
5500 val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
5501 I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5503 /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
5504 if (settings->enable_fdir)
5505 val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
5506 if (settings->enable_ethtype)
5507 val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
5508 if (settings->enable_macvlan)
5509 val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
5511 i40e_write_rx_ctl(hw, I40E_PFQF_CTL_0, val);
5513 return I40E_SUCCESS;
5517 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
5518 * @hw: pointer to the hw struct
5519 * @mac_addr: MAC address to use in the filter
5520 * @ethtype: Ethertype to use in the filter
5521 * @flags: Flags that needs to be applied to the filter
5522 * @vsi_seid: seid of the control VSI
5523 * @queue: VSI queue number to send the packet to
5524 * @is_add: Add control packet filter if True else remove
5525 * @stats: Structure to hold information on control filter counts
5526 * @cmd_details: pointer to command details structure or NULL
5528 * This command will Add or Remove control packet filter for a control VSI.
5529 * In return it will update the total number of perfect filter count in
5532 enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
5533 u8 *mac_addr, u16 ethtype, u16 flags,
5534 u16 vsi_seid, u16 queue, bool is_add,
5535 struct i40e_control_filter_stats *stats,
5536 struct i40e_asq_cmd_details *cmd_details)
5538 struct i40e_aq_desc desc;
5539 struct i40e_aqc_add_remove_control_packet_filter *cmd =
5540 (struct i40e_aqc_add_remove_control_packet_filter *)
5542 struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
5543 (struct i40e_aqc_add_remove_control_packet_filter_completion *)
5545 enum i40e_status_code status;
5548 return I40E_ERR_PARAM;
5551 i40e_fill_default_direct_cmd_desc(&desc,
5552 i40e_aqc_opc_add_control_packet_filter);
5553 cmd->queue = CPU_TO_LE16(queue);
5555 i40e_fill_default_direct_cmd_desc(&desc,
5556 i40e_aqc_opc_remove_control_packet_filter);
5560 i40e_memcpy(cmd->mac, mac_addr, ETH_ALEN,
5561 I40E_NONDMA_TO_NONDMA);
5563 cmd->etype = CPU_TO_LE16(ethtype);
5564 cmd->flags = CPU_TO_LE16(flags);
5565 cmd->seid = CPU_TO_LE16(vsi_seid);
5567 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5569 if (!status && stats) {
5570 stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
5571 stats->etype_used = LE16_TO_CPU(resp->etype_used);
5572 stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
5573 stats->etype_free = LE16_TO_CPU(resp->etype_free);
5580 * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
5581 * @hw: pointer to the hw struct
5582 * @seid: VSI seid to add ethertype filter from
5584 #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
5585 void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
5588 u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
5589 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
5590 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
5591 u16 ethtype = I40E_FLOW_CONTROL_ETHTYPE;
5592 enum i40e_status_code status;
5594 status = i40e_aq_add_rem_control_packet_filter(hw, NULL, ethtype, flag,
5595 seid, 0, true, NULL,
5598 DEBUGOUT("Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
5602 * i40e_fix_up_geneve_vni - adjust Geneve VNI for HW issue
5603 * @filters: list of cloud filters
5604 * @filter_count: length of list
5606 * There's an issue in the device where the Geneve VNI layout needs
5607 * to be shifted 1 byte over from the VxLAN VNI
5609 STATIC void i40e_fix_up_geneve_vni(
5610 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5613 struct i40e_aqc_add_remove_cloud_filters_element_data *f = filters;
5616 for (i = 0; i < filter_count; i++) {
5620 tnl_type = (LE16_TO_CPU(f[i].flags) &
5621 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5622 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5623 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5624 ti = LE32_TO_CPU(f[i].tenant_id);
5625 f[i].tenant_id = CPU_TO_LE32(ti << 8);
5631 * i40e_aq_add_cloud_filters
5632 * @hw: pointer to the hardware structure
5633 * @seid: VSI seid to add cloud filters from
5634 * @filters: Buffer which contains the filters to be added
5635 * @filter_count: number of filters contained in the buffer
5637 * Set the cloud filters for a given VSI. The contents of the
5638 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5639 * in by the caller of the function.
5642 enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
5644 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5647 struct i40e_aq_desc desc;
5648 struct i40e_aqc_add_remove_cloud_filters *cmd =
5649 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5650 enum i40e_status_code status;
5653 i40e_fill_default_direct_cmd_desc(&desc,
5654 i40e_aqc_opc_add_cloud_filters);
5656 buff_len = filter_count * sizeof(*filters);
5657 desc.datalen = CPU_TO_LE16(buff_len);
5658 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5659 cmd->num_filters = filter_count;
5660 cmd->seid = CPU_TO_LE16(seid);
5662 i40e_fix_up_geneve_vni(filters, filter_count);
5664 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5670 * i40e_aq_add_cloud_filters_big_buffer
5671 * @hw: pointer to the hardware structure
5672 * @seid: VSI seid to add cloud filters from
5673 * @filters: Buffer which contains the filters in big buffer to be added
5674 * @filter_count: number of filters contained in the buffer
5676 * Set the cloud filters for a given VSI. The contents of the
5677 * i40e_aqc_add_rm_cloud_filt_elem_ext are filled in by the caller of
5681 enum i40e_status_code i40e_aq_add_cloud_filters_big_buffer(struct i40e_hw *hw,
5683 struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
5686 struct i40e_aq_desc desc;
5687 struct i40e_aqc_add_remove_cloud_filters *cmd =
5688 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5689 enum i40e_status_code status;
5693 i40e_fill_default_direct_cmd_desc(&desc,
5694 i40e_aqc_opc_add_cloud_filters);
5696 buff_len = filter_count * sizeof(*filters);
5697 desc.datalen = CPU_TO_LE16(buff_len);
5698 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5699 cmd->num_filters = filter_count;
5700 cmd->seid = CPU_TO_LE16(seid);
5701 cmd->big_buffer_flag = I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER;
5703 /* adjust Geneve VNI for HW issue */
5704 for (i = 0; i < filter_count; i++) {
5708 tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5709 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5710 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5711 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5712 ti = LE32_TO_CPU(filters[i].element.tenant_id);
5713 filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5717 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5723 * i40e_aq_remove_cloud_filters
5724 * @hw: pointer to the hardware structure
5725 * @seid: VSI seid to remove cloud filters from
5726 * @filters: Buffer which contains the filters to be removed
5727 * @filter_count: number of filters contained in the buffer
5729 * Remove the cloud filters for a given VSI. The contents of the
5730 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5731 * in by the caller of the function.
5734 enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
5736 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5739 struct i40e_aq_desc desc;
5740 struct i40e_aqc_add_remove_cloud_filters *cmd =
5741 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5742 enum i40e_status_code status;
5745 i40e_fill_default_direct_cmd_desc(&desc,
5746 i40e_aqc_opc_remove_cloud_filters);
5748 buff_len = filter_count * sizeof(*filters);
5749 desc.datalen = CPU_TO_LE16(buff_len);
5750 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5751 cmd->num_filters = filter_count;
5752 cmd->seid = CPU_TO_LE16(seid);
5754 i40e_fix_up_geneve_vni(filters, filter_count);
5756 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5762 * i40e_aq_remove_cloud_filters_big_buffer
5763 * @hw: pointer to the hardware structure
5764 * @seid: VSI seid to remove cloud filters from
5765 * @filters: Buffer which contains the filters in big buffer to be removed
5766 * @filter_count: number of filters contained in the buffer
5768 * Remove the cloud filters for a given VSI. The contents of the
5769 * i40e_aqc_add_rm_cloud_filt_elem_ext are filled in by the caller of
5773 enum i40e_status_code i40e_aq_remove_cloud_filters_big_buffer(
5776 struct i40e_aqc_add_rm_cloud_filt_elem_ext *filters,
5779 struct i40e_aq_desc desc;
5780 struct i40e_aqc_add_remove_cloud_filters *cmd =
5781 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5782 enum i40e_status_code status;
5786 i40e_fill_default_direct_cmd_desc(&desc,
5787 i40e_aqc_opc_remove_cloud_filters);
5789 buff_len = filter_count * sizeof(*filters);
5790 desc.datalen = CPU_TO_LE16(buff_len);
5791 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5792 cmd->num_filters = filter_count;
5793 cmd->seid = CPU_TO_LE16(seid);
5794 cmd->big_buffer_flag = I40E_AQC_ADD_REM_CLOUD_CMD_BIG_BUFFER;
5796 /* adjust Geneve VNI for HW issue */
5797 for (i = 0; i < filter_count; i++) {
5801 tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5802 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5803 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5804 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5805 ti = LE32_TO_CPU(filters[i].element.tenant_id);
5806 filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5810 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5816 * i40e_aq_replace_cloud_filters - Replace cloud filter command
5817 * @hw: pointer to the hw struct
5818 * @filters: pointer to the i40e_aqc_replace_cloud_filter_cmd struct
5819 * @cmd_buf: pointer to the i40e_aqc_replace_cloud_filter_cmd_buf struct
5823 i40e_status_code i40e_aq_replace_cloud_filters(struct i40e_hw *hw,
5824 struct i40e_aqc_replace_cloud_filters_cmd *filters,
5825 struct i40e_aqc_replace_cloud_filters_cmd_buf *cmd_buf)
5827 struct i40e_aq_desc desc;
5828 struct i40e_aqc_replace_cloud_filters_cmd *cmd =
5829 (struct i40e_aqc_replace_cloud_filters_cmd *)&desc.params.raw;
5830 enum i40e_status_code status = I40E_SUCCESS;
5833 i40e_fill_default_direct_cmd_desc(&desc,
5834 i40e_aqc_opc_replace_cloud_filters);
5836 desc.datalen = CPU_TO_LE16(32);
5837 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5838 cmd->old_filter_type = filters->old_filter_type;
5839 cmd->new_filter_type = filters->new_filter_type;
5840 cmd->valid_flags = filters->valid_flags;
5841 cmd->tr_bit = filters->tr_bit;
5843 status = i40e_asq_send_command(hw, &desc, cmd_buf,
5844 sizeof(struct i40e_aqc_replace_cloud_filters_cmd_buf), NULL);
5846 /* for get cloud filters command */
5847 for (i = 0; i < 32; i += 4) {
5848 cmd_buf->filters[i / 4].filter_type = cmd_buf->data[i];
5849 cmd_buf->filters[i / 4].input[0] = cmd_buf->data[i + 1];
5850 cmd_buf->filters[i / 4].input[1] = cmd_buf->data[i + 2];
5851 cmd_buf->filters[i / 4].input[2] = cmd_buf->data[i + 3];
5859 * i40e_aq_alternate_write
5860 * @hw: pointer to the hardware structure
5861 * @reg_addr0: address of first dword to be read
5862 * @reg_val0: value to be written under 'reg_addr0'
5863 * @reg_addr1: address of second dword to be read
5864 * @reg_val1: value to be written under 'reg_addr1'
5866 * Write one or two dwords to alternate structure. Fields are indicated
5867 * by 'reg_addr0' and 'reg_addr1' register numbers.
5870 enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
5871 u32 reg_addr0, u32 reg_val0,
5872 u32 reg_addr1, u32 reg_val1)
5874 struct i40e_aq_desc desc;
5875 struct i40e_aqc_alternate_write *cmd_resp =
5876 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5877 enum i40e_status_code status;
5879 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
5880 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5881 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5882 cmd_resp->data0 = CPU_TO_LE32(reg_val0);
5883 cmd_resp->data1 = CPU_TO_LE32(reg_val1);
5885 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5891 * i40e_aq_alternate_write_indirect
5892 * @hw: pointer to the hardware structure
5893 * @addr: address of a first register to be modified
5894 * @dw_count: number of alternate structure fields to write
5895 * @buffer: pointer to the command buffer
5897 * Write 'dw_count' dwords from 'buffer' to alternate structure
5898 * starting at 'addr'.
5901 enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
5902 u32 addr, u32 dw_count, void *buffer)
5904 struct i40e_aq_desc desc;
5905 struct i40e_aqc_alternate_ind_write *cmd_resp =
5906 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5907 enum i40e_status_code status;
5910 return I40E_ERR_PARAM;
5912 /* Indirect command */
5913 i40e_fill_default_direct_cmd_desc(&desc,
5914 i40e_aqc_opc_alternate_write_indirect);
5916 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5917 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5918 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5919 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5921 cmd_resp->address = CPU_TO_LE32(addr);
5922 cmd_resp->length = CPU_TO_LE32(dw_count);
5924 status = i40e_asq_send_command(hw, &desc, buffer,
5925 I40E_LO_DWORD(4*dw_count), NULL);
5931 * i40e_aq_alternate_read
5932 * @hw: pointer to the hardware structure
5933 * @reg_addr0: address of first dword to be read
5934 * @reg_val0: pointer for data read from 'reg_addr0'
5935 * @reg_addr1: address of second dword to be read
5936 * @reg_val1: pointer for data read from 'reg_addr1'
5938 * Read one or two dwords from alternate structure. Fields are indicated
5939 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
5940 * is not passed then only register at 'reg_addr0' is read.
5943 enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
5944 u32 reg_addr0, u32 *reg_val0,
5945 u32 reg_addr1, u32 *reg_val1)
5947 struct i40e_aq_desc desc;
5948 struct i40e_aqc_alternate_write *cmd_resp =
5949 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5950 enum i40e_status_code status;
5952 if (reg_val0 == NULL)
5953 return I40E_ERR_PARAM;
5955 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
5956 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5957 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5959 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5961 if (status == I40E_SUCCESS) {
5962 *reg_val0 = LE32_TO_CPU(cmd_resp->data0);
5964 if (reg_val1 != NULL)
5965 *reg_val1 = LE32_TO_CPU(cmd_resp->data1);
5972 * i40e_aq_alternate_read_indirect
5973 * @hw: pointer to the hardware structure
5974 * @addr: address of the alternate structure field
5975 * @dw_count: number of alternate structure fields to read
5976 * @buffer: pointer to the command buffer
5978 * Read 'dw_count' dwords from alternate structure starting at 'addr' and
5979 * place them in 'buffer'. The buffer should be allocated by caller.
5982 enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
5983 u32 addr, u32 dw_count, void *buffer)
5985 struct i40e_aq_desc desc;
5986 struct i40e_aqc_alternate_ind_write *cmd_resp =
5987 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5988 enum i40e_status_code status;
5991 return I40E_ERR_PARAM;
5993 /* Indirect command */
5994 i40e_fill_default_direct_cmd_desc(&desc,
5995 i40e_aqc_opc_alternate_read_indirect);
5997 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5998 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5999 if (dw_count > (I40E_AQ_LARGE_BUF/4))
6000 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6002 cmd_resp->address = CPU_TO_LE32(addr);
6003 cmd_resp->length = CPU_TO_LE32(dw_count);
6005 status = i40e_asq_send_command(hw, &desc, buffer,
6006 I40E_LO_DWORD(4*dw_count), NULL);
6012 * i40e_aq_alternate_clear
6013 * @hw: pointer to the HW structure.
6015 * Clear the alternate structures of the port from which the function
6019 enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
6021 struct i40e_aq_desc desc;
6022 enum i40e_status_code status;
6024 i40e_fill_default_direct_cmd_desc(&desc,
6025 i40e_aqc_opc_alternate_clear_port);
6027 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6033 * i40e_aq_alternate_write_done
6034 * @hw: pointer to the HW structure.
6035 * @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
6036 * @reset_needed: indicates the SW should trigger GLOBAL reset
6038 * Indicates to the FW that alternate structures have been changed.
6041 enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
6042 u8 bios_mode, bool *reset_needed)
6044 struct i40e_aq_desc desc;
6045 struct i40e_aqc_alternate_write_done *cmd =
6046 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
6047 enum i40e_status_code status;
6049 if (reset_needed == NULL)
6050 return I40E_ERR_PARAM;
6052 i40e_fill_default_direct_cmd_desc(&desc,
6053 i40e_aqc_opc_alternate_write_done);
6055 cmd->cmd_flags = CPU_TO_LE16(bios_mode);
6057 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6058 if (!status && reset_needed)
6059 *reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
6060 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
6066 * i40e_aq_set_oem_mode
6067 * @hw: pointer to the HW structure.
6068 * @oem_mode: the OEM mode to be used
6070 * Sets the device to a specific operating mode. Currently the only supported
6071 * mode is no_clp, which causes FW to refrain from using Alternate RAM.
6074 enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
6077 struct i40e_aq_desc desc;
6078 struct i40e_aqc_alternate_write_done *cmd =
6079 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
6080 enum i40e_status_code status;
6082 i40e_fill_default_direct_cmd_desc(&desc,
6083 i40e_aqc_opc_alternate_set_mode);
6085 cmd->cmd_flags = CPU_TO_LE16(oem_mode);
6087 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6093 * i40e_aq_resume_port_tx
6094 * @hw: pointer to the hardware structure
6095 * @cmd_details: pointer to command details structure or NULL
6097 * Resume port's Tx traffic
6099 enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
6100 struct i40e_asq_cmd_details *cmd_details)
6102 struct i40e_aq_desc desc;
6103 enum i40e_status_code status;
6105 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
6107 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6113 * i40e_set_pci_config_data - store PCI bus info
6114 * @hw: pointer to hardware structure
6115 * @link_status: the link status word from PCI config space
6117 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
6119 void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
6121 hw->bus.type = i40e_bus_type_pci_express;
6123 switch (link_status & I40E_PCI_LINK_WIDTH) {
6124 case I40E_PCI_LINK_WIDTH_1:
6125 hw->bus.width = i40e_bus_width_pcie_x1;
6127 case I40E_PCI_LINK_WIDTH_2:
6128 hw->bus.width = i40e_bus_width_pcie_x2;
6130 case I40E_PCI_LINK_WIDTH_4:
6131 hw->bus.width = i40e_bus_width_pcie_x4;
6133 case I40E_PCI_LINK_WIDTH_8:
6134 hw->bus.width = i40e_bus_width_pcie_x8;
6137 hw->bus.width = i40e_bus_width_unknown;
6141 switch (link_status & I40E_PCI_LINK_SPEED) {
6142 case I40E_PCI_LINK_SPEED_2500:
6143 hw->bus.speed = i40e_bus_speed_2500;
6145 case I40E_PCI_LINK_SPEED_5000:
6146 hw->bus.speed = i40e_bus_speed_5000;
6148 case I40E_PCI_LINK_SPEED_8000:
6149 hw->bus.speed = i40e_bus_speed_8000;
6152 hw->bus.speed = i40e_bus_speed_unknown;
6158 * i40e_aq_debug_dump
6159 * @hw: pointer to the hardware structure
6160 * @cluster_id: specific cluster to dump
6161 * @table_id: table id within cluster
6162 * @start_index: index of line in the block to read
6163 * @buff_size: dump buffer size
6164 * @buff: dump buffer
6165 * @ret_buff_size: actual buffer size returned
6166 * @ret_next_table: next block to read
6167 * @ret_next_index: next index to read
6169 * Dump internal FW/HW data for debug purposes.
6172 enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
6173 u8 table_id, u32 start_index, u16 buff_size,
6174 void *buff, u16 *ret_buff_size,
6175 u8 *ret_next_table, u32 *ret_next_index,
6176 struct i40e_asq_cmd_details *cmd_details)
6178 struct i40e_aq_desc desc;
6179 struct i40e_aqc_debug_dump_internals *cmd =
6180 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
6181 struct i40e_aqc_debug_dump_internals *resp =
6182 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
6183 enum i40e_status_code status;
6185 if (buff_size == 0 || !buff)
6186 return I40E_ERR_PARAM;
6188 i40e_fill_default_direct_cmd_desc(&desc,
6189 i40e_aqc_opc_debug_dump_internals);
6190 /* Indirect Command */
6191 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
6192 if (buff_size > I40E_AQ_LARGE_BUF)
6193 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6195 cmd->cluster_id = cluster_id;
6196 cmd->table_id = table_id;
6197 cmd->idx = CPU_TO_LE32(start_index);
6199 desc.datalen = CPU_TO_LE16(buff_size);
6201 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
6203 if (ret_buff_size != NULL)
6204 *ret_buff_size = LE16_TO_CPU(desc.datalen);
6205 if (ret_next_table != NULL)
6206 *ret_next_table = resp->table_id;
6207 if (ret_next_index != NULL)
6208 *ret_next_index = LE32_TO_CPU(resp->idx);
6215 * i40e_read_bw_from_alt_ram
6216 * @hw: pointer to the hardware structure
6217 * @max_bw: pointer for max_bw read
6218 * @min_bw: pointer for min_bw read
6219 * @min_valid: pointer for bool that is true if min_bw is a valid value
6220 * @max_valid: pointer for bool that is true if max_bw is a valid value
6222 * Read bw from the alternate ram for the given pf
6224 enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
6225 u32 *max_bw, u32 *min_bw,
6226 bool *min_valid, bool *max_valid)
6228 enum i40e_status_code status;
6229 u32 max_bw_addr, min_bw_addr;
6231 /* Calculate the address of the min/max bw registers */
6232 max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
6233 I40E_ALT_STRUCT_MAX_BW_OFFSET +
6234 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
6235 min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
6236 I40E_ALT_STRUCT_MIN_BW_OFFSET +
6237 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
6239 /* Read the bandwidths from alt ram */
6240 status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
6241 min_bw_addr, min_bw);
6243 if (*min_bw & I40E_ALT_BW_VALID_MASK)
6248 if (*max_bw & I40E_ALT_BW_VALID_MASK)
6257 * i40e_aq_configure_partition_bw
6258 * @hw: pointer to the hardware structure
6259 * @bw_data: Buffer holding valid pfs and bw limits
6260 * @cmd_details: pointer to command details
6262 * Configure partitions guaranteed/max bw
6264 enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
6265 struct i40e_aqc_configure_partition_bw_data *bw_data,
6266 struct i40e_asq_cmd_details *cmd_details)
6268 enum i40e_status_code status;
6269 struct i40e_aq_desc desc;
6270 u16 bwd_size = sizeof(*bw_data);
6272 i40e_fill_default_direct_cmd_desc(&desc,
6273 i40e_aqc_opc_configure_partition_bw);
6275 /* Indirect command */
6276 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
6277 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
6279 desc.datalen = CPU_TO_LE16(bwd_size);
6281 status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
6287 * i40e_read_phy_register_clause22
6288 * @hw: pointer to the HW structure
6289 * @reg: register address in the page
6290 * @phy_adr: PHY address on MDIO interface
6291 * @value: PHY register value
6293 * Reads specified PHY register value
6295 enum i40e_status_code i40e_read_phy_register_clause22(struct i40e_hw *hw,
6296 u16 reg, u8 phy_addr, u16 *value)
6298 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6299 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6303 command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6304 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6305 (I40E_MDIO_CLAUSE22_OPCODE_READ_MASK) |
6306 (I40E_MDIO_CLAUSE22_STCODE_MASK) |
6307 (I40E_GLGEN_MSCA_MDICMD_MASK);
6308 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6310 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6311 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6312 status = I40E_SUCCESS;
6315 i40e_usec_delay(10);
6320 i40e_debug(hw, I40E_DEBUG_PHY,
6321 "PHY: Can't write command to external PHY.\n");
6323 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6324 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6325 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6332 * i40e_write_phy_register_clause22
6333 * @hw: pointer to the HW structure
6334 * @reg: register address in the page
6335 * @phy_adr: PHY address on MDIO interface
6336 * @value: PHY register value
6338 * Writes specified PHY register value
6340 enum i40e_status_code i40e_write_phy_register_clause22(struct i40e_hw *hw,
6341 u16 reg, u8 phy_addr, u16 value)
6343 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6344 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6348 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6349 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6351 command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6352 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6353 (I40E_MDIO_CLAUSE22_OPCODE_WRITE_MASK) |
6354 (I40E_MDIO_CLAUSE22_STCODE_MASK) |
6355 (I40E_GLGEN_MSCA_MDICMD_MASK);
6357 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6359 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6360 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6361 status = I40E_SUCCESS;
6364 i40e_usec_delay(10);
6372 * i40e_read_phy_register_clause45
6373 * @hw: pointer to the HW structure
6374 * @page: registers page number
6375 * @reg: register address in the page
6376 * @phy_adr: PHY address on MDIO interface
6377 * @value: PHY register value
6379 * Reads specified PHY register value
6381 enum i40e_status_code i40e_read_phy_register_clause45(struct i40e_hw *hw,
6382 u8 page, u16 reg, u8 phy_addr, u16 *value)
6384 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6387 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6389 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6390 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6391 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6392 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6393 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6394 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6395 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6396 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6398 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6399 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6400 status = I40E_SUCCESS;
6403 i40e_usec_delay(10);
6408 i40e_debug(hw, I40E_DEBUG_PHY,
6409 "PHY: Can't write command to external PHY.\n");
6413 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6414 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6415 (I40E_MDIO_CLAUSE45_OPCODE_READ_MASK) |
6416 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6417 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6418 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6419 status = I40E_ERR_TIMEOUT;
6421 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6423 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6424 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6425 status = I40E_SUCCESS;
6428 i40e_usec_delay(10);
6433 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6434 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6435 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6437 i40e_debug(hw, I40E_DEBUG_PHY,
6438 "PHY: Can't read register value from external PHY.\n");
6446 * i40e_write_phy_register_clause45
6447 * @hw: pointer to the HW structure
6448 * @page: registers page number
6449 * @reg: register address in the page
6450 * @phy_adr: PHY address on MDIO interface
6451 * @value: PHY register value
6453 * Writes value to specified PHY register
6455 enum i40e_status_code i40e_write_phy_register_clause45(struct i40e_hw *hw,
6456 u8 page, u16 reg, u8 phy_addr, u16 value)
6458 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6461 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6463 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6464 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6465 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6466 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6467 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6468 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6469 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6470 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6472 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6473 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6474 status = I40E_SUCCESS;
6477 i40e_usec_delay(10);
6481 i40e_debug(hw, I40E_DEBUG_PHY,
6482 "PHY: Can't write command to external PHY.\n");
6486 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6487 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6489 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6490 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6491 (I40E_MDIO_CLAUSE45_OPCODE_WRITE_MASK) |
6492 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6493 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6494 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6495 status = I40E_ERR_TIMEOUT;
6497 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6499 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6500 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6501 status = I40E_SUCCESS;
6504 i40e_usec_delay(10);
6513 * i40e_write_phy_register
6514 * @hw: pointer to the HW structure
6515 * @page: registers page number
6516 * @reg: register address in the page
6517 * @phy_adr: PHY address on MDIO interface
6518 * @value: PHY register value
6520 * Writes value to specified PHY register
6522 enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
6523 u8 page, u16 reg, u8 phy_addr, u16 value)
6525 enum i40e_status_code status;
6527 switch (hw->device_id) {
6528 case I40E_DEV_ID_1G_BASE_T_X722:
6529 status = i40e_write_phy_register_clause22(hw,
6530 reg, phy_addr, value);
6532 case I40E_DEV_ID_10G_BASE_T:
6533 case I40E_DEV_ID_10G_BASE_T4:
6534 case I40E_DEV_ID_10G_BASE_T_X722:
6535 case I40E_DEV_ID_25G_B:
6536 case I40E_DEV_ID_25G_SFP28:
6537 status = i40e_write_phy_register_clause45(hw,
6538 page, reg, phy_addr, value);
6541 status = I40E_ERR_UNKNOWN_PHY;
6549 * i40e_read_phy_register
6550 * @hw: pointer to the HW structure
6551 * @page: registers page number
6552 * @reg: register address in the page
6553 * @phy_adr: PHY address on MDIO interface
6554 * @value: PHY register value
6556 * Reads specified PHY register value
6558 enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
6559 u8 page, u16 reg, u8 phy_addr, u16 *value)
6561 enum i40e_status_code status;
6563 switch (hw->device_id) {
6564 case I40E_DEV_ID_1G_BASE_T_X722:
6565 status = i40e_read_phy_register_clause22(hw, reg, phy_addr,
6568 case I40E_DEV_ID_10G_BASE_T:
6569 case I40E_DEV_ID_10G_BASE_T4:
6570 case I40E_DEV_ID_10G_BASE_T_X722:
6571 case I40E_DEV_ID_25G_B:
6572 case I40E_DEV_ID_25G_SFP28:
6573 status = i40e_read_phy_register_clause45(hw, page, reg,
6577 status = I40E_ERR_UNKNOWN_PHY;
6585 * i40e_get_phy_address
6586 * @hw: pointer to the HW structure
6587 * @dev_num: PHY port num that address we want
6588 * @phy_addr: Returned PHY address
6590 * Gets PHY address for current port
6592 u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num)
6594 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6595 u32 reg_val = rd32(hw, I40E_GLGEN_MDIO_I2C_SEL(port_num));
6597 return (u8)(reg_val >> ((dev_num + 1) * 5)) & 0x1f;
6601 * i40e_blink_phy_led
6602 * @hw: pointer to the HW structure
6603 * @time: time how long led will blinks in secs
6604 * @interval: gap between LED on and off in msecs
6606 * Blinks PHY link LED
6608 enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
6609 u32 time, u32 interval)
6611 enum i40e_status_code status = I40E_SUCCESS;
6616 u16 led_addr = I40E_PHY_LED_PROV_REG_1;
6620 i = rd32(hw, I40E_PFGEN_PORTNUM);
6621 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6622 phy_addr = i40e_get_phy_address(hw, port_num);
6624 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6626 status = i40e_read_phy_register_clause45(hw,
6627 I40E_PHY_COM_REG_PAGE,
6631 goto phy_blinking_end;
6633 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6635 status = i40e_write_phy_register_clause45(hw,
6636 I40E_PHY_COM_REG_PAGE,
6640 goto phy_blinking_end;
6645 if (time > 0 && interval > 0) {
6646 for (i = 0; i < time * 1000; i += interval) {
6647 status = i40e_read_phy_register_clause45(hw,
6648 I40E_PHY_COM_REG_PAGE,
6649 led_addr, phy_addr, &led_reg);
6651 goto restore_config;
6652 if (led_reg & I40E_PHY_LED_MANUAL_ON)
6655 led_reg = I40E_PHY_LED_MANUAL_ON;
6656 status = i40e_write_phy_register_clause45(hw,
6657 I40E_PHY_COM_REG_PAGE,
6658 led_addr, phy_addr, led_reg);
6660 goto restore_config;
6661 i40e_msec_delay(interval);
6666 status = i40e_write_phy_register_clause45(hw,
6667 I40E_PHY_COM_REG_PAGE,
6668 led_addr, phy_addr, led_ctl);
6675 * i40e_led_get_phy - return current on/off mode
6676 * @hw: pointer to the hw struct
6677 * @led_addr: address of led register to use
6678 * @val: original value of register to use
6681 enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
6684 enum i40e_status_code status = I40E_SUCCESS;
6693 if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6695 i40e_aq_get_phy_register(hw,
6696 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6697 I40E_PHY_COM_REG_PAGE,
6698 I40E_PHY_LED_PROV_REG_1,
6702 *val = (u16)reg_val_aq;
6704 temp_addr = I40E_PHY_LED_PROV_REG_1;
6705 i = rd32(hw, I40E_PFGEN_PORTNUM);
6706 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6707 phy_addr = i40e_get_phy_address(hw, port_num);
6709 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6712 i40e_read_phy_register_clause45(hw,
6713 I40E_PHY_COM_REG_PAGE,
6714 temp_addr, phy_addr,
6719 if (reg_val & I40E_PHY_LED_LINK_MODE_MASK) {
6720 *led_addr = temp_addr;
6730 * @hw: pointer to the HW structure
6731 * @on: true or false
6732 * @mode: original val plus bit for set or ignore
6733 * Set led's on or off when controlled by the PHY
6736 enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
6737 u16 led_addr, u32 mode)
6739 enum i40e_status_code status = I40E_SUCCESS;
6746 if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6748 i40e_aq_get_phy_register(hw,
6749 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6750 I40E_PHY_COM_REG_PAGE,
6751 I40E_PHY_LED_PROV_REG_1,
6754 i = rd32(hw, I40E_PFGEN_PORTNUM);
6755 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6756 phy_addr = i40e_get_phy_address(hw, port_num);
6757 status = i40e_read_phy_register_clause45(hw,
6758 I40E_PHY_COM_REG_PAGE,
6765 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6767 if (hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&
6768 hw->aq.api_min_ver >= I40E_MINOR_VER_GET_LINK_INFO_XL710) {
6769 status = i40e_aq_set_phy_register(hw,
6770 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6771 I40E_PHY_COM_REG_PAGE,
6772 I40E_PHY_LED_PROV_REG_1,
6775 status = i40e_write_phy_register_clause45(hw,
6776 I40E_PHY_COM_REG_PAGE,
6783 if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6785 i40e_aq_get_phy_register(hw,
6786 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6787 I40E_PHY_COM_REG_PAGE,
6788 I40E_PHY_LED_PROV_REG_1,
6791 status = i40e_read_phy_register_clause45(hw,
6792 I40E_PHY_COM_REG_PAGE,
6797 goto restore_config;
6799 led_reg = I40E_PHY_LED_MANUAL_ON;
6803 if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6805 i40e_aq_set_phy_register(hw,
6806 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6807 I40E_PHY_COM_REG_PAGE,
6808 I40E_PHY_LED_PROV_REG_1,
6812 i40e_write_phy_register_clause45(hw, I40E_PHY_COM_REG_PAGE,
6817 goto restore_config;
6818 if (mode & I40E_PHY_LED_MODE_ORIG) {
6819 led_ctl = (mode & I40E_PHY_LED_MODE_MASK);
6820 if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6821 status = i40e_aq_set_phy_register(hw,
6822 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6823 I40E_PHY_COM_REG_PAGE,
6824 I40E_PHY_LED_PROV_REG_1,
6827 status = i40e_write_phy_register_clause45(hw,
6828 I40E_PHY_COM_REG_PAGE,
6835 if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6837 i40e_aq_set_phy_register(hw,
6838 I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6839 I40E_PHY_COM_REG_PAGE,
6840 I40E_PHY_LED_PROV_REG_1,
6844 i40e_write_phy_register_clause45(hw,
6845 I40E_PHY_COM_REG_PAGE,
6851 #endif /* PF_DRIVER */
6854 * i40e_aq_rx_ctl_read_register - use FW to read from an Rx control register
6855 * @hw: pointer to the hw struct
6856 * @reg_addr: register address
6857 * @reg_val: ptr to register value
6858 * @cmd_details: pointer to command details structure or NULL
6860 * Use the firmware to read the Rx control register,
6861 * especially useful if the Rx unit is under heavy pressure
6863 enum i40e_status_code i40e_aq_rx_ctl_read_register(struct i40e_hw *hw,
6864 u32 reg_addr, u32 *reg_val,
6865 struct i40e_asq_cmd_details *cmd_details)
6867 struct i40e_aq_desc desc;
6868 struct i40e_aqc_rx_ctl_reg_read_write *cmd_resp =
6869 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6870 enum i40e_status_code status;
6872 if (reg_val == NULL)
6873 return I40E_ERR_PARAM;
6875 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_read);
6877 cmd_resp->address = CPU_TO_LE32(reg_addr);
6879 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6881 if (status == I40E_SUCCESS)
6882 *reg_val = LE32_TO_CPU(cmd_resp->value);
6888 * i40e_read_rx_ctl - read from an Rx control register
6889 * @hw: pointer to the hw struct
6890 * @reg_addr: register address
6892 u32 i40e_read_rx_ctl(struct i40e_hw *hw, u32 reg_addr)
6894 enum i40e_status_code status = I40E_SUCCESS;
6899 use_register = (((hw->aq.api_maj_ver == 1) &&
6900 (hw->aq.api_min_ver < 5)) ||
6901 (hw->mac.type == I40E_MAC_X722));
6902 if (!use_register) {
6904 status = i40e_aq_rx_ctl_read_register(hw, reg_addr, &val, NULL);
6905 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6912 /* if the AQ access failed, try the old-fashioned way */
6913 if (status || use_register)
6914 val = rd32(hw, reg_addr);
6920 * i40e_aq_rx_ctl_write_register
6921 * @hw: pointer to the hw struct
6922 * @reg_addr: register address
6923 * @reg_val: register value
6924 * @cmd_details: pointer to command details structure or NULL
6926 * Use the firmware to write to an Rx control register,
6927 * especially useful if the Rx unit is under heavy pressure
6929 enum i40e_status_code i40e_aq_rx_ctl_write_register(struct i40e_hw *hw,
6930 u32 reg_addr, u32 reg_val,
6931 struct i40e_asq_cmd_details *cmd_details)
6933 struct i40e_aq_desc desc;
6934 struct i40e_aqc_rx_ctl_reg_read_write *cmd =
6935 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6936 enum i40e_status_code status;
6938 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_write);
6940 cmd->address = CPU_TO_LE32(reg_addr);
6941 cmd->value = CPU_TO_LE32(reg_val);
6943 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6949 * i40e_write_rx_ctl - write to an Rx control register
6950 * @hw: pointer to the hw struct
6951 * @reg_addr: register address
6952 * @reg_val: register value
6954 void i40e_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val)
6956 enum i40e_status_code status = I40E_SUCCESS;
6960 use_register = (((hw->aq.api_maj_ver == 1) &&
6961 (hw->aq.api_min_ver < 5)) ||
6962 (hw->mac.type == I40E_MAC_X722));
6963 if (!use_register) {
6965 status = i40e_aq_rx_ctl_write_register(hw, reg_addr,
6967 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6974 /* if the AQ access failed, try the old-fashioned way */
6975 if (status || use_register)
6976 wr32(hw, reg_addr, reg_val);
6980 * i40e_aq_set_phy_register
6981 * @hw: pointer to the hw struct
6982 * @phy_select: select which phy should be accessed
6983 * @dev_addr: PHY device address
6984 * @reg_addr: PHY register address
6985 * @reg_val: new register value
6986 * @cmd_details: pointer to command details structure or NULL
6988 * Write the external PHY register.
6990 enum i40e_status_code i40e_aq_set_phy_register(struct i40e_hw *hw,
6991 u8 phy_select, u8 dev_addr,
6992 u32 reg_addr, u32 reg_val,
6993 struct i40e_asq_cmd_details *cmd_details)
6995 struct i40e_aq_desc desc;
6996 struct i40e_aqc_phy_register_access *cmd =
6997 (struct i40e_aqc_phy_register_access *)&desc.params.raw;
6998 enum i40e_status_code status;
7000 i40e_fill_default_direct_cmd_desc(&desc,
7001 i40e_aqc_opc_set_phy_register);
7003 cmd->phy_interface = phy_select;
7004 cmd->dev_addres = dev_addr;
7005 cmd->reg_address = reg_addr;
7006 cmd->reg_value = reg_val;
7008 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7014 * i40e_aq_get_phy_register
7015 * @hw: pointer to the hw struct
7016 * @phy_select: select which phy should be accessed
7017 * @dev_addr: PHY device address
7018 * @reg_addr: PHY register address
7019 * @reg_val: read register value
7020 * @cmd_details: pointer to command details structure or NULL
7022 * Read the external PHY register.
7024 enum i40e_status_code i40e_aq_get_phy_register(struct i40e_hw *hw,
7025 u8 phy_select, u8 dev_addr,
7026 u32 reg_addr, u32 *reg_val,
7027 struct i40e_asq_cmd_details *cmd_details)
7029 struct i40e_aq_desc desc;
7030 struct i40e_aqc_phy_register_access *cmd =
7031 (struct i40e_aqc_phy_register_access *)&desc.params.raw;
7032 enum i40e_status_code status;
7034 i40e_fill_default_direct_cmd_desc(&desc,
7035 i40e_aqc_opc_get_phy_register);
7037 cmd->phy_interface = phy_select;
7038 cmd->dev_addres = dev_addr;
7039 cmd->reg_address = reg_addr;
7041 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7043 *reg_val = cmd->reg_value;
7051 * i40e_aq_send_msg_to_pf
7052 * @hw: pointer to the hardware structure
7053 * @v_opcode: opcodes for VF-PF communication
7054 * @v_retval: return error code
7055 * @msg: pointer to the msg buffer
7056 * @msglen: msg length
7057 * @cmd_details: pointer to command details
7059 * Send message to PF driver using admin queue. By default, this message
7060 * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for
7061 * completion before returning.
7063 enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
7064 enum virtchnl_ops v_opcode,
7065 enum i40e_status_code v_retval,
7066 u8 *msg, u16 msglen,
7067 struct i40e_asq_cmd_details *cmd_details)
7069 struct i40e_aq_desc desc;
7070 struct i40e_asq_cmd_details details;
7071 enum i40e_status_code status;
7073 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
7074 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
7075 desc.cookie_high = CPU_TO_LE32(v_opcode);
7076 desc.cookie_low = CPU_TO_LE32(v_retval);
7078 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF
7079 | I40E_AQ_FLAG_RD));
7080 if (msglen > I40E_AQ_LARGE_BUF)
7081 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7082 desc.datalen = CPU_TO_LE16(msglen);
7085 i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM);
7086 details.async = true;
7087 cmd_details = &details;
7089 status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg,
7090 msglen, cmd_details);
7095 * i40e_vf_parse_hw_config
7096 * @hw: pointer to the hardware structure
7097 * @msg: pointer to the virtual channel VF resource structure
7099 * Given a VF resource message from the PF, populate the hw struct
7100 * with appropriate information.
7102 void i40e_vf_parse_hw_config(struct i40e_hw *hw,
7103 struct virtchnl_vf_resource *msg)
7105 struct virtchnl_vsi_resource *vsi_res;
7108 vsi_res = &msg->vsi_res[0];
7110 hw->dev_caps.num_vsis = msg->num_vsis;
7111 hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
7112 hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
7113 hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
7114 hw->dev_caps.dcb = msg->vf_offload_flags &
7115 VIRTCHNL_VF_OFFLOAD_L2;
7116 hw->dev_caps.iwarp = (msg->vf_offload_flags &
7117 VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0;
7118 for (i = 0; i < msg->num_vsis; i++) {
7119 if (vsi_res->vsi_type == VIRTCHNL_VSI_SRIOV) {
7120 i40e_memcpy(hw->mac.perm_addr,
7121 vsi_res->default_mac_addr,
7123 I40E_NONDMA_TO_NONDMA);
7124 i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
7126 I40E_NONDMA_TO_NONDMA);
7134 * @hw: pointer to the hardware structure
7136 * Send a VF_RESET message to the PF. Does not wait for response from PF
7137 * as none will be forthcoming. Immediately after calling this function,
7138 * the admin queue should be shut down and (optionally) reinitialized.
7140 enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw)
7142 return i40e_aq_send_msg_to_pf(hw, VIRTCHNL_OP_RESET_VF,
7143 I40E_SUCCESS, NULL, 0, NULL);
7145 #endif /* VF_DRIVER */
7148 * i40e_aq_set_arp_proxy_config
7149 * @hw: pointer to the HW structure
7150 * @proxy_config - pointer to proxy config command table struct
7151 * @cmd_details: pointer to command details
7153 * Set ARP offload parameters from pre-populated
7154 * i40e_aqc_arp_proxy_data struct
7156 enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
7157 struct i40e_aqc_arp_proxy_data *proxy_config,
7158 struct i40e_asq_cmd_details *cmd_details)
7160 struct i40e_aq_desc desc;
7161 enum i40e_status_code status;
7164 return I40E_ERR_PARAM;
7166 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_proxy_config);
7168 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7169 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7170 desc.params.external.addr_high =
7171 CPU_TO_LE32(I40E_HI_DWORD((u64)proxy_config));
7172 desc.params.external.addr_low =
7173 CPU_TO_LE32(I40E_LO_DWORD((u64)proxy_config));
7174 desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_arp_proxy_data));
7176 status = i40e_asq_send_command(hw, &desc, proxy_config,
7177 sizeof(struct i40e_aqc_arp_proxy_data),
7184 * i40e_aq_opc_set_ns_proxy_table_entry
7185 * @hw: pointer to the HW structure
7186 * @ns_proxy_table_entry: pointer to NS table entry command struct
7187 * @cmd_details: pointer to command details
7189 * Set IPv6 Neighbor Solicitation (NS) protocol offload parameters
7190 * from pre-populated i40e_aqc_ns_proxy_data struct
7192 enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
7193 struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
7194 struct i40e_asq_cmd_details *cmd_details)
7196 struct i40e_aq_desc desc;
7197 enum i40e_status_code status;
7199 if (!ns_proxy_table_entry)
7200 return I40E_ERR_PARAM;
7202 i40e_fill_default_direct_cmd_desc(&desc,
7203 i40e_aqc_opc_set_ns_proxy_table_entry);
7205 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7206 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7207 desc.params.external.addr_high =
7208 CPU_TO_LE32(I40E_HI_DWORD((u64)ns_proxy_table_entry));
7209 desc.params.external.addr_low =
7210 CPU_TO_LE32(I40E_LO_DWORD((u64)ns_proxy_table_entry));
7211 desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_ns_proxy_data));
7213 status = i40e_asq_send_command(hw, &desc, ns_proxy_table_entry,
7214 sizeof(struct i40e_aqc_ns_proxy_data),
7221 * i40e_aq_set_clear_wol_filter
7222 * @hw: pointer to the hw struct
7223 * @filter_index: index of filter to modify (0-7)
7224 * @filter: buffer containing filter to be set
7225 * @set_filter: true to set filter, false to clear filter
7226 * @no_wol_tco: if true, pass through packets cannot cause wake-up
7227 * if false, pass through packets may cause wake-up
7228 * @filter_valid: true if filter action is valid
7229 * @no_wol_tco_valid: true if no WoL in TCO traffic action valid
7230 * @cmd_details: pointer to command details structure or NULL
7232 * Set or clear WoL filter for port attached to the PF
7234 enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
7236 struct i40e_aqc_set_wol_filter_data *filter,
7237 bool set_filter, bool no_wol_tco,
7238 bool filter_valid, bool no_wol_tco_valid,
7239 struct i40e_asq_cmd_details *cmd_details)
7241 struct i40e_aq_desc desc;
7242 struct i40e_aqc_set_wol_filter *cmd =
7243 (struct i40e_aqc_set_wol_filter *)&desc.params.raw;
7244 enum i40e_status_code status;
7246 u16 valid_flags = 0;
7249 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_wol_filter);
7251 if (filter_index >= I40E_AQC_MAX_NUM_WOL_FILTERS)
7252 return I40E_ERR_PARAM;
7253 cmd->filter_index = CPU_TO_LE16(filter_index);
7257 return I40E_ERR_PARAM;
7259 cmd_flags |= I40E_AQC_SET_WOL_FILTER;
7260 cmd_flags |= I40E_AQC_SET_WOL_FILTER_WOL_PRESERVE_ON_PFR;
7264 cmd_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL;
7265 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
7268 valid_flags |= I40E_AQC_SET_WOL_FILTER_ACTION_VALID;
7269 if (no_wol_tco_valid)
7270 valid_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID;
7271 cmd->valid_flags = CPU_TO_LE16(valid_flags);
7273 buff_len = sizeof(*filter);
7274 desc.datalen = CPU_TO_LE16(buff_len);
7276 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7277 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7279 cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)filter));
7280 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)filter));
7282 status = i40e_asq_send_command(hw, &desc, filter,
7283 buff_len, cmd_details);
7289 * i40e_aq_get_wake_event_reason
7290 * @hw: pointer to the hw struct
7291 * @wake_reason: return value, index of matching filter
7292 * @cmd_details: pointer to command details structure or NULL
7294 * Get information for the reason of a Wake Up event
7296 enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
7298 struct i40e_asq_cmd_details *cmd_details)
7300 struct i40e_aq_desc desc;
7301 struct i40e_aqc_get_wake_reason_completion *resp =
7302 (struct i40e_aqc_get_wake_reason_completion *)&desc.params.raw;
7303 enum i40e_status_code status;
7305 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_wake_reason);
7307 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7309 if (status == I40E_SUCCESS)
7310 *wake_reason = LE16_TO_CPU(resp->wake_reason);
7316 * i40e_aq_clear_all_wol_filters
7317 * @hw: pointer to the hw struct
7318 * @cmd_details: pointer to command details structure or NULL
7320 * Get information for the reason of a Wake Up event
7322 enum i40e_status_code i40e_aq_clear_all_wol_filters(struct i40e_hw *hw,
7323 struct i40e_asq_cmd_details *cmd_details)
7325 struct i40e_aq_desc desc;
7326 enum i40e_status_code status;
7328 i40e_fill_default_direct_cmd_desc(&desc,
7329 i40e_aqc_opc_clear_all_wol_filters);
7331 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7338 * i40e_aq_write_ddp - Write dynamic device personalization (ddp)
7339 * @hw: pointer to the hw struct
7340 * @buff: command buffer (size in bytes = buff_size)
7341 * @buff_size: buffer size in bytes
7342 * @track_id: package tracking id
7343 * @error_offset: returns error offset
7344 * @error_info: returns error information
7345 * @cmd_details: pointer to command details structure or NULL
7348 i40e_status_code i40e_aq_write_ddp(struct i40e_hw *hw, void *buff,
7349 u16 buff_size, u32 track_id,
7350 u32 *error_offset, u32 *error_info,
7351 struct i40e_asq_cmd_details *cmd_details)
7353 struct i40e_aq_desc desc;
7354 struct i40e_aqc_write_personalization_profile *cmd =
7355 (struct i40e_aqc_write_personalization_profile *)
7357 struct i40e_aqc_write_ddp_resp *resp;
7358 enum i40e_status_code status;
7360 i40e_fill_default_direct_cmd_desc(&desc,
7361 i40e_aqc_opc_write_personalization_profile);
7363 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
7364 if (buff_size > I40E_AQ_LARGE_BUF)
7365 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7367 desc.datalen = CPU_TO_LE16(buff_size);
7369 cmd->profile_track_id = CPU_TO_LE32(track_id);
7371 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
7373 resp = (struct i40e_aqc_write_ddp_resp *)&desc.params.raw;
7375 *error_offset = LE32_TO_CPU(resp->error_offset);
7377 *error_info = LE32_TO_CPU(resp->error_info);
7384 * i40e_aq_get_ddp_list - Read dynamic device personalization (ddp)
7385 * @hw: pointer to the hw struct
7386 * @buff: command buffer (size in bytes = buff_size)
7387 * @buff_size: buffer size in bytes
7388 * @cmd_details: pointer to command details structure or NULL
7391 i40e_status_code i40e_aq_get_ddp_list(struct i40e_hw *hw, void *buff,
7392 u16 buff_size, u8 flags,
7393 struct i40e_asq_cmd_details *cmd_details)
7395 struct i40e_aq_desc desc;
7396 struct i40e_aqc_get_applied_profiles *cmd =
7397 (struct i40e_aqc_get_applied_profiles *)&desc.params.raw;
7398 enum i40e_status_code status;
7400 i40e_fill_default_direct_cmd_desc(&desc,
7401 i40e_aqc_opc_get_personalization_profile_list);
7403 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7404 if (buff_size > I40E_AQ_LARGE_BUF)
7405 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7406 desc.datalen = CPU_TO_LE16(buff_size);
7410 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
7416 * i40e_find_segment_in_package
7417 * @segment_type: the segment type to search for (i.e., SEGMENT_TYPE_I40E)
7418 * @pkg_hdr: pointer to the package header to be searched
7420 * This function searches a package file for a particular segment type. On
7421 * success it returns a pointer to the segment header, otherwise it will
7424 struct i40e_generic_seg_header *
7425 i40e_find_segment_in_package(u32 segment_type,
7426 struct i40e_package_header *pkg_hdr)
7428 struct i40e_generic_seg_header *segment;
7431 /* Search all package segments for the requested segment type */
7432 for (i = 0; i < pkg_hdr->segment_count; i++) {
7434 (struct i40e_generic_seg_header *)((u8 *)pkg_hdr +
7435 pkg_hdr->segment_offset[i]);
7437 if (segment->type == segment_type)
7444 /* Get section table in profile */
7445 #define I40E_SECTION_TABLE(profile, sec_tbl) \
7447 struct i40e_profile_segment *p = (profile); \
7450 count = p->device_table_count; \
7451 nvm = (u32 *)&p->device_table[count]; \
7452 sec_tbl = (struct i40e_section_table *)&nvm[nvm[0] + 1]; \
7455 /* Get section header in profile */
7456 #define I40E_SECTION_HEADER(profile, offset) \
7457 (struct i40e_profile_section_header *)((u8 *)(profile) + (offset))
7460 * i40e_find_section_in_profile
7461 * @section_type: the section type to search for (i.e., SECTION_TYPE_NOTE)
7462 * @profile: pointer to the i40e segment header to be searched
7464 * This function searches i40e segment for a particular section type. On
7465 * success it returns a pointer to the section header, otherwise it will
7468 struct i40e_profile_section_header *
7469 i40e_find_section_in_profile(u32 section_type,
7470 struct i40e_profile_segment *profile)
7472 struct i40e_profile_section_header *sec;
7473 struct i40e_section_table *sec_tbl;
7477 if (profile->header.type != SEGMENT_TYPE_I40E)
7480 I40E_SECTION_TABLE(profile, sec_tbl);
7482 for (i = 0; i < sec_tbl->section_count; i++) {
7483 sec_off = sec_tbl->section_offset[i];
7484 sec = I40E_SECTION_HEADER(profile, sec_off);
7485 if (sec->section.type == section_type)
7493 * i40e_ddp_exec_aq_section - Execute generic AQ for DDP
7494 * @hw: pointer to the hw struct
7495 * @aq: command buffer containing all data to execute AQ
7498 i40e_status_code i40e_ddp_exec_aq_section(struct i40e_hw *hw,
7499 struct i40e_profile_aq_section *aq)
7501 enum i40e_status_code status;
7502 struct i40e_aq_desc desc;
7506 i40e_fill_default_direct_cmd_desc(&desc, aq->opcode);
7507 desc.flags |= CPU_TO_LE16(aq->flags);
7508 i40e_memcpy(desc.params.raw, aq->param, sizeof(desc.params.raw),
7509 I40E_NONDMA_TO_NONDMA);
7511 msglen = aq->datalen;
7513 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
7515 if (msglen > I40E_AQ_LARGE_BUF)
7516 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7517 desc.datalen = CPU_TO_LE16(msglen);
7521 status = i40e_asq_send_command(hw, &desc, msg, msglen, NULL);
7523 if (status != I40E_SUCCESS) {
7524 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7525 "unable to exec DDP AQ opcode %u, error %d\n",
7526 aq->opcode, status);
7530 /* copy returned desc to aq_buf */
7531 i40e_memcpy(aq->param, desc.params.raw, sizeof(desc.params.raw),
7532 I40E_NONDMA_TO_NONDMA);
7534 return I40E_SUCCESS;
7538 * i40e_validate_profile
7539 * @hw: pointer to the hardware structure
7540 * @profile: pointer to the profile segment of the package to be validated
7541 * @track_id: package tracking id
7542 * @rollback: flag if the profile is for rollback.
7544 * Validates supported devices and profile's sections.
7546 STATIC enum i40e_status_code
7547 i40e_validate_profile(struct i40e_hw *hw, struct i40e_profile_segment *profile,
7548 u32 track_id, bool rollback)
7550 struct i40e_profile_section_header *sec = NULL;
7551 enum i40e_status_code status = I40E_SUCCESS;
7552 struct i40e_section_table *sec_tbl;
7558 if (track_id == I40E_DDP_TRACKID_INVALID) {
7559 i40e_debug(hw, I40E_DEBUG_PACKAGE, "Invalid track_id\n");
7560 return I40E_NOT_SUPPORTED;
7563 dev_cnt = profile->device_table_count;
7564 for (i = 0; i < dev_cnt; i++) {
7565 vendor_dev_id = profile->device_table[i].vendor_dev_id;
7566 if ((vendor_dev_id >> 16) == I40E_INTEL_VENDOR_ID &&
7567 hw->device_id == (vendor_dev_id & 0xFFFF))
7570 if (dev_cnt && (i == dev_cnt)) {
7571 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7572 "Device doesn't support DDP\n");
7573 return I40E_ERR_DEVICE_NOT_SUPPORTED;
7576 I40E_SECTION_TABLE(profile, sec_tbl);
7578 /* Validate sections types */
7579 for (i = 0; i < sec_tbl->section_count; i++) {
7580 sec_off = sec_tbl->section_offset[i];
7581 sec = I40E_SECTION_HEADER(profile, sec_off);
7583 if (sec->section.type == SECTION_TYPE_MMIO ||
7584 sec->section.type == SECTION_TYPE_AQ ||
7585 sec->section.type == SECTION_TYPE_RB_AQ) {
7586 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7587 "Not a roll-back package\n");
7588 return I40E_NOT_SUPPORTED;
7591 if (sec->section.type == SECTION_TYPE_RB_AQ ||
7592 sec->section.type == SECTION_TYPE_RB_MMIO) {
7593 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7594 "Not an original package\n");
7595 return I40E_NOT_SUPPORTED;
7604 * i40e_write_profile
7605 * @hw: pointer to the hardware structure
7606 * @profile: pointer to the profile segment of the package to be downloaded
7607 * @track_id: package tracking id
7609 * Handles the download of a complete package.
7611 enum i40e_status_code
7612 i40e_write_profile(struct i40e_hw *hw, struct i40e_profile_segment *profile,
7615 enum i40e_status_code status = I40E_SUCCESS;
7616 struct i40e_section_table *sec_tbl;
7617 struct i40e_profile_section_header *sec = NULL;
7618 struct i40e_profile_aq_section *ddp_aq;
7619 u32 section_size = 0;
7620 u32 offset = 0, info = 0;
7624 status = i40e_validate_profile(hw, profile, track_id, false);
7628 I40E_SECTION_TABLE(profile, sec_tbl);
7630 for (i = 0; i < sec_tbl->section_count; i++) {
7631 sec_off = sec_tbl->section_offset[i];
7632 sec = I40E_SECTION_HEADER(profile, sec_off);
7633 /* Process generic admin command */
7634 if (sec->section.type == SECTION_TYPE_AQ) {
7635 ddp_aq = (struct i40e_profile_aq_section *)&sec[1];
7636 status = i40e_ddp_exec_aq_section(hw, ddp_aq);
7638 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7639 "Failed to execute aq: section %d, opcode %u\n",
7643 sec->section.type = SECTION_TYPE_RB_AQ;
7646 /* Skip any non-mmio sections */
7647 if (sec->section.type != SECTION_TYPE_MMIO)
7650 section_size = sec->section.size +
7651 sizeof(struct i40e_profile_section_header);
7653 /* Write MMIO section */
7654 status = i40e_aq_write_ddp(hw, (void *)sec, (u16)section_size,
7655 track_id, &offset, &info, NULL);
7657 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7658 "Failed to write profile: section %d, offset %d, info %d\n",
7667 * i40e_rollback_profile
7668 * @hw: pointer to the hardware structure
7669 * @profile: pointer to the profile segment of the package to be removed
7670 * @track_id: package tracking id
7672 * Rolls back previously loaded package.
7674 enum i40e_status_code
7675 i40e_rollback_profile(struct i40e_hw *hw, struct i40e_profile_segment *profile,
7678 struct i40e_profile_section_header *sec = NULL;
7679 enum i40e_status_code status = I40E_SUCCESS;
7680 struct i40e_section_table *sec_tbl;
7681 u32 offset = 0, info = 0;
7682 u32 section_size = 0;
7686 status = i40e_validate_profile(hw, profile, track_id, true);
7690 I40E_SECTION_TABLE(profile, sec_tbl);
7692 /* For rollback write sections in reverse */
7693 for (i = sec_tbl->section_count - 1; i >= 0; i--) {
7694 sec_off = sec_tbl->section_offset[i];
7695 sec = I40E_SECTION_HEADER(profile, sec_off);
7697 /* Skip any non-rollback sections */
7698 if (sec->section.type != SECTION_TYPE_RB_MMIO)
7701 section_size = sec->section.size +
7702 sizeof(struct i40e_profile_section_header);
7704 /* Write roll-back MMIO section */
7705 status = i40e_aq_write_ddp(hw, (void *)sec, (u16)section_size,
7706 track_id, &offset, &info, NULL);
7708 i40e_debug(hw, I40E_DEBUG_PACKAGE,
7709 "Failed to write profile: section %d, offset %d, info %d\n",
7718 * i40e_add_pinfo_to_list
7719 * @hw: pointer to the hardware structure
7720 * @profile: pointer to the profile segment of the package
7721 * @profile_info_sec: buffer for information section
7722 * @track_id: package tracking id
7724 * Register a profile to the list of loaded profiles.
7726 enum i40e_status_code
7727 i40e_add_pinfo_to_list(struct i40e_hw *hw,
7728 struct i40e_profile_segment *profile,
7729 u8 *profile_info_sec, u32 track_id)
7731 enum i40e_status_code status = I40E_SUCCESS;
7732 struct i40e_profile_section_header *sec = NULL;
7733 struct i40e_profile_info *pinfo;
7734 u32 offset = 0, info = 0;
7736 sec = (struct i40e_profile_section_header *)profile_info_sec;
7738 sec->data_end = sizeof(struct i40e_profile_section_header) +
7739 sizeof(struct i40e_profile_info);
7740 sec->section.type = SECTION_TYPE_INFO;
7741 sec->section.offset = sizeof(struct i40e_profile_section_header);
7742 sec->section.size = sizeof(struct i40e_profile_info);
7743 pinfo = (struct i40e_profile_info *)(profile_info_sec +
7744 sec->section.offset);
7745 pinfo->track_id = track_id;
7746 pinfo->version = profile->version;
7747 pinfo->op = I40E_DDP_ADD_TRACKID;
7748 i40e_memcpy(pinfo->name, profile->name, I40E_DDP_NAME_SIZE,
7749 I40E_NONDMA_TO_NONDMA);
7751 status = i40e_aq_write_ddp(hw, (void *)sec, sec->data_end,
7752 track_id, &offset, &info, NULL);