1 /*******************************************************************************
3 Copyright (c) 2013 - 2015, Intel Corporation
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
16 3. Neither the name of the Intel Corporation nor the names of its
17 contributors may be used to endorse or promote products derived from
18 this software without specific prior written permission.
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 POSSIBILITY OF SUCH DAMAGE.
32 ***************************************************************************/
34 #include "i40e_type.h"
35 #include "i40e_adminq.h"
36 #include "i40e_prototype.h"
37 #include "i40e_virtchnl.h"
41 * i40e_set_mac_type - Sets MAC type
42 * @hw: pointer to the HW structure
44 * This function sets the mac type of the adapter based on the
45 * vendor ID and device ID stored in the hw structure.
47 #if defined(INTEGRATED_VF) || defined(VF_DRIVER)
48 enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
50 STATIC enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
53 enum i40e_status_code status = I40E_SUCCESS;
55 DEBUGFUNC("i40e_set_mac_type\n");
57 if (hw->vendor_id == I40E_INTEL_VENDOR_ID) {
58 switch (hw->device_id) {
59 case I40E_DEV_ID_SFP_XL710:
60 case I40E_DEV_ID_QEMU:
61 case I40E_DEV_ID_KX_A:
62 case I40E_DEV_ID_KX_B:
63 case I40E_DEV_ID_KX_C:
64 case I40E_DEV_ID_QSFP_A:
65 case I40E_DEV_ID_QSFP_B:
66 case I40E_DEV_ID_QSFP_C:
67 case I40E_DEV_ID_10G_BASE_T:
68 case I40E_DEV_ID_10G_BASE_T4:
69 case I40E_DEV_ID_20G_KR2:
70 case I40E_DEV_ID_20G_KR2_A:
71 hw->mac.type = I40E_MAC_XL710;
74 #ifdef X722_A0_SUPPORT
75 case I40E_DEV_ID_X722_A0:
77 case I40E_DEV_ID_SFP_X722:
78 case I40E_DEV_ID_1G_BASE_T_X722:
79 case I40E_DEV_ID_10G_BASE_T_X722:
80 hw->mac.type = I40E_MAC_X722;
84 case I40E_DEV_ID_X722_VF:
85 case I40E_DEV_ID_X722_VF_HV:
86 hw->mac.type = I40E_MAC_X722_VF;
90 case I40E_DEV_ID_VF_HV:
91 hw->mac.type = I40E_MAC_VF;
94 hw->mac.type = I40E_MAC_GENERIC;
98 status = I40E_ERR_DEVICE_NOT_SUPPORTED;
101 DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n",
102 hw->mac.type, status);
106 #ifndef I40E_NDIS_SUPPORT
108 * i40e_aq_str - convert AQ err code to a string
109 * @hw: pointer to the HW structure
110 * @aq_err: the AQ error code to convert
112 const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err)
117 case I40E_AQ_RC_EPERM:
118 return "I40E_AQ_RC_EPERM";
119 case I40E_AQ_RC_ENOENT:
120 return "I40E_AQ_RC_ENOENT";
121 case I40E_AQ_RC_ESRCH:
122 return "I40E_AQ_RC_ESRCH";
123 case I40E_AQ_RC_EINTR:
124 return "I40E_AQ_RC_EINTR";
126 return "I40E_AQ_RC_EIO";
127 case I40E_AQ_RC_ENXIO:
128 return "I40E_AQ_RC_ENXIO";
129 case I40E_AQ_RC_E2BIG:
130 return "I40E_AQ_RC_E2BIG";
131 case I40E_AQ_RC_EAGAIN:
132 return "I40E_AQ_RC_EAGAIN";
133 case I40E_AQ_RC_ENOMEM:
134 return "I40E_AQ_RC_ENOMEM";
135 case I40E_AQ_RC_EACCES:
136 return "I40E_AQ_RC_EACCES";
137 case I40E_AQ_RC_EFAULT:
138 return "I40E_AQ_RC_EFAULT";
139 case I40E_AQ_RC_EBUSY:
140 return "I40E_AQ_RC_EBUSY";
141 case I40E_AQ_RC_EEXIST:
142 return "I40E_AQ_RC_EEXIST";
143 case I40E_AQ_RC_EINVAL:
144 return "I40E_AQ_RC_EINVAL";
145 case I40E_AQ_RC_ENOTTY:
146 return "I40E_AQ_RC_ENOTTY";
147 case I40E_AQ_RC_ENOSPC:
148 return "I40E_AQ_RC_ENOSPC";
149 case I40E_AQ_RC_ENOSYS:
150 return "I40E_AQ_RC_ENOSYS";
151 case I40E_AQ_RC_ERANGE:
152 return "I40E_AQ_RC_ERANGE";
153 case I40E_AQ_RC_EFLUSHED:
154 return "I40E_AQ_RC_EFLUSHED";
155 case I40E_AQ_RC_BAD_ADDR:
156 return "I40E_AQ_RC_BAD_ADDR";
157 case I40E_AQ_RC_EMODE:
158 return "I40E_AQ_RC_EMODE";
159 case I40E_AQ_RC_EFBIG:
160 return "I40E_AQ_RC_EFBIG";
163 snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
168 * i40e_stat_str - convert status err code to a string
169 * @hw: pointer to the HW structure
170 * @stat_err: the status error code to convert
172 const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err)
178 return "I40E_ERR_NVM";
179 case I40E_ERR_NVM_CHECKSUM:
180 return "I40E_ERR_NVM_CHECKSUM";
182 return "I40E_ERR_PHY";
183 case I40E_ERR_CONFIG:
184 return "I40E_ERR_CONFIG";
186 return "I40E_ERR_PARAM";
187 case I40E_ERR_MAC_TYPE:
188 return "I40E_ERR_MAC_TYPE";
189 case I40E_ERR_UNKNOWN_PHY:
190 return "I40E_ERR_UNKNOWN_PHY";
191 case I40E_ERR_LINK_SETUP:
192 return "I40E_ERR_LINK_SETUP";
193 case I40E_ERR_ADAPTER_STOPPED:
194 return "I40E_ERR_ADAPTER_STOPPED";
195 case I40E_ERR_INVALID_MAC_ADDR:
196 return "I40E_ERR_INVALID_MAC_ADDR";
197 case I40E_ERR_DEVICE_NOT_SUPPORTED:
198 return "I40E_ERR_DEVICE_NOT_SUPPORTED";
199 case I40E_ERR_MASTER_REQUESTS_PENDING:
200 return "I40E_ERR_MASTER_REQUESTS_PENDING";
201 case I40E_ERR_INVALID_LINK_SETTINGS:
202 return "I40E_ERR_INVALID_LINK_SETTINGS";
203 case I40E_ERR_AUTONEG_NOT_COMPLETE:
204 return "I40E_ERR_AUTONEG_NOT_COMPLETE";
205 case I40E_ERR_RESET_FAILED:
206 return "I40E_ERR_RESET_FAILED";
207 case I40E_ERR_SWFW_SYNC:
208 return "I40E_ERR_SWFW_SYNC";
209 case I40E_ERR_NO_AVAILABLE_VSI:
210 return "I40E_ERR_NO_AVAILABLE_VSI";
211 case I40E_ERR_NO_MEMORY:
212 return "I40E_ERR_NO_MEMORY";
213 case I40E_ERR_BAD_PTR:
214 return "I40E_ERR_BAD_PTR";
215 case I40E_ERR_RING_FULL:
216 return "I40E_ERR_RING_FULL";
217 case I40E_ERR_INVALID_PD_ID:
218 return "I40E_ERR_INVALID_PD_ID";
219 case I40E_ERR_INVALID_QP_ID:
220 return "I40E_ERR_INVALID_QP_ID";
221 case I40E_ERR_INVALID_CQ_ID:
222 return "I40E_ERR_INVALID_CQ_ID";
223 case I40E_ERR_INVALID_CEQ_ID:
224 return "I40E_ERR_INVALID_CEQ_ID";
225 case I40E_ERR_INVALID_AEQ_ID:
226 return "I40E_ERR_INVALID_AEQ_ID";
227 case I40E_ERR_INVALID_SIZE:
228 return "I40E_ERR_INVALID_SIZE";
229 case I40E_ERR_INVALID_ARP_INDEX:
230 return "I40E_ERR_INVALID_ARP_INDEX";
231 case I40E_ERR_INVALID_FPM_FUNC_ID:
232 return "I40E_ERR_INVALID_FPM_FUNC_ID";
233 case I40E_ERR_QP_INVALID_MSG_SIZE:
234 return "I40E_ERR_QP_INVALID_MSG_SIZE";
235 case I40E_ERR_QP_TOOMANY_WRS_POSTED:
236 return "I40E_ERR_QP_TOOMANY_WRS_POSTED";
237 case I40E_ERR_INVALID_FRAG_COUNT:
238 return "I40E_ERR_INVALID_FRAG_COUNT";
239 case I40E_ERR_QUEUE_EMPTY:
240 return "I40E_ERR_QUEUE_EMPTY";
241 case I40E_ERR_INVALID_ALIGNMENT:
242 return "I40E_ERR_INVALID_ALIGNMENT";
243 case I40E_ERR_FLUSHED_QUEUE:
244 return "I40E_ERR_FLUSHED_QUEUE";
245 case I40E_ERR_INVALID_PUSH_PAGE_INDEX:
246 return "I40E_ERR_INVALID_PUSH_PAGE_INDEX";
247 case I40E_ERR_INVALID_IMM_DATA_SIZE:
248 return "I40E_ERR_INVALID_IMM_DATA_SIZE";
249 case I40E_ERR_TIMEOUT:
250 return "I40E_ERR_TIMEOUT";
251 case I40E_ERR_OPCODE_MISMATCH:
252 return "I40E_ERR_OPCODE_MISMATCH";
253 case I40E_ERR_CQP_COMPL_ERROR:
254 return "I40E_ERR_CQP_COMPL_ERROR";
255 case I40E_ERR_INVALID_VF_ID:
256 return "I40E_ERR_INVALID_VF_ID";
257 case I40E_ERR_INVALID_HMCFN_ID:
258 return "I40E_ERR_INVALID_HMCFN_ID";
259 case I40E_ERR_BACKING_PAGE_ERROR:
260 return "I40E_ERR_BACKING_PAGE_ERROR";
261 case I40E_ERR_NO_PBLCHUNKS_AVAILABLE:
262 return "I40E_ERR_NO_PBLCHUNKS_AVAILABLE";
263 case I40E_ERR_INVALID_PBLE_INDEX:
264 return "I40E_ERR_INVALID_PBLE_INDEX";
265 case I40E_ERR_INVALID_SD_INDEX:
266 return "I40E_ERR_INVALID_SD_INDEX";
267 case I40E_ERR_INVALID_PAGE_DESC_INDEX:
268 return "I40E_ERR_INVALID_PAGE_DESC_INDEX";
269 case I40E_ERR_INVALID_SD_TYPE:
270 return "I40E_ERR_INVALID_SD_TYPE";
271 case I40E_ERR_MEMCPY_FAILED:
272 return "I40E_ERR_MEMCPY_FAILED";
273 case I40E_ERR_INVALID_HMC_OBJ_INDEX:
274 return "I40E_ERR_INVALID_HMC_OBJ_INDEX";
275 case I40E_ERR_INVALID_HMC_OBJ_COUNT:
276 return "I40E_ERR_INVALID_HMC_OBJ_COUNT";
277 case I40E_ERR_INVALID_SRQ_ARM_LIMIT:
278 return "I40E_ERR_INVALID_SRQ_ARM_LIMIT";
279 case I40E_ERR_SRQ_ENABLED:
280 return "I40E_ERR_SRQ_ENABLED";
281 case I40E_ERR_ADMIN_QUEUE_ERROR:
282 return "I40E_ERR_ADMIN_QUEUE_ERROR";
283 case I40E_ERR_ADMIN_QUEUE_TIMEOUT:
284 return "I40E_ERR_ADMIN_QUEUE_TIMEOUT";
285 case I40E_ERR_BUF_TOO_SHORT:
286 return "I40E_ERR_BUF_TOO_SHORT";
287 case I40E_ERR_ADMIN_QUEUE_FULL:
288 return "I40E_ERR_ADMIN_QUEUE_FULL";
289 case I40E_ERR_ADMIN_QUEUE_NO_WORK:
290 return "I40E_ERR_ADMIN_QUEUE_NO_WORK";
291 case I40E_ERR_BAD_IWARP_CQE:
292 return "I40E_ERR_BAD_IWARP_CQE";
293 case I40E_ERR_NVM_BLANK_MODE:
294 return "I40E_ERR_NVM_BLANK_MODE";
295 case I40E_ERR_NOT_IMPLEMENTED:
296 return "I40E_ERR_NOT_IMPLEMENTED";
297 case I40E_ERR_PE_DOORBELL_NOT_ENABLED:
298 return "I40E_ERR_PE_DOORBELL_NOT_ENABLED";
299 case I40E_ERR_DIAG_TEST_FAILED:
300 return "I40E_ERR_DIAG_TEST_FAILED";
301 case I40E_ERR_NOT_READY:
302 return "I40E_ERR_NOT_READY";
303 case I40E_NOT_SUPPORTED:
304 return "I40E_NOT_SUPPORTED";
305 case I40E_ERR_FIRMWARE_API_VERSION:
306 return "I40E_ERR_FIRMWARE_API_VERSION";
309 snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
313 #endif /* I40E_NDIS_SUPPORT */
316 * @hw: debug mask related to admin queue
318 * @desc: pointer to admin queue descriptor
319 * @buffer: pointer to command buffer
320 * @buf_len: max length of buffer
322 * Dumps debug log about adminq command with descriptor contents.
324 void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
325 void *buffer, u16 buf_len)
327 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
328 u16 len = LE16_TO_CPU(aq_desc->datalen);
329 u8 *buf = (u8 *)buffer;
332 if ((!(mask & hw->debug_mask)) || (desc == NULL))
336 "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
337 LE16_TO_CPU(aq_desc->opcode),
338 LE16_TO_CPU(aq_desc->flags),
339 LE16_TO_CPU(aq_desc->datalen),
340 LE16_TO_CPU(aq_desc->retval));
341 i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
342 LE32_TO_CPU(aq_desc->cookie_high),
343 LE32_TO_CPU(aq_desc->cookie_low));
344 i40e_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
345 LE32_TO_CPU(aq_desc->params.internal.param0),
346 LE32_TO_CPU(aq_desc->params.internal.param1));
347 i40e_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
348 LE32_TO_CPU(aq_desc->params.external.addr_high),
349 LE32_TO_CPU(aq_desc->params.external.addr_low));
351 if ((buffer != NULL) && (aq_desc->datalen != 0)) {
352 i40e_debug(hw, mask, "AQ CMD Buffer:\n");
355 /* write the full 16-byte chunks */
356 for (i = 0; i < (len - 16); i += 16)
358 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
359 i, buf[i], buf[i+1], buf[i+2], buf[i+3],
360 buf[i+4], buf[i+5], buf[i+6], buf[i+7],
361 buf[i+8], buf[i+9], buf[i+10], buf[i+11],
362 buf[i+12], buf[i+13], buf[i+14], buf[i+15]);
363 /* the most we could have left is 16 bytes, pad with zeros */
368 memset(d_buf, 0, sizeof(d_buf));
369 for (j = 0; i < len; j++, i++)
372 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
373 i, d_buf[0], d_buf[1], d_buf[2], d_buf[3],
374 d_buf[4], d_buf[5], d_buf[6], d_buf[7],
375 d_buf[8], d_buf[9], d_buf[10], d_buf[11],
376 d_buf[12], d_buf[13], d_buf[14], d_buf[15]);
382 * i40e_check_asq_alive
383 * @hw: pointer to the hw struct
385 * Returns true if Queue is enabled else false.
387 bool i40e_check_asq_alive(struct i40e_hw *hw)
393 return !!(rd32(hw, hw->aq.asq.len) &
394 I40E_PF_ATQLEN_ATQENABLE_MASK);
396 return !!(rd32(hw, hw->aq.asq.len) &
397 I40E_PF_ATQLEN_ATQENABLE_MASK);
398 #endif /* INTEGRATED_VF */
399 #endif /* PF_DRIVER */
403 return !!(rd32(hw, hw->aq.asq.len) &
404 I40E_VF_ATQLEN1_ATQENABLE_MASK);
406 return !!(rd32(hw, hw->aq.asq.len) &
407 I40E_VF_ATQLEN1_ATQENABLE_MASK);
408 #endif /* INTEGRATED_VF */
409 #endif /* VF_DRIVER */
414 * i40e_aq_queue_shutdown
415 * @hw: pointer to the hw struct
416 * @unloading: is the driver unloading itself
418 * Tell the Firmware that we're shutting down the AdminQ and whether
419 * or not the driver is unloading as well.
421 enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
424 struct i40e_aq_desc desc;
425 struct i40e_aqc_queue_shutdown *cmd =
426 (struct i40e_aqc_queue_shutdown *)&desc.params.raw;
427 enum i40e_status_code status;
429 i40e_fill_default_direct_cmd_desc(&desc,
430 i40e_aqc_opc_queue_shutdown);
433 cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING);
434 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
439 /* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
440 * hardware to a bit-field that can be used by SW to more easily determine the
443 * Macros are used to shorten the table lines and make this table human
446 * We store the PTYPE in the top byte of the bit field - this is just so that
447 * we can check that the table doesn't have a row missing, as the index into
448 * the table should be the PTYPE.
452 * IF NOT i40e_ptype_lookup[ptype].known
455 * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
456 * Use the rest of the fields to look at the tunnels, inner protocols, etc
458 * Use the enum i40e_rx_l2_ptype to decode the packet type
462 /* macro to make the table lines short */
463 #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
466 I40E_RX_PTYPE_OUTER_##OUTER_IP, \
467 I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \
468 I40E_RX_PTYPE_##OUTER_FRAG, \
469 I40E_RX_PTYPE_TUNNEL_##T, \
470 I40E_RX_PTYPE_TUNNEL_END_##TE, \
471 I40E_RX_PTYPE_##TEF, \
472 I40E_RX_PTYPE_INNER_PROT_##I, \
473 I40E_RX_PTYPE_PAYLOAD_LAYER_##PL }
475 #define I40E_PTT_UNUSED_ENTRY(PTYPE) \
476 { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
478 /* shorter macros makes the table fit but are terse */
479 #define I40E_RX_PTYPE_NOF I40E_RX_PTYPE_NOT_FRAG
480 #define I40E_RX_PTYPE_FRG I40E_RX_PTYPE_FRAG
481 #define I40E_RX_PTYPE_INNER_PROT_TS I40E_RX_PTYPE_INNER_PROT_TIMESYNC
483 /* Lookup table mapping the HW PTYPE to the bit field for decoding */
484 struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
485 /* L2 Packet types */
486 I40E_PTT_UNUSED_ENTRY(0),
487 I40E_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
488 I40E_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2),
489 I40E_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
490 I40E_PTT_UNUSED_ENTRY(4),
491 I40E_PTT_UNUSED_ENTRY(5),
492 I40E_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
493 I40E_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
494 I40E_PTT_UNUSED_ENTRY(8),
495 I40E_PTT_UNUSED_ENTRY(9),
496 I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
497 I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
498 I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
499 I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
500 I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
501 I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
502 I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
503 I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
504 I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
505 I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
506 I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
507 I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
509 /* Non Tunneled IPv4 */
510 I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
511 I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
512 I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4),
513 I40E_PTT_UNUSED_ENTRY(25),
514 I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4),
515 I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
516 I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
519 I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
520 I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
521 I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
522 I40E_PTT_UNUSED_ENTRY(32),
523 I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
524 I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
525 I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
528 I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
529 I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
530 I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
531 I40E_PTT_UNUSED_ENTRY(39),
532 I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
533 I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
534 I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
536 /* IPv4 --> GRE/NAT */
537 I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
539 /* IPv4 --> GRE/NAT --> IPv4 */
540 I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
541 I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
542 I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
543 I40E_PTT_UNUSED_ENTRY(47),
544 I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
545 I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
546 I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
548 /* IPv4 --> GRE/NAT --> IPv6 */
549 I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
550 I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
551 I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
552 I40E_PTT_UNUSED_ENTRY(54),
553 I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
554 I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
555 I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
557 /* IPv4 --> GRE/NAT --> MAC */
558 I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
560 /* IPv4 --> GRE/NAT --> MAC --> IPv4 */
561 I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
562 I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
563 I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
564 I40E_PTT_UNUSED_ENTRY(62),
565 I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
566 I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
567 I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
569 /* IPv4 --> GRE/NAT -> MAC --> IPv6 */
570 I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
571 I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
572 I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
573 I40E_PTT_UNUSED_ENTRY(69),
574 I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
575 I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
576 I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
578 /* IPv4 --> GRE/NAT --> MAC/VLAN */
579 I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
581 /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
582 I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
583 I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
584 I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
585 I40E_PTT_UNUSED_ENTRY(77),
586 I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
587 I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
588 I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
590 /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
591 I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
592 I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
593 I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
594 I40E_PTT_UNUSED_ENTRY(84),
595 I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
596 I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
597 I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
599 /* Non Tunneled IPv6 */
600 I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
601 I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
602 I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY3),
603 I40E_PTT_UNUSED_ENTRY(91),
604 I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
605 I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
606 I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
609 I40E_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
610 I40E_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
611 I40E_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
612 I40E_PTT_UNUSED_ENTRY(98),
613 I40E_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
614 I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
615 I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
618 I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
619 I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
620 I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
621 I40E_PTT_UNUSED_ENTRY(105),
622 I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
623 I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
624 I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
626 /* IPv6 --> GRE/NAT */
627 I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
629 /* IPv6 --> GRE/NAT -> IPv4 */
630 I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
631 I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
632 I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
633 I40E_PTT_UNUSED_ENTRY(113),
634 I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
635 I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
636 I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
638 /* IPv6 --> GRE/NAT -> IPv6 */
639 I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
640 I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
641 I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
642 I40E_PTT_UNUSED_ENTRY(120),
643 I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
644 I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
645 I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
647 /* IPv6 --> GRE/NAT -> MAC */
648 I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
650 /* IPv6 --> GRE/NAT -> MAC -> IPv4 */
651 I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
652 I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
653 I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
654 I40E_PTT_UNUSED_ENTRY(128),
655 I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
656 I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
657 I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
659 /* IPv6 --> GRE/NAT -> MAC -> IPv6 */
660 I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
661 I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
662 I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
663 I40E_PTT_UNUSED_ENTRY(135),
664 I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
665 I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
666 I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
668 /* IPv6 --> GRE/NAT -> MAC/VLAN */
669 I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
671 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
672 I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
673 I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
674 I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
675 I40E_PTT_UNUSED_ENTRY(143),
676 I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
677 I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
678 I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
680 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
681 I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
682 I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
683 I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
684 I40E_PTT_UNUSED_ENTRY(150),
685 I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
686 I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
687 I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
690 I40E_PTT_UNUSED_ENTRY(154),
691 I40E_PTT_UNUSED_ENTRY(155),
692 I40E_PTT_UNUSED_ENTRY(156),
693 I40E_PTT_UNUSED_ENTRY(157),
694 I40E_PTT_UNUSED_ENTRY(158),
695 I40E_PTT_UNUSED_ENTRY(159),
697 I40E_PTT_UNUSED_ENTRY(160),
698 I40E_PTT_UNUSED_ENTRY(161),
699 I40E_PTT_UNUSED_ENTRY(162),
700 I40E_PTT_UNUSED_ENTRY(163),
701 I40E_PTT_UNUSED_ENTRY(164),
702 I40E_PTT_UNUSED_ENTRY(165),
703 I40E_PTT_UNUSED_ENTRY(166),
704 I40E_PTT_UNUSED_ENTRY(167),
705 I40E_PTT_UNUSED_ENTRY(168),
706 I40E_PTT_UNUSED_ENTRY(169),
708 I40E_PTT_UNUSED_ENTRY(170),
709 I40E_PTT_UNUSED_ENTRY(171),
710 I40E_PTT_UNUSED_ENTRY(172),
711 I40E_PTT_UNUSED_ENTRY(173),
712 I40E_PTT_UNUSED_ENTRY(174),
713 I40E_PTT_UNUSED_ENTRY(175),
714 I40E_PTT_UNUSED_ENTRY(176),
715 I40E_PTT_UNUSED_ENTRY(177),
716 I40E_PTT_UNUSED_ENTRY(178),
717 I40E_PTT_UNUSED_ENTRY(179),
719 I40E_PTT_UNUSED_ENTRY(180),
720 I40E_PTT_UNUSED_ENTRY(181),
721 I40E_PTT_UNUSED_ENTRY(182),
722 I40E_PTT_UNUSED_ENTRY(183),
723 I40E_PTT_UNUSED_ENTRY(184),
724 I40E_PTT_UNUSED_ENTRY(185),
725 I40E_PTT_UNUSED_ENTRY(186),
726 I40E_PTT_UNUSED_ENTRY(187),
727 I40E_PTT_UNUSED_ENTRY(188),
728 I40E_PTT_UNUSED_ENTRY(189),
730 I40E_PTT_UNUSED_ENTRY(190),
731 I40E_PTT_UNUSED_ENTRY(191),
732 I40E_PTT_UNUSED_ENTRY(192),
733 I40E_PTT_UNUSED_ENTRY(193),
734 I40E_PTT_UNUSED_ENTRY(194),
735 I40E_PTT_UNUSED_ENTRY(195),
736 I40E_PTT_UNUSED_ENTRY(196),
737 I40E_PTT_UNUSED_ENTRY(197),
738 I40E_PTT_UNUSED_ENTRY(198),
739 I40E_PTT_UNUSED_ENTRY(199),
741 I40E_PTT_UNUSED_ENTRY(200),
742 I40E_PTT_UNUSED_ENTRY(201),
743 I40E_PTT_UNUSED_ENTRY(202),
744 I40E_PTT_UNUSED_ENTRY(203),
745 I40E_PTT_UNUSED_ENTRY(204),
746 I40E_PTT_UNUSED_ENTRY(205),
747 I40E_PTT_UNUSED_ENTRY(206),
748 I40E_PTT_UNUSED_ENTRY(207),
749 I40E_PTT_UNUSED_ENTRY(208),
750 I40E_PTT_UNUSED_ENTRY(209),
752 I40E_PTT_UNUSED_ENTRY(210),
753 I40E_PTT_UNUSED_ENTRY(211),
754 I40E_PTT_UNUSED_ENTRY(212),
755 I40E_PTT_UNUSED_ENTRY(213),
756 I40E_PTT_UNUSED_ENTRY(214),
757 I40E_PTT_UNUSED_ENTRY(215),
758 I40E_PTT_UNUSED_ENTRY(216),
759 I40E_PTT_UNUSED_ENTRY(217),
760 I40E_PTT_UNUSED_ENTRY(218),
761 I40E_PTT_UNUSED_ENTRY(219),
763 I40E_PTT_UNUSED_ENTRY(220),
764 I40E_PTT_UNUSED_ENTRY(221),
765 I40E_PTT_UNUSED_ENTRY(222),
766 I40E_PTT_UNUSED_ENTRY(223),
767 I40E_PTT_UNUSED_ENTRY(224),
768 I40E_PTT_UNUSED_ENTRY(225),
769 I40E_PTT_UNUSED_ENTRY(226),
770 I40E_PTT_UNUSED_ENTRY(227),
771 I40E_PTT_UNUSED_ENTRY(228),
772 I40E_PTT_UNUSED_ENTRY(229),
774 I40E_PTT_UNUSED_ENTRY(230),
775 I40E_PTT_UNUSED_ENTRY(231),
776 I40E_PTT_UNUSED_ENTRY(232),
777 I40E_PTT_UNUSED_ENTRY(233),
778 I40E_PTT_UNUSED_ENTRY(234),
779 I40E_PTT_UNUSED_ENTRY(235),
780 I40E_PTT_UNUSED_ENTRY(236),
781 I40E_PTT_UNUSED_ENTRY(237),
782 I40E_PTT_UNUSED_ENTRY(238),
783 I40E_PTT_UNUSED_ENTRY(239),
785 I40E_PTT_UNUSED_ENTRY(240),
786 I40E_PTT_UNUSED_ENTRY(241),
787 I40E_PTT_UNUSED_ENTRY(242),
788 I40E_PTT_UNUSED_ENTRY(243),
789 I40E_PTT_UNUSED_ENTRY(244),
790 I40E_PTT_UNUSED_ENTRY(245),
791 I40E_PTT_UNUSED_ENTRY(246),
792 I40E_PTT_UNUSED_ENTRY(247),
793 I40E_PTT_UNUSED_ENTRY(248),
794 I40E_PTT_UNUSED_ENTRY(249),
796 I40E_PTT_UNUSED_ENTRY(250),
797 I40E_PTT_UNUSED_ENTRY(251),
798 I40E_PTT_UNUSED_ENTRY(252),
799 I40E_PTT_UNUSED_ENTRY(253),
800 I40E_PTT_UNUSED_ENTRY(254),
801 I40E_PTT_UNUSED_ENTRY(255)
806 * i40e_validate_mac_addr - Validate unicast MAC address
807 * @mac_addr: pointer to MAC address
809 * Tests a MAC address to ensure it is a valid Individual Address
811 enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
813 enum i40e_status_code status = I40E_SUCCESS;
815 DEBUGFUNC("i40e_validate_mac_addr");
817 /* Broadcast addresses ARE multicast addresses
818 * Make sure it is not a multicast address
819 * Reject the zero address
821 if (I40E_IS_MULTICAST(mac_addr) ||
822 (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
823 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
824 status = I40E_ERR_INVALID_MAC_ADDR;
831 * i40e_init_shared_code - Initialize the shared code
832 * @hw: pointer to hardware structure
834 * This assigns the MAC type and PHY code and inits the NVM.
835 * Does not touch the hardware. This function must be called prior to any
836 * other function in the shared code. The i40e_hw structure should be
837 * memset to 0 prior to calling this function. The following fields in
838 * hw structure should be filled in prior to calling this function:
839 * hw_addr, back, device_id, vendor_id, subsystem_device_id,
840 * subsystem_vendor_id, and revision_id
842 enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
844 enum i40e_status_code status = I40E_SUCCESS;
845 u32 port, ari, func_rid;
847 DEBUGFUNC("i40e_init_shared_code");
849 i40e_set_mac_type(hw);
851 switch (hw->mac.type) {
858 return I40E_ERR_DEVICE_NOT_SUPPORTED;
861 hw->phy.get_link_info = true;
863 /* Determine port number and PF number*/
864 port = (rd32(hw, I40E_PFGEN_PORTNUM) & I40E_PFGEN_PORTNUM_PORT_NUM_MASK)
865 >> I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT;
867 ari = (rd32(hw, I40E_GLPCI_CAPSUP) & I40E_GLPCI_CAPSUP_ARI_EN_MASK) >>
868 I40E_GLPCI_CAPSUP_ARI_EN_SHIFT;
869 func_rid = rd32(hw, I40E_PF_FUNC_RID);
871 hw->pf_id = (u8)(func_rid & 0xff);
873 hw->pf_id = (u8)(func_rid & 0x7);
875 status = i40e_init_nvm(hw);
880 * i40e_aq_mac_address_read - Retrieve the MAC addresses
881 * @hw: pointer to the hw struct
882 * @flags: a return indicator of what addresses were added to the addr store
883 * @addrs: the requestor's mac addr store
884 * @cmd_details: pointer to command details structure or NULL
886 STATIC enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw,
888 struct i40e_aqc_mac_address_read_data *addrs,
889 struct i40e_asq_cmd_details *cmd_details)
891 struct i40e_aq_desc desc;
892 struct i40e_aqc_mac_address_read *cmd_data =
893 (struct i40e_aqc_mac_address_read *)&desc.params.raw;
894 enum i40e_status_code status;
896 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
897 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
899 status = i40e_asq_send_command(hw, &desc, addrs,
900 sizeof(*addrs), cmd_details);
901 *flags = LE16_TO_CPU(cmd_data->command_flags);
907 * i40e_aq_mac_address_write - Change the MAC addresses
908 * @hw: pointer to the hw struct
909 * @flags: indicates which MAC to be written
910 * @mac_addr: address to write
911 * @cmd_details: pointer to command details structure or NULL
913 enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
914 u16 flags, u8 *mac_addr,
915 struct i40e_asq_cmd_details *cmd_details)
917 struct i40e_aq_desc desc;
918 struct i40e_aqc_mac_address_write *cmd_data =
919 (struct i40e_aqc_mac_address_write *)&desc.params.raw;
920 enum i40e_status_code status;
922 i40e_fill_default_direct_cmd_desc(&desc,
923 i40e_aqc_opc_mac_address_write);
924 cmd_data->command_flags = CPU_TO_LE16(flags);
925 cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]);
926 cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) |
927 ((u32)mac_addr[3] << 16) |
928 ((u32)mac_addr[4] << 8) |
931 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
937 * i40e_get_mac_addr - get MAC address
938 * @hw: pointer to the HW structure
939 * @mac_addr: pointer to MAC address
941 * Reads the adapter's MAC address from register
943 enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
945 struct i40e_aqc_mac_address_read_data addrs;
946 enum i40e_status_code status;
949 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
951 if (flags & I40E_AQC_LAN_ADDR_VALID)
952 memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac));
958 * i40e_get_port_mac_addr - get Port MAC address
959 * @hw: pointer to the HW structure
960 * @mac_addr: pointer to Port MAC address
962 * Reads the adapter's Port MAC address
964 enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
966 struct i40e_aqc_mac_address_read_data addrs;
967 enum i40e_status_code status;
970 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
974 if (flags & I40E_AQC_PORT_ADDR_VALID)
975 memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac));
977 status = I40E_ERR_INVALID_MAC_ADDR;
983 * i40e_pre_tx_queue_cfg - pre tx queue configure
984 * @hw: pointer to the HW structure
985 * @queue: target pf queue index
986 * @enable: state change request
988 * Handles hw requirement to indicate intention to enable
989 * or disable target queue.
991 void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable)
993 u32 abs_queue_idx = hw->func_caps.base_queue + queue;
997 if (abs_queue_idx >= 128) {
998 reg_block = abs_queue_idx / 128;
999 abs_queue_idx %= 128;
1002 reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1003 reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1004 reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1007 reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK;
1009 reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1011 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val);
1015 * i40e_read_pba_string - Reads part number string from EEPROM
1016 * @hw: pointer to hardware structure
1017 * @pba_num: stores the part number string from the EEPROM
1018 * @pba_num_size: part number string buffer length
1020 * Reads the part number string from the EEPROM.
1022 enum i40e_status_code i40e_read_pba_string(struct i40e_hw *hw, u8 *pba_num,
1025 enum i40e_status_code status = I40E_SUCCESS;
1031 status = i40e_read_nvm_word(hw, I40E_SR_PBA_FLAGS, &pba_word);
1032 if ((status != I40E_SUCCESS) || (pba_word != 0xFAFA)) {
1033 DEBUGOUT("Failed to read PBA flags or flag is invalid.\n");
1037 status = i40e_read_nvm_word(hw, I40E_SR_PBA_BLOCK_PTR, &pba_ptr);
1038 if (status != I40E_SUCCESS) {
1039 DEBUGOUT("Failed to read PBA Block pointer.\n");
1043 status = i40e_read_nvm_word(hw, pba_ptr, &pba_size);
1044 if (status != I40E_SUCCESS) {
1045 DEBUGOUT("Failed to read PBA Block size.\n");
1049 /* Subtract one to get PBA word count (PBA Size word is included in
1053 if (pba_num_size < (((u32)pba_size * 2) + 1)) {
1054 DEBUGOUT("Buffer to small for PBA data.\n");
1055 return I40E_ERR_PARAM;
1058 for (i = 0; i < pba_size; i++) {
1059 status = i40e_read_nvm_word(hw, (pba_ptr + 1) + i, &pba_word);
1060 if (status != I40E_SUCCESS) {
1061 DEBUGOUT1("Failed to read PBA Block word %d.\n", i);
1065 pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
1066 pba_num[(i * 2) + 1] = pba_word & 0xFF;
1068 pba_num[(pba_size * 2)] = '\0';
1074 * i40e_get_media_type - Gets media type
1075 * @hw: pointer to the hardware structure
1077 STATIC enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
1079 enum i40e_media_type media;
1081 switch (hw->phy.link_info.phy_type) {
1082 case I40E_PHY_TYPE_10GBASE_SR:
1083 case I40E_PHY_TYPE_10GBASE_LR:
1084 case I40E_PHY_TYPE_1000BASE_SX:
1085 case I40E_PHY_TYPE_1000BASE_LX:
1086 case I40E_PHY_TYPE_40GBASE_SR4:
1087 case I40E_PHY_TYPE_40GBASE_LR4:
1088 media = I40E_MEDIA_TYPE_FIBER;
1090 case I40E_PHY_TYPE_100BASE_TX:
1091 case I40E_PHY_TYPE_1000BASE_T:
1092 case I40E_PHY_TYPE_10GBASE_T:
1093 media = I40E_MEDIA_TYPE_BASET;
1095 case I40E_PHY_TYPE_10GBASE_CR1_CU:
1096 case I40E_PHY_TYPE_40GBASE_CR4_CU:
1097 case I40E_PHY_TYPE_10GBASE_CR1:
1098 case I40E_PHY_TYPE_40GBASE_CR4:
1099 case I40E_PHY_TYPE_10GBASE_SFPP_CU:
1100 case I40E_PHY_TYPE_40GBASE_AOC:
1101 case I40E_PHY_TYPE_10GBASE_AOC:
1102 media = I40E_MEDIA_TYPE_DA;
1104 case I40E_PHY_TYPE_1000BASE_KX:
1105 case I40E_PHY_TYPE_10GBASE_KX4:
1106 case I40E_PHY_TYPE_10GBASE_KR:
1107 case I40E_PHY_TYPE_40GBASE_KR4:
1108 case I40E_PHY_TYPE_20GBASE_KR2:
1109 media = I40E_MEDIA_TYPE_BACKPLANE;
1111 case I40E_PHY_TYPE_SGMII:
1112 case I40E_PHY_TYPE_XAUI:
1113 case I40E_PHY_TYPE_XFI:
1114 case I40E_PHY_TYPE_XLAUI:
1115 case I40E_PHY_TYPE_XLPPI:
1117 media = I40E_MEDIA_TYPE_UNKNOWN;
1124 #define I40E_PF_RESET_WAIT_COUNT 200
1126 * i40e_pf_reset - Reset the PF
1127 * @hw: pointer to the hardware structure
1129 * Assuming someone else has triggered a global reset,
1130 * assure the global reset is complete and then reset the PF
1132 enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw)
1139 /* Poll for Global Reset steady state in case of recent GRST.
1140 * The grst delay value is in 100ms units, and we'll wait a
1141 * couple counts longer to be sure we don't just miss the end.
1143 grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) &
1144 I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >>
1145 I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
1146 #ifdef I40E_ESS_SUPPORT
1147 /* It can take upto 15 secs for GRST steady state */
1148 grst_del = grst_del * 20; /* bump it to 16 secs max to be safe */
1150 for (cnt = 0; cnt < grst_del + 10; cnt++) {
1151 reg = rd32(hw, I40E_GLGEN_RSTAT);
1152 if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
1154 i40e_msec_delay(100);
1156 if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1157 DEBUGOUT("Global reset polling failed to complete.\n");
1158 return I40E_ERR_RESET_FAILED;
1161 /* Now Wait for the FW to be ready */
1162 for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) {
1163 reg = rd32(hw, I40E_GLNVM_ULD);
1164 reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1165 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK);
1166 if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1167 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) {
1168 DEBUGOUT1("Core and Global modules ready %d\n", cnt1);
1171 i40e_msec_delay(10);
1173 if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1174 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) {
1175 DEBUGOUT("wait for FW Reset complete timedout\n");
1176 DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg);
1177 return I40E_ERR_RESET_FAILED;
1180 /* If there was a Global Reset in progress when we got here,
1181 * we don't need to do the PF Reset
1184 reg = rd32(hw, I40E_PFGEN_CTRL);
1185 wr32(hw, I40E_PFGEN_CTRL,
1186 (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
1187 for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) {
1188 reg = rd32(hw, I40E_PFGEN_CTRL);
1189 if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
1193 if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
1194 DEBUGOUT("PF reset polling failed to complete.\n");
1195 return I40E_ERR_RESET_FAILED;
1199 i40e_clear_pxe_mode(hw);
1202 return I40E_SUCCESS;
1206 * i40e_clear_hw - clear out any left over hw state
1207 * @hw: pointer to the hw struct
1209 * Clear queues and interrupts, typically called at init time,
1210 * but after the capabilities have been found so we know how many
1211 * queues and msix vectors have been allocated.
1213 void i40e_clear_hw(struct i40e_hw *hw)
1215 u32 num_queues, base_queue;
1223 /* get number of interrupts, queues, and vfs */
1224 val = rd32(hw, I40E_GLPCI_CNF2);
1225 num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >>
1226 I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT;
1227 num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >>
1228 I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT;
1230 val = rd32(hw, I40E_PFLAN_QALLOC);
1231 base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >>
1232 I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
1233 j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
1234 I40E_PFLAN_QALLOC_LASTQ_SHIFT;
1235 if (val & I40E_PFLAN_QALLOC_VALID_MASK)
1236 num_queues = (j - base_queue) + 1;
1240 val = rd32(hw, I40E_PF_VT_PFALLOC);
1241 i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >>
1242 I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
1243 j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
1244 I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
1245 if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
1246 num_vfs = (j - i) + 1;
1250 /* stop all the interrupts */
1251 wr32(hw, I40E_PFINT_ICR0_ENA, 0);
1252 val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
1253 for (i = 0; i < num_pf_int - 2; i++)
1254 wr32(hw, I40E_PFINT_DYN_CTLN(i), val);
1256 /* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
1257 val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1258 wr32(hw, I40E_PFINT_LNKLST0, val);
1259 for (i = 0; i < num_pf_int - 2; i++)
1260 wr32(hw, I40E_PFINT_LNKLSTN(i), val);
1261 val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1262 for (i = 0; i < num_vfs; i++)
1263 wr32(hw, I40E_VPINT_LNKLST0(i), val);
1264 for (i = 0; i < num_vf_int - 2; i++)
1265 wr32(hw, I40E_VPINT_LNKLSTN(i), val);
1267 /* warn the HW of the coming Tx disables */
1268 for (i = 0; i < num_queues; i++) {
1269 u32 abs_queue_idx = base_queue + i;
1272 if (abs_queue_idx >= 128) {
1273 reg_block = abs_queue_idx / 128;
1274 abs_queue_idx %= 128;
1277 val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1278 val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1279 val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1280 val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1282 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val);
1284 i40e_usec_delay(400);
1286 /* stop all the queues */
1287 for (i = 0; i < num_queues; i++) {
1288 wr32(hw, I40E_QINT_TQCTL(i), 0);
1289 wr32(hw, I40E_QTX_ENA(i), 0);
1290 wr32(hw, I40E_QINT_RQCTL(i), 0);
1291 wr32(hw, I40E_QRX_ENA(i), 0);
1294 /* short wait for all queue disables to settle */
1295 i40e_usec_delay(50);
1299 * i40e_clear_pxe_mode - clear pxe operations mode
1300 * @hw: pointer to the hw struct
1302 * Make sure all PXE mode settings are cleared, including things
1303 * like descriptor fetch/write-back mode.
1305 void i40e_clear_pxe_mode(struct i40e_hw *hw)
1307 if (i40e_check_asq_alive(hw))
1308 i40e_aq_clear_pxe_mode(hw, NULL);
1312 * i40e_led_is_mine - helper to find matching led
1313 * @hw: pointer to the hw struct
1314 * @idx: index into GPIO registers
1316 * returns: 0 if no match, otherwise the value of the GPIO_CTL register
1318 static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx)
1323 if (!hw->func_caps.led[idx])
1326 gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx));
1327 port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >>
1328 I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
1330 /* if PRT_NUM_NA is 1 then this LED is not port specific, OR
1331 * if it is not our port then ignore
1333 if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) ||
1340 #define I40E_COMBINED_ACTIVITY 0xA
1341 #define I40E_FILTER_ACTIVITY 0xE
1342 #define I40E_LINK_ACTIVITY 0xC
1343 #define I40E_MAC_ACTIVITY 0xD
1344 #define I40E_LED0 22
1347 * i40e_led_get - return current on/off mode
1348 * @hw: pointer to the hw struct
1350 * The value returned is the 'mode' field as defined in the
1351 * GPIO register definitions: 0x0 = off, 0xf = on, and other
1352 * values are variations of possible behaviors relating to
1353 * blink, link, and wire.
1355 u32 i40e_led_get(struct i40e_hw *hw)
1357 u32 current_mode = 0;
1361 /* as per the documentation GPIO 22-29 are the LED
1362 * GPIO pins named LED0..LED7
1364 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1365 u32 gpio_val = i40e_led_is_mine(hw, i);
1370 /* ignore gpio LED src mode entries related to the activity LEDs */
1371 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1372 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1373 switch (current_mode) {
1374 case I40E_COMBINED_ACTIVITY:
1375 case I40E_FILTER_ACTIVITY:
1376 case I40E_MAC_ACTIVITY:
1382 mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1383 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT;
1391 * i40e_led_set - set new on/off mode
1392 * @hw: pointer to the hw struct
1393 * @mode: 0=off, 0xf=on (else see manual for mode details)
1394 * @blink: true if the LED should blink when on, false if steady
1396 * if this function is used to turn on the blink it should
1397 * be used to disable the blink when restoring the original state.
1399 void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink)
1401 u32 current_mode = 0;
1404 if (mode & 0xfffffff0)
1405 DEBUGOUT1("invalid mode passed in %X\n", mode);
1407 /* as per the documentation GPIO 22-29 are the LED
1408 * GPIO pins named LED0..LED7
1410 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1411 u32 gpio_val = i40e_led_is_mine(hw, i);
1416 /* ignore gpio LED src mode entries related to the activity LEDs */
1417 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1418 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1419 switch (current_mode) {
1420 case I40E_COMBINED_ACTIVITY:
1421 case I40E_FILTER_ACTIVITY:
1422 case I40E_MAC_ACTIVITY:
1428 gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
1429 /* this & is a bit of paranoia, but serves as a range check */
1430 gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
1431 I40E_GLGEN_GPIO_CTL_LED_MODE_MASK);
1433 if (mode == I40E_LINK_ACTIVITY)
1437 gpio_val |= BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1439 gpio_val &= ~BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1441 wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
1446 /* Admin command wrappers */
1449 * i40e_aq_get_phy_capabilities
1450 * @hw: pointer to the hw struct
1451 * @abilities: structure for PHY capabilities to be filled
1452 * @qualified_modules: report Qualified Modules
1453 * @report_init: report init capabilities (active are default)
1454 * @cmd_details: pointer to command details structure or NULL
1456 * Returns the various PHY abilities supported on the Port.
1458 enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
1459 bool qualified_modules, bool report_init,
1460 struct i40e_aq_get_phy_abilities_resp *abilities,
1461 struct i40e_asq_cmd_details *cmd_details)
1463 struct i40e_aq_desc desc;
1464 enum i40e_status_code status;
1465 u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
1468 return I40E_ERR_PARAM;
1470 i40e_fill_default_direct_cmd_desc(&desc,
1471 i40e_aqc_opc_get_phy_abilities);
1473 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1474 if (abilities_size > I40E_AQ_LARGE_BUF)
1475 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1477 if (qualified_modules)
1478 desc.params.external.param0 |=
1479 CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
1482 desc.params.external.param0 |=
1483 CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
1485 status = i40e_asq_send_command(hw, &desc, abilities, abilities_size,
1488 if (hw->aq.asq_last_status == I40E_AQ_RC_EIO)
1489 status = I40E_ERR_UNKNOWN_PHY;
1492 hw->phy.phy_types = LE32_TO_CPU(abilities->phy_type);
1498 * i40e_aq_set_phy_config
1499 * @hw: pointer to the hw struct
1500 * @config: structure with PHY configuration to be set
1501 * @cmd_details: pointer to command details structure or NULL
1503 * Set the various PHY configuration parameters
1504 * supported on the Port.One or more of the Set PHY config parameters may be
1505 * ignored in an MFP mode as the PF may not have the privilege to set some
1506 * of the PHY Config parameters. This status will be indicated by the
1509 enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
1510 struct i40e_aq_set_phy_config *config,
1511 struct i40e_asq_cmd_details *cmd_details)
1513 struct i40e_aq_desc desc;
1514 struct i40e_aq_set_phy_config *cmd =
1515 (struct i40e_aq_set_phy_config *)&desc.params.raw;
1516 enum i40e_status_code status;
1519 return I40E_ERR_PARAM;
1521 i40e_fill_default_direct_cmd_desc(&desc,
1522 i40e_aqc_opc_set_phy_config);
1526 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1533 * @hw: pointer to the hw struct
1535 * Set the requested flow control mode using set_phy_config.
1537 enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
1538 bool atomic_restart)
1540 enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
1541 struct i40e_aq_get_phy_abilities_resp abilities;
1542 struct i40e_aq_set_phy_config config;
1543 enum i40e_status_code status;
1544 u8 pause_mask = 0x0;
1550 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1551 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1553 case I40E_FC_RX_PAUSE:
1554 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1556 case I40E_FC_TX_PAUSE:
1557 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1563 /* Get the current phy config */
1564 status = i40e_aq_get_phy_capabilities(hw, false, false, &abilities,
1567 *aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
1571 memset(&config, 0, sizeof(config));
1572 /* clear the old pause settings */
1573 config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
1574 ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
1575 /* set the new abilities */
1576 config.abilities |= pause_mask;
1577 /* If the abilities have changed, then set the new config */
1578 if (config.abilities != abilities.abilities) {
1579 /* Auto restart link so settings take effect */
1581 config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
1582 /* Copy over all the old settings */
1583 config.phy_type = abilities.phy_type;
1584 config.link_speed = abilities.link_speed;
1585 config.eee_capability = abilities.eee_capability;
1586 config.eeer = abilities.eeer_val;
1587 config.low_power_ctrl = abilities.d3_lpan;
1588 status = i40e_aq_set_phy_config(hw, &config, NULL);
1591 *aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
1593 /* Update the link info */
1594 status = i40e_update_link_info(hw);
1596 /* Wait a little bit (on 40G cards it sometimes takes a really
1597 * long time for link to come back from the atomic reset)
1600 i40e_msec_delay(1000);
1601 status = i40e_update_link_info(hw);
1604 *aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
1610 * i40e_aq_set_mac_config
1611 * @hw: pointer to the hw struct
1612 * @max_frame_size: Maximum Frame Size to be supported by the port
1613 * @crc_en: Tell HW to append a CRC to outgoing frames
1614 * @pacing: Pacing configurations
1615 * @cmd_details: pointer to command details structure or NULL
1617 * Configure MAC settings for frame size, jumbo frame support and the
1618 * addition of a CRC by the hardware.
1620 enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
1622 bool crc_en, u16 pacing,
1623 struct i40e_asq_cmd_details *cmd_details)
1625 struct i40e_aq_desc desc;
1626 struct i40e_aq_set_mac_config *cmd =
1627 (struct i40e_aq_set_mac_config *)&desc.params.raw;
1628 enum i40e_status_code status;
1630 if (max_frame_size == 0)
1631 return I40E_ERR_PARAM;
1633 i40e_fill_default_direct_cmd_desc(&desc,
1634 i40e_aqc_opc_set_mac_config);
1636 cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
1637 cmd->params = ((u8)pacing & 0x0F) << 3;
1639 cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
1641 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1647 * i40e_aq_clear_pxe_mode
1648 * @hw: pointer to the hw struct
1649 * @cmd_details: pointer to command details structure or NULL
1651 * Tell the firmware that the driver is taking over from PXE
1653 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
1654 struct i40e_asq_cmd_details *cmd_details)
1656 enum i40e_status_code status;
1657 struct i40e_aq_desc desc;
1658 struct i40e_aqc_clear_pxe *cmd =
1659 (struct i40e_aqc_clear_pxe *)&desc.params.raw;
1661 i40e_fill_default_direct_cmd_desc(&desc,
1662 i40e_aqc_opc_clear_pxe_mode);
1666 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1668 wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
1674 * i40e_aq_set_link_restart_an
1675 * @hw: pointer to the hw struct
1676 * @enable_link: if true: enable link, if false: disable link
1677 * @cmd_details: pointer to command details structure or NULL
1679 * Sets up the link and restarts the Auto-Negotiation over the link.
1681 enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
1682 bool enable_link, struct i40e_asq_cmd_details *cmd_details)
1684 struct i40e_aq_desc desc;
1685 struct i40e_aqc_set_link_restart_an *cmd =
1686 (struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
1687 enum i40e_status_code status;
1689 i40e_fill_default_direct_cmd_desc(&desc,
1690 i40e_aqc_opc_set_link_restart_an);
1692 cmd->command = I40E_AQ_PHY_RESTART_AN;
1694 cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
1696 cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
1698 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1704 * i40e_aq_get_link_info
1705 * @hw: pointer to the hw struct
1706 * @enable_lse: enable/disable LinkStatusEvent reporting
1707 * @link: pointer to link status structure - optional
1708 * @cmd_details: pointer to command details structure or NULL
1710 * Returns the link status of the adapter.
1712 enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
1713 bool enable_lse, struct i40e_link_status *link,
1714 struct i40e_asq_cmd_details *cmd_details)
1716 struct i40e_aq_desc desc;
1717 struct i40e_aqc_get_link_status *resp =
1718 (struct i40e_aqc_get_link_status *)&desc.params.raw;
1719 struct i40e_link_status *hw_link_info = &hw->phy.link_info;
1720 enum i40e_status_code status;
1721 bool tx_pause, rx_pause;
1724 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
1727 command_flags = I40E_AQ_LSE_ENABLE;
1729 command_flags = I40E_AQ_LSE_DISABLE;
1730 resp->command_flags = CPU_TO_LE16(command_flags);
1732 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1734 if (status != I40E_SUCCESS)
1735 goto aq_get_link_info_exit;
1737 /* save off old link status information */
1738 i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
1739 sizeof(*hw_link_info), I40E_NONDMA_TO_NONDMA);
1741 /* update link status */
1742 hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
1743 hw->phy.media_type = i40e_get_media_type(hw);
1744 hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
1745 hw_link_info->link_info = resp->link_info;
1746 hw_link_info->an_info = resp->an_info;
1747 hw_link_info->ext_info = resp->ext_info;
1748 hw_link_info->loopback = resp->loopback;
1749 hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
1750 hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
1752 /* update fc info */
1753 tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
1754 rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
1755 if (tx_pause & rx_pause)
1756 hw->fc.current_mode = I40E_FC_FULL;
1758 hw->fc.current_mode = I40E_FC_TX_PAUSE;
1760 hw->fc.current_mode = I40E_FC_RX_PAUSE;
1762 hw->fc.current_mode = I40E_FC_NONE;
1764 if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
1765 hw_link_info->crc_enable = true;
1767 hw_link_info->crc_enable = false;
1769 if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_ENABLE))
1770 hw_link_info->lse_enable = true;
1772 hw_link_info->lse_enable = false;
1774 if ((hw->aq.fw_maj_ver < 4 || (hw->aq.fw_maj_ver == 4 &&
1775 hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
1776 hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
1778 /* save link status information */
1780 i40e_memcpy(link, hw_link_info, sizeof(*hw_link_info),
1781 I40E_NONDMA_TO_NONDMA);
1783 /* flag cleared so helper functions don't call AQ again */
1784 hw->phy.get_link_info = false;
1786 aq_get_link_info_exit:
1791 * i40e_aq_set_phy_int_mask
1792 * @hw: pointer to the hw struct
1793 * @mask: interrupt mask to be set
1794 * @cmd_details: pointer to command details structure or NULL
1796 * Set link interrupt mask.
1798 enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
1800 struct i40e_asq_cmd_details *cmd_details)
1802 struct i40e_aq_desc desc;
1803 struct i40e_aqc_set_phy_int_mask *cmd =
1804 (struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
1805 enum i40e_status_code status;
1807 i40e_fill_default_direct_cmd_desc(&desc,
1808 i40e_aqc_opc_set_phy_int_mask);
1810 cmd->event_mask = CPU_TO_LE16(mask);
1812 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1818 * i40e_aq_get_local_advt_reg
1819 * @hw: pointer to the hw struct
1820 * @advt_reg: local AN advertisement register value
1821 * @cmd_details: pointer to command details structure or NULL
1823 * Get the Local AN advertisement register value.
1825 enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
1827 struct i40e_asq_cmd_details *cmd_details)
1829 struct i40e_aq_desc desc;
1830 struct i40e_aqc_an_advt_reg *resp =
1831 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
1832 enum i40e_status_code status;
1834 i40e_fill_default_direct_cmd_desc(&desc,
1835 i40e_aqc_opc_get_local_advt_reg);
1837 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1839 if (status != I40E_SUCCESS)
1840 goto aq_get_local_advt_reg_exit;
1842 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
1843 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
1845 aq_get_local_advt_reg_exit:
1850 * i40e_aq_set_local_advt_reg
1851 * @hw: pointer to the hw struct
1852 * @advt_reg: local AN advertisement register value
1853 * @cmd_details: pointer to command details structure or NULL
1855 * Get the Local AN advertisement register value.
1857 enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
1859 struct i40e_asq_cmd_details *cmd_details)
1861 struct i40e_aq_desc desc;
1862 struct i40e_aqc_an_advt_reg *cmd =
1863 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
1864 enum i40e_status_code status;
1866 i40e_fill_default_direct_cmd_desc(&desc,
1867 i40e_aqc_opc_get_local_advt_reg);
1869 cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
1870 cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
1872 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1878 * i40e_aq_get_partner_advt
1879 * @hw: pointer to the hw struct
1880 * @advt_reg: AN partner advertisement register value
1881 * @cmd_details: pointer to command details structure or NULL
1883 * Get the link partner AN advertisement register value.
1885 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
1887 struct i40e_asq_cmd_details *cmd_details)
1889 struct i40e_aq_desc desc;
1890 struct i40e_aqc_an_advt_reg *resp =
1891 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
1892 enum i40e_status_code status;
1894 i40e_fill_default_direct_cmd_desc(&desc,
1895 i40e_aqc_opc_get_partner_advt);
1897 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1899 if (status != I40E_SUCCESS)
1900 goto aq_get_partner_advt_exit;
1902 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
1903 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
1905 aq_get_partner_advt_exit:
1910 * i40e_aq_set_lb_modes
1911 * @hw: pointer to the hw struct
1912 * @lb_modes: loopback mode to be set
1913 * @cmd_details: pointer to command details structure or NULL
1915 * Sets loopback modes.
1917 enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
1919 struct i40e_asq_cmd_details *cmd_details)
1921 struct i40e_aq_desc desc;
1922 struct i40e_aqc_set_lb_mode *cmd =
1923 (struct i40e_aqc_set_lb_mode *)&desc.params.raw;
1924 enum i40e_status_code status;
1926 i40e_fill_default_direct_cmd_desc(&desc,
1927 i40e_aqc_opc_set_lb_modes);
1929 cmd->lb_mode = CPU_TO_LE16(lb_modes);
1931 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1937 * i40e_aq_set_phy_debug
1938 * @hw: pointer to the hw struct
1939 * @cmd_flags: debug command flags
1940 * @cmd_details: pointer to command details structure or NULL
1942 * Reset the external PHY.
1944 enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
1945 struct i40e_asq_cmd_details *cmd_details)
1947 struct i40e_aq_desc desc;
1948 struct i40e_aqc_set_phy_debug *cmd =
1949 (struct i40e_aqc_set_phy_debug *)&desc.params.raw;
1950 enum i40e_status_code status;
1952 i40e_fill_default_direct_cmd_desc(&desc,
1953 i40e_aqc_opc_set_phy_debug);
1955 cmd->command_flags = cmd_flags;
1957 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1964 * @hw: pointer to the hw struct
1965 * @vsi_ctx: pointer to a vsi context struct
1966 * @cmd_details: pointer to command details structure or NULL
1968 * Add a VSI context to the hardware.
1970 enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
1971 struct i40e_vsi_context *vsi_ctx,
1972 struct i40e_asq_cmd_details *cmd_details)
1974 struct i40e_aq_desc desc;
1975 struct i40e_aqc_add_get_update_vsi *cmd =
1976 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
1977 struct i40e_aqc_add_get_update_vsi_completion *resp =
1978 (struct i40e_aqc_add_get_update_vsi_completion *)
1980 enum i40e_status_code status;
1982 i40e_fill_default_direct_cmd_desc(&desc,
1983 i40e_aqc_opc_add_vsi);
1985 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
1986 cmd->connection_type = vsi_ctx->connection_type;
1987 cmd->vf_id = vsi_ctx->vf_num;
1988 cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
1990 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
1992 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
1993 sizeof(vsi_ctx->info), cmd_details);
1995 if (status != I40E_SUCCESS)
1996 goto aq_add_vsi_exit;
1998 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
1999 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2000 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2001 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2008 * i40e_aq_set_default_vsi
2009 * @hw: pointer to the hw struct
2011 * @cmd_details: pointer to command details structure or NULL
2013 enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
2015 struct i40e_asq_cmd_details *cmd_details)
2017 struct i40e_aq_desc desc;
2018 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2019 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2021 enum i40e_status_code status;
2023 i40e_fill_default_direct_cmd_desc(&desc,
2024 i40e_aqc_opc_set_vsi_promiscuous_modes);
2026 cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2027 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2028 cmd->seid = CPU_TO_LE16(seid);
2030 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2036 * i40e_aq_set_vsi_unicast_promiscuous
2037 * @hw: pointer to the hw struct
2039 * @set: set unicast promiscuous enable/disable
2040 * @cmd_details: pointer to command details structure or NULL
2042 enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
2044 struct i40e_asq_cmd_details *cmd_details)
2046 struct i40e_aq_desc desc;
2047 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2048 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2049 enum i40e_status_code status;
2052 i40e_fill_default_direct_cmd_desc(&desc,
2053 i40e_aqc_opc_set_vsi_promiscuous_modes);
2056 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2058 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2060 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2062 cmd->seid = CPU_TO_LE16(seid);
2063 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2069 * i40e_aq_set_vsi_multicast_promiscuous
2070 * @hw: pointer to the hw struct
2072 * @set: set multicast promiscuous enable/disable
2073 * @cmd_details: pointer to command details structure or NULL
2075 enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
2076 u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
2078 struct i40e_aq_desc desc;
2079 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2080 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2081 enum i40e_status_code status;
2084 i40e_fill_default_direct_cmd_desc(&desc,
2085 i40e_aqc_opc_set_vsi_promiscuous_modes);
2088 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2090 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2092 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2094 cmd->seid = CPU_TO_LE16(seid);
2095 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2101 * i40e_aq_set_vsi_mc_promisc_on_vlan
2102 * @hw: pointer to the hw struct
2104 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2105 * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
2106 * @cmd_details: pointer to command details structure or NULL
2108 enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
2109 u16 seid, bool enable, u16 vid,
2110 struct i40e_asq_cmd_details *cmd_details)
2112 struct i40e_aq_desc desc;
2113 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2114 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2115 enum i40e_status_code status;
2118 i40e_fill_default_direct_cmd_desc(&desc,
2119 i40e_aqc_opc_set_vsi_promiscuous_modes);
2122 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2124 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2125 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2126 cmd->seid = CPU_TO_LE16(seid);
2127 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2129 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2135 * i40e_aq_set_vsi_uc_promisc_on_vlan
2136 * @hw: pointer to the hw struct
2138 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2139 * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
2140 * @cmd_details: pointer to command details structure or NULL
2142 enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
2143 u16 seid, bool enable, u16 vid,
2144 struct i40e_asq_cmd_details *cmd_details)
2146 struct i40e_aq_desc desc;
2147 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2148 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2149 enum i40e_status_code status;
2152 i40e_fill_default_direct_cmd_desc(&desc,
2153 i40e_aqc_opc_set_vsi_promiscuous_modes);
2156 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2158 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2159 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2160 cmd->seid = CPU_TO_LE16(seid);
2161 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2163 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2169 * i40e_aq_set_vsi_broadcast
2170 * @hw: pointer to the hw struct
2172 * @set_filter: true to set filter, false to clear filter
2173 * @cmd_details: pointer to command details structure or NULL
2175 * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
2177 enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
2178 u16 seid, bool set_filter,
2179 struct i40e_asq_cmd_details *cmd_details)
2181 struct i40e_aq_desc desc;
2182 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2183 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2184 enum i40e_status_code status;
2186 i40e_fill_default_direct_cmd_desc(&desc,
2187 i40e_aqc_opc_set_vsi_promiscuous_modes);
2190 cmd->promiscuous_flags
2191 |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2193 cmd->promiscuous_flags
2194 &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2196 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2197 cmd->seid = CPU_TO_LE16(seid);
2198 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2204 * i40e_get_vsi_params - get VSI configuration info
2205 * @hw: pointer to the hw struct
2206 * @vsi_ctx: pointer to a vsi context struct
2207 * @cmd_details: pointer to command details structure or NULL
2209 enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
2210 struct i40e_vsi_context *vsi_ctx,
2211 struct i40e_asq_cmd_details *cmd_details)
2213 struct i40e_aq_desc desc;
2214 struct i40e_aqc_add_get_update_vsi *cmd =
2215 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2216 struct i40e_aqc_add_get_update_vsi_completion *resp =
2217 (struct i40e_aqc_add_get_update_vsi_completion *)
2219 enum i40e_status_code status;
2221 UNREFERENCED_1PARAMETER(cmd_details);
2222 i40e_fill_default_direct_cmd_desc(&desc,
2223 i40e_aqc_opc_get_vsi_parameters);
2225 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2227 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2229 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2230 sizeof(vsi_ctx->info), NULL);
2232 if (status != I40E_SUCCESS)
2233 goto aq_get_vsi_params_exit;
2235 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2236 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2237 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2238 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2240 aq_get_vsi_params_exit:
2245 * i40e_aq_update_vsi_params
2246 * @hw: pointer to the hw struct
2247 * @vsi_ctx: pointer to a vsi context struct
2248 * @cmd_details: pointer to command details structure or NULL
2250 * Update a VSI context.
2252 enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
2253 struct i40e_vsi_context *vsi_ctx,
2254 struct i40e_asq_cmd_details *cmd_details)
2256 struct i40e_aq_desc desc;
2257 struct i40e_aqc_add_get_update_vsi *cmd =
2258 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2259 enum i40e_status_code status;
2261 i40e_fill_default_direct_cmd_desc(&desc,
2262 i40e_aqc_opc_update_vsi_parameters);
2263 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2265 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2267 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2268 sizeof(vsi_ctx->info), cmd_details);
2274 * i40e_aq_get_switch_config
2275 * @hw: pointer to the hardware structure
2276 * @buf: pointer to the result buffer
2277 * @buf_size: length of input buffer
2278 * @start_seid: seid to start for the report, 0 == beginning
2279 * @cmd_details: pointer to command details structure or NULL
2281 * Fill the buf with switch configuration returned from AdminQ command
2283 enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
2284 struct i40e_aqc_get_switch_config_resp *buf,
2285 u16 buf_size, u16 *start_seid,
2286 struct i40e_asq_cmd_details *cmd_details)
2288 struct i40e_aq_desc desc;
2289 struct i40e_aqc_switch_seid *scfg =
2290 (struct i40e_aqc_switch_seid *)&desc.params.raw;
2291 enum i40e_status_code status;
2293 i40e_fill_default_direct_cmd_desc(&desc,
2294 i40e_aqc_opc_get_switch_config);
2295 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2296 if (buf_size > I40E_AQ_LARGE_BUF)
2297 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2298 scfg->seid = CPU_TO_LE16(*start_seid);
2300 status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
2301 *start_seid = LE16_TO_CPU(scfg->seid);
2307 * i40e_aq_get_firmware_version
2308 * @hw: pointer to the hw struct
2309 * @fw_major_version: firmware major version
2310 * @fw_minor_version: firmware minor version
2311 * @fw_build: firmware build number
2312 * @api_major_version: major queue version
2313 * @api_minor_version: minor queue version
2314 * @cmd_details: pointer to command details structure or NULL
2316 * Get the firmware version from the admin queue commands
2318 enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
2319 u16 *fw_major_version, u16 *fw_minor_version,
2321 u16 *api_major_version, u16 *api_minor_version,
2322 struct i40e_asq_cmd_details *cmd_details)
2324 struct i40e_aq_desc desc;
2325 struct i40e_aqc_get_version *resp =
2326 (struct i40e_aqc_get_version *)&desc.params.raw;
2327 enum i40e_status_code status;
2329 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
2331 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2333 if (status == I40E_SUCCESS) {
2334 if (fw_major_version != NULL)
2335 *fw_major_version = LE16_TO_CPU(resp->fw_major);
2336 if (fw_minor_version != NULL)
2337 *fw_minor_version = LE16_TO_CPU(resp->fw_minor);
2338 if (fw_build != NULL)
2339 *fw_build = LE32_TO_CPU(resp->fw_build);
2340 if (api_major_version != NULL)
2341 *api_major_version = LE16_TO_CPU(resp->api_major);
2342 if (api_minor_version != NULL)
2343 *api_minor_version = LE16_TO_CPU(resp->api_minor);
2345 /* A workaround to fix the API version in SW */
2346 if (api_major_version && api_minor_version &&
2347 fw_major_version && fw_minor_version &&
2348 ((*api_major_version == 1) && (*api_minor_version == 1)) &&
2349 (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
2350 (*fw_major_version > 4)))
2351 *api_minor_version = 2;
2358 * i40e_aq_send_driver_version
2359 * @hw: pointer to the hw struct
2360 * @dv: driver's major, minor version
2361 * @cmd_details: pointer to command details structure or NULL
2363 * Send the driver version to the firmware
2365 enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
2366 struct i40e_driver_version *dv,
2367 struct i40e_asq_cmd_details *cmd_details)
2369 struct i40e_aq_desc desc;
2370 struct i40e_aqc_driver_version *cmd =
2371 (struct i40e_aqc_driver_version *)&desc.params.raw;
2372 enum i40e_status_code status;
2376 return I40E_ERR_PARAM;
2378 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
2380 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
2381 cmd->driver_major_ver = dv->major_version;
2382 cmd->driver_minor_ver = dv->minor_version;
2383 cmd->driver_build_ver = dv->build_version;
2384 cmd->driver_subbuild_ver = dv->subbuild_version;
2387 while (len < sizeof(dv->driver_string) &&
2388 (dv->driver_string[len] < 0x80) &&
2389 dv->driver_string[len])
2391 status = i40e_asq_send_command(hw, &desc, dv->driver_string,
2398 * i40e_get_link_status - get status of the HW network link
2399 * @hw: pointer to the hw struct
2400 * @link_up: pointer to bool (true/false = linkup/linkdown)
2402 * Variable link_up true if link is up, false if link is down.
2403 * The variable link_up is invalid if returned value of status != I40E_SUCCESS
2405 * Side effect: LinkStatusEvent reporting becomes enabled
2407 enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
2409 enum i40e_status_code status = I40E_SUCCESS;
2411 if (hw->phy.get_link_info) {
2412 status = i40e_update_link_info(hw);
2414 if (status != I40E_SUCCESS)
2415 i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
2419 *link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
2425 * i40e_updatelink_status - update status of the HW network link
2426 * @hw: pointer to the hw struct
2428 enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
2430 struct i40e_aq_get_phy_abilities_resp abilities;
2431 enum i40e_status_code status = I40E_SUCCESS;
2433 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2437 status = i40e_aq_get_phy_capabilities(hw, false, false, &abilities,
2442 memcpy(hw->phy.link_info.module_type, &abilities.module_type,
2443 sizeof(hw->phy.link_info.module_type));
2449 * i40e_get_link_speed
2450 * @hw: pointer to the hw struct
2452 * Returns the link speed of the adapter.
2454 enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
2456 enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
2457 enum i40e_status_code status = I40E_SUCCESS;
2459 if (hw->phy.get_link_info) {
2460 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
2462 if (status != I40E_SUCCESS)
2463 goto i40e_link_speed_exit;
2466 speed = hw->phy.link_info.link_speed;
2468 i40e_link_speed_exit:
2473 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2474 * @hw: pointer to the hw struct
2475 * @uplink_seid: the MAC or other gizmo SEID
2476 * @downlink_seid: the VSI SEID
2477 * @enabled_tc: bitmap of TCs to be enabled
2478 * @default_port: true for default port VSI, false for control port
2479 * @enable_l2_filtering: true to add L2 filter table rules to regular forwarding rules for cloud support
2480 * @veb_seid: pointer to where to put the resulting VEB SEID
2481 * @cmd_details: pointer to command details structure or NULL
2483 * This asks the FW to add a VEB between the uplink and downlink
2484 * elements. If the uplink SEID is 0, this will be a floating VEB.
2486 enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
2487 u16 downlink_seid, u8 enabled_tc,
2488 bool default_port, bool enable_l2_filtering,
2490 struct i40e_asq_cmd_details *cmd_details)
2492 struct i40e_aq_desc desc;
2493 struct i40e_aqc_add_veb *cmd =
2494 (struct i40e_aqc_add_veb *)&desc.params.raw;
2495 struct i40e_aqc_add_veb_completion *resp =
2496 (struct i40e_aqc_add_veb_completion *)&desc.params.raw;
2497 enum i40e_status_code status;
2500 /* SEIDs need to either both be set or both be 0 for floating VEB */
2501 if (!!uplink_seid != !!downlink_seid)
2502 return I40E_ERR_PARAM;
2504 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
2506 cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
2507 cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
2508 cmd->enable_tcs = enabled_tc;
2510 veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
2512 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
2514 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
2516 if (enable_l2_filtering)
2517 veb_flags |= I40E_AQC_ADD_VEB_ENABLE_L2_FILTER;
2519 cmd->veb_flags = CPU_TO_LE16(veb_flags);
2521 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2523 if (!status && veb_seid)
2524 *veb_seid = LE16_TO_CPU(resp->veb_seid);
2530 * i40e_aq_get_veb_parameters - Retrieve VEB parameters
2531 * @hw: pointer to the hw struct
2532 * @veb_seid: the SEID of the VEB to query
2533 * @switch_id: the uplink switch id
2534 * @floating: set to true if the VEB is floating
2535 * @statistic_index: index of the stats counter block for this VEB
2536 * @vebs_used: number of VEB's used by function
2537 * @vebs_free: total VEB's not reserved by any function
2538 * @cmd_details: pointer to command details structure or NULL
2540 * This retrieves the parameters for a particular VEB, specified by
2541 * uplink_seid, and returns them to the caller.
2543 enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
2544 u16 veb_seid, u16 *switch_id,
2545 bool *floating, u16 *statistic_index,
2546 u16 *vebs_used, u16 *vebs_free,
2547 struct i40e_asq_cmd_details *cmd_details)
2549 struct i40e_aq_desc desc;
2550 struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
2551 (struct i40e_aqc_get_veb_parameters_completion *)
2553 enum i40e_status_code status;
2556 return I40E_ERR_PARAM;
2558 i40e_fill_default_direct_cmd_desc(&desc,
2559 i40e_aqc_opc_get_veb_parameters);
2560 cmd_resp->seid = CPU_TO_LE16(veb_seid);
2562 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2567 *switch_id = LE16_TO_CPU(cmd_resp->switch_id);
2568 if (statistic_index)
2569 *statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
2571 *vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
2573 *vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
2575 u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
2576 if (flags & I40E_AQC_ADD_VEB_FLOATING)
2587 * i40e_aq_add_macvlan
2588 * @hw: pointer to the hw struct
2589 * @seid: VSI for the mac address
2590 * @mv_list: list of macvlans to be added
2591 * @count: length of the list
2592 * @cmd_details: pointer to command details structure or NULL
2594 * Add MAC/VLAN addresses to the HW filtering
2596 enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
2597 struct i40e_aqc_add_macvlan_element_data *mv_list,
2598 u16 count, struct i40e_asq_cmd_details *cmd_details)
2600 struct i40e_aq_desc desc;
2601 struct i40e_aqc_macvlan *cmd =
2602 (struct i40e_aqc_macvlan *)&desc.params.raw;
2603 enum i40e_status_code status;
2606 if (count == 0 || !mv_list || !hw)
2607 return I40E_ERR_PARAM;
2609 buf_size = count * sizeof(*mv_list);
2611 /* prep the rest of the request */
2612 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
2613 cmd->num_addresses = CPU_TO_LE16(count);
2614 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2618 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2619 if (buf_size > I40E_AQ_LARGE_BUF)
2620 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2622 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2629 * i40e_aq_remove_macvlan
2630 * @hw: pointer to the hw struct
2631 * @seid: VSI for the mac address
2632 * @mv_list: list of macvlans to be removed
2633 * @count: length of the list
2634 * @cmd_details: pointer to command details structure or NULL
2636 * Remove MAC/VLAN addresses from the HW filtering
2638 enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
2639 struct i40e_aqc_remove_macvlan_element_data *mv_list,
2640 u16 count, struct i40e_asq_cmd_details *cmd_details)
2642 struct i40e_aq_desc desc;
2643 struct i40e_aqc_macvlan *cmd =
2644 (struct i40e_aqc_macvlan *)&desc.params.raw;
2645 enum i40e_status_code status;
2648 if (count == 0 || !mv_list || !hw)
2649 return I40E_ERR_PARAM;
2651 buf_size = count * sizeof(*mv_list);
2653 /* prep the rest of the request */
2654 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
2655 cmd->num_addresses = CPU_TO_LE16(count);
2656 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2660 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2661 if (buf_size > I40E_AQ_LARGE_BUF)
2662 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2664 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2671 * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
2672 * @hw: pointer to the hw struct
2673 * @seid: VSI for the vlan filters
2674 * @v_list: list of vlan filters to be added
2675 * @count: length of the list
2676 * @cmd_details: pointer to command details structure or NULL
2678 enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
2679 struct i40e_aqc_add_remove_vlan_element_data *v_list,
2680 u8 count, struct i40e_asq_cmd_details *cmd_details)
2682 struct i40e_aq_desc desc;
2683 struct i40e_aqc_macvlan *cmd =
2684 (struct i40e_aqc_macvlan *)&desc.params.raw;
2685 enum i40e_status_code status;
2688 if (count == 0 || !v_list || !hw)
2689 return I40E_ERR_PARAM;
2691 buf_size = count * sizeof(*v_list);
2693 /* prep the rest of the request */
2694 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
2695 cmd->num_addresses = CPU_TO_LE16(count);
2696 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
2700 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2701 if (buf_size > I40E_AQ_LARGE_BUF)
2702 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2704 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
2711 * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
2712 * @hw: pointer to the hw struct
2713 * @seid: VSI for the vlan filters
2714 * @v_list: list of macvlans to be removed
2715 * @count: length of the list
2716 * @cmd_details: pointer to command details structure or NULL
2718 enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
2719 struct i40e_aqc_add_remove_vlan_element_data *v_list,
2720 u8 count, struct i40e_asq_cmd_details *cmd_details)
2722 struct i40e_aq_desc desc;
2723 struct i40e_aqc_macvlan *cmd =
2724 (struct i40e_aqc_macvlan *)&desc.params.raw;
2725 enum i40e_status_code status;
2728 if (count == 0 || !v_list || !hw)
2729 return I40E_ERR_PARAM;
2731 buf_size = count * sizeof(*v_list);
2733 /* prep the rest of the request */
2734 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
2735 cmd->num_addresses = CPU_TO_LE16(count);
2736 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
2740 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2741 if (buf_size > I40E_AQ_LARGE_BUF)
2742 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2744 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
2751 * i40e_aq_send_msg_to_vf
2752 * @hw: pointer to the hardware structure
2753 * @vfid: vf id to send msg
2754 * @v_opcode: opcodes for VF-PF communication
2755 * @v_retval: return error code
2756 * @msg: pointer to the msg buffer
2757 * @msglen: msg length
2758 * @cmd_details: pointer to command details
2762 enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
2763 u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
2764 struct i40e_asq_cmd_details *cmd_details)
2766 struct i40e_aq_desc desc;
2767 struct i40e_aqc_pf_vf_message *cmd =
2768 (struct i40e_aqc_pf_vf_message *)&desc.params.raw;
2769 enum i40e_status_code status;
2771 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
2772 cmd->id = CPU_TO_LE32(vfid);
2773 desc.cookie_high = CPU_TO_LE32(v_opcode);
2774 desc.cookie_low = CPU_TO_LE32(v_retval);
2775 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
2777 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
2779 if (msglen > I40E_AQ_LARGE_BUF)
2780 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2781 desc.datalen = CPU_TO_LE16(msglen);
2783 status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
2789 * i40e_aq_debug_read_register
2790 * @hw: pointer to the hw struct
2791 * @reg_addr: register address
2792 * @reg_val: register value
2793 * @cmd_details: pointer to command details structure or NULL
2795 * Read the register using the admin queue commands
2797 enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
2798 u32 reg_addr, u64 *reg_val,
2799 struct i40e_asq_cmd_details *cmd_details)
2801 struct i40e_aq_desc desc;
2802 struct i40e_aqc_debug_reg_read_write *cmd_resp =
2803 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
2804 enum i40e_status_code status;
2806 if (reg_val == NULL)
2807 return I40E_ERR_PARAM;
2809 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_read_reg);
2811 cmd_resp->address = CPU_TO_LE32(reg_addr);
2813 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2815 if (status == I40E_SUCCESS) {
2816 *reg_val = ((u64)LE32_TO_CPU(cmd_resp->value_high) << 32) |
2817 (u64)LE32_TO_CPU(cmd_resp->value_low);
2824 * i40e_aq_debug_write_register
2825 * @hw: pointer to the hw struct
2826 * @reg_addr: register address
2827 * @reg_val: register value
2828 * @cmd_details: pointer to command details structure or NULL
2830 * Write to a register using the admin queue commands
2832 enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
2833 u32 reg_addr, u64 reg_val,
2834 struct i40e_asq_cmd_details *cmd_details)
2836 struct i40e_aq_desc desc;
2837 struct i40e_aqc_debug_reg_read_write *cmd =
2838 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
2839 enum i40e_status_code status;
2841 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
2843 cmd->address = CPU_TO_LE32(reg_addr);
2844 cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
2845 cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
2847 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2853 * i40e_aq_get_hmc_resource_profile
2854 * @hw: pointer to the hw struct
2855 * @profile: type of profile the HMC is to be set as
2856 * @pe_vf_enabled_count: the number of PE enabled VFs the system has
2857 * @cmd_details: pointer to command details structure or NULL
2859 * query the HMC profile of the device.
2861 enum i40e_status_code i40e_aq_get_hmc_resource_profile(struct i40e_hw *hw,
2862 enum i40e_aq_hmc_profile *profile,
2863 u8 *pe_vf_enabled_count,
2864 struct i40e_asq_cmd_details *cmd_details)
2866 struct i40e_aq_desc desc;
2867 struct i40e_aq_get_set_hmc_resource_profile *resp =
2868 (struct i40e_aq_get_set_hmc_resource_profile *)&desc.params.raw;
2869 enum i40e_status_code status;
2871 i40e_fill_default_direct_cmd_desc(&desc,
2872 i40e_aqc_opc_query_hmc_resource_profile);
2873 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2875 *profile = (enum i40e_aq_hmc_profile)(resp->pm_profile &
2876 I40E_AQ_GET_HMC_RESOURCE_PROFILE_PM_MASK);
2877 *pe_vf_enabled_count = resp->pe_vf_enabled &
2878 I40E_AQ_GET_HMC_RESOURCE_PROFILE_COUNT_MASK;
2884 * i40e_aq_set_hmc_resource_profile
2885 * @hw: pointer to the hw struct
2886 * @profile: type of profile the HMC is to be set as
2887 * @pe_vf_enabled_count: the number of PE enabled VFs the system has
2888 * @cmd_details: pointer to command details structure or NULL
2890 * set the HMC profile of the device.
2892 enum i40e_status_code i40e_aq_set_hmc_resource_profile(struct i40e_hw *hw,
2893 enum i40e_aq_hmc_profile profile,
2894 u8 pe_vf_enabled_count,
2895 struct i40e_asq_cmd_details *cmd_details)
2897 struct i40e_aq_desc desc;
2898 struct i40e_aq_get_set_hmc_resource_profile *cmd =
2899 (struct i40e_aq_get_set_hmc_resource_profile *)&desc.params.raw;
2900 enum i40e_status_code status;
2902 i40e_fill_default_direct_cmd_desc(&desc,
2903 i40e_aqc_opc_set_hmc_resource_profile);
2905 cmd->pm_profile = (u8)profile;
2906 cmd->pe_vf_enabled = pe_vf_enabled_count;
2908 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2914 * i40e_aq_request_resource
2915 * @hw: pointer to the hw struct
2916 * @resource: resource id
2917 * @access: access type
2918 * @sdp_number: resource number
2919 * @timeout: the maximum time in ms that the driver may hold the resource
2920 * @cmd_details: pointer to command details structure or NULL
2922 * requests common resource using the admin queue commands
2924 enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
2925 enum i40e_aq_resources_ids resource,
2926 enum i40e_aq_resource_access_type access,
2927 u8 sdp_number, u64 *timeout,
2928 struct i40e_asq_cmd_details *cmd_details)
2930 struct i40e_aq_desc desc;
2931 struct i40e_aqc_request_resource *cmd_resp =
2932 (struct i40e_aqc_request_resource *)&desc.params.raw;
2933 enum i40e_status_code status;
2935 DEBUGFUNC("i40e_aq_request_resource");
2937 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
2939 cmd_resp->resource_id = CPU_TO_LE16(resource);
2940 cmd_resp->access_type = CPU_TO_LE16(access);
2941 cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
2943 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2944 /* The completion specifies the maximum time in ms that the driver
2945 * may hold the resource in the Timeout field.
2946 * If the resource is held by someone else, the command completes with
2947 * busy return value and the timeout field indicates the maximum time
2948 * the current owner of the resource has to free it.
2950 if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
2951 *timeout = LE32_TO_CPU(cmd_resp->timeout);
2957 * i40e_aq_release_resource
2958 * @hw: pointer to the hw struct
2959 * @resource: resource id
2960 * @sdp_number: resource number
2961 * @cmd_details: pointer to command details structure or NULL
2963 * release common resource using the admin queue commands
2965 enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
2966 enum i40e_aq_resources_ids resource,
2968 struct i40e_asq_cmd_details *cmd_details)
2970 struct i40e_aq_desc desc;
2971 struct i40e_aqc_request_resource *cmd =
2972 (struct i40e_aqc_request_resource *)&desc.params.raw;
2973 enum i40e_status_code status;
2975 DEBUGFUNC("i40e_aq_release_resource");
2977 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
2979 cmd->resource_id = CPU_TO_LE16(resource);
2980 cmd->resource_number = CPU_TO_LE32(sdp_number);
2982 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2989 * @hw: pointer to the hw struct
2990 * @module_pointer: module pointer location in words from the NVM beginning
2991 * @offset: byte offset from the module beginning
2992 * @length: length of the section to be read (in bytes from the offset)
2993 * @data: command buffer (size [bytes] = length)
2994 * @last_command: tells if this is the last command in a series
2995 * @cmd_details: pointer to command details structure or NULL
2997 * Read the NVM using the admin queue commands
2999 enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
3000 u32 offset, u16 length, void *data,
3002 struct i40e_asq_cmd_details *cmd_details)
3004 struct i40e_aq_desc desc;
3005 struct i40e_aqc_nvm_update *cmd =
3006 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3007 enum i40e_status_code status;
3009 DEBUGFUNC("i40e_aq_read_nvm");
3011 /* In offset the highest byte must be zeroed. */
3012 if (offset & 0xFF000000) {
3013 status = I40E_ERR_PARAM;
3014 goto i40e_aq_read_nvm_exit;
3017 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
3019 /* If this is the last command in a series, set the proper flag. */
3021 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3022 cmd->module_pointer = module_pointer;
3023 cmd->offset = CPU_TO_LE32(offset);
3024 cmd->length = CPU_TO_LE16(length);
3026 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3027 if (length > I40E_AQ_LARGE_BUF)
3028 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3030 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3032 i40e_aq_read_nvm_exit:
3037 * i40e_aq_read_nvm_config - read an nvm config block
3038 * @hw: pointer to the hw struct
3039 * @cmd_flags: NVM access admin command bits
3040 * @field_id: field or feature id
3041 * @data: buffer for result
3042 * @buf_size: buffer size
3043 * @element_count: pointer to count of elements read by FW
3044 * @cmd_details: pointer to command details structure or NULL
3046 enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
3047 u8 cmd_flags, u32 field_id, void *data,
3048 u16 buf_size, u16 *element_count,
3049 struct i40e_asq_cmd_details *cmd_details)
3051 struct i40e_aq_desc desc;
3052 struct i40e_aqc_nvm_config_read *cmd =
3053 (struct i40e_aqc_nvm_config_read *)&desc.params.raw;
3054 enum i40e_status_code status;
3056 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_read);
3057 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF));
3058 if (buf_size > I40E_AQ_LARGE_BUF)
3059 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3061 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3062 cmd->element_id = CPU_TO_LE16((u16)(0xffff & field_id));
3063 if (cmd_flags & I40E_AQ_ANVM_FEATURE_OR_IMMEDIATE_MASK)
3064 cmd->element_id_msw = CPU_TO_LE16((u16)(field_id >> 16));
3066 cmd->element_id_msw = 0;
3068 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3070 if (!status && element_count)
3071 *element_count = LE16_TO_CPU(cmd->element_count);
3077 * i40e_aq_write_nvm_config - write an nvm config block
3078 * @hw: pointer to the hw struct
3079 * @cmd_flags: NVM access admin command bits
3080 * @data: buffer for result
3081 * @buf_size: buffer size
3082 * @element_count: count of elements to be written
3083 * @cmd_details: pointer to command details structure or NULL
3085 enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
3086 u8 cmd_flags, void *data, u16 buf_size,
3088 struct i40e_asq_cmd_details *cmd_details)
3090 struct i40e_aq_desc desc;
3091 struct i40e_aqc_nvm_config_write *cmd =
3092 (struct i40e_aqc_nvm_config_write *)&desc.params.raw;
3093 enum i40e_status_code status;
3095 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_write);
3096 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3097 if (buf_size > I40E_AQ_LARGE_BUF)
3098 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3100 cmd->element_count = CPU_TO_LE16(element_count);
3101 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3102 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3108 * i40e_aq_oem_post_update - triggers an OEM specific flow after update
3109 * @hw: pointer to the hw struct
3110 * @cmd_details: pointer to command details structure or NULL
3112 enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
3113 void *buff, u16 buff_size,
3114 struct i40e_asq_cmd_details *cmd_details)
3116 struct i40e_aq_desc desc;
3117 enum i40e_status_code status;
3119 UNREFERENCED_2PARAMETER(buff, buff_size);
3121 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_oem_post_update);
3122 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3123 if (status && LE16_TO_CPU(desc.retval) == I40E_AQ_RC_ESRCH)
3124 status = I40E_ERR_NOT_IMPLEMENTED;
3131 * @hw: pointer to the hw struct
3132 * @module_pointer: module pointer location in words from the NVM beginning
3133 * @offset: offset in the module (expressed in 4 KB from module's beginning)
3134 * @length: length of the section to be erased (expressed in 4 KB)
3135 * @last_command: tells if this is the last command in a series
3136 * @cmd_details: pointer to command details structure or NULL
3138 * Erase the NVM sector using the admin queue commands
3140 enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
3141 u32 offset, u16 length, bool last_command,
3142 struct i40e_asq_cmd_details *cmd_details)
3144 struct i40e_aq_desc desc;
3145 struct i40e_aqc_nvm_update *cmd =
3146 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3147 enum i40e_status_code status;
3149 DEBUGFUNC("i40e_aq_erase_nvm");
3151 /* In offset the highest byte must be zeroed. */
3152 if (offset & 0xFF000000) {
3153 status = I40E_ERR_PARAM;
3154 goto i40e_aq_erase_nvm_exit;
3157 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
3159 /* If this is the last command in a series, set the proper flag. */
3161 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3162 cmd->module_pointer = module_pointer;
3163 cmd->offset = CPU_TO_LE32(offset);
3164 cmd->length = CPU_TO_LE16(length);
3166 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3168 i40e_aq_erase_nvm_exit:
3172 #define I40E_DEV_FUNC_CAP_SWITCH_MODE 0x01
3173 #define I40E_DEV_FUNC_CAP_MGMT_MODE 0x02
3174 #define I40E_DEV_FUNC_CAP_NPAR 0x03
3175 #define I40E_DEV_FUNC_CAP_OS2BMC 0x04
3176 #define I40E_DEV_FUNC_CAP_VALID_FUNC 0x05
3177 #define I40E_DEV_FUNC_CAP_SRIOV_1_1 0x12
3178 #define I40E_DEV_FUNC_CAP_VF 0x13
3179 #define I40E_DEV_FUNC_CAP_VMDQ 0x14
3180 #define I40E_DEV_FUNC_CAP_802_1_QBG 0x15
3181 #define I40E_DEV_FUNC_CAP_802_1_QBH 0x16
3182 #define I40E_DEV_FUNC_CAP_VSI 0x17
3183 #define I40E_DEV_FUNC_CAP_DCB 0x18
3184 #define I40E_DEV_FUNC_CAP_FCOE 0x21
3185 #define I40E_DEV_FUNC_CAP_ISCSI 0x22
3186 #define I40E_DEV_FUNC_CAP_RSS 0x40
3187 #define I40E_DEV_FUNC_CAP_RX_QUEUES 0x41
3188 #define I40E_DEV_FUNC_CAP_TX_QUEUES 0x42
3189 #define I40E_DEV_FUNC_CAP_MSIX 0x43
3190 #define I40E_DEV_FUNC_CAP_MSIX_VF 0x44
3191 #define I40E_DEV_FUNC_CAP_FLOW_DIRECTOR 0x45
3192 #define I40E_DEV_FUNC_CAP_IEEE_1588 0x46
3193 #define I40E_DEV_FUNC_CAP_FLEX10 0xF1
3194 #define I40E_DEV_FUNC_CAP_CEM 0xF2
3195 #define I40E_DEV_FUNC_CAP_IWARP 0x51
3196 #define I40E_DEV_FUNC_CAP_LED 0x61
3197 #define I40E_DEV_FUNC_CAP_SDP 0x62
3198 #define I40E_DEV_FUNC_CAP_MDIO 0x63
3201 * i40e_parse_discover_capabilities
3202 * @hw: pointer to the hw struct
3203 * @buff: pointer to a buffer containing device/function capability records
3204 * @cap_count: number of capability records in the list
3205 * @list_type_opc: type of capabilities list to parse
3207 * Parse the device/function capabilities list.
3209 STATIC void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
3211 enum i40e_admin_queue_opc list_type_opc)
3213 struct i40e_aqc_list_capabilities_element_resp *cap;
3214 u32 valid_functions, num_functions;
3215 u32 number, logical_id, phys_id;
3216 struct i40e_hw_capabilities *p;
3221 cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
3223 if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
3224 p = (struct i40e_hw_capabilities *)&hw->dev_caps;
3225 else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
3226 p = (struct i40e_hw_capabilities *)&hw->func_caps;
3230 for (i = 0; i < cap_count; i++, cap++) {
3231 id = LE16_TO_CPU(cap->id);
3232 number = LE32_TO_CPU(cap->number);
3233 logical_id = LE32_TO_CPU(cap->logical_id);
3234 phys_id = LE32_TO_CPU(cap->phys_id);
3235 major_rev = cap->major_rev;
3238 case I40E_DEV_FUNC_CAP_SWITCH_MODE:
3239 p->switch_mode = number;
3241 case I40E_DEV_FUNC_CAP_MGMT_MODE:
3242 p->management_mode = number;
3244 case I40E_DEV_FUNC_CAP_NPAR:
3245 p->npar_enable = number;
3247 case I40E_DEV_FUNC_CAP_OS2BMC:
3250 case I40E_DEV_FUNC_CAP_VALID_FUNC:
3251 p->valid_functions = number;
3253 case I40E_DEV_FUNC_CAP_SRIOV_1_1:
3255 p->sr_iov_1_1 = true;
3257 case I40E_DEV_FUNC_CAP_VF:
3258 p->num_vfs = number;
3259 p->vf_base_id = logical_id;
3261 case I40E_DEV_FUNC_CAP_VMDQ:
3265 case I40E_DEV_FUNC_CAP_802_1_QBG:
3267 p->evb_802_1_qbg = true;
3269 case I40E_DEV_FUNC_CAP_802_1_QBH:
3271 p->evb_802_1_qbh = true;
3273 case I40E_DEV_FUNC_CAP_VSI:
3274 p->num_vsis = number;
3276 case I40E_DEV_FUNC_CAP_DCB:
3279 p->enabled_tcmap = logical_id;
3283 case I40E_DEV_FUNC_CAP_FCOE:
3287 case I40E_DEV_FUNC_CAP_ISCSI:
3291 case I40E_DEV_FUNC_CAP_RSS:
3293 p->rss_table_size = number;
3294 p->rss_table_entry_width = logical_id;
3296 case I40E_DEV_FUNC_CAP_RX_QUEUES:
3297 p->num_rx_qp = number;
3298 p->base_queue = phys_id;
3300 case I40E_DEV_FUNC_CAP_TX_QUEUES:
3301 p->num_tx_qp = number;
3302 p->base_queue = phys_id;
3304 case I40E_DEV_FUNC_CAP_MSIX:
3305 p->num_msix_vectors = number;
3307 case I40E_DEV_FUNC_CAP_MSIX_VF:
3308 p->num_msix_vectors_vf = number;
3310 case I40E_DEV_FUNC_CAP_FLEX10:
3311 if (major_rev == 1) {
3313 p->flex10_enable = true;
3314 p->flex10_capable = true;
3317 /* Capability revision >= 2 */
3319 p->flex10_enable = true;
3321 p->flex10_capable = true;
3323 p->flex10_mode = logical_id;
3324 p->flex10_status = phys_id;
3326 case I40E_DEV_FUNC_CAP_CEM:
3330 case I40E_DEV_FUNC_CAP_IWARP:
3334 case I40E_DEV_FUNC_CAP_LED:
3335 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3336 p->led[phys_id] = true;
3338 case I40E_DEV_FUNC_CAP_SDP:
3339 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3340 p->sdp[phys_id] = true;
3342 case I40E_DEV_FUNC_CAP_MDIO:
3344 p->mdio_port_num = phys_id;
3345 p->mdio_port_mode = logical_id;
3348 case I40E_DEV_FUNC_CAP_IEEE_1588:
3350 p->ieee_1588 = true;
3352 case I40E_DEV_FUNC_CAP_FLOW_DIRECTOR:
3354 p->fd_filters_guaranteed = number;
3355 p->fd_filters_best_effort = logical_id;
3363 i40e_debug(hw, I40E_DEBUG_ALL, "device is FCoE capable\n");
3365 #ifdef I40E_FCOE_ENA
3366 /* Software override ensuring FCoE is disabled if npar or mfp
3367 * mode because it is not supported in these modes.
3369 if (p->npar_enable || p->flex10_enable)
3372 /* Always disable FCoE if compiled without the I40E_FCOE_ENA flag */
3376 /* count the enabled ports (aka the "not disabled" ports) */
3378 for (i = 0; i < 4; i++) {
3379 u32 port_cfg_reg = I40E_PRTGEN_CNF + (4 * i);
3382 /* use AQ read to get the physical register offset instead
3383 * of the port relative offset
3385 i40e_aq_debug_read_register(hw, port_cfg_reg, &port_cfg, NULL);
3386 if (!(port_cfg & I40E_PRTGEN_CNF_PORT_DIS_MASK))
3390 valid_functions = p->valid_functions;
3392 while (valid_functions) {
3393 if (valid_functions & 1)
3395 valid_functions >>= 1;
3398 /* partition id is 1-based, and functions are evenly spread
3399 * across the ports as partitions
3401 hw->partition_id = (hw->pf_id / hw->num_ports) + 1;
3402 hw->num_partitions = num_functions / hw->num_ports;
3404 /* additional HW specific goodies that might
3405 * someday be HW version specific
3407 p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
3411 * i40e_aq_discover_capabilities
3412 * @hw: pointer to the hw struct
3413 * @buff: a virtual buffer to hold the capabilities
3414 * @buff_size: Size of the virtual buffer
3415 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
3416 * @list_type_opc: capabilities type to discover - pass in the command opcode
3417 * @cmd_details: pointer to command details structure or NULL
3419 * Get the device capabilities descriptions from the firmware
3421 enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
3422 void *buff, u16 buff_size, u16 *data_size,
3423 enum i40e_admin_queue_opc list_type_opc,
3424 struct i40e_asq_cmd_details *cmd_details)
3426 struct i40e_aqc_list_capabilites *cmd;
3427 struct i40e_aq_desc desc;
3428 enum i40e_status_code status = I40E_SUCCESS;
3430 cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
3432 if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
3433 list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
3434 status = I40E_ERR_PARAM;
3438 i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
3440 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3441 if (buff_size > I40E_AQ_LARGE_BUF)
3442 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3444 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3445 *data_size = LE16_TO_CPU(desc.datalen);
3450 i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
3458 * i40e_aq_update_nvm
3459 * @hw: pointer to the hw struct
3460 * @module_pointer: module pointer location in words from the NVM beginning
3461 * @offset: byte offset from the module beginning
3462 * @length: length of the section to be written (in bytes from the offset)
3463 * @data: command buffer (size [bytes] = length)
3464 * @last_command: tells if this is the last command in a series
3465 * @cmd_details: pointer to command details structure or NULL
3467 * Update the NVM using the admin queue commands
3469 enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
3470 u32 offset, u16 length, void *data,
3472 struct i40e_asq_cmd_details *cmd_details)
3474 struct i40e_aq_desc desc;
3475 struct i40e_aqc_nvm_update *cmd =
3476 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3477 enum i40e_status_code status;
3479 DEBUGFUNC("i40e_aq_update_nvm");
3481 /* In offset the highest byte must be zeroed. */
3482 if (offset & 0xFF000000) {
3483 status = I40E_ERR_PARAM;
3484 goto i40e_aq_update_nvm_exit;
3487 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
3489 /* If this is the last command in a series, set the proper flag. */
3491 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3492 cmd->module_pointer = module_pointer;
3493 cmd->offset = CPU_TO_LE32(offset);
3494 cmd->length = CPU_TO_LE16(length);
3496 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3497 if (length > I40E_AQ_LARGE_BUF)
3498 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3500 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3502 i40e_aq_update_nvm_exit:
3507 * i40e_aq_get_lldp_mib
3508 * @hw: pointer to the hw struct
3509 * @bridge_type: type of bridge requested
3510 * @mib_type: Local, Remote or both Local and Remote MIBs
3511 * @buff: pointer to a user supplied buffer to store the MIB block
3512 * @buff_size: size of the buffer (in bytes)
3513 * @local_len : length of the returned Local LLDP MIB
3514 * @remote_len: length of the returned Remote LLDP MIB
3515 * @cmd_details: pointer to command details structure or NULL
3517 * Requests the complete LLDP MIB (entire packet).
3519 enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
3520 u8 mib_type, void *buff, u16 buff_size,
3521 u16 *local_len, u16 *remote_len,
3522 struct i40e_asq_cmd_details *cmd_details)
3524 struct i40e_aq_desc desc;
3525 struct i40e_aqc_lldp_get_mib *cmd =
3526 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
3527 struct i40e_aqc_lldp_get_mib *resp =
3528 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
3529 enum i40e_status_code status;
3531 if (buff_size == 0 || !buff)
3532 return I40E_ERR_PARAM;
3534 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
3535 /* Indirect Command */
3536 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3538 cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
3539 cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3540 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3542 desc.datalen = CPU_TO_LE16(buff_size);
3544 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3545 if (buff_size > I40E_AQ_LARGE_BUF)
3546 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3548 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3550 if (local_len != NULL)
3551 *local_len = LE16_TO_CPU(resp->local_len);
3552 if (remote_len != NULL)
3553 *remote_len = LE16_TO_CPU(resp->remote_len);
3560 * i40e_aq_set_lldp_mib - Set the LLDP MIB
3561 * @hw: pointer to the hw struct
3562 * @mib_type: Local, Remote or both Local and Remote MIBs
3563 * @buff: pointer to a user supplied buffer to store the MIB block
3564 * @buff_size: size of the buffer (in bytes)
3565 * @cmd_details: pointer to command details structure or NULL
3569 enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
3570 u8 mib_type, void *buff, u16 buff_size,
3571 struct i40e_asq_cmd_details *cmd_details)
3573 struct i40e_aq_desc desc;
3574 struct i40e_aqc_lldp_set_local_mib *cmd =
3575 (struct i40e_aqc_lldp_set_local_mib *)&desc.params.raw;
3576 enum i40e_status_code status;
3578 if (buff_size == 0 || !buff)
3579 return I40E_ERR_PARAM;
3581 i40e_fill_default_direct_cmd_desc(&desc,
3582 i40e_aqc_opc_lldp_set_local_mib);
3583 /* Indirect Command */
3584 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3585 if (buff_size > I40E_AQ_LARGE_BUF)
3586 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3587 desc.datalen = CPU_TO_LE16(buff_size);
3589 cmd->type = mib_type;
3590 cmd->length = CPU_TO_LE16(buff_size);
3591 cmd->address_high = CPU_TO_LE32(I40E_HI_WORD((u64)buff));
3592 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buff));
3594 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3599 * i40e_aq_cfg_lldp_mib_change_event
3600 * @hw: pointer to the hw struct
3601 * @enable_update: Enable or Disable event posting
3602 * @cmd_details: pointer to command details structure or NULL
3604 * Enable or Disable posting of an event on ARQ when LLDP MIB
3605 * associated with the interface changes
3607 enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
3609 struct i40e_asq_cmd_details *cmd_details)
3611 struct i40e_aq_desc desc;
3612 struct i40e_aqc_lldp_update_mib *cmd =
3613 (struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
3614 enum i40e_status_code status;
3616 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
3619 cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
3621 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3627 * i40e_aq_add_lldp_tlv
3628 * @hw: pointer to the hw struct
3629 * @bridge_type: type of bridge
3630 * @buff: buffer with TLV to add
3631 * @buff_size: length of the buffer
3632 * @tlv_len: length of the TLV to be added
3633 * @mib_len: length of the LLDP MIB returned in response
3634 * @cmd_details: pointer to command details structure or NULL
3636 * Add the specified TLV to LLDP Local MIB for the given bridge type,
3637 * it is responsibility of the caller to make sure that the TLV is not
3638 * already present in the LLDPDU.
3639 * In return firmware will write the complete LLDP MIB with the newly
3640 * added TLV in the response buffer.
3642 enum i40e_status_code i40e_aq_add_lldp_tlv(struct i40e_hw *hw, u8 bridge_type,
3643 void *buff, u16 buff_size, u16 tlv_len,
3645 struct i40e_asq_cmd_details *cmd_details)
3647 struct i40e_aq_desc desc;
3648 struct i40e_aqc_lldp_add_tlv *cmd =
3649 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
3650 enum i40e_status_code status;
3652 if (buff_size == 0 || !buff || tlv_len == 0)
3653 return I40E_ERR_PARAM;
3655 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_add_tlv);
3657 /* Indirect Command */
3658 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3659 if (buff_size > I40E_AQ_LARGE_BUF)
3660 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3661 desc.datalen = CPU_TO_LE16(buff_size);
3663 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3664 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3665 cmd->len = CPU_TO_LE16(tlv_len);
3667 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3669 if (mib_len != NULL)
3670 *mib_len = LE16_TO_CPU(desc.datalen);
3677 * i40e_aq_update_lldp_tlv
3678 * @hw: pointer to the hw struct
3679 * @bridge_type: type of bridge
3680 * @buff: buffer with TLV to update
3681 * @buff_size: size of the buffer holding original and updated TLVs
3682 * @old_len: Length of the Original TLV
3683 * @new_len: Length of the Updated TLV
3684 * @offset: offset of the updated TLV in the buff
3685 * @mib_len: length of the returned LLDP MIB
3686 * @cmd_details: pointer to command details structure or NULL
3688 * Update the specified TLV to the LLDP Local MIB for the given bridge type.
3689 * Firmware will place the complete LLDP MIB in response buffer with the
3692 enum i40e_status_code i40e_aq_update_lldp_tlv(struct i40e_hw *hw,
3693 u8 bridge_type, void *buff, u16 buff_size,
3694 u16 old_len, u16 new_len, u16 offset,
3696 struct i40e_asq_cmd_details *cmd_details)
3698 struct i40e_aq_desc desc;
3699 struct i40e_aqc_lldp_update_tlv *cmd =
3700 (struct i40e_aqc_lldp_update_tlv *)&desc.params.raw;
3701 enum i40e_status_code status;
3703 if (buff_size == 0 || !buff || offset == 0 ||
3704 old_len == 0 || new_len == 0)
3705 return I40E_ERR_PARAM;
3707 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_tlv);
3709 /* Indirect Command */
3710 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3711 if (buff_size > I40E_AQ_LARGE_BUF)
3712 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3713 desc.datalen = CPU_TO_LE16(buff_size);
3715 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3716 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3717 cmd->old_len = CPU_TO_LE16(old_len);
3718 cmd->new_offset = CPU_TO_LE16(offset);
3719 cmd->new_len = CPU_TO_LE16(new_len);
3721 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3723 if (mib_len != NULL)
3724 *mib_len = LE16_TO_CPU(desc.datalen);
3731 * i40e_aq_delete_lldp_tlv
3732 * @hw: pointer to the hw struct
3733 * @bridge_type: type of bridge
3734 * @buff: pointer to a user supplied buffer that has the TLV
3735 * @buff_size: length of the buffer
3736 * @tlv_len: length of the TLV to be deleted
3737 * @mib_len: length of the returned LLDP MIB
3738 * @cmd_details: pointer to command details structure or NULL
3740 * Delete the specified TLV from LLDP Local MIB for the given bridge type.
3741 * The firmware places the entire LLDP MIB in the response buffer.
3743 enum i40e_status_code i40e_aq_delete_lldp_tlv(struct i40e_hw *hw,
3744 u8 bridge_type, void *buff, u16 buff_size,
3745 u16 tlv_len, u16 *mib_len,
3746 struct i40e_asq_cmd_details *cmd_details)
3748 struct i40e_aq_desc desc;
3749 struct i40e_aqc_lldp_add_tlv *cmd =
3750 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
3751 enum i40e_status_code status;
3753 if (buff_size == 0 || !buff)
3754 return I40E_ERR_PARAM;
3756 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_delete_tlv);
3758 /* Indirect Command */
3759 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3760 if (buff_size > I40E_AQ_LARGE_BUF)
3761 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3762 desc.datalen = CPU_TO_LE16(buff_size);
3763 cmd->len = CPU_TO_LE16(tlv_len);
3764 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3765 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3767 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3769 if (mib_len != NULL)
3770 *mib_len = LE16_TO_CPU(desc.datalen);
3778 * @hw: pointer to the hw struct
3779 * @shutdown_agent: True if LLDP Agent needs to be Shutdown
3780 * @cmd_details: pointer to command details structure or NULL
3782 * Stop or Shutdown the embedded LLDP Agent
3784 enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
3785 struct i40e_asq_cmd_details *cmd_details)
3787 struct i40e_aq_desc desc;
3788 struct i40e_aqc_lldp_stop *cmd =
3789 (struct i40e_aqc_lldp_stop *)&desc.params.raw;
3790 enum i40e_status_code status;
3792 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
3795 cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
3797 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3803 * i40e_aq_start_lldp
3804 * @hw: pointer to the hw struct
3805 * @cmd_details: pointer to command details structure or NULL
3807 * Start the embedded LLDP Agent on all ports.
3809 enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
3810 struct i40e_asq_cmd_details *cmd_details)
3812 struct i40e_aq_desc desc;
3813 struct i40e_aqc_lldp_start *cmd =
3814 (struct i40e_aqc_lldp_start *)&desc.params.raw;
3815 enum i40e_status_code status;
3817 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
3819 cmd->command = I40E_AQ_LLDP_AGENT_START;
3821 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3827 * i40e_aq_get_cee_dcb_config
3828 * @hw: pointer to the hw struct
3829 * @buff: response buffer that stores CEE operational configuration
3830 * @buff_size: size of the buffer passed
3831 * @cmd_details: pointer to command details structure or NULL
3833 * Get CEE DCBX mode operational configuration from firmware
3835 enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
3836 void *buff, u16 buff_size,
3837 struct i40e_asq_cmd_details *cmd_details)
3839 struct i40e_aq_desc desc;
3840 enum i40e_status_code status;
3842 if (buff_size == 0 || !buff)
3843 return I40E_ERR_PARAM;
3845 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_cee_dcb_cfg);
3847 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3848 status = i40e_asq_send_command(hw, &desc, (void *)buff, buff_size,
3855 * i40e_aq_start_stop_dcbx - Start/Stop DCBx service in FW
3856 * @hw: pointer to the hw struct
3857 * @start_agent: True if DCBx Agent needs to be Started
3858 * False if DCBx Agent needs to be Stopped
3859 * @cmd_details: pointer to command details structure or NULL
3861 * Start/Stop the embedded dcbx Agent
3863 enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
3865 struct i40e_asq_cmd_details *cmd_details)
3867 struct i40e_aq_desc desc;
3868 struct i40e_aqc_lldp_stop_start_specific_agent *cmd =
3869 (struct i40e_aqc_lldp_stop_start_specific_agent *)
3871 enum i40e_status_code status;
3873 i40e_fill_default_direct_cmd_desc(&desc,
3874 i40e_aqc_opc_lldp_stop_start_spec_agent);
3877 cmd->command = I40E_AQC_START_SPECIFIC_AGENT_MASK;
3879 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3885 * i40e_aq_add_udp_tunnel
3886 * @hw: pointer to the hw struct
3887 * @udp_port: the UDP port to add
3888 * @header_len: length of the tunneling header length in DWords
3889 * @protocol_index: protocol index type
3890 * @filter_index: pointer to filter index
3891 * @cmd_details: pointer to command details structure or NULL
3893 enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
3894 u16 udp_port, u8 protocol_index,
3896 struct i40e_asq_cmd_details *cmd_details)
3898 struct i40e_aq_desc desc;
3899 struct i40e_aqc_add_udp_tunnel *cmd =
3900 (struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
3901 struct i40e_aqc_del_udp_tunnel_completion *resp =
3902 (struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
3903 enum i40e_status_code status;
3905 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
3907 cmd->udp_port = CPU_TO_LE16(udp_port);
3908 cmd->protocol_type = protocol_index;
3910 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3912 if (!status && filter_index)
3913 *filter_index = resp->index;
3919 * i40e_aq_del_udp_tunnel
3920 * @hw: pointer to the hw struct
3921 * @index: filter index
3922 * @cmd_details: pointer to command details structure or NULL
3924 enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
3925 struct i40e_asq_cmd_details *cmd_details)
3927 struct i40e_aq_desc desc;
3928 struct i40e_aqc_remove_udp_tunnel *cmd =
3929 (struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
3930 enum i40e_status_code status;
3932 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
3936 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3942 * i40e_aq_get_switch_resource_alloc (0x0204)
3943 * @hw: pointer to the hw struct
3944 * @num_entries: pointer to u8 to store the number of resource entries returned
3945 * @buf: pointer to a user supplied buffer. This buffer must be large enough
3946 * to store the resource information for all resource types. Each
3947 * resource type is a i40e_aqc_switch_resource_alloc_data structure.
3948 * @count: size, in bytes, of the buffer provided
3949 * @cmd_details: pointer to command details structure or NULL
3951 * Query the resources allocated to a function.
3953 enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
3955 struct i40e_aqc_switch_resource_alloc_element_resp *buf,
3957 struct i40e_asq_cmd_details *cmd_details)
3959 struct i40e_aq_desc desc;
3960 struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
3961 (struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
3962 enum i40e_status_code status;
3963 u16 length = count * sizeof(*buf);
3965 i40e_fill_default_direct_cmd_desc(&desc,
3966 i40e_aqc_opc_get_switch_resource_alloc);
3968 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3969 if (length > I40E_AQ_LARGE_BUF)
3970 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3972 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
3974 if (!status && num_entries)
3975 *num_entries = cmd_resp->num_entries;
3981 * i40e_aq_delete_element - Delete switch element
3982 * @hw: pointer to the hw struct
3983 * @seid: the SEID to delete from the switch
3984 * @cmd_details: pointer to command details structure or NULL
3986 * This deletes a switch element from the switch.
3988 enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
3989 struct i40e_asq_cmd_details *cmd_details)
3991 struct i40e_aq_desc desc;
3992 struct i40e_aqc_switch_seid *cmd =
3993 (struct i40e_aqc_switch_seid *)&desc.params.raw;
3994 enum i40e_status_code status;
3997 return I40E_ERR_PARAM;
3999 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
4001 cmd->seid = CPU_TO_LE16(seid);
4003 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4009 * i40_aq_add_pvirt - Instantiate a Port Virtualizer on a port
4010 * @hw: pointer to the hw struct
4011 * @flags: component flags
4012 * @mac_seid: uplink seid (MAC SEID)
4013 * @vsi_seid: connected vsi seid
4014 * @ret_seid: seid of create pv component
4016 * This instantiates an i40e port virtualizer with specified flags.
4017 * Depending on specified flags the port virtualizer can act as a
4018 * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
4020 enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
4021 u16 mac_seid, u16 vsi_seid,
4024 struct i40e_aq_desc desc;
4025 struct i40e_aqc_add_update_pv *cmd =
4026 (struct i40e_aqc_add_update_pv *)&desc.params.raw;
4027 struct i40e_aqc_add_update_pv_completion *resp =
4028 (struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
4029 enum i40e_status_code status;
4032 return I40E_ERR_PARAM;
4034 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
4035 cmd->command_flags = CPU_TO_LE16(flags);
4036 cmd->uplink_seid = CPU_TO_LE16(mac_seid);
4037 cmd->connected_seid = CPU_TO_LE16(vsi_seid);
4039 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4040 if (!status && ret_seid)
4041 *ret_seid = LE16_TO_CPU(resp->pv_seid);
4047 * i40e_aq_add_tag - Add an S/E-tag
4048 * @hw: pointer to the hw struct
4049 * @direct_to_queue: should s-tag direct flow to a specific queue
4050 * @vsi_seid: VSI SEID to use this tag
4051 * @tag: value of the tag
4052 * @queue_num: queue number, only valid is direct_to_queue is true
4053 * @tags_used: return value, number of tags in use by this PF
4054 * @tags_free: return value, number of unallocated tags
4055 * @cmd_details: pointer to command details structure or NULL
4057 * This associates an S- or E-tag to a VSI in the switch complex. It returns
4058 * the number of tags allocated by the PF, and the number of unallocated
4061 enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
4062 u16 vsi_seid, u16 tag, u16 queue_num,
4063 u16 *tags_used, u16 *tags_free,
4064 struct i40e_asq_cmd_details *cmd_details)
4066 struct i40e_aq_desc desc;
4067 struct i40e_aqc_add_tag *cmd =
4068 (struct i40e_aqc_add_tag *)&desc.params.raw;
4069 struct i40e_aqc_add_remove_tag_completion *resp =
4070 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4071 enum i40e_status_code status;
4074 return I40E_ERR_PARAM;
4076 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
4078 cmd->seid = CPU_TO_LE16(vsi_seid);
4079 cmd->tag = CPU_TO_LE16(tag);
4080 if (direct_to_queue) {
4081 cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
4082 cmd->queue_number = CPU_TO_LE16(queue_num);
4085 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4088 if (tags_used != NULL)
4089 *tags_used = LE16_TO_CPU(resp->tags_used);
4090 if (tags_free != NULL)
4091 *tags_free = LE16_TO_CPU(resp->tags_free);
4098 * i40e_aq_remove_tag - Remove an S- or E-tag
4099 * @hw: pointer to the hw struct
4100 * @vsi_seid: VSI SEID this tag is associated with
4101 * @tag: value of the S-tag to delete
4102 * @tags_used: return value, number of tags in use by this PF
4103 * @tags_free: return value, number of unallocated tags
4104 * @cmd_details: pointer to command details structure or NULL
4106 * This deletes an S- or E-tag from a VSI in the switch complex. It returns
4107 * the number of tags allocated by the PF, and the number of unallocated
4110 enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
4111 u16 tag, u16 *tags_used, u16 *tags_free,
4112 struct i40e_asq_cmd_details *cmd_details)
4114 struct i40e_aq_desc desc;
4115 struct i40e_aqc_remove_tag *cmd =
4116 (struct i40e_aqc_remove_tag *)&desc.params.raw;
4117 struct i40e_aqc_add_remove_tag_completion *resp =
4118 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4119 enum i40e_status_code status;
4122 return I40E_ERR_PARAM;
4124 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
4126 cmd->seid = CPU_TO_LE16(vsi_seid);
4127 cmd->tag = CPU_TO_LE16(tag);
4129 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4132 if (tags_used != NULL)
4133 *tags_used = LE16_TO_CPU(resp->tags_used);
4134 if (tags_free != NULL)
4135 *tags_free = LE16_TO_CPU(resp->tags_free);
4142 * i40e_aq_add_mcast_etag - Add a multicast E-tag
4143 * @hw: pointer to the hw struct
4144 * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
4145 * @etag: value of E-tag to add
4146 * @num_tags_in_buf: number of unicast E-tags in indirect buffer
4147 * @buf: address of indirect buffer
4148 * @tags_used: return value, number of E-tags in use by this port
4149 * @tags_free: return value, number of unallocated M-tags
4150 * @cmd_details: pointer to command details structure or NULL
4152 * This associates a multicast E-tag to a port virtualizer. It will return
4153 * the number of tags allocated by the PF, and the number of unallocated
4156 * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
4157 * num_tags_in_buf long.
4159 enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4160 u16 etag, u8 num_tags_in_buf, void *buf,
4161 u16 *tags_used, u16 *tags_free,
4162 struct i40e_asq_cmd_details *cmd_details)
4164 struct i40e_aq_desc desc;
4165 struct i40e_aqc_add_remove_mcast_etag *cmd =
4166 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4167 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4168 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4169 enum i40e_status_code status;
4170 u16 length = sizeof(u16) * num_tags_in_buf;
4172 if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
4173 return I40E_ERR_PARAM;
4175 i40e_fill_default_direct_cmd_desc(&desc,
4176 i40e_aqc_opc_add_multicast_etag);
4178 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4179 cmd->etag = CPU_TO_LE16(etag);
4180 cmd->num_unicast_etags = num_tags_in_buf;
4182 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4183 if (length > I40E_AQ_LARGE_BUF)
4184 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4186 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4189 if (tags_used != NULL)
4190 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4191 if (tags_free != NULL)
4192 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4199 * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
4200 * @hw: pointer to the hw struct
4201 * @pv_seid: Port Virtualizer SEID this M-tag is associated with
4202 * @etag: value of the E-tag to remove
4203 * @tags_used: return value, number of tags in use by this port
4204 * @tags_free: return value, number of unallocated tags
4205 * @cmd_details: pointer to command details structure or NULL
4207 * This deletes an E-tag from the port virtualizer. It will return
4208 * the number of tags allocated by the port, and the number of unallocated
4211 enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4212 u16 etag, u16 *tags_used, u16 *tags_free,
4213 struct i40e_asq_cmd_details *cmd_details)
4215 struct i40e_aq_desc desc;
4216 struct i40e_aqc_add_remove_mcast_etag *cmd =
4217 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4218 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4219 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4220 enum i40e_status_code status;
4224 return I40E_ERR_PARAM;
4226 i40e_fill_default_direct_cmd_desc(&desc,
4227 i40e_aqc_opc_remove_multicast_etag);
4229 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4230 cmd->etag = CPU_TO_LE16(etag);
4232 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4235 if (tags_used != NULL)
4236 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4237 if (tags_free != NULL)
4238 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4245 * i40e_aq_update_tag - Update an S/E-tag
4246 * @hw: pointer to the hw struct
4247 * @vsi_seid: VSI SEID using this S-tag
4248 * @old_tag: old tag value
4249 * @new_tag: new tag value
4250 * @tags_used: return value, number of tags in use by this PF
4251 * @tags_free: return value, number of unallocated tags
4252 * @cmd_details: pointer to command details structure or NULL
4254 * This updates the value of the tag currently attached to this VSI
4255 * in the switch complex. It will return the number of tags allocated
4256 * by the PF, and the number of unallocated tags available.
4258 enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
4259 u16 old_tag, u16 new_tag, u16 *tags_used,
4261 struct i40e_asq_cmd_details *cmd_details)
4263 struct i40e_aq_desc desc;
4264 struct i40e_aqc_update_tag *cmd =
4265 (struct i40e_aqc_update_tag *)&desc.params.raw;
4266 struct i40e_aqc_update_tag_completion *resp =
4267 (struct i40e_aqc_update_tag_completion *)&desc.params.raw;
4268 enum i40e_status_code status;
4271 return I40E_ERR_PARAM;
4273 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
4275 cmd->seid = CPU_TO_LE16(vsi_seid);
4276 cmd->old_tag = CPU_TO_LE16(old_tag);
4277 cmd->new_tag = CPU_TO_LE16(new_tag);
4279 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4282 if (tags_used != NULL)
4283 *tags_used = LE16_TO_CPU(resp->tags_used);
4284 if (tags_free != NULL)
4285 *tags_free = LE16_TO_CPU(resp->tags_free);
4292 * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
4293 * @hw: pointer to the hw struct
4294 * @tcmap: TC map for request/release any ignore PFC condition
4295 * @request: request or release ignore PFC condition
4296 * @tcmap_ret: return TCs for which PFC is currently ignored
4297 * @cmd_details: pointer to command details structure or NULL
4299 * This sends out request/release to ignore PFC condition for a TC.
4300 * It will return the TCs for which PFC is currently ignored.
4302 enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
4303 bool request, u8 *tcmap_ret,
4304 struct i40e_asq_cmd_details *cmd_details)
4306 struct i40e_aq_desc desc;
4307 struct i40e_aqc_pfc_ignore *cmd_resp =
4308 (struct i40e_aqc_pfc_ignore *)&desc.params.raw;
4309 enum i40e_status_code status;
4311 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
4314 cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
4316 cmd_resp->tc_bitmap = tcmap;
4318 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4321 if (tcmap_ret != NULL)
4322 *tcmap_ret = cmd_resp->tc_bitmap;
4329 * i40e_aq_dcb_updated - DCB Updated Command
4330 * @hw: pointer to the hw struct
4331 * @cmd_details: pointer to command details structure or NULL
4333 * When LLDP is handled in PF this command is used by the PF
4334 * to notify EMP that a DCB setting is modified.
4335 * When LLDP is handled in EMP this command is used by the PF
4336 * to notify EMP whenever one of the following parameters get
4338 * - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
4339 * - PCIRTT in PRTDCB_GENC.PCIRTT
4340 * - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
4341 * EMP will return when the shared RPB settings have been
4342 * recomputed and modified. The retval field in the descriptor
4343 * will be set to 0 when RPB is modified.
4345 enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
4346 struct i40e_asq_cmd_details *cmd_details)
4348 struct i40e_aq_desc desc;
4349 enum i40e_status_code status;
4351 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
4353 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4359 * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
4360 * @hw: pointer to the hw struct
4361 * @seid: defines the SEID of the switch for which the stats are requested
4362 * @vlan_id: the VLAN ID for which the statistics are requested
4363 * @stat_index: index of the statistics counters block assigned to this VLAN
4364 * @cmd_details: pointer to command details structure or NULL
4366 * XL710 supports 128 smonVlanStats counters.This command is used to
4367 * allocate a set of smonVlanStats counters to a specific VLAN in a specific
4370 enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
4371 u16 vlan_id, u16 *stat_index,
4372 struct i40e_asq_cmd_details *cmd_details)
4374 struct i40e_aq_desc desc;
4375 struct i40e_aqc_add_remove_statistics *cmd_resp =
4376 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4377 enum i40e_status_code status;
4379 if ((seid == 0) || (stat_index == NULL))
4380 return I40E_ERR_PARAM;
4382 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
4384 cmd_resp->seid = CPU_TO_LE16(seid);
4385 cmd_resp->vlan = CPU_TO_LE16(vlan_id);
4387 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4389 if (!status && stat_index)
4390 *stat_index = LE16_TO_CPU(cmd_resp->stat_index);
4396 * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
4397 * @hw: pointer to the hw struct
4398 * @seid: defines the SEID of the switch for which the stats are requested
4399 * @vlan_id: the VLAN ID for which the statistics are requested
4400 * @stat_index: index of the statistics counters block assigned to this VLAN
4401 * @cmd_details: pointer to command details structure or NULL
4403 * XL710 supports 128 smonVlanStats counters.This command is used to
4404 * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
4407 enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
4408 u16 vlan_id, u16 stat_index,
4409 struct i40e_asq_cmd_details *cmd_details)
4411 struct i40e_aq_desc desc;
4412 struct i40e_aqc_add_remove_statistics *cmd =
4413 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4414 enum i40e_status_code status;
4417 return I40E_ERR_PARAM;
4419 i40e_fill_default_direct_cmd_desc(&desc,
4420 i40e_aqc_opc_remove_statistics);
4422 cmd->seid = CPU_TO_LE16(seid);
4423 cmd->vlan = CPU_TO_LE16(vlan_id);
4424 cmd->stat_index = CPU_TO_LE16(stat_index);
4426 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4432 * i40e_aq_set_port_parameters - set physical port parameters.
4433 * @hw: pointer to the hw struct
4434 * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
4435 * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
4436 * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
4437 * @double_vlan: if set double VLAN is enabled
4438 * @cmd_details: pointer to command details structure or NULL
4440 enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
4441 u16 bad_frame_vsi, bool save_bad_pac,
4442 bool pad_short_pac, bool double_vlan,
4443 struct i40e_asq_cmd_details *cmd_details)
4445 struct i40e_aqc_set_port_parameters *cmd;
4446 enum i40e_status_code status;
4447 struct i40e_aq_desc desc;
4448 u16 command_flags = 0;
4450 cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
4452 i40e_fill_default_direct_cmd_desc(&desc,
4453 i40e_aqc_opc_set_port_parameters);
4455 cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
4457 command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
4459 command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
4461 command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
4462 cmd->command_flags = CPU_TO_LE16(command_flags);
4464 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4470 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
4471 * @hw: pointer to the hw struct
4472 * @seid: seid for the physical port/switching component/vsi
4473 * @buff: Indirect buffer to hold data parameters and response
4474 * @buff_size: Indirect buffer size
4475 * @opcode: Tx scheduler AQ command opcode
4476 * @cmd_details: pointer to command details structure or NULL
4478 * Generic command handler for Tx scheduler AQ commands
4480 static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
4481 void *buff, u16 buff_size,
4482 enum i40e_admin_queue_opc opcode,
4483 struct i40e_asq_cmd_details *cmd_details)
4485 struct i40e_aq_desc desc;
4486 struct i40e_aqc_tx_sched_ind *cmd =
4487 (struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
4488 enum i40e_status_code status;
4489 bool cmd_param_flag = false;
4492 case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
4493 case i40e_aqc_opc_configure_vsi_tc_bw:
4494 case i40e_aqc_opc_enable_switching_comp_ets:
4495 case i40e_aqc_opc_modify_switching_comp_ets:
4496 case i40e_aqc_opc_disable_switching_comp_ets:
4497 case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
4498 case i40e_aqc_opc_configure_switching_comp_bw_config:
4499 cmd_param_flag = true;
4501 case i40e_aqc_opc_query_vsi_bw_config:
4502 case i40e_aqc_opc_query_vsi_ets_sla_config:
4503 case i40e_aqc_opc_query_switching_comp_ets_config:
4504 case i40e_aqc_opc_query_port_ets_config:
4505 case i40e_aqc_opc_query_switching_comp_bw_config:
4506 cmd_param_flag = false;
4509 return I40E_ERR_PARAM;
4512 i40e_fill_default_direct_cmd_desc(&desc, opcode);
4514 /* Indirect command */
4515 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4517 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
4518 if (buff_size > I40E_AQ_LARGE_BUF)
4519 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4521 desc.datalen = CPU_TO_LE16(buff_size);
4523 cmd->vsi_seid = CPU_TO_LE16(seid);
4525 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4531 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
4532 * @hw: pointer to the hw struct
4534 * @credit: BW limit credits (0 = disabled)
4535 * @max_credit: Max BW limit credits
4536 * @cmd_details: pointer to command details structure or NULL
4538 enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
4539 u16 seid, u16 credit, u8 max_credit,
4540 struct i40e_asq_cmd_details *cmd_details)
4542 struct i40e_aq_desc desc;
4543 struct i40e_aqc_configure_vsi_bw_limit *cmd =
4544 (struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
4545 enum i40e_status_code status;
4547 i40e_fill_default_direct_cmd_desc(&desc,
4548 i40e_aqc_opc_configure_vsi_bw_limit);
4550 cmd->vsi_seid = CPU_TO_LE16(seid);
4551 cmd->credit = CPU_TO_LE16(credit);
4552 cmd->max_credit = max_credit;
4554 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4560 * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
4561 * @hw: pointer to the hw struct
4562 * @seid: switching component seid
4563 * @credit: BW limit credits (0 = disabled)
4564 * @max_bw: Max BW limit credits
4565 * @cmd_details: pointer to command details structure or NULL
4567 enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
4568 u16 seid, u16 credit, u8 max_bw,
4569 struct i40e_asq_cmd_details *cmd_details)
4571 struct i40e_aq_desc desc;
4572 struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
4573 (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
4574 enum i40e_status_code status;
4576 i40e_fill_default_direct_cmd_desc(&desc,
4577 i40e_aqc_opc_configure_switching_comp_bw_limit);
4579 cmd->seid = CPU_TO_LE16(seid);
4580 cmd->credit = CPU_TO_LE16(credit);
4581 cmd->max_bw = max_bw;
4583 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4589 * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
4590 * @hw: pointer to the hw struct
4592 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
4593 * @cmd_details: pointer to command details structure or NULL
4595 enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
4597 struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
4598 struct i40e_asq_cmd_details *cmd_details)
4600 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4601 i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
4606 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
4607 * @hw: pointer to the hw struct
4609 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
4610 * @cmd_details: pointer to command details structure or NULL
4612 enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
4614 struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
4615 struct i40e_asq_cmd_details *cmd_details)
4617 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4618 i40e_aqc_opc_configure_vsi_tc_bw,
4623 * i40e_aq_config_switch_comp_ets - Enable/Disable/Modify ETS on the port
4624 * @hw: pointer to the hw struct
4625 * @seid: seid of the switching component connected to Physical Port
4626 * @ets_data: Buffer holding ETS parameters
4627 * @cmd_details: pointer to command details structure or NULL
4629 enum i40e_status_code i40e_aq_config_switch_comp_ets(struct i40e_hw *hw,
4631 struct i40e_aqc_configure_switching_comp_ets_data *ets_data,
4632 enum i40e_admin_queue_opc opcode,
4633 struct i40e_asq_cmd_details *cmd_details)
4635 return i40e_aq_tx_sched_cmd(hw, seid, (void *)ets_data,
4636 sizeof(*ets_data), opcode, cmd_details);
4640 * i40e_aq_config_switch_comp_bw_config - Config Switch comp BW Alloc per TC
4641 * @hw: pointer to the hw struct
4642 * @seid: seid of the switching component
4643 * @bw_data: Buffer holding enabled TCs, relative/absolute TC BW limit/credits
4644 * @cmd_details: pointer to command details structure or NULL
4646 enum i40e_status_code i40e_aq_config_switch_comp_bw_config(struct i40e_hw *hw,
4648 struct i40e_aqc_configure_switching_comp_bw_config_data *bw_data,
4649 struct i40e_asq_cmd_details *cmd_details)
4651 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4652 i40e_aqc_opc_configure_switching_comp_bw_config,
4657 * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
4658 * @hw: pointer to the hw struct
4659 * @seid: seid of the switching component
4660 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
4661 * @cmd_details: pointer to command details structure or NULL
4663 enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
4664 struct i40e_hw *hw, u16 seid,
4665 struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
4666 struct i40e_asq_cmd_details *cmd_details)
4668 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4669 i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
4674 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
4675 * @hw: pointer to the hw struct
4676 * @seid: seid of the VSI
4677 * @bw_data: Buffer to hold VSI BW configuration
4678 * @cmd_details: pointer to command details structure or NULL
4680 enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
4682 struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
4683 struct i40e_asq_cmd_details *cmd_details)
4685 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4686 i40e_aqc_opc_query_vsi_bw_config,
4691 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
4692 * @hw: pointer to the hw struct
4693 * @seid: seid of the VSI
4694 * @bw_data: Buffer to hold VSI BW configuration per TC
4695 * @cmd_details: pointer to command details structure or NULL
4697 enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
4699 struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
4700 struct i40e_asq_cmd_details *cmd_details)
4702 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4703 i40e_aqc_opc_query_vsi_ets_sla_config,
4708 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
4709 * @hw: pointer to the hw struct
4710 * @seid: seid of the switching component
4711 * @bw_data: Buffer to hold switching component's per TC BW config
4712 * @cmd_details: pointer to command details structure or NULL
4714 enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
4716 struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
4717 struct i40e_asq_cmd_details *cmd_details)
4719 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4720 i40e_aqc_opc_query_switching_comp_ets_config,
4725 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
4726 * @hw: pointer to the hw struct
4727 * @seid: seid of the VSI or switching component connected to Physical Port
4728 * @bw_data: Buffer to hold current ETS configuration for the Physical Port
4729 * @cmd_details: pointer to command details structure or NULL
4731 enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
4733 struct i40e_aqc_query_port_ets_config_resp *bw_data,
4734 struct i40e_asq_cmd_details *cmd_details)
4736 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4737 i40e_aqc_opc_query_port_ets_config,
4742 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
4743 * @hw: pointer to the hw struct
4744 * @seid: seid of the switching component
4745 * @bw_data: Buffer to hold switching component's BW configuration
4746 * @cmd_details: pointer to command details structure or NULL
4748 enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
4750 struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
4751 struct i40e_asq_cmd_details *cmd_details)
4753 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4754 i40e_aqc_opc_query_switching_comp_bw_config,
4759 * i40e_validate_filter_settings
4760 * @hw: pointer to the hardware structure
4761 * @settings: Filter control settings
4763 * Check and validate the filter control settings passed.
4764 * The function checks for the valid filter/context sizes being
4765 * passed for FCoE and PE.
4767 * Returns I40E_SUCCESS if the values passed are valid and within
4768 * range else returns an error.
4770 STATIC enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
4771 struct i40e_filter_control_settings *settings)
4773 u32 fcoe_cntx_size, fcoe_filt_size;
4774 u32 pe_cntx_size, pe_filt_size;
4779 /* Validate FCoE settings passed */
4780 switch (settings->fcoe_filt_num) {
4781 case I40E_HASH_FILTER_SIZE_1K:
4782 case I40E_HASH_FILTER_SIZE_2K:
4783 case I40E_HASH_FILTER_SIZE_4K:
4784 case I40E_HASH_FILTER_SIZE_8K:
4785 case I40E_HASH_FILTER_SIZE_16K:
4786 case I40E_HASH_FILTER_SIZE_32K:
4787 fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
4788 fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
4791 return I40E_ERR_PARAM;
4794 switch (settings->fcoe_cntx_num) {
4795 case I40E_DMA_CNTX_SIZE_512:
4796 case I40E_DMA_CNTX_SIZE_1K:
4797 case I40E_DMA_CNTX_SIZE_2K:
4798 case I40E_DMA_CNTX_SIZE_4K:
4799 fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
4800 fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
4803 return I40E_ERR_PARAM;
4806 /* Validate PE settings passed */
4807 switch (settings->pe_filt_num) {
4808 case I40E_HASH_FILTER_SIZE_1K:
4809 case I40E_HASH_FILTER_SIZE_2K:
4810 case I40E_HASH_FILTER_SIZE_4K:
4811 case I40E_HASH_FILTER_SIZE_8K:
4812 case I40E_HASH_FILTER_SIZE_16K:
4813 case I40E_HASH_FILTER_SIZE_32K:
4814 case I40E_HASH_FILTER_SIZE_64K:
4815 case I40E_HASH_FILTER_SIZE_128K:
4816 case I40E_HASH_FILTER_SIZE_256K:
4817 case I40E_HASH_FILTER_SIZE_512K:
4818 case I40E_HASH_FILTER_SIZE_1M:
4819 pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
4820 pe_filt_size <<= (u32)settings->pe_filt_num;
4823 return I40E_ERR_PARAM;
4826 switch (settings->pe_cntx_num) {
4827 case I40E_DMA_CNTX_SIZE_512:
4828 case I40E_DMA_CNTX_SIZE_1K:
4829 case I40E_DMA_CNTX_SIZE_2K:
4830 case I40E_DMA_CNTX_SIZE_4K:
4831 case I40E_DMA_CNTX_SIZE_8K:
4832 case I40E_DMA_CNTX_SIZE_16K:
4833 case I40E_DMA_CNTX_SIZE_32K:
4834 case I40E_DMA_CNTX_SIZE_64K:
4835 case I40E_DMA_CNTX_SIZE_128K:
4836 case I40E_DMA_CNTX_SIZE_256K:
4837 pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
4838 pe_cntx_size <<= (u32)settings->pe_cntx_num;
4841 return I40E_ERR_PARAM;
4844 /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
4845 val = rd32(hw, I40E_GLHMC_FCOEFMAX);
4846 fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
4847 >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
4848 if (fcoe_filt_size + fcoe_cntx_size > fcoe_fmax)
4849 return I40E_ERR_INVALID_SIZE;
4851 return I40E_SUCCESS;
4855 * i40e_set_filter_control
4856 * @hw: pointer to the hardware structure
4857 * @settings: Filter control settings
4859 * Set the Queue Filters for PE/FCoE and enable filters required
4860 * for a single PF. It is expected that these settings are programmed
4861 * at the driver initialization time.
4863 enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
4864 struct i40e_filter_control_settings *settings)
4866 enum i40e_status_code ret = I40E_SUCCESS;
4867 u32 hash_lut_size = 0;
4871 return I40E_ERR_PARAM;
4873 /* Validate the input settings */
4874 ret = i40e_validate_filter_settings(hw, settings);
4878 /* Read the PF Queue Filter control register */
4879 val = rd32(hw, I40E_PFQF_CTL_0);
4881 /* Program required PE hash buckets for the PF */
4882 val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
4883 val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
4884 I40E_PFQF_CTL_0_PEHSIZE_MASK;
4885 /* Program required PE contexts for the PF */
4886 val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
4887 val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
4888 I40E_PFQF_CTL_0_PEDSIZE_MASK;
4890 /* Program required FCoE hash buckets for the PF */
4891 val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
4892 val |= ((u32)settings->fcoe_filt_num <<
4893 I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
4894 I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
4895 /* Program required FCoE DDP contexts for the PF */
4896 val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
4897 val |= ((u32)settings->fcoe_cntx_num <<
4898 I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
4899 I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
4901 /* Program Hash LUT size for the PF */
4902 val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
4903 if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
4905 val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
4906 I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
4908 /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
4909 if (settings->enable_fdir)
4910 val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
4911 if (settings->enable_ethtype)
4912 val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
4913 if (settings->enable_macvlan)
4914 val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
4916 wr32(hw, I40E_PFQF_CTL_0, val);
4918 return I40E_SUCCESS;
4922 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
4923 * @hw: pointer to the hw struct
4924 * @mac_addr: MAC address to use in the filter
4925 * @ethtype: Ethertype to use in the filter
4926 * @flags: Flags that needs to be applied to the filter
4927 * @vsi_seid: seid of the control VSI
4928 * @queue: VSI queue number to send the packet to
4929 * @is_add: Add control packet filter if True else remove
4930 * @stats: Structure to hold information on control filter counts
4931 * @cmd_details: pointer to command details structure or NULL
4933 * This command will Add or Remove control packet filter for a control VSI.
4934 * In return it will update the total number of perfect filter count in
4937 enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
4938 u8 *mac_addr, u16 ethtype, u16 flags,
4939 u16 vsi_seid, u16 queue, bool is_add,
4940 struct i40e_control_filter_stats *stats,
4941 struct i40e_asq_cmd_details *cmd_details)
4943 struct i40e_aq_desc desc;
4944 struct i40e_aqc_add_remove_control_packet_filter *cmd =
4945 (struct i40e_aqc_add_remove_control_packet_filter *)
4947 struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
4948 (struct i40e_aqc_add_remove_control_packet_filter_completion *)
4950 enum i40e_status_code status;
4953 return I40E_ERR_PARAM;
4956 i40e_fill_default_direct_cmd_desc(&desc,
4957 i40e_aqc_opc_add_control_packet_filter);
4958 cmd->queue = CPU_TO_LE16(queue);
4960 i40e_fill_default_direct_cmd_desc(&desc,
4961 i40e_aqc_opc_remove_control_packet_filter);
4965 i40e_memcpy(cmd->mac, mac_addr, I40E_ETH_LENGTH_OF_ADDRESS,
4966 I40E_NONDMA_TO_NONDMA);
4968 cmd->etype = CPU_TO_LE16(ethtype);
4969 cmd->flags = CPU_TO_LE16(flags);
4970 cmd->seid = CPU_TO_LE16(vsi_seid);
4972 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4974 if (!status && stats) {
4975 stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
4976 stats->etype_used = LE16_TO_CPU(resp->etype_used);
4977 stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
4978 stats->etype_free = LE16_TO_CPU(resp->etype_free);
4985 * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
4986 * @hw: pointer to the hw struct
4987 * @seid: VSI seid to add ethertype filter from
4989 #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
4990 void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
4993 u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
4994 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
4995 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
4996 u16 ethtype = I40E_FLOW_CONTROL_ETHTYPE;
4997 enum i40e_status_code status;
4999 status = i40e_aq_add_rem_control_packet_filter(hw, 0, ethtype, flag,
5000 seid, 0, true, NULL,
5003 DEBUGOUT("Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
5007 * i40e_aq_add_cloud_filters
5008 * @hw: pointer to the hardware structure
5009 * @seid: VSI seid to add cloud filters from
5010 * @filters: Buffer which contains the filters to be added
5011 * @filter_count: number of filters contained in the buffer
5013 * Set the cloud filters for a given VSI. The contents of the
5014 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5015 * in by the caller of the function.
5018 enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
5020 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5023 struct i40e_aq_desc desc;
5024 struct i40e_aqc_add_remove_cloud_filters *cmd =
5025 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5027 enum i40e_status_code status;
5029 i40e_fill_default_direct_cmd_desc(&desc,
5030 i40e_aqc_opc_add_cloud_filters);
5032 buff_len = filter_count * sizeof(*filters);
5033 desc.datalen = CPU_TO_LE16(buff_len);
5034 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5035 cmd->num_filters = filter_count;
5036 cmd->seid = CPU_TO_LE16(seid);
5038 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5044 * i40e_aq_remove_cloud_filters
5045 * @hw: pointer to the hardware structure
5046 * @seid: VSI seid to remove cloud filters from
5047 * @filters: Buffer which contains the filters to be removed
5048 * @filter_count: number of filters contained in the buffer
5050 * Remove the cloud filters for a given VSI. The contents of the
5051 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5052 * in by the caller of the function.
5055 enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
5057 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5060 struct i40e_aq_desc desc;
5061 struct i40e_aqc_add_remove_cloud_filters *cmd =
5062 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5063 enum i40e_status_code status;
5066 i40e_fill_default_direct_cmd_desc(&desc,
5067 i40e_aqc_opc_remove_cloud_filters);
5069 buff_len = filter_count * sizeof(*filters);
5070 desc.datalen = CPU_TO_LE16(buff_len);
5071 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5072 cmd->num_filters = filter_count;
5073 cmd->seid = CPU_TO_LE16(seid);
5075 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5081 * i40e_aq_alternate_write
5082 * @hw: pointer to the hardware structure
5083 * @reg_addr0: address of first dword to be read
5084 * @reg_val0: value to be written under 'reg_addr0'
5085 * @reg_addr1: address of second dword to be read
5086 * @reg_val1: value to be written under 'reg_addr1'
5088 * Write one or two dwords to alternate structure. Fields are indicated
5089 * by 'reg_addr0' and 'reg_addr1' register numbers.
5092 enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
5093 u32 reg_addr0, u32 reg_val0,
5094 u32 reg_addr1, u32 reg_val1)
5096 struct i40e_aq_desc desc;
5097 struct i40e_aqc_alternate_write *cmd_resp =
5098 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5099 enum i40e_status_code status;
5101 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
5102 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5103 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5104 cmd_resp->data0 = CPU_TO_LE32(reg_val0);
5105 cmd_resp->data1 = CPU_TO_LE32(reg_val1);
5107 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5113 * i40e_aq_alternate_write_indirect
5114 * @hw: pointer to the hardware structure
5115 * @addr: address of a first register to be modified
5116 * @dw_count: number of alternate structure fields to write
5117 * @buffer: pointer to the command buffer
5119 * Write 'dw_count' dwords from 'buffer' to alternate structure
5120 * starting at 'addr'.
5123 enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
5124 u32 addr, u32 dw_count, void *buffer)
5126 struct i40e_aq_desc desc;
5127 struct i40e_aqc_alternate_ind_write *cmd_resp =
5128 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5129 enum i40e_status_code status;
5132 return I40E_ERR_PARAM;
5134 /* Indirect command */
5135 i40e_fill_default_direct_cmd_desc(&desc,
5136 i40e_aqc_opc_alternate_write_indirect);
5138 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5139 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5140 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5141 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5143 cmd_resp->address = CPU_TO_LE32(addr);
5144 cmd_resp->length = CPU_TO_LE32(dw_count);
5146 status = i40e_asq_send_command(hw, &desc, buffer,
5147 I40E_LO_DWORD(4*dw_count), NULL);
5153 * i40e_aq_alternate_read
5154 * @hw: pointer to the hardware structure
5155 * @reg_addr0: address of first dword to be read
5156 * @reg_val0: pointer for data read from 'reg_addr0'
5157 * @reg_addr1: address of second dword to be read
5158 * @reg_val1: pointer for data read from 'reg_addr1'
5160 * Read one or two dwords from alternate structure. Fields are indicated
5161 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
5162 * is not passed then only register at 'reg_addr0' is read.
5165 enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
5166 u32 reg_addr0, u32 *reg_val0,
5167 u32 reg_addr1, u32 *reg_val1)
5169 struct i40e_aq_desc desc;
5170 struct i40e_aqc_alternate_write *cmd_resp =
5171 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5172 enum i40e_status_code status;
5174 if (reg_val0 == NULL)
5175 return I40E_ERR_PARAM;
5177 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
5178 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5179 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5181 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5183 if (status == I40E_SUCCESS) {
5184 *reg_val0 = LE32_TO_CPU(cmd_resp->data0);
5186 if (reg_val1 != NULL)
5187 *reg_val1 = LE32_TO_CPU(cmd_resp->data1);
5194 * i40e_aq_alternate_read_indirect
5195 * @hw: pointer to the hardware structure
5196 * @addr: address of the alternate structure field
5197 * @dw_count: number of alternate structure fields to read
5198 * @buffer: pointer to the command buffer
5200 * Read 'dw_count' dwords from alternate structure starting at 'addr' and
5201 * place them in 'buffer'. The buffer should be allocated by caller.
5204 enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
5205 u32 addr, u32 dw_count, void *buffer)
5207 struct i40e_aq_desc desc;
5208 struct i40e_aqc_alternate_ind_write *cmd_resp =
5209 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5210 enum i40e_status_code status;
5213 return I40E_ERR_PARAM;
5215 /* Indirect command */
5216 i40e_fill_default_direct_cmd_desc(&desc,
5217 i40e_aqc_opc_alternate_read_indirect);
5219 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5220 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5221 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5222 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5224 cmd_resp->address = CPU_TO_LE32(addr);
5225 cmd_resp->length = CPU_TO_LE32(dw_count);
5227 status = i40e_asq_send_command(hw, &desc, buffer,
5228 I40E_LO_DWORD(4*dw_count), NULL);
5234 * i40e_aq_alternate_clear
5235 * @hw: pointer to the HW structure.
5237 * Clear the alternate structures of the port from which the function
5241 enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
5243 struct i40e_aq_desc desc;
5244 enum i40e_status_code status;
5246 i40e_fill_default_direct_cmd_desc(&desc,
5247 i40e_aqc_opc_alternate_clear_port);
5249 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5255 * i40e_aq_alternate_write_done
5256 * @hw: pointer to the HW structure.
5257 * @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
5258 * @reset_needed: indicates the SW should trigger GLOBAL reset
5260 * Indicates to the FW that alternate structures have been changed.
5263 enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
5264 u8 bios_mode, bool *reset_needed)
5266 struct i40e_aq_desc desc;
5267 struct i40e_aqc_alternate_write_done *cmd =
5268 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
5269 enum i40e_status_code status;
5271 if (reset_needed == NULL)
5272 return I40E_ERR_PARAM;
5274 i40e_fill_default_direct_cmd_desc(&desc,
5275 i40e_aqc_opc_alternate_write_done);
5277 cmd->cmd_flags = CPU_TO_LE16(bios_mode);
5279 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5280 if (!status && reset_needed)
5281 *reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
5282 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
5288 * i40e_aq_set_oem_mode
5289 * @hw: pointer to the HW structure.
5290 * @oem_mode: the OEM mode to be used
5292 * Sets the device to a specific operating mode. Currently the only supported
5293 * mode is no_clp, which causes FW to refrain from using Alternate RAM.
5296 enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
5299 struct i40e_aq_desc desc;
5300 struct i40e_aqc_alternate_write_done *cmd =
5301 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
5302 enum i40e_status_code status;
5304 i40e_fill_default_direct_cmd_desc(&desc,
5305 i40e_aqc_opc_alternate_set_mode);
5307 cmd->cmd_flags = CPU_TO_LE16(oem_mode);
5309 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5315 * i40e_aq_resume_port_tx
5316 * @hw: pointer to the hardware structure
5317 * @cmd_details: pointer to command details structure or NULL
5319 * Resume port's Tx traffic
5321 enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
5322 struct i40e_asq_cmd_details *cmd_details)
5324 struct i40e_aq_desc desc;
5325 enum i40e_status_code status;
5327 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
5329 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5335 * i40e_set_pci_config_data - store PCI bus info
5336 * @hw: pointer to hardware structure
5337 * @link_status: the link status word from PCI config space
5339 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
5341 void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
5343 hw->bus.type = i40e_bus_type_pci_express;
5345 switch (link_status & I40E_PCI_LINK_WIDTH) {
5346 case I40E_PCI_LINK_WIDTH_1:
5347 hw->bus.width = i40e_bus_width_pcie_x1;
5349 case I40E_PCI_LINK_WIDTH_2:
5350 hw->bus.width = i40e_bus_width_pcie_x2;
5352 case I40E_PCI_LINK_WIDTH_4:
5353 hw->bus.width = i40e_bus_width_pcie_x4;
5355 case I40E_PCI_LINK_WIDTH_8:
5356 hw->bus.width = i40e_bus_width_pcie_x8;
5359 hw->bus.width = i40e_bus_width_unknown;
5363 switch (link_status & I40E_PCI_LINK_SPEED) {
5364 case I40E_PCI_LINK_SPEED_2500:
5365 hw->bus.speed = i40e_bus_speed_2500;
5367 case I40E_PCI_LINK_SPEED_5000:
5368 hw->bus.speed = i40e_bus_speed_5000;
5370 case I40E_PCI_LINK_SPEED_8000:
5371 hw->bus.speed = i40e_bus_speed_8000;
5374 hw->bus.speed = i40e_bus_speed_unknown;
5380 * i40e_aq_debug_dump
5381 * @hw: pointer to the hardware structure
5382 * @cluster_id: specific cluster to dump
5383 * @table_id: table id within cluster
5384 * @start_index: index of line in the block to read
5385 * @buff_size: dump buffer size
5386 * @buff: dump buffer
5387 * @ret_buff_size: actual buffer size returned
5388 * @ret_next_table: next block to read
5389 * @ret_next_index: next index to read
5391 * Dump internal FW/HW data for debug purposes.
5394 enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
5395 u8 table_id, u32 start_index, u16 buff_size,
5396 void *buff, u16 *ret_buff_size,
5397 u8 *ret_next_table, u32 *ret_next_index,
5398 struct i40e_asq_cmd_details *cmd_details)
5400 struct i40e_aq_desc desc;
5401 struct i40e_aqc_debug_dump_internals *cmd =
5402 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
5403 struct i40e_aqc_debug_dump_internals *resp =
5404 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
5405 enum i40e_status_code status;
5407 if (buff_size == 0 || !buff)
5408 return I40E_ERR_PARAM;
5410 i40e_fill_default_direct_cmd_desc(&desc,
5411 i40e_aqc_opc_debug_dump_internals);
5412 /* Indirect Command */
5413 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5414 if (buff_size > I40E_AQ_LARGE_BUF)
5415 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5417 cmd->cluster_id = cluster_id;
5418 cmd->table_id = table_id;
5419 cmd->idx = CPU_TO_LE32(start_index);
5421 desc.datalen = CPU_TO_LE16(buff_size);
5423 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
5425 if (ret_buff_size != NULL)
5426 *ret_buff_size = LE16_TO_CPU(desc.datalen);
5427 if (ret_next_table != NULL)
5428 *ret_next_table = resp->table_id;
5429 if (ret_next_index != NULL)
5430 *ret_next_index = LE32_TO_CPU(resp->idx);
5437 * i40e_read_bw_from_alt_ram
5438 * @hw: pointer to the hardware structure
5439 * @max_bw: pointer for max_bw read
5440 * @min_bw: pointer for min_bw read
5441 * @min_valid: pointer for bool that is true if min_bw is a valid value
5442 * @max_valid: pointer for bool that is true if max_bw is a valid value
5444 * Read bw from the alternate ram for the given pf
5446 enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
5447 u32 *max_bw, u32 *min_bw,
5448 bool *min_valid, bool *max_valid)
5450 enum i40e_status_code status;
5451 u32 max_bw_addr, min_bw_addr;
5453 /* Calculate the address of the min/max bw registers */
5454 max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
5455 I40E_ALT_STRUCT_MAX_BW_OFFSET +
5456 (I40E_ALT_STRUCT_DWORDS_PER_PF*hw->pf_id);
5457 min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
5458 I40E_ALT_STRUCT_MIN_BW_OFFSET +
5459 (I40E_ALT_STRUCT_DWORDS_PER_PF*hw->pf_id);
5461 /* Read the bandwidths from alt ram */
5462 status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
5463 min_bw_addr, min_bw);
5465 if (*min_bw & I40E_ALT_BW_VALID_MASK)
5470 if (*max_bw & I40E_ALT_BW_VALID_MASK)
5479 * i40e_aq_configure_partition_bw
5480 * @hw: pointer to the hardware structure
5481 * @bw_data: Buffer holding valid pfs and bw limits
5482 * @cmd_details: pointer to command details
5484 * Configure partitions guaranteed/max bw
5486 enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
5487 struct i40e_aqc_configure_partition_bw_data *bw_data,
5488 struct i40e_asq_cmd_details *cmd_details)
5490 enum i40e_status_code status;
5491 struct i40e_aq_desc desc;
5492 u16 bwd_size = sizeof(*bw_data);
5494 i40e_fill_default_direct_cmd_desc(&desc,
5495 i40e_aqc_opc_configure_partition_bw);
5497 /* Indirect command */
5498 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5499 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
5501 if (bwd_size > I40E_AQ_LARGE_BUF)
5502 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5504 desc.datalen = CPU_TO_LE16(bwd_size);
5506 status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
5510 #endif /* PF_DRIVER */
5514 * i40e_aq_send_msg_to_pf
5515 * @hw: pointer to the hardware structure
5516 * @v_opcode: opcodes for VF-PF communication
5517 * @v_retval: return error code
5518 * @msg: pointer to the msg buffer
5519 * @msglen: msg length
5520 * @cmd_details: pointer to command details
5522 * Send message to PF driver using admin queue. By default, this message
5523 * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for
5524 * completion before returning.
5526 enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
5527 enum i40e_virtchnl_ops v_opcode,
5528 enum i40e_status_code v_retval,
5529 u8 *msg, u16 msglen,
5530 struct i40e_asq_cmd_details *cmd_details)
5532 struct i40e_aq_desc desc;
5533 struct i40e_asq_cmd_details details;
5534 enum i40e_status_code status;
5536 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
5537 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
5538 desc.cookie_high = CPU_TO_LE32(v_opcode);
5539 desc.cookie_low = CPU_TO_LE32(v_retval);
5541 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF
5542 | I40E_AQ_FLAG_RD));
5543 if (msglen > I40E_AQ_LARGE_BUF)
5544 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5545 desc.datalen = CPU_TO_LE16(msglen);
5548 i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM);
5549 details.async = true;
5550 cmd_details = &details;
5552 status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg,
5553 msglen, cmd_details);
5558 * i40e_vf_parse_hw_config
5559 * @hw: pointer to the hardware structure
5560 * @msg: pointer to the virtual channel VF resource structure
5562 * Given a VF resource message from the PF, populate the hw struct
5563 * with appropriate information.
5565 void i40e_vf_parse_hw_config(struct i40e_hw *hw,
5566 struct i40e_virtchnl_vf_resource *msg)
5568 struct i40e_virtchnl_vsi_resource *vsi_res;
5571 vsi_res = &msg->vsi_res[0];
5573 hw->dev_caps.num_vsis = msg->num_vsis;
5574 hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
5575 hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
5576 hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
5577 hw->dev_caps.dcb = msg->vf_offload_flags &
5578 I40E_VIRTCHNL_VF_OFFLOAD_L2;
5579 hw->dev_caps.fcoe = (msg->vf_offload_flags &
5580 I40E_VIRTCHNL_VF_OFFLOAD_FCOE) ? 1 : 0;
5581 hw->dev_caps.iwarp = (msg->vf_offload_flags &
5582 I40E_VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0;
5583 for (i = 0; i < msg->num_vsis; i++) {
5584 if (vsi_res->vsi_type == I40E_VSI_SRIOV) {
5585 i40e_memcpy(hw->mac.perm_addr,
5586 vsi_res->default_mac_addr,
5587 I40E_ETH_LENGTH_OF_ADDRESS,
5588 I40E_NONDMA_TO_NONDMA);
5589 i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
5590 I40E_ETH_LENGTH_OF_ADDRESS,
5591 I40E_NONDMA_TO_NONDMA);
5599 * @hw: pointer to the hardware structure
5601 * Send a VF_RESET message to the PF. Does not wait for response from PF
5602 * as none will be forthcoming. Immediately after calling this function,
5603 * the admin queue should be shut down and (optionally) reinitialized.
5605 enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw)
5607 return i40e_aq_send_msg_to_pf(hw, I40E_VIRTCHNL_OP_RESET_VF,
5608 I40E_SUCCESS, NULL, 0, NULL);
5610 #endif /* VF_DRIVER */