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 ******************************************************************************/
35 #include "i40e_type.h"
36 #include "i40e_adminq.h"
37 #include "i40e_prototype.h"
38 #include "i40e_virtchnl.h"
42 * i40e_set_mac_type - Sets MAC type
43 * @hw: pointer to the HW structure
45 * This function sets the mac type of the adapter based on the
46 * vendor ID and device ID stored in the hw structure.
48 enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
50 enum i40e_status_code status = I40E_SUCCESS;
52 DEBUGFUNC("i40e_set_mac_type\n");
54 if (hw->vendor_id == I40E_INTEL_VENDOR_ID) {
55 switch (hw->device_id) {
56 case I40E_DEV_ID_SFP_XL710:
57 case I40E_DEV_ID_QEMU:
58 case I40E_DEV_ID_KX_B:
59 case I40E_DEV_ID_KX_C:
60 case I40E_DEV_ID_QSFP_A:
61 case I40E_DEV_ID_QSFP_B:
62 case I40E_DEV_ID_QSFP_C:
63 case I40E_DEV_ID_10G_BASE_T:
64 case I40E_DEV_ID_10G_BASE_T4:
65 case I40E_DEV_ID_20G_KR2:
66 case I40E_DEV_ID_20G_KR2_A:
67 case I40E_DEV_ID_25G_B:
68 case I40E_DEV_ID_25G_SFP28:
69 hw->mac.type = I40E_MAC_XL710;
71 case I40E_DEV_ID_X722_A0:
72 case I40E_DEV_ID_KX_X722:
73 case I40E_DEV_ID_QSFP_X722:
74 case I40E_DEV_ID_SFP_X722:
75 case I40E_DEV_ID_1G_BASE_T_X722:
76 case I40E_DEV_ID_10G_BASE_T_X722:
77 case I40E_DEV_ID_SFP_I_X722:
78 hw->mac.type = I40E_MAC_X722;
80 case I40E_DEV_ID_X722_VF:
81 case I40E_DEV_ID_X722_VF_HV:
82 case I40E_DEV_ID_X722_A0_VF:
83 hw->mac.type = I40E_MAC_X722_VF;
86 case I40E_DEV_ID_VF_HV:
87 hw->mac.type = I40E_MAC_VF;
90 hw->mac.type = I40E_MAC_GENERIC;
94 status = I40E_ERR_DEVICE_NOT_SUPPORTED;
97 DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n",
98 hw->mac.type, status);
103 * i40e_aq_str - convert AQ err code to a string
104 * @hw: pointer to the HW structure
105 * @aq_err: the AQ error code to convert
107 const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err)
112 case I40E_AQ_RC_EPERM:
113 return "I40E_AQ_RC_EPERM";
114 case I40E_AQ_RC_ENOENT:
115 return "I40E_AQ_RC_ENOENT";
116 case I40E_AQ_RC_ESRCH:
117 return "I40E_AQ_RC_ESRCH";
118 case I40E_AQ_RC_EINTR:
119 return "I40E_AQ_RC_EINTR";
121 return "I40E_AQ_RC_EIO";
122 case I40E_AQ_RC_ENXIO:
123 return "I40E_AQ_RC_ENXIO";
124 case I40E_AQ_RC_E2BIG:
125 return "I40E_AQ_RC_E2BIG";
126 case I40E_AQ_RC_EAGAIN:
127 return "I40E_AQ_RC_EAGAIN";
128 case I40E_AQ_RC_ENOMEM:
129 return "I40E_AQ_RC_ENOMEM";
130 case I40E_AQ_RC_EACCES:
131 return "I40E_AQ_RC_EACCES";
132 case I40E_AQ_RC_EFAULT:
133 return "I40E_AQ_RC_EFAULT";
134 case I40E_AQ_RC_EBUSY:
135 return "I40E_AQ_RC_EBUSY";
136 case I40E_AQ_RC_EEXIST:
137 return "I40E_AQ_RC_EEXIST";
138 case I40E_AQ_RC_EINVAL:
139 return "I40E_AQ_RC_EINVAL";
140 case I40E_AQ_RC_ENOTTY:
141 return "I40E_AQ_RC_ENOTTY";
142 case I40E_AQ_RC_ENOSPC:
143 return "I40E_AQ_RC_ENOSPC";
144 case I40E_AQ_RC_ENOSYS:
145 return "I40E_AQ_RC_ENOSYS";
146 case I40E_AQ_RC_ERANGE:
147 return "I40E_AQ_RC_ERANGE";
148 case I40E_AQ_RC_EFLUSHED:
149 return "I40E_AQ_RC_EFLUSHED";
150 case I40E_AQ_RC_BAD_ADDR:
151 return "I40E_AQ_RC_BAD_ADDR";
152 case I40E_AQ_RC_EMODE:
153 return "I40E_AQ_RC_EMODE";
154 case I40E_AQ_RC_EFBIG:
155 return "I40E_AQ_RC_EFBIG";
158 snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
163 * i40e_stat_str - convert status err code to a string
164 * @hw: pointer to the HW structure
165 * @stat_err: the status error code to convert
167 const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err)
173 return "I40E_ERR_NVM";
174 case I40E_ERR_NVM_CHECKSUM:
175 return "I40E_ERR_NVM_CHECKSUM";
177 return "I40E_ERR_PHY";
178 case I40E_ERR_CONFIG:
179 return "I40E_ERR_CONFIG";
181 return "I40E_ERR_PARAM";
182 case I40E_ERR_MAC_TYPE:
183 return "I40E_ERR_MAC_TYPE";
184 case I40E_ERR_UNKNOWN_PHY:
185 return "I40E_ERR_UNKNOWN_PHY";
186 case I40E_ERR_LINK_SETUP:
187 return "I40E_ERR_LINK_SETUP";
188 case I40E_ERR_ADAPTER_STOPPED:
189 return "I40E_ERR_ADAPTER_STOPPED";
190 case I40E_ERR_INVALID_MAC_ADDR:
191 return "I40E_ERR_INVALID_MAC_ADDR";
192 case I40E_ERR_DEVICE_NOT_SUPPORTED:
193 return "I40E_ERR_DEVICE_NOT_SUPPORTED";
194 case I40E_ERR_MASTER_REQUESTS_PENDING:
195 return "I40E_ERR_MASTER_REQUESTS_PENDING";
196 case I40E_ERR_INVALID_LINK_SETTINGS:
197 return "I40E_ERR_INVALID_LINK_SETTINGS";
198 case I40E_ERR_AUTONEG_NOT_COMPLETE:
199 return "I40E_ERR_AUTONEG_NOT_COMPLETE";
200 case I40E_ERR_RESET_FAILED:
201 return "I40E_ERR_RESET_FAILED";
202 case I40E_ERR_SWFW_SYNC:
203 return "I40E_ERR_SWFW_SYNC";
204 case I40E_ERR_NO_AVAILABLE_VSI:
205 return "I40E_ERR_NO_AVAILABLE_VSI";
206 case I40E_ERR_NO_MEMORY:
207 return "I40E_ERR_NO_MEMORY";
208 case I40E_ERR_BAD_PTR:
209 return "I40E_ERR_BAD_PTR";
210 case I40E_ERR_RING_FULL:
211 return "I40E_ERR_RING_FULL";
212 case I40E_ERR_INVALID_PD_ID:
213 return "I40E_ERR_INVALID_PD_ID";
214 case I40E_ERR_INVALID_QP_ID:
215 return "I40E_ERR_INVALID_QP_ID";
216 case I40E_ERR_INVALID_CQ_ID:
217 return "I40E_ERR_INVALID_CQ_ID";
218 case I40E_ERR_INVALID_CEQ_ID:
219 return "I40E_ERR_INVALID_CEQ_ID";
220 case I40E_ERR_INVALID_AEQ_ID:
221 return "I40E_ERR_INVALID_AEQ_ID";
222 case I40E_ERR_INVALID_SIZE:
223 return "I40E_ERR_INVALID_SIZE";
224 case I40E_ERR_INVALID_ARP_INDEX:
225 return "I40E_ERR_INVALID_ARP_INDEX";
226 case I40E_ERR_INVALID_FPM_FUNC_ID:
227 return "I40E_ERR_INVALID_FPM_FUNC_ID";
228 case I40E_ERR_QP_INVALID_MSG_SIZE:
229 return "I40E_ERR_QP_INVALID_MSG_SIZE";
230 case I40E_ERR_QP_TOOMANY_WRS_POSTED:
231 return "I40E_ERR_QP_TOOMANY_WRS_POSTED";
232 case I40E_ERR_INVALID_FRAG_COUNT:
233 return "I40E_ERR_INVALID_FRAG_COUNT";
234 case I40E_ERR_QUEUE_EMPTY:
235 return "I40E_ERR_QUEUE_EMPTY";
236 case I40E_ERR_INVALID_ALIGNMENT:
237 return "I40E_ERR_INVALID_ALIGNMENT";
238 case I40E_ERR_FLUSHED_QUEUE:
239 return "I40E_ERR_FLUSHED_QUEUE";
240 case I40E_ERR_INVALID_PUSH_PAGE_INDEX:
241 return "I40E_ERR_INVALID_PUSH_PAGE_INDEX";
242 case I40E_ERR_INVALID_IMM_DATA_SIZE:
243 return "I40E_ERR_INVALID_IMM_DATA_SIZE";
244 case I40E_ERR_TIMEOUT:
245 return "I40E_ERR_TIMEOUT";
246 case I40E_ERR_OPCODE_MISMATCH:
247 return "I40E_ERR_OPCODE_MISMATCH";
248 case I40E_ERR_CQP_COMPL_ERROR:
249 return "I40E_ERR_CQP_COMPL_ERROR";
250 case I40E_ERR_INVALID_VF_ID:
251 return "I40E_ERR_INVALID_VF_ID";
252 case I40E_ERR_INVALID_HMCFN_ID:
253 return "I40E_ERR_INVALID_HMCFN_ID";
254 case I40E_ERR_BACKING_PAGE_ERROR:
255 return "I40E_ERR_BACKING_PAGE_ERROR";
256 case I40E_ERR_NO_PBLCHUNKS_AVAILABLE:
257 return "I40E_ERR_NO_PBLCHUNKS_AVAILABLE";
258 case I40E_ERR_INVALID_PBLE_INDEX:
259 return "I40E_ERR_INVALID_PBLE_INDEX";
260 case I40E_ERR_INVALID_SD_INDEX:
261 return "I40E_ERR_INVALID_SD_INDEX";
262 case I40E_ERR_INVALID_PAGE_DESC_INDEX:
263 return "I40E_ERR_INVALID_PAGE_DESC_INDEX";
264 case I40E_ERR_INVALID_SD_TYPE:
265 return "I40E_ERR_INVALID_SD_TYPE";
266 case I40E_ERR_MEMCPY_FAILED:
267 return "I40E_ERR_MEMCPY_FAILED";
268 case I40E_ERR_INVALID_HMC_OBJ_INDEX:
269 return "I40E_ERR_INVALID_HMC_OBJ_INDEX";
270 case I40E_ERR_INVALID_HMC_OBJ_COUNT:
271 return "I40E_ERR_INVALID_HMC_OBJ_COUNT";
272 case I40E_ERR_INVALID_SRQ_ARM_LIMIT:
273 return "I40E_ERR_INVALID_SRQ_ARM_LIMIT";
274 case I40E_ERR_SRQ_ENABLED:
275 return "I40E_ERR_SRQ_ENABLED";
276 case I40E_ERR_ADMIN_QUEUE_ERROR:
277 return "I40E_ERR_ADMIN_QUEUE_ERROR";
278 case I40E_ERR_ADMIN_QUEUE_TIMEOUT:
279 return "I40E_ERR_ADMIN_QUEUE_TIMEOUT";
280 case I40E_ERR_BUF_TOO_SHORT:
281 return "I40E_ERR_BUF_TOO_SHORT";
282 case I40E_ERR_ADMIN_QUEUE_FULL:
283 return "I40E_ERR_ADMIN_QUEUE_FULL";
284 case I40E_ERR_ADMIN_QUEUE_NO_WORK:
285 return "I40E_ERR_ADMIN_QUEUE_NO_WORK";
286 case I40E_ERR_BAD_IWARP_CQE:
287 return "I40E_ERR_BAD_IWARP_CQE";
288 case I40E_ERR_NVM_BLANK_MODE:
289 return "I40E_ERR_NVM_BLANK_MODE";
290 case I40E_ERR_NOT_IMPLEMENTED:
291 return "I40E_ERR_NOT_IMPLEMENTED";
292 case I40E_ERR_PE_DOORBELL_NOT_ENABLED:
293 return "I40E_ERR_PE_DOORBELL_NOT_ENABLED";
294 case I40E_ERR_DIAG_TEST_FAILED:
295 return "I40E_ERR_DIAG_TEST_FAILED";
296 case I40E_ERR_NOT_READY:
297 return "I40E_ERR_NOT_READY";
298 case I40E_NOT_SUPPORTED:
299 return "I40E_NOT_SUPPORTED";
300 case I40E_ERR_FIRMWARE_API_VERSION:
301 return "I40E_ERR_FIRMWARE_API_VERSION";
304 snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
310 * @hw: debug mask related to admin queue
312 * @desc: pointer to admin queue descriptor
313 * @buffer: pointer to command buffer
314 * @buf_len: max length of buffer
316 * Dumps debug log about adminq command with descriptor contents.
318 void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
319 void *buffer, u16 buf_len)
321 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
322 u16 len = LE16_TO_CPU(aq_desc->datalen);
323 u8 *buf = (u8 *)buffer;
326 if ((!(mask & hw->debug_mask)) || (desc == NULL))
330 "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
331 LE16_TO_CPU(aq_desc->opcode),
332 LE16_TO_CPU(aq_desc->flags),
333 LE16_TO_CPU(aq_desc->datalen),
334 LE16_TO_CPU(aq_desc->retval));
335 i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
336 LE32_TO_CPU(aq_desc->cookie_high),
337 LE32_TO_CPU(aq_desc->cookie_low));
338 i40e_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
339 LE32_TO_CPU(aq_desc->params.internal.param0),
340 LE32_TO_CPU(aq_desc->params.internal.param1));
341 i40e_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
342 LE32_TO_CPU(aq_desc->params.external.addr_high),
343 LE32_TO_CPU(aq_desc->params.external.addr_low));
345 if ((buffer != NULL) && (aq_desc->datalen != 0)) {
346 i40e_debug(hw, mask, "AQ CMD Buffer:\n");
349 /* write the full 16-byte chunks */
350 for (i = 0; i < (len - 16); i += 16)
352 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
353 i, buf[i], buf[i+1], buf[i+2], buf[i+3],
354 buf[i+4], buf[i+5], buf[i+6], buf[i+7],
355 buf[i+8], buf[i+9], buf[i+10], buf[i+11],
356 buf[i+12], buf[i+13], buf[i+14], buf[i+15]);
357 /* the most we could have left is 16 bytes, pad with zeros */
363 memset(d_buf, 0, sizeof(d_buf));
364 for (j = 0; i < len; j++, i++)
367 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
368 i_sav, d_buf[0], d_buf[1], d_buf[2], d_buf[3],
369 d_buf[4], d_buf[5], d_buf[6], d_buf[7],
370 d_buf[8], d_buf[9], d_buf[10], d_buf[11],
371 d_buf[12], d_buf[13], d_buf[14], d_buf[15]);
377 * i40e_check_asq_alive
378 * @hw: pointer to the hw struct
380 * Returns TRUE if Queue is enabled else FALSE.
382 bool i40e_check_asq_alive(struct i40e_hw *hw)
386 return !!(rd32(hw, hw->aq.asq.len) &
387 I40E_PF_ATQLEN_ATQENABLE_MASK);
389 return !!(rd32(hw, hw->aq.asq.len) &
390 I40E_VF_ATQLEN1_ATQENABLE_MASK);
395 * i40e_aq_queue_shutdown
396 * @hw: pointer to the hw struct
397 * @unloading: is the driver unloading itself
399 * Tell the Firmware that we're shutting down the AdminQ and whether
400 * or not the driver is unloading as well.
402 enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
405 struct i40e_aq_desc desc;
406 struct i40e_aqc_queue_shutdown *cmd =
407 (struct i40e_aqc_queue_shutdown *)&desc.params.raw;
408 enum i40e_status_code status;
410 i40e_fill_default_direct_cmd_desc(&desc,
411 i40e_aqc_opc_queue_shutdown);
414 cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING);
415 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
421 * i40e_aq_get_set_rss_lut
422 * @hw: pointer to the hardware structure
423 * @vsi_id: vsi fw index
424 * @pf_lut: for PF table set TRUE, for VSI table set FALSE
425 * @lut: pointer to the lut buffer provided by the caller
426 * @lut_size: size of the lut buffer
427 * @set: set TRUE to set the table, FALSE to get the table
429 * Internal function to get or set RSS look up table
431 static enum i40e_status_code i40e_aq_get_set_rss_lut(struct i40e_hw *hw,
432 u16 vsi_id, bool pf_lut,
433 u8 *lut, u16 lut_size,
436 enum i40e_status_code status;
437 struct i40e_aq_desc desc;
438 struct i40e_aqc_get_set_rss_lut *cmd_resp =
439 (struct i40e_aqc_get_set_rss_lut *)&desc.params.raw;
442 i40e_fill_default_direct_cmd_desc(&desc,
443 i40e_aqc_opc_set_rss_lut);
445 i40e_fill_default_direct_cmd_desc(&desc,
446 i40e_aqc_opc_get_rss_lut);
448 /* Indirect command */
449 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
450 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
453 CPU_TO_LE16((u16)((vsi_id <<
454 I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
455 I40E_AQC_SET_RSS_LUT_VSI_ID_MASK));
456 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_LUT_VSI_VALID);
459 cmd_resp->flags |= CPU_TO_LE16((u16)
460 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
461 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
462 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
464 cmd_resp->flags |= CPU_TO_LE16((u16)
465 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
466 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
467 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
469 status = i40e_asq_send_command(hw, &desc, lut, lut_size, NULL);
475 * i40e_aq_get_rss_lut
476 * @hw: pointer to the hardware structure
477 * @vsi_id: vsi fw index
478 * @pf_lut: for PF table set TRUE, for VSI table set FALSE
479 * @lut: pointer to the lut buffer provided by the caller
480 * @lut_size: size of the lut buffer
482 * get the RSS lookup table, PF or VSI type
484 enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 vsi_id,
485 bool pf_lut, u8 *lut, u16 lut_size)
487 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
492 * i40e_aq_set_rss_lut
493 * @hw: pointer to the hardware structure
494 * @vsi_id: vsi fw index
495 * @pf_lut: for PF table set TRUE, for VSI table set FALSE
496 * @lut: pointer to the lut buffer provided by the caller
497 * @lut_size: size of the lut buffer
499 * set the RSS lookup table, PF or VSI type
501 enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 vsi_id,
502 bool pf_lut, u8 *lut, u16 lut_size)
504 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, TRUE);
508 * i40e_aq_get_set_rss_key
509 * @hw: pointer to the hw struct
510 * @vsi_id: vsi fw index
511 * @key: pointer to key info struct
512 * @set: set TRUE to set the key, FALSE to get the key
514 * get the RSS key per VSI
516 static enum i40e_status_code i40e_aq_get_set_rss_key(struct i40e_hw *hw,
518 struct i40e_aqc_get_set_rss_key_data *key,
521 enum i40e_status_code status;
522 struct i40e_aq_desc desc;
523 struct i40e_aqc_get_set_rss_key *cmd_resp =
524 (struct i40e_aqc_get_set_rss_key *)&desc.params.raw;
525 u16 key_size = sizeof(struct i40e_aqc_get_set_rss_key_data);
528 i40e_fill_default_direct_cmd_desc(&desc,
529 i40e_aqc_opc_set_rss_key);
531 i40e_fill_default_direct_cmd_desc(&desc,
532 i40e_aqc_opc_get_rss_key);
534 /* Indirect command */
535 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
536 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
539 CPU_TO_LE16((u16)((vsi_id <<
540 I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
541 I40E_AQC_SET_RSS_KEY_VSI_ID_MASK));
542 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_KEY_VSI_VALID);
544 status = i40e_asq_send_command(hw, &desc, key, key_size, NULL);
550 * i40e_aq_get_rss_key
551 * @hw: pointer to the hw struct
552 * @vsi_id: vsi fw index
553 * @key: pointer to key info struct
556 enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
558 struct i40e_aqc_get_set_rss_key_data *key)
560 return i40e_aq_get_set_rss_key(hw, vsi_id, key, FALSE);
564 * i40e_aq_set_rss_key
565 * @hw: pointer to the hw struct
566 * @vsi_id: vsi fw index
567 * @key: pointer to key info struct
569 * set the RSS key per VSI
571 enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
573 struct i40e_aqc_get_set_rss_key_data *key)
575 return i40e_aq_get_set_rss_key(hw, vsi_id, key, TRUE);
578 /* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
579 * hardware to a bit-field that can be used by SW to more easily determine the
582 * Macros are used to shorten the table lines and make this table human
585 * We store the PTYPE in the top byte of the bit field - this is just so that
586 * we can check that the table doesn't have a row missing, as the index into
587 * the table should be the PTYPE.
591 * IF NOT i40e_ptype_lookup[ptype].known
594 * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
595 * Use the rest of the fields to look at the tunnels, inner protocols, etc
597 * Use the enum i40e_rx_l2_ptype to decode the packet type
601 /* macro to make the table lines short */
602 #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
605 I40E_RX_PTYPE_OUTER_##OUTER_IP, \
606 I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \
607 I40E_RX_PTYPE_##OUTER_FRAG, \
608 I40E_RX_PTYPE_TUNNEL_##T, \
609 I40E_RX_PTYPE_TUNNEL_END_##TE, \
610 I40E_RX_PTYPE_##TEF, \
611 I40E_RX_PTYPE_INNER_PROT_##I, \
612 I40E_RX_PTYPE_PAYLOAD_LAYER_##PL }
614 #define I40E_PTT_UNUSED_ENTRY(PTYPE) \
615 { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
617 /* shorter macros makes the table fit but are terse */
618 #define I40E_RX_PTYPE_NOF I40E_RX_PTYPE_NOT_FRAG
619 #define I40E_RX_PTYPE_FRG I40E_RX_PTYPE_FRAG
620 #define I40E_RX_PTYPE_INNER_PROT_TS I40E_RX_PTYPE_INNER_PROT_TIMESYNC
622 /* Lookup table mapping the HW PTYPE to the bit field for decoding */
623 struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
624 /* L2 Packet types */
625 I40E_PTT_UNUSED_ENTRY(0),
626 I40E_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
627 I40E_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2),
628 I40E_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
629 I40E_PTT_UNUSED_ENTRY(4),
630 I40E_PTT_UNUSED_ENTRY(5),
631 I40E_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
632 I40E_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
633 I40E_PTT_UNUSED_ENTRY(8),
634 I40E_PTT_UNUSED_ENTRY(9),
635 I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
636 I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
637 I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
638 I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
639 I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
640 I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
641 I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
642 I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
643 I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
644 I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
645 I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
646 I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
648 /* Non Tunneled IPv4 */
649 I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
650 I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
651 I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4),
652 I40E_PTT_UNUSED_ENTRY(25),
653 I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4),
654 I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
655 I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
658 I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
659 I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
660 I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
661 I40E_PTT_UNUSED_ENTRY(32),
662 I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
663 I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
664 I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
667 I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
668 I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
669 I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
670 I40E_PTT_UNUSED_ENTRY(39),
671 I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
672 I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
673 I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
675 /* IPv4 --> GRE/NAT */
676 I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
678 /* IPv4 --> GRE/NAT --> IPv4 */
679 I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
680 I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
681 I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
682 I40E_PTT_UNUSED_ENTRY(47),
683 I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
684 I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
685 I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
687 /* IPv4 --> GRE/NAT --> IPv6 */
688 I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
689 I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
690 I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
691 I40E_PTT_UNUSED_ENTRY(54),
692 I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
693 I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
694 I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
696 /* IPv4 --> GRE/NAT --> MAC */
697 I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
699 /* IPv4 --> GRE/NAT --> MAC --> IPv4 */
700 I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
701 I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
702 I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
703 I40E_PTT_UNUSED_ENTRY(62),
704 I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
705 I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
706 I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
708 /* IPv4 --> GRE/NAT -> MAC --> IPv6 */
709 I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
710 I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
711 I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
712 I40E_PTT_UNUSED_ENTRY(69),
713 I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
714 I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
715 I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
717 /* IPv4 --> GRE/NAT --> MAC/VLAN */
718 I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
720 /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
721 I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
722 I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
723 I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
724 I40E_PTT_UNUSED_ENTRY(77),
725 I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
726 I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
727 I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
729 /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
730 I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
731 I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
732 I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
733 I40E_PTT_UNUSED_ENTRY(84),
734 I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
735 I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
736 I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
738 /* Non Tunneled IPv6 */
739 I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
740 I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
741 I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY4),
742 I40E_PTT_UNUSED_ENTRY(91),
743 I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
744 I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
745 I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
748 I40E_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
749 I40E_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
750 I40E_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
751 I40E_PTT_UNUSED_ENTRY(98),
752 I40E_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
753 I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
754 I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
757 I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
758 I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
759 I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
760 I40E_PTT_UNUSED_ENTRY(105),
761 I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
762 I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
763 I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
765 /* IPv6 --> GRE/NAT */
766 I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
768 /* IPv6 --> GRE/NAT -> IPv4 */
769 I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
770 I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
771 I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
772 I40E_PTT_UNUSED_ENTRY(113),
773 I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
774 I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
775 I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
777 /* IPv6 --> GRE/NAT -> IPv6 */
778 I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
779 I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
780 I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
781 I40E_PTT_UNUSED_ENTRY(120),
782 I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
783 I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
784 I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
786 /* IPv6 --> GRE/NAT -> MAC */
787 I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
789 /* IPv6 --> GRE/NAT -> MAC -> IPv4 */
790 I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
791 I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
792 I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
793 I40E_PTT_UNUSED_ENTRY(128),
794 I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
795 I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
796 I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
798 /* IPv6 --> GRE/NAT -> MAC -> IPv6 */
799 I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
800 I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
801 I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
802 I40E_PTT_UNUSED_ENTRY(135),
803 I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
804 I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
805 I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
807 /* IPv6 --> GRE/NAT -> MAC/VLAN */
808 I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
810 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
811 I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
812 I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
813 I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
814 I40E_PTT_UNUSED_ENTRY(143),
815 I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
816 I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
817 I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
819 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
820 I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
821 I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
822 I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
823 I40E_PTT_UNUSED_ENTRY(150),
824 I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
825 I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
826 I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
829 I40E_PTT_UNUSED_ENTRY(154),
830 I40E_PTT_UNUSED_ENTRY(155),
831 I40E_PTT_UNUSED_ENTRY(156),
832 I40E_PTT_UNUSED_ENTRY(157),
833 I40E_PTT_UNUSED_ENTRY(158),
834 I40E_PTT_UNUSED_ENTRY(159),
836 I40E_PTT_UNUSED_ENTRY(160),
837 I40E_PTT_UNUSED_ENTRY(161),
838 I40E_PTT_UNUSED_ENTRY(162),
839 I40E_PTT_UNUSED_ENTRY(163),
840 I40E_PTT_UNUSED_ENTRY(164),
841 I40E_PTT_UNUSED_ENTRY(165),
842 I40E_PTT_UNUSED_ENTRY(166),
843 I40E_PTT_UNUSED_ENTRY(167),
844 I40E_PTT_UNUSED_ENTRY(168),
845 I40E_PTT_UNUSED_ENTRY(169),
847 I40E_PTT_UNUSED_ENTRY(170),
848 I40E_PTT_UNUSED_ENTRY(171),
849 I40E_PTT_UNUSED_ENTRY(172),
850 I40E_PTT_UNUSED_ENTRY(173),
851 I40E_PTT_UNUSED_ENTRY(174),
852 I40E_PTT_UNUSED_ENTRY(175),
853 I40E_PTT_UNUSED_ENTRY(176),
854 I40E_PTT_UNUSED_ENTRY(177),
855 I40E_PTT_UNUSED_ENTRY(178),
856 I40E_PTT_UNUSED_ENTRY(179),
858 I40E_PTT_UNUSED_ENTRY(180),
859 I40E_PTT_UNUSED_ENTRY(181),
860 I40E_PTT_UNUSED_ENTRY(182),
861 I40E_PTT_UNUSED_ENTRY(183),
862 I40E_PTT_UNUSED_ENTRY(184),
863 I40E_PTT_UNUSED_ENTRY(185),
864 I40E_PTT_UNUSED_ENTRY(186),
865 I40E_PTT_UNUSED_ENTRY(187),
866 I40E_PTT_UNUSED_ENTRY(188),
867 I40E_PTT_UNUSED_ENTRY(189),
869 I40E_PTT_UNUSED_ENTRY(190),
870 I40E_PTT_UNUSED_ENTRY(191),
871 I40E_PTT_UNUSED_ENTRY(192),
872 I40E_PTT_UNUSED_ENTRY(193),
873 I40E_PTT_UNUSED_ENTRY(194),
874 I40E_PTT_UNUSED_ENTRY(195),
875 I40E_PTT_UNUSED_ENTRY(196),
876 I40E_PTT_UNUSED_ENTRY(197),
877 I40E_PTT_UNUSED_ENTRY(198),
878 I40E_PTT_UNUSED_ENTRY(199),
880 I40E_PTT_UNUSED_ENTRY(200),
881 I40E_PTT_UNUSED_ENTRY(201),
882 I40E_PTT_UNUSED_ENTRY(202),
883 I40E_PTT_UNUSED_ENTRY(203),
884 I40E_PTT_UNUSED_ENTRY(204),
885 I40E_PTT_UNUSED_ENTRY(205),
886 I40E_PTT_UNUSED_ENTRY(206),
887 I40E_PTT_UNUSED_ENTRY(207),
888 I40E_PTT_UNUSED_ENTRY(208),
889 I40E_PTT_UNUSED_ENTRY(209),
891 I40E_PTT_UNUSED_ENTRY(210),
892 I40E_PTT_UNUSED_ENTRY(211),
893 I40E_PTT_UNUSED_ENTRY(212),
894 I40E_PTT_UNUSED_ENTRY(213),
895 I40E_PTT_UNUSED_ENTRY(214),
896 I40E_PTT_UNUSED_ENTRY(215),
897 I40E_PTT_UNUSED_ENTRY(216),
898 I40E_PTT_UNUSED_ENTRY(217),
899 I40E_PTT_UNUSED_ENTRY(218),
900 I40E_PTT_UNUSED_ENTRY(219),
902 I40E_PTT_UNUSED_ENTRY(220),
903 I40E_PTT_UNUSED_ENTRY(221),
904 I40E_PTT_UNUSED_ENTRY(222),
905 I40E_PTT_UNUSED_ENTRY(223),
906 I40E_PTT_UNUSED_ENTRY(224),
907 I40E_PTT_UNUSED_ENTRY(225),
908 I40E_PTT_UNUSED_ENTRY(226),
909 I40E_PTT_UNUSED_ENTRY(227),
910 I40E_PTT_UNUSED_ENTRY(228),
911 I40E_PTT_UNUSED_ENTRY(229),
913 I40E_PTT_UNUSED_ENTRY(230),
914 I40E_PTT_UNUSED_ENTRY(231),
915 I40E_PTT_UNUSED_ENTRY(232),
916 I40E_PTT_UNUSED_ENTRY(233),
917 I40E_PTT_UNUSED_ENTRY(234),
918 I40E_PTT_UNUSED_ENTRY(235),
919 I40E_PTT_UNUSED_ENTRY(236),
920 I40E_PTT_UNUSED_ENTRY(237),
921 I40E_PTT_UNUSED_ENTRY(238),
922 I40E_PTT_UNUSED_ENTRY(239),
924 I40E_PTT_UNUSED_ENTRY(240),
925 I40E_PTT_UNUSED_ENTRY(241),
926 I40E_PTT_UNUSED_ENTRY(242),
927 I40E_PTT_UNUSED_ENTRY(243),
928 I40E_PTT_UNUSED_ENTRY(244),
929 I40E_PTT_UNUSED_ENTRY(245),
930 I40E_PTT_UNUSED_ENTRY(246),
931 I40E_PTT_UNUSED_ENTRY(247),
932 I40E_PTT_UNUSED_ENTRY(248),
933 I40E_PTT_UNUSED_ENTRY(249),
935 I40E_PTT_UNUSED_ENTRY(250),
936 I40E_PTT_UNUSED_ENTRY(251),
937 I40E_PTT_UNUSED_ENTRY(252),
938 I40E_PTT_UNUSED_ENTRY(253),
939 I40E_PTT_UNUSED_ENTRY(254),
940 I40E_PTT_UNUSED_ENTRY(255)
945 * i40e_validate_mac_addr - Validate unicast MAC address
946 * @mac_addr: pointer to MAC address
948 * Tests a MAC address to ensure it is a valid Individual Address
950 enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
952 enum i40e_status_code status = I40E_SUCCESS;
954 DEBUGFUNC("i40e_validate_mac_addr");
956 /* Broadcast addresses ARE multicast addresses
957 * Make sure it is not a multicast address
958 * Reject the zero address
960 if (I40E_IS_MULTICAST(mac_addr) ||
961 (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
962 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
963 status = I40E_ERR_INVALID_MAC_ADDR;
969 * i40e_init_shared_code - Initialize the shared code
970 * @hw: pointer to hardware structure
972 * This assigns the MAC type and PHY code and inits the NVM.
973 * Does not touch the hardware. This function must be called prior to any
974 * other function in the shared code. The i40e_hw structure should be
975 * memset to 0 prior to calling this function. The following fields in
976 * hw structure should be filled in prior to calling this function:
977 * hw_addr, back, device_id, vendor_id, subsystem_device_id,
978 * subsystem_vendor_id, and revision_id
980 enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
982 enum i40e_status_code status = I40E_SUCCESS;
983 u32 port, ari, func_rid;
985 DEBUGFUNC("i40e_init_shared_code");
987 i40e_set_mac_type(hw);
989 switch (hw->mac.type) {
994 return I40E_ERR_DEVICE_NOT_SUPPORTED;
997 hw->phy.get_link_info = TRUE;
999 /* Determine port number and PF number*/
1000 port = (rd32(hw, I40E_PFGEN_PORTNUM) & I40E_PFGEN_PORTNUM_PORT_NUM_MASK)
1001 >> I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT;
1002 hw->port = (u8)port;
1003 ari = (rd32(hw, I40E_GLPCI_CAPSUP) & I40E_GLPCI_CAPSUP_ARI_EN_MASK) >>
1004 I40E_GLPCI_CAPSUP_ARI_EN_SHIFT;
1005 func_rid = rd32(hw, I40E_PF_FUNC_RID);
1007 hw->pf_id = (u8)(func_rid & 0xff);
1009 hw->pf_id = (u8)(func_rid & 0x7);
1011 if (hw->mac.type == I40E_MAC_X722)
1012 hw->flags |= I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE;
1014 status = i40e_init_nvm(hw);
1019 * i40e_aq_mac_address_read - Retrieve the MAC addresses
1020 * @hw: pointer to the hw struct
1021 * @flags: a return indicator of what addresses were added to the addr store
1022 * @addrs: the requestor's mac addr store
1023 * @cmd_details: pointer to command details structure or NULL
1025 static enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw,
1027 struct i40e_aqc_mac_address_read_data *addrs,
1028 struct i40e_asq_cmd_details *cmd_details)
1030 struct i40e_aq_desc desc;
1031 struct i40e_aqc_mac_address_read *cmd_data =
1032 (struct i40e_aqc_mac_address_read *)&desc.params.raw;
1033 enum i40e_status_code status;
1035 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
1036 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
1038 status = i40e_asq_send_command(hw, &desc, addrs,
1039 sizeof(*addrs), cmd_details);
1040 *flags = LE16_TO_CPU(cmd_data->command_flags);
1046 * i40e_aq_mac_address_write - Change the MAC addresses
1047 * @hw: pointer to the hw struct
1048 * @flags: indicates which MAC to be written
1049 * @mac_addr: address to write
1050 * @cmd_details: pointer to command details structure or NULL
1052 enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
1053 u16 flags, u8 *mac_addr,
1054 struct i40e_asq_cmd_details *cmd_details)
1056 struct i40e_aq_desc desc;
1057 struct i40e_aqc_mac_address_write *cmd_data =
1058 (struct i40e_aqc_mac_address_write *)&desc.params.raw;
1059 enum i40e_status_code status;
1061 i40e_fill_default_direct_cmd_desc(&desc,
1062 i40e_aqc_opc_mac_address_write);
1063 cmd_data->command_flags = CPU_TO_LE16(flags);
1064 cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]);
1065 cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) |
1066 ((u32)mac_addr[3] << 16) |
1067 ((u32)mac_addr[4] << 8) |
1070 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1076 * i40e_get_mac_addr - get MAC address
1077 * @hw: pointer to the HW structure
1078 * @mac_addr: pointer to MAC address
1080 * Reads the adapter's MAC address from register
1082 enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1084 struct i40e_aqc_mac_address_read_data addrs;
1085 enum i40e_status_code status;
1088 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1090 if (flags & I40E_AQC_LAN_ADDR_VALID)
1091 memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac));
1097 * i40e_get_port_mac_addr - get Port MAC address
1098 * @hw: pointer to the HW structure
1099 * @mac_addr: pointer to Port MAC address
1101 * Reads the adapter's Port MAC address
1103 enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1105 struct i40e_aqc_mac_address_read_data addrs;
1106 enum i40e_status_code status;
1109 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1113 if (flags & I40E_AQC_PORT_ADDR_VALID)
1114 memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac));
1116 status = I40E_ERR_INVALID_MAC_ADDR;
1122 * i40e_pre_tx_queue_cfg - pre tx queue configure
1123 * @hw: pointer to the HW structure
1124 * @queue: target pf queue index
1125 * @enable: state change request
1127 * Handles hw requirement to indicate intention to enable
1128 * or disable target queue.
1130 void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable)
1132 u32 abs_queue_idx = hw->func_caps.base_queue + queue;
1136 if (abs_queue_idx >= 128) {
1137 reg_block = abs_queue_idx / 128;
1138 abs_queue_idx %= 128;
1141 reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1142 reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1143 reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1146 reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK;
1148 reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1150 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val);
1154 * i40e_read_pba_string - Reads part number string from EEPROM
1155 * @hw: pointer to hardware structure
1156 * @pba_num: stores the part number string from the EEPROM
1157 * @pba_num_size: part number string buffer length
1159 * Reads the part number string from the EEPROM.
1161 enum i40e_status_code i40e_read_pba_string(struct i40e_hw *hw, u8 *pba_num,
1164 enum i40e_status_code status = I40E_SUCCESS;
1170 status = i40e_read_nvm_word(hw, I40E_SR_PBA_FLAGS, &pba_word);
1171 if ((status != I40E_SUCCESS) || (pba_word != 0xFAFA)) {
1172 DEBUGOUT("Failed to read PBA flags or flag is invalid.\n");
1176 status = i40e_read_nvm_word(hw, I40E_SR_PBA_BLOCK_PTR, &pba_ptr);
1177 if (status != I40E_SUCCESS) {
1178 DEBUGOUT("Failed to read PBA Block pointer.\n");
1182 status = i40e_read_nvm_word(hw, pba_ptr, &pba_size);
1183 if (status != I40E_SUCCESS) {
1184 DEBUGOUT("Failed to read PBA Block size.\n");
1188 /* Subtract one to get PBA word count (PBA Size word is included in
1192 if (pba_num_size < (((u32)pba_size * 2) + 1)) {
1193 DEBUGOUT("Buffer to small for PBA data.\n");
1194 return I40E_ERR_PARAM;
1197 for (i = 0; i < pba_size; i++) {
1198 status = i40e_read_nvm_word(hw, (pba_ptr + 1) + i, &pba_word);
1199 if (status != I40E_SUCCESS) {
1200 DEBUGOUT1("Failed to read PBA Block word %d.\n", i);
1204 pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
1205 pba_num[(i * 2) + 1] = pba_word & 0xFF;
1207 pba_num[(pba_size * 2)] = '\0';
1213 * i40e_get_media_type - Gets media type
1214 * @hw: pointer to the hardware structure
1216 static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
1218 enum i40e_media_type media;
1220 switch (hw->phy.link_info.phy_type) {
1221 case I40E_PHY_TYPE_10GBASE_SR:
1222 case I40E_PHY_TYPE_10GBASE_LR:
1223 case I40E_PHY_TYPE_1000BASE_SX:
1224 case I40E_PHY_TYPE_1000BASE_LX:
1225 case I40E_PHY_TYPE_40GBASE_SR4:
1226 case I40E_PHY_TYPE_40GBASE_LR4:
1227 media = I40E_MEDIA_TYPE_FIBER;
1229 case I40E_PHY_TYPE_100BASE_TX:
1230 case I40E_PHY_TYPE_1000BASE_T:
1231 case I40E_PHY_TYPE_10GBASE_T:
1232 media = I40E_MEDIA_TYPE_BASET;
1234 case I40E_PHY_TYPE_10GBASE_CR1_CU:
1235 case I40E_PHY_TYPE_40GBASE_CR4_CU:
1236 case I40E_PHY_TYPE_10GBASE_CR1:
1237 case I40E_PHY_TYPE_40GBASE_CR4:
1238 case I40E_PHY_TYPE_10GBASE_SFPP_CU:
1239 case I40E_PHY_TYPE_40GBASE_AOC:
1240 case I40E_PHY_TYPE_10GBASE_AOC:
1241 media = I40E_MEDIA_TYPE_DA;
1243 case I40E_PHY_TYPE_1000BASE_KX:
1244 case I40E_PHY_TYPE_10GBASE_KX4:
1245 case I40E_PHY_TYPE_10GBASE_KR:
1246 case I40E_PHY_TYPE_40GBASE_KR4:
1247 case I40E_PHY_TYPE_20GBASE_KR2:
1248 media = I40E_MEDIA_TYPE_BACKPLANE;
1250 case I40E_PHY_TYPE_SGMII:
1251 case I40E_PHY_TYPE_XAUI:
1252 case I40E_PHY_TYPE_XFI:
1253 case I40E_PHY_TYPE_XLAUI:
1254 case I40E_PHY_TYPE_XLPPI:
1256 media = I40E_MEDIA_TYPE_UNKNOWN;
1263 #define I40E_PF_RESET_WAIT_COUNT 200
1265 * i40e_pf_reset - Reset the PF
1266 * @hw: pointer to the hardware structure
1268 * Assuming someone else has triggered a global reset,
1269 * assure the global reset is complete and then reset the PF
1271 enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw)
1278 /* Poll for Global Reset steady state in case of recent GRST.
1279 * The grst delay value is in 100ms units, and we'll wait a
1280 * couple counts longer to be sure we don't just miss the end.
1282 grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) &
1283 I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >>
1284 I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
1286 grst_del = grst_del * 20;
1288 for (cnt = 0; cnt < grst_del; cnt++) {
1289 reg = rd32(hw, I40E_GLGEN_RSTAT);
1290 if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
1292 i40e_msec_delay(100);
1294 if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1295 DEBUGOUT("Global reset polling failed to complete.\n");
1296 return I40E_ERR_RESET_FAILED;
1299 /* Now Wait for the FW to be ready */
1300 for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) {
1301 reg = rd32(hw, I40E_GLNVM_ULD);
1302 reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1303 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK);
1304 if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1305 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) {
1306 DEBUGOUT1("Core and Global modules ready %d\n", cnt1);
1309 i40e_msec_delay(10);
1311 if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1312 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) {
1313 DEBUGOUT("wait for FW Reset complete timedout\n");
1314 DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg);
1315 return I40E_ERR_RESET_FAILED;
1318 /* If there was a Global Reset in progress when we got here,
1319 * we don't need to do the PF Reset
1322 reg = rd32(hw, I40E_PFGEN_CTRL);
1323 wr32(hw, I40E_PFGEN_CTRL,
1324 (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
1325 for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) {
1326 reg = rd32(hw, I40E_PFGEN_CTRL);
1327 if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
1331 if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
1332 DEBUGOUT("PF reset polling failed to complete.\n");
1333 return I40E_ERR_RESET_FAILED;
1337 i40e_clear_pxe_mode(hw);
1340 return I40E_SUCCESS;
1344 * i40e_clear_hw - clear out any left over hw state
1345 * @hw: pointer to the hw struct
1347 * Clear queues and interrupts, typically called at init time,
1348 * but after the capabilities have been found so we know how many
1349 * queues and msix vectors have been allocated.
1351 void i40e_clear_hw(struct i40e_hw *hw)
1353 u32 num_queues, base_queue;
1361 /* get number of interrupts, queues, and vfs */
1362 val = rd32(hw, I40E_GLPCI_CNF2);
1363 num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >>
1364 I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT;
1365 num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >>
1366 I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT;
1368 val = rd32(hw, I40E_PFLAN_QALLOC);
1369 base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >>
1370 I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
1371 j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
1372 I40E_PFLAN_QALLOC_LASTQ_SHIFT;
1373 if (val & I40E_PFLAN_QALLOC_VALID_MASK)
1374 num_queues = (j - base_queue) + 1;
1378 val = rd32(hw, I40E_PF_VT_PFALLOC);
1379 i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >>
1380 I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
1381 j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
1382 I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
1383 if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
1384 num_vfs = (j - i) + 1;
1388 /* stop all the interrupts */
1389 wr32(hw, I40E_PFINT_ICR0_ENA, 0);
1390 val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
1391 for (i = 0; i < num_pf_int - 2; i++)
1392 wr32(hw, I40E_PFINT_DYN_CTLN(i), val);
1394 /* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
1395 val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1396 wr32(hw, I40E_PFINT_LNKLST0, val);
1397 for (i = 0; i < num_pf_int - 2; i++)
1398 wr32(hw, I40E_PFINT_LNKLSTN(i), val);
1399 val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1400 for (i = 0; i < num_vfs; i++)
1401 wr32(hw, I40E_VPINT_LNKLST0(i), val);
1402 for (i = 0; i < num_vf_int - 2; i++)
1403 wr32(hw, I40E_VPINT_LNKLSTN(i), val);
1405 /* warn the HW of the coming Tx disables */
1406 for (i = 0; i < num_queues; i++) {
1407 u32 abs_queue_idx = base_queue + i;
1410 if (abs_queue_idx >= 128) {
1411 reg_block = abs_queue_idx / 128;
1412 abs_queue_idx %= 128;
1415 val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1416 val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1417 val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1418 val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1420 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val);
1422 i40e_usec_delay(400);
1424 /* stop all the queues */
1425 for (i = 0; i < num_queues; i++) {
1426 wr32(hw, I40E_QINT_TQCTL(i), 0);
1427 wr32(hw, I40E_QTX_ENA(i), 0);
1428 wr32(hw, I40E_QINT_RQCTL(i), 0);
1429 wr32(hw, I40E_QRX_ENA(i), 0);
1432 /* short wait for all queue disables to settle */
1433 i40e_usec_delay(50);
1437 * i40e_clear_pxe_mode - clear pxe operations mode
1438 * @hw: pointer to the hw struct
1440 * Make sure all PXE mode settings are cleared, including things
1441 * like descriptor fetch/write-back mode.
1443 void i40e_clear_pxe_mode(struct i40e_hw *hw)
1445 if (i40e_check_asq_alive(hw))
1446 i40e_aq_clear_pxe_mode(hw, NULL);
1450 * i40e_led_is_mine - helper to find matching led
1451 * @hw: pointer to the hw struct
1452 * @idx: index into GPIO registers
1454 * returns: 0 if no match, otherwise the value of the GPIO_CTL register
1456 static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx)
1461 if (!hw->func_caps.led[idx])
1464 gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx));
1465 port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >>
1466 I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
1468 /* if PRT_NUM_NA is 1 then this LED is not port specific, OR
1469 * if it is not our port then ignore
1471 if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) ||
1478 #define I40E_COMBINED_ACTIVITY 0xA
1479 #define I40E_FILTER_ACTIVITY 0xE
1480 #define I40E_LINK_ACTIVITY 0xC
1481 #define I40E_MAC_ACTIVITY 0xD
1482 #define I40E_LED0 22
1485 * i40e_led_get - return current on/off mode
1486 * @hw: pointer to the hw struct
1488 * The value returned is the 'mode' field as defined in the
1489 * GPIO register definitions: 0x0 = off, 0xf = on, and other
1490 * values are variations of possible behaviors relating to
1491 * blink, link, and wire.
1493 u32 i40e_led_get(struct i40e_hw *hw)
1495 u32 current_mode = 0;
1499 /* as per the documentation GPIO 22-29 are the LED
1500 * GPIO pins named LED0..LED7
1502 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1503 u32 gpio_val = i40e_led_is_mine(hw, i);
1508 /* ignore gpio LED src mode entries related to the activity
1511 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1512 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1513 switch (current_mode) {
1514 case I40E_COMBINED_ACTIVITY:
1515 case I40E_FILTER_ACTIVITY:
1516 case I40E_MAC_ACTIVITY:
1522 mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1523 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT;
1531 * i40e_led_set - set new on/off mode
1532 * @hw: pointer to the hw struct
1533 * @mode: 0=off, 0xf=on (else see manual for mode details)
1534 * @blink: TRUE if the LED should blink when on, FALSE if steady
1536 * if this function is used to turn on the blink it should
1537 * be used to disable the blink when restoring the original state.
1539 void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink)
1541 u32 current_mode = 0;
1544 if (mode & 0xfffffff0)
1545 DEBUGOUT1("invalid mode passed in %X\n", mode);
1547 /* as per the documentation GPIO 22-29 are the LED
1548 * GPIO pins named LED0..LED7
1550 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1551 u32 gpio_val = i40e_led_is_mine(hw, i);
1556 /* ignore gpio LED src mode entries related to the activity
1559 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1560 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1561 switch (current_mode) {
1562 case I40E_COMBINED_ACTIVITY:
1563 case I40E_FILTER_ACTIVITY:
1564 case I40E_MAC_ACTIVITY:
1570 gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
1571 /* this & is a bit of paranoia, but serves as a range check */
1572 gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
1573 I40E_GLGEN_GPIO_CTL_LED_MODE_MASK);
1575 if (mode == I40E_LINK_ACTIVITY)
1579 gpio_val |= BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1581 gpio_val &= ~BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1583 wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
1588 /* Admin command wrappers */
1591 * i40e_aq_get_phy_capabilities
1592 * @hw: pointer to the hw struct
1593 * @abilities: structure for PHY capabilities to be filled
1594 * @qualified_modules: report Qualified Modules
1595 * @report_init: report init capabilities (active are default)
1596 * @cmd_details: pointer to command details structure or NULL
1598 * Returns the various PHY abilities supported on the Port.
1600 enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
1601 bool qualified_modules, bool report_init,
1602 struct i40e_aq_get_phy_abilities_resp *abilities,
1603 struct i40e_asq_cmd_details *cmd_details)
1605 struct i40e_aq_desc desc;
1606 enum i40e_status_code status;
1607 u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
1610 return I40E_ERR_PARAM;
1612 i40e_fill_default_direct_cmd_desc(&desc,
1613 i40e_aqc_opc_get_phy_abilities);
1615 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1616 if (abilities_size > I40E_AQ_LARGE_BUF)
1617 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1619 if (qualified_modules)
1620 desc.params.external.param0 |=
1621 CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
1624 desc.params.external.param0 |=
1625 CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
1627 status = i40e_asq_send_command(hw, &desc, abilities, abilities_size,
1630 if (hw->aq.asq_last_status == I40E_AQ_RC_EIO)
1631 status = I40E_ERR_UNKNOWN_PHY;
1634 hw->phy.phy_types = LE32_TO_CPU(abilities->phy_type);
1635 hw->phy.phy_types |= ((u64)abilities->phy_type_ext << 32);
1642 * i40e_aq_set_phy_config
1643 * @hw: pointer to the hw struct
1644 * @config: structure with PHY configuration to be set
1645 * @cmd_details: pointer to command details structure or NULL
1647 * Set the various PHY configuration parameters
1648 * supported on the Port.One or more of the Set PHY config parameters may be
1649 * ignored in an MFP mode as the PF may not have the privilege to set some
1650 * of the PHY Config parameters. This status will be indicated by the
1653 enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
1654 struct i40e_aq_set_phy_config *config,
1655 struct i40e_asq_cmd_details *cmd_details)
1657 struct i40e_aq_desc desc;
1658 struct i40e_aq_set_phy_config *cmd =
1659 (struct i40e_aq_set_phy_config *)&desc.params.raw;
1660 enum i40e_status_code status;
1663 return I40E_ERR_PARAM;
1665 i40e_fill_default_direct_cmd_desc(&desc,
1666 i40e_aqc_opc_set_phy_config);
1670 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1677 * @hw: pointer to the hw struct
1679 * Set the requested flow control mode using set_phy_config.
1681 enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
1682 bool atomic_restart)
1684 enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
1685 struct i40e_aq_get_phy_abilities_resp abilities;
1686 struct i40e_aq_set_phy_config config;
1687 enum i40e_status_code status;
1688 u8 pause_mask = 0x0;
1694 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1695 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1697 case I40E_FC_RX_PAUSE:
1698 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1700 case I40E_FC_TX_PAUSE:
1701 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1707 /* Get the current phy config */
1708 status = i40e_aq_get_phy_capabilities(hw, FALSE, false, &abilities,
1711 *aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
1715 memset(&config, 0, sizeof(config));
1716 /* clear the old pause settings */
1717 config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
1718 ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
1719 /* set the new abilities */
1720 config.abilities |= pause_mask;
1721 /* If the abilities have changed, then set the new config */
1722 if (config.abilities != abilities.abilities) {
1723 /* Auto restart link so settings take effect */
1725 config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
1726 /* Copy over all the old settings */
1727 config.phy_type = abilities.phy_type;
1728 config.link_speed = abilities.link_speed;
1729 config.eee_capability = abilities.eee_capability;
1730 config.eeer = abilities.eeer_val;
1731 config.low_power_ctrl = abilities.d3_lpan;
1732 status = i40e_aq_set_phy_config(hw, &config, NULL);
1735 *aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
1737 /* Update the link info */
1738 status = i40e_update_link_info(hw);
1740 /* Wait a little bit (on 40G cards it sometimes takes a really
1741 * long time for link to come back from the atomic reset)
1744 i40e_msec_delay(1000);
1745 status = i40e_update_link_info(hw);
1748 *aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
1754 * i40e_aq_set_mac_config
1755 * @hw: pointer to the hw struct
1756 * @max_frame_size: Maximum Frame Size to be supported by the port
1757 * @crc_en: Tell HW to append a CRC to outgoing frames
1758 * @pacing: Pacing configurations
1759 * @cmd_details: pointer to command details structure or NULL
1761 * Configure MAC settings for frame size, jumbo frame support and the
1762 * addition of a CRC by the hardware.
1764 enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
1766 bool crc_en, u16 pacing,
1767 struct i40e_asq_cmd_details *cmd_details)
1769 struct i40e_aq_desc desc;
1770 struct i40e_aq_set_mac_config *cmd =
1771 (struct i40e_aq_set_mac_config *)&desc.params.raw;
1772 enum i40e_status_code status;
1774 if (max_frame_size == 0)
1775 return I40E_ERR_PARAM;
1777 i40e_fill_default_direct_cmd_desc(&desc,
1778 i40e_aqc_opc_set_mac_config);
1780 cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
1781 cmd->params = ((u8)pacing & 0x0F) << 3;
1783 cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
1785 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1791 * i40e_aq_clear_pxe_mode
1792 * @hw: pointer to the hw struct
1793 * @cmd_details: pointer to command details structure or NULL
1795 * Tell the firmware that the driver is taking over from PXE
1797 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
1798 struct i40e_asq_cmd_details *cmd_details)
1800 enum i40e_status_code status;
1801 struct i40e_aq_desc desc;
1802 struct i40e_aqc_clear_pxe *cmd =
1803 (struct i40e_aqc_clear_pxe *)&desc.params.raw;
1805 i40e_fill_default_direct_cmd_desc(&desc,
1806 i40e_aqc_opc_clear_pxe_mode);
1810 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1812 wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
1818 * i40e_aq_set_link_restart_an
1819 * @hw: pointer to the hw struct
1820 * @enable_link: if TRUE: enable link, if FALSE: disable link
1821 * @cmd_details: pointer to command details structure or NULL
1823 * Sets up the link and restarts the Auto-Negotiation over the link.
1825 enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
1826 bool enable_link, struct i40e_asq_cmd_details *cmd_details)
1828 struct i40e_aq_desc desc;
1829 struct i40e_aqc_set_link_restart_an *cmd =
1830 (struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
1831 enum i40e_status_code status;
1833 i40e_fill_default_direct_cmd_desc(&desc,
1834 i40e_aqc_opc_set_link_restart_an);
1836 cmd->command = I40E_AQ_PHY_RESTART_AN;
1838 cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
1840 cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
1842 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1848 * i40e_aq_get_link_info
1849 * @hw: pointer to the hw struct
1850 * @enable_lse: enable/disable LinkStatusEvent reporting
1851 * @link: pointer to link status structure - optional
1852 * @cmd_details: pointer to command details structure or NULL
1854 * Returns the link status of the adapter.
1856 enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
1857 bool enable_lse, struct i40e_link_status *link,
1858 struct i40e_asq_cmd_details *cmd_details)
1860 struct i40e_aq_desc desc;
1861 struct i40e_aqc_get_link_status *resp =
1862 (struct i40e_aqc_get_link_status *)&desc.params.raw;
1863 struct i40e_link_status *hw_link_info = &hw->phy.link_info;
1864 enum i40e_status_code status;
1865 bool tx_pause, rx_pause;
1868 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
1871 command_flags = I40E_AQ_LSE_ENABLE;
1873 command_flags = I40E_AQ_LSE_DISABLE;
1874 resp->command_flags = CPU_TO_LE16(command_flags);
1876 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1878 if (status != I40E_SUCCESS)
1879 goto aq_get_link_info_exit;
1881 /* save off old link status information */
1882 i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
1883 sizeof(*hw_link_info), I40E_NONDMA_TO_NONDMA);
1885 /* update link status */
1886 hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
1887 hw->phy.media_type = i40e_get_media_type(hw);
1888 hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
1889 hw_link_info->link_info = resp->link_info;
1890 hw_link_info->an_info = resp->an_info;
1891 hw_link_info->ext_info = resp->ext_info;
1892 hw_link_info->loopback = resp->loopback;
1893 hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
1894 hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
1896 /* update fc info */
1897 tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
1898 rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
1899 if (tx_pause & rx_pause)
1900 hw->fc.current_mode = I40E_FC_FULL;
1902 hw->fc.current_mode = I40E_FC_TX_PAUSE;
1904 hw->fc.current_mode = I40E_FC_RX_PAUSE;
1906 hw->fc.current_mode = I40E_FC_NONE;
1908 if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
1909 hw_link_info->crc_enable = TRUE;
1911 hw_link_info->crc_enable = FALSE;
1913 if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_ENABLE))
1914 hw_link_info->lse_enable = TRUE;
1916 hw_link_info->lse_enable = FALSE;
1918 if ((hw->aq.fw_maj_ver < 4 || (hw->aq.fw_maj_ver == 4 &&
1919 hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
1920 hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
1922 /* save link status information */
1924 i40e_memcpy(link, hw_link_info, sizeof(*hw_link_info),
1925 I40E_NONDMA_TO_NONDMA);
1927 /* flag cleared so helper functions don't call AQ again */
1928 hw->phy.get_link_info = FALSE;
1930 aq_get_link_info_exit:
1935 * i40e_aq_set_phy_int_mask
1936 * @hw: pointer to the hw struct
1937 * @mask: interrupt mask to be set
1938 * @cmd_details: pointer to command details structure or NULL
1940 * Set link interrupt mask.
1942 enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
1944 struct i40e_asq_cmd_details *cmd_details)
1946 struct i40e_aq_desc desc;
1947 struct i40e_aqc_set_phy_int_mask *cmd =
1948 (struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
1949 enum i40e_status_code status;
1951 i40e_fill_default_direct_cmd_desc(&desc,
1952 i40e_aqc_opc_set_phy_int_mask);
1954 cmd->event_mask = CPU_TO_LE16(mask);
1956 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1962 * i40e_aq_get_local_advt_reg
1963 * @hw: pointer to the hw struct
1964 * @advt_reg: local AN advertisement register value
1965 * @cmd_details: pointer to command details structure or NULL
1967 * Get the Local AN advertisement register value.
1969 enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
1971 struct i40e_asq_cmd_details *cmd_details)
1973 struct i40e_aq_desc desc;
1974 struct i40e_aqc_an_advt_reg *resp =
1975 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
1976 enum i40e_status_code status;
1978 i40e_fill_default_direct_cmd_desc(&desc,
1979 i40e_aqc_opc_get_local_advt_reg);
1981 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1983 if (status != I40E_SUCCESS)
1984 goto aq_get_local_advt_reg_exit;
1986 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
1987 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
1989 aq_get_local_advt_reg_exit:
1994 * i40e_aq_set_local_advt_reg
1995 * @hw: pointer to the hw struct
1996 * @advt_reg: local AN advertisement register value
1997 * @cmd_details: pointer to command details structure or NULL
1999 * Get the Local AN advertisement register value.
2001 enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
2003 struct i40e_asq_cmd_details *cmd_details)
2005 struct i40e_aq_desc desc;
2006 struct i40e_aqc_an_advt_reg *cmd =
2007 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2008 enum i40e_status_code status;
2010 i40e_fill_default_direct_cmd_desc(&desc,
2011 i40e_aqc_opc_get_local_advt_reg);
2013 cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
2014 cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
2016 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2022 * i40e_aq_get_partner_advt
2023 * @hw: pointer to the hw struct
2024 * @advt_reg: AN partner advertisement register value
2025 * @cmd_details: pointer to command details structure or NULL
2027 * Get the link partner AN advertisement register value.
2029 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
2031 struct i40e_asq_cmd_details *cmd_details)
2033 struct i40e_aq_desc desc;
2034 struct i40e_aqc_an_advt_reg *resp =
2035 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2036 enum i40e_status_code status;
2038 i40e_fill_default_direct_cmd_desc(&desc,
2039 i40e_aqc_opc_get_partner_advt);
2041 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2043 if (status != I40E_SUCCESS)
2044 goto aq_get_partner_advt_exit;
2046 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2047 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2049 aq_get_partner_advt_exit:
2054 * i40e_aq_set_lb_modes
2055 * @hw: pointer to the hw struct
2056 * @lb_modes: loopback mode to be set
2057 * @cmd_details: pointer to command details structure or NULL
2059 * Sets loopback modes.
2061 enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
2063 struct i40e_asq_cmd_details *cmd_details)
2065 struct i40e_aq_desc desc;
2066 struct i40e_aqc_set_lb_mode *cmd =
2067 (struct i40e_aqc_set_lb_mode *)&desc.params.raw;
2068 enum i40e_status_code status;
2070 i40e_fill_default_direct_cmd_desc(&desc,
2071 i40e_aqc_opc_set_lb_modes);
2073 cmd->lb_mode = CPU_TO_LE16(lb_modes);
2075 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2081 * i40e_aq_set_phy_debug
2082 * @hw: pointer to the hw struct
2083 * @cmd_flags: debug command flags
2084 * @cmd_details: pointer to command details structure or NULL
2086 * Reset the external PHY.
2088 enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
2089 struct i40e_asq_cmd_details *cmd_details)
2091 struct i40e_aq_desc desc;
2092 struct i40e_aqc_set_phy_debug *cmd =
2093 (struct i40e_aqc_set_phy_debug *)&desc.params.raw;
2094 enum i40e_status_code status;
2096 i40e_fill_default_direct_cmd_desc(&desc,
2097 i40e_aqc_opc_set_phy_debug);
2099 cmd->command_flags = cmd_flags;
2101 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2108 * @hw: pointer to the hw struct
2109 * @vsi_ctx: pointer to a vsi context struct
2110 * @cmd_details: pointer to command details structure or NULL
2112 * Add a VSI context to the hardware.
2114 enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
2115 struct i40e_vsi_context *vsi_ctx,
2116 struct i40e_asq_cmd_details *cmd_details)
2118 struct i40e_aq_desc desc;
2119 struct i40e_aqc_add_get_update_vsi *cmd =
2120 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2121 struct i40e_aqc_add_get_update_vsi_completion *resp =
2122 (struct i40e_aqc_add_get_update_vsi_completion *)
2124 enum i40e_status_code status;
2126 i40e_fill_default_direct_cmd_desc(&desc,
2127 i40e_aqc_opc_add_vsi);
2129 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
2130 cmd->connection_type = vsi_ctx->connection_type;
2131 cmd->vf_id = vsi_ctx->vf_num;
2132 cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
2134 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2136 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2137 sizeof(vsi_ctx->info), cmd_details);
2139 if (status != I40E_SUCCESS)
2140 goto aq_add_vsi_exit;
2142 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2143 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2144 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2145 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2152 * i40e_aq_set_default_vsi
2153 * @hw: pointer to the hw struct
2155 * @cmd_details: pointer to command details structure or NULL
2157 enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
2159 struct i40e_asq_cmd_details *cmd_details)
2161 struct i40e_aq_desc desc;
2162 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2163 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2165 enum i40e_status_code status;
2167 i40e_fill_default_direct_cmd_desc(&desc,
2168 i40e_aqc_opc_set_vsi_promiscuous_modes);
2170 cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2171 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2172 cmd->seid = CPU_TO_LE16(seid);
2174 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2180 * i40e_aq_clear_default_vsi
2181 * @hw: pointer to the hw struct
2183 * @cmd_details: pointer to command details structure or NULL
2185 enum i40e_status_code i40e_aq_clear_default_vsi(struct i40e_hw *hw,
2187 struct i40e_asq_cmd_details *cmd_details)
2189 struct i40e_aq_desc desc;
2190 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2191 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2193 enum i40e_status_code status;
2195 i40e_fill_default_direct_cmd_desc(&desc,
2196 i40e_aqc_opc_set_vsi_promiscuous_modes);
2198 cmd->promiscuous_flags = CPU_TO_LE16(0);
2199 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2200 cmd->seid = CPU_TO_LE16(seid);
2202 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2208 * i40e_aq_set_vsi_unicast_promiscuous
2209 * @hw: pointer to the hw struct
2211 * @set: set unicast promiscuous enable/disable
2212 * @cmd_details: pointer to command details structure or NULL
2213 * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
2215 enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
2217 struct i40e_asq_cmd_details *cmd_details,
2218 bool rx_only_promisc)
2220 struct i40e_aq_desc desc;
2221 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2222 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2223 enum i40e_status_code status;
2226 i40e_fill_default_direct_cmd_desc(&desc,
2227 i40e_aqc_opc_set_vsi_promiscuous_modes);
2230 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2231 if (rx_only_promisc &&
2232 (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) ||
2233 (hw->aq.api_maj_ver > 1)))
2234 flags |= I40E_AQC_SET_VSI_PROMISC_TX;
2237 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2239 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2240 if (((hw->aq.api_maj_ver >= 1) && (hw->aq.api_min_ver >= 5)) ||
2241 (hw->aq.api_maj_ver > 1))
2242 cmd->valid_flags |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_TX);
2244 cmd->seid = CPU_TO_LE16(seid);
2245 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2251 * i40e_aq_set_vsi_multicast_promiscuous
2252 * @hw: pointer to the hw struct
2254 * @set: set multicast promiscuous enable/disable
2255 * @cmd_details: pointer to command details structure or NULL
2257 enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
2258 u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
2260 struct i40e_aq_desc desc;
2261 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2262 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2263 enum i40e_status_code status;
2266 i40e_fill_default_direct_cmd_desc(&desc,
2267 i40e_aqc_opc_set_vsi_promiscuous_modes);
2270 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2272 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2274 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2276 cmd->seid = CPU_TO_LE16(seid);
2277 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2283 * i40e_aq_set_vsi_mc_promisc_on_vlan
2284 * @hw: pointer to the hw struct
2286 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2287 * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
2288 * @cmd_details: pointer to command details structure or NULL
2290 enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
2291 u16 seid, bool enable, u16 vid,
2292 struct i40e_asq_cmd_details *cmd_details)
2294 struct i40e_aq_desc desc;
2295 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2296 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2297 enum i40e_status_code status;
2300 i40e_fill_default_direct_cmd_desc(&desc,
2301 i40e_aqc_opc_set_vsi_promiscuous_modes);
2304 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2306 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2307 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2308 cmd->seid = CPU_TO_LE16(seid);
2309 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2311 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2317 * i40e_aq_set_vsi_uc_promisc_on_vlan
2318 * @hw: pointer to the hw struct
2320 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2321 * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
2322 * @cmd_details: pointer to command details structure or NULL
2324 enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
2325 u16 seid, bool enable, u16 vid,
2326 struct i40e_asq_cmd_details *cmd_details)
2328 struct i40e_aq_desc desc;
2329 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2330 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2331 enum i40e_status_code status;
2334 i40e_fill_default_direct_cmd_desc(&desc,
2335 i40e_aqc_opc_set_vsi_promiscuous_modes);
2338 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2340 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2341 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2342 cmd->seid = CPU_TO_LE16(seid);
2343 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2345 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2351 * i40e_aq_set_vsi_broadcast
2352 * @hw: pointer to the hw struct
2354 * @set_filter: TRUE to set filter, FALSE to clear filter
2355 * @cmd_details: pointer to command details structure or NULL
2357 * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
2359 enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
2360 u16 seid, bool set_filter,
2361 struct i40e_asq_cmd_details *cmd_details)
2363 struct i40e_aq_desc desc;
2364 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2365 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2366 enum i40e_status_code status;
2368 i40e_fill_default_direct_cmd_desc(&desc,
2369 i40e_aqc_opc_set_vsi_promiscuous_modes);
2372 cmd->promiscuous_flags
2373 |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2375 cmd->promiscuous_flags
2376 &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2378 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2379 cmd->seid = CPU_TO_LE16(seid);
2380 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2386 * i40e_aq_set_vsi_vlan_promisc - control the VLAN promiscuous setting
2387 * @hw: pointer to the hw struct
2389 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2390 * @cmd_details: pointer to command details structure or NULL
2392 enum i40e_status_code i40e_aq_set_vsi_vlan_promisc(struct i40e_hw *hw,
2393 u16 seid, bool enable,
2394 struct i40e_asq_cmd_details *cmd_details)
2396 struct i40e_aq_desc desc;
2397 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2398 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2399 enum i40e_status_code status;
2402 i40e_fill_default_direct_cmd_desc(&desc,
2403 i40e_aqc_opc_set_vsi_promiscuous_modes);
2405 flags |= I40E_AQC_SET_VSI_PROMISC_VLAN;
2407 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2408 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_VLAN);
2409 cmd->seid = CPU_TO_LE16(seid);
2411 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2417 * i40e_get_vsi_params - get VSI configuration info
2418 * @hw: pointer to the hw struct
2419 * @vsi_ctx: pointer to a vsi context struct
2420 * @cmd_details: pointer to command details structure or NULL
2422 enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
2423 struct i40e_vsi_context *vsi_ctx,
2424 struct i40e_asq_cmd_details *cmd_details)
2426 struct i40e_aq_desc desc;
2427 struct i40e_aqc_add_get_update_vsi *cmd =
2428 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2429 struct i40e_aqc_add_get_update_vsi_completion *resp =
2430 (struct i40e_aqc_add_get_update_vsi_completion *)
2432 enum i40e_status_code status;
2434 i40e_fill_default_direct_cmd_desc(&desc,
2435 i40e_aqc_opc_get_vsi_parameters);
2437 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2439 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2441 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2442 sizeof(vsi_ctx->info), NULL);
2444 if (status != I40E_SUCCESS)
2445 goto aq_get_vsi_params_exit;
2447 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2448 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2449 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2450 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2452 aq_get_vsi_params_exit:
2457 * i40e_aq_update_vsi_params
2458 * @hw: pointer to the hw struct
2459 * @vsi_ctx: pointer to a vsi context struct
2460 * @cmd_details: pointer to command details structure or NULL
2462 * Update a VSI context.
2464 enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
2465 struct i40e_vsi_context *vsi_ctx,
2466 struct i40e_asq_cmd_details *cmd_details)
2468 struct i40e_aq_desc desc;
2469 struct i40e_aqc_add_get_update_vsi *cmd =
2470 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2471 struct i40e_aqc_add_get_update_vsi_completion *resp =
2472 (struct i40e_aqc_add_get_update_vsi_completion *)
2474 enum i40e_status_code status;
2476 i40e_fill_default_direct_cmd_desc(&desc,
2477 i40e_aqc_opc_update_vsi_parameters);
2478 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2480 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2482 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2483 sizeof(vsi_ctx->info), cmd_details);
2485 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2486 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2492 * i40e_aq_get_switch_config
2493 * @hw: pointer to the hardware structure
2494 * @buf: pointer to the result buffer
2495 * @buf_size: length of input buffer
2496 * @start_seid: seid to start for the report, 0 == beginning
2497 * @cmd_details: pointer to command details structure or NULL
2499 * Fill the buf with switch configuration returned from AdminQ command
2501 enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
2502 struct i40e_aqc_get_switch_config_resp *buf,
2503 u16 buf_size, u16 *start_seid,
2504 struct i40e_asq_cmd_details *cmd_details)
2506 struct i40e_aq_desc desc;
2507 struct i40e_aqc_switch_seid *scfg =
2508 (struct i40e_aqc_switch_seid *)&desc.params.raw;
2509 enum i40e_status_code status;
2511 i40e_fill_default_direct_cmd_desc(&desc,
2512 i40e_aqc_opc_get_switch_config);
2513 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2514 if (buf_size > I40E_AQ_LARGE_BUF)
2515 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2516 scfg->seid = CPU_TO_LE16(*start_seid);
2518 status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
2519 *start_seid = LE16_TO_CPU(scfg->seid);
2525 * i40e_aq_set_switch_config
2526 * @hw: pointer to the hardware structure
2527 * @flags: bit flag values to set
2528 * @valid_flags: which bit flags to set
2529 * @cmd_details: pointer to command details structure or NULL
2531 * Set switch configuration bits
2533 enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
2534 u16 flags, u16 valid_flags,
2535 struct i40e_asq_cmd_details *cmd_details)
2537 struct i40e_aq_desc desc;
2538 struct i40e_aqc_set_switch_config *scfg =
2539 (struct i40e_aqc_set_switch_config *)&desc.params.raw;
2540 enum i40e_status_code status;
2542 i40e_fill_default_direct_cmd_desc(&desc,
2543 i40e_aqc_opc_set_switch_config);
2544 scfg->flags = CPU_TO_LE16(flags);
2545 scfg->valid_flags = CPU_TO_LE16(valid_flags);
2547 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2553 * i40e_aq_get_firmware_version
2554 * @hw: pointer to the hw struct
2555 * @fw_major_version: firmware major version
2556 * @fw_minor_version: firmware minor version
2557 * @fw_build: firmware build number
2558 * @api_major_version: major queue version
2559 * @api_minor_version: minor queue version
2560 * @cmd_details: pointer to command details structure or NULL
2562 * Get the firmware version from the admin queue commands
2564 enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
2565 u16 *fw_major_version, u16 *fw_minor_version,
2567 u16 *api_major_version, u16 *api_minor_version,
2568 struct i40e_asq_cmd_details *cmd_details)
2570 struct i40e_aq_desc desc;
2571 struct i40e_aqc_get_version *resp =
2572 (struct i40e_aqc_get_version *)&desc.params.raw;
2573 enum i40e_status_code status;
2575 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
2577 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2579 if (status == I40E_SUCCESS) {
2580 if (fw_major_version != NULL)
2581 *fw_major_version = LE16_TO_CPU(resp->fw_major);
2582 if (fw_minor_version != NULL)
2583 *fw_minor_version = LE16_TO_CPU(resp->fw_minor);
2584 if (fw_build != NULL)
2585 *fw_build = LE32_TO_CPU(resp->fw_build);
2586 if (api_major_version != NULL)
2587 *api_major_version = LE16_TO_CPU(resp->api_major);
2588 if (api_minor_version != NULL)
2589 *api_minor_version = LE16_TO_CPU(resp->api_minor);
2591 /* A workaround to fix the API version in SW */
2592 if (api_major_version && api_minor_version &&
2593 fw_major_version && fw_minor_version &&
2594 ((*api_major_version == 1) && (*api_minor_version == 1)) &&
2595 (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
2596 (*fw_major_version > 4)))
2597 *api_minor_version = 2;
2604 * i40e_aq_send_driver_version
2605 * @hw: pointer to the hw struct
2606 * @dv: driver's major, minor version
2607 * @cmd_details: pointer to command details structure or NULL
2609 * Send the driver version to the firmware
2611 enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
2612 struct i40e_driver_version *dv,
2613 struct i40e_asq_cmd_details *cmd_details)
2615 struct i40e_aq_desc desc;
2616 struct i40e_aqc_driver_version *cmd =
2617 (struct i40e_aqc_driver_version *)&desc.params.raw;
2618 enum i40e_status_code status;
2622 return I40E_ERR_PARAM;
2624 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
2626 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
2627 cmd->driver_major_ver = dv->major_version;
2628 cmd->driver_minor_ver = dv->minor_version;
2629 cmd->driver_build_ver = dv->build_version;
2630 cmd->driver_subbuild_ver = dv->subbuild_version;
2633 while (len < sizeof(dv->driver_string) &&
2634 (dv->driver_string[len] < 0x80) &&
2635 dv->driver_string[len])
2637 status = i40e_asq_send_command(hw, &desc, dv->driver_string,
2644 * i40e_get_link_status - get status of the HW network link
2645 * @hw: pointer to the hw struct
2646 * @link_up: pointer to bool (TRUE/FALSE = linkup/linkdown)
2648 * Variable link_up TRUE if link is up, FALSE if link is down.
2649 * The variable link_up is invalid if returned value of status != I40E_SUCCESS
2651 * Side effect: LinkStatusEvent reporting becomes enabled
2653 enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
2655 enum i40e_status_code status = I40E_SUCCESS;
2657 if (hw->phy.get_link_info) {
2658 status = i40e_update_link_info(hw);
2660 if (status != I40E_SUCCESS)
2661 i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
2665 *link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
2671 * i40e_updatelink_status - update status of the HW network link
2672 * @hw: pointer to the hw struct
2674 enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
2676 struct i40e_aq_get_phy_abilities_resp abilities;
2677 enum i40e_status_code status = I40E_SUCCESS;
2679 status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
2683 if (hw->phy.link_info.link_info & I40E_AQ_MEDIA_AVAILABLE) {
2684 status = i40e_aq_get_phy_capabilities(hw, FALSE, false,
2689 memcpy(hw->phy.link_info.module_type, &abilities.module_type,
2690 sizeof(hw->phy.link_info.module_type));
2697 * i40e_get_link_speed
2698 * @hw: pointer to the hw struct
2700 * Returns the link speed of the adapter.
2702 enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
2704 enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
2705 enum i40e_status_code status = I40E_SUCCESS;
2707 if (hw->phy.get_link_info) {
2708 status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
2710 if (status != I40E_SUCCESS)
2711 goto i40e_link_speed_exit;
2714 speed = hw->phy.link_info.link_speed;
2716 i40e_link_speed_exit:
2721 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2722 * @hw: pointer to the hw struct
2723 * @uplink_seid: the MAC or other gizmo SEID
2724 * @downlink_seid: the VSI SEID
2725 * @enabled_tc: bitmap of TCs to be enabled
2726 * @default_port: TRUE for default port VSI, FALSE for control port
2727 * @veb_seid: pointer to where to put the resulting VEB SEID
2728 * @enable_stats: TRUE to turn on VEB stats
2729 * @cmd_details: pointer to command details structure or NULL
2731 * This asks the FW to add a VEB between the uplink and downlink
2732 * elements. If the uplink SEID is 0, this will be a floating VEB.
2734 enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
2735 u16 downlink_seid, u8 enabled_tc,
2736 bool default_port, u16 *veb_seid,
2738 struct i40e_asq_cmd_details *cmd_details)
2740 struct i40e_aq_desc desc;
2741 struct i40e_aqc_add_veb *cmd =
2742 (struct i40e_aqc_add_veb *)&desc.params.raw;
2743 struct i40e_aqc_add_veb_completion *resp =
2744 (struct i40e_aqc_add_veb_completion *)&desc.params.raw;
2745 enum i40e_status_code status;
2748 /* SEIDs need to either both be set or both be 0 for floating VEB */
2749 if (!!uplink_seid != !!downlink_seid)
2750 return I40E_ERR_PARAM;
2752 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
2754 cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
2755 cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
2756 cmd->enable_tcs = enabled_tc;
2758 veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
2760 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
2762 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
2764 /* reverse logic here: set the bitflag to disable the stats */
2766 veb_flags |= I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS;
2768 cmd->veb_flags = CPU_TO_LE16(veb_flags);
2770 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2772 if (!status && veb_seid)
2773 *veb_seid = LE16_TO_CPU(resp->veb_seid);
2779 * i40e_aq_get_veb_parameters - Retrieve VEB parameters
2780 * @hw: pointer to the hw struct
2781 * @veb_seid: the SEID of the VEB to query
2782 * @switch_id: the uplink switch id
2783 * @floating: set to TRUE if the VEB is floating
2784 * @statistic_index: index of the stats counter block for this VEB
2785 * @vebs_used: number of VEB's used by function
2786 * @vebs_free: total VEB's not reserved by any function
2787 * @cmd_details: pointer to command details structure or NULL
2789 * This retrieves the parameters for a particular VEB, specified by
2790 * uplink_seid, and returns them to the caller.
2792 enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
2793 u16 veb_seid, u16 *switch_id,
2794 bool *floating, u16 *statistic_index,
2795 u16 *vebs_used, u16 *vebs_free,
2796 struct i40e_asq_cmd_details *cmd_details)
2798 struct i40e_aq_desc desc;
2799 struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
2800 (struct i40e_aqc_get_veb_parameters_completion *)
2802 enum i40e_status_code status;
2805 return I40E_ERR_PARAM;
2807 i40e_fill_default_direct_cmd_desc(&desc,
2808 i40e_aqc_opc_get_veb_parameters);
2809 cmd_resp->seid = CPU_TO_LE16(veb_seid);
2811 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2816 *switch_id = LE16_TO_CPU(cmd_resp->switch_id);
2817 if (statistic_index)
2818 *statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
2820 *vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
2822 *vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
2824 u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
2826 if (flags & I40E_AQC_ADD_VEB_FLOATING)
2837 * i40e_aq_add_macvlan
2838 * @hw: pointer to the hw struct
2839 * @seid: VSI for the mac address
2840 * @mv_list: list of macvlans to be added
2841 * @count: length of the list
2842 * @cmd_details: pointer to command details structure or NULL
2844 * Add MAC/VLAN addresses to the HW filtering
2846 enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
2847 struct i40e_aqc_add_macvlan_element_data *mv_list,
2848 u16 count, struct i40e_asq_cmd_details *cmd_details)
2850 struct i40e_aq_desc desc;
2851 struct i40e_aqc_macvlan *cmd =
2852 (struct i40e_aqc_macvlan *)&desc.params.raw;
2853 enum i40e_status_code status;
2857 if (count == 0 || !mv_list || !hw)
2858 return I40E_ERR_PARAM;
2860 buf_size = count * sizeof(*mv_list);
2862 /* prep the rest of the request */
2863 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
2864 cmd->num_addresses = CPU_TO_LE16(count);
2865 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2869 for (i = 0; i < count; i++)
2870 if (I40E_IS_MULTICAST(mv_list[i].mac_addr))
2872 CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);
2874 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2875 if (buf_size > I40E_AQ_LARGE_BUF)
2876 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2878 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2885 * i40e_aq_remove_macvlan
2886 * @hw: pointer to the hw struct
2887 * @seid: VSI for the mac address
2888 * @mv_list: list of macvlans to be removed
2889 * @count: length of the list
2890 * @cmd_details: pointer to command details structure or NULL
2892 * Remove MAC/VLAN addresses from the HW filtering
2894 enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
2895 struct i40e_aqc_remove_macvlan_element_data *mv_list,
2896 u16 count, struct i40e_asq_cmd_details *cmd_details)
2898 struct i40e_aq_desc desc;
2899 struct i40e_aqc_macvlan *cmd =
2900 (struct i40e_aqc_macvlan *)&desc.params.raw;
2901 enum i40e_status_code status;
2904 if (count == 0 || !mv_list || !hw)
2905 return I40E_ERR_PARAM;
2907 buf_size = count * sizeof(*mv_list);
2909 /* prep the rest of the request */
2910 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
2911 cmd->num_addresses = CPU_TO_LE16(count);
2912 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2916 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2917 if (buf_size > I40E_AQ_LARGE_BUF)
2918 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2920 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2927 * i40e_mirrorrule_op - Internal helper function to add/delete mirror rule
2928 * @hw: pointer to the hw struct
2929 * @opcode: AQ opcode for add or delete mirror rule
2930 * @sw_seid: Switch SEID (to which rule refers)
2931 * @rule_type: Rule Type (ingress/egress/VLAN)
2932 * @id: Destination VSI SEID or Rule ID
2933 * @count: length of the list
2934 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
2935 * @cmd_details: pointer to command details structure or NULL
2936 * @rule_id: Rule ID returned from FW
2937 * @rule_used: Number of rules used in internal switch
2938 * @rule_free: Number of rules free in internal switch
2940 * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
2941 * VEBs/VEPA elements only
2943 static enum i40e_status_code i40e_mirrorrule_op(struct i40e_hw *hw,
2944 u16 opcode, u16 sw_seid, u16 rule_type, u16 id,
2945 u16 count, __le16 *mr_list,
2946 struct i40e_asq_cmd_details *cmd_details,
2947 u16 *rule_id, u16 *rules_used, u16 *rules_free)
2949 struct i40e_aq_desc desc;
2950 struct i40e_aqc_add_delete_mirror_rule *cmd =
2951 (struct i40e_aqc_add_delete_mirror_rule *)&desc.params.raw;
2952 struct i40e_aqc_add_delete_mirror_rule_completion *resp =
2953 (struct i40e_aqc_add_delete_mirror_rule_completion *)&desc.params.raw;
2954 enum i40e_status_code status;
2957 buf_size = count * sizeof(*mr_list);
2959 /* prep the rest of the request */
2960 i40e_fill_default_direct_cmd_desc(&desc, opcode);
2961 cmd->seid = CPU_TO_LE16(sw_seid);
2962 cmd->rule_type = CPU_TO_LE16(rule_type &
2963 I40E_AQC_MIRROR_RULE_TYPE_MASK);
2964 cmd->num_entries = CPU_TO_LE16(count);
2965 /* Dest VSI for add, rule_id for delete */
2966 cmd->destination = CPU_TO_LE16(id);
2968 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
2970 if (buf_size > I40E_AQ_LARGE_BUF)
2971 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2974 status = i40e_asq_send_command(hw, &desc, mr_list, buf_size,
2976 if (status == I40E_SUCCESS ||
2977 hw->aq.asq_last_status == I40E_AQ_RC_ENOSPC) {
2979 *rule_id = LE16_TO_CPU(resp->rule_id);
2981 *rules_used = LE16_TO_CPU(resp->mirror_rules_used);
2983 *rules_free = LE16_TO_CPU(resp->mirror_rules_free);
2989 * i40e_aq_add_mirrorrule - add a mirror rule
2990 * @hw: pointer to the hw struct
2991 * @sw_seid: Switch SEID (to which rule refers)
2992 * @rule_type: Rule Type (ingress/egress/VLAN)
2993 * @dest_vsi: SEID of VSI to which packets will be mirrored
2994 * @count: length of the list
2995 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
2996 * @cmd_details: pointer to command details structure or NULL
2997 * @rule_id: Rule ID returned from FW
2998 * @rule_used: Number of rules used in internal switch
2999 * @rule_free: Number of rules free in internal switch
3001 * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
3003 enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3004 u16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,
3005 struct i40e_asq_cmd_details *cmd_details,
3006 u16 *rule_id, u16 *rules_used, u16 *rules_free)
3008 if (!(rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS ||
3009 rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS)) {
3010 if (count == 0 || !mr_list)
3011 return I40E_ERR_PARAM;
3014 return i40e_mirrorrule_op(hw, i40e_aqc_opc_add_mirror_rule, sw_seid,
3015 rule_type, dest_vsi, count, mr_list,
3016 cmd_details, rule_id, rules_used, rules_free);
3020 * i40e_aq_delete_mirrorrule - delete a mirror rule
3021 * @hw: pointer to the hw struct
3022 * @sw_seid: Switch SEID (to which rule refers)
3023 * @rule_type: Rule Type (ingress/egress/VLAN)
3024 * @count: length of the list
3025 * @rule_id: Rule ID that is returned in the receive desc as part of
3027 * @mr_list: list of mirrored VLAN IDs to be removed
3028 * @cmd_details: pointer to command details structure or NULL
3029 * @rule_used: Number of rules used in internal switch
3030 * @rule_free: Number of rules free in internal switch
3032 * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
3034 enum i40e_status_code i40e_aq_delete_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3035 u16 rule_type, u16 rule_id, u16 count, __le16 *mr_list,
3036 struct i40e_asq_cmd_details *cmd_details,
3037 u16 *rules_used, u16 *rules_free)
3039 /* Rule ID has to be valid except rule_type: INGRESS VLAN mirroring */
3040 if (rule_type == I40E_AQC_MIRROR_RULE_TYPE_VLAN) {
3041 /* count and mr_list shall be valid for rule_type INGRESS VLAN
3042 * mirroring. For other rule_type, count and rule_type should
3045 if (count == 0 || !mr_list)
3046 return I40E_ERR_PARAM;
3049 return i40e_mirrorrule_op(hw, i40e_aqc_opc_delete_mirror_rule, sw_seid,
3050 rule_type, rule_id, count, mr_list,
3051 cmd_details, NULL, rules_used, rules_free);
3055 * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
3056 * @hw: pointer to the hw struct
3057 * @seid: VSI for the vlan filters
3058 * @v_list: list of vlan filters to be added
3059 * @count: length of the list
3060 * @cmd_details: pointer to command details structure or NULL
3062 enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
3063 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3064 u8 count, struct i40e_asq_cmd_details *cmd_details)
3066 struct i40e_aq_desc desc;
3067 struct i40e_aqc_macvlan *cmd =
3068 (struct i40e_aqc_macvlan *)&desc.params.raw;
3069 enum i40e_status_code status;
3072 if (count == 0 || !v_list || !hw)
3073 return I40E_ERR_PARAM;
3075 buf_size = count * sizeof(*v_list);
3077 /* prep the rest of the request */
3078 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
3079 cmd->num_addresses = CPU_TO_LE16(count);
3080 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3084 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3085 if (buf_size > I40E_AQ_LARGE_BUF)
3086 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3088 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3095 * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
3096 * @hw: pointer to the hw struct
3097 * @seid: VSI for the vlan filters
3098 * @v_list: list of macvlans to be removed
3099 * @count: length of the list
3100 * @cmd_details: pointer to command details structure or NULL
3102 enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
3103 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3104 u8 count, struct i40e_asq_cmd_details *cmd_details)
3106 struct i40e_aq_desc desc;
3107 struct i40e_aqc_macvlan *cmd =
3108 (struct i40e_aqc_macvlan *)&desc.params.raw;
3109 enum i40e_status_code status;
3112 if (count == 0 || !v_list || !hw)
3113 return I40E_ERR_PARAM;
3115 buf_size = count * sizeof(*v_list);
3117 /* prep the rest of the request */
3118 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
3119 cmd->num_addresses = CPU_TO_LE16(count);
3120 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3124 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3125 if (buf_size > I40E_AQ_LARGE_BUF)
3126 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3128 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3135 * i40e_aq_send_msg_to_vf
3136 * @hw: pointer to the hardware structure
3137 * @vfid: vf id to send msg
3138 * @v_opcode: opcodes for VF-PF communication
3139 * @v_retval: return error code
3140 * @msg: pointer to the msg buffer
3141 * @msglen: msg length
3142 * @cmd_details: pointer to command details
3146 enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
3147 u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
3148 struct i40e_asq_cmd_details *cmd_details)
3150 struct i40e_aq_desc desc;
3151 struct i40e_aqc_pf_vf_message *cmd =
3152 (struct i40e_aqc_pf_vf_message *)&desc.params.raw;
3153 enum i40e_status_code status;
3155 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
3156 cmd->id = CPU_TO_LE32(vfid);
3157 desc.cookie_high = CPU_TO_LE32(v_opcode);
3158 desc.cookie_low = CPU_TO_LE32(v_retval);
3159 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
3161 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3163 if (msglen > I40E_AQ_LARGE_BUF)
3164 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3165 desc.datalen = CPU_TO_LE16(msglen);
3167 status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
3173 * i40e_aq_debug_read_register
3174 * @hw: pointer to the hw struct
3175 * @reg_addr: register address
3176 * @reg_val: register value
3177 * @cmd_details: pointer to command details structure or NULL
3179 * Read the register using the admin queue commands
3181 enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
3182 u32 reg_addr, u64 *reg_val,
3183 struct i40e_asq_cmd_details *cmd_details)
3185 struct i40e_aq_desc desc;
3186 struct i40e_aqc_debug_reg_read_write *cmd_resp =
3187 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3188 enum i40e_status_code status;
3190 if (reg_val == NULL)
3191 return I40E_ERR_PARAM;
3193 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_read_reg);
3195 cmd_resp->address = CPU_TO_LE32(reg_addr);
3197 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3199 if (status == I40E_SUCCESS) {
3200 *reg_val = ((u64)LE32_TO_CPU(cmd_resp->value_high) << 32) |
3201 (u64)LE32_TO_CPU(cmd_resp->value_low);
3208 * i40e_aq_debug_write_register
3209 * @hw: pointer to the hw struct
3210 * @reg_addr: register address
3211 * @reg_val: register value
3212 * @cmd_details: pointer to command details structure or NULL
3214 * Write to a register using the admin queue commands
3216 enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
3217 u32 reg_addr, u64 reg_val,
3218 struct i40e_asq_cmd_details *cmd_details)
3220 struct i40e_aq_desc desc;
3221 struct i40e_aqc_debug_reg_read_write *cmd =
3222 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3223 enum i40e_status_code status;
3225 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
3227 cmd->address = CPU_TO_LE32(reg_addr);
3228 cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
3229 cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
3231 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3237 * i40e_aq_request_resource
3238 * @hw: pointer to the hw struct
3239 * @resource: resource id
3240 * @access: access type
3241 * @sdp_number: resource number
3242 * @timeout: the maximum time in ms that the driver may hold the resource
3243 * @cmd_details: pointer to command details structure or NULL
3245 * requests common resource using the admin queue commands
3247 enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
3248 enum i40e_aq_resources_ids resource,
3249 enum i40e_aq_resource_access_type access,
3250 u8 sdp_number, u64 *timeout,
3251 struct i40e_asq_cmd_details *cmd_details)
3253 struct i40e_aq_desc desc;
3254 struct i40e_aqc_request_resource *cmd_resp =
3255 (struct i40e_aqc_request_resource *)&desc.params.raw;
3256 enum i40e_status_code status;
3258 DEBUGFUNC("i40e_aq_request_resource");
3260 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
3262 cmd_resp->resource_id = CPU_TO_LE16(resource);
3263 cmd_resp->access_type = CPU_TO_LE16(access);
3264 cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
3266 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3267 /* The completion specifies the maximum time in ms that the driver
3268 * may hold the resource in the Timeout field.
3269 * If the resource is held by someone else, the command completes with
3270 * busy return value and the timeout field indicates the maximum time
3271 * the current owner of the resource has to free it.
3273 if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
3274 *timeout = LE32_TO_CPU(cmd_resp->timeout);
3280 * i40e_aq_release_resource
3281 * @hw: pointer to the hw struct
3282 * @resource: resource id
3283 * @sdp_number: resource number
3284 * @cmd_details: pointer to command details structure or NULL
3286 * release common resource using the admin queue commands
3288 enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
3289 enum i40e_aq_resources_ids resource,
3291 struct i40e_asq_cmd_details *cmd_details)
3293 struct i40e_aq_desc desc;
3294 struct i40e_aqc_request_resource *cmd =
3295 (struct i40e_aqc_request_resource *)&desc.params.raw;
3296 enum i40e_status_code status;
3298 DEBUGFUNC("i40e_aq_release_resource");
3300 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
3302 cmd->resource_id = CPU_TO_LE16(resource);
3303 cmd->resource_number = CPU_TO_LE32(sdp_number);
3305 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3312 * @hw: pointer to the hw struct
3313 * @module_pointer: module pointer location in words from the NVM beginning
3314 * @offset: byte offset from the module beginning
3315 * @length: length of the section to be read (in bytes from the offset)
3316 * @data: command buffer (size [bytes] = length)
3317 * @last_command: tells if this is the last command in a series
3318 * @cmd_details: pointer to command details structure or NULL
3320 * Read the NVM using the admin queue commands
3322 enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
3323 u32 offset, u16 length, void *data,
3325 struct i40e_asq_cmd_details *cmd_details)
3327 struct i40e_aq_desc desc;
3328 struct i40e_aqc_nvm_update *cmd =
3329 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3330 enum i40e_status_code status;
3332 DEBUGFUNC("i40e_aq_read_nvm");
3334 /* In offset the highest byte must be zeroed. */
3335 if (offset & 0xFF000000) {
3336 status = I40E_ERR_PARAM;
3337 goto i40e_aq_read_nvm_exit;
3340 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
3342 /* If this is the last command in a series, set the proper flag. */
3344 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3345 cmd->module_pointer = module_pointer;
3346 cmd->offset = CPU_TO_LE32(offset);
3347 cmd->length = CPU_TO_LE16(length);
3349 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3350 if (length > I40E_AQ_LARGE_BUF)
3351 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3353 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3355 i40e_aq_read_nvm_exit:
3360 * i40e_aq_read_nvm_config - read an nvm config block
3361 * @hw: pointer to the hw struct
3362 * @cmd_flags: NVM access admin command bits
3363 * @field_id: field or feature id
3364 * @data: buffer for result
3365 * @buf_size: buffer size
3366 * @element_count: pointer to count of elements read by FW
3367 * @cmd_details: pointer to command details structure or NULL
3369 enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
3370 u8 cmd_flags, u32 field_id, void *data,
3371 u16 buf_size, u16 *element_count,
3372 struct i40e_asq_cmd_details *cmd_details)
3374 struct i40e_aq_desc desc;
3375 struct i40e_aqc_nvm_config_read *cmd =
3376 (struct i40e_aqc_nvm_config_read *)&desc.params.raw;
3377 enum i40e_status_code status;
3379 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_read);
3380 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF));
3381 if (buf_size > I40E_AQ_LARGE_BUF)
3382 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3384 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3385 cmd->element_id = CPU_TO_LE16((u16)(0xffff & field_id));
3386 if (cmd_flags & I40E_AQ_ANVM_FEATURE_OR_IMMEDIATE_MASK)
3387 cmd->element_id_msw = CPU_TO_LE16((u16)(field_id >> 16));
3389 cmd->element_id_msw = 0;
3391 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3393 if (!status && element_count)
3394 *element_count = LE16_TO_CPU(cmd->element_count);
3400 * i40e_aq_write_nvm_config - write an nvm config block
3401 * @hw: pointer to the hw struct
3402 * @cmd_flags: NVM access admin command bits
3403 * @data: buffer for result
3404 * @buf_size: buffer size
3405 * @element_count: count of elements to be written
3406 * @cmd_details: pointer to command details structure or NULL
3408 enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
3409 u8 cmd_flags, void *data, u16 buf_size,
3411 struct i40e_asq_cmd_details *cmd_details)
3413 struct i40e_aq_desc desc;
3414 struct i40e_aqc_nvm_config_write *cmd =
3415 (struct i40e_aqc_nvm_config_write *)&desc.params.raw;
3416 enum i40e_status_code status;
3418 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_write);
3419 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3420 if (buf_size > I40E_AQ_LARGE_BUF)
3421 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3423 cmd->element_count = CPU_TO_LE16(element_count);
3424 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3425 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3431 * i40e_aq_oem_post_update - triggers an OEM specific flow after update
3432 * @hw: pointer to the hw struct
3433 * @cmd_details: pointer to command details structure or NULL
3435 enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
3436 void *buff, u16 buff_size,
3437 struct i40e_asq_cmd_details *cmd_details)
3439 struct i40e_aq_desc desc;
3440 enum i40e_status_code status;
3443 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_oem_post_update);
3444 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3445 if (status && LE16_TO_CPU(desc.retval) == I40E_AQ_RC_ESRCH)
3446 status = I40E_ERR_NOT_IMPLEMENTED;
3453 * @hw: pointer to the hw struct
3454 * @module_pointer: module pointer location in words from the NVM beginning
3455 * @offset: offset in the module (expressed in 4 KB from module's beginning)
3456 * @length: length of the section to be erased (expressed in 4 KB)
3457 * @last_command: tells if this is the last command in a series
3458 * @cmd_details: pointer to command details structure or NULL
3460 * Erase the NVM sector using the admin queue commands
3462 enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
3463 u32 offset, u16 length, bool last_command,
3464 struct i40e_asq_cmd_details *cmd_details)
3466 struct i40e_aq_desc desc;
3467 struct i40e_aqc_nvm_update *cmd =
3468 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3469 enum i40e_status_code status;
3471 DEBUGFUNC("i40e_aq_erase_nvm");
3473 /* In offset the highest byte must be zeroed. */
3474 if (offset & 0xFF000000) {
3475 status = I40E_ERR_PARAM;
3476 goto i40e_aq_erase_nvm_exit;
3479 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
3481 /* If this is the last command in a series, set the proper flag. */
3483 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3484 cmd->module_pointer = module_pointer;
3485 cmd->offset = CPU_TO_LE32(offset);
3486 cmd->length = CPU_TO_LE16(length);
3488 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3490 i40e_aq_erase_nvm_exit:
3495 * i40e_parse_discover_capabilities
3496 * @hw: pointer to the hw struct
3497 * @buff: pointer to a buffer containing device/function capability records
3498 * @cap_count: number of capability records in the list
3499 * @list_type_opc: type of capabilities list to parse
3501 * Parse the device/function capabilities list.
3503 static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
3505 enum i40e_admin_queue_opc list_type_opc)
3507 struct i40e_aqc_list_capabilities_element_resp *cap;
3508 u32 valid_functions, num_functions;
3509 u32 number, logical_id, phys_id;
3510 struct i40e_hw_capabilities *p;
3515 cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
3517 if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
3518 p = (struct i40e_hw_capabilities *)&hw->dev_caps;
3519 else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
3520 p = (struct i40e_hw_capabilities *)&hw->func_caps;
3524 for (i = 0; i < cap_count; i++, cap++) {
3525 id = LE16_TO_CPU(cap->id);
3526 number = LE32_TO_CPU(cap->number);
3527 logical_id = LE32_TO_CPU(cap->logical_id);
3528 phys_id = LE32_TO_CPU(cap->phys_id);
3529 major_rev = cap->major_rev;
3532 case I40E_AQ_CAP_ID_SWITCH_MODE:
3533 p->switch_mode = number;
3534 i40e_debug(hw, I40E_DEBUG_INIT,
3535 "HW Capability: Switch mode = %d\n",
3538 case I40E_AQ_CAP_ID_MNG_MODE:
3539 p->management_mode = number;
3540 i40e_debug(hw, I40E_DEBUG_INIT,
3541 "HW Capability: Management Mode = %d\n",
3542 p->management_mode);
3544 case I40E_AQ_CAP_ID_NPAR_ACTIVE:
3545 p->npar_enable = number;
3546 i40e_debug(hw, I40E_DEBUG_INIT,
3547 "HW Capability: NPAR enable = %d\n",
3550 case I40E_AQ_CAP_ID_OS2BMC_CAP:
3552 i40e_debug(hw, I40E_DEBUG_INIT,
3553 "HW Capability: OS2BMC = %d\n", p->os2bmc);
3555 case I40E_AQ_CAP_ID_FUNCTIONS_VALID:
3556 p->valid_functions = number;
3557 i40e_debug(hw, I40E_DEBUG_INIT,
3558 "HW Capability: Valid Functions = %d\n",
3559 p->valid_functions);
3561 case I40E_AQ_CAP_ID_SRIOV:
3563 p->sr_iov_1_1 = TRUE;
3564 i40e_debug(hw, I40E_DEBUG_INIT,
3565 "HW Capability: SR-IOV = %d\n",
3568 case I40E_AQ_CAP_ID_VF:
3569 p->num_vfs = number;
3570 p->vf_base_id = logical_id;
3571 i40e_debug(hw, I40E_DEBUG_INIT,
3572 "HW Capability: VF count = %d\n",
3574 i40e_debug(hw, I40E_DEBUG_INIT,
3575 "HW Capability: VF base_id = %d\n",
3578 case I40E_AQ_CAP_ID_VMDQ:
3581 i40e_debug(hw, I40E_DEBUG_INIT,
3582 "HW Capability: VMDQ = %d\n", p->vmdq);
3584 case I40E_AQ_CAP_ID_8021QBG:
3586 p->evb_802_1_qbg = TRUE;
3587 i40e_debug(hw, I40E_DEBUG_INIT,
3588 "HW Capability: 802.1Qbg = %d\n", number);
3590 case I40E_AQ_CAP_ID_8021QBR:
3592 p->evb_802_1_qbh = TRUE;
3593 i40e_debug(hw, I40E_DEBUG_INIT,
3594 "HW Capability: 802.1Qbh = %d\n", number);
3596 case I40E_AQ_CAP_ID_VSI:
3597 p->num_vsis = number;
3598 i40e_debug(hw, I40E_DEBUG_INIT,
3599 "HW Capability: VSI count = %d\n",
3602 case I40E_AQ_CAP_ID_DCB:
3605 p->enabled_tcmap = logical_id;
3608 i40e_debug(hw, I40E_DEBUG_INIT,
3609 "HW Capability: DCB = %d\n", p->dcb);
3610 i40e_debug(hw, I40E_DEBUG_INIT,
3611 "HW Capability: TC Mapping = %d\n",
3613 i40e_debug(hw, I40E_DEBUG_INIT,
3614 "HW Capability: TC Max = %d\n", p->maxtc);
3616 case I40E_AQ_CAP_ID_FCOE:
3619 i40e_debug(hw, I40E_DEBUG_INIT,
3620 "HW Capability: FCOE = %d\n", p->fcoe);
3622 case I40E_AQ_CAP_ID_ISCSI:
3625 i40e_debug(hw, I40E_DEBUG_INIT,
3626 "HW Capability: iSCSI = %d\n", p->iscsi);
3628 case I40E_AQ_CAP_ID_RSS:
3630 p->rss_table_size = number;
3631 p->rss_table_entry_width = logical_id;
3632 i40e_debug(hw, I40E_DEBUG_INIT,
3633 "HW Capability: RSS = %d\n", p->rss);
3634 i40e_debug(hw, I40E_DEBUG_INIT,
3635 "HW Capability: RSS table size = %d\n",
3637 i40e_debug(hw, I40E_DEBUG_INIT,
3638 "HW Capability: RSS table width = %d\n",
3639 p->rss_table_entry_width);
3641 case I40E_AQ_CAP_ID_RXQ:
3642 p->num_rx_qp = number;
3643 p->base_queue = phys_id;
3644 i40e_debug(hw, I40E_DEBUG_INIT,
3645 "HW Capability: Rx QP = %d\n", number);
3646 i40e_debug(hw, I40E_DEBUG_INIT,
3647 "HW Capability: base_queue = %d\n",
3650 case I40E_AQ_CAP_ID_TXQ:
3651 p->num_tx_qp = number;
3652 p->base_queue = phys_id;
3653 i40e_debug(hw, I40E_DEBUG_INIT,
3654 "HW Capability: Tx QP = %d\n", number);
3655 i40e_debug(hw, I40E_DEBUG_INIT,
3656 "HW Capability: base_queue = %d\n",
3659 case I40E_AQ_CAP_ID_MSIX:
3660 p->num_msix_vectors = number;
3661 i40e_debug(hw, I40E_DEBUG_INIT,
3662 "HW Capability: MSIX vector count = %d\n",
3663 p->num_msix_vectors);
3665 case I40E_AQ_CAP_ID_VF_MSIX:
3666 p->num_msix_vectors_vf = number;
3667 i40e_debug(hw, I40E_DEBUG_INIT,
3668 "HW Capability: MSIX VF vector count = %d\n",
3669 p->num_msix_vectors_vf);
3671 case I40E_AQ_CAP_ID_FLEX10:
3672 if (major_rev == 1) {
3674 p->flex10_enable = TRUE;
3675 p->flex10_capable = TRUE;
3678 /* Capability revision >= 2 */
3680 p->flex10_enable = TRUE;
3682 p->flex10_capable = TRUE;
3684 p->flex10_mode = logical_id;
3685 p->flex10_status = phys_id;
3686 i40e_debug(hw, I40E_DEBUG_INIT,
3687 "HW Capability: Flex10 mode = %d\n",
3689 i40e_debug(hw, I40E_DEBUG_INIT,
3690 "HW Capability: Flex10 status = %d\n",
3693 case I40E_AQ_CAP_ID_CEM:
3696 i40e_debug(hw, I40E_DEBUG_INIT,
3697 "HW Capability: CEM = %d\n", p->mgmt_cem);
3699 case I40E_AQ_CAP_ID_IWARP:
3702 i40e_debug(hw, I40E_DEBUG_INIT,
3703 "HW Capability: iWARP = %d\n", p->iwarp);
3705 case I40E_AQ_CAP_ID_LED:
3706 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3707 p->led[phys_id] = TRUE;
3708 i40e_debug(hw, I40E_DEBUG_INIT,
3709 "HW Capability: LED - PIN %d\n", phys_id);
3711 case I40E_AQ_CAP_ID_SDP:
3712 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3713 p->sdp[phys_id] = TRUE;
3714 i40e_debug(hw, I40E_DEBUG_INIT,
3715 "HW Capability: SDP - PIN %d\n", phys_id);
3717 case I40E_AQ_CAP_ID_MDIO:
3719 p->mdio_port_num = phys_id;
3720 p->mdio_port_mode = logical_id;
3722 i40e_debug(hw, I40E_DEBUG_INIT,
3723 "HW Capability: MDIO port number = %d\n",
3725 i40e_debug(hw, I40E_DEBUG_INIT,
3726 "HW Capability: MDIO port mode = %d\n",
3729 case I40E_AQ_CAP_ID_1588:
3731 p->ieee_1588 = TRUE;
3732 i40e_debug(hw, I40E_DEBUG_INIT,
3733 "HW Capability: IEEE 1588 = %d\n",
3736 case I40E_AQ_CAP_ID_FLOW_DIRECTOR:
3738 p->fd_filters_guaranteed = number;
3739 p->fd_filters_best_effort = logical_id;
3740 i40e_debug(hw, I40E_DEBUG_INIT,
3741 "HW Capability: Flow Director = 1\n");
3742 i40e_debug(hw, I40E_DEBUG_INIT,
3743 "HW Capability: Guaranteed FD filters = %d\n",
3744 p->fd_filters_guaranteed);
3746 case I40E_AQ_CAP_ID_WSR_PROT:
3747 p->wr_csr_prot = (u64)number;
3748 p->wr_csr_prot |= (u64)logical_id << 32;
3749 i40e_debug(hw, I40E_DEBUG_INIT,
3750 "HW Capability: wr_csr_prot = 0x%llX\n\n",
3751 (p->wr_csr_prot & 0xffff));
3753 case I40E_AQ_CAP_ID_NVM_MGMT:
3754 if (number & I40E_NVM_MGMT_SEC_REV_DISABLED)
3755 p->sec_rev_disabled = TRUE;
3756 if (number & I40E_NVM_MGMT_UPDATE_DISABLED)
3757 p->update_disabled = TRUE;
3759 case I40E_AQ_CAP_ID_WOL_AND_PROXY:
3760 hw->num_wol_proxy_filters = (u16)number;
3761 hw->wol_proxy_vsi_seid = (u16)logical_id;
3762 p->apm_wol_support = phys_id & I40E_WOL_SUPPORT_MASK;
3763 if (phys_id & I40E_ACPI_PROGRAMMING_METHOD_MASK)
3764 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_AQC_FPK;
3766 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_HW_FVL;
3767 p->proxy_support = (phys_id & I40E_PROXY_SUPPORT_MASK) ? 1 : 0;
3768 p->proxy_support = p->proxy_support;
3769 i40e_debug(hw, I40E_DEBUG_INIT,
3770 "HW Capability: WOL proxy filters = %d\n",
3771 hw->num_wol_proxy_filters);
3779 i40e_debug(hw, I40E_DEBUG_ALL, "device is FCoE capable\n");
3781 /* Always disable FCoE if compiled without the I40E_FCOE_ENA flag */
3784 /* count the enabled ports (aka the "not disabled" ports) */
3786 for (i = 0; i < 4; i++) {
3787 u32 port_cfg_reg = I40E_PRTGEN_CNF + (4 * i);
3790 /* use AQ read to get the physical register offset instead
3791 * of the port relative offset
3793 i40e_aq_debug_read_register(hw, port_cfg_reg, &port_cfg, NULL);
3794 if (!(port_cfg & I40E_PRTGEN_CNF_PORT_DIS_MASK))
3798 valid_functions = p->valid_functions;
3800 while (valid_functions) {
3801 if (valid_functions & 1)
3803 valid_functions >>= 1;
3806 /* partition id is 1-based, and functions are evenly spread
3807 * across the ports as partitions
3809 hw->partition_id = (hw->pf_id / hw->num_ports) + 1;
3810 hw->num_partitions = num_functions / hw->num_ports;
3812 /* additional HW specific goodies that might
3813 * someday be HW version specific
3815 p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
3819 * i40e_aq_discover_capabilities
3820 * @hw: pointer to the hw struct
3821 * @buff: a virtual buffer to hold the capabilities
3822 * @buff_size: Size of the virtual buffer
3823 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
3824 * @list_type_opc: capabilities type to discover - pass in the command opcode
3825 * @cmd_details: pointer to command details structure or NULL
3827 * Get the device capabilities descriptions from the firmware
3829 enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
3830 void *buff, u16 buff_size, u16 *data_size,
3831 enum i40e_admin_queue_opc list_type_opc,
3832 struct i40e_asq_cmd_details *cmd_details)
3834 struct i40e_aqc_list_capabilites *cmd;
3835 struct i40e_aq_desc desc;
3836 enum i40e_status_code status = I40E_SUCCESS;
3838 cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
3840 if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
3841 list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
3842 status = I40E_ERR_PARAM;
3846 i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
3848 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3849 if (buff_size > I40E_AQ_LARGE_BUF)
3850 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3852 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3853 *data_size = LE16_TO_CPU(desc.datalen);
3858 i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
3866 * i40e_aq_update_nvm
3867 * @hw: pointer to the hw struct
3868 * @module_pointer: module pointer location in words from the NVM beginning
3869 * @offset: byte offset from the module beginning
3870 * @length: length of the section to be written (in bytes from the offset)
3871 * @data: command buffer (size [bytes] = length)
3872 * @last_command: tells if this is the last command in a series
3873 * @cmd_details: pointer to command details structure or NULL
3875 * Update the NVM using the admin queue commands
3877 enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
3878 u32 offset, u16 length, void *data,
3880 struct i40e_asq_cmd_details *cmd_details)
3882 struct i40e_aq_desc desc;
3883 struct i40e_aqc_nvm_update *cmd =
3884 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3885 enum i40e_status_code status;
3887 DEBUGFUNC("i40e_aq_update_nvm");
3889 /* In offset the highest byte must be zeroed. */
3890 if (offset & 0xFF000000) {
3891 status = I40E_ERR_PARAM;
3892 goto i40e_aq_update_nvm_exit;
3895 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
3897 /* If this is the last command in a series, set the proper flag. */
3899 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3900 cmd->module_pointer = module_pointer;
3901 cmd->offset = CPU_TO_LE32(offset);
3902 cmd->length = CPU_TO_LE16(length);
3904 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3905 if (length > I40E_AQ_LARGE_BUF)
3906 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3908 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3910 i40e_aq_update_nvm_exit:
3915 * i40e_aq_get_lldp_mib
3916 * @hw: pointer to the hw struct
3917 * @bridge_type: type of bridge requested
3918 * @mib_type: Local, Remote or both Local and Remote MIBs
3919 * @buff: pointer to a user supplied buffer to store the MIB block
3920 * @buff_size: size of the buffer (in bytes)
3921 * @local_len : length of the returned Local LLDP MIB
3922 * @remote_len: length of the returned Remote LLDP MIB
3923 * @cmd_details: pointer to command details structure or NULL
3925 * Requests the complete LLDP MIB (entire packet).
3927 enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
3928 u8 mib_type, void *buff, u16 buff_size,
3929 u16 *local_len, u16 *remote_len,
3930 struct i40e_asq_cmd_details *cmd_details)
3932 struct i40e_aq_desc desc;
3933 struct i40e_aqc_lldp_get_mib *cmd =
3934 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
3935 struct i40e_aqc_lldp_get_mib *resp =
3936 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
3937 enum i40e_status_code status;
3939 if (buff_size == 0 || !buff)
3940 return I40E_ERR_PARAM;
3942 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
3943 /* Indirect Command */
3944 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3946 cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
3947 cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3948 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3950 desc.datalen = CPU_TO_LE16(buff_size);
3952 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3953 if (buff_size > I40E_AQ_LARGE_BUF)
3954 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3956 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3958 if (local_len != NULL)
3959 *local_len = LE16_TO_CPU(resp->local_len);
3960 if (remote_len != NULL)
3961 *remote_len = LE16_TO_CPU(resp->remote_len);
3968 * i40e_aq_set_lldp_mib - Set the LLDP MIB
3969 * @hw: pointer to the hw struct
3970 * @mib_type: Local, Remote or both Local and Remote MIBs
3971 * @buff: pointer to a user supplied buffer to store the MIB block
3972 * @buff_size: size of the buffer (in bytes)
3973 * @cmd_details: pointer to command details structure or NULL
3977 enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
3978 u8 mib_type, void *buff, u16 buff_size,
3979 struct i40e_asq_cmd_details *cmd_details)
3981 struct i40e_aq_desc desc;
3982 struct i40e_aqc_lldp_set_local_mib *cmd =
3983 (struct i40e_aqc_lldp_set_local_mib *)&desc.params.raw;
3984 enum i40e_status_code status;
3986 if (buff_size == 0 || !buff)
3987 return I40E_ERR_PARAM;
3989 i40e_fill_default_direct_cmd_desc(&desc,
3990 i40e_aqc_opc_lldp_set_local_mib);
3991 /* Indirect Command */
3992 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3993 if (buff_size > I40E_AQ_LARGE_BUF)
3994 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3995 desc.datalen = CPU_TO_LE16(buff_size);
3997 cmd->type = mib_type;
3998 cmd->length = CPU_TO_LE16(buff_size);
3999 cmd->address_high = CPU_TO_LE32(I40E_HI_WORD((u64)buff));
4000 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buff));
4002 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4007 * i40e_aq_cfg_lldp_mib_change_event
4008 * @hw: pointer to the hw struct
4009 * @enable_update: Enable or Disable event posting
4010 * @cmd_details: pointer to command details structure or NULL
4012 * Enable or Disable posting of an event on ARQ when LLDP MIB
4013 * associated with the interface changes
4015 enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
4017 struct i40e_asq_cmd_details *cmd_details)
4019 struct i40e_aq_desc desc;
4020 struct i40e_aqc_lldp_update_mib *cmd =
4021 (struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
4022 enum i40e_status_code status;
4024 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
4027 cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
4029 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4035 * i40e_aq_add_lldp_tlv
4036 * @hw: pointer to the hw struct
4037 * @bridge_type: type of bridge
4038 * @buff: buffer with TLV to add
4039 * @buff_size: length of the buffer
4040 * @tlv_len: length of the TLV to be added
4041 * @mib_len: length of the LLDP MIB returned in response
4042 * @cmd_details: pointer to command details structure or NULL
4044 * Add the specified TLV to LLDP Local MIB for the given bridge type,
4045 * it is responsibility of the caller to make sure that the TLV is not
4046 * already present in the LLDPDU.
4047 * In return firmware will write the complete LLDP MIB with the newly
4048 * added TLV in the response buffer.
4050 enum i40e_status_code i40e_aq_add_lldp_tlv(struct i40e_hw *hw, u8 bridge_type,
4051 void *buff, u16 buff_size, u16 tlv_len,
4053 struct i40e_asq_cmd_details *cmd_details)
4055 struct i40e_aq_desc desc;
4056 struct i40e_aqc_lldp_add_tlv *cmd =
4057 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4058 enum i40e_status_code status;
4060 if (buff_size == 0 || !buff || tlv_len == 0)
4061 return I40E_ERR_PARAM;
4063 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_add_tlv);
4065 /* Indirect Command */
4066 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4067 if (buff_size > I40E_AQ_LARGE_BUF)
4068 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4069 desc.datalen = CPU_TO_LE16(buff_size);
4071 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4072 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4073 cmd->len = CPU_TO_LE16(tlv_len);
4075 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4077 if (mib_len != NULL)
4078 *mib_len = LE16_TO_CPU(desc.datalen);
4085 * i40e_aq_update_lldp_tlv
4086 * @hw: pointer to the hw struct
4087 * @bridge_type: type of bridge
4088 * @buff: buffer with TLV to update
4089 * @buff_size: size of the buffer holding original and updated TLVs
4090 * @old_len: Length of the Original TLV
4091 * @new_len: Length of the Updated TLV
4092 * @offset: offset of the updated TLV in the buff
4093 * @mib_len: length of the returned LLDP MIB
4094 * @cmd_details: pointer to command details structure or NULL
4096 * Update the specified TLV to the LLDP Local MIB for the given bridge type.
4097 * Firmware will place the complete LLDP MIB in response buffer with the
4100 enum i40e_status_code i40e_aq_update_lldp_tlv(struct i40e_hw *hw,
4101 u8 bridge_type, void *buff, u16 buff_size,
4102 u16 old_len, u16 new_len, u16 offset,
4104 struct i40e_asq_cmd_details *cmd_details)
4106 struct i40e_aq_desc desc;
4107 struct i40e_aqc_lldp_update_tlv *cmd =
4108 (struct i40e_aqc_lldp_update_tlv *)&desc.params.raw;
4109 enum i40e_status_code status;
4111 if (buff_size == 0 || !buff || offset == 0 ||
4112 old_len == 0 || new_len == 0)
4113 return I40E_ERR_PARAM;
4115 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_tlv);
4117 /* Indirect Command */
4118 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4119 if (buff_size > I40E_AQ_LARGE_BUF)
4120 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4121 desc.datalen = CPU_TO_LE16(buff_size);
4123 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4124 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4125 cmd->old_len = CPU_TO_LE16(old_len);
4126 cmd->new_offset = CPU_TO_LE16(offset);
4127 cmd->new_len = CPU_TO_LE16(new_len);
4129 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4131 if (mib_len != NULL)
4132 *mib_len = LE16_TO_CPU(desc.datalen);
4139 * i40e_aq_delete_lldp_tlv
4140 * @hw: pointer to the hw struct
4141 * @bridge_type: type of bridge
4142 * @buff: pointer to a user supplied buffer that has the TLV
4143 * @buff_size: length of the buffer
4144 * @tlv_len: length of the TLV to be deleted
4145 * @mib_len: length of the returned LLDP MIB
4146 * @cmd_details: pointer to command details structure or NULL
4148 * Delete the specified TLV from LLDP Local MIB for the given bridge type.
4149 * The firmware places the entire LLDP MIB in the response buffer.
4151 enum i40e_status_code i40e_aq_delete_lldp_tlv(struct i40e_hw *hw,
4152 u8 bridge_type, void *buff, u16 buff_size,
4153 u16 tlv_len, u16 *mib_len,
4154 struct i40e_asq_cmd_details *cmd_details)
4156 struct i40e_aq_desc desc;
4157 struct i40e_aqc_lldp_add_tlv *cmd =
4158 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4159 enum i40e_status_code status;
4161 if (buff_size == 0 || !buff)
4162 return I40E_ERR_PARAM;
4164 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_delete_tlv);
4166 /* Indirect Command */
4167 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4168 if (buff_size > I40E_AQ_LARGE_BUF)
4169 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4170 desc.datalen = CPU_TO_LE16(buff_size);
4171 cmd->len = CPU_TO_LE16(tlv_len);
4172 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4173 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4175 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4177 if (mib_len != NULL)
4178 *mib_len = LE16_TO_CPU(desc.datalen);
4186 * @hw: pointer to the hw struct
4187 * @shutdown_agent: True if LLDP Agent needs to be Shutdown
4188 * @cmd_details: pointer to command details structure or NULL
4190 * Stop or Shutdown the embedded LLDP Agent
4192 enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
4193 struct i40e_asq_cmd_details *cmd_details)
4195 struct i40e_aq_desc desc;
4196 struct i40e_aqc_lldp_stop *cmd =
4197 (struct i40e_aqc_lldp_stop *)&desc.params.raw;
4198 enum i40e_status_code status;
4200 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
4203 cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
4205 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4211 * i40e_aq_start_lldp
4212 * @hw: pointer to the hw struct
4213 * @cmd_details: pointer to command details structure or NULL
4215 * Start the embedded LLDP Agent on all ports.
4217 enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
4218 struct i40e_asq_cmd_details *cmd_details)
4220 struct i40e_aq_desc desc;
4221 struct i40e_aqc_lldp_start *cmd =
4222 (struct i40e_aqc_lldp_start *)&desc.params.raw;
4223 enum i40e_status_code status;
4225 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
4227 cmd->command = I40E_AQ_LLDP_AGENT_START;
4229 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4235 * i40e_aq_get_cee_dcb_config
4236 * @hw: pointer to the hw struct
4237 * @buff: response buffer that stores CEE operational configuration
4238 * @buff_size: size of the buffer passed
4239 * @cmd_details: pointer to command details structure or NULL
4241 * Get CEE DCBX mode operational configuration from firmware
4243 enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
4244 void *buff, u16 buff_size,
4245 struct i40e_asq_cmd_details *cmd_details)
4247 struct i40e_aq_desc desc;
4248 enum i40e_status_code status;
4250 if (buff_size == 0 || !buff)
4251 return I40E_ERR_PARAM;
4253 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_cee_dcb_cfg);
4255 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4256 status = i40e_asq_send_command(hw, &desc, (void *)buff, buff_size,
4263 * i40e_aq_start_stop_dcbx - Start/Stop DCBx service in FW
4264 * @hw: pointer to the hw struct
4265 * @start_agent: True if DCBx Agent needs to be Started
4266 * False if DCBx Agent needs to be Stopped
4267 * @cmd_details: pointer to command details structure or NULL
4269 * Start/Stop the embedded dcbx Agent
4271 enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
4273 struct i40e_asq_cmd_details *cmd_details)
4275 struct i40e_aq_desc desc;
4276 struct i40e_aqc_lldp_stop_start_specific_agent *cmd =
4277 (struct i40e_aqc_lldp_stop_start_specific_agent *)
4279 enum i40e_status_code status;
4281 i40e_fill_default_direct_cmd_desc(&desc,
4282 i40e_aqc_opc_lldp_stop_start_spec_agent);
4285 cmd->command = I40E_AQC_START_SPECIFIC_AGENT_MASK;
4287 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4293 * i40e_aq_add_udp_tunnel
4294 * @hw: pointer to the hw struct
4295 * @udp_port: the UDP port to add
4296 * @header_len: length of the tunneling header length in DWords
4297 * @protocol_index: protocol index type
4298 * @filter_index: pointer to filter index
4299 * @cmd_details: pointer to command details structure or NULL
4301 enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
4302 u16 udp_port, u8 protocol_index,
4304 struct i40e_asq_cmd_details *cmd_details)
4306 struct i40e_aq_desc desc;
4307 struct i40e_aqc_add_udp_tunnel *cmd =
4308 (struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
4309 struct i40e_aqc_del_udp_tunnel_completion *resp =
4310 (struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
4311 enum i40e_status_code status;
4313 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
4315 cmd->udp_port = CPU_TO_LE16(udp_port);
4316 cmd->protocol_type = protocol_index;
4318 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4320 if (!status && filter_index)
4321 *filter_index = resp->index;
4327 * i40e_aq_del_udp_tunnel
4328 * @hw: pointer to the hw struct
4329 * @index: filter index
4330 * @cmd_details: pointer to command details structure or NULL
4332 enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
4333 struct i40e_asq_cmd_details *cmd_details)
4335 struct i40e_aq_desc desc;
4336 struct i40e_aqc_remove_udp_tunnel *cmd =
4337 (struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
4338 enum i40e_status_code status;
4340 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
4344 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4350 * i40e_aq_get_switch_resource_alloc (0x0204)
4351 * @hw: pointer to the hw struct
4352 * @num_entries: pointer to u8 to store the number of resource entries returned
4353 * @buf: pointer to a user supplied buffer. This buffer must be large enough
4354 * to store the resource information for all resource types. Each
4355 * resource type is a i40e_aqc_switch_resource_alloc_data structure.
4356 * @count: size, in bytes, of the buffer provided
4357 * @cmd_details: pointer to command details structure or NULL
4359 * Query the resources allocated to a function.
4361 enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
4363 struct i40e_aqc_switch_resource_alloc_element_resp *buf,
4365 struct i40e_asq_cmd_details *cmd_details)
4367 struct i40e_aq_desc desc;
4368 struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
4369 (struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
4370 enum i40e_status_code status;
4371 u16 length = count * sizeof(*buf);
4373 i40e_fill_default_direct_cmd_desc(&desc,
4374 i40e_aqc_opc_get_switch_resource_alloc);
4376 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4377 if (length > I40E_AQ_LARGE_BUF)
4378 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4380 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4382 if (!status && num_entries)
4383 *num_entries = cmd_resp->num_entries;
4389 * i40e_aq_delete_element - Delete switch element
4390 * @hw: pointer to the hw struct
4391 * @seid: the SEID to delete from the switch
4392 * @cmd_details: pointer to command details structure or NULL
4394 * This deletes a switch element from the switch.
4396 enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
4397 struct i40e_asq_cmd_details *cmd_details)
4399 struct i40e_aq_desc desc;
4400 struct i40e_aqc_switch_seid *cmd =
4401 (struct i40e_aqc_switch_seid *)&desc.params.raw;
4402 enum i40e_status_code status;
4405 return I40E_ERR_PARAM;
4407 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
4409 cmd->seid = CPU_TO_LE16(seid);
4411 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4417 * i40e_aq_add_pvirt - Instantiate a Port Virtualizer on a port
4418 * @hw: pointer to the hw struct
4419 * @flags: component flags
4420 * @mac_seid: uplink seid (MAC SEID)
4421 * @vsi_seid: connected vsi seid
4422 * @ret_seid: seid of create pv component
4424 * This instantiates an i40e port virtualizer with specified flags.
4425 * Depending on specified flags the port virtualizer can act as a
4426 * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
4428 enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
4429 u16 mac_seid, u16 vsi_seid,
4432 struct i40e_aq_desc desc;
4433 struct i40e_aqc_add_update_pv *cmd =
4434 (struct i40e_aqc_add_update_pv *)&desc.params.raw;
4435 struct i40e_aqc_add_update_pv_completion *resp =
4436 (struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
4437 enum i40e_status_code status;
4440 return I40E_ERR_PARAM;
4442 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
4443 cmd->command_flags = CPU_TO_LE16(flags);
4444 cmd->uplink_seid = CPU_TO_LE16(mac_seid);
4445 cmd->connected_seid = CPU_TO_LE16(vsi_seid);
4447 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4448 if (!status && ret_seid)
4449 *ret_seid = LE16_TO_CPU(resp->pv_seid);
4455 * i40e_aq_add_tag - Add an S/E-tag
4456 * @hw: pointer to the hw struct
4457 * @direct_to_queue: should s-tag direct flow to a specific queue
4458 * @vsi_seid: VSI SEID to use this tag
4459 * @tag: value of the tag
4460 * @queue_num: queue number, only valid is direct_to_queue is TRUE
4461 * @tags_used: return value, number of tags in use by this PF
4462 * @tags_free: return value, number of unallocated tags
4463 * @cmd_details: pointer to command details structure or NULL
4465 * This associates an S- or E-tag to a VSI in the switch complex. It returns
4466 * the number of tags allocated by the PF, and the number of unallocated
4469 enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
4470 u16 vsi_seid, u16 tag, u16 queue_num,
4471 u16 *tags_used, u16 *tags_free,
4472 struct i40e_asq_cmd_details *cmd_details)
4474 struct i40e_aq_desc desc;
4475 struct i40e_aqc_add_tag *cmd =
4476 (struct i40e_aqc_add_tag *)&desc.params.raw;
4477 struct i40e_aqc_add_remove_tag_completion *resp =
4478 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4479 enum i40e_status_code status;
4482 return I40E_ERR_PARAM;
4484 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
4486 cmd->seid = CPU_TO_LE16(vsi_seid);
4487 cmd->tag = CPU_TO_LE16(tag);
4488 if (direct_to_queue) {
4489 cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
4490 cmd->queue_number = CPU_TO_LE16(queue_num);
4493 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4496 if (tags_used != NULL)
4497 *tags_used = LE16_TO_CPU(resp->tags_used);
4498 if (tags_free != NULL)
4499 *tags_free = LE16_TO_CPU(resp->tags_free);
4506 * i40e_aq_remove_tag - Remove an S- or E-tag
4507 * @hw: pointer to the hw struct
4508 * @vsi_seid: VSI SEID this tag is associated with
4509 * @tag: value of the S-tag to delete
4510 * @tags_used: return value, number of tags in use by this PF
4511 * @tags_free: return value, number of unallocated tags
4512 * @cmd_details: pointer to command details structure or NULL
4514 * This deletes an S- or E-tag from a VSI in the switch complex. It returns
4515 * the number of tags allocated by the PF, and the number of unallocated
4518 enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
4519 u16 tag, u16 *tags_used, u16 *tags_free,
4520 struct i40e_asq_cmd_details *cmd_details)
4522 struct i40e_aq_desc desc;
4523 struct i40e_aqc_remove_tag *cmd =
4524 (struct i40e_aqc_remove_tag *)&desc.params.raw;
4525 struct i40e_aqc_add_remove_tag_completion *resp =
4526 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4527 enum i40e_status_code status;
4530 return I40E_ERR_PARAM;
4532 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
4534 cmd->seid = CPU_TO_LE16(vsi_seid);
4535 cmd->tag = CPU_TO_LE16(tag);
4537 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4540 if (tags_used != NULL)
4541 *tags_used = LE16_TO_CPU(resp->tags_used);
4542 if (tags_free != NULL)
4543 *tags_free = LE16_TO_CPU(resp->tags_free);
4550 * i40e_aq_add_mcast_etag - Add a multicast E-tag
4551 * @hw: pointer to the hw struct
4552 * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
4553 * @etag: value of E-tag to add
4554 * @num_tags_in_buf: number of unicast E-tags in indirect buffer
4555 * @buf: address of indirect buffer
4556 * @tags_used: return value, number of E-tags in use by this port
4557 * @tags_free: return value, number of unallocated M-tags
4558 * @cmd_details: pointer to command details structure or NULL
4560 * This associates a multicast E-tag to a port virtualizer. It will return
4561 * the number of tags allocated by the PF, and the number of unallocated
4564 * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
4565 * num_tags_in_buf long.
4567 enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4568 u16 etag, u8 num_tags_in_buf, void *buf,
4569 u16 *tags_used, u16 *tags_free,
4570 struct i40e_asq_cmd_details *cmd_details)
4572 struct i40e_aq_desc desc;
4573 struct i40e_aqc_add_remove_mcast_etag *cmd =
4574 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4575 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4576 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4577 enum i40e_status_code status;
4578 u16 length = sizeof(u16) * num_tags_in_buf;
4580 if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
4581 return I40E_ERR_PARAM;
4583 i40e_fill_default_direct_cmd_desc(&desc,
4584 i40e_aqc_opc_add_multicast_etag);
4586 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4587 cmd->etag = CPU_TO_LE16(etag);
4588 cmd->num_unicast_etags = num_tags_in_buf;
4590 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4591 if (length > I40E_AQ_LARGE_BUF)
4592 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4594 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4597 if (tags_used != NULL)
4598 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4599 if (tags_free != NULL)
4600 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4607 * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
4608 * @hw: pointer to the hw struct
4609 * @pv_seid: Port Virtualizer SEID this M-tag is associated with
4610 * @etag: value of the E-tag to remove
4611 * @tags_used: return value, number of tags in use by this port
4612 * @tags_free: return value, number of unallocated tags
4613 * @cmd_details: pointer to command details structure or NULL
4615 * This deletes an E-tag from the port virtualizer. It will return
4616 * the number of tags allocated by the port, and the number of unallocated
4619 enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4620 u16 etag, u16 *tags_used, u16 *tags_free,
4621 struct i40e_asq_cmd_details *cmd_details)
4623 struct i40e_aq_desc desc;
4624 struct i40e_aqc_add_remove_mcast_etag *cmd =
4625 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4626 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4627 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4628 enum i40e_status_code status;
4632 return I40E_ERR_PARAM;
4634 i40e_fill_default_direct_cmd_desc(&desc,
4635 i40e_aqc_opc_remove_multicast_etag);
4637 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4638 cmd->etag = CPU_TO_LE16(etag);
4640 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4643 if (tags_used != NULL)
4644 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4645 if (tags_free != NULL)
4646 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4653 * i40e_aq_update_tag - Update an S/E-tag
4654 * @hw: pointer to the hw struct
4655 * @vsi_seid: VSI SEID using this S-tag
4656 * @old_tag: old tag value
4657 * @new_tag: new tag value
4658 * @tags_used: return value, number of tags in use by this PF
4659 * @tags_free: return value, number of unallocated tags
4660 * @cmd_details: pointer to command details structure or NULL
4662 * This updates the value of the tag currently attached to this VSI
4663 * in the switch complex. It will return the number of tags allocated
4664 * by the PF, and the number of unallocated tags available.
4666 enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
4667 u16 old_tag, u16 new_tag, u16 *tags_used,
4669 struct i40e_asq_cmd_details *cmd_details)
4671 struct i40e_aq_desc desc;
4672 struct i40e_aqc_update_tag *cmd =
4673 (struct i40e_aqc_update_tag *)&desc.params.raw;
4674 struct i40e_aqc_update_tag_completion *resp =
4675 (struct i40e_aqc_update_tag_completion *)&desc.params.raw;
4676 enum i40e_status_code status;
4679 return I40E_ERR_PARAM;
4681 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
4683 cmd->seid = CPU_TO_LE16(vsi_seid);
4684 cmd->old_tag = CPU_TO_LE16(old_tag);
4685 cmd->new_tag = CPU_TO_LE16(new_tag);
4687 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4690 if (tags_used != NULL)
4691 *tags_used = LE16_TO_CPU(resp->tags_used);
4692 if (tags_free != NULL)
4693 *tags_free = LE16_TO_CPU(resp->tags_free);
4700 * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
4701 * @hw: pointer to the hw struct
4702 * @tcmap: TC map for request/release any ignore PFC condition
4703 * @request: request or release ignore PFC condition
4704 * @tcmap_ret: return TCs for which PFC is currently ignored
4705 * @cmd_details: pointer to command details structure or NULL
4707 * This sends out request/release to ignore PFC condition for a TC.
4708 * It will return the TCs for which PFC is currently ignored.
4710 enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
4711 bool request, u8 *tcmap_ret,
4712 struct i40e_asq_cmd_details *cmd_details)
4714 struct i40e_aq_desc desc;
4715 struct i40e_aqc_pfc_ignore *cmd_resp =
4716 (struct i40e_aqc_pfc_ignore *)&desc.params.raw;
4717 enum i40e_status_code status;
4719 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
4722 cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
4724 cmd_resp->tc_bitmap = tcmap;
4726 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4729 if (tcmap_ret != NULL)
4730 *tcmap_ret = cmd_resp->tc_bitmap;
4737 * i40e_aq_dcb_updated - DCB Updated Command
4738 * @hw: pointer to the hw struct
4739 * @cmd_details: pointer to command details structure or NULL
4741 * When LLDP is handled in PF this command is used by the PF
4742 * to notify EMP that a DCB setting is modified.
4743 * When LLDP is handled in EMP this command is used by the PF
4744 * to notify EMP whenever one of the following parameters get
4746 * - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
4747 * - PCIRTT in PRTDCB_GENC.PCIRTT
4748 * - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
4749 * EMP will return when the shared RPB settings have been
4750 * recomputed and modified. The retval field in the descriptor
4751 * will be set to 0 when RPB is modified.
4753 enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
4754 struct i40e_asq_cmd_details *cmd_details)
4756 struct i40e_aq_desc desc;
4757 enum i40e_status_code status;
4759 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
4761 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4767 * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
4768 * @hw: pointer to the hw struct
4769 * @seid: defines the SEID of the switch for which the stats are requested
4770 * @vlan_id: the VLAN ID for which the statistics are requested
4771 * @stat_index: index of the statistics counters block assigned to this VLAN
4772 * @cmd_details: pointer to command details structure or NULL
4774 * XL710 supports 128 smonVlanStats counters.This command is used to
4775 * allocate a set of smonVlanStats counters to a specific VLAN in a specific
4778 enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
4779 u16 vlan_id, u16 *stat_index,
4780 struct i40e_asq_cmd_details *cmd_details)
4782 struct i40e_aq_desc desc;
4783 struct i40e_aqc_add_remove_statistics *cmd_resp =
4784 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4785 enum i40e_status_code status;
4787 if ((seid == 0) || (stat_index == NULL))
4788 return I40E_ERR_PARAM;
4790 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
4792 cmd_resp->seid = CPU_TO_LE16(seid);
4793 cmd_resp->vlan = CPU_TO_LE16(vlan_id);
4795 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4797 if (!status && stat_index)
4798 *stat_index = LE16_TO_CPU(cmd_resp->stat_index);
4804 * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
4805 * @hw: pointer to the hw struct
4806 * @seid: defines the SEID of the switch for which the stats are requested
4807 * @vlan_id: the VLAN ID for which the statistics are requested
4808 * @stat_index: index of the statistics counters block assigned to this VLAN
4809 * @cmd_details: pointer to command details structure or NULL
4811 * XL710 supports 128 smonVlanStats counters.This command is used to
4812 * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
4815 enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
4816 u16 vlan_id, u16 stat_index,
4817 struct i40e_asq_cmd_details *cmd_details)
4819 struct i40e_aq_desc desc;
4820 struct i40e_aqc_add_remove_statistics *cmd =
4821 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4822 enum i40e_status_code status;
4825 return I40E_ERR_PARAM;
4827 i40e_fill_default_direct_cmd_desc(&desc,
4828 i40e_aqc_opc_remove_statistics);
4830 cmd->seid = CPU_TO_LE16(seid);
4831 cmd->vlan = CPU_TO_LE16(vlan_id);
4832 cmd->stat_index = CPU_TO_LE16(stat_index);
4834 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4840 * i40e_aq_set_port_parameters - set physical port parameters.
4841 * @hw: pointer to the hw struct
4842 * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
4843 * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
4844 * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
4845 * @double_vlan: if set double VLAN is enabled
4846 * @cmd_details: pointer to command details structure or NULL
4848 enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
4849 u16 bad_frame_vsi, bool save_bad_pac,
4850 bool pad_short_pac, bool double_vlan,
4851 struct i40e_asq_cmd_details *cmd_details)
4853 struct i40e_aqc_set_port_parameters *cmd;
4854 enum i40e_status_code status;
4855 struct i40e_aq_desc desc;
4856 u16 command_flags = 0;
4858 cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
4860 i40e_fill_default_direct_cmd_desc(&desc,
4861 i40e_aqc_opc_set_port_parameters);
4863 cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
4865 command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
4867 command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
4869 command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
4870 cmd->command_flags = CPU_TO_LE16(command_flags);
4872 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4878 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
4879 * @hw: pointer to the hw struct
4880 * @seid: seid for the physical port/switching component/vsi
4881 * @buff: Indirect buffer to hold data parameters and response
4882 * @buff_size: Indirect buffer size
4883 * @opcode: Tx scheduler AQ command opcode
4884 * @cmd_details: pointer to command details structure or NULL
4886 * Generic command handler for Tx scheduler AQ commands
4888 static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
4889 void *buff, u16 buff_size,
4890 enum i40e_admin_queue_opc opcode,
4891 struct i40e_asq_cmd_details *cmd_details)
4893 struct i40e_aq_desc desc;
4894 struct i40e_aqc_tx_sched_ind *cmd =
4895 (struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
4896 enum i40e_status_code status;
4897 bool cmd_param_flag = FALSE;
4900 case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
4901 case i40e_aqc_opc_configure_vsi_tc_bw:
4902 case i40e_aqc_opc_enable_switching_comp_ets:
4903 case i40e_aqc_opc_modify_switching_comp_ets:
4904 case i40e_aqc_opc_disable_switching_comp_ets:
4905 case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
4906 case i40e_aqc_opc_configure_switching_comp_bw_config:
4907 cmd_param_flag = TRUE;
4909 case i40e_aqc_opc_query_vsi_bw_config:
4910 case i40e_aqc_opc_query_vsi_ets_sla_config:
4911 case i40e_aqc_opc_query_switching_comp_ets_config:
4912 case i40e_aqc_opc_query_port_ets_config:
4913 case i40e_aqc_opc_query_switching_comp_bw_config:
4914 cmd_param_flag = FALSE;
4917 return I40E_ERR_PARAM;
4920 i40e_fill_default_direct_cmd_desc(&desc, opcode);
4922 /* Indirect command */
4923 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4925 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
4926 if (buff_size > I40E_AQ_LARGE_BUF)
4927 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4929 desc.datalen = CPU_TO_LE16(buff_size);
4931 cmd->vsi_seid = CPU_TO_LE16(seid);
4933 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4939 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
4940 * @hw: pointer to the hw struct
4942 * @credit: BW limit credits (0 = disabled)
4943 * @max_credit: Max BW limit credits
4944 * @cmd_details: pointer to command details structure or NULL
4946 enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
4947 u16 seid, u16 credit, u8 max_credit,
4948 struct i40e_asq_cmd_details *cmd_details)
4950 struct i40e_aq_desc desc;
4951 struct i40e_aqc_configure_vsi_bw_limit *cmd =
4952 (struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
4953 enum i40e_status_code status;
4955 i40e_fill_default_direct_cmd_desc(&desc,
4956 i40e_aqc_opc_configure_vsi_bw_limit);
4958 cmd->vsi_seid = CPU_TO_LE16(seid);
4959 cmd->credit = CPU_TO_LE16(credit);
4960 cmd->max_credit = max_credit;
4962 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4968 * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
4969 * @hw: pointer to the hw struct
4970 * @seid: switching component seid
4971 * @credit: BW limit credits (0 = disabled)
4972 * @max_bw: Max BW limit credits
4973 * @cmd_details: pointer to command details structure or NULL
4975 enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
4976 u16 seid, u16 credit, u8 max_bw,
4977 struct i40e_asq_cmd_details *cmd_details)
4979 struct i40e_aq_desc desc;
4980 struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
4981 (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
4982 enum i40e_status_code status;
4984 i40e_fill_default_direct_cmd_desc(&desc,
4985 i40e_aqc_opc_configure_switching_comp_bw_limit);
4987 cmd->seid = CPU_TO_LE16(seid);
4988 cmd->credit = CPU_TO_LE16(credit);
4989 cmd->max_bw = max_bw;
4991 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4997 * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
4998 * @hw: pointer to the hw struct
5000 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5001 * @cmd_details: pointer to command details structure or NULL
5003 enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
5005 struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
5006 struct i40e_asq_cmd_details *cmd_details)
5008 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5009 i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
5014 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
5015 * @hw: pointer to the hw struct
5017 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
5018 * @cmd_details: pointer to command details structure or NULL
5020 enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
5022 struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
5023 struct i40e_asq_cmd_details *cmd_details)
5025 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5026 i40e_aqc_opc_configure_vsi_tc_bw,
5031 * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
5032 * @hw: pointer to the hw struct
5033 * @seid: seid of the switching component
5034 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5035 * @cmd_details: pointer to command details structure or NULL
5037 enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
5038 struct i40e_hw *hw, u16 seid,
5039 struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
5040 struct i40e_asq_cmd_details *cmd_details)
5042 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5043 i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
5048 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
5049 * @hw: pointer to the hw struct
5050 * @seid: seid of the VSI
5051 * @bw_data: Buffer to hold VSI BW configuration
5052 * @cmd_details: pointer to command details structure or NULL
5054 enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
5056 struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
5057 struct i40e_asq_cmd_details *cmd_details)
5059 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5060 i40e_aqc_opc_query_vsi_bw_config,
5065 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
5066 * @hw: pointer to the hw struct
5067 * @seid: seid of the VSI
5068 * @bw_data: Buffer to hold VSI BW configuration per TC
5069 * @cmd_details: pointer to command details structure or NULL
5071 enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
5073 struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
5074 struct i40e_asq_cmd_details *cmd_details)
5076 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5077 i40e_aqc_opc_query_vsi_ets_sla_config,
5082 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
5083 * @hw: pointer to the hw struct
5084 * @seid: seid of the switching component
5085 * @bw_data: Buffer to hold switching component's per TC BW config
5086 * @cmd_details: pointer to command details structure or NULL
5088 enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
5090 struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
5091 struct i40e_asq_cmd_details *cmd_details)
5093 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5094 i40e_aqc_opc_query_switching_comp_ets_config,
5099 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
5100 * @hw: pointer to the hw struct
5101 * @seid: seid of the VSI or switching component connected to Physical Port
5102 * @bw_data: Buffer to hold current ETS configuration for the Physical Port
5103 * @cmd_details: pointer to command details structure or NULL
5105 enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
5107 struct i40e_aqc_query_port_ets_config_resp *bw_data,
5108 struct i40e_asq_cmd_details *cmd_details)
5110 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5111 i40e_aqc_opc_query_port_ets_config,
5116 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
5117 * @hw: pointer to the hw struct
5118 * @seid: seid of the switching component
5119 * @bw_data: Buffer to hold switching component's BW configuration
5120 * @cmd_details: pointer to command details structure or NULL
5122 enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
5124 struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
5125 struct i40e_asq_cmd_details *cmd_details)
5127 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5128 i40e_aqc_opc_query_switching_comp_bw_config,
5133 * i40e_validate_filter_settings
5134 * @hw: pointer to the hardware structure
5135 * @settings: Filter control settings
5137 * Check and validate the filter control settings passed.
5138 * The function checks for the valid filter/context sizes being
5139 * passed for FCoE and PE.
5141 * Returns I40E_SUCCESS if the values passed are valid and within
5142 * range else returns an error.
5144 static enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
5145 struct i40e_filter_control_settings *settings)
5147 u32 fcoe_cntx_size, fcoe_filt_size;
5148 u32 pe_cntx_size, pe_filt_size;
5153 /* Validate FCoE settings passed */
5154 switch (settings->fcoe_filt_num) {
5155 case I40E_HASH_FILTER_SIZE_1K:
5156 case I40E_HASH_FILTER_SIZE_2K:
5157 case I40E_HASH_FILTER_SIZE_4K:
5158 case I40E_HASH_FILTER_SIZE_8K:
5159 case I40E_HASH_FILTER_SIZE_16K:
5160 case I40E_HASH_FILTER_SIZE_32K:
5161 fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5162 fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
5165 return I40E_ERR_PARAM;
5168 switch (settings->fcoe_cntx_num) {
5169 case I40E_DMA_CNTX_SIZE_512:
5170 case I40E_DMA_CNTX_SIZE_1K:
5171 case I40E_DMA_CNTX_SIZE_2K:
5172 case I40E_DMA_CNTX_SIZE_4K:
5173 fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5174 fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
5177 return I40E_ERR_PARAM;
5180 /* Validate PE settings passed */
5181 switch (settings->pe_filt_num) {
5182 case I40E_HASH_FILTER_SIZE_1K:
5183 case I40E_HASH_FILTER_SIZE_2K:
5184 case I40E_HASH_FILTER_SIZE_4K:
5185 case I40E_HASH_FILTER_SIZE_8K:
5186 case I40E_HASH_FILTER_SIZE_16K:
5187 case I40E_HASH_FILTER_SIZE_32K:
5188 case I40E_HASH_FILTER_SIZE_64K:
5189 case I40E_HASH_FILTER_SIZE_128K:
5190 case I40E_HASH_FILTER_SIZE_256K:
5191 case I40E_HASH_FILTER_SIZE_512K:
5192 case I40E_HASH_FILTER_SIZE_1M:
5193 pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5194 pe_filt_size <<= (u32)settings->pe_filt_num;
5197 return I40E_ERR_PARAM;
5200 switch (settings->pe_cntx_num) {
5201 case I40E_DMA_CNTX_SIZE_512:
5202 case I40E_DMA_CNTX_SIZE_1K:
5203 case I40E_DMA_CNTX_SIZE_2K:
5204 case I40E_DMA_CNTX_SIZE_4K:
5205 case I40E_DMA_CNTX_SIZE_8K:
5206 case I40E_DMA_CNTX_SIZE_16K:
5207 case I40E_DMA_CNTX_SIZE_32K:
5208 case I40E_DMA_CNTX_SIZE_64K:
5209 case I40E_DMA_CNTX_SIZE_128K:
5210 case I40E_DMA_CNTX_SIZE_256K:
5211 pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5212 pe_cntx_size <<= (u32)settings->pe_cntx_num;
5215 return I40E_ERR_PARAM;
5218 /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
5219 val = rd32(hw, I40E_GLHMC_FCOEFMAX);
5220 fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
5221 >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
5222 if (fcoe_filt_size + fcoe_cntx_size > fcoe_fmax)
5223 return I40E_ERR_INVALID_SIZE;
5225 return I40E_SUCCESS;
5229 * i40e_set_filter_control
5230 * @hw: pointer to the hardware structure
5231 * @settings: Filter control settings
5233 * Set the Queue Filters for PE/FCoE and enable filters required
5234 * for a single PF. It is expected that these settings are programmed
5235 * at the driver initialization time.
5237 enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
5238 struct i40e_filter_control_settings *settings)
5240 enum i40e_status_code ret = I40E_SUCCESS;
5241 u32 hash_lut_size = 0;
5245 return I40E_ERR_PARAM;
5247 /* Validate the input settings */
5248 ret = i40e_validate_filter_settings(hw, settings);
5252 /* Read the PF Queue Filter control register */
5253 val = i40e_read_rx_ctl(hw, I40E_PFQF_CTL_0);
5255 /* Program required PE hash buckets for the PF */
5256 val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
5257 val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
5258 I40E_PFQF_CTL_0_PEHSIZE_MASK;
5259 /* Program required PE contexts for the PF */
5260 val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
5261 val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
5262 I40E_PFQF_CTL_0_PEDSIZE_MASK;
5264 /* Program required FCoE hash buckets for the PF */
5265 val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5266 val |= ((u32)settings->fcoe_filt_num <<
5267 I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
5268 I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5269 /* Program required FCoE DDP contexts for the PF */
5270 val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5271 val |= ((u32)settings->fcoe_cntx_num <<
5272 I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
5273 I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5275 /* Program Hash LUT size for the PF */
5276 val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5277 if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
5279 val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
5280 I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5282 /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
5283 if (settings->enable_fdir)
5284 val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
5285 if (settings->enable_ethtype)
5286 val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
5287 if (settings->enable_macvlan)
5288 val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
5290 i40e_write_rx_ctl(hw, I40E_PFQF_CTL_0, val);
5292 return I40E_SUCCESS;
5296 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
5297 * @hw: pointer to the hw struct
5298 * @mac_addr: MAC address to use in the filter
5299 * @ethtype: Ethertype to use in the filter
5300 * @flags: Flags that needs to be applied to the filter
5301 * @vsi_seid: seid of the control VSI
5302 * @queue: VSI queue number to send the packet to
5303 * @is_add: Add control packet filter if True else remove
5304 * @stats: Structure to hold information on control filter counts
5305 * @cmd_details: pointer to command details structure or NULL
5307 * This command will Add or Remove control packet filter for a control VSI.
5308 * In return it will update the total number of perfect filter count in
5311 enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
5312 u8 *mac_addr, u16 ethtype, u16 flags,
5313 u16 vsi_seid, u16 queue, bool is_add,
5314 struct i40e_control_filter_stats *stats,
5315 struct i40e_asq_cmd_details *cmd_details)
5317 struct i40e_aq_desc desc;
5318 struct i40e_aqc_add_remove_control_packet_filter *cmd =
5319 (struct i40e_aqc_add_remove_control_packet_filter *)
5321 struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
5322 (struct i40e_aqc_add_remove_control_packet_filter_completion *)
5324 enum i40e_status_code status;
5327 return I40E_ERR_PARAM;
5330 i40e_fill_default_direct_cmd_desc(&desc,
5331 i40e_aqc_opc_add_control_packet_filter);
5332 cmd->queue = CPU_TO_LE16(queue);
5334 i40e_fill_default_direct_cmd_desc(&desc,
5335 i40e_aqc_opc_remove_control_packet_filter);
5339 i40e_memcpy(cmd->mac, mac_addr, I40E_ETH_LENGTH_OF_ADDRESS,
5340 I40E_NONDMA_TO_NONDMA);
5342 cmd->etype = CPU_TO_LE16(ethtype);
5343 cmd->flags = CPU_TO_LE16(flags);
5344 cmd->seid = CPU_TO_LE16(vsi_seid);
5346 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5348 if (!status && stats) {
5349 stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
5350 stats->etype_used = LE16_TO_CPU(resp->etype_used);
5351 stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
5352 stats->etype_free = LE16_TO_CPU(resp->etype_free);
5359 * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
5360 * @hw: pointer to the hw struct
5361 * @seid: VSI seid to add ethertype filter from
5363 #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
5364 void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
5367 u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
5368 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
5369 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
5370 u16 ethtype = I40E_FLOW_CONTROL_ETHTYPE;
5371 enum i40e_status_code status;
5373 status = i40e_aq_add_rem_control_packet_filter(hw, NULL, ethtype, flag,
5374 seid, 0, TRUE, NULL,
5377 DEBUGOUT("Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
5381 * i40e_fix_up_geneve_vni - adjust Geneve VNI for HW issue
5382 * @filters: list of cloud filters
5383 * @filter_count: length of list
5385 * There's an issue in the device where the Geneve VNI layout needs
5386 * to be shifted 1 byte over from the VxLAN VNI
5388 static void i40e_fix_up_geneve_vni(
5389 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5392 struct i40e_aqc_add_remove_cloud_filters_element_data *f = filters;
5395 for (i = 0; i < filter_count; i++) {
5399 tnl_type = (LE16_TO_CPU(f[i].flags) &
5400 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5401 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5402 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5403 ti = LE32_TO_CPU(f[i].tenant_id);
5404 f[i].tenant_id = CPU_TO_LE32(ti << 8);
5410 * i40e_aq_add_cloud_filters
5411 * @hw: pointer to the hardware structure
5412 * @seid: VSI seid to add cloud filters from
5413 * @filters: Buffer which contains the filters to be added
5414 * @filter_count: number of filters contained in the buffer
5416 * Set the cloud filters for a given VSI. The contents of the
5417 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5418 * in by the caller of the function.
5421 enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
5423 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5426 struct i40e_aq_desc desc;
5427 struct i40e_aqc_add_remove_cloud_filters *cmd =
5428 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5429 enum i40e_status_code status;
5432 i40e_fill_default_direct_cmd_desc(&desc,
5433 i40e_aqc_opc_add_cloud_filters);
5435 buff_len = filter_count * sizeof(*filters);
5436 desc.datalen = CPU_TO_LE16(buff_len);
5437 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5438 cmd->num_filters = filter_count;
5439 cmd->seid = CPU_TO_LE16(seid);
5441 i40e_fix_up_geneve_vni(filters, filter_count);
5443 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5449 * i40e_aq_remove_cloud_filters
5450 * @hw: pointer to the hardware structure
5451 * @seid: VSI seid to remove cloud filters from
5452 * @filters: Buffer which contains the filters to be removed
5453 * @filter_count: number of filters contained in the buffer
5455 * Remove the cloud filters for a given VSI. The contents of the
5456 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5457 * in by the caller of the function.
5460 enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
5462 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5465 struct i40e_aq_desc desc;
5466 struct i40e_aqc_add_remove_cloud_filters *cmd =
5467 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5468 enum i40e_status_code status;
5471 i40e_fill_default_direct_cmd_desc(&desc,
5472 i40e_aqc_opc_remove_cloud_filters);
5474 buff_len = filter_count * sizeof(*filters);
5475 desc.datalen = CPU_TO_LE16(buff_len);
5476 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5477 cmd->num_filters = filter_count;
5478 cmd->seid = CPU_TO_LE16(seid);
5480 i40e_fix_up_geneve_vni(filters, filter_count);
5482 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5488 * i40e_aq_alternate_write
5489 * @hw: pointer to the hardware structure
5490 * @reg_addr0: address of first dword to be read
5491 * @reg_val0: value to be written under 'reg_addr0'
5492 * @reg_addr1: address of second dword to be read
5493 * @reg_val1: value to be written under 'reg_addr1'
5495 * Write one or two dwords to alternate structure. Fields are indicated
5496 * by 'reg_addr0' and 'reg_addr1' register numbers.
5499 enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
5500 u32 reg_addr0, u32 reg_val0,
5501 u32 reg_addr1, u32 reg_val1)
5503 struct i40e_aq_desc desc;
5504 struct i40e_aqc_alternate_write *cmd_resp =
5505 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5506 enum i40e_status_code status;
5508 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
5509 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5510 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5511 cmd_resp->data0 = CPU_TO_LE32(reg_val0);
5512 cmd_resp->data1 = CPU_TO_LE32(reg_val1);
5514 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5520 * i40e_aq_alternate_write_indirect
5521 * @hw: pointer to the hardware structure
5522 * @addr: address of a first register to be modified
5523 * @dw_count: number of alternate structure fields to write
5524 * @buffer: pointer to the command buffer
5526 * Write 'dw_count' dwords from 'buffer' to alternate structure
5527 * starting at 'addr'.
5530 enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
5531 u32 addr, u32 dw_count, void *buffer)
5533 struct i40e_aq_desc desc;
5534 struct i40e_aqc_alternate_ind_write *cmd_resp =
5535 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5536 enum i40e_status_code status;
5539 return I40E_ERR_PARAM;
5541 /* Indirect command */
5542 i40e_fill_default_direct_cmd_desc(&desc,
5543 i40e_aqc_opc_alternate_write_indirect);
5545 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5546 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5547 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5548 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5550 cmd_resp->address = CPU_TO_LE32(addr);
5551 cmd_resp->length = CPU_TO_LE32(dw_count);
5553 status = i40e_asq_send_command(hw, &desc, buffer,
5554 I40E_LO_DWORD(4*dw_count), NULL);
5560 * i40e_aq_alternate_read
5561 * @hw: pointer to the hardware structure
5562 * @reg_addr0: address of first dword to be read
5563 * @reg_val0: pointer for data read from 'reg_addr0'
5564 * @reg_addr1: address of second dword to be read
5565 * @reg_val1: pointer for data read from 'reg_addr1'
5567 * Read one or two dwords from alternate structure. Fields are indicated
5568 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
5569 * is not passed then only register at 'reg_addr0' is read.
5572 enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
5573 u32 reg_addr0, u32 *reg_val0,
5574 u32 reg_addr1, u32 *reg_val1)
5576 struct i40e_aq_desc desc;
5577 struct i40e_aqc_alternate_write *cmd_resp =
5578 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5579 enum i40e_status_code status;
5581 if (reg_val0 == NULL)
5582 return I40E_ERR_PARAM;
5584 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
5585 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5586 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5588 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5590 if (status == I40E_SUCCESS) {
5591 *reg_val0 = LE32_TO_CPU(cmd_resp->data0);
5593 if (reg_val1 != NULL)
5594 *reg_val1 = LE32_TO_CPU(cmd_resp->data1);
5601 * i40e_aq_alternate_read_indirect
5602 * @hw: pointer to the hardware structure
5603 * @addr: address of the alternate structure field
5604 * @dw_count: number of alternate structure fields to read
5605 * @buffer: pointer to the command buffer
5607 * Read 'dw_count' dwords from alternate structure starting at 'addr' and
5608 * place them in 'buffer'. The buffer should be allocated by caller.
5611 enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
5612 u32 addr, u32 dw_count, void *buffer)
5614 struct i40e_aq_desc desc;
5615 struct i40e_aqc_alternate_ind_write *cmd_resp =
5616 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5617 enum i40e_status_code status;
5620 return I40E_ERR_PARAM;
5622 /* Indirect command */
5623 i40e_fill_default_direct_cmd_desc(&desc,
5624 i40e_aqc_opc_alternate_read_indirect);
5626 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5627 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5628 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5629 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5631 cmd_resp->address = CPU_TO_LE32(addr);
5632 cmd_resp->length = CPU_TO_LE32(dw_count);
5634 status = i40e_asq_send_command(hw, &desc, buffer,
5635 I40E_LO_DWORD(4*dw_count), NULL);
5641 * i40e_aq_alternate_clear
5642 * @hw: pointer to the HW structure.
5644 * Clear the alternate structures of the port from which the function
5648 enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
5650 struct i40e_aq_desc desc;
5651 enum i40e_status_code status;
5653 i40e_fill_default_direct_cmd_desc(&desc,
5654 i40e_aqc_opc_alternate_clear_port);
5656 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5662 * i40e_aq_alternate_write_done
5663 * @hw: pointer to the HW structure.
5664 * @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
5665 * @reset_needed: indicates the SW should trigger GLOBAL reset
5667 * Indicates to the FW that alternate structures have been changed.
5670 enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
5671 u8 bios_mode, bool *reset_needed)
5673 struct i40e_aq_desc desc;
5674 struct i40e_aqc_alternate_write_done *cmd =
5675 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
5676 enum i40e_status_code status;
5678 if (reset_needed == NULL)
5679 return I40E_ERR_PARAM;
5681 i40e_fill_default_direct_cmd_desc(&desc,
5682 i40e_aqc_opc_alternate_write_done);
5684 cmd->cmd_flags = CPU_TO_LE16(bios_mode);
5686 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5687 if (!status && reset_needed)
5688 *reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
5689 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
5695 * i40e_aq_set_oem_mode
5696 * @hw: pointer to the HW structure.
5697 * @oem_mode: the OEM mode to be used
5699 * Sets the device to a specific operating mode. Currently the only supported
5700 * mode is no_clp, which causes FW to refrain from using Alternate RAM.
5703 enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
5706 struct i40e_aq_desc desc;
5707 struct i40e_aqc_alternate_write_done *cmd =
5708 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
5709 enum i40e_status_code status;
5711 i40e_fill_default_direct_cmd_desc(&desc,
5712 i40e_aqc_opc_alternate_set_mode);
5714 cmd->cmd_flags = CPU_TO_LE16(oem_mode);
5716 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5722 * i40e_aq_resume_port_tx
5723 * @hw: pointer to the hardware structure
5724 * @cmd_details: pointer to command details structure or NULL
5726 * Resume port's Tx traffic
5728 enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
5729 struct i40e_asq_cmd_details *cmd_details)
5731 struct i40e_aq_desc desc;
5732 enum i40e_status_code status;
5734 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
5736 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5742 * i40e_set_pci_config_data - store PCI bus info
5743 * @hw: pointer to hardware structure
5744 * @link_status: the link status word from PCI config space
5746 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
5748 void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
5750 hw->bus.type = i40e_bus_type_pci_express;
5752 switch (link_status & I40E_PCI_LINK_WIDTH) {
5753 case I40E_PCI_LINK_WIDTH_1:
5754 hw->bus.width = i40e_bus_width_pcie_x1;
5756 case I40E_PCI_LINK_WIDTH_2:
5757 hw->bus.width = i40e_bus_width_pcie_x2;
5759 case I40E_PCI_LINK_WIDTH_4:
5760 hw->bus.width = i40e_bus_width_pcie_x4;
5762 case I40E_PCI_LINK_WIDTH_8:
5763 hw->bus.width = i40e_bus_width_pcie_x8;
5766 hw->bus.width = i40e_bus_width_unknown;
5770 switch (link_status & I40E_PCI_LINK_SPEED) {
5771 case I40E_PCI_LINK_SPEED_2500:
5772 hw->bus.speed = i40e_bus_speed_2500;
5774 case I40E_PCI_LINK_SPEED_5000:
5775 hw->bus.speed = i40e_bus_speed_5000;
5777 case I40E_PCI_LINK_SPEED_8000:
5778 hw->bus.speed = i40e_bus_speed_8000;
5781 hw->bus.speed = i40e_bus_speed_unknown;
5787 * i40e_aq_debug_dump
5788 * @hw: pointer to the hardware structure
5789 * @cluster_id: specific cluster to dump
5790 * @table_id: table id within cluster
5791 * @start_index: index of line in the block to read
5792 * @buff_size: dump buffer size
5793 * @buff: dump buffer
5794 * @ret_buff_size: actual buffer size returned
5795 * @ret_next_table: next block to read
5796 * @ret_next_index: next index to read
5798 * Dump internal FW/HW data for debug purposes.
5801 enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
5802 u8 table_id, u32 start_index, u16 buff_size,
5803 void *buff, u16 *ret_buff_size,
5804 u8 *ret_next_table, u32 *ret_next_index,
5805 struct i40e_asq_cmd_details *cmd_details)
5807 struct i40e_aq_desc desc;
5808 struct i40e_aqc_debug_dump_internals *cmd =
5809 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
5810 struct i40e_aqc_debug_dump_internals *resp =
5811 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
5812 enum i40e_status_code status;
5814 if (buff_size == 0 || !buff)
5815 return I40E_ERR_PARAM;
5817 i40e_fill_default_direct_cmd_desc(&desc,
5818 i40e_aqc_opc_debug_dump_internals);
5819 /* Indirect Command */
5820 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5821 if (buff_size > I40E_AQ_LARGE_BUF)
5822 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5824 cmd->cluster_id = cluster_id;
5825 cmd->table_id = table_id;
5826 cmd->idx = CPU_TO_LE32(start_index);
5828 desc.datalen = CPU_TO_LE16(buff_size);
5830 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
5832 if (ret_buff_size != NULL)
5833 *ret_buff_size = LE16_TO_CPU(desc.datalen);
5834 if (ret_next_table != NULL)
5835 *ret_next_table = resp->table_id;
5836 if (ret_next_index != NULL)
5837 *ret_next_index = LE32_TO_CPU(resp->idx);
5844 * i40e_read_bw_from_alt_ram
5845 * @hw: pointer to the hardware structure
5846 * @max_bw: pointer for max_bw read
5847 * @min_bw: pointer for min_bw read
5848 * @min_valid: pointer for bool that is TRUE if min_bw is a valid value
5849 * @max_valid: pointer for bool that is TRUE if max_bw is a valid value
5851 * Read bw from the alternate ram for the given pf
5853 enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
5854 u32 *max_bw, u32 *min_bw,
5855 bool *min_valid, bool *max_valid)
5857 enum i40e_status_code status;
5858 u32 max_bw_addr, min_bw_addr;
5860 /* Calculate the address of the min/max bw registers */
5861 max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
5862 I40E_ALT_STRUCT_MAX_BW_OFFSET +
5863 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
5864 min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
5865 I40E_ALT_STRUCT_MIN_BW_OFFSET +
5866 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
5868 /* Read the bandwidths from alt ram */
5869 status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
5870 min_bw_addr, min_bw);
5872 if (*min_bw & I40E_ALT_BW_VALID_MASK)
5877 if (*max_bw & I40E_ALT_BW_VALID_MASK)
5886 * i40e_aq_configure_partition_bw
5887 * @hw: pointer to the hardware structure
5888 * @bw_data: Buffer holding valid pfs and bw limits
5889 * @cmd_details: pointer to command details
5891 * Configure partitions guaranteed/max bw
5893 enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
5894 struct i40e_aqc_configure_partition_bw_data *bw_data,
5895 struct i40e_asq_cmd_details *cmd_details)
5897 enum i40e_status_code status;
5898 struct i40e_aq_desc desc;
5899 u16 bwd_size = sizeof(*bw_data);
5901 i40e_fill_default_direct_cmd_desc(&desc,
5902 i40e_aqc_opc_configure_partition_bw);
5904 /* Indirect command */
5905 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5906 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
5908 if (bwd_size > I40E_AQ_LARGE_BUF)
5909 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5911 desc.datalen = CPU_TO_LE16(bwd_size);
5913 status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
5919 * i40e_read_phy_register
5920 * @hw: pointer to the HW structure
5921 * @page: registers page number
5922 * @reg: register address in the page
5923 * @phy_adr: PHY address on MDIO interface
5924 * @value: PHY register value
5926 * Reads specified PHY register value
5928 enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
5929 u8 page, u16 reg, u8 phy_addr,
5932 enum i40e_status_code status = I40E_ERR_TIMEOUT;
5935 u8 port_num = (u8)hw->func_caps.mdio_port_num;
5937 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
5938 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
5939 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
5940 (I40E_MDIO_OPCODE_ADDRESS) |
5941 (I40E_MDIO_STCODE) |
5942 (I40E_GLGEN_MSCA_MDICMD_MASK) |
5943 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
5944 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
5946 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
5947 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
5948 status = I40E_SUCCESS;
5951 i40e_usec_delay(10);
5956 i40e_debug(hw, I40E_DEBUG_PHY,
5957 "PHY: Can't write command to external PHY.\n");
5961 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
5962 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
5963 (I40E_MDIO_OPCODE_READ) |
5964 (I40E_MDIO_STCODE) |
5965 (I40E_GLGEN_MSCA_MDICMD_MASK) |
5966 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
5967 status = I40E_ERR_TIMEOUT;
5969 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
5971 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
5972 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
5973 status = I40E_SUCCESS;
5976 i40e_usec_delay(10);
5981 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
5982 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
5983 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
5985 i40e_debug(hw, I40E_DEBUG_PHY,
5986 "PHY: Can't read register value from external PHY.\n");
5994 * i40e_write_phy_register
5995 * @hw: pointer to the HW structure
5996 * @page: registers page number
5997 * @reg: register address in the page
5998 * @phy_adr: PHY address on MDIO interface
5999 * @value: PHY register value
6001 * Writes value to specified PHY register
6003 enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
6004 u8 page, u16 reg, u8 phy_addr,
6007 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6010 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6012 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6013 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6014 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6015 (I40E_MDIO_OPCODE_ADDRESS) |
6016 (I40E_MDIO_STCODE) |
6017 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6018 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6019 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6021 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6022 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6023 status = I40E_SUCCESS;
6026 i40e_usec_delay(10);
6030 i40e_debug(hw, I40E_DEBUG_PHY,
6031 "PHY: Can't write command to external PHY.\n");
6035 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6036 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6038 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6039 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6040 (I40E_MDIO_OPCODE_WRITE) |
6041 (I40E_MDIO_STCODE) |
6042 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6043 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6044 status = I40E_ERR_TIMEOUT;
6046 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6048 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6049 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6050 status = I40E_SUCCESS;
6053 i40e_usec_delay(10);
6062 * i40e_get_phy_address
6063 * @hw: pointer to the HW structure
6064 * @dev_num: PHY port num that address we want
6065 * @phy_addr: Returned PHY address
6067 * Gets PHY address for current port
6069 u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num)
6071 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6072 u32 reg_val = rd32(hw, I40E_GLGEN_MDIO_I2C_SEL(port_num));
6074 return (u8)(reg_val >> ((dev_num + 1) * 5)) & 0x1f;
6078 * i40e_blink_phy_led
6079 * @hw: pointer to the HW structure
6080 * @time: time how long led will blinks in secs
6081 * @interval: gap between LED on and off in msecs
6083 * Blinks PHY link LED
6085 enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
6086 u32 time, u32 interval)
6088 enum i40e_status_code status = I40E_SUCCESS;
6093 u16 led_addr = I40E_PHY_LED_PROV_REG_1;
6097 i = rd32(hw, I40E_PFGEN_PORTNUM);
6098 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6099 phy_addr = i40e_get_phy_address(hw, port_num);
6101 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6103 status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6104 led_addr, phy_addr, &led_reg);
6106 goto phy_blinking_end;
6108 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6110 status = i40e_write_phy_register(hw,
6111 I40E_PHY_COM_REG_PAGE,
6115 goto phy_blinking_end;
6120 if (time > 0 && interval > 0) {
6121 for (i = 0; i < time * 1000; i += interval) {
6122 status = i40e_read_phy_register(hw,
6123 I40E_PHY_COM_REG_PAGE,
6127 goto restore_config;
6128 if (led_reg & I40E_PHY_LED_MANUAL_ON)
6131 led_reg = I40E_PHY_LED_MANUAL_ON;
6132 status = i40e_write_phy_register(hw,
6133 I40E_PHY_COM_REG_PAGE,
6137 goto restore_config;
6138 i40e_msec_delay(interval);
6143 status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE, led_addr,
6151 * i40e_led_get_phy - return current on/off mode
6152 * @hw: pointer to the hw struct
6153 * @led_addr: address of led register to use
6154 * @val: original value of register to use
6157 enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
6160 enum i40e_status_code status = I40E_SUCCESS;
6168 temp_addr = I40E_PHY_LED_PROV_REG_1;
6169 i = rd32(hw, I40E_PFGEN_PORTNUM);
6170 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6171 phy_addr = i40e_get_phy_address(hw, port_num);
6173 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6175 status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6176 temp_addr, phy_addr, ®_val);
6180 if (reg_val & I40E_PHY_LED_LINK_MODE_MASK) {
6181 *led_addr = temp_addr;
6190 * @hw: pointer to the HW structure
6191 * @on: TRUE or FALSE
6192 * @mode: original val plus bit for set or ignore
6193 * Set led's on or off when controlled by the PHY
6196 enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
6197 u16 led_addr, u32 mode)
6199 enum i40e_status_code status = I40E_SUCCESS;
6206 i = rd32(hw, I40E_PFGEN_PORTNUM);
6207 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6208 phy_addr = i40e_get_phy_address(hw, port_num);
6210 status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE, led_addr,
6211 phy_addr, &led_reg);
6215 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6217 status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6218 led_addr, phy_addr, led_reg);
6222 status = i40e_read_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6223 led_addr, phy_addr, &led_reg);
6225 goto restore_config;
6227 led_reg = I40E_PHY_LED_MANUAL_ON;
6230 status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE,
6231 led_addr, phy_addr, led_reg);
6233 goto restore_config;
6234 if (mode & I40E_PHY_LED_MODE_ORIG) {
6235 led_ctl = (mode & I40E_PHY_LED_MODE_MASK);
6236 status = i40e_write_phy_register(hw,
6237 I40E_PHY_COM_REG_PAGE,
6238 led_addr, phy_addr, led_ctl);
6242 status = i40e_write_phy_register(hw, I40E_PHY_COM_REG_PAGE, led_addr,
6248 * i40e_aq_rx_ctl_read_register - use FW to read from an Rx control register
6249 * @hw: pointer to the hw struct
6250 * @reg_addr: register address
6251 * @reg_val: ptr to register value
6252 * @cmd_details: pointer to command details structure or NULL
6254 * Use the firmware to read the Rx control register,
6255 * especially useful if the Rx unit is under heavy pressure
6257 enum i40e_status_code i40e_aq_rx_ctl_read_register(struct i40e_hw *hw,
6258 u32 reg_addr, u32 *reg_val,
6259 struct i40e_asq_cmd_details *cmd_details)
6261 struct i40e_aq_desc desc;
6262 struct i40e_aqc_rx_ctl_reg_read_write *cmd_resp =
6263 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6264 enum i40e_status_code status;
6266 if (reg_val == NULL)
6267 return I40E_ERR_PARAM;
6269 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_read);
6271 cmd_resp->address = CPU_TO_LE32(reg_addr);
6273 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6275 if (status == I40E_SUCCESS)
6276 *reg_val = LE32_TO_CPU(cmd_resp->value);
6282 * i40e_read_rx_ctl - read from an Rx control register
6283 * @hw: pointer to the hw struct
6284 * @reg_addr: register address
6286 u32 i40e_read_rx_ctl(struct i40e_hw *hw, u32 reg_addr)
6288 enum i40e_status_code status = I40E_SUCCESS;
6293 use_register = (hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver < 5);
6294 if (!use_register) {
6296 status = i40e_aq_rx_ctl_read_register(hw, reg_addr, &val, NULL);
6297 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6304 /* if the AQ access failed, try the old-fashioned way */
6305 if (status || use_register)
6306 val = rd32(hw, reg_addr);
6312 * i40e_aq_rx_ctl_write_register
6313 * @hw: pointer to the hw struct
6314 * @reg_addr: register address
6315 * @reg_val: register value
6316 * @cmd_details: pointer to command details structure or NULL
6318 * Use the firmware to write to an Rx control register,
6319 * especially useful if the Rx unit is under heavy pressure
6321 enum i40e_status_code i40e_aq_rx_ctl_write_register(struct i40e_hw *hw,
6322 u32 reg_addr, u32 reg_val,
6323 struct i40e_asq_cmd_details *cmd_details)
6325 struct i40e_aq_desc desc;
6326 struct i40e_aqc_rx_ctl_reg_read_write *cmd =
6327 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6328 enum i40e_status_code status;
6330 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_write);
6332 cmd->address = CPU_TO_LE32(reg_addr);
6333 cmd->value = CPU_TO_LE32(reg_val);
6335 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6341 * i40e_write_rx_ctl - write to an Rx control register
6342 * @hw: pointer to the hw struct
6343 * @reg_addr: register address
6344 * @reg_val: register value
6346 void i40e_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val)
6348 enum i40e_status_code status = I40E_SUCCESS;
6352 use_register = (hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver < 5);
6353 if (!use_register) {
6355 status = i40e_aq_rx_ctl_write_register(hw, reg_addr,
6357 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6364 /* if the AQ access failed, try the old-fashioned way */
6365 if (status || use_register)
6366 wr32(hw, reg_addr, reg_val);
6370 * i40e_aq_send_msg_to_pf
6371 * @hw: pointer to the hardware structure
6372 * @v_opcode: opcodes for VF-PF communication
6373 * @v_retval: return error code
6374 * @msg: pointer to the msg buffer
6375 * @msglen: msg length
6376 * @cmd_details: pointer to command details
6378 * Send message to PF driver using admin queue. By default, this message
6379 * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for
6380 * completion before returning.
6382 enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
6383 enum i40e_virtchnl_ops v_opcode,
6384 enum i40e_status_code v_retval,
6385 u8 *msg, u16 msglen,
6386 struct i40e_asq_cmd_details *cmd_details)
6388 struct i40e_aq_desc desc;
6389 struct i40e_asq_cmd_details details;
6390 enum i40e_status_code status;
6392 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
6393 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
6394 desc.cookie_high = CPU_TO_LE32(v_opcode);
6395 desc.cookie_low = CPU_TO_LE32(v_retval);
6397 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF
6398 | I40E_AQ_FLAG_RD));
6399 if (msglen > I40E_AQ_LARGE_BUF)
6400 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6401 desc.datalen = CPU_TO_LE16(msglen);
6404 i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM);
6405 details.async = TRUE;
6406 cmd_details = &details;
6408 status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg,
6409 msglen, cmd_details);
6414 * i40e_vf_parse_hw_config
6415 * @hw: pointer to the hardware structure
6416 * @msg: pointer to the virtual channel VF resource structure
6418 * Given a VF resource message from the PF, populate the hw struct
6419 * with appropriate information.
6421 void i40e_vf_parse_hw_config(struct i40e_hw *hw,
6422 struct i40e_virtchnl_vf_resource *msg)
6424 struct i40e_virtchnl_vsi_resource *vsi_res;
6427 vsi_res = &msg->vsi_res[0];
6429 hw->dev_caps.num_vsis = msg->num_vsis;
6430 hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
6431 hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
6432 hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
6433 hw->dev_caps.dcb = msg->vf_offload_flags &
6434 I40E_VIRTCHNL_VF_OFFLOAD_L2;
6435 hw->dev_caps.fcoe = (msg->vf_offload_flags &
6436 I40E_VIRTCHNL_VF_OFFLOAD_FCOE) ? 1 : 0;
6437 hw->dev_caps.iwarp = (msg->vf_offload_flags &
6438 I40E_VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0;
6439 for (i = 0; i < msg->num_vsis; i++) {
6440 if (vsi_res->vsi_type == I40E_VSI_SRIOV) {
6441 i40e_memcpy(hw->mac.perm_addr,
6442 vsi_res->default_mac_addr,
6443 I40E_ETH_LENGTH_OF_ADDRESS,
6444 I40E_NONDMA_TO_NONDMA);
6445 i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
6446 I40E_ETH_LENGTH_OF_ADDRESS,
6447 I40E_NONDMA_TO_NONDMA);
6455 * @hw: pointer to the hardware structure
6457 * Send a VF_RESET message to the PF. Does not wait for response from PF
6458 * as none will be forthcoming. Immediately after calling this function,
6459 * the admin queue should be shut down and (optionally) reinitialized.
6461 enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw)
6463 return i40e_aq_send_msg_to_pf(hw, I40E_VIRTCHNL_OP_RESET_VF,
6464 I40E_SUCCESS, NULL, 0, NULL);
6468 * i40e_aq_set_arp_proxy_config
6469 * @hw: pointer to the HW structure
6470 * @proxy_config - pointer to proxy config command table struct
6471 * @cmd_details: pointer to command details
6473 * Set ARP offload parameters from pre-populated
6474 * i40e_aqc_arp_proxy_data struct
6476 enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
6477 struct i40e_aqc_arp_proxy_data *proxy_config,
6478 struct i40e_asq_cmd_details *cmd_details)
6480 struct i40e_aq_desc desc;
6481 enum i40e_status_code status;
6484 return I40E_ERR_PARAM;
6486 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_proxy_config);
6488 desc.params.external.addr_high =
6489 CPU_TO_LE32(I40E_HI_DWORD((u64)proxy_config));
6490 desc.params.external.addr_low =
6491 CPU_TO_LE32(I40E_LO_DWORD((u64)proxy_config));
6493 status = i40e_asq_send_command(hw, &desc, proxy_config,
6494 sizeof(struct i40e_aqc_arp_proxy_data),
6501 * i40e_aq_opc_set_ns_proxy_table_entry
6502 * @hw: pointer to the HW structure
6503 * @ns_proxy_table_entry: pointer to NS table entry command struct
6504 * @cmd_details: pointer to command details
6506 * Set IPv6 Neighbor Solicitation (NS) protocol offload parameters
6507 * from pre-populated i40e_aqc_ns_proxy_data struct
6509 enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
6510 struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
6511 struct i40e_asq_cmd_details *cmd_details)
6513 struct i40e_aq_desc desc;
6514 enum i40e_status_code status;
6516 if (!ns_proxy_table_entry)
6517 return I40E_ERR_PARAM;
6519 i40e_fill_default_direct_cmd_desc(&desc,
6520 i40e_aqc_opc_set_ns_proxy_table_entry);
6522 desc.params.external.addr_high =
6523 CPU_TO_LE32(I40E_HI_DWORD((u64)ns_proxy_table_entry));
6524 desc.params.external.addr_low =
6525 CPU_TO_LE32(I40E_LO_DWORD((u64)ns_proxy_table_entry));
6527 status = i40e_asq_send_command(hw, &desc, ns_proxy_table_entry,
6528 sizeof(struct i40e_aqc_ns_proxy_data),
6535 * i40e_aq_set_clear_wol_filter
6536 * @hw: pointer to the hw struct
6537 * @filter_index: index of filter to modify (0-7)
6538 * @filter: buffer containing filter to be set
6539 * @set_filter: TRUE to set filter, FALSE to clear filter
6540 * @no_wol_tco: if TRUE, pass through packets cannot cause wake-up
6541 * if FALSE, pass through packets may cause wake-up
6542 * @filter_valid: TRUE if filter action is valid
6543 * @no_wol_tco_valid: TRUE if no WoL in TCO traffic action valid
6544 * @cmd_details: pointer to command details structure or NULL
6546 * Set or clear WoL filter for port attached to the PF
6548 enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
6550 struct i40e_aqc_set_wol_filter_data *filter,
6551 bool set_filter, bool no_wol_tco,
6552 bool filter_valid, bool no_wol_tco_valid,
6553 struct i40e_asq_cmd_details *cmd_details)
6555 struct i40e_aq_desc desc;
6556 struct i40e_aqc_set_wol_filter *cmd =
6557 (struct i40e_aqc_set_wol_filter *)&desc.params.raw;
6558 enum i40e_status_code status;
6560 u16 valid_flags = 0;
6563 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_wol_filter);
6565 if (filter_index >= I40E_AQC_MAX_NUM_WOL_FILTERS)
6566 return I40E_ERR_PARAM;
6567 cmd->filter_index = CPU_TO_LE16(filter_index);
6571 return I40E_ERR_PARAM;
6572 cmd_flags |= I40E_AQC_SET_WOL_FILTER;
6573 buff_len = sizeof(*filter);
6576 cmd_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL;
6577 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
6580 valid_flags |= I40E_AQC_SET_WOL_FILTER_ACTION_VALID;
6581 if (no_wol_tco_valid)
6582 valid_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID;
6583 cmd->valid_flags = CPU_TO_LE16(valid_flags);
6585 cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)filter));
6586 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)filter));
6588 status = i40e_asq_send_command(hw, &desc, filter,
6589 buff_len, cmd_details);
6595 * i40e_aq_get_wake_event_reason
6596 * @hw: pointer to the hw struct
6597 * @wake_reason: return value, index of matching filter
6598 * @cmd_details: pointer to command details structure or NULL
6600 * Get information for the reason of a Wake Up event
6602 enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
6604 struct i40e_asq_cmd_details *cmd_details)
6606 struct i40e_aq_desc desc;
6607 struct i40e_aqc_get_wake_reason_completion *resp =
6608 (struct i40e_aqc_get_wake_reason_completion *)&desc.params.raw;
6609 enum i40e_status_code status;
6611 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_wake_reason);
6613 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6615 if (status == I40E_SUCCESS)
6616 *wake_reason = LE16_TO_CPU(resp->wake_reason);