1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2013 - 2021 Intel Corporation. */
4 #include <linux/avf/virtchnl.h>
5 #include <linux/bitfield.h>
6 #include <linux/delay.h>
7 #include <linux/etherdevice.h>
9 #include "i40e_adminq_cmd.h"
10 #include "i40e_devids.h"
11 #include "i40e_prototype.h"
12 #include "i40e_register.h"
15 * i40e_set_mac_type - Sets MAC type
16 * @hw: pointer to the HW structure
18 * This function sets the mac type of the adapter based on the
19 * vendor ID and device ID stored in the hw structure.
21 int i40e_set_mac_type(struct i40e_hw
*hw
)
25 if (hw
->vendor_id
== PCI_VENDOR_ID_INTEL
) {
26 switch (hw
->device_id
) {
27 case I40E_DEV_ID_SFP_XL710
:
28 case I40E_DEV_ID_QEMU
:
29 case I40E_DEV_ID_KX_B
:
30 case I40E_DEV_ID_KX_C
:
31 case I40E_DEV_ID_QSFP_A
:
32 case I40E_DEV_ID_QSFP_B
:
33 case I40E_DEV_ID_QSFP_C
:
34 case I40E_DEV_ID_1G_BASE_T_BC
:
35 case I40E_DEV_ID_5G_BASE_T_BC
:
36 case I40E_DEV_ID_10G_BASE_T
:
37 case I40E_DEV_ID_10G_BASE_T4
:
38 case I40E_DEV_ID_10G_BASE_T_BC
:
39 case I40E_DEV_ID_10G_B
:
40 case I40E_DEV_ID_10G_SFP
:
41 case I40E_DEV_ID_20G_KR2
:
42 case I40E_DEV_ID_20G_KR2_A
:
43 case I40E_DEV_ID_25G_B
:
44 case I40E_DEV_ID_25G_SFP28
:
45 case I40E_DEV_ID_X710_N3000
:
46 case I40E_DEV_ID_XXV710_N3000
:
47 hw
->mac
.type
= I40E_MAC_XL710
;
49 case I40E_DEV_ID_KX_X722
:
50 case I40E_DEV_ID_QSFP_X722
:
51 case I40E_DEV_ID_SFP_X722
:
52 case I40E_DEV_ID_1G_BASE_T_X722
:
53 case I40E_DEV_ID_10G_BASE_T_X722
:
54 case I40E_DEV_ID_SFP_I_X722
:
55 case I40E_DEV_ID_SFP_X722_A
:
56 hw
->mac
.type
= I40E_MAC_X722
;
59 hw
->mac
.type
= I40E_MAC_GENERIC
;
66 hw_dbg(hw
, "i40e_set_mac_type found mac: %d, returns: %d\n",
67 hw
->mac
.type
, status
);
72 * i40e_aq_str - convert AQ err code to a string
73 * @hw: pointer to the HW structure
74 * @aq_err: the AQ error code to convert
76 const char *i40e_aq_str(struct i40e_hw
*hw
, enum i40e_admin_queue_err aq_err
)
81 case I40E_AQ_RC_EPERM
:
82 return "I40E_AQ_RC_EPERM";
83 case I40E_AQ_RC_ENOENT
:
84 return "I40E_AQ_RC_ENOENT";
85 case I40E_AQ_RC_ESRCH
:
86 return "I40E_AQ_RC_ESRCH";
87 case I40E_AQ_RC_EINTR
:
88 return "I40E_AQ_RC_EINTR";
90 return "I40E_AQ_RC_EIO";
91 case I40E_AQ_RC_ENXIO
:
92 return "I40E_AQ_RC_ENXIO";
93 case I40E_AQ_RC_E2BIG
:
94 return "I40E_AQ_RC_E2BIG";
95 case I40E_AQ_RC_EAGAIN
:
96 return "I40E_AQ_RC_EAGAIN";
97 case I40E_AQ_RC_ENOMEM
:
98 return "I40E_AQ_RC_ENOMEM";
99 case I40E_AQ_RC_EACCES
:
100 return "I40E_AQ_RC_EACCES";
101 case I40E_AQ_RC_EFAULT
:
102 return "I40E_AQ_RC_EFAULT";
103 case I40E_AQ_RC_EBUSY
:
104 return "I40E_AQ_RC_EBUSY";
105 case I40E_AQ_RC_EEXIST
:
106 return "I40E_AQ_RC_EEXIST";
107 case I40E_AQ_RC_EINVAL
:
108 return "I40E_AQ_RC_EINVAL";
109 case I40E_AQ_RC_ENOTTY
:
110 return "I40E_AQ_RC_ENOTTY";
111 case I40E_AQ_RC_ENOSPC
:
112 return "I40E_AQ_RC_ENOSPC";
113 case I40E_AQ_RC_ENOSYS
:
114 return "I40E_AQ_RC_ENOSYS";
115 case I40E_AQ_RC_ERANGE
:
116 return "I40E_AQ_RC_ERANGE";
117 case I40E_AQ_RC_EFLUSHED
:
118 return "I40E_AQ_RC_EFLUSHED";
119 case I40E_AQ_RC_BAD_ADDR
:
120 return "I40E_AQ_RC_BAD_ADDR";
121 case I40E_AQ_RC_EMODE
:
122 return "I40E_AQ_RC_EMODE";
123 case I40E_AQ_RC_EFBIG
:
124 return "I40E_AQ_RC_EFBIG";
127 snprintf(hw
->err_str
, sizeof(hw
->err_str
), "%d", aq_err
);
133 * @hw: debug mask related to admin queue
135 * @desc: pointer to admin queue descriptor
136 * @buffer: pointer to command buffer
137 * @buf_len: max length of buffer
139 * Dumps debug log about adminq command with descriptor contents.
141 void i40e_debug_aq(struct i40e_hw
*hw
, enum i40e_debug_mask mask
, void *desc
,
142 void *buffer
, u16 buf_len
)
144 struct i40e_aq_desc
*aq_desc
= (struct i40e_aq_desc
*)desc
;
145 u32 effective_mask
= hw
->debug_mask
& mask
;
148 u8
*buf
= (u8
*)buffer
;
150 if (!effective_mask
|| !desc
)
153 len
= le16_to_cpu(aq_desc
->datalen
);
155 i40e_debug(hw
, mask
& I40E_DEBUG_AQ_DESCRIPTOR
,
156 "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
157 le16_to_cpu(aq_desc
->opcode
),
158 le16_to_cpu(aq_desc
->flags
),
159 le16_to_cpu(aq_desc
->datalen
),
160 le16_to_cpu(aq_desc
->retval
));
161 i40e_debug(hw
, mask
& I40E_DEBUG_AQ_DESCRIPTOR
,
162 "\tcookie (h,l) 0x%08X 0x%08X\n",
163 le32_to_cpu(aq_desc
->cookie_high
),
164 le32_to_cpu(aq_desc
->cookie_low
));
165 i40e_debug(hw
, mask
& I40E_DEBUG_AQ_DESCRIPTOR
,
166 "\tparam (0,1) 0x%08X 0x%08X\n",
167 le32_to_cpu(aq_desc
->params
.internal
.param0
),
168 le32_to_cpu(aq_desc
->params
.internal
.param1
));
169 i40e_debug(hw
, mask
& I40E_DEBUG_AQ_DESCRIPTOR
,
170 "\taddr (h,l) 0x%08X 0x%08X\n",
171 le32_to_cpu(aq_desc
->params
.external
.addr_high
),
172 le32_to_cpu(aq_desc
->params
.external
.addr_low
));
174 if (buffer
&& buf_len
!= 0 && len
!= 0 &&
175 (effective_mask
& I40E_DEBUG_AQ_DESC_BUFFER
)) {
176 i40e_debug(hw
, mask
, "AQ CMD Buffer:\n");
180 snprintf(prefix
, sizeof(prefix
),
181 "i40e %02x:%02x.%x: \t0x",
186 print_hex_dump(KERN_INFO
, prefix
, DUMP_PREFIX_OFFSET
,
187 16, 1, buf
, len
, false);
192 * i40e_check_asq_alive
193 * @hw: pointer to the hw struct
195 * Returns true if Queue is enabled else false.
197 bool i40e_check_asq_alive(struct i40e_hw
*hw
)
199 /* Check if the queue is initialized */
200 if (!hw
->aq
.asq
.count
)
203 return !!(rd32(hw
, I40E_PF_ATQLEN
) & I40E_PF_ATQLEN_ATQENABLE_MASK
);
207 * i40e_aq_queue_shutdown
208 * @hw: pointer to the hw struct
209 * @unloading: is the driver unloading itself
211 * Tell the Firmware that we're shutting down the AdminQ and whether
212 * or not the driver is unloading as well.
214 int i40e_aq_queue_shutdown(struct i40e_hw
*hw
,
217 struct i40e_aq_desc desc
;
218 struct i40e_aqc_queue_shutdown
*cmd
=
219 (struct i40e_aqc_queue_shutdown
*)&desc
.params
.raw
;
222 i40e_fill_default_direct_cmd_desc(&desc
,
223 i40e_aqc_opc_queue_shutdown
);
226 cmd
->driver_unloading
= cpu_to_le32(I40E_AQ_DRIVER_UNLOADING
);
227 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, NULL
);
233 * i40e_aq_get_set_rss_lut
234 * @hw: pointer to the hardware structure
235 * @vsi_id: vsi fw index
236 * @pf_lut: for PF table set true, for VSI table set false
237 * @lut: pointer to the lut buffer provided by the caller
238 * @lut_size: size of the lut buffer
239 * @set: set true to set the table, false to get the table
241 * Internal function to get or set RSS look up table
243 static int i40e_aq_get_set_rss_lut(struct i40e_hw
*hw
,
244 u16 vsi_id
, bool pf_lut
,
245 u8
*lut
, u16 lut_size
,
248 struct i40e_aq_desc desc
;
249 struct i40e_aqc_get_set_rss_lut
*cmd_resp
=
250 (struct i40e_aqc_get_set_rss_lut
*)&desc
.params
.raw
;
255 i40e_fill_default_direct_cmd_desc(&desc
,
256 i40e_aqc_opc_set_rss_lut
);
258 i40e_fill_default_direct_cmd_desc(&desc
,
259 i40e_aqc_opc_get_rss_lut
);
261 /* Indirect command */
262 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
263 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_RD
);
265 vsi_id
= FIELD_PREP(I40E_AQC_SET_RSS_LUT_VSI_ID_MASK
, vsi_id
) |
266 FIELD_PREP(I40E_AQC_SET_RSS_LUT_VSI_VALID
, 1);
267 cmd_resp
->vsi_id
= cpu_to_le16(vsi_id
);
270 flags
= FIELD_PREP(I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK
,
271 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF
);
273 flags
= FIELD_PREP(I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK
,
274 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI
);
276 cmd_resp
->flags
= cpu_to_le16(flags
);
277 status
= i40e_asq_send_command(hw
, &desc
, lut
, lut_size
, NULL
);
283 * i40e_aq_get_rss_lut
284 * @hw: pointer to the hardware structure
285 * @vsi_id: vsi fw index
286 * @pf_lut: for PF table set true, for VSI table set false
287 * @lut: pointer to the lut buffer provided by the caller
288 * @lut_size: size of the lut buffer
290 * get the RSS lookup table, PF or VSI type
292 int i40e_aq_get_rss_lut(struct i40e_hw
*hw
, u16 vsi_id
,
293 bool pf_lut
, u8
*lut
, u16 lut_size
)
295 return i40e_aq_get_set_rss_lut(hw
, vsi_id
, pf_lut
, lut
, lut_size
,
300 * i40e_aq_set_rss_lut
301 * @hw: pointer to the hardware structure
302 * @vsi_id: vsi fw index
303 * @pf_lut: for PF table set true, for VSI table set false
304 * @lut: pointer to the lut buffer provided by the caller
305 * @lut_size: size of the lut buffer
307 * set the RSS lookup table, PF or VSI type
309 int i40e_aq_set_rss_lut(struct i40e_hw
*hw
, u16 vsi_id
,
310 bool pf_lut
, u8
*lut
, u16 lut_size
)
312 return i40e_aq_get_set_rss_lut(hw
, vsi_id
, pf_lut
, lut
, lut_size
, true);
316 * i40e_aq_get_set_rss_key
317 * @hw: pointer to the hw struct
318 * @vsi_id: vsi fw index
319 * @key: pointer to key info struct
320 * @set: set true to set the key, false to get the key
322 * get the RSS key per VSI
324 static int i40e_aq_get_set_rss_key(struct i40e_hw
*hw
,
326 struct i40e_aqc_get_set_rss_key_data
*key
,
329 struct i40e_aq_desc desc
;
330 struct i40e_aqc_get_set_rss_key
*cmd_resp
=
331 (struct i40e_aqc_get_set_rss_key
*)&desc
.params
.raw
;
332 u16 key_size
= sizeof(struct i40e_aqc_get_set_rss_key_data
);
336 i40e_fill_default_direct_cmd_desc(&desc
,
337 i40e_aqc_opc_set_rss_key
);
339 i40e_fill_default_direct_cmd_desc(&desc
,
340 i40e_aqc_opc_get_rss_key
);
342 /* Indirect command */
343 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
344 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_RD
);
346 vsi_id
= FIELD_PREP(I40E_AQC_SET_RSS_KEY_VSI_ID_MASK
, vsi_id
) |
347 FIELD_PREP(I40E_AQC_SET_RSS_KEY_VSI_VALID
, 1);
348 cmd_resp
->vsi_id
= cpu_to_le16(vsi_id
);
350 status
= i40e_asq_send_command(hw
, &desc
, key
, key_size
, NULL
);
356 * i40e_aq_get_rss_key
357 * @hw: pointer to the hw struct
358 * @vsi_id: vsi fw index
359 * @key: pointer to key info struct
362 int i40e_aq_get_rss_key(struct i40e_hw
*hw
,
364 struct i40e_aqc_get_set_rss_key_data
*key
)
366 return i40e_aq_get_set_rss_key(hw
, vsi_id
, key
, false);
370 * i40e_aq_set_rss_key
371 * @hw: pointer to the hw struct
372 * @vsi_id: vsi fw index
373 * @key: pointer to key info struct
375 * set the RSS key per VSI
377 int i40e_aq_set_rss_key(struct i40e_hw
*hw
,
379 struct i40e_aqc_get_set_rss_key_data
*key
)
381 return i40e_aq_get_set_rss_key(hw
, vsi_id
, key
, true);
385 * i40e_init_shared_code - Initialize the shared code
386 * @hw: pointer to hardware structure
388 * This assigns the MAC type and PHY code and inits the NVM.
389 * Does not touch the hardware. This function must be called prior to any
390 * other function in the shared code. The i40e_hw structure should be
391 * memset to 0 prior to calling this function. The following fields in
392 * hw structure should be filled in prior to calling this function:
393 * hw_addr, back, device_id, vendor_id, subsystem_device_id,
394 * subsystem_vendor_id, and revision_id
396 int i40e_init_shared_code(struct i40e_hw
*hw
)
398 u32 port
, ari
, func_rid
;
401 i40e_set_mac_type(hw
);
403 switch (hw
->mac
.type
) {
411 hw
->phy
.get_link_info
= true;
413 /* Determine port number and PF number*/
414 port
= FIELD_GET(I40E_PFGEN_PORTNUM_PORT_NUM_MASK
,
415 rd32(hw
, I40E_PFGEN_PORTNUM
));
417 ari
= FIELD_GET(I40E_GLPCI_CAPSUP_ARI_EN_MASK
,
418 rd32(hw
, I40E_GLPCI_CAPSUP
));
419 func_rid
= rd32(hw
, I40E_PF_FUNC_RID
);
421 hw
->pf_id
= (u8
)(func_rid
& 0xff);
423 hw
->pf_id
= (u8
)(func_rid
& 0x7);
425 status
= i40e_init_nvm(hw
);
430 * i40e_aq_mac_address_read - Retrieve the MAC addresses
431 * @hw: pointer to the hw struct
432 * @flags: a return indicator of what addresses were added to the addr store
433 * @addrs: the requestor's mac addr store
434 * @cmd_details: pointer to command details structure or NULL
437 i40e_aq_mac_address_read(struct i40e_hw
*hw
,
439 struct i40e_aqc_mac_address_read_data
*addrs
,
440 struct i40e_asq_cmd_details
*cmd_details
)
442 struct i40e_aq_desc desc
;
443 struct i40e_aqc_mac_address_read
*cmd_data
=
444 (struct i40e_aqc_mac_address_read
*)&desc
.params
.raw
;
447 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_mac_address_read
);
448 desc
.flags
|= cpu_to_le16(I40E_AQ_FLAG_BUF
);
450 status
= i40e_asq_send_command(hw
, &desc
, addrs
,
451 sizeof(*addrs
), cmd_details
);
452 *flags
= le16_to_cpu(cmd_data
->command_flags
);
458 * i40e_aq_mac_address_write - Change the MAC addresses
459 * @hw: pointer to the hw struct
460 * @flags: indicates which MAC to be written
461 * @mac_addr: address to write
462 * @cmd_details: pointer to command details structure or NULL
464 int i40e_aq_mac_address_write(struct i40e_hw
*hw
,
465 u16 flags
, u8
*mac_addr
,
466 struct i40e_asq_cmd_details
*cmd_details
)
468 struct i40e_aq_desc desc
;
469 struct i40e_aqc_mac_address_write
*cmd_data
=
470 (struct i40e_aqc_mac_address_write
*)&desc
.params
.raw
;
473 i40e_fill_default_direct_cmd_desc(&desc
,
474 i40e_aqc_opc_mac_address_write
);
475 cmd_data
->command_flags
= cpu_to_le16(flags
);
476 cmd_data
->mac_sah
= cpu_to_le16((u16
)mac_addr
[0] << 8 | mac_addr
[1]);
477 cmd_data
->mac_sal
= cpu_to_le32(((u32
)mac_addr
[2] << 24) |
478 ((u32
)mac_addr
[3] << 16) |
479 ((u32
)mac_addr
[4] << 8) |
482 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
488 * i40e_get_mac_addr - get MAC address
489 * @hw: pointer to the HW structure
490 * @mac_addr: pointer to MAC address
492 * Reads the adapter's MAC address from register
494 int i40e_get_mac_addr(struct i40e_hw
*hw
, u8
*mac_addr
)
496 struct i40e_aqc_mac_address_read_data addrs
;
500 status
= i40e_aq_mac_address_read(hw
, &flags
, &addrs
, NULL
);
502 if (flags
& I40E_AQC_LAN_ADDR_VALID
)
503 ether_addr_copy(mac_addr
, addrs
.pf_lan_mac
);
509 * i40e_get_port_mac_addr - get Port MAC address
510 * @hw: pointer to the HW structure
511 * @mac_addr: pointer to Port MAC address
513 * Reads the adapter's Port MAC address
515 int i40e_get_port_mac_addr(struct i40e_hw
*hw
, u8
*mac_addr
)
517 struct i40e_aqc_mac_address_read_data addrs
;
521 status
= i40e_aq_mac_address_read(hw
, &flags
, &addrs
, NULL
);
525 if (flags
& I40E_AQC_PORT_ADDR_VALID
)
526 ether_addr_copy(mac_addr
, addrs
.port_mac
);
534 * i40e_pre_tx_queue_cfg - pre tx queue configure
535 * @hw: pointer to the HW structure
536 * @queue: target PF queue index
537 * @enable: state change request
539 * Handles hw requirement to indicate intention to enable
540 * or disable target queue.
542 void i40e_pre_tx_queue_cfg(struct i40e_hw
*hw
, u32 queue
, bool enable
)
544 u32 abs_queue_idx
= hw
->func_caps
.base_queue
+ queue
;
548 if (abs_queue_idx
>= 128) {
549 reg_block
= abs_queue_idx
/ 128;
550 abs_queue_idx
%= 128;
553 reg_val
= rd32(hw
, I40E_GLLAN_TXPRE_QDIS(reg_block
));
554 reg_val
&= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK
;
555 reg_val
|= (abs_queue_idx
<< I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT
);
558 reg_val
|= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK
;
560 reg_val
|= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK
;
562 wr32(hw
, I40E_GLLAN_TXPRE_QDIS(reg_block
), reg_val
);
566 * i40e_get_pba_string - Reads part number string from EEPROM
567 * @hw: pointer to hardware structure
569 * Reads the part number string from the EEPROM and stores it
570 * into newly allocated buffer and saves resulting pointer
571 * to i40e_hw->pba_id field.
573 void i40e_get_pba_string(struct i40e_hw
*hw
)
575 #define I40E_NVM_PBA_FLAGS_BLK_PRESENT 0xFAFA
583 status
= i40e_read_nvm_word(hw
, I40E_SR_PBA_FLAGS
, &pba_word
);
585 hw_dbg(hw
, "Failed to read PBA flags.\n");
588 if (pba_word
!= I40E_NVM_PBA_FLAGS_BLK_PRESENT
) {
589 hw_dbg(hw
, "PBA block is not present.\n");
593 status
= i40e_read_nvm_word(hw
, I40E_SR_PBA_BLOCK_PTR
, &pba_ptr
);
595 hw_dbg(hw
, "Failed to read PBA Block pointer.\n");
599 status
= i40e_read_nvm_word(hw
, pba_ptr
, &pba_size
);
601 hw_dbg(hw
, "Failed to read PBA Block size.\n");
605 /* Subtract one to get PBA word count (PBA Size word is included in
606 * total size) and advance pointer to first PBA word.
611 hw_dbg(hw
, "PBA ID is empty.\n");
615 ptr
= devm_kzalloc(i40e_hw_to_dev(hw
), pba_size
* 2 + 1, GFP_KERNEL
);
620 for (i
= 0; i
< pba_size
; i
++) {
621 status
= i40e_read_nvm_word(hw
, pba_ptr
+ i
, &pba_word
);
623 hw_dbg(hw
, "Failed to read PBA Block word %d.\n", i
);
624 devm_kfree(i40e_hw_to_dev(hw
), hw
->pba_id
);
629 *ptr
++ = (pba_word
>> 8) & 0xFF;
630 *ptr
++ = pba_word
& 0xFF;
635 * i40e_get_media_type - Gets media type
636 * @hw: pointer to the hardware structure
638 static enum i40e_media_type
i40e_get_media_type(struct i40e_hw
*hw
)
640 enum i40e_media_type media
;
642 switch (hw
->phy
.link_info
.phy_type
) {
643 case I40E_PHY_TYPE_10GBASE_SR
:
644 case I40E_PHY_TYPE_10GBASE_LR
:
645 case I40E_PHY_TYPE_1000BASE_SX
:
646 case I40E_PHY_TYPE_1000BASE_LX
:
647 case I40E_PHY_TYPE_40GBASE_SR4
:
648 case I40E_PHY_TYPE_40GBASE_LR4
:
649 case I40E_PHY_TYPE_25GBASE_LR
:
650 case I40E_PHY_TYPE_25GBASE_SR
:
651 media
= I40E_MEDIA_TYPE_FIBER
;
653 case I40E_PHY_TYPE_100BASE_TX
:
654 case I40E_PHY_TYPE_1000BASE_T
:
655 case I40E_PHY_TYPE_2_5GBASE_T_LINK_STATUS
:
656 case I40E_PHY_TYPE_5GBASE_T_LINK_STATUS
:
657 case I40E_PHY_TYPE_10GBASE_T
:
658 media
= I40E_MEDIA_TYPE_BASET
;
660 case I40E_PHY_TYPE_10GBASE_CR1_CU
:
661 case I40E_PHY_TYPE_40GBASE_CR4_CU
:
662 case I40E_PHY_TYPE_10GBASE_CR1
:
663 case I40E_PHY_TYPE_40GBASE_CR4
:
664 case I40E_PHY_TYPE_10GBASE_SFPP_CU
:
665 case I40E_PHY_TYPE_40GBASE_AOC
:
666 case I40E_PHY_TYPE_10GBASE_AOC
:
667 case I40E_PHY_TYPE_25GBASE_CR
:
668 case I40E_PHY_TYPE_25GBASE_AOC
:
669 case I40E_PHY_TYPE_25GBASE_ACC
:
670 media
= I40E_MEDIA_TYPE_DA
;
672 case I40E_PHY_TYPE_1000BASE_KX
:
673 case I40E_PHY_TYPE_10GBASE_KX4
:
674 case I40E_PHY_TYPE_10GBASE_KR
:
675 case I40E_PHY_TYPE_40GBASE_KR4
:
676 case I40E_PHY_TYPE_20GBASE_KR2
:
677 case I40E_PHY_TYPE_25GBASE_KR
:
678 media
= I40E_MEDIA_TYPE_BACKPLANE
;
680 case I40E_PHY_TYPE_SGMII
:
681 case I40E_PHY_TYPE_XAUI
:
682 case I40E_PHY_TYPE_XFI
:
683 case I40E_PHY_TYPE_XLAUI
:
684 case I40E_PHY_TYPE_XLPPI
:
686 media
= I40E_MEDIA_TYPE_UNKNOWN
;
694 * i40e_poll_globr - Poll for Global Reset completion
695 * @hw: pointer to the hardware structure
696 * @retry_limit: how many times to retry before failure
698 static int i40e_poll_globr(struct i40e_hw
*hw
,
703 for (cnt
= 0; cnt
< retry_limit
; cnt
++) {
704 reg
= rd32(hw
, I40E_GLGEN_RSTAT
);
705 if (!(reg
& I40E_GLGEN_RSTAT_DEVSTATE_MASK
))
710 hw_dbg(hw
, "Global reset failed.\n");
711 hw_dbg(hw
, "I40E_GLGEN_RSTAT = 0x%x\n", reg
);
716 #define I40E_PF_RESET_WAIT_COUNT_A0 200
717 #define I40E_PF_RESET_WAIT_COUNT 200
719 * i40e_pf_reset - Reset the PF
720 * @hw: pointer to the hardware structure
722 * Assuming someone else has triggered a global reset,
723 * assure the global reset is complete and then reset the PF
725 int i40e_pf_reset(struct i40e_hw
*hw
)
732 /* Poll for Global Reset steady state in case of recent GRST.
733 * The grst delay value is in 100ms units, and we'll wait a
734 * couple counts longer to be sure we don't just miss the end.
736 grst_del
= FIELD_GET(I40E_GLGEN_RSTCTL_GRSTDEL_MASK
,
737 rd32(hw
, I40E_GLGEN_RSTCTL
));
739 /* It can take upto 15 secs for GRST steady state.
740 * Bump it to 16 secs max to be safe.
742 grst_del
= grst_del
* 20;
744 for (cnt
= 0; cnt
< grst_del
; cnt
++) {
745 reg
= rd32(hw
, I40E_GLGEN_RSTAT
);
746 if (!(reg
& I40E_GLGEN_RSTAT_DEVSTATE_MASK
))
750 if (reg
& I40E_GLGEN_RSTAT_DEVSTATE_MASK
) {
751 hw_dbg(hw
, "Global reset polling failed to complete.\n");
755 /* Now Wait for the FW to be ready */
756 for (cnt1
= 0; cnt1
< I40E_PF_RESET_WAIT_COUNT
; cnt1
++) {
757 reg
= rd32(hw
, I40E_GLNVM_ULD
);
758 reg
&= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK
|
759 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK
);
760 if (reg
== (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK
|
761 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK
)) {
762 hw_dbg(hw
, "Core and Global modules ready %d\n", cnt1
);
765 usleep_range(10000, 20000);
767 if (!(reg
& (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK
|
768 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK
))) {
769 hw_dbg(hw
, "wait for FW Reset complete timedout\n");
770 hw_dbg(hw
, "I40E_GLNVM_ULD = 0x%x\n", reg
);
774 /* If there was a Global Reset in progress when we got here,
775 * we don't need to do the PF Reset
779 if (hw
->revision_id
== 0)
780 cnt
= I40E_PF_RESET_WAIT_COUNT_A0
;
782 cnt
= I40E_PF_RESET_WAIT_COUNT
;
783 reg
= rd32(hw
, I40E_PFGEN_CTRL
);
784 wr32(hw
, I40E_PFGEN_CTRL
,
785 (reg
| I40E_PFGEN_CTRL_PFSWR_MASK
));
787 reg
= rd32(hw
, I40E_PFGEN_CTRL
);
788 if (!(reg
& I40E_PFGEN_CTRL_PFSWR_MASK
))
790 reg2
= rd32(hw
, I40E_GLGEN_RSTAT
);
791 if (reg2
& I40E_GLGEN_RSTAT_DEVSTATE_MASK
)
793 usleep_range(1000, 2000);
795 if (reg2
& I40E_GLGEN_RSTAT_DEVSTATE_MASK
) {
796 if (i40e_poll_globr(hw
, grst_del
))
798 } else if (reg
& I40E_PFGEN_CTRL_PFSWR_MASK
) {
799 hw_dbg(hw
, "PF reset polling failed to complete.\n");
804 i40e_clear_pxe_mode(hw
);
810 * i40e_clear_hw - clear out any left over hw state
811 * @hw: pointer to the hw struct
813 * Clear queues and interrupts, typically called at init time,
814 * but after the capabilities have been found so we know how many
815 * queues and msix vectors have been allocated.
817 void i40e_clear_hw(struct i40e_hw
*hw
)
819 u32 num_queues
, base_queue
;
827 /* get number of interrupts, queues, and VFs */
828 val
= rd32(hw
, I40E_GLPCI_CNF2
);
829 num_pf_int
= FIELD_GET(I40E_GLPCI_CNF2_MSI_X_PF_N_MASK
, val
);
830 num_vf_int
= FIELD_GET(I40E_GLPCI_CNF2_MSI_X_VF_N_MASK
, val
);
832 val
= rd32(hw
, I40E_PFLAN_QALLOC
);
833 base_queue
= FIELD_GET(I40E_PFLAN_QALLOC_FIRSTQ_MASK
, val
);
834 j
= FIELD_GET(I40E_PFLAN_QALLOC_LASTQ_MASK
, val
);
835 if (val
& I40E_PFLAN_QALLOC_VALID_MASK
&& j
>= base_queue
)
836 num_queues
= (j
- base_queue
) + 1;
840 val
= rd32(hw
, I40E_PF_VT_PFALLOC
);
841 i
= FIELD_GET(I40E_PF_VT_PFALLOC_FIRSTVF_MASK
, val
);
842 j
= FIELD_GET(I40E_PF_VT_PFALLOC_LASTVF_MASK
, val
);
843 if (val
& I40E_PF_VT_PFALLOC_VALID_MASK
&& j
>= i
)
844 num_vfs
= (j
- i
) + 1;
848 /* stop all the interrupts */
849 wr32(hw
, I40E_PFINT_ICR0_ENA
, 0);
850 val
= 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT
;
851 for (i
= 0; i
< num_pf_int
- 2; i
++)
852 wr32(hw
, I40E_PFINT_DYN_CTLN(i
), val
);
854 /* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
855 val
= eol
<< I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT
;
856 wr32(hw
, I40E_PFINT_LNKLST0
, val
);
857 for (i
= 0; i
< num_pf_int
- 2; i
++)
858 wr32(hw
, I40E_PFINT_LNKLSTN(i
), val
);
859 val
= eol
<< I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT
;
860 for (i
= 0; i
< num_vfs
; i
++)
861 wr32(hw
, I40E_VPINT_LNKLST0(i
), val
);
862 for (i
= 0; i
< num_vf_int
- 2; i
++)
863 wr32(hw
, I40E_VPINT_LNKLSTN(i
), val
);
865 /* warn the HW of the coming Tx disables */
866 for (i
= 0; i
< num_queues
; i
++) {
867 u32 abs_queue_idx
= base_queue
+ i
;
870 if (abs_queue_idx
>= 128) {
871 reg_block
= abs_queue_idx
/ 128;
872 abs_queue_idx
%= 128;
875 val
= rd32(hw
, I40E_GLLAN_TXPRE_QDIS(reg_block
));
876 val
&= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK
;
877 val
|= (abs_queue_idx
<< I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT
);
878 val
|= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK
;
880 wr32(hw
, I40E_GLLAN_TXPRE_QDIS(reg_block
), val
);
884 /* stop all the queues */
885 for (i
= 0; i
< num_queues
; i
++) {
886 wr32(hw
, I40E_QINT_TQCTL(i
), 0);
887 wr32(hw
, I40E_QTX_ENA(i
), 0);
888 wr32(hw
, I40E_QINT_RQCTL(i
), 0);
889 wr32(hw
, I40E_QRX_ENA(i
), 0);
892 /* short wait for all queue disables to settle */
897 * i40e_clear_pxe_mode - clear pxe operations mode
898 * @hw: pointer to the hw struct
900 * Make sure all PXE mode settings are cleared, including things
901 * like descriptor fetch/write-back mode.
903 void i40e_clear_pxe_mode(struct i40e_hw
*hw
)
907 if (i40e_check_asq_alive(hw
))
908 i40e_aq_clear_pxe_mode(hw
, NULL
);
910 /* Clear single descriptor fetch/write-back mode */
911 reg
= rd32(hw
, I40E_GLLAN_RCTL_0
);
913 if (hw
->revision_id
== 0) {
914 /* As a work around clear PXE_MODE instead of setting it */
915 wr32(hw
, I40E_GLLAN_RCTL_0
, (reg
& (~I40E_GLLAN_RCTL_0_PXE_MODE_MASK
)));
917 wr32(hw
, I40E_GLLAN_RCTL_0
, (reg
| I40E_GLLAN_RCTL_0_PXE_MODE_MASK
));
922 * i40e_led_is_mine - helper to find matching led
923 * @hw: pointer to the hw struct
924 * @idx: index into GPIO registers
926 * returns: 0 if no match, otherwise the value of the GPIO_CTL register
928 static u32
i40e_led_is_mine(struct i40e_hw
*hw
, int idx
)
933 if (!I40E_IS_X710TL_DEVICE(hw
->device_id
) &&
934 !hw
->func_caps
.led
[idx
])
936 gpio_val
= rd32(hw
, I40E_GLGEN_GPIO_CTL(idx
));
937 port
= FIELD_GET(I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK
, gpio_val
);
939 /* if PRT_NUM_NA is 1 then this LED is not port specific, OR
940 * if it is not our port then ignore
942 if ((gpio_val
& I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK
) ||
949 #define I40E_FW_LED BIT(4)
950 #define I40E_LED_MODE_VALID (I40E_GLGEN_GPIO_CTL_LED_MODE_MASK >> \
951 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT)
955 #define I40E_PIN_FUNC_SDP 0x0
956 #define I40E_PIN_FUNC_LED 0x1
959 * i40e_led_get - return current on/off mode
960 * @hw: pointer to the hw struct
962 * The value returned is the 'mode' field as defined in the
963 * GPIO register definitions: 0x0 = off, 0xf = on, and other
964 * values are variations of possible behaviors relating to
965 * blink, link, and wire.
967 u32
i40e_led_get(struct i40e_hw
*hw
)
972 /* as per the documentation GPIO 22-29 are the LED
973 * GPIO pins named LED0..LED7
975 for (i
= I40E_LED0
; i
<= I40E_GLGEN_GPIO_CTL_MAX_INDEX
; i
++) {
976 u32 gpio_val
= i40e_led_is_mine(hw
, i
);
981 mode
= FIELD_GET(I40E_GLGEN_GPIO_CTL_LED_MODE_MASK
, gpio_val
);
989 * i40e_led_set - set new on/off mode
990 * @hw: pointer to the hw struct
991 * @mode: 0=off, 0xf=on (else see manual for mode details)
992 * @blink: true if the LED should blink when on, false if steady
994 * if this function is used to turn on the blink it should
995 * be used to disable the blink when restoring the original state.
997 void i40e_led_set(struct i40e_hw
*hw
, u32 mode
, bool blink
)
1001 if (mode
& ~I40E_LED_MODE_VALID
) {
1002 hw_dbg(hw
, "invalid mode passed in %X\n", mode
);
1006 /* as per the documentation GPIO 22-29 are the LED
1007 * GPIO pins named LED0..LED7
1009 for (i
= I40E_LED0
; i
<= I40E_GLGEN_GPIO_CTL_MAX_INDEX
; i
++) {
1010 u32 gpio_val
= i40e_led_is_mine(hw
, i
);
1015 if (I40E_IS_X710TL_DEVICE(hw
->device_id
)) {
1018 if (mode
& I40E_FW_LED
)
1019 pin_func
= I40E_PIN_FUNC_SDP
;
1021 pin_func
= I40E_PIN_FUNC_LED
;
1023 gpio_val
&= ~I40E_GLGEN_GPIO_CTL_PIN_FUNC_MASK
;
1025 FIELD_PREP(I40E_GLGEN_GPIO_CTL_PIN_FUNC_MASK
,
1028 gpio_val
&= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK
;
1029 /* this & is a bit of paranoia, but serves as a range check */
1030 gpio_val
|= FIELD_PREP(I40E_GLGEN_GPIO_CTL_LED_MODE_MASK
,
1034 gpio_val
|= BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT
);
1036 gpio_val
&= ~BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT
);
1038 wr32(hw
, I40E_GLGEN_GPIO_CTL(i
), gpio_val
);
1043 /* Admin command wrappers */
1046 * i40e_aq_get_phy_capabilities
1047 * @hw: pointer to the hw struct
1048 * @abilities: structure for PHY capabilities to be filled
1049 * @qualified_modules: report Qualified Modules
1050 * @report_init: report init capabilities (active are default)
1051 * @cmd_details: pointer to command details structure or NULL
1053 * Returns the various PHY abilities supported on the Port.
1056 i40e_aq_get_phy_capabilities(struct i40e_hw
*hw
,
1057 bool qualified_modules
, bool report_init
,
1058 struct i40e_aq_get_phy_abilities_resp
*abilities
,
1059 struct i40e_asq_cmd_details
*cmd_details
)
1061 u16 abilities_size
= sizeof(struct i40e_aq_get_phy_abilities_resp
);
1062 u16 max_delay
= I40E_MAX_PHY_TIMEOUT
, total_delay
= 0;
1063 struct i40e_aq_desc desc
;
1070 i40e_fill_default_direct_cmd_desc(&desc
,
1071 i40e_aqc_opc_get_phy_abilities
);
1073 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
1074 if (abilities_size
> I40E_AQ_LARGE_BUF
)
1075 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
1077 if (qualified_modules
)
1078 desc
.params
.external
.param0
|=
1079 cpu_to_le32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES
);
1082 desc
.params
.external
.param0
|=
1083 cpu_to_le32(I40E_AQ_PHY_REPORT_INITIAL_VALUES
);
1085 status
= i40e_asq_send_command(hw
, &desc
, abilities
,
1086 abilities_size
, cmd_details
);
1088 switch (hw
->aq
.asq_last_status
) {
1089 case I40E_AQ_RC_EIO
:
1092 case I40E_AQ_RC_EAGAIN
:
1093 usleep_range(1000, 2000);
1097 /* also covers I40E_AQ_RC_OK */
1102 } while ((hw
->aq
.asq_last_status
== I40E_AQ_RC_EAGAIN
) &&
1103 (total_delay
< max_delay
));
1109 if (hw
->mac
.type
== I40E_MAC_XL710
&&
1110 i40e_is_aq_api_ver_ge(hw
, I40E_FW_API_VERSION_MAJOR
,
1111 I40E_MINOR_VER_GET_LINK_INFO_XL710
)) {
1112 status
= i40e_aq_get_link_info(hw
, true, NULL
, NULL
);
1114 hw
->phy
.phy_types
= le32_to_cpu(abilities
->phy_type
);
1115 hw
->phy
.phy_types
|=
1116 ((u64
)abilities
->phy_type_ext
<< 32);
1124 * i40e_aq_set_phy_config
1125 * @hw: pointer to the hw struct
1126 * @config: structure with PHY configuration to be set
1127 * @cmd_details: pointer to command details structure or NULL
1129 * Set the various PHY configuration parameters
1130 * supported on the Port.One or more of the Set PHY config parameters may be
1131 * ignored in an MFP mode as the PF may not have the privilege to set some
1132 * of the PHY Config parameters. This status will be indicated by the
1135 int i40e_aq_set_phy_config(struct i40e_hw
*hw
,
1136 struct i40e_aq_set_phy_config
*config
,
1137 struct i40e_asq_cmd_details
*cmd_details
)
1139 struct i40e_aq_desc desc
;
1140 struct i40e_aq_set_phy_config
*cmd
=
1141 (struct i40e_aq_set_phy_config
*)&desc
.params
.raw
;
1147 i40e_fill_default_direct_cmd_desc(&desc
,
1148 i40e_aqc_opc_set_phy_config
);
1152 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1157 static noinline_for_stack
int
1158 i40e_set_fc_status(struct i40e_hw
*hw
,
1159 struct i40e_aq_get_phy_abilities_resp
*abilities
,
1160 bool atomic_restart
)
1162 struct i40e_aq_set_phy_config config
;
1163 enum i40e_fc_mode fc_mode
= hw
->fc
.requested_mode
;
1164 u8 pause_mask
= 0x0;
1168 pause_mask
|= I40E_AQ_PHY_FLAG_PAUSE_TX
;
1169 pause_mask
|= I40E_AQ_PHY_FLAG_PAUSE_RX
;
1171 case I40E_FC_RX_PAUSE
:
1172 pause_mask
|= I40E_AQ_PHY_FLAG_PAUSE_RX
;
1174 case I40E_FC_TX_PAUSE
:
1175 pause_mask
|= I40E_AQ_PHY_FLAG_PAUSE_TX
;
1181 memset(&config
, 0, sizeof(struct i40e_aq_set_phy_config
));
1182 /* clear the old pause settings */
1183 config
.abilities
= abilities
->abilities
& ~(I40E_AQ_PHY_FLAG_PAUSE_TX
) &
1184 ~(I40E_AQ_PHY_FLAG_PAUSE_RX
);
1185 /* set the new abilities */
1186 config
.abilities
|= pause_mask
;
1187 /* If the abilities have changed, then set the new config */
1188 if (config
.abilities
== abilities
->abilities
)
1191 /* Auto restart link so settings take effect */
1193 config
.abilities
|= I40E_AQ_PHY_ENABLE_ATOMIC_LINK
;
1194 /* Copy over all the old settings */
1195 config
.phy_type
= abilities
->phy_type
;
1196 config
.phy_type_ext
= abilities
->phy_type_ext
;
1197 config
.link_speed
= abilities
->link_speed
;
1198 config
.eee_capability
= abilities
->eee_capability
;
1199 config
.eeer
= abilities
->eeer_val
;
1200 config
.low_power_ctrl
= abilities
->d3_lpan
;
1201 config
.fec_config
= abilities
->fec_cfg_curr_mod_ext_info
&
1202 I40E_AQ_PHY_FEC_CONFIG_MASK
;
1204 return i40e_aq_set_phy_config(hw
, &config
, NULL
);
1209 * @hw: pointer to the hw struct
1210 * @aq_failures: buffer to return AdminQ failure information
1211 * @atomic_restart: whether to enable atomic link restart
1213 * Set the requested flow control mode using set_phy_config.
1215 int i40e_set_fc(struct i40e_hw
*hw
, u8
*aq_failures
,
1216 bool atomic_restart
)
1218 struct i40e_aq_get_phy_abilities_resp abilities
;
1223 /* Get the current phy config */
1224 status
= i40e_aq_get_phy_capabilities(hw
, false, false, &abilities
,
1227 *aq_failures
|= I40E_SET_FC_AQ_FAIL_GET
;
1231 status
= i40e_set_fc_status(hw
, &abilities
, atomic_restart
);
1233 *aq_failures
|= I40E_SET_FC_AQ_FAIL_SET
;
1235 /* Update the link info */
1236 status
= i40e_update_link_info(hw
);
1238 /* Wait a little bit (on 40G cards it sometimes takes a really
1239 * long time for link to come back from the atomic reset)
1243 status
= i40e_update_link_info(hw
);
1246 *aq_failures
|= I40E_SET_FC_AQ_FAIL_UPDATE
;
1252 * i40e_aq_clear_pxe_mode
1253 * @hw: pointer to the hw struct
1254 * @cmd_details: pointer to command details structure or NULL
1256 * Tell the firmware that the driver is taking over from PXE
1258 int i40e_aq_clear_pxe_mode(struct i40e_hw
*hw
,
1259 struct i40e_asq_cmd_details
*cmd_details
)
1261 struct i40e_aq_desc desc
;
1262 struct i40e_aqc_clear_pxe
*cmd
=
1263 (struct i40e_aqc_clear_pxe
*)&desc
.params
.raw
;
1266 i40e_fill_default_direct_cmd_desc(&desc
,
1267 i40e_aqc_opc_clear_pxe_mode
);
1271 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1273 wr32(hw
, I40E_GLLAN_RCTL_0
, 0x1);
1279 * i40e_aq_set_link_restart_an
1280 * @hw: pointer to the hw struct
1281 * @enable_link: if true: enable link, if false: disable link
1282 * @cmd_details: pointer to command details structure or NULL
1284 * Sets up the link and restarts the Auto-Negotiation over the link.
1286 int i40e_aq_set_link_restart_an(struct i40e_hw
*hw
,
1288 struct i40e_asq_cmd_details
*cmd_details
)
1290 struct i40e_aq_desc desc
;
1291 struct i40e_aqc_set_link_restart_an
*cmd
=
1292 (struct i40e_aqc_set_link_restart_an
*)&desc
.params
.raw
;
1295 i40e_fill_default_direct_cmd_desc(&desc
,
1296 i40e_aqc_opc_set_link_restart_an
);
1298 cmd
->command
= I40E_AQ_PHY_RESTART_AN
;
1300 cmd
->command
|= I40E_AQ_PHY_LINK_ENABLE
;
1302 cmd
->command
&= ~I40E_AQ_PHY_LINK_ENABLE
;
1304 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1310 * i40e_aq_get_link_info
1311 * @hw: pointer to the hw struct
1312 * @enable_lse: enable/disable LinkStatusEvent reporting
1313 * @link: pointer to link status structure - optional
1314 * @cmd_details: pointer to command details structure or NULL
1316 * Returns the link status of the adapter.
1318 int i40e_aq_get_link_info(struct i40e_hw
*hw
,
1319 bool enable_lse
, struct i40e_link_status
*link
,
1320 struct i40e_asq_cmd_details
*cmd_details
)
1322 struct i40e_aq_desc desc
;
1323 struct i40e_aqc_get_link_status
*resp
=
1324 (struct i40e_aqc_get_link_status
*)&desc
.params
.raw
;
1325 struct i40e_link_status
*hw_link_info
= &hw
->phy
.link_info
;
1326 bool tx_pause
, rx_pause
;
1330 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_get_link_status
);
1333 command_flags
= I40E_AQ_LSE_ENABLE
;
1335 command_flags
= I40E_AQ_LSE_DISABLE
;
1336 resp
->command_flags
= cpu_to_le16(command_flags
);
1338 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1341 goto aq_get_link_info_exit
;
1343 /* save off old link status information */
1344 hw
->phy
.link_info_old
= *hw_link_info
;
1346 /* update link status */
1347 hw_link_info
->phy_type
= (enum i40e_aq_phy_type
)resp
->phy_type
;
1348 hw
->phy
.media_type
= i40e_get_media_type(hw
);
1349 hw_link_info
->link_speed
= (enum i40e_aq_link_speed
)resp
->link_speed
;
1350 hw_link_info
->link_info
= resp
->link_info
;
1351 hw_link_info
->an_info
= resp
->an_info
;
1352 hw_link_info
->fec_info
= resp
->config
& (I40E_AQ_CONFIG_FEC_KR_ENA
|
1353 I40E_AQ_CONFIG_FEC_RS_ENA
);
1354 hw_link_info
->ext_info
= resp
->ext_info
;
1355 hw_link_info
->loopback
= resp
->loopback
& I40E_AQ_LOOPBACK_MASK
;
1356 hw_link_info
->max_frame_size
= le16_to_cpu(resp
->max_frame_size
);
1357 hw_link_info
->pacing
= resp
->config
& I40E_AQ_CONFIG_PACING_MASK
;
1359 /* update fc info */
1360 tx_pause
= !!(resp
->an_info
& I40E_AQ_LINK_PAUSE_TX
);
1361 rx_pause
= !!(resp
->an_info
& I40E_AQ_LINK_PAUSE_RX
);
1362 if (tx_pause
& rx_pause
)
1363 hw
->fc
.current_mode
= I40E_FC_FULL
;
1365 hw
->fc
.current_mode
= I40E_FC_TX_PAUSE
;
1367 hw
->fc
.current_mode
= I40E_FC_RX_PAUSE
;
1369 hw
->fc
.current_mode
= I40E_FC_NONE
;
1371 if (resp
->config
& I40E_AQ_CONFIG_CRC_ENA
)
1372 hw_link_info
->crc_enable
= true;
1374 hw_link_info
->crc_enable
= false;
1376 if (resp
->command_flags
& cpu_to_le16(I40E_AQ_LSE_IS_ENABLED
))
1377 hw_link_info
->lse_enable
= true;
1379 hw_link_info
->lse_enable
= false;
1381 if (hw
->mac
.type
== I40E_MAC_XL710
&& i40e_is_fw_ver_lt(hw
, 4, 40) &&
1382 hw_link_info
->phy_type
== 0xE)
1383 hw_link_info
->phy_type
= I40E_PHY_TYPE_10GBASE_SFPP_CU
;
1385 if (test_bit(I40E_HW_CAP_AQ_PHY_ACCESS
, hw
->caps
) &&
1386 hw
->mac
.type
!= I40E_MAC_X722
) {
1389 memcpy(&tmp
, resp
->link_type
, sizeof(tmp
));
1390 hw
->phy
.phy_types
= le32_to_cpu(tmp
);
1391 hw
->phy
.phy_types
|= ((u64
)resp
->link_type_ext
<< 32);
1394 /* save link status information */
1396 *link
= *hw_link_info
;
1398 /* flag cleared so helper functions don't call AQ again */
1399 hw
->phy
.get_link_info
= false;
1401 aq_get_link_info_exit
:
1406 * i40e_aq_set_phy_int_mask
1407 * @hw: pointer to the hw struct
1408 * @mask: interrupt mask to be set
1409 * @cmd_details: pointer to command details structure or NULL
1411 * Set link interrupt mask.
1413 int i40e_aq_set_phy_int_mask(struct i40e_hw
*hw
,
1415 struct i40e_asq_cmd_details
*cmd_details
)
1417 struct i40e_aq_desc desc
;
1418 struct i40e_aqc_set_phy_int_mask
*cmd
=
1419 (struct i40e_aqc_set_phy_int_mask
*)&desc
.params
.raw
;
1422 i40e_fill_default_direct_cmd_desc(&desc
,
1423 i40e_aqc_opc_set_phy_int_mask
);
1425 cmd
->event_mask
= cpu_to_le16(mask
);
1427 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1433 * i40e_aq_set_mac_loopback
1434 * @hw: pointer to the HW struct
1435 * @ena_lpbk: Enable or Disable loopback
1436 * @cmd_details: pointer to command details structure or NULL
1438 * Enable/disable loopback on a given port
1440 int i40e_aq_set_mac_loopback(struct i40e_hw
*hw
, bool ena_lpbk
,
1441 struct i40e_asq_cmd_details
*cmd_details
)
1443 struct i40e_aq_desc desc
;
1444 struct i40e_aqc_set_lb_mode
*cmd
=
1445 (struct i40e_aqc_set_lb_mode
*)&desc
.params
.raw
;
1447 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_set_lb_modes
);
1449 if (hw
->nvm
.version
<= I40E_LEGACY_LOOPBACK_NVM_VER
)
1450 cmd
->lb_mode
= cpu_to_le16(I40E_AQ_LB_MAC_LOCAL_LEGACY
);
1452 cmd
->lb_mode
= cpu_to_le16(I40E_AQ_LB_MAC_LOCAL
);
1455 return i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1459 * i40e_aq_set_phy_debug
1460 * @hw: pointer to the hw struct
1461 * @cmd_flags: debug command flags
1462 * @cmd_details: pointer to command details structure or NULL
1464 * Reset the external PHY.
1466 int i40e_aq_set_phy_debug(struct i40e_hw
*hw
, u8 cmd_flags
,
1467 struct i40e_asq_cmd_details
*cmd_details
)
1469 struct i40e_aq_desc desc
;
1470 struct i40e_aqc_set_phy_debug
*cmd
=
1471 (struct i40e_aqc_set_phy_debug
*)&desc
.params
.raw
;
1474 i40e_fill_default_direct_cmd_desc(&desc
,
1475 i40e_aqc_opc_set_phy_debug
);
1477 cmd
->command_flags
= cmd_flags
;
1479 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1486 * @hw: pointer to the hw struct
1487 * @vsi_ctx: pointer to a vsi context struct
1488 * @cmd_details: pointer to command details structure or NULL
1490 * Add a VSI context to the hardware.
1492 int i40e_aq_add_vsi(struct i40e_hw
*hw
,
1493 struct i40e_vsi_context
*vsi_ctx
,
1494 struct i40e_asq_cmd_details
*cmd_details
)
1496 struct i40e_aq_desc desc
;
1497 struct i40e_aqc_add_get_update_vsi
*cmd
=
1498 (struct i40e_aqc_add_get_update_vsi
*)&desc
.params
.raw
;
1499 struct i40e_aqc_add_get_update_vsi_completion
*resp
=
1500 (struct i40e_aqc_add_get_update_vsi_completion
*)
1504 i40e_fill_default_direct_cmd_desc(&desc
,
1505 i40e_aqc_opc_add_vsi
);
1507 cmd
->uplink_seid
= cpu_to_le16(vsi_ctx
->uplink_seid
);
1508 cmd
->connection_type
= vsi_ctx
->connection_type
;
1509 cmd
->vf_id
= vsi_ctx
->vf_num
;
1510 cmd
->vsi_flags
= cpu_to_le16(vsi_ctx
->flags
);
1512 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
1514 status
= i40e_asq_send_command_atomic(hw
, &desc
, &vsi_ctx
->info
,
1515 sizeof(vsi_ctx
->info
),
1519 goto aq_add_vsi_exit
;
1521 vsi_ctx
->seid
= le16_to_cpu(resp
->seid
);
1522 vsi_ctx
->vsi_number
= le16_to_cpu(resp
->vsi_number
);
1523 vsi_ctx
->vsis_allocated
= le16_to_cpu(resp
->vsi_used
);
1524 vsi_ctx
->vsis_unallocated
= le16_to_cpu(resp
->vsi_free
);
1531 * i40e_aq_set_default_vsi
1532 * @hw: pointer to the hw struct
1534 * @cmd_details: pointer to command details structure or NULL
1536 int i40e_aq_set_default_vsi(struct i40e_hw
*hw
,
1538 struct i40e_asq_cmd_details
*cmd_details
)
1540 struct i40e_aq_desc desc
;
1541 struct i40e_aqc_set_vsi_promiscuous_modes
*cmd
=
1542 (struct i40e_aqc_set_vsi_promiscuous_modes
*)
1546 i40e_fill_default_direct_cmd_desc(&desc
,
1547 i40e_aqc_opc_set_vsi_promiscuous_modes
);
1549 cmd
->promiscuous_flags
= cpu_to_le16(I40E_AQC_SET_VSI_DEFAULT
);
1550 cmd
->valid_flags
= cpu_to_le16(I40E_AQC_SET_VSI_DEFAULT
);
1551 cmd
->seid
= cpu_to_le16(seid
);
1553 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1559 * i40e_aq_clear_default_vsi
1560 * @hw: pointer to the hw struct
1562 * @cmd_details: pointer to command details structure or NULL
1564 int i40e_aq_clear_default_vsi(struct i40e_hw
*hw
,
1566 struct i40e_asq_cmd_details
*cmd_details
)
1568 struct i40e_aq_desc desc
;
1569 struct i40e_aqc_set_vsi_promiscuous_modes
*cmd
=
1570 (struct i40e_aqc_set_vsi_promiscuous_modes
*)
1574 i40e_fill_default_direct_cmd_desc(&desc
,
1575 i40e_aqc_opc_set_vsi_promiscuous_modes
);
1577 cmd
->promiscuous_flags
= cpu_to_le16(0);
1578 cmd
->valid_flags
= cpu_to_le16(I40E_AQC_SET_VSI_DEFAULT
);
1579 cmd
->seid
= cpu_to_le16(seid
);
1581 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1587 * i40e_aq_set_vsi_unicast_promiscuous
1588 * @hw: pointer to the hw struct
1590 * @set: set unicast promiscuous enable/disable
1591 * @cmd_details: pointer to command details structure or NULL
1592 * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
1594 int i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw
*hw
,
1596 struct i40e_asq_cmd_details
*cmd_details
,
1597 bool rx_only_promisc
)
1599 struct i40e_aq_desc desc
;
1600 struct i40e_aqc_set_vsi_promiscuous_modes
*cmd
=
1601 (struct i40e_aqc_set_vsi_promiscuous_modes
*)&desc
.params
.raw
;
1605 i40e_fill_default_direct_cmd_desc(&desc
,
1606 i40e_aqc_opc_set_vsi_promiscuous_modes
);
1609 flags
|= I40E_AQC_SET_VSI_PROMISC_UNICAST
;
1610 if (rx_only_promisc
&& i40e_is_aq_api_ver_ge(hw
, 1, 5))
1611 flags
|= I40E_AQC_SET_VSI_PROMISC_RX_ONLY
;
1614 cmd
->promiscuous_flags
= cpu_to_le16(flags
);
1616 cmd
->valid_flags
= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_UNICAST
);
1617 if (i40e_is_aq_api_ver_ge(hw
, 1, 5))
1619 cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_RX_ONLY
);
1621 cmd
->seid
= cpu_to_le16(seid
);
1622 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1628 * i40e_aq_set_vsi_multicast_promiscuous
1629 * @hw: pointer to the hw struct
1631 * @set: set multicast promiscuous enable/disable
1632 * @cmd_details: pointer to command details structure or NULL
1634 int i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw
*hw
,
1636 struct i40e_asq_cmd_details
*cmd_details
)
1638 struct i40e_aq_desc desc
;
1639 struct i40e_aqc_set_vsi_promiscuous_modes
*cmd
=
1640 (struct i40e_aqc_set_vsi_promiscuous_modes
*)&desc
.params
.raw
;
1644 i40e_fill_default_direct_cmd_desc(&desc
,
1645 i40e_aqc_opc_set_vsi_promiscuous_modes
);
1648 flags
|= I40E_AQC_SET_VSI_PROMISC_MULTICAST
;
1650 cmd
->promiscuous_flags
= cpu_to_le16(flags
);
1652 cmd
->valid_flags
= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_MULTICAST
);
1654 cmd
->seid
= cpu_to_le16(seid
);
1655 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1661 * i40e_aq_set_vsi_mc_promisc_on_vlan
1662 * @hw: pointer to the hw struct
1664 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
1665 * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
1666 * @cmd_details: pointer to command details structure or NULL
1668 int i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw
*hw
,
1669 u16 seid
, bool enable
,
1671 struct i40e_asq_cmd_details
*cmd_details
)
1673 struct i40e_aq_desc desc
;
1674 struct i40e_aqc_set_vsi_promiscuous_modes
*cmd
=
1675 (struct i40e_aqc_set_vsi_promiscuous_modes
*)&desc
.params
.raw
;
1679 i40e_fill_default_direct_cmd_desc(&desc
,
1680 i40e_aqc_opc_set_vsi_promiscuous_modes
);
1683 flags
|= I40E_AQC_SET_VSI_PROMISC_MULTICAST
;
1685 cmd
->promiscuous_flags
= cpu_to_le16(flags
);
1686 cmd
->valid_flags
= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_MULTICAST
);
1687 cmd
->seid
= cpu_to_le16(seid
);
1688 cmd
->vlan_tag
= cpu_to_le16(vid
| I40E_AQC_SET_VSI_VLAN_VALID
);
1690 status
= i40e_asq_send_command_atomic(hw
, &desc
, NULL
, 0,
1697 * i40e_aq_set_vsi_uc_promisc_on_vlan
1698 * @hw: pointer to the hw struct
1700 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
1701 * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
1702 * @cmd_details: pointer to command details structure or NULL
1704 int i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw
*hw
,
1705 u16 seid
, bool enable
,
1707 struct i40e_asq_cmd_details
*cmd_details
)
1709 struct i40e_aq_desc desc
;
1710 struct i40e_aqc_set_vsi_promiscuous_modes
*cmd
=
1711 (struct i40e_aqc_set_vsi_promiscuous_modes
*)&desc
.params
.raw
;
1715 i40e_fill_default_direct_cmd_desc(&desc
,
1716 i40e_aqc_opc_set_vsi_promiscuous_modes
);
1719 flags
|= I40E_AQC_SET_VSI_PROMISC_UNICAST
;
1720 if (i40e_is_aq_api_ver_ge(hw
, 1, 5))
1721 flags
|= I40E_AQC_SET_VSI_PROMISC_RX_ONLY
;
1724 cmd
->promiscuous_flags
= cpu_to_le16(flags
);
1725 cmd
->valid_flags
= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_UNICAST
);
1726 if (i40e_is_aq_api_ver_ge(hw
, 1, 5))
1728 cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_RX_ONLY
);
1729 cmd
->seid
= cpu_to_le16(seid
);
1730 cmd
->vlan_tag
= cpu_to_le16(vid
| I40E_AQC_SET_VSI_VLAN_VALID
);
1732 status
= i40e_asq_send_command_atomic(hw
, &desc
, NULL
, 0,
1739 * i40e_aq_set_vsi_bc_promisc_on_vlan
1740 * @hw: pointer to the hw struct
1742 * @enable: set broadcast promiscuous enable/disable for a given VLAN
1743 * @vid: The VLAN tag filter - capture any broadcast packet with this VLAN tag
1744 * @cmd_details: pointer to command details structure or NULL
1746 int i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw
*hw
,
1747 u16 seid
, bool enable
, u16 vid
,
1748 struct i40e_asq_cmd_details
*cmd_details
)
1750 struct i40e_aq_desc desc
;
1751 struct i40e_aqc_set_vsi_promiscuous_modes
*cmd
=
1752 (struct i40e_aqc_set_vsi_promiscuous_modes
*)&desc
.params
.raw
;
1756 i40e_fill_default_direct_cmd_desc(&desc
,
1757 i40e_aqc_opc_set_vsi_promiscuous_modes
);
1760 flags
|= I40E_AQC_SET_VSI_PROMISC_BROADCAST
;
1762 cmd
->promiscuous_flags
= cpu_to_le16(flags
);
1763 cmd
->valid_flags
= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_BROADCAST
);
1764 cmd
->seid
= cpu_to_le16(seid
);
1765 cmd
->vlan_tag
= cpu_to_le16(vid
| I40E_AQC_SET_VSI_VLAN_VALID
);
1767 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1773 * i40e_aq_set_vsi_broadcast
1774 * @hw: pointer to the hw struct
1776 * @set_filter: true to set filter, false to clear filter
1777 * @cmd_details: pointer to command details structure or NULL
1779 * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
1781 int i40e_aq_set_vsi_broadcast(struct i40e_hw
*hw
,
1782 u16 seid
, bool set_filter
,
1783 struct i40e_asq_cmd_details
*cmd_details
)
1785 struct i40e_aq_desc desc
;
1786 struct i40e_aqc_set_vsi_promiscuous_modes
*cmd
=
1787 (struct i40e_aqc_set_vsi_promiscuous_modes
*)&desc
.params
.raw
;
1790 i40e_fill_default_direct_cmd_desc(&desc
,
1791 i40e_aqc_opc_set_vsi_promiscuous_modes
);
1794 cmd
->promiscuous_flags
1795 |= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_BROADCAST
);
1797 cmd
->promiscuous_flags
1798 &= cpu_to_le16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST
);
1800 cmd
->valid_flags
= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_BROADCAST
);
1801 cmd
->seid
= cpu_to_le16(seid
);
1802 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1808 * i40e_aq_set_vsi_vlan_promisc - control the VLAN promiscuous setting
1809 * @hw: pointer to the hw struct
1811 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
1812 * @cmd_details: pointer to command details structure or NULL
1814 int i40e_aq_set_vsi_vlan_promisc(struct i40e_hw
*hw
,
1815 u16 seid
, bool enable
,
1816 struct i40e_asq_cmd_details
*cmd_details
)
1818 struct i40e_aq_desc desc
;
1819 struct i40e_aqc_set_vsi_promiscuous_modes
*cmd
=
1820 (struct i40e_aqc_set_vsi_promiscuous_modes
*)&desc
.params
.raw
;
1824 i40e_fill_default_direct_cmd_desc(&desc
,
1825 i40e_aqc_opc_set_vsi_promiscuous_modes
);
1827 flags
|= I40E_AQC_SET_VSI_PROMISC_VLAN
;
1829 cmd
->promiscuous_flags
= cpu_to_le16(flags
);
1830 cmd
->valid_flags
= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_VLAN
);
1831 cmd
->seid
= cpu_to_le16(seid
);
1833 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1839 * i40e_aq_get_vsi_params - get VSI configuration info
1840 * @hw: pointer to the hw struct
1841 * @vsi_ctx: pointer to a vsi context struct
1842 * @cmd_details: pointer to command details structure or NULL
1844 int i40e_aq_get_vsi_params(struct i40e_hw
*hw
,
1845 struct i40e_vsi_context
*vsi_ctx
,
1846 struct i40e_asq_cmd_details
*cmd_details
)
1848 struct i40e_aq_desc desc
;
1849 struct i40e_aqc_add_get_update_vsi
*cmd
=
1850 (struct i40e_aqc_add_get_update_vsi
*)&desc
.params
.raw
;
1851 struct i40e_aqc_add_get_update_vsi_completion
*resp
=
1852 (struct i40e_aqc_add_get_update_vsi_completion
*)
1856 i40e_fill_default_direct_cmd_desc(&desc
,
1857 i40e_aqc_opc_get_vsi_parameters
);
1859 cmd
->uplink_seid
= cpu_to_le16(vsi_ctx
->seid
);
1861 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
1863 status
= i40e_asq_send_command(hw
, &desc
, &vsi_ctx
->info
,
1864 sizeof(vsi_ctx
->info
), NULL
);
1867 goto aq_get_vsi_params_exit
;
1869 vsi_ctx
->seid
= le16_to_cpu(resp
->seid
);
1870 vsi_ctx
->vsi_number
= le16_to_cpu(resp
->vsi_number
);
1871 vsi_ctx
->vsis_allocated
= le16_to_cpu(resp
->vsi_used
);
1872 vsi_ctx
->vsis_unallocated
= le16_to_cpu(resp
->vsi_free
);
1874 aq_get_vsi_params_exit
:
1879 * i40e_aq_update_vsi_params
1880 * @hw: pointer to the hw struct
1881 * @vsi_ctx: pointer to a vsi context struct
1882 * @cmd_details: pointer to command details structure or NULL
1884 * Update a VSI context.
1886 int i40e_aq_update_vsi_params(struct i40e_hw
*hw
,
1887 struct i40e_vsi_context
*vsi_ctx
,
1888 struct i40e_asq_cmd_details
*cmd_details
)
1890 struct i40e_aq_desc desc
;
1891 struct i40e_aqc_add_get_update_vsi
*cmd
=
1892 (struct i40e_aqc_add_get_update_vsi
*)&desc
.params
.raw
;
1893 struct i40e_aqc_add_get_update_vsi_completion
*resp
=
1894 (struct i40e_aqc_add_get_update_vsi_completion
*)
1898 i40e_fill_default_direct_cmd_desc(&desc
,
1899 i40e_aqc_opc_update_vsi_parameters
);
1900 cmd
->uplink_seid
= cpu_to_le16(vsi_ctx
->seid
);
1902 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
1904 status
= i40e_asq_send_command_atomic(hw
, &desc
, &vsi_ctx
->info
,
1905 sizeof(vsi_ctx
->info
),
1908 vsi_ctx
->vsis_allocated
= le16_to_cpu(resp
->vsi_used
);
1909 vsi_ctx
->vsis_unallocated
= le16_to_cpu(resp
->vsi_free
);
1915 * i40e_aq_get_switch_config
1916 * @hw: pointer to the hardware structure
1917 * @buf: pointer to the result buffer
1918 * @buf_size: length of input buffer
1919 * @start_seid: seid to start for the report, 0 == beginning
1920 * @cmd_details: pointer to command details structure or NULL
1922 * Fill the buf with switch configuration returned from AdminQ command
1924 int i40e_aq_get_switch_config(struct i40e_hw
*hw
,
1925 struct i40e_aqc_get_switch_config_resp
*buf
,
1926 u16 buf_size
, u16
*start_seid
,
1927 struct i40e_asq_cmd_details
*cmd_details
)
1929 struct i40e_aq_desc desc
;
1930 struct i40e_aqc_switch_seid
*scfg
=
1931 (struct i40e_aqc_switch_seid
*)&desc
.params
.raw
;
1934 i40e_fill_default_direct_cmd_desc(&desc
,
1935 i40e_aqc_opc_get_switch_config
);
1936 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
1937 if (buf_size
> I40E_AQ_LARGE_BUF
)
1938 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
1939 scfg
->seid
= cpu_to_le16(*start_seid
);
1941 status
= i40e_asq_send_command(hw
, &desc
, buf
, buf_size
, cmd_details
);
1942 *start_seid
= le16_to_cpu(scfg
->seid
);
1948 * i40e_aq_set_switch_config
1949 * @hw: pointer to the hardware structure
1950 * @flags: bit flag values to set
1951 * @mode: cloud filter mode
1952 * @valid_flags: which bit flags to set
1953 * @mode: cloud filter mode
1954 * @cmd_details: pointer to command details structure or NULL
1956 * Set switch configuration bits
1958 int i40e_aq_set_switch_config(struct i40e_hw
*hw
,
1960 u16 valid_flags
, u8 mode
,
1961 struct i40e_asq_cmd_details
*cmd_details
)
1963 struct i40e_aq_desc desc
;
1964 struct i40e_aqc_set_switch_config
*scfg
=
1965 (struct i40e_aqc_set_switch_config
*)&desc
.params
.raw
;
1968 i40e_fill_default_direct_cmd_desc(&desc
,
1969 i40e_aqc_opc_set_switch_config
);
1970 scfg
->flags
= cpu_to_le16(flags
);
1971 scfg
->valid_flags
= cpu_to_le16(valid_flags
);
1973 if (test_bit(I40E_HW_CAP_802_1AD
, hw
->caps
)) {
1974 scfg
->switch_tag
= cpu_to_le16(hw
->switch_tag
);
1975 scfg
->first_tag
= cpu_to_le16(hw
->first_tag
);
1976 scfg
->second_tag
= cpu_to_le16(hw
->second_tag
);
1978 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
1984 * i40e_aq_get_firmware_version
1985 * @hw: pointer to the hw struct
1986 * @fw_major_version: firmware major version
1987 * @fw_minor_version: firmware minor version
1988 * @fw_build: firmware build number
1989 * @api_major_version: major queue version
1990 * @api_minor_version: minor queue version
1991 * @cmd_details: pointer to command details structure or NULL
1993 * Get the firmware version from the admin queue commands
1995 int i40e_aq_get_firmware_version(struct i40e_hw
*hw
,
1996 u16
*fw_major_version
, u16
*fw_minor_version
,
1998 u16
*api_major_version
, u16
*api_minor_version
,
1999 struct i40e_asq_cmd_details
*cmd_details
)
2001 struct i40e_aq_desc desc
;
2002 struct i40e_aqc_get_version
*resp
=
2003 (struct i40e_aqc_get_version
*)&desc
.params
.raw
;
2006 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_get_version
);
2008 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
2011 if (fw_major_version
)
2012 *fw_major_version
= le16_to_cpu(resp
->fw_major
);
2013 if (fw_minor_version
)
2014 *fw_minor_version
= le16_to_cpu(resp
->fw_minor
);
2016 *fw_build
= le32_to_cpu(resp
->fw_build
);
2017 if (api_major_version
)
2018 *api_major_version
= le16_to_cpu(resp
->api_major
);
2019 if (api_minor_version
)
2020 *api_minor_version
= le16_to_cpu(resp
->api_minor
);
2027 * i40e_aq_send_driver_version
2028 * @hw: pointer to the hw struct
2029 * @dv: driver's major, minor version
2030 * @cmd_details: pointer to command details structure or NULL
2032 * Send the driver version to the firmware
2034 int i40e_aq_send_driver_version(struct i40e_hw
*hw
,
2035 struct i40e_driver_version
*dv
,
2036 struct i40e_asq_cmd_details
*cmd_details
)
2038 struct i40e_aq_desc desc
;
2039 struct i40e_aqc_driver_version
*cmd
=
2040 (struct i40e_aqc_driver_version
*)&desc
.params
.raw
;
2047 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_driver_version
);
2049 desc
.flags
|= cpu_to_le16(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
);
2050 cmd
->driver_major_ver
= dv
->major_version
;
2051 cmd
->driver_minor_ver
= dv
->minor_version
;
2052 cmd
->driver_build_ver
= dv
->build_version
;
2053 cmd
->driver_subbuild_ver
= dv
->subbuild_version
;
2056 while (len
< sizeof(dv
->driver_string
) &&
2057 (dv
->driver_string
[len
] < 0x80) &&
2058 dv
->driver_string
[len
])
2060 status
= i40e_asq_send_command(hw
, &desc
, dv
->driver_string
,
2067 * i40e_get_link_status - get status of the HW network link
2068 * @hw: pointer to the hw struct
2069 * @link_up: pointer to bool (true/false = linkup/linkdown)
2071 * Variable link_up true if link is up, false if link is down.
2072 * The variable link_up is invalid if returned value of status != 0
2074 * Side effect: LinkStatusEvent reporting becomes enabled
2076 int i40e_get_link_status(struct i40e_hw
*hw
, bool *link_up
)
2080 if (hw
->phy
.get_link_info
) {
2081 status
= i40e_update_link_info(hw
);
2084 i40e_debug(hw
, I40E_DEBUG_LINK
, "get link failed: status %d\n",
2088 *link_up
= hw
->phy
.link_info
.link_info
& I40E_AQ_LINK_UP
;
2094 * i40e_update_link_info - update status of the HW network link
2095 * @hw: pointer to the hw struct
2097 noinline_for_stack
int i40e_update_link_info(struct i40e_hw
*hw
)
2099 struct i40e_aq_get_phy_abilities_resp abilities
;
2102 status
= i40e_aq_get_link_info(hw
, true, NULL
, NULL
);
2106 /* extra checking needed to ensure link info to user is timely */
2107 if ((hw
->phy
.link_info
.link_info
& I40E_AQ_MEDIA_AVAILABLE
) &&
2108 ((hw
->phy
.link_info
.link_info
& I40E_AQ_LINK_UP
) ||
2109 !(hw
->phy
.link_info_old
.link_info
& I40E_AQ_LINK_UP
))) {
2110 status
= i40e_aq_get_phy_capabilities(hw
, false, false,
2115 if (abilities
.fec_cfg_curr_mod_ext_info
&
2116 I40E_AQ_ENABLE_FEC_AUTO
)
2117 hw
->phy
.link_info
.req_fec_info
=
2118 (I40E_AQ_REQUEST_FEC_KR
|
2119 I40E_AQ_REQUEST_FEC_RS
);
2121 hw
->phy
.link_info
.req_fec_info
=
2122 abilities
.fec_cfg_curr_mod_ext_info
&
2123 (I40E_AQ_REQUEST_FEC_KR
|
2124 I40E_AQ_REQUEST_FEC_RS
);
2126 memcpy(hw
->phy
.link_info
.module_type
, &abilities
.module_type
,
2127 sizeof(hw
->phy
.link_info
.module_type
));
2134 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2135 * @hw: pointer to the hw struct
2136 * @uplink_seid: the MAC or other gizmo SEID
2137 * @downlink_seid: the VSI SEID
2138 * @enabled_tc: bitmap of TCs to be enabled
2139 * @default_port: true for default port VSI, false for control port
2140 * @veb_seid: pointer to where to put the resulting VEB SEID
2141 * @enable_stats: true to turn on VEB stats
2142 * @cmd_details: pointer to command details structure or NULL
2144 * This asks the FW to add a VEB between the uplink and downlink
2145 * elements. If the uplink SEID is 0, this will be a floating VEB.
2147 int i40e_aq_add_veb(struct i40e_hw
*hw
, u16 uplink_seid
,
2148 u16 downlink_seid
, u8 enabled_tc
,
2149 bool default_port
, u16
*veb_seid
,
2151 struct i40e_asq_cmd_details
*cmd_details
)
2153 struct i40e_aq_desc desc
;
2154 struct i40e_aqc_add_veb
*cmd
=
2155 (struct i40e_aqc_add_veb
*)&desc
.params
.raw
;
2156 struct i40e_aqc_add_veb_completion
*resp
=
2157 (struct i40e_aqc_add_veb_completion
*)&desc
.params
.raw
;
2161 /* SEIDs need to either both be set or both be 0 for floating VEB */
2162 if (!!uplink_seid
!= !!downlink_seid
)
2165 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_add_veb
);
2167 cmd
->uplink_seid
= cpu_to_le16(uplink_seid
);
2168 cmd
->downlink_seid
= cpu_to_le16(downlink_seid
);
2169 cmd
->enable_tcs
= enabled_tc
;
2171 veb_flags
|= I40E_AQC_ADD_VEB_FLOATING
;
2173 veb_flags
|= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT
;
2175 veb_flags
|= I40E_AQC_ADD_VEB_PORT_TYPE_DATA
;
2177 /* reverse logic here: set the bitflag to disable the stats */
2179 veb_flags
|= I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS
;
2181 cmd
->veb_flags
= cpu_to_le16(veb_flags
);
2183 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
2185 if (!status
&& veb_seid
)
2186 *veb_seid
= le16_to_cpu(resp
->veb_seid
);
2192 * i40e_aq_get_veb_parameters - Retrieve VEB parameters
2193 * @hw: pointer to the hw struct
2194 * @veb_seid: the SEID of the VEB to query
2195 * @switch_id: the uplink switch id
2196 * @floating: set to true if the VEB is floating
2197 * @statistic_index: index of the stats counter block for this VEB
2198 * @vebs_used: number of VEB's used by function
2199 * @vebs_free: total VEB's not reserved by any function
2200 * @cmd_details: pointer to command details structure or NULL
2202 * This retrieves the parameters for a particular VEB, specified by
2203 * uplink_seid, and returns them to the caller.
2205 int i40e_aq_get_veb_parameters(struct i40e_hw
*hw
,
2206 u16 veb_seid
, u16
*switch_id
,
2207 bool *floating
, u16
*statistic_index
,
2208 u16
*vebs_used
, u16
*vebs_free
,
2209 struct i40e_asq_cmd_details
*cmd_details
)
2211 struct i40e_aq_desc desc
;
2212 struct i40e_aqc_get_veb_parameters_completion
*cmd_resp
=
2213 (struct i40e_aqc_get_veb_parameters_completion
*)
2220 i40e_fill_default_direct_cmd_desc(&desc
,
2221 i40e_aqc_opc_get_veb_parameters
);
2222 cmd_resp
->seid
= cpu_to_le16(veb_seid
);
2224 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
2229 *switch_id
= le16_to_cpu(cmd_resp
->switch_id
);
2230 if (statistic_index
)
2231 *statistic_index
= le16_to_cpu(cmd_resp
->statistic_index
);
2233 *vebs_used
= le16_to_cpu(cmd_resp
->vebs_used
);
2235 *vebs_free
= le16_to_cpu(cmd_resp
->vebs_free
);
2237 u16 flags
= le16_to_cpu(cmd_resp
->veb_flags
);
2239 if (flags
& I40E_AQC_ADD_VEB_FLOATING
)
2250 * i40e_prepare_add_macvlan
2251 * @mv_list: list of macvlans to be added
2252 * @desc: pointer to AQ descriptor structure
2253 * @count: length of the list
2254 * @seid: VSI for the mac address
2256 * Internal helper function that prepares the add macvlan request
2257 * and returns the buffer size.
2260 i40e_prepare_add_macvlan(struct i40e_aqc_add_macvlan_element_data
*mv_list
,
2261 struct i40e_aq_desc
*desc
, u16 count
, u16 seid
)
2263 struct i40e_aqc_macvlan
*cmd
=
2264 (struct i40e_aqc_macvlan
*)&desc
->params
.raw
;
2268 buf_size
= count
* sizeof(*mv_list
);
2270 /* prep the rest of the request */
2271 i40e_fill_default_direct_cmd_desc(desc
, i40e_aqc_opc_add_macvlan
);
2272 cmd
->num_addresses
= cpu_to_le16(count
);
2273 cmd
->seid
[0] = cpu_to_le16(I40E_AQC_MACVLAN_CMD_SEID_VALID
| seid
);
2277 for (i
= 0; i
< count
; i
++)
2278 if (is_multicast_ether_addr(mv_list
[i
].mac_addr
))
2280 cpu_to_le16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC
);
2282 desc
->flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
2283 if (buf_size
> I40E_AQ_LARGE_BUF
)
2284 desc
->flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
2290 * i40e_aq_add_macvlan
2291 * @hw: pointer to the hw struct
2292 * @seid: VSI for the mac address
2293 * @mv_list: list of macvlans to be added
2294 * @count: length of the list
2295 * @cmd_details: pointer to command details structure or NULL
2297 * Add MAC/VLAN addresses to the HW filtering
2300 i40e_aq_add_macvlan(struct i40e_hw
*hw
, u16 seid
,
2301 struct i40e_aqc_add_macvlan_element_data
*mv_list
,
2302 u16 count
, struct i40e_asq_cmd_details
*cmd_details
)
2304 struct i40e_aq_desc desc
;
2307 if (count
== 0 || !mv_list
|| !hw
)
2310 buf_size
= i40e_prepare_add_macvlan(mv_list
, &desc
, count
, seid
);
2312 return i40e_asq_send_command_atomic(hw
, &desc
, mv_list
, buf_size
,
2317 * i40e_aq_add_macvlan_v2
2318 * @hw: pointer to the hw struct
2319 * @seid: VSI for the mac address
2320 * @mv_list: list of macvlans to be added
2321 * @count: length of the list
2322 * @cmd_details: pointer to command details structure or NULL
2323 * @aq_status: pointer to Admin Queue status return value
2325 * Add MAC/VLAN addresses to the HW filtering.
2326 * The _v2 version returns the last Admin Queue status in aq_status
2327 * to avoid race conditions in access to hw->aq.asq_last_status.
2328 * It also calls _v2 versions of asq_send_command functions to
2329 * get the aq_status on the stack.
2332 i40e_aq_add_macvlan_v2(struct i40e_hw
*hw
, u16 seid
,
2333 struct i40e_aqc_add_macvlan_element_data
*mv_list
,
2334 u16 count
, struct i40e_asq_cmd_details
*cmd_details
,
2335 enum i40e_admin_queue_err
*aq_status
)
2337 struct i40e_aq_desc desc
;
2340 if (count
== 0 || !mv_list
|| !hw
)
2343 buf_size
= i40e_prepare_add_macvlan(mv_list
, &desc
, count
, seid
);
2345 return i40e_asq_send_command_atomic_v2(hw
, &desc
, mv_list
, buf_size
,
2346 cmd_details
, true, aq_status
);
2350 * i40e_aq_remove_macvlan
2351 * @hw: pointer to the hw struct
2352 * @seid: VSI for the mac address
2353 * @mv_list: list of macvlans to be removed
2354 * @count: length of the list
2355 * @cmd_details: pointer to command details structure or NULL
2357 * Remove MAC/VLAN addresses from the HW filtering
2360 i40e_aq_remove_macvlan(struct i40e_hw
*hw
, u16 seid
,
2361 struct i40e_aqc_remove_macvlan_element_data
*mv_list
,
2362 u16 count
, struct i40e_asq_cmd_details
*cmd_details
)
2364 struct i40e_aq_desc desc
;
2365 struct i40e_aqc_macvlan
*cmd
=
2366 (struct i40e_aqc_macvlan
*)&desc
.params
.raw
;
2370 if (count
== 0 || !mv_list
|| !hw
)
2373 buf_size
= count
* sizeof(*mv_list
);
2375 /* prep the rest of the request */
2376 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_remove_macvlan
);
2377 cmd
->num_addresses
= cpu_to_le16(count
);
2378 cmd
->seid
[0] = cpu_to_le16(I40E_AQC_MACVLAN_CMD_SEID_VALID
| seid
);
2382 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
2383 if (buf_size
> I40E_AQ_LARGE_BUF
)
2384 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
2386 status
= i40e_asq_send_command_atomic(hw
, &desc
, mv_list
, buf_size
,
2393 * i40e_aq_remove_macvlan_v2
2394 * @hw: pointer to the hw struct
2395 * @seid: VSI for the mac address
2396 * @mv_list: list of macvlans to be removed
2397 * @count: length of the list
2398 * @cmd_details: pointer to command details structure or NULL
2399 * @aq_status: pointer to Admin Queue status return value
2401 * Remove MAC/VLAN addresses from the HW filtering.
2402 * The _v2 version returns the last Admin Queue status in aq_status
2403 * to avoid race conditions in access to hw->aq.asq_last_status.
2404 * It also calls _v2 versions of asq_send_command functions to
2405 * get the aq_status on the stack.
2408 i40e_aq_remove_macvlan_v2(struct i40e_hw
*hw
, u16 seid
,
2409 struct i40e_aqc_remove_macvlan_element_data
*mv_list
,
2410 u16 count
, struct i40e_asq_cmd_details
*cmd_details
,
2411 enum i40e_admin_queue_err
*aq_status
)
2413 struct i40e_aqc_macvlan
*cmd
;
2414 struct i40e_aq_desc desc
;
2417 if (count
== 0 || !mv_list
|| !hw
)
2420 buf_size
= count
* sizeof(*mv_list
);
2422 /* prep the rest of the request */
2423 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_remove_macvlan
);
2424 cmd
= (struct i40e_aqc_macvlan
*)&desc
.params
.raw
;
2425 cmd
->num_addresses
= cpu_to_le16(count
);
2426 cmd
->seid
[0] = cpu_to_le16(I40E_AQC_MACVLAN_CMD_SEID_VALID
| seid
);
2430 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
2431 if (buf_size
> I40E_AQ_LARGE_BUF
)
2432 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
2434 return i40e_asq_send_command_atomic_v2(hw
, &desc
, mv_list
, buf_size
,
2435 cmd_details
, true, aq_status
);
2439 * i40e_mirrorrule_op - Internal helper function to add/delete mirror rule
2440 * @hw: pointer to the hw struct
2441 * @opcode: AQ opcode for add or delete mirror rule
2442 * @sw_seid: Switch SEID (to which rule refers)
2443 * @rule_type: Rule Type (ingress/egress/VLAN)
2444 * @id: Destination VSI SEID or Rule ID
2445 * @count: length of the list
2446 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
2447 * @cmd_details: pointer to command details structure or NULL
2448 * @rule_id: Rule ID returned from FW
2449 * @rules_used: Number of rules used in internal switch
2450 * @rules_free: Number of rules free in internal switch
2452 * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
2453 * VEBs/VEPA elements only
2455 static int i40e_mirrorrule_op(struct i40e_hw
*hw
,
2456 u16 opcode
, u16 sw_seid
, u16 rule_type
, u16 id
,
2457 u16 count
, __le16
*mr_list
,
2458 struct i40e_asq_cmd_details
*cmd_details
,
2459 u16
*rule_id
, u16
*rules_used
, u16
*rules_free
)
2461 struct i40e_aq_desc desc
;
2462 struct i40e_aqc_add_delete_mirror_rule
*cmd
=
2463 (struct i40e_aqc_add_delete_mirror_rule
*)&desc
.params
.raw
;
2464 struct i40e_aqc_add_delete_mirror_rule_completion
*resp
=
2465 (struct i40e_aqc_add_delete_mirror_rule_completion
*)&desc
.params
.raw
;
2469 buf_size
= count
* sizeof(*mr_list
);
2471 /* prep the rest of the request */
2472 i40e_fill_default_direct_cmd_desc(&desc
, opcode
);
2473 cmd
->seid
= cpu_to_le16(sw_seid
);
2474 cmd
->rule_type
= cpu_to_le16(rule_type
&
2475 I40E_AQC_MIRROR_RULE_TYPE_MASK
);
2476 cmd
->num_entries
= cpu_to_le16(count
);
2477 /* Dest VSI for add, rule_id for delete */
2478 cmd
->destination
= cpu_to_le16(id
);
2480 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
|
2482 if (buf_size
> I40E_AQ_LARGE_BUF
)
2483 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
2486 status
= i40e_asq_send_command(hw
, &desc
, mr_list
, buf_size
,
2489 hw
->aq
.asq_last_status
== I40E_AQ_RC_ENOSPC
) {
2491 *rule_id
= le16_to_cpu(resp
->rule_id
);
2493 *rules_used
= le16_to_cpu(resp
->mirror_rules_used
);
2495 *rules_free
= le16_to_cpu(resp
->mirror_rules_free
);
2501 * i40e_aq_add_mirrorrule - add a mirror rule
2502 * @hw: pointer to the hw struct
2503 * @sw_seid: Switch SEID (to which rule refers)
2504 * @rule_type: Rule Type (ingress/egress/VLAN)
2505 * @dest_vsi: SEID of VSI to which packets will be mirrored
2506 * @count: length of the list
2507 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
2508 * @cmd_details: pointer to command details structure or NULL
2509 * @rule_id: Rule ID returned from FW
2510 * @rules_used: Number of rules used in internal switch
2511 * @rules_free: Number of rules free in internal switch
2513 * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
2515 int i40e_aq_add_mirrorrule(struct i40e_hw
*hw
, u16 sw_seid
,
2516 u16 rule_type
, u16 dest_vsi
, u16 count
,
2518 struct i40e_asq_cmd_details
*cmd_details
,
2519 u16
*rule_id
, u16
*rules_used
, u16
*rules_free
)
2521 if (!(rule_type
== I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS
||
2522 rule_type
== I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS
)) {
2523 if (count
== 0 || !mr_list
)
2527 return i40e_mirrorrule_op(hw
, i40e_aqc_opc_add_mirror_rule
, sw_seid
,
2528 rule_type
, dest_vsi
, count
, mr_list
,
2529 cmd_details
, rule_id
, rules_used
, rules_free
);
2533 * i40e_aq_delete_mirrorrule - delete a mirror rule
2534 * @hw: pointer to the hw struct
2535 * @sw_seid: Switch SEID (to which rule refers)
2536 * @rule_type: Rule Type (ingress/egress/VLAN)
2537 * @count: length of the list
2538 * @rule_id: Rule ID that is returned in the receive desc as part of
2540 * @mr_list: list of mirrored VLAN IDs to be removed
2541 * @cmd_details: pointer to command details structure or NULL
2542 * @rules_used: Number of rules used in internal switch
2543 * @rules_free: Number of rules free in internal switch
2545 * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
2547 int i40e_aq_delete_mirrorrule(struct i40e_hw
*hw
, u16 sw_seid
,
2548 u16 rule_type
, u16 rule_id
, u16 count
,
2550 struct i40e_asq_cmd_details
*cmd_details
,
2551 u16
*rules_used
, u16
*rules_free
)
2553 /* Rule ID has to be valid except rule_type: INGRESS VLAN mirroring */
2554 if (rule_type
== I40E_AQC_MIRROR_RULE_TYPE_VLAN
) {
2555 /* count and mr_list shall be valid for rule_type INGRESS VLAN
2556 * mirroring. For other rule_type, count and rule_type should
2559 if (count
== 0 || !mr_list
)
2563 return i40e_mirrorrule_op(hw
, i40e_aqc_opc_delete_mirror_rule
, sw_seid
,
2564 rule_type
, rule_id
, count
, mr_list
,
2565 cmd_details
, NULL
, rules_used
, rules_free
);
2569 * i40e_aq_send_msg_to_vf
2570 * @hw: pointer to the hardware structure
2571 * @vfid: VF id to send msg
2572 * @v_opcode: opcodes for VF-PF communication
2573 * @v_retval: return error code
2574 * @msg: pointer to the msg buffer
2575 * @msglen: msg length
2576 * @cmd_details: pointer to command details
2580 int i40e_aq_send_msg_to_vf(struct i40e_hw
*hw
, u16 vfid
,
2581 u32 v_opcode
, u32 v_retval
, u8
*msg
, u16 msglen
,
2582 struct i40e_asq_cmd_details
*cmd_details
)
2584 struct i40e_aq_desc desc
;
2585 struct i40e_aqc_pf_vf_message
*cmd
=
2586 (struct i40e_aqc_pf_vf_message
*)&desc
.params
.raw
;
2589 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_send_msg_to_vf
);
2590 cmd
->id
= cpu_to_le32(vfid
);
2591 desc
.cookie_high
= cpu_to_le32(v_opcode
);
2592 desc
.cookie_low
= cpu_to_le32(v_retval
);
2593 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_SI
);
2595 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
|
2597 if (msglen
> I40E_AQ_LARGE_BUF
)
2598 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
2599 desc
.datalen
= cpu_to_le16(msglen
);
2601 status
= i40e_asq_send_command(hw
, &desc
, msg
, msglen
, cmd_details
);
2607 * i40e_aq_debug_read_register
2608 * @hw: pointer to the hw struct
2609 * @reg_addr: register address
2610 * @reg_val: register value
2611 * @cmd_details: pointer to command details structure or NULL
2613 * Read the register using the admin queue commands
2615 int i40e_aq_debug_read_register(struct i40e_hw
*hw
,
2616 u32 reg_addr
, u64
*reg_val
,
2617 struct i40e_asq_cmd_details
*cmd_details
)
2619 struct i40e_aq_desc desc
;
2620 struct i40e_aqc_debug_reg_read_write
*cmd_resp
=
2621 (struct i40e_aqc_debug_reg_read_write
*)&desc
.params
.raw
;
2624 if (reg_val
== NULL
)
2627 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_debug_read_reg
);
2629 cmd_resp
->address
= cpu_to_le32(reg_addr
);
2631 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
2634 *reg_val
= ((u64
)le32_to_cpu(cmd_resp
->value_high
) << 32) |
2635 (u64
)le32_to_cpu(cmd_resp
->value_low
);
2642 * i40e_aq_debug_write_register
2643 * @hw: pointer to the hw struct
2644 * @reg_addr: register address
2645 * @reg_val: register value
2646 * @cmd_details: pointer to command details structure or NULL
2648 * Write to a register using the admin queue commands
2650 int i40e_aq_debug_write_register(struct i40e_hw
*hw
,
2651 u32 reg_addr
, u64 reg_val
,
2652 struct i40e_asq_cmd_details
*cmd_details
)
2654 struct i40e_aq_desc desc
;
2655 struct i40e_aqc_debug_reg_read_write
*cmd
=
2656 (struct i40e_aqc_debug_reg_read_write
*)&desc
.params
.raw
;
2659 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_debug_write_reg
);
2661 cmd
->address
= cpu_to_le32(reg_addr
);
2662 cmd
->value_high
= cpu_to_le32((u32
)(reg_val
>> 32));
2663 cmd
->value_low
= cpu_to_le32((u32
)(reg_val
& 0xFFFFFFFF));
2665 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
2671 * i40e_aq_request_resource
2672 * @hw: pointer to the hw struct
2673 * @resource: resource id
2674 * @access: access type
2675 * @sdp_number: resource number
2676 * @timeout: the maximum time in ms that the driver may hold the resource
2677 * @cmd_details: pointer to command details structure or NULL
2679 * requests common resource using the admin queue commands
2681 int i40e_aq_request_resource(struct i40e_hw
*hw
,
2682 enum i40e_aq_resources_ids resource
,
2683 enum i40e_aq_resource_access_type access
,
2684 u8 sdp_number
, u64
*timeout
,
2685 struct i40e_asq_cmd_details
*cmd_details
)
2687 struct i40e_aq_desc desc
;
2688 struct i40e_aqc_request_resource
*cmd_resp
=
2689 (struct i40e_aqc_request_resource
*)&desc
.params
.raw
;
2692 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_request_resource
);
2694 cmd_resp
->resource_id
= cpu_to_le16(resource
);
2695 cmd_resp
->access_type
= cpu_to_le16(access
);
2696 cmd_resp
->resource_number
= cpu_to_le32(sdp_number
);
2698 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
2699 /* The completion specifies the maximum time in ms that the driver
2700 * may hold the resource in the Timeout field.
2701 * If the resource is held by someone else, the command completes with
2702 * busy return value and the timeout field indicates the maximum time
2703 * the current owner of the resource has to free it.
2705 if (!status
|| hw
->aq
.asq_last_status
== I40E_AQ_RC_EBUSY
)
2706 *timeout
= le32_to_cpu(cmd_resp
->timeout
);
2712 * i40e_aq_release_resource
2713 * @hw: pointer to the hw struct
2714 * @resource: resource id
2715 * @sdp_number: resource number
2716 * @cmd_details: pointer to command details structure or NULL
2718 * release common resource using the admin queue commands
2720 int i40e_aq_release_resource(struct i40e_hw
*hw
,
2721 enum i40e_aq_resources_ids resource
,
2723 struct i40e_asq_cmd_details
*cmd_details
)
2725 struct i40e_aq_desc desc
;
2726 struct i40e_aqc_request_resource
*cmd
=
2727 (struct i40e_aqc_request_resource
*)&desc
.params
.raw
;
2730 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_release_resource
);
2732 cmd
->resource_id
= cpu_to_le16(resource
);
2733 cmd
->resource_number
= cpu_to_le32(sdp_number
);
2735 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
2742 * @hw: pointer to the hw struct
2743 * @module_pointer: module pointer location in words from the NVM beginning
2744 * @offset: byte offset from the module beginning
2745 * @length: length of the section to be read (in bytes from the offset)
2746 * @data: command buffer (size [bytes] = length)
2747 * @last_command: tells if this is the last command in a series
2748 * @cmd_details: pointer to command details structure or NULL
2750 * Read the NVM using the admin queue commands
2752 int i40e_aq_read_nvm(struct i40e_hw
*hw
, u8 module_pointer
,
2753 u32 offset
, u16 length
, void *data
,
2755 struct i40e_asq_cmd_details
*cmd_details
)
2757 struct i40e_aq_desc desc
;
2758 struct i40e_aqc_nvm_update
*cmd
=
2759 (struct i40e_aqc_nvm_update
*)&desc
.params
.raw
;
2762 /* In offset the highest byte must be zeroed. */
2763 if (offset
& 0xFF000000) {
2765 goto i40e_aq_read_nvm_exit
;
2768 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_nvm_read
);
2770 /* If this is the last command in a series, set the proper flag. */
2772 cmd
->command_flags
|= I40E_AQ_NVM_LAST_CMD
;
2773 cmd
->module_pointer
= module_pointer
;
2774 cmd
->offset
= cpu_to_le32(offset
);
2775 cmd
->length
= cpu_to_le16(length
);
2777 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
2778 if (length
> I40E_AQ_LARGE_BUF
)
2779 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
2781 status
= i40e_asq_send_command(hw
, &desc
, data
, length
, cmd_details
);
2783 i40e_aq_read_nvm_exit
:
2789 * @hw: pointer to the hw struct
2790 * @module_pointer: module pointer location in words from the NVM beginning
2791 * @offset: offset in the module (expressed in 4 KB from module's beginning)
2792 * @length: length of the section to be erased (expressed in 4 KB)
2793 * @last_command: tells if this is the last command in a series
2794 * @cmd_details: pointer to command details structure or NULL
2796 * Erase the NVM sector using the admin queue commands
2798 int i40e_aq_erase_nvm(struct i40e_hw
*hw
, u8 module_pointer
,
2799 u32 offset
, u16 length
, bool last_command
,
2800 struct i40e_asq_cmd_details
*cmd_details
)
2802 struct i40e_aq_desc desc
;
2803 struct i40e_aqc_nvm_update
*cmd
=
2804 (struct i40e_aqc_nvm_update
*)&desc
.params
.raw
;
2807 /* In offset the highest byte must be zeroed. */
2808 if (offset
& 0xFF000000) {
2810 goto i40e_aq_erase_nvm_exit
;
2813 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_nvm_erase
);
2815 /* If this is the last command in a series, set the proper flag. */
2817 cmd
->command_flags
|= I40E_AQ_NVM_LAST_CMD
;
2818 cmd
->module_pointer
= module_pointer
;
2819 cmd
->offset
= cpu_to_le32(offset
);
2820 cmd
->length
= cpu_to_le16(length
);
2822 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
2824 i40e_aq_erase_nvm_exit
:
2829 * i40e_parse_discover_capabilities
2830 * @hw: pointer to the hw struct
2831 * @buff: pointer to a buffer containing device/function capability records
2832 * @cap_count: number of capability records in the list
2833 * @list_type_opc: type of capabilities list to parse
2835 * Parse the device/function capabilities list.
2837 static void i40e_parse_discover_capabilities(struct i40e_hw
*hw
, void *buff
,
2839 enum i40e_admin_queue_opc list_type_opc
)
2841 struct i40e_aqc_list_capabilities_element_resp
*cap
;
2842 u32 valid_functions
, num_functions
;
2843 u32 number
, logical_id
, phys_id
;
2844 struct i40e_hw_capabilities
*p
;
2845 u16 id
, ocp_cfg_word0
;
2850 cap
= (struct i40e_aqc_list_capabilities_element_resp
*) buff
;
2852 if (list_type_opc
== i40e_aqc_opc_list_dev_capabilities
)
2854 else if (list_type_opc
== i40e_aqc_opc_list_func_capabilities
)
2859 for (i
= 0; i
< cap_count
; i
++, cap
++) {
2860 id
= le16_to_cpu(cap
->id
);
2861 number
= le32_to_cpu(cap
->number
);
2862 logical_id
= le32_to_cpu(cap
->logical_id
);
2863 phys_id
= le32_to_cpu(cap
->phys_id
);
2864 major_rev
= cap
->major_rev
;
2867 case I40E_AQ_CAP_ID_SWITCH_MODE
:
2868 p
->switch_mode
= number
;
2870 case I40E_AQ_CAP_ID_MNG_MODE
:
2871 p
->management_mode
= number
;
2872 if (major_rev
> 1) {
2873 p
->mng_protocols_over_mctp
= logical_id
;
2874 i40e_debug(hw
, I40E_DEBUG_INIT
,
2875 "HW Capability: Protocols over MCTP = %d\n",
2876 p
->mng_protocols_over_mctp
);
2878 p
->mng_protocols_over_mctp
= 0;
2881 case I40E_AQ_CAP_ID_NPAR_ACTIVE
:
2882 p
->npar_enable
= number
;
2884 case I40E_AQ_CAP_ID_OS2BMC_CAP
:
2887 case I40E_AQ_CAP_ID_FUNCTIONS_VALID
:
2888 p
->valid_functions
= number
;
2890 case I40E_AQ_CAP_ID_SRIOV
:
2892 p
->sr_iov_1_1
= true;
2894 case I40E_AQ_CAP_ID_VF
:
2895 p
->num_vfs
= number
;
2896 p
->vf_base_id
= logical_id
;
2898 case I40E_AQ_CAP_ID_VMDQ
:
2902 case I40E_AQ_CAP_ID_8021QBG
:
2904 p
->evb_802_1_qbg
= true;
2906 case I40E_AQ_CAP_ID_8021QBR
:
2908 p
->evb_802_1_qbh
= true;
2910 case I40E_AQ_CAP_ID_VSI
:
2911 p
->num_vsis
= number
;
2913 case I40E_AQ_CAP_ID_DCB
:
2916 p
->enabled_tcmap
= logical_id
;
2920 case I40E_AQ_CAP_ID_FCOE
:
2924 case I40E_AQ_CAP_ID_ISCSI
:
2928 case I40E_AQ_CAP_ID_RSS
:
2930 p
->rss_table_size
= number
;
2931 p
->rss_table_entry_width
= logical_id
;
2933 case I40E_AQ_CAP_ID_RXQ
:
2934 p
->num_rx_qp
= number
;
2935 p
->base_queue
= phys_id
;
2937 case I40E_AQ_CAP_ID_TXQ
:
2938 p
->num_tx_qp
= number
;
2939 p
->base_queue
= phys_id
;
2941 case I40E_AQ_CAP_ID_MSIX
:
2942 p
->num_msix_vectors
= number
;
2943 i40e_debug(hw
, I40E_DEBUG_INIT
,
2944 "HW Capability: MSIX vector count = %d\n",
2945 p
->num_msix_vectors
);
2947 case I40E_AQ_CAP_ID_VF_MSIX
:
2948 p
->num_msix_vectors_vf
= number
;
2950 case I40E_AQ_CAP_ID_FLEX10
:
2951 if (major_rev
== 1) {
2953 p
->flex10_enable
= true;
2954 p
->flex10_capable
= true;
2957 /* Capability revision >= 2 */
2959 p
->flex10_enable
= true;
2961 p
->flex10_capable
= true;
2963 p
->flex10_mode
= logical_id
;
2964 p
->flex10_status
= phys_id
;
2966 case I40E_AQ_CAP_ID_CEM
:
2970 case I40E_AQ_CAP_ID_IWARP
:
2974 case I40E_AQ_CAP_ID_LED
:
2975 if (phys_id
< I40E_HW_CAP_MAX_GPIO
)
2976 p
->led
[phys_id
] = true;
2978 case I40E_AQ_CAP_ID_SDP
:
2979 if (phys_id
< I40E_HW_CAP_MAX_GPIO
)
2980 p
->sdp
[phys_id
] = true;
2982 case I40E_AQ_CAP_ID_MDIO
:
2984 p
->mdio_port_num
= phys_id
;
2985 p
->mdio_port_mode
= logical_id
;
2988 case I40E_AQ_CAP_ID_1588
:
2990 p
->ieee_1588
= true;
2992 case I40E_AQ_CAP_ID_FLOW_DIRECTOR
:
2994 p
->fd_filters_guaranteed
= number
;
2995 p
->fd_filters_best_effort
= logical_id
;
2997 case I40E_AQ_CAP_ID_WSR_PROT
:
2998 p
->wr_csr_prot
= (u64
)number
;
2999 p
->wr_csr_prot
|= (u64
)logical_id
<< 32;
3001 case I40E_AQ_CAP_ID_NVM_MGMT
:
3002 if (number
& I40E_NVM_MGMT_SEC_REV_DISABLED
)
3003 p
->sec_rev_disabled
= true;
3004 if (number
& I40E_NVM_MGMT_UPDATE_DISABLED
)
3005 p
->update_disabled
= true;
3013 i40e_debug(hw
, I40E_DEBUG_ALL
, "device is FCoE capable\n");
3015 /* Software override ensuring FCoE is disabled if npar or mfp
3016 * mode because it is not supported in these modes.
3018 if (p
->npar_enable
|| p
->flex10_enable
)
3021 /* count the enabled ports (aka the "not disabled" ports) */
3023 for (i
= 0; i
< 4; i
++) {
3024 u32 port_cfg_reg
= I40E_PRTGEN_CNF
+ (4 * i
);
3027 /* use AQ read to get the physical register offset instead
3028 * of the port relative offset
3030 i40e_aq_debug_read_register(hw
, port_cfg_reg
, &port_cfg
, NULL
);
3031 if (!(port_cfg
& I40E_PRTGEN_CNF_PORT_DIS_MASK
))
3035 /* OCP cards case: if a mezz is removed the Ethernet port is at
3036 * disabled state in PRTGEN_CNF register. Additional NVM read is
3037 * needed in order to check if we are dealing with OCP card.
3038 * Those cards have 4 PFs at minimum, so using PRTGEN_CNF for counting
3039 * physical ports results in wrong partition id calculation and thus
3040 * not supporting WoL.
3042 if (hw
->mac
.type
== I40E_MAC_X722
) {
3043 if (!i40e_acquire_nvm(hw
, I40E_RESOURCE_READ
)) {
3044 status
= i40e_aq_read_nvm(hw
, I40E_SR_EMP_MODULE_PTR
,
3045 2 * I40E_SR_OCP_CFG_WORD0
,
3046 sizeof(ocp_cfg_word0
),
3047 &ocp_cfg_word0
, true, NULL
);
3049 (ocp_cfg_word0
& I40E_SR_OCP_ENABLED
))
3051 i40e_release_nvm(hw
);
3055 valid_functions
= p
->valid_functions
;
3057 while (valid_functions
) {
3058 if (valid_functions
& 1)
3060 valid_functions
>>= 1;
3063 /* partition id is 1-based, and functions are evenly spread
3064 * across the ports as partitions
3066 if (hw
->num_ports
!= 0) {
3067 hw
->partition_id
= (hw
->pf_id
/ hw
->num_ports
) + 1;
3068 hw
->num_partitions
= num_functions
/ hw
->num_ports
;
3071 /* additional HW specific goodies that might
3072 * someday be HW version specific
3074 p
->rx_buf_chain_len
= I40E_MAX_CHAINED_RX_BUFFERS
;
3078 * i40e_aq_discover_capabilities
3079 * @hw: pointer to the hw struct
3080 * @buff: a virtual buffer to hold the capabilities
3081 * @buff_size: Size of the virtual buffer
3082 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
3083 * @list_type_opc: capabilities type to discover - pass in the command opcode
3084 * @cmd_details: pointer to command details structure or NULL
3086 * Get the device capabilities descriptions from the firmware
3088 int i40e_aq_discover_capabilities(struct i40e_hw
*hw
,
3089 void *buff
, u16 buff_size
, u16
*data_size
,
3090 enum i40e_admin_queue_opc list_type_opc
,
3091 struct i40e_asq_cmd_details
*cmd_details
)
3093 struct i40e_aqc_list_capabilites
*cmd
;
3094 struct i40e_aq_desc desc
;
3097 cmd
= (struct i40e_aqc_list_capabilites
*)&desc
.params
.raw
;
3099 if (list_type_opc
!= i40e_aqc_opc_list_func_capabilities
&&
3100 list_type_opc
!= i40e_aqc_opc_list_dev_capabilities
) {
3105 i40e_fill_default_direct_cmd_desc(&desc
, list_type_opc
);
3107 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
3108 if (buff_size
> I40E_AQ_LARGE_BUF
)
3109 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
3111 status
= i40e_asq_send_command(hw
, &desc
, buff
, buff_size
, cmd_details
);
3112 *data_size
= le16_to_cpu(desc
.datalen
);
3117 i40e_parse_discover_capabilities(hw
, buff
, le32_to_cpu(cmd
->count
),
3125 * i40e_aq_update_nvm
3126 * @hw: pointer to the hw struct
3127 * @module_pointer: module pointer location in words from the NVM beginning
3128 * @offset: byte offset from the module beginning
3129 * @length: length of the section to be written (in bytes from the offset)
3130 * @data: command buffer (size [bytes] = length)
3131 * @last_command: tells if this is the last command in a series
3132 * @preservation_flags: Preservation mode flags
3133 * @cmd_details: pointer to command details structure or NULL
3135 * Update the NVM using the admin queue commands
3137 int i40e_aq_update_nvm(struct i40e_hw
*hw
, u8 module_pointer
,
3138 u32 offset
, u16 length
, void *data
,
3139 bool last_command
, u8 preservation_flags
,
3140 struct i40e_asq_cmd_details
*cmd_details
)
3142 struct i40e_aq_desc desc
;
3143 struct i40e_aqc_nvm_update
*cmd
=
3144 (struct i40e_aqc_nvm_update
*)&desc
.params
.raw
;
3147 /* In offset the highest byte must be zeroed. */
3148 if (offset
& 0xFF000000) {
3150 goto i40e_aq_update_nvm_exit
;
3153 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_nvm_update
);
3155 /* If this is the last command in a series, set the proper flag. */
3157 cmd
->command_flags
|= I40E_AQ_NVM_LAST_CMD
;
3158 if (hw
->mac
.type
== I40E_MAC_X722
) {
3159 if (preservation_flags
== I40E_NVM_PRESERVATION_FLAGS_SELECTED
)
3160 cmd
->command_flags
|=
3161 (I40E_AQ_NVM_PRESERVATION_FLAGS_SELECTED
<<
3162 I40E_AQ_NVM_PRESERVATION_FLAGS_SHIFT
);
3163 else if (preservation_flags
== I40E_NVM_PRESERVATION_FLAGS_ALL
)
3164 cmd
->command_flags
|=
3165 (I40E_AQ_NVM_PRESERVATION_FLAGS_ALL
<<
3166 I40E_AQ_NVM_PRESERVATION_FLAGS_SHIFT
);
3168 cmd
->module_pointer
= module_pointer
;
3169 cmd
->offset
= cpu_to_le32(offset
);
3170 cmd
->length
= cpu_to_le16(length
);
3172 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
3173 if (length
> I40E_AQ_LARGE_BUF
)
3174 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
3176 status
= i40e_asq_send_command(hw
, &desc
, data
, length
, cmd_details
);
3178 i40e_aq_update_nvm_exit
:
3183 * i40e_aq_rearrange_nvm
3184 * @hw: pointer to the hw struct
3185 * @rearrange_nvm: defines direction of rearrangement
3186 * @cmd_details: pointer to command details structure or NULL
3188 * Rearrange NVM structure, available only for transition FW
3190 int i40e_aq_rearrange_nvm(struct i40e_hw
*hw
,
3192 struct i40e_asq_cmd_details
*cmd_details
)
3194 struct i40e_aqc_nvm_update
*cmd
;
3195 struct i40e_aq_desc desc
;
3198 cmd
= (struct i40e_aqc_nvm_update
*)&desc
.params
.raw
;
3200 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_nvm_update
);
3202 rearrange_nvm
&= (I40E_AQ_NVM_REARRANGE_TO_FLAT
|
3203 I40E_AQ_NVM_REARRANGE_TO_STRUCT
);
3205 if (!rearrange_nvm
) {
3207 goto i40e_aq_rearrange_nvm_exit
;
3210 cmd
->command_flags
|= rearrange_nvm
;
3211 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3213 i40e_aq_rearrange_nvm_exit
:
3218 * i40e_aq_get_lldp_mib
3219 * @hw: pointer to the hw struct
3220 * @bridge_type: type of bridge requested
3221 * @mib_type: Local, Remote or both Local and Remote MIBs
3222 * @buff: pointer to a user supplied buffer to store the MIB block
3223 * @buff_size: size of the buffer (in bytes)
3224 * @local_len : length of the returned Local LLDP MIB
3225 * @remote_len: length of the returned Remote LLDP MIB
3226 * @cmd_details: pointer to command details structure or NULL
3228 * Requests the complete LLDP MIB (entire packet).
3230 int i40e_aq_get_lldp_mib(struct i40e_hw
*hw
, u8 bridge_type
,
3231 u8 mib_type
, void *buff
, u16 buff_size
,
3232 u16
*local_len
, u16
*remote_len
,
3233 struct i40e_asq_cmd_details
*cmd_details
)
3235 struct i40e_aq_desc desc
;
3236 struct i40e_aqc_lldp_get_mib
*cmd
=
3237 (struct i40e_aqc_lldp_get_mib
*)&desc
.params
.raw
;
3238 struct i40e_aqc_lldp_get_mib
*resp
=
3239 (struct i40e_aqc_lldp_get_mib
*)&desc
.params
.raw
;
3242 if (buff_size
== 0 || !buff
)
3245 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_lldp_get_mib
);
3246 /* Indirect Command */
3247 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
3249 cmd
->type
= mib_type
& I40E_AQ_LLDP_MIB_TYPE_MASK
;
3250 cmd
->type
|= FIELD_PREP(I40E_AQ_LLDP_BRIDGE_TYPE_MASK
, bridge_type
);
3252 desc
.datalen
= cpu_to_le16(buff_size
);
3254 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
3255 if (buff_size
> I40E_AQ_LARGE_BUF
)
3256 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
3258 status
= i40e_asq_send_command(hw
, &desc
, buff
, buff_size
, cmd_details
);
3260 if (local_len
!= NULL
)
3261 *local_len
= le16_to_cpu(resp
->local_len
);
3262 if (remote_len
!= NULL
)
3263 *remote_len
= le16_to_cpu(resp
->remote_len
);
3270 * i40e_aq_set_lldp_mib - Set the LLDP MIB
3271 * @hw: pointer to the hw struct
3272 * @mib_type: Local, Remote or both Local and Remote MIBs
3273 * @buff: pointer to a user supplied buffer to store the MIB block
3274 * @buff_size: size of the buffer (in bytes)
3275 * @cmd_details: pointer to command details structure or NULL
3280 i40e_aq_set_lldp_mib(struct i40e_hw
*hw
,
3281 u8 mib_type
, void *buff
, u16 buff_size
,
3282 struct i40e_asq_cmd_details
*cmd_details
)
3284 struct i40e_aqc_lldp_set_local_mib
*cmd
;
3285 struct i40e_aq_desc desc
;
3288 cmd
= (struct i40e_aqc_lldp_set_local_mib
*)&desc
.params
.raw
;
3289 if (buff_size
== 0 || !buff
)
3292 i40e_fill_default_direct_cmd_desc(&desc
,
3293 i40e_aqc_opc_lldp_set_local_mib
);
3294 /* Indirect Command */
3295 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
3296 if (buff_size
> I40E_AQ_LARGE_BUF
)
3297 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
3298 desc
.datalen
= cpu_to_le16(buff_size
);
3300 cmd
->type
= mib_type
;
3301 cmd
->length
= cpu_to_le16(buff_size
);
3302 cmd
->address_high
= cpu_to_le32(upper_32_bits((uintptr_t)buff
));
3303 cmd
->address_low
= cpu_to_le32(lower_32_bits((uintptr_t)buff
));
3305 status
= i40e_asq_send_command(hw
, &desc
, buff
, buff_size
, cmd_details
);
3310 * i40e_aq_cfg_lldp_mib_change_event
3311 * @hw: pointer to the hw struct
3312 * @enable_update: Enable or Disable event posting
3313 * @cmd_details: pointer to command details structure or NULL
3315 * Enable or Disable posting of an event on ARQ when LLDP MIB
3316 * associated with the interface changes
3318 int i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw
*hw
,
3320 struct i40e_asq_cmd_details
*cmd_details
)
3322 struct i40e_aq_desc desc
;
3323 struct i40e_aqc_lldp_update_mib
*cmd
=
3324 (struct i40e_aqc_lldp_update_mib
*)&desc
.params
.raw
;
3327 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_lldp_update_mib
);
3330 cmd
->command
|= I40E_AQ_LLDP_MIB_UPDATE_DISABLE
;
3332 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3338 * i40e_aq_restore_lldp
3339 * @hw: pointer to the hw struct
3340 * @setting: pointer to factory setting variable or NULL
3341 * @restore: True if factory settings should be restored
3342 * @cmd_details: pointer to command details structure or NULL
3344 * Restore LLDP Agent factory settings if @restore set to True. In other case
3345 * only returns factory setting in AQ response.
3348 i40e_aq_restore_lldp(struct i40e_hw
*hw
, u8
*setting
, bool restore
,
3349 struct i40e_asq_cmd_details
*cmd_details
)
3351 struct i40e_aq_desc desc
;
3352 struct i40e_aqc_lldp_restore
*cmd
=
3353 (struct i40e_aqc_lldp_restore
*)&desc
.params
.raw
;
3356 if (!test_bit(I40E_HW_CAP_FW_LLDP_PERSISTENT
, hw
->caps
)) {
3357 i40e_debug(hw
, I40E_DEBUG_ALL
,
3358 "Restore LLDP not supported by current FW version.\n");
3362 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_lldp_restore
);
3365 cmd
->command
|= I40E_AQ_LLDP_AGENT_RESTORE
;
3367 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3370 *setting
= cmd
->command
& 1;
3377 * @hw: pointer to the hw struct
3378 * @shutdown_agent: True if LLDP Agent needs to be Shutdown
3379 * @persist: True if stop of LLDP should be persistent across power cycles
3380 * @cmd_details: pointer to command details structure or NULL
3382 * Stop or Shutdown the embedded LLDP Agent
3384 int i40e_aq_stop_lldp(struct i40e_hw
*hw
, bool shutdown_agent
,
3386 struct i40e_asq_cmd_details
*cmd_details
)
3388 struct i40e_aq_desc desc
;
3389 struct i40e_aqc_lldp_stop
*cmd
=
3390 (struct i40e_aqc_lldp_stop
*)&desc
.params
.raw
;
3393 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_lldp_stop
);
3396 cmd
->command
|= I40E_AQ_LLDP_AGENT_SHUTDOWN
;
3399 if (test_bit(I40E_HW_CAP_FW_LLDP_PERSISTENT
, hw
->caps
))
3400 cmd
->command
|= I40E_AQ_LLDP_AGENT_STOP_PERSIST
;
3402 i40e_debug(hw
, I40E_DEBUG_ALL
,
3403 "Persistent Stop LLDP not supported by current FW version.\n");
3406 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3412 * i40e_aq_start_lldp
3413 * @hw: pointer to the hw struct
3414 * @persist: True if start of LLDP should be persistent across power cycles
3415 * @cmd_details: pointer to command details structure or NULL
3417 * Start the embedded LLDP Agent on all ports.
3419 int i40e_aq_start_lldp(struct i40e_hw
*hw
, bool persist
,
3420 struct i40e_asq_cmd_details
*cmd_details
)
3422 struct i40e_aq_desc desc
;
3423 struct i40e_aqc_lldp_start
*cmd
=
3424 (struct i40e_aqc_lldp_start
*)&desc
.params
.raw
;
3427 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_lldp_start
);
3429 cmd
->command
= I40E_AQ_LLDP_AGENT_START
;
3432 if (test_bit(I40E_HW_CAP_FW_LLDP_PERSISTENT
, hw
->caps
))
3433 cmd
->command
|= I40E_AQ_LLDP_AGENT_START_PERSIST
;
3435 i40e_debug(hw
, I40E_DEBUG_ALL
,
3436 "Persistent Start LLDP not supported by current FW version.\n");
3439 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3445 * i40e_aq_set_dcb_parameters
3446 * @hw: pointer to the hw struct
3447 * @cmd_details: pointer to command details structure or NULL
3448 * @dcb_enable: True if DCB configuration needs to be applied
3452 i40e_aq_set_dcb_parameters(struct i40e_hw
*hw
, bool dcb_enable
,
3453 struct i40e_asq_cmd_details
*cmd_details
)
3455 struct i40e_aq_desc desc
;
3456 struct i40e_aqc_set_dcb_parameters
*cmd
=
3457 (struct i40e_aqc_set_dcb_parameters
*)&desc
.params
.raw
;
3460 if (!test_bit(I40E_HW_CAP_FW_LLDP_STOPPABLE
, hw
->caps
))
3463 i40e_fill_default_direct_cmd_desc(&desc
,
3464 i40e_aqc_opc_set_dcb_parameters
);
3467 cmd
->valid_flags
= I40E_DCB_VALID
;
3468 cmd
->command
= I40E_AQ_DCB_SET_AGENT
;
3470 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3476 * i40e_aq_get_cee_dcb_config
3477 * @hw: pointer to the hw struct
3478 * @buff: response buffer that stores CEE operational configuration
3479 * @buff_size: size of the buffer passed
3480 * @cmd_details: pointer to command details structure or NULL
3482 * Get CEE DCBX mode operational configuration from firmware
3484 int i40e_aq_get_cee_dcb_config(struct i40e_hw
*hw
,
3485 void *buff
, u16 buff_size
,
3486 struct i40e_asq_cmd_details
*cmd_details
)
3488 struct i40e_aq_desc desc
;
3491 if (buff_size
== 0 || !buff
)
3494 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_get_cee_dcb_cfg
);
3496 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
3497 status
= i40e_asq_send_command(hw
, &desc
, (void *)buff
, buff_size
,
3504 * i40e_aq_add_udp_tunnel
3505 * @hw: pointer to the hw struct
3506 * @udp_port: the UDP port to add in Host byte order
3507 * @protocol_index: protocol index type
3508 * @filter_index: pointer to filter index
3509 * @cmd_details: pointer to command details structure or NULL
3511 * Note: Firmware expects the udp_port value to be in Little Endian format,
3512 * and this function will call cpu_to_le16 to convert from Host byte order to
3513 * Little Endian order.
3515 int i40e_aq_add_udp_tunnel(struct i40e_hw
*hw
,
3516 u16 udp_port
, u8 protocol_index
,
3518 struct i40e_asq_cmd_details
*cmd_details
)
3520 struct i40e_aq_desc desc
;
3521 struct i40e_aqc_add_udp_tunnel
*cmd
=
3522 (struct i40e_aqc_add_udp_tunnel
*)&desc
.params
.raw
;
3523 struct i40e_aqc_del_udp_tunnel_completion
*resp
=
3524 (struct i40e_aqc_del_udp_tunnel_completion
*)&desc
.params
.raw
;
3527 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_add_udp_tunnel
);
3529 cmd
->udp_port
= cpu_to_le16(udp_port
);
3530 cmd
->protocol_type
= protocol_index
;
3532 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3534 if (!status
&& filter_index
)
3535 *filter_index
= resp
->index
;
3541 * i40e_aq_del_udp_tunnel
3542 * @hw: pointer to the hw struct
3543 * @index: filter index
3544 * @cmd_details: pointer to command details structure or NULL
3546 int i40e_aq_del_udp_tunnel(struct i40e_hw
*hw
, u8 index
,
3547 struct i40e_asq_cmd_details
*cmd_details
)
3549 struct i40e_aq_desc desc
;
3550 struct i40e_aqc_remove_udp_tunnel
*cmd
=
3551 (struct i40e_aqc_remove_udp_tunnel
*)&desc
.params
.raw
;
3554 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_del_udp_tunnel
);
3558 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3564 * i40e_aq_delete_element - Delete switch element
3565 * @hw: pointer to the hw struct
3566 * @seid: the SEID to delete from the switch
3567 * @cmd_details: pointer to command details structure or NULL
3569 * This deletes a switch element from the switch.
3571 int i40e_aq_delete_element(struct i40e_hw
*hw
, u16 seid
,
3572 struct i40e_asq_cmd_details
*cmd_details
)
3574 struct i40e_aq_desc desc
;
3575 struct i40e_aqc_switch_seid
*cmd
=
3576 (struct i40e_aqc_switch_seid
*)&desc
.params
.raw
;
3582 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_delete_element
);
3584 cmd
->seid
= cpu_to_le16(seid
);
3586 status
= i40e_asq_send_command_atomic(hw
, &desc
, NULL
, 0,
3593 * i40e_aq_dcb_updated - DCB Updated Command
3594 * @hw: pointer to the hw struct
3595 * @cmd_details: pointer to command details structure or NULL
3597 * EMP will return when the shared RPB settings have been
3598 * recomputed and modified. The retval field in the descriptor
3599 * will be set to 0 when RPB is modified.
3601 int i40e_aq_dcb_updated(struct i40e_hw
*hw
,
3602 struct i40e_asq_cmd_details
*cmd_details
)
3604 struct i40e_aq_desc desc
;
3607 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_dcb_updated
);
3609 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3615 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
3616 * @hw: pointer to the hw struct
3617 * @seid: seid for the physical port/switching component/vsi
3618 * @buff: Indirect buffer to hold data parameters and response
3619 * @buff_size: Indirect buffer size
3620 * @opcode: Tx scheduler AQ command opcode
3621 * @cmd_details: pointer to command details structure or NULL
3623 * Generic command handler for Tx scheduler AQ commands
3625 static int i40e_aq_tx_sched_cmd(struct i40e_hw
*hw
, u16 seid
,
3626 void *buff
, u16 buff_size
,
3627 enum i40e_admin_queue_opc opcode
,
3628 struct i40e_asq_cmd_details
*cmd_details
)
3630 struct i40e_aq_desc desc
;
3631 struct i40e_aqc_tx_sched_ind
*cmd
=
3632 (struct i40e_aqc_tx_sched_ind
*)&desc
.params
.raw
;
3634 bool cmd_param_flag
= false;
3637 case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit
:
3638 case i40e_aqc_opc_configure_vsi_tc_bw
:
3639 case i40e_aqc_opc_enable_switching_comp_ets
:
3640 case i40e_aqc_opc_modify_switching_comp_ets
:
3641 case i40e_aqc_opc_disable_switching_comp_ets
:
3642 case i40e_aqc_opc_configure_switching_comp_ets_bw_limit
:
3643 case i40e_aqc_opc_configure_switching_comp_bw_config
:
3644 cmd_param_flag
= true;
3646 case i40e_aqc_opc_query_vsi_bw_config
:
3647 case i40e_aqc_opc_query_vsi_ets_sla_config
:
3648 case i40e_aqc_opc_query_switching_comp_ets_config
:
3649 case i40e_aqc_opc_query_port_ets_config
:
3650 case i40e_aqc_opc_query_switching_comp_bw_config
:
3651 cmd_param_flag
= false;
3657 i40e_fill_default_direct_cmd_desc(&desc
, opcode
);
3659 /* Indirect command */
3660 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
3662 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_RD
);
3663 if (buff_size
> I40E_AQ_LARGE_BUF
)
3664 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
3666 desc
.datalen
= cpu_to_le16(buff_size
);
3668 cmd
->vsi_seid
= cpu_to_le16(seid
);
3670 status
= i40e_asq_send_command(hw
, &desc
, buff
, buff_size
, cmd_details
);
3676 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
3677 * @hw: pointer to the hw struct
3679 * @credit: BW limit credits (0 = disabled)
3680 * @max_credit: Max BW limit credits
3681 * @cmd_details: pointer to command details structure or NULL
3683 int i40e_aq_config_vsi_bw_limit(struct i40e_hw
*hw
,
3684 u16 seid
, u16 credit
, u8 max_credit
,
3685 struct i40e_asq_cmd_details
*cmd_details
)
3687 struct i40e_aq_desc desc
;
3688 struct i40e_aqc_configure_vsi_bw_limit
*cmd
=
3689 (struct i40e_aqc_configure_vsi_bw_limit
*)&desc
.params
.raw
;
3692 i40e_fill_default_direct_cmd_desc(&desc
,
3693 i40e_aqc_opc_configure_vsi_bw_limit
);
3695 cmd
->vsi_seid
= cpu_to_le16(seid
);
3696 cmd
->credit
= cpu_to_le16(credit
);
3697 cmd
->max_credit
= max_credit
;
3699 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
3705 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
3706 * @hw: pointer to the hw struct
3708 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
3709 * @cmd_details: pointer to command details structure or NULL
3711 int i40e_aq_config_vsi_tc_bw(struct i40e_hw
*hw
,
3713 struct i40e_aqc_configure_vsi_tc_bw_data
*bw_data
,
3714 struct i40e_asq_cmd_details
*cmd_details
)
3716 return i40e_aq_tx_sched_cmd(hw
, seid
, (void *)bw_data
, sizeof(*bw_data
),
3717 i40e_aqc_opc_configure_vsi_tc_bw
,
3722 * i40e_aq_config_switch_comp_ets - Enable/Disable/Modify ETS on the port
3723 * @hw: pointer to the hw struct
3724 * @seid: seid of the switching component connected to Physical Port
3725 * @ets_data: Buffer holding ETS parameters
3726 * @opcode: Tx scheduler AQ command opcode
3727 * @cmd_details: pointer to command details structure or NULL
3730 i40e_aq_config_switch_comp_ets(struct i40e_hw
*hw
,
3732 struct i40e_aqc_configure_switching_comp_ets_data
*ets_data
,
3733 enum i40e_admin_queue_opc opcode
,
3734 struct i40e_asq_cmd_details
*cmd_details
)
3736 return i40e_aq_tx_sched_cmd(hw
, seid
, (void *)ets_data
,
3737 sizeof(*ets_data
), opcode
, cmd_details
);
3741 * i40e_aq_config_switch_comp_bw_config - Config Switch comp BW Alloc per TC
3742 * @hw: pointer to the hw struct
3743 * @seid: seid of the switching component
3744 * @bw_data: Buffer holding enabled TCs, relative/absolute TC BW limit/credits
3745 * @cmd_details: pointer to command details structure or NULL
3748 i40e_aq_config_switch_comp_bw_config(struct i40e_hw
*hw
,
3750 struct i40e_aqc_configure_switching_comp_bw_config_data
*bw_data
,
3751 struct i40e_asq_cmd_details
*cmd_details
)
3753 return i40e_aq_tx_sched_cmd(hw
, seid
, (void *)bw_data
, sizeof(*bw_data
),
3754 i40e_aqc_opc_configure_switching_comp_bw_config
,
3759 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
3760 * @hw: pointer to the hw struct
3761 * @seid: seid of the VSI
3762 * @bw_data: Buffer to hold VSI BW configuration
3763 * @cmd_details: pointer to command details structure or NULL
3766 i40e_aq_query_vsi_bw_config(struct i40e_hw
*hw
,
3768 struct i40e_aqc_query_vsi_bw_config_resp
*bw_data
,
3769 struct i40e_asq_cmd_details
*cmd_details
)
3771 return i40e_aq_tx_sched_cmd(hw
, seid
, (void *)bw_data
, sizeof(*bw_data
),
3772 i40e_aqc_opc_query_vsi_bw_config
,
3777 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
3778 * @hw: pointer to the hw struct
3779 * @seid: seid of the VSI
3780 * @bw_data: Buffer to hold VSI BW configuration per TC
3781 * @cmd_details: pointer to command details structure or NULL
3784 i40e_aq_query_vsi_ets_sla_config(struct i40e_hw
*hw
,
3786 struct i40e_aqc_query_vsi_ets_sla_config_resp
*bw_data
,
3787 struct i40e_asq_cmd_details
*cmd_details
)
3789 return i40e_aq_tx_sched_cmd(hw
, seid
, (void *)bw_data
, sizeof(*bw_data
),
3790 i40e_aqc_opc_query_vsi_ets_sla_config
,
3795 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
3796 * @hw: pointer to the hw struct
3797 * @seid: seid of the switching component
3798 * @bw_data: Buffer to hold switching component's per TC BW config
3799 * @cmd_details: pointer to command details structure or NULL
3802 i40e_aq_query_switch_comp_ets_config(struct i40e_hw
*hw
,
3804 struct i40e_aqc_query_switching_comp_ets_config_resp
*bw_data
,
3805 struct i40e_asq_cmd_details
*cmd_details
)
3807 return i40e_aq_tx_sched_cmd(hw
, seid
, (void *)bw_data
, sizeof(*bw_data
),
3808 i40e_aqc_opc_query_switching_comp_ets_config
,
3813 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
3814 * @hw: pointer to the hw struct
3815 * @seid: seid of the VSI or switching component connected to Physical Port
3816 * @bw_data: Buffer to hold current ETS configuration for the Physical Port
3817 * @cmd_details: pointer to command details structure or NULL
3820 i40e_aq_query_port_ets_config(struct i40e_hw
*hw
,
3822 struct i40e_aqc_query_port_ets_config_resp
*bw_data
,
3823 struct i40e_asq_cmd_details
*cmd_details
)
3825 return i40e_aq_tx_sched_cmd(hw
, seid
, (void *)bw_data
, sizeof(*bw_data
),
3826 i40e_aqc_opc_query_port_ets_config
,
3831 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
3832 * @hw: pointer to the hw struct
3833 * @seid: seid of the switching component
3834 * @bw_data: Buffer to hold switching component's BW configuration
3835 * @cmd_details: pointer to command details structure or NULL
3838 i40e_aq_query_switch_comp_bw_config(struct i40e_hw
*hw
,
3840 struct i40e_aqc_query_switching_comp_bw_config_resp
*bw_data
,
3841 struct i40e_asq_cmd_details
*cmd_details
)
3843 return i40e_aq_tx_sched_cmd(hw
, seid
, (void *)bw_data
, sizeof(*bw_data
),
3844 i40e_aqc_opc_query_switching_comp_bw_config
,
3849 * i40e_validate_filter_settings
3850 * @hw: pointer to the hardware structure
3851 * @settings: Filter control settings
3853 * Check and validate the filter control settings passed.
3854 * The function checks for the valid filter/context sizes being
3855 * passed for FCoE and PE.
3857 * Returns 0 if the values passed are valid and within
3858 * range else returns an error.
3861 i40e_validate_filter_settings(struct i40e_hw
*hw
,
3862 struct i40e_filter_control_settings
*settings
)
3864 u32 fcoe_cntx_size
, fcoe_filt_size
;
3868 /* Validate FCoE settings passed */
3869 switch (settings
->fcoe_filt_num
) {
3870 case I40E_HASH_FILTER_SIZE_1K
:
3871 case I40E_HASH_FILTER_SIZE_2K
:
3872 case I40E_HASH_FILTER_SIZE_4K
:
3873 case I40E_HASH_FILTER_SIZE_8K
:
3874 case I40E_HASH_FILTER_SIZE_16K
:
3875 case I40E_HASH_FILTER_SIZE_32K
:
3876 fcoe_filt_size
= I40E_HASH_FILTER_BASE_SIZE
;
3877 fcoe_filt_size
<<= (u32
)settings
->fcoe_filt_num
;
3883 switch (settings
->fcoe_cntx_num
) {
3884 case I40E_DMA_CNTX_SIZE_512
:
3885 case I40E_DMA_CNTX_SIZE_1K
:
3886 case I40E_DMA_CNTX_SIZE_2K
:
3887 case I40E_DMA_CNTX_SIZE_4K
:
3888 fcoe_cntx_size
= I40E_DMA_CNTX_BASE_SIZE
;
3889 fcoe_cntx_size
<<= (u32
)settings
->fcoe_cntx_num
;
3895 /* Validate PE settings passed */
3896 switch (settings
->pe_filt_num
) {
3897 case I40E_HASH_FILTER_SIZE_1K
:
3898 case I40E_HASH_FILTER_SIZE_2K
:
3899 case I40E_HASH_FILTER_SIZE_4K
:
3900 case I40E_HASH_FILTER_SIZE_8K
:
3901 case I40E_HASH_FILTER_SIZE_16K
:
3902 case I40E_HASH_FILTER_SIZE_32K
:
3903 case I40E_HASH_FILTER_SIZE_64K
:
3904 case I40E_HASH_FILTER_SIZE_128K
:
3905 case I40E_HASH_FILTER_SIZE_256K
:
3906 case I40E_HASH_FILTER_SIZE_512K
:
3907 case I40E_HASH_FILTER_SIZE_1M
:
3913 switch (settings
->pe_cntx_num
) {
3914 case I40E_DMA_CNTX_SIZE_512
:
3915 case I40E_DMA_CNTX_SIZE_1K
:
3916 case I40E_DMA_CNTX_SIZE_2K
:
3917 case I40E_DMA_CNTX_SIZE_4K
:
3918 case I40E_DMA_CNTX_SIZE_8K
:
3919 case I40E_DMA_CNTX_SIZE_16K
:
3920 case I40E_DMA_CNTX_SIZE_32K
:
3921 case I40E_DMA_CNTX_SIZE_64K
:
3922 case I40E_DMA_CNTX_SIZE_128K
:
3923 case I40E_DMA_CNTX_SIZE_256K
:
3929 /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
3930 val
= rd32(hw
, I40E_GLHMC_FCOEFMAX
);
3931 fcoe_fmax
= FIELD_GET(I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK
, val
);
3932 if (fcoe_filt_size
+ fcoe_cntx_size
> fcoe_fmax
)
3939 * i40e_set_filter_control
3940 * @hw: pointer to the hardware structure
3941 * @settings: Filter control settings
3943 * Set the Queue Filters for PE/FCoE and enable filters required
3944 * for a single PF. It is expected that these settings are programmed
3945 * at the driver initialization time.
3947 int i40e_set_filter_control(struct i40e_hw
*hw
,
3948 struct i40e_filter_control_settings
*settings
)
3950 u32 hash_lut_size
= 0;
3957 /* Validate the input settings */
3958 ret
= i40e_validate_filter_settings(hw
, settings
);
3962 /* Read the PF Queue Filter control register */
3963 val
= i40e_read_rx_ctl(hw
, I40E_PFQF_CTL_0
);
3965 /* Program required PE hash buckets for the PF */
3966 val
&= ~I40E_PFQF_CTL_0_PEHSIZE_MASK
;
3967 val
|= FIELD_PREP(I40E_PFQF_CTL_0_PEHSIZE_MASK
, settings
->pe_filt_num
);
3968 /* Program required PE contexts for the PF */
3969 val
&= ~I40E_PFQF_CTL_0_PEDSIZE_MASK
;
3970 val
|= FIELD_PREP(I40E_PFQF_CTL_0_PEDSIZE_MASK
, settings
->pe_cntx_num
);
3972 /* Program required FCoE hash buckets for the PF */
3973 val
&= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK
;
3974 val
|= FIELD_PREP(I40E_PFQF_CTL_0_PFFCHSIZE_MASK
,
3975 settings
->fcoe_filt_num
);
3976 /* Program required FCoE DDP contexts for the PF */
3977 val
&= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK
;
3978 val
|= FIELD_PREP(I40E_PFQF_CTL_0_PFFCDSIZE_MASK
,
3979 settings
->fcoe_cntx_num
);
3981 /* Program Hash LUT size for the PF */
3982 val
&= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK
;
3983 if (settings
->hash_lut_size
== I40E_HASH_LUT_SIZE_512
)
3985 val
|= FIELD_PREP(I40E_PFQF_CTL_0_HASHLUTSIZE_MASK
, hash_lut_size
);
3987 /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
3988 if (settings
->enable_fdir
)
3989 val
|= I40E_PFQF_CTL_0_FD_ENA_MASK
;
3990 if (settings
->enable_ethtype
)
3991 val
|= I40E_PFQF_CTL_0_ETYPE_ENA_MASK
;
3992 if (settings
->enable_macvlan
)
3993 val
|= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK
;
3995 i40e_write_rx_ctl(hw
, I40E_PFQF_CTL_0
, val
);
4001 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
4002 * @hw: pointer to the hw struct
4003 * @mac_addr: MAC address to use in the filter
4004 * @ethtype: Ethertype to use in the filter
4005 * @flags: Flags that needs to be applied to the filter
4006 * @vsi_seid: seid of the control VSI
4007 * @queue: VSI queue number to send the packet to
4008 * @is_add: Add control packet filter if True else remove
4009 * @stats: Structure to hold information on control filter counts
4010 * @cmd_details: pointer to command details structure or NULL
4012 * This command will Add or Remove control packet filter for a control VSI.
4013 * In return it will update the total number of perfect filter count in
4016 int i40e_aq_add_rem_control_packet_filter(struct i40e_hw
*hw
,
4017 u8
*mac_addr
, u16 ethtype
, u16 flags
,
4018 u16 vsi_seid
, u16 queue
, bool is_add
,
4019 struct i40e_control_filter_stats
*stats
,
4020 struct i40e_asq_cmd_details
*cmd_details
)
4022 struct i40e_aq_desc desc
;
4023 struct i40e_aqc_add_remove_control_packet_filter
*cmd
=
4024 (struct i40e_aqc_add_remove_control_packet_filter
*)
4026 struct i40e_aqc_add_remove_control_packet_filter_completion
*resp
=
4027 (struct i40e_aqc_add_remove_control_packet_filter_completion
*)
4035 i40e_fill_default_direct_cmd_desc(&desc
,
4036 i40e_aqc_opc_add_control_packet_filter
);
4037 cmd
->queue
= cpu_to_le16(queue
);
4039 i40e_fill_default_direct_cmd_desc(&desc
,
4040 i40e_aqc_opc_remove_control_packet_filter
);
4044 ether_addr_copy(cmd
->mac
, mac_addr
);
4046 cmd
->etype
= cpu_to_le16(ethtype
);
4047 cmd
->flags
= cpu_to_le16(flags
);
4048 cmd
->seid
= cpu_to_le16(vsi_seid
);
4050 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
4052 if (!status
&& stats
) {
4053 stats
->mac_etype_used
= le16_to_cpu(resp
->mac_etype_used
);
4054 stats
->etype_used
= le16_to_cpu(resp
->etype_used
);
4055 stats
->mac_etype_free
= le16_to_cpu(resp
->mac_etype_free
);
4056 stats
->etype_free
= le16_to_cpu(resp
->etype_free
);
4063 * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
4064 * @hw: pointer to the hw struct
4065 * @seid: VSI seid to add ethertype filter from
4067 void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw
*hw
,
4070 #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
4071 u16 flag
= I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC
|
4072 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP
|
4073 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX
;
4074 u16 ethtype
= I40E_FLOW_CONTROL_ETHTYPE
;
4077 status
= i40e_aq_add_rem_control_packet_filter(hw
, NULL
, ethtype
, flag
,
4078 seid
, 0, true, NULL
,
4081 hw_dbg(hw
, "Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
4085 * i40e_aq_alternate_read
4086 * @hw: pointer to the hardware structure
4087 * @reg_addr0: address of first dword to be read
4088 * @reg_val0: pointer for data read from 'reg_addr0'
4089 * @reg_addr1: address of second dword to be read
4090 * @reg_val1: pointer for data read from 'reg_addr1'
4092 * Read one or two dwords from alternate structure. Fields are indicated
4093 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
4094 * is not passed then only register at 'reg_addr0' is read.
4097 static int i40e_aq_alternate_read(struct i40e_hw
*hw
,
4098 u32 reg_addr0
, u32
*reg_val0
,
4099 u32 reg_addr1
, u32
*reg_val1
)
4101 struct i40e_aq_desc desc
;
4102 struct i40e_aqc_alternate_write
*cmd_resp
=
4103 (struct i40e_aqc_alternate_write
*)&desc
.params
.raw
;
4109 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_alternate_read
);
4110 cmd_resp
->address0
= cpu_to_le32(reg_addr0
);
4111 cmd_resp
->address1
= cpu_to_le32(reg_addr1
);
4113 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, NULL
);
4116 *reg_val0
= le32_to_cpu(cmd_resp
->data0
);
4119 *reg_val1
= le32_to_cpu(cmd_resp
->data1
);
4126 * i40e_aq_suspend_port_tx
4127 * @hw: pointer to the hardware structure
4129 * @cmd_details: pointer to command details structure or NULL
4131 * Suspend port's Tx traffic
4133 int i40e_aq_suspend_port_tx(struct i40e_hw
*hw
, u16 seid
,
4134 struct i40e_asq_cmd_details
*cmd_details
)
4136 struct i40e_aqc_tx_sched_ind
*cmd
;
4137 struct i40e_aq_desc desc
;
4140 cmd
= (struct i40e_aqc_tx_sched_ind
*)&desc
.params
.raw
;
4141 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_suspend_port_tx
);
4142 cmd
->vsi_seid
= cpu_to_le16(seid
);
4143 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
4149 * i40e_aq_resume_port_tx
4150 * @hw: pointer to the hardware structure
4151 * @cmd_details: pointer to command details structure or NULL
4153 * Resume port's Tx traffic
4155 int i40e_aq_resume_port_tx(struct i40e_hw
*hw
,
4156 struct i40e_asq_cmd_details
*cmd_details
)
4158 struct i40e_aq_desc desc
;
4161 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_resume_port_tx
);
4163 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
4169 * i40e_set_pci_config_data - store PCI bus info
4170 * @hw: pointer to hardware structure
4171 * @link_status: the link status word from PCI config space
4173 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
4175 void i40e_set_pci_config_data(struct i40e_hw
*hw
, u16 link_status
)
4177 hw
->bus
.type
= i40e_bus_type_pci_express
;
4179 switch (link_status
& PCI_EXP_LNKSTA_NLW
) {
4180 case PCI_EXP_LNKSTA_NLW_X1
:
4181 hw
->bus
.width
= i40e_bus_width_pcie_x1
;
4183 case PCI_EXP_LNKSTA_NLW_X2
:
4184 hw
->bus
.width
= i40e_bus_width_pcie_x2
;
4186 case PCI_EXP_LNKSTA_NLW_X4
:
4187 hw
->bus
.width
= i40e_bus_width_pcie_x4
;
4189 case PCI_EXP_LNKSTA_NLW_X8
:
4190 hw
->bus
.width
= i40e_bus_width_pcie_x8
;
4193 hw
->bus
.width
= i40e_bus_width_unknown
;
4197 switch (link_status
& PCI_EXP_LNKSTA_CLS
) {
4198 case PCI_EXP_LNKSTA_CLS_2_5GB
:
4199 hw
->bus
.speed
= i40e_bus_speed_2500
;
4201 case PCI_EXP_LNKSTA_CLS_5_0GB
:
4202 hw
->bus
.speed
= i40e_bus_speed_5000
;
4204 case PCI_EXP_LNKSTA_CLS_8_0GB
:
4205 hw
->bus
.speed
= i40e_bus_speed_8000
;
4208 hw
->bus
.speed
= i40e_bus_speed_unknown
;
4214 * i40e_aq_debug_dump
4215 * @hw: pointer to the hardware structure
4216 * @cluster_id: specific cluster to dump
4217 * @table_id: table id within cluster
4218 * @start_index: index of line in the block to read
4219 * @buff_size: dump buffer size
4220 * @buff: dump buffer
4221 * @ret_buff_size: actual buffer size returned
4222 * @ret_next_table: next block to read
4223 * @ret_next_index: next index to read
4224 * @cmd_details: pointer to command details structure or NULL
4226 * Dump internal FW/HW data for debug purposes.
4229 int i40e_aq_debug_dump(struct i40e_hw
*hw
, u8 cluster_id
,
4230 u8 table_id
, u32 start_index
, u16 buff_size
,
4231 void *buff
, u16
*ret_buff_size
,
4232 u8
*ret_next_table
, u32
*ret_next_index
,
4233 struct i40e_asq_cmd_details
*cmd_details
)
4235 struct i40e_aq_desc desc
;
4236 struct i40e_aqc_debug_dump_internals
*cmd
=
4237 (struct i40e_aqc_debug_dump_internals
*)&desc
.params
.raw
;
4238 struct i40e_aqc_debug_dump_internals
*resp
=
4239 (struct i40e_aqc_debug_dump_internals
*)&desc
.params
.raw
;
4242 if (buff_size
== 0 || !buff
)
4245 i40e_fill_default_direct_cmd_desc(&desc
,
4246 i40e_aqc_opc_debug_dump_internals
);
4247 /* Indirect Command */
4248 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
4249 if (buff_size
> I40E_AQ_LARGE_BUF
)
4250 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
4252 cmd
->cluster_id
= cluster_id
;
4253 cmd
->table_id
= table_id
;
4254 cmd
->idx
= cpu_to_le32(start_index
);
4256 desc
.datalen
= cpu_to_le16(buff_size
);
4258 status
= i40e_asq_send_command(hw
, &desc
, buff
, buff_size
, cmd_details
);
4261 *ret_buff_size
= le16_to_cpu(desc
.datalen
);
4263 *ret_next_table
= resp
->table_id
;
4265 *ret_next_index
= le32_to_cpu(resp
->idx
);
4272 * i40e_read_bw_from_alt_ram
4273 * @hw: pointer to the hardware structure
4274 * @max_bw: pointer for max_bw read
4275 * @min_bw: pointer for min_bw read
4276 * @min_valid: pointer for bool that is true if min_bw is a valid value
4277 * @max_valid: pointer for bool that is true if max_bw is a valid value
4279 * Read bw from the alternate ram for the given pf
4281 int i40e_read_bw_from_alt_ram(struct i40e_hw
*hw
,
4282 u32
*max_bw
, u32
*min_bw
,
4283 bool *min_valid
, bool *max_valid
)
4285 u32 max_bw_addr
, min_bw_addr
;
4288 /* Calculate the address of the min/max bw registers */
4289 max_bw_addr
= I40E_ALT_STRUCT_FIRST_PF_OFFSET
+
4290 I40E_ALT_STRUCT_MAX_BW_OFFSET
+
4291 (I40E_ALT_STRUCT_DWORDS_PER_PF
* hw
->pf_id
);
4292 min_bw_addr
= I40E_ALT_STRUCT_FIRST_PF_OFFSET
+
4293 I40E_ALT_STRUCT_MIN_BW_OFFSET
+
4294 (I40E_ALT_STRUCT_DWORDS_PER_PF
* hw
->pf_id
);
4296 /* Read the bandwidths from alt ram */
4297 status
= i40e_aq_alternate_read(hw
, max_bw_addr
, max_bw
,
4298 min_bw_addr
, min_bw
);
4300 if (*min_bw
& I40E_ALT_BW_VALID_MASK
)
4305 if (*max_bw
& I40E_ALT_BW_VALID_MASK
)
4314 * i40e_aq_configure_partition_bw
4315 * @hw: pointer to the hardware structure
4316 * @bw_data: Buffer holding valid pfs and bw limits
4317 * @cmd_details: pointer to command details
4319 * Configure partitions guaranteed/max bw
4322 i40e_aq_configure_partition_bw(struct i40e_hw
*hw
,
4323 struct i40e_aqc_configure_partition_bw_data
*bw_data
,
4324 struct i40e_asq_cmd_details
*cmd_details
)
4326 u16 bwd_size
= sizeof(*bw_data
);
4327 struct i40e_aq_desc desc
;
4330 i40e_fill_default_direct_cmd_desc(&desc
,
4331 i40e_aqc_opc_configure_partition_bw
);
4333 /* Indirect command */
4334 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
4335 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_RD
);
4337 if (bwd_size
> I40E_AQ_LARGE_BUF
)
4338 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
4340 desc
.datalen
= cpu_to_le16(bwd_size
);
4342 status
= i40e_asq_send_command(hw
, &desc
, bw_data
, bwd_size
,
4349 * i40e_read_phy_register_clause22
4350 * @hw: pointer to the HW structure
4351 * @reg: register address in the page
4352 * @phy_addr: PHY address on MDIO interface
4353 * @value: PHY register value
4355 * Reads specified PHY register value
4357 int i40e_read_phy_register_clause22(struct i40e_hw
*hw
,
4358 u16 reg
, u8 phy_addr
, u16
*value
)
4360 u8 port_num
= (u8
)hw
->func_caps
.mdio_port_num
;
4365 command
= (reg
<< I40E_GLGEN_MSCA_DEVADD_SHIFT
) |
4366 (phy_addr
<< I40E_GLGEN_MSCA_PHYADD_SHIFT
) |
4367 (I40E_MDIO_CLAUSE22_OPCODE_READ_MASK
) |
4368 (I40E_MDIO_CLAUSE22_STCODE_MASK
) |
4369 (I40E_GLGEN_MSCA_MDICMD_MASK
);
4370 wr32(hw
, I40E_GLGEN_MSCA(port_num
), command
);
4372 command
= rd32(hw
, I40E_GLGEN_MSCA(port_num
));
4373 if (!(command
& I40E_GLGEN_MSCA_MDICMD_MASK
)) {
4382 i40e_debug(hw
, I40E_DEBUG_PHY
,
4383 "PHY: Can't write command to external PHY.\n");
4385 command
= rd32(hw
, I40E_GLGEN_MSRWD(port_num
));
4386 *value
= FIELD_GET(I40E_GLGEN_MSRWD_MDIRDDATA_MASK
, command
);
4393 * i40e_write_phy_register_clause22
4394 * @hw: pointer to the HW structure
4395 * @reg: register address in the page
4396 * @phy_addr: PHY address on MDIO interface
4397 * @value: PHY register value
4399 * Writes specified PHY register value
4401 int i40e_write_phy_register_clause22(struct i40e_hw
*hw
,
4402 u16 reg
, u8 phy_addr
, u16 value
)
4404 u8 port_num
= (u8
)hw
->func_caps
.mdio_port_num
;
4409 command
= value
<< I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT
;
4410 wr32(hw
, I40E_GLGEN_MSRWD(port_num
), command
);
4412 command
= (reg
<< I40E_GLGEN_MSCA_DEVADD_SHIFT
) |
4413 (phy_addr
<< I40E_GLGEN_MSCA_PHYADD_SHIFT
) |
4414 (I40E_MDIO_CLAUSE22_OPCODE_WRITE_MASK
) |
4415 (I40E_MDIO_CLAUSE22_STCODE_MASK
) |
4416 (I40E_GLGEN_MSCA_MDICMD_MASK
);
4418 wr32(hw
, I40E_GLGEN_MSCA(port_num
), command
);
4420 command
= rd32(hw
, I40E_GLGEN_MSCA(port_num
));
4421 if (!(command
& I40E_GLGEN_MSCA_MDICMD_MASK
)) {
4433 * i40e_read_phy_register_clause45
4434 * @hw: pointer to the HW structure
4435 * @page: registers page number
4436 * @reg: register address in the page
4437 * @phy_addr: PHY address on MDIO interface
4438 * @value: PHY register value
4440 * Reads specified PHY register value
4442 int i40e_read_phy_register_clause45(struct i40e_hw
*hw
,
4443 u8 page
, u16 reg
, u8 phy_addr
, u16
*value
)
4445 u8 port_num
= hw
->func_caps
.mdio_port_num
;
4450 command
= (reg
<< I40E_GLGEN_MSCA_MDIADD_SHIFT
) |
4451 (page
<< I40E_GLGEN_MSCA_DEVADD_SHIFT
) |
4452 (phy_addr
<< I40E_GLGEN_MSCA_PHYADD_SHIFT
) |
4453 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK
) |
4454 (I40E_MDIO_CLAUSE45_STCODE_MASK
) |
4455 (I40E_GLGEN_MSCA_MDICMD_MASK
) |
4456 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK
);
4457 wr32(hw
, I40E_GLGEN_MSCA(port_num
), command
);
4459 command
= rd32(hw
, I40E_GLGEN_MSCA(port_num
));
4460 if (!(command
& I40E_GLGEN_MSCA_MDICMD_MASK
)) {
4464 usleep_range(10, 20);
4469 i40e_debug(hw
, I40E_DEBUG_PHY
,
4470 "PHY: Can't write command to external PHY.\n");
4474 command
= (page
<< I40E_GLGEN_MSCA_DEVADD_SHIFT
) |
4475 (phy_addr
<< I40E_GLGEN_MSCA_PHYADD_SHIFT
) |
4476 (I40E_MDIO_CLAUSE45_OPCODE_READ_MASK
) |
4477 (I40E_MDIO_CLAUSE45_STCODE_MASK
) |
4478 (I40E_GLGEN_MSCA_MDICMD_MASK
) |
4479 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK
);
4482 wr32(hw
, I40E_GLGEN_MSCA(port_num
), command
);
4484 command
= rd32(hw
, I40E_GLGEN_MSCA(port_num
));
4485 if (!(command
& I40E_GLGEN_MSCA_MDICMD_MASK
)) {
4489 usleep_range(10, 20);
4494 command
= rd32(hw
, I40E_GLGEN_MSRWD(port_num
));
4495 *value
= FIELD_GET(I40E_GLGEN_MSRWD_MDIRDDATA_MASK
, command
);
4497 i40e_debug(hw
, I40E_DEBUG_PHY
,
4498 "PHY: Can't read register value from external PHY.\n");
4506 * i40e_write_phy_register_clause45
4507 * @hw: pointer to the HW structure
4508 * @page: registers page number
4509 * @reg: register address in the page
4510 * @phy_addr: PHY address on MDIO interface
4511 * @value: PHY register value
4513 * Writes value to specified PHY register
4515 int i40e_write_phy_register_clause45(struct i40e_hw
*hw
,
4516 u8 page
, u16 reg
, u8 phy_addr
, u16 value
)
4518 u8 port_num
= hw
->func_caps
.mdio_port_num
;
4523 command
= (reg
<< I40E_GLGEN_MSCA_MDIADD_SHIFT
) |
4524 (page
<< I40E_GLGEN_MSCA_DEVADD_SHIFT
) |
4525 (phy_addr
<< I40E_GLGEN_MSCA_PHYADD_SHIFT
) |
4526 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK
) |
4527 (I40E_MDIO_CLAUSE45_STCODE_MASK
) |
4528 (I40E_GLGEN_MSCA_MDICMD_MASK
) |
4529 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK
);
4530 wr32(hw
, I40E_GLGEN_MSCA(port_num
), command
);
4532 command
= rd32(hw
, I40E_GLGEN_MSCA(port_num
));
4533 if (!(command
& I40E_GLGEN_MSCA_MDICMD_MASK
)) {
4537 usleep_range(10, 20);
4541 i40e_debug(hw
, I40E_DEBUG_PHY
,
4542 "PHY: Can't write command to external PHY.\n");
4546 command
= value
<< I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT
;
4547 wr32(hw
, I40E_GLGEN_MSRWD(port_num
), command
);
4549 command
= (page
<< I40E_GLGEN_MSCA_DEVADD_SHIFT
) |
4550 (phy_addr
<< I40E_GLGEN_MSCA_PHYADD_SHIFT
) |
4551 (I40E_MDIO_CLAUSE45_OPCODE_WRITE_MASK
) |
4552 (I40E_MDIO_CLAUSE45_STCODE_MASK
) |
4553 (I40E_GLGEN_MSCA_MDICMD_MASK
) |
4554 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK
);
4557 wr32(hw
, I40E_GLGEN_MSCA(port_num
), command
);
4559 command
= rd32(hw
, I40E_GLGEN_MSCA(port_num
));
4560 if (!(command
& I40E_GLGEN_MSCA_MDICMD_MASK
)) {
4564 usleep_range(10, 20);
4573 * i40e_write_phy_register
4574 * @hw: pointer to the HW structure
4575 * @page: registers page number
4576 * @reg: register address in the page
4577 * @phy_addr: PHY address on MDIO interface
4578 * @value: PHY register value
4580 * Writes value to specified PHY register
4582 int i40e_write_phy_register(struct i40e_hw
*hw
,
4583 u8 page
, u16 reg
, u8 phy_addr
, u16 value
)
4587 switch (hw
->device_id
) {
4588 case I40E_DEV_ID_1G_BASE_T_X722
:
4589 status
= i40e_write_phy_register_clause22(hw
, reg
, phy_addr
,
4592 case I40E_DEV_ID_1G_BASE_T_BC
:
4593 case I40E_DEV_ID_5G_BASE_T_BC
:
4594 case I40E_DEV_ID_10G_BASE_T
:
4595 case I40E_DEV_ID_10G_BASE_T4
:
4596 case I40E_DEV_ID_10G_BASE_T_BC
:
4597 case I40E_DEV_ID_10G_BASE_T_X722
:
4598 case I40E_DEV_ID_25G_B
:
4599 case I40E_DEV_ID_25G_SFP28
:
4600 status
= i40e_write_phy_register_clause45(hw
, page
, reg
,
4612 * i40e_read_phy_register
4613 * @hw: pointer to the HW structure
4614 * @page: registers page number
4615 * @reg: register address in the page
4616 * @phy_addr: PHY address on MDIO interface
4617 * @value: PHY register value
4619 * Reads specified PHY register value
4621 int i40e_read_phy_register(struct i40e_hw
*hw
,
4622 u8 page
, u16 reg
, u8 phy_addr
, u16
*value
)
4626 switch (hw
->device_id
) {
4627 case I40E_DEV_ID_1G_BASE_T_X722
:
4628 status
= i40e_read_phy_register_clause22(hw
, reg
, phy_addr
,
4631 case I40E_DEV_ID_1G_BASE_T_BC
:
4632 case I40E_DEV_ID_5G_BASE_T_BC
:
4633 case I40E_DEV_ID_10G_BASE_T
:
4634 case I40E_DEV_ID_10G_BASE_T4
:
4635 case I40E_DEV_ID_10G_BASE_T_BC
:
4636 case I40E_DEV_ID_10G_BASE_T_X722
:
4637 case I40E_DEV_ID_25G_B
:
4638 case I40E_DEV_ID_25G_SFP28
:
4639 status
= i40e_read_phy_register_clause45(hw
, page
, reg
,
4651 * i40e_get_phy_address
4652 * @hw: pointer to the HW structure
4653 * @dev_num: PHY port num that address we want
4655 * Gets PHY address for current port
4657 u8
i40e_get_phy_address(struct i40e_hw
*hw
, u8 dev_num
)
4659 u8 port_num
= hw
->func_caps
.mdio_port_num
;
4660 u32 reg_val
= rd32(hw
, I40E_GLGEN_MDIO_I2C_SEL(port_num
));
4662 return (u8
)(reg_val
>> ((dev_num
+ 1) * 5)) & 0x1f;
4666 * i40e_blink_phy_link_led
4667 * @hw: pointer to the HW structure
4668 * @time: time how long led will blinks in secs
4669 * @interval: gap between LED on and off in msecs
4671 * Blinks PHY link LED
4673 int i40e_blink_phy_link_led(struct i40e_hw
*hw
,
4674 u32 time
, u32 interval
)
4676 u16 led_addr
= I40E_PHY_LED_PROV_REG_1
;
4685 i
= rd32(hw
, I40E_PFGEN_PORTNUM
);
4686 port_num
= (u8
)(i
& I40E_PFGEN_PORTNUM_PORT_NUM_MASK
);
4687 phy_addr
= i40e_get_phy_address(hw
, port_num
);
4689 for (gpio_led_port
= 0; gpio_led_port
< 3; gpio_led_port
++,
4691 status
= i40e_read_phy_register_clause45(hw
,
4692 I40E_PHY_COM_REG_PAGE
,
4696 goto phy_blinking_end
;
4698 if (led_reg
& I40E_PHY_LED_LINK_MODE_MASK
) {
4700 status
= i40e_write_phy_register_clause45(hw
,
4701 I40E_PHY_COM_REG_PAGE
,
4705 goto phy_blinking_end
;
4710 if (time
> 0 && interval
> 0) {
4711 for (i
= 0; i
< time
* 1000; i
+= interval
) {
4712 status
= i40e_read_phy_register_clause45(hw
,
4713 I40E_PHY_COM_REG_PAGE
,
4714 led_addr
, phy_addr
, &led_reg
);
4716 goto restore_config
;
4717 if (led_reg
& I40E_PHY_LED_MANUAL_ON
)
4720 led_reg
= I40E_PHY_LED_MANUAL_ON
;
4721 status
= i40e_write_phy_register_clause45(hw
,
4722 I40E_PHY_COM_REG_PAGE
,
4723 led_addr
, phy_addr
, led_reg
);
4725 goto restore_config
;
4731 status
= i40e_write_phy_register_clause45(hw
,
4732 I40E_PHY_COM_REG_PAGE
,
4733 led_addr
, phy_addr
, led_ctl
);
4740 * i40e_led_get_reg - read LED register
4741 * @hw: pointer to the HW structure
4742 * @led_addr: LED register address
4743 * @reg_val: read register value
4745 static int i40e_led_get_reg(struct i40e_hw
*hw
, u16 led_addr
,
4754 if (test_bit(I40E_HW_CAP_AQ_PHY_ACCESS
, hw
->caps
)) {
4756 i40e_aq_get_phy_register(hw
,
4757 I40E_AQ_PHY_REG_ACCESS_EXTERNAL
,
4758 I40E_PHY_COM_REG_PAGE
, true,
4759 I40E_PHY_LED_PROV_REG_1
,
4762 i
= rd32(hw
, I40E_PFGEN_PORTNUM
);
4763 port_num
= (u8
)(i
& I40E_PFGEN_PORTNUM_PORT_NUM_MASK
);
4764 phy_addr
= i40e_get_phy_address(hw
, port_num
);
4765 status
= i40e_read_phy_register_clause45(hw
,
4766 I40E_PHY_COM_REG_PAGE
,
4774 * i40e_led_set_reg - write LED register
4775 * @hw: pointer to the HW structure
4776 * @led_addr: LED register address
4777 * @reg_val: register value to write
4779 static int i40e_led_set_reg(struct i40e_hw
*hw
, u16 led_addr
,
4787 if (test_bit(I40E_HW_CAP_AQ_PHY_ACCESS
, hw
->caps
)) {
4789 i40e_aq_set_phy_register(hw
,
4790 I40E_AQ_PHY_REG_ACCESS_EXTERNAL
,
4791 I40E_PHY_COM_REG_PAGE
, true,
4792 I40E_PHY_LED_PROV_REG_1
,
4795 i
= rd32(hw
, I40E_PFGEN_PORTNUM
);
4796 port_num
= (u8
)(i
& I40E_PFGEN_PORTNUM_PORT_NUM_MASK
);
4797 phy_addr
= i40e_get_phy_address(hw
, port_num
);
4798 status
= i40e_write_phy_register_clause45(hw
,
4799 I40E_PHY_COM_REG_PAGE
,
4808 * i40e_led_get_phy - return current on/off mode
4809 * @hw: pointer to the hw struct
4810 * @led_addr: address of led register to use
4811 * @val: original value of register to use
4814 int i40e_led_get_phy(struct i40e_hw
*hw
, u16
*led_addr
,
4826 if (test_bit(I40E_HW_CAP_AQ_PHY_ACCESS
, hw
->caps
)) {
4828 i40e_aq_get_phy_register(hw
,
4829 I40E_AQ_PHY_REG_ACCESS_EXTERNAL
,
4830 I40E_PHY_COM_REG_PAGE
, true,
4831 I40E_PHY_LED_PROV_REG_1
,
4834 *val
= (u16
)reg_val_aq
;
4837 temp_addr
= I40E_PHY_LED_PROV_REG_1
;
4838 i
= rd32(hw
, I40E_PFGEN_PORTNUM
);
4839 port_num
= (u8
)(i
& I40E_PFGEN_PORTNUM_PORT_NUM_MASK
);
4840 phy_addr
= i40e_get_phy_address(hw
, port_num
);
4842 for (gpio_led_port
= 0; gpio_led_port
< 3; gpio_led_port
++,
4844 status
= i40e_read_phy_register_clause45(hw
,
4845 I40E_PHY_COM_REG_PAGE
,
4846 temp_addr
, phy_addr
,
4851 if (reg_val
& I40E_PHY_LED_LINK_MODE_MASK
) {
4852 *led_addr
= temp_addr
;
4861 * @hw: pointer to the HW structure
4862 * @on: true or false
4863 * @led_addr: address of led register to use
4864 * @mode: original val plus bit for set or ignore
4866 * Set led's on or off when controlled by the PHY
4869 int i40e_led_set_phy(struct i40e_hw
*hw
, bool on
,
4870 u16 led_addr
, u32 mode
)
4876 status
= i40e_led_get_reg(hw
, led_addr
, &led_reg
);
4880 if (led_reg
& I40E_PHY_LED_LINK_MODE_MASK
) {
4882 status
= i40e_led_set_reg(hw
, led_addr
, led_reg
);
4886 status
= i40e_led_get_reg(hw
, led_addr
, &led_reg
);
4888 goto restore_config
;
4890 led_reg
= I40E_PHY_LED_MANUAL_ON
;
4894 status
= i40e_led_set_reg(hw
, led_addr
, led_reg
);
4896 goto restore_config
;
4897 if (mode
& I40E_PHY_LED_MODE_ORIG
) {
4898 led_ctl
= (mode
& I40E_PHY_LED_MODE_MASK
);
4899 status
= i40e_led_set_reg(hw
, led_addr
, led_ctl
);
4904 status
= i40e_led_set_reg(hw
, led_addr
, led_ctl
);
4909 * i40e_aq_rx_ctl_read_register - use FW to read from an Rx control register
4910 * @hw: pointer to the hw struct
4911 * @reg_addr: register address
4912 * @reg_val: ptr to register value
4913 * @cmd_details: pointer to command details structure or NULL
4915 * Use the firmware to read the Rx control register,
4916 * especially useful if the Rx unit is under heavy pressure
4918 int i40e_aq_rx_ctl_read_register(struct i40e_hw
*hw
,
4919 u32 reg_addr
, u32
*reg_val
,
4920 struct i40e_asq_cmd_details
*cmd_details
)
4922 struct i40e_aq_desc desc
;
4923 struct i40e_aqc_rx_ctl_reg_read_write
*cmd_resp
=
4924 (struct i40e_aqc_rx_ctl_reg_read_write
*)&desc
.params
.raw
;
4930 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_rx_ctl_reg_read
);
4932 cmd_resp
->address
= cpu_to_le32(reg_addr
);
4934 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
4937 *reg_val
= le32_to_cpu(cmd_resp
->value
);
4943 * i40e_read_rx_ctl - read from an Rx control register
4944 * @hw: pointer to the hw struct
4945 * @reg_addr: register address
4947 u32
i40e_read_rx_ctl(struct i40e_hw
*hw
, u32 reg_addr
)
4949 bool use_register
= false;
4954 if (i40e_is_aq_api_ver_lt(hw
, 1, 5) || hw
->mac
.type
== I40E_MAC_X722
)
4955 use_register
= true;
4957 if (!use_register
) {
4959 status
= i40e_aq_rx_ctl_read_register(hw
, reg_addr
, &val
, NULL
);
4960 if (hw
->aq
.asq_last_status
== I40E_AQ_RC_EAGAIN
&& retry
) {
4961 usleep_range(1000, 2000);
4967 /* if the AQ access failed, try the old-fashioned way */
4968 if (status
|| use_register
)
4969 val
= rd32(hw
, reg_addr
);
4975 * i40e_aq_rx_ctl_write_register
4976 * @hw: pointer to the hw struct
4977 * @reg_addr: register address
4978 * @reg_val: register value
4979 * @cmd_details: pointer to command details structure or NULL
4981 * Use the firmware to write to an Rx control register,
4982 * especially useful if the Rx unit is under heavy pressure
4984 int i40e_aq_rx_ctl_write_register(struct i40e_hw
*hw
,
4985 u32 reg_addr
, u32 reg_val
,
4986 struct i40e_asq_cmd_details
*cmd_details
)
4988 struct i40e_aq_desc desc
;
4989 struct i40e_aqc_rx_ctl_reg_read_write
*cmd
=
4990 (struct i40e_aqc_rx_ctl_reg_read_write
*)&desc
.params
.raw
;
4993 i40e_fill_default_direct_cmd_desc(&desc
, i40e_aqc_opc_rx_ctl_reg_write
);
4995 cmd
->address
= cpu_to_le32(reg_addr
);
4996 cmd
->value
= cpu_to_le32(reg_val
);
4998 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
5004 * i40e_write_rx_ctl - write to an Rx control register
5005 * @hw: pointer to the hw struct
5006 * @reg_addr: register address
5007 * @reg_val: register value
5009 void i40e_write_rx_ctl(struct i40e_hw
*hw
, u32 reg_addr
, u32 reg_val
)
5011 bool use_register
= false;
5015 if (i40e_is_aq_api_ver_lt(hw
, 1, 5) || hw
->mac
.type
== I40E_MAC_X722
)
5016 use_register
= true;
5018 if (!use_register
) {
5020 status
= i40e_aq_rx_ctl_write_register(hw
, reg_addr
,
5022 if (hw
->aq
.asq_last_status
== I40E_AQ_RC_EAGAIN
&& retry
) {
5023 usleep_range(1000, 2000);
5029 /* if the AQ access failed, try the old-fashioned way */
5030 if (status
|| use_register
)
5031 wr32(hw
, reg_addr
, reg_val
);
5035 * i40e_mdio_if_number_selection - MDIO I/F number selection
5036 * @hw: pointer to the hw struct
5037 * @set_mdio: use MDIO I/F number specified by mdio_num
5038 * @mdio_num: MDIO I/F number
5039 * @cmd: pointer to PHY Register command structure
5041 static void i40e_mdio_if_number_selection(struct i40e_hw
*hw
, bool set_mdio
,
5043 struct i40e_aqc_phy_register_access
*cmd
)
5046 cmd
->phy_interface
!= I40E_AQ_PHY_REG_ACCESS_EXTERNAL
)
5049 if (test_bit(I40E_HW_CAP_AQ_PHY_ACCESS_EXTENDED
, hw
->caps
)) {
5051 I40E_AQ_PHY_REG_ACCESS_SET_MDIO_IF_NUMBER
|
5052 FIELD_PREP(I40E_AQ_PHY_REG_ACCESS_MDIO_IF_NUMBER_MASK
,
5055 i40e_debug(hw
, I40E_DEBUG_PHY
, "MDIO I/F number selection not supported by current FW version.\n");
5060 * i40e_aq_set_phy_register_ext
5061 * @hw: pointer to the hw struct
5062 * @phy_select: select which phy should be accessed
5063 * @dev_addr: PHY device address
5064 * @page_change: flag to indicate if phy page should be updated
5065 * @set_mdio: use MDIO I/F number specified by mdio_num
5066 * @mdio_num: MDIO I/F number
5067 * @reg_addr: PHY register address
5068 * @reg_val: new register value
5069 * @cmd_details: pointer to command details structure or NULL
5071 * Write the external PHY register.
5072 * NOTE: In common cases MDIO I/F number should not be changed, thats why you
5073 * may use simple wrapper i40e_aq_set_phy_register.
5075 int i40e_aq_set_phy_register_ext(struct i40e_hw
*hw
,
5076 u8 phy_select
, u8 dev_addr
, bool page_change
,
5077 bool set_mdio
, u8 mdio_num
,
5078 u32 reg_addr
, u32 reg_val
,
5079 struct i40e_asq_cmd_details
*cmd_details
)
5081 struct i40e_aq_desc desc
;
5082 struct i40e_aqc_phy_register_access
*cmd
=
5083 (struct i40e_aqc_phy_register_access
*)&desc
.params
.raw
;
5086 i40e_fill_default_direct_cmd_desc(&desc
,
5087 i40e_aqc_opc_set_phy_register
);
5089 cmd
->phy_interface
= phy_select
;
5090 cmd
->dev_address
= dev_addr
;
5091 cmd
->reg_address
= cpu_to_le32(reg_addr
);
5092 cmd
->reg_value
= cpu_to_le32(reg_val
);
5094 i40e_mdio_if_number_selection(hw
, set_mdio
, mdio_num
, cmd
);
5097 cmd
->cmd_flags
= I40E_AQ_PHY_REG_ACCESS_DONT_CHANGE_QSFP_PAGE
;
5099 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
5105 * i40e_aq_get_phy_register_ext
5106 * @hw: pointer to the hw struct
5107 * @phy_select: select which phy should be accessed
5108 * @dev_addr: PHY device address
5109 * @page_change: flag to indicate if phy page should be updated
5110 * @set_mdio: use MDIO I/F number specified by mdio_num
5111 * @mdio_num: MDIO I/F number
5112 * @reg_addr: PHY register address
5113 * @reg_val: read register value
5114 * @cmd_details: pointer to command details structure or NULL
5116 * Read the external PHY register.
5117 * NOTE: In common cases MDIO I/F number should not be changed, thats why you
5118 * may use simple wrapper i40e_aq_get_phy_register.
5120 int i40e_aq_get_phy_register_ext(struct i40e_hw
*hw
,
5121 u8 phy_select
, u8 dev_addr
, bool page_change
,
5122 bool set_mdio
, u8 mdio_num
,
5123 u32 reg_addr
, u32
*reg_val
,
5124 struct i40e_asq_cmd_details
*cmd_details
)
5126 struct i40e_aq_desc desc
;
5127 struct i40e_aqc_phy_register_access
*cmd
=
5128 (struct i40e_aqc_phy_register_access
*)&desc
.params
.raw
;
5131 i40e_fill_default_direct_cmd_desc(&desc
,
5132 i40e_aqc_opc_get_phy_register
);
5134 cmd
->phy_interface
= phy_select
;
5135 cmd
->dev_address
= dev_addr
;
5136 cmd
->reg_address
= cpu_to_le32(reg_addr
);
5138 i40e_mdio_if_number_selection(hw
, set_mdio
, mdio_num
, cmd
);
5141 cmd
->cmd_flags
= I40E_AQ_PHY_REG_ACCESS_DONT_CHANGE_QSFP_PAGE
;
5143 status
= i40e_asq_send_command(hw
, &desc
, NULL
, 0, cmd_details
);
5145 *reg_val
= le32_to_cpu(cmd
->reg_value
);
5151 * i40e_aq_write_ddp - Write dynamic device personalization (ddp)
5152 * @hw: pointer to the hw struct
5153 * @buff: command buffer (size in bytes = buff_size)
5154 * @buff_size: buffer size in bytes
5155 * @track_id: package tracking id
5156 * @error_offset: returns error offset
5157 * @error_info: returns error information
5158 * @cmd_details: pointer to command details structure or NULL
5160 int i40e_aq_write_ddp(struct i40e_hw
*hw
, void *buff
,
5161 u16 buff_size
, u32 track_id
,
5162 u32
*error_offset
, u32
*error_info
,
5163 struct i40e_asq_cmd_details
*cmd_details
)
5165 struct i40e_aq_desc desc
;
5166 struct i40e_aqc_write_personalization_profile
*cmd
=
5167 (struct i40e_aqc_write_personalization_profile
*)
5169 struct i40e_aqc_write_ddp_resp
*resp
;
5172 i40e_fill_default_direct_cmd_desc(&desc
,
5173 i40e_aqc_opc_write_personalization_profile
);
5175 desc
.flags
|= cpu_to_le16(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
);
5176 if (buff_size
> I40E_AQ_LARGE_BUF
)
5177 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
5179 desc
.datalen
= cpu_to_le16(buff_size
);
5181 cmd
->profile_track_id
= cpu_to_le32(track_id
);
5183 status
= i40e_asq_send_command(hw
, &desc
, buff
, buff_size
, cmd_details
);
5185 resp
= (struct i40e_aqc_write_ddp_resp
*)&desc
.params
.raw
;
5187 *error_offset
= le32_to_cpu(resp
->error_offset
);
5189 *error_info
= le32_to_cpu(resp
->error_info
);
5196 * i40e_aq_get_ddp_list - Read dynamic device personalization (ddp)
5197 * @hw: pointer to the hw struct
5198 * @buff: command buffer (size in bytes = buff_size)
5199 * @buff_size: buffer size in bytes
5200 * @flags: AdminQ command flags
5201 * @cmd_details: pointer to command details structure or NULL
5203 int i40e_aq_get_ddp_list(struct i40e_hw
*hw
, void *buff
,
5204 u16 buff_size
, u8 flags
,
5205 struct i40e_asq_cmd_details
*cmd_details
)
5207 struct i40e_aq_desc desc
;
5208 struct i40e_aqc_get_applied_profiles
*cmd
=
5209 (struct i40e_aqc_get_applied_profiles
*)&desc
.params
.raw
;
5212 i40e_fill_default_direct_cmd_desc(&desc
,
5213 i40e_aqc_opc_get_personalization_profile_list
);
5215 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_BUF
);
5216 if (buff_size
> I40E_AQ_LARGE_BUF
)
5217 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
5218 desc
.datalen
= cpu_to_le16(buff_size
);
5222 status
= i40e_asq_send_command(hw
, &desc
, buff
, buff_size
, cmd_details
);
5228 * i40e_find_segment_in_package
5229 * @segment_type: the segment type to search for (i.e., SEGMENT_TYPE_I40E)
5230 * @pkg_hdr: pointer to the package header to be searched
5232 * This function searches a package file for a particular segment type. On
5233 * success it returns a pointer to the segment header, otherwise it will
5236 struct i40e_generic_seg_header
*
5237 i40e_find_segment_in_package(u32 segment_type
,
5238 struct i40e_package_header
*pkg_hdr
)
5240 struct i40e_generic_seg_header
*segment
;
5243 /* Search all package segments for the requested segment type */
5244 for (i
= 0; i
< pkg_hdr
->segment_count
; i
++) {
5246 (struct i40e_generic_seg_header
*)((u8
*)pkg_hdr
+
5247 pkg_hdr
->segment_offset
[i
]);
5249 if (segment
->type
== segment_type
)
5256 /* Get section table in profile */
5257 #define I40E_SECTION_TABLE(profile, sec_tbl) \
5259 struct i40e_profile_segment *p = (profile); \
5262 count = p->device_table_count; \
5263 nvm = (u32 *)&p->device_table[count]; \
5264 sec_tbl = (struct i40e_section_table *)&nvm[nvm[0] + 1]; \
5267 /* Get section header in profile */
5268 #define I40E_SECTION_HEADER(profile, offset) \
5269 (struct i40e_profile_section_header *)((u8 *)(profile) + (offset))
5272 * i40e_find_section_in_profile
5273 * @section_type: the section type to search for (i.e., SECTION_TYPE_NOTE)
5274 * @profile: pointer to the i40e segment header to be searched
5276 * This function searches i40e segment for a particular section type. On
5277 * success it returns a pointer to the section header, otherwise it will
5280 struct i40e_profile_section_header
*
5281 i40e_find_section_in_profile(u32 section_type
,
5282 struct i40e_profile_segment
*profile
)
5284 struct i40e_profile_section_header
*sec
;
5285 struct i40e_section_table
*sec_tbl
;
5289 if (profile
->header
.type
!= SEGMENT_TYPE_I40E
)
5292 I40E_SECTION_TABLE(profile
, sec_tbl
);
5294 for (i
= 0; i
< sec_tbl
->section_count
; i
++) {
5295 sec_off
= sec_tbl
->section_offset
[i
];
5296 sec
= I40E_SECTION_HEADER(profile
, sec_off
);
5297 if (sec
->section
.type
== section_type
)
5305 * i40e_ddp_exec_aq_section - Execute generic AQ for DDP
5306 * @hw: pointer to the hw struct
5307 * @aq: command buffer containing all data to execute AQ
5309 static int i40e_ddp_exec_aq_section(struct i40e_hw
*hw
,
5310 struct i40e_profile_aq_section
*aq
)
5312 struct i40e_aq_desc desc
;
5317 i40e_fill_default_direct_cmd_desc(&desc
, aq
->opcode
);
5318 desc
.flags
|= cpu_to_le16(aq
->flags
);
5319 memcpy(desc
.params
.raw
, aq
->param
, sizeof(desc
.params
.raw
));
5321 msglen
= aq
->datalen
;
5323 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
|
5325 if (msglen
> I40E_AQ_LARGE_BUF
)
5326 desc
.flags
|= cpu_to_le16((u16
)I40E_AQ_FLAG_LB
);
5327 desc
.datalen
= cpu_to_le16(msglen
);
5331 status
= i40e_asq_send_command(hw
, &desc
, msg
, msglen
, NULL
);
5334 i40e_debug(hw
, I40E_DEBUG_PACKAGE
,
5335 "unable to exec DDP AQ opcode %u, error %d\n",
5336 aq
->opcode
, status
);
5340 /* copy returned desc to aq_buf */
5341 memcpy(aq
->param
, desc
.params
.raw
, sizeof(desc
.params
.raw
));
5347 * i40e_validate_profile
5348 * @hw: pointer to the hardware structure
5349 * @profile: pointer to the profile segment of the package to be validated
5350 * @track_id: package tracking id
5351 * @rollback: flag if the profile is for rollback.
5353 * Validates supported devices and profile's sections.
5356 i40e_validate_profile(struct i40e_hw
*hw
, struct i40e_profile_segment
*profile
,
5357 u32 track_id
, bool rollback
)
5359 struct i40e_profile_section_header
*sec
= NULL
;
5360 struct i40e_section_table
*sec_tbl
;
5367 if (track_id
== I40E_DDP_TRACKID_INVALID
) {
5368 i40e_debug(hw
, I40E_DEBUG_PACKAGE
, "Invalid track_id\n");
5372 dev_cnt
= profile
->device_table_count
;
5373 for (i
= 0; i
< dev_cnt
; i
++) {
5374 vendor_dev_id
= profile
->device_table
[i
].vendor_dev_id
;
5375 if ((vendor_dev_id
>> 16) == PCI_VENDOR_ID_INTEL
&&
5376 hw
->device_id
== (vendor_dev_id
& 0xFFFF))
5379 if (dev_cnt
&& i
== dev_cnt
) {
5380 i40e_debug(hw
, I40E_DEBUG_PACKAGE
,
5381 "Device doesn't support DDP\n");
5385 I40E_SECTION_TABLE(profile
, sec_tbl
);
5387 /* Validate sections types */
5388 for (i
= 0; i
< sec_tbl
->section_count
; i
++) {
5389 sec_off
= sec_tbl
->section_offset
[i
];
5390 sec
= I40E_SECTION_HEADER(profile
, sec_off
);
5392 if (sec
->section
.type
== SECTION_TYPE_MMIO
||
5393 sec
->section
.type
== SECTION_TYPE_AQ
||
5394 sec
->section
.type
== SECTION_TYPE_RB_AQ
) {
5395 i40e_debug(hw
, I40E_DEBUG_PACKAGE
,
5396 "Not a roll-back package\n");
5400 if (sec
->section
.type
== SECTION_TYPE_RB_AQ
||
5401 sec
->section
.type
== SECTION_TYPE_RB_MMIO
) {
5402 i40e_debug(hw
, I40E_DEBUG_PACKAGE
,
5403 "Not an original package\n");
5413 * i40e_write_profile
5414 * @hw: pointer to the hardware structure
5415 * @profile: pointer to the profile segment of the package to be downloaded
5416 * @track_id: package tracking id
5418 * Handles the download of a complete package.
5421 i40e_write_profile(struct i40e_hw
*hw
, struct i40e_profile_segment
*profile
,
5424 struct i40e_profile_section_header
*sec
= NULL
;
5425 struct i40e_profile_aq_section
*ddp_aq
;
5426 struct i40e_section_table
*sec_tbl
;
5427 u32 offset
= 0, info
= 0;
5428 u32 section_size
= 0;
5433 status
= i40e_validate_profile(hw
, profile
, track_id
, false);
5437 I40E_SECTION_TABLE(profile
, sec_tbl
);
5439 for (i
= 0; i
< sec_tbl
->section_count
; i
++) {
5440 sec_off
= sec_tbl
->section_offset
[i
];
5441 sec
= I40E_SECTION_HEADER(profile
, sec_off
);
5442 /* Process generic admin command */
5443 if (sec
->section
.type
== SECTION_TYPE_AQ
) {
5444 ddp_aq
= (struct i40e_profile_aq_section
*)&sec
[1];
5445 status
= i40e_ddp_exec_aq_section(hw
, ddp_aq
);
5447 i40e_debug(hw
, I40E_DEBUG_PACKAGE
,
5448 "Failed to execute aq: section %d, opcode %u\n",
5452 sec
->section
.type
= SECTION_TYPE_RB_AQ
;
5455 /* Skip any non-mmio sections */
5456 if (sec
->section
.type
!= SECTION_TYPE_MMIO
)
5459 section_size
= sec
->section
.size
+
5460 sizeof(struct i40e_profile_section_header
);
5462 /* Write MMIO section */
5463 status
= i40e_aq_write_ddp(hw
, (void *)sec
, (u16
)section_size
,
5464 track_id
, &offset
, &info
, NULL
);
5466 i40e_debug(hw
, I40E_DEBUG_PACKAGE
,
5467 "Failed to write profile: section %d, offset %d, info %d\n",
5476 * i40e_rollback_profile
5477 * @hw: pointer to the hardware structure
5478 * @profile: pointer to the profile segment of the package to be removed
5479 * @track_id: package tracking id
5481 * Rolls back previously loaded package.
5484 i40e_rollback_profile(struct i40e_hw
*hw
, struct i40e_profile_segment
*profile
,
5487 struct i40e_profile_section_header
*sec
= NULL
;
5488 struct i40e_section_table
*sec_tbl
;
5489 u32 offset
= 0, info
= 0;
5490 u32 section_size
= 0;
5495 status
= i40e_validate_profile(hw
, profile
, track_id
, true);
5499 I40E_SECTION_TABLE(profile
, sec_tbl
);
5501 /* For rollback write sections in reverse */
5502 for (i
= sec_tbl
->section_count
- 1; i
>= 0; i
--) {
5503 sec_off
= sec_tbl
->section_offset
[i
];
5504 sec
= I40E_SECTION_HEADER(profile
, sec_off
);
5506 /* Skip any non-rollback sections */
5507 if (sec
->section
.type
!= SECTION_TYPE_RB_MMIO
)
5510 section_size
= sec
->section
.size
+
5511 sizeof(struct i40e_profile_section_header
);
5513 /* Write roll-back MMIO section */
5514 status
= i40e_aq_write_ddp(hw
, (void *)sec
, (u16
)section_size
,
5515 track_id
, &offset
, &info
, NULL
);
5517 i40e_debug(hw
, I40E_DEBUG_PACKAGE
,
5518 "Failed to write profile: section %d, offset %d, info %d\n",
5527 * i40e_add_pinfo_to_list
5528 * @hw: pointer to the hardware structure
5529 * @profile: pointer to the profile segment of the package
5530 * @profile_info_sec: buffer for information section
5531 * @track_id: package tracking id
5533 * Register a profile to the list of loaded profiles.
5536 i40e_add_pinfo_to_list(struct i40e_hw
*hw
,
5537 struct i40e_profile_segment
*profile
,
5538 u8
*profile_info_sec
, u32 track_id
)
5540 struct i40e_profile_section_header
*sec
= NULL
;
5541 struct i40e_profile_info
*pinfo
;
5542 u32 offset
= 0, info
= 0;
5545 sec
= (struct i40e_profile_section_header
*)profile_info_sec
;
5547 sec
->data_end
= sizeof(struct i40e_profile_section_header
) +
5548 sizeof(struct i40e_profile_info
);
5549 sec
->section
.type
= SECTION_TYPE_INFO
;
5550 sec
->section
.offset
= sizeof(struct i40e_profile_section_header
);
5551 sec
->section
.size
= sizeof(struct i40e_profile_info
);
5552 pinfo
= (struct i40e_profile_info
*)(profile_info_sec
+
5553 sec
->section
.offset
);
5554 pinfo
->track_id
= track_id
;
5555 pinfo
->version
= profile
->version
;
5556 pinfo
->op
= I40E_DDP_ADD_TRACKID
;
5557 memcpy(pinfo
->name
, profile
->name
, I40E_DDP_NAME_SIZE
);
5559 status
= i40e_aq_write_ddp(hw
, (void *)sec
, sec
->data_end
,
5560 track_id
, &offset
, &info
, NULL
);
5566 * i40e_aq_add_cloud_filters
5567 * @hw: pointer to the hardware structure
5568 * @seid: VSI seid to add cloud filters from
5569 * @filters: Buffer which contains the filters to be added
5570 * @filter_count: number of filters contained in the buffer
5572 * Set the cloud filters for a given VSI. The contents of the
5573 * i40e_aqc_cloud_filters_element_data are filled in by the caller
5578 i40e_aq_add_cloud_filters(struct i40e_hw
*hw
, u16 seid
,
5579 struct i40e_aqc_cloud_filters_element_data
*filters
,
5582 struct i40e_aq_desc desc
;
5583 struct i40e_aqc_add_remove_cloud_filters
*cmd
=
5584 (struct i40e_aqc_add_remove_cloud_filters
*)&desc
.params
.raw
;
5588 i40e_fill_default_direct_cmd_desc(&desc
,
5589 i40e_aqc_opc_add_cloud_filters
);
5591 buff_len
= filter_count
* sizeof(*filters
);
5592 desc
.datalen
= cpu_to_le16(buff_len
);
5593 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
5594 cmd
->num_filters
= filter_count
;
5595 cmd
->seid
= cpu_to_le16(seid
);
5597 status
= i40e_asq_send_command(hw
, &desc
, filters
, buff_len
, NULL
);
5603 * i40e_aq_add_cloud_filters_bb
5604 * @hw: pointer to the hardware structure
5605 * @seid: VSI seid to add cloud filters from
5606 * @filters: Buffer which contains the filters in big buffer to be added
5607 * @filter_count: number of filters contained in the buffer
5609 * Set the big buffer cloud filters for a given VSI. The contents of the
5610 * i40e_aqc_cloud_filters_element_bb are filled in by the caller of the
5615 i40e_aq_add_cloud_filters_bb(struct i40e_hw
*hw
, u16 seid
,
5616 struct i40e_aqc_cloud_filters_element_bb
*filters
,
5619 struct i40e_aq_desc desc
;
5620 struct i40e_aqc_add_remove_cloud_filters
*cmd
=
5621 (struct i40e_aqc_add_remove_cloud_filters
*)&desc
.params
.raw
;
5626 i40e_fill_default_direct_cmd_desc(&desc
,
5627 i40e_aqc_opc_add_cloud_filters
);
5629 buff_len
= filter_count
* sizeof(*filters
);
5630 desc
.datalen
= cpu_to_le16(buff_len
);
5631 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
5632 cmd
->num_filters
= filter_count
;
5633 cmd
->seid
= cpu_to_le16(seid
);
5634 cmd
->big_buffer_flag
= I40E_AQC_ADD_CLOUD_CMD_BB
;
5636 for (i
= 0; i
< filter_count
; i
++) {
5640 tnl_type
= le16_get_bits(filters
[i
].element
.flags
,
5641 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK
);
5643 /* Due to hardware eccentricities, the VNI for Geneve is shifted
5644 * one more byte further than normally used for Tenant ID in
5645 * other tunnel types.
5647 if (tnl_type
== I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE
) {
5648 ti
= le32_to_cpu(filters
[i
].element
.tenant_id
);
5649 filters
[i
].element
.tenant_id
= cpu_to_le32(ti
<< 8);
5653 status
= i40e_asq_send_command(hw
, &desc
, filters
, buff_len
, NULL
);
5659 * i40e_aq_rem_cloud_filters
5660 * @hw: pointer to the hardware structure
5661 * @seid: VSI seid to remove cloud filters from
5662 * @filters: Buffer which contains the filters to be removed
5663 * @filter_count: number of filters contained in the buffer
5665 * Remove the cloud filters for a given VSI. The contents of the
5666 * i40e_aqc_cloud_filters_element_data are filled in by the caller
5671 i40e_aq_rem_cloud_filters(struct i40e_hw
*hw
, u16 seid
,
5672 struct i40e_aqc_cloud_filters_element_data
*filters
,
5675 struct i40e_aq_desc desc
;
5676 struct i40e_aqc_add_remove_cloud_filters
*cmd
=
5677 (struct i40e_aqc_add_remove_cloud_filters
*)&desc
.params
.raw
;
5681 i40e_fill_default_direct_cmd_desc(&desc
,
5682 i40e_aqc_opc_remove_cloud_filters
);
5684 buff_len
= filter_count
* sizeof(*filters
);
5685 desc
.datalen
= cpu_to_le16(buff_len
);
5686 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
5687 cmd
->num_filters
= filter_count
;
5688 cmd
->seid
= cpu_to_le16(seid
);
5690 status
= i40e_asq_send_command(hw
, &desc
, filters
, buff_len
, NULL
);
5696 * i40e_aq_rem_cloud_filters_bb
5697 * @hw: pointer to the hardware structure
5698 * @seid: VSI seid to remove cloud filters from
5699 * @filters: Buffer which contains the filters in big buffer to be removed
5700 * @filter_count: number of filters contained in the buffer
5702 * Remove the big buffer cloud filters for a given VSI. The contents of the
5703 * i40e_aqc_cloud_filters_element_bb are filled in by the caller of the
5708 i40e_aq_rem_cloud_filters_bb(struct i40e_hw
*hw
, u16 seid
,
5709 struct i40e_aqc_cloud_filters_element_bb
*filters
,
5712 struct i40e_aq_desc desc
;
5713 struct i40e_aqc_add_remove_cloud_filters
*cmd
=
5714 (struct i40e_aqc_add_remove_cloud_filters
*)&desc
.params
.raw
;
5719 i40e_fill_default_direct_cmd_desc(&desc
,
5720 i40e_aqc_opc_remove_cloud_filters
);
5722 buff_len
= filter_count
* sizeof(*filters
);
5723 desc
.datalen
= cpu_to_le16(buff_len
);
5724 desc
.flags
|= cpu_to_le16((u16
)(I40E_AQ_FLAG_BUF
| I40E_AQ_FLAG_RD
));
5725 cmd
->num_filters
= filter_count
;
5726 cmd
->seid
= cpu_to_le16(seid
);
5727 cmd
->big_buffer_flag
= I40E_AQC_ADD_CLOUD_CMD_BB
;
5729 for (i
= 0; i
< filter_count
; i
++) {
5733 tnl_type
= le16_get_bits(filters
[i
].element
.flags
,
5734 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK
);
5736 /* Due to hardware eccentricities, the VNI for Geneve is shifted
5737 * one more byte further than normally used for Tenant ID in
5738 * other tunnel types.
5740 if (tnl_type
== I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE
) {
5741 ti
= le32_to_cpu(filters
[i
].element
.tenant_id
);
5742 filters
[i
].element
.tenant_id
= cpu_to_le32(ti
<< 8);
5746 status
= i40e_asq_send_command(hw
, &desc
, filters
, buff_len
, NULL
);