i40e_common.c revision 270631
1/******************************************************************************
2
3  Copyright (c) 2013-2014, Intel Corporation
4  All rights reserved.
5
6  Redistribution and use in source and binary forms, with or without
7  modification, are permitted provided that the following conditions are met:
8
9   1. Redistributions of source code must retain the above copyright notice,
10      this list of conditions and the following disclaimer.
11
12   2. Redistributions in binary form must reproduce the above copyright
13      notice, this list of conditions and the following disclaimer in the
14      documentation and/or other materials provided with the distribution.
15
16   3. Neither the name of the Intel Corporation nor the names of its
17      contributors may be used to endorse or promote products derived from
18      this software without specific prior written permission.
19
20  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
33/*$FreeBSD: stable/10/sys/dev/ixl/i40e_common.c 270631 2014-08-25 22:04:29Z jfv $*/
34
35#include "i40e_type.h"
36#include "i40e_adminq.h"
37#include "i40e_prototype.h"
38#include "i40e_virtchnl.h"
39
40/**
41 * i40e_set_mac_type - Sets MAC type
42 * @hw: pointer to the HW structure
43 *
44 * This function sets the mac type of the adapter based on the
45 * vendor ID and device ID stored in the hw structure.
46 **/
47enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
48{
49	enum i40e_status_code status = I40E_SUCCESS;
50
51	DEBUGFUNC("i40e_set_mac_type\n");
52
53	if (hw->vendor_id == I40E_INTEL_VENDOR_ID) {
54		switch (hw->device_id) {
55		case I40E_DEV_ID_SFP_XL710:
56		case I40E_DEV_ID_QEMU:
57		case I40E_DEV_ID_KX_A:
58		case I40E_DEV_ID_KX_B:
59		case I40E_DEV_ID_KX_C:
60		case I40E_DEV_ID_QSFP_A:
61		case I40E_DEV_ID_QSFP_B:
62		case I40E_DEV_ID_QSFP_C:
63		case I40E_DEV_ID_10G_BASE_T:
64			hw->mac.type = I40E_MAC_XL710;
65			break;
66		case I40E_DEV_ID_VF:
67		case I40E_DEV_ID_VF_HV:
68			hw->mac.type = I40E_MAC_VF;
69			break;
70		default:
71			hw->mac.type = I40E_MAC_GENERIC;
72			break;
73		}
74	} else {
75		status = I40E_ERR_DEVICE_NOT_SUPPORTED;
76	}
77
78	DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n",
79		  hw->mac.type, status);
80	return status;
81}
82
83/**
84 * i40e_debug_aq
85 * @hw: debug mask related to admin queue
86 * @mask: debug mask
87 * @desc: pointer to admin queue descriptor
88 * @buffer: pointer to command buffer
89 * @buf_len: max length of buffer
90 *
91 * Dumps debug log about adminq command with descriptor contents.
92 **/
93void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
94		   void *buffer, u16 buf_len)
95{
96	struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
97	u16 len = LE16_TO_CPU(aq_desc->datalen);
98	u8 *aq_buffer = (u8 *)buffer;
99	u32 data[4];
100	u32 i = 0;
101
102	if ((!(mask & hw->debug_mask)) || (desc == NULL))
103		return;
104
105	i40e_debug(hw, mask,
106		   "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
107		   aq_desc->opcode, aq_desc->flags, aq_desc->datalen,
108		   aq_desc->retval);
109	i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
110		   aq_desc->cookie_high, aq_desc->cookie_low);
111	i40e_debug(hw, mask, "\tparam (0,1)  0x%08X 0x%08X\n",
112		   aq_desc->params.internal.param0,
113		   aq_desc->params.internal.param1);
114	i40e_debug(hw, mask, "\taddr (h,l)   0x%08X 0x%08X\n",
115		   aq_desc->params.external.addr_high,
116		   aq_desc->params.external.addr_low);
117
118	if ((buffer != NULL) && (aq_desc->datalen != 0)) {
119		i40e_memset(data, 0, sizeof(data), I40E_NONDMA_MEM);
120		i40e_debug(hw, mask, "AQ CMD Buffer:\n");
121		if (buf_len < len)
122			len = buf_len;
123		for (i = 0; i < len; i++) {
124			data[((i % 16) / 4)] |=
125				((u32)aq_buffer[i]) << (8 * (i % 4));
126			if ((i % 16) == 15) {
127				i40e_debug(hw, mask,
128					   "\t0x%04X  %08X %08X %08X %08X\n",
129					   i - 15, data[0], data[1], data[2],
130					   data[3]);
131				i40e_memset(data, 0, sizeof(data),
132					    I40E_NONDMA_MEM);
133			}
134		}
135		if ((i % 16) != 0)
136			i40e_debug(hw, mask, "\t0x%04X  %08X %08X %08X %08X\n",
137				   i - (i % 16), data[0], data[1], data[2],
138				   data[3]);
139	}
140}
141
142/**
143 * i40e_check_asq_alive
144 * @hw: pointer to the hw struct
145 *
146 * Returns TRUE if Queue is enabled else FALSE.
147 **/
148bool i40e_check_asq_alive(struct i40e_hw *hw)
149{
150	if (hw->aq.asq.len)
151		return !!(rd32(hw, hw->aq.asq.len) & I40E_PF_ATQLEN_ATQENABLE_MASK);
152	else
153		return FALSE;
154}
155
156/**
157 * i40e_aq_queue_shutdown
158 * @hw: pointer to the hw struct
159 * @unloading: is the driver unloading itself
160 *
161 * Tell the Firmware that we're shutting down the AdminQ and whether
162 * or not the driver is unloading as well.
163 **/
164enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
165					     bool unloading)
166{
167	struct i40e_aq_desc desc;
168	struct i40e_aqc_queue_shutdown *cmd =
169		(struct i40e_aqc_queue_shutdown *)&desc.params.raw;
170	enum i40e_status_code status;
171
172	i40e_fill_default_direct_cmd_desc(&desc,
173					  i40e_aqc_opc_queue_shutdown);
174
175	if (unloading)
176		cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING);
177	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
178
179	return status;
180}
181
182/* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
183 * hardware to a bit-field that can be used by SW to more easily determine the
184 * packet type.
185 *
186 * Macros are used to shorten the table lines and make this table human
187 * readable.
188 *
189 * We store the PTYPE in the top byte of the bit field - this is just so that
190 * we can check that the table doesn't have a row missing, as the index into
191 * the table should be the PTYPE.
192 *
193 * Typical work flow:
194 *
195 * IF NOT i40e_ptype_lookup[ptype].known
196 * THEN
197 *      Packet is unknown
198 * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
199 *      Use the rest of the fields to look at the tunnels, inner protocols, etc
200 * ELSE
201 *      Use the enum i40e_rx_l2_ptype to decode the packet type
202 * ENDIF
203 */
204
205/* macro to make the table lines short */
206#define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
207	{	PTYPE, \
208		1, \
209		I40E_RX_PTYPE_OUTER_##OUTER_IP, \
210		I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \
211		I40E_RX_PTYPE_##OUTER_FRAG, \
212		I40E_RX_PTYPE_TUNNEL_##T, \
213		I40E_RX_PTYPE_TUNNEL_END_##TE, \
214		I40E_RX_PTYPE_##TEF, \
215		I40E_RX_PTYPE_INNER_PROT_##I, \
216		I40E_RX_PTYPE_PAYLOAD_LAYER_##PL }
217
218#define I40E_PTT_UNUSED_ENTRY(PTYPE) \
219		{ PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
220
221/* shorter macros makes the table fit but are terse */
222#define I40E_RX_PTYPE_NOF		I40E_RX_PTYPE_NOT_FRAG
223#define I40E_RX_PTYPE_FRG		I40E_RX_PTYPE_FRAG
224#define I40E_RX_PTYPE_INNER_PROT_TS	I40E_RX_PTYPE_INNER_PROT_TIMESYNC
225
226/* Lookup table mapping the HW PTYPE to the bit field for decoding */
227struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
228	/* L2 Packet types */
229	I40E_PTT_UNUSED_ENTRY(0),
230	I40E_PTT(1,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
231	I40E_PTT(2,  L2, NONE, NOF, NONE, NONE, NOF, TS,   PAY2),
232	I40E_PTT(3,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
233	I40E_PTT_UNUSED_ENTRY(4),
234	I40E_PTT_UNUSED_ENTRY(5),
235	I40E_PTT(6,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
236	I40E_PTT(7,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
237	I40E_PTT_UNUSED_ENTRY(8),
238	I40E_PTT_UNUSED_ENTRY(9),
239	I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
240	I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
241	I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
242	I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
243	I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
244	I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
245	I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
246	I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
247	I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
248	I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
249	I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
250	I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
251
252	/* Non Tunneled IPv4 */
253	I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
254	I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
255	I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP,  PAY4),
256	I40E_PTT_UNUSED_ENTRY(25),
257	I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP,  PAY4),
258	I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
259	I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
260
261	/* IPv4 --> IPv4 */
262	I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
263	I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
264	I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP,  PAY4),
265	I40E_PTT_UNUSED_ENTRY(32),
266	I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP,  PAY4),
267	I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
268	I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
269
270	/* IPv4 --> IPv6 */
271	I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
272	I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
273	I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP,  PAY4),
274	I40E_PTT_UNUSED_ENTRY(39),
275	I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP,  PAY4),
276	I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
277	I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
278
279	/* IPv4 --> GRE/NAT */
280	I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
281
282	/* IPv4 --> GRE/NAT --> IPv4 */
283	I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
284	I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
285	I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4),
286	I40E_PTT_UNUSED_ENTRY(47),
287	I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4),
288	I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
289	I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
290
291	/* IPv4 --> GRE/NAT --> IPv6 */
292	I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
293	I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
294	I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4),
295	I40E_PTT_UNUSED_ENTRY(54),
296	I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4),
297	I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
298	I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
299
300	/* IPv4 --> GRE/NAT --> MAC */
301	I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
302
303	/* IPv4 --> GRE/NAT --> MAC --> IPv4 */
304	I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
305	I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
306	I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4),
307	I40E_PTT_UNUSED_ENTRY(62),
308	I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4),
309	I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
310	I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
311
312	/* IPv4 --> GRE/NAT -> MAC --> IPv6 */
313	I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
314	I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
315	I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4),
316	I40E_PTT_UNUSED_ENTRY(69),
317	I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4),
318	I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
319	I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
320
321	/* IPv4 --> GRE/NAT --> MAC/VLAN */
322	I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
323
324	/* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
325	I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
326	I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
327	I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4),
328	I40E_PTT_UNUSED_ENTRY(77),
329	I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4),
330	I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
331	I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
332
333	/* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
334	I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
335	I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
336	I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4),
337	I40E_PTT_UNUSED_ENTRY(84),
338	I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4),
339	I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
340	I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
341
342	/* Non Tunneled IPv6 */
343	I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
344	I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
345	I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP,  PAY3),
346	I40E_PTT_UNUSED_ENTRY(91),
347	I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP,  PAY4),
348	I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
349	I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
350
351	/* IPv6 --> IPv4 */
352	I40E_PTT(95,  IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
353	I40E_PTT(96,  IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
354	I40E_PTT(97,  IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP,  PAY4),
355	I40E_PTT_UNUSED_ENTRY(98),
356	I40E_PTT(99,  IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP,  PAY4),
357	I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
358	I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
359
360	/* IPv6 --> IPv6 */
361	I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
362	I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
363	I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP,  PAY4),
364	I40E_PTT_UNUSED_ENTRY(105),
365	I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP,  PAY4),
366	I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
367	I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
368
369	/* IPv6 --> GRE/NAT */
370	I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
371
372	/* IPv6 --> GRE/NAT -> IPv4 */
373	I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
374	I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
375	I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4),
376	I40E_PTT_UNUSED_ENTRY(113),
377	I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4),
378	I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
379	I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
380
381	/* IPv6 --> GRE/NAT -> IPv6 */
382	I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
383	I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
384	I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4),
385	I40E_PTT_UNUSED_ENTRY(120),
386	I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4),
387	I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
388	I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
389
390	/* IPv6 --> GRE/NAT -> MAC */
391	I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
392
393	/* IPv6 --> GRE/NAT -> MAC -> IPv4 */
394	I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
395	I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
396	I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4),
397	I40E_PTT_UNUSED_ENTRY(128),
398	I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4),
399	I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
400	I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
401
402	/* IPv6 --> GRE/NAT -> MAC -> IPv6 */
403	I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
404	I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
405	I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4),
406	I40E_PTT_UNUSED_ENTRY(135),
407	I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4),
408	I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
409	I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
410
411	/* IPv6 --> GRE/NAT -> MAC/VLAN */
412	I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
413
414	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
415	I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
416	I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
417	I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4),
418	I40E_PTT_UNUSED_ENTRY(143),
419	I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4),
420	I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
421	I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
422
423	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
424	I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
425	I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
426	I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4),
427	I40E_PTT_UNUSED_ENTRY(150),
428	I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4),
429	I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
430	I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
431
432	/* unused entries */
433	I40E_PTT_UNUSED_ENTRY(154),
434	I40E_PTT_UNUSED_ENTRY(155),
435	I40E_PTT_UNUSED_ENTRY(156),
436	I40E_PTT_UNUSED_ENTRY(157),
437	I40E_PTT_UNUSED_ENTRY(158),
438	I40E_PTT_UNUSED_ENTRY(159),
439
440	I40E_PTT_UNUSED_ENTRY(160),
441	I40E_PTT_UNUSED_ENTRY(161),
442	I40E_PTT_UNUSED_ENTRY(162),
443	I40E_PTT_UNUSED_ENTRY(163),
444	I40E_PTT_UNUSED_ENTRY(164),
445	I40E_PTT_UNUSED_ENTRY(165),
446	I40E_PTT_UNUSED_ENTRY(166),
447	I40E_PTT_UNUSED_ENTRY(167),
448	I40E_PTT_UNUSED_ENTRY(168),
449	I40E_PTT_UNUSED_ENTRY(169),
450
451	I40E_PTT_UNUSED_ENTRY(170),
452	I40E_PTT_UNUSED_ENTRY(171),
453	I40E_PTT_UNUSED_ENTRY(172),
454	I40E_PTT_UNUSED_ENTRY(173),
455	I40E_PTT_UNUSED_ENTRY(174),
456	I40E_PTT_UNUSED_ENTRY(175),
457	I40E_PTT_UNUSED_ENTRY(176),
458	I40E_PTT_UNUSED_ENTRY(177),
459	I40E_PTT_UNUSED_ENTRY(178),
460	I40E_PTT_UNUSED_ENTRY(179),
461
462	I40E_PTT_UNUSED_ENTRY(180),
463	I40E_PTT_UNUSED_ENTRY(181),
464	I40E_PTT_UNUSED_ENTRY(182),
465	I40E_PTT_UNUSED_ENTRY(183),
466	I40E_PTT_UNUSED_ENTRY(184),
467	I40E_PTT_UNUSED_ENTRY(185),
468	I40E_PTT_UNUSED_ENTRY(186),
469	I40E_PTT_UNUSED_ENTRY(187),
470	I40E_PTT_UNUSED_ENTRY(188),
471	I40E_PTT_UNUSED_ENTRY(189),
472
473	I40E_PTT_UNUSED_ENTRY(190),
474	I40E_PTT_UNUSED_ENTRY(191),
475	I40E_PTT_UNUSED_ENTRY(192),
476	I40E_PTT_UNUSED_ENTRY(193),
477	I40E_PTT_UNUSED_ENTRY(194),
478	I40E_PTT_UNUSED_ENTRY(195),
479	I40E_PTT_UNUSED_ENTRY(196),
480	I40E_PTT_UNUSED_ENTRY(197),
481	I40E_PTT_UNUSED_ENTRY(198),
482	I40E_PTT_UNUSED_ENTRY(199),
483
484	I40E_PTT_UNUSED_ENTRY(200),
485	I40E_PTT_UNUSED_ENTRY(201),
486	I40E_PTT_UNUSED_ENTRY(202),
487	I40E_PTT_UNUSED_ENTRY(203),
488	I40E_PTT_UNUSED_ENTRY(204),
489	I40E_PTT_UNUSED_ENTRY(205),
490	I40E_PTT_UNUSED_ENTRY(206),
491	I40E_PTT_UNUSED_ENTRY(207),
492	I40E_PTT_UNUSED_ENTRY(208),
493	I40E_PTT_UNUSED_ENTRY(209),
494
495	I40E_PTT_UNUSED_ENTRY(210),
496	I40E_PTT_UNUSED_ENTRY(211),
497	I40E_PTT_UNUSED_ENTRY(212),
498	I40E_PTT_UNUSED_ENTRY(213),
499	I40E_PTT_UNUSED_ENTRY(214),
500	I40E_PTT_UNUSED_ENTRY(215),
501	I40E_PTT_UNUSED_ENTRY(216),
502	I40E_PTT_UNUSED_ENTRY(217),
503	I40E_PTT_UNUSED_ENTRY(218),
504	I40E_PTT_UNUSED_ENTRY(219),
505
506	I40E_PTT_UNUSED_ENTRY(220),
507	I40E_PTT_UNUSED_ENTRY(221),
508	I40E_PTT_UNUSED_ENTRY(222),
509	I40E_PTT_UNUSED_ENTRY(223),
510	I40E_PTT_UNUSED_ENTRY(224),
511	I40E_PTT_UNUSED_ENTRY(225),
512	I40E_PTT_UNUSED_ENTRY(226),
513	I40E_PTT_UNUSED_ENTRY(227),
514	I40E_PTT_UNUSED_ENTRY(228),
515	I40E_PTT_UNUSED_ENTRY(229),
516
517	I40E_PTT_UNUSED_ENTRY(230),
518	I40E_PTT_UNUSED_ENTRY(231),
519	I40E_PTT_UNUSED_ENTRY(232),
520	I40E_PTT_UNUSED_ENTRY(233),
521	I40E_PTT_UNUSED_ENTRY(234),
522	I40E_PTT_UNUSED_ENTRY(235),
523	I40E_PTT_UNUSED_ENTRY(236),
524	I40E_PTT_UNUSED_ENTRY(237),
525	I40E_PTT_UNUSED_ENTRY(238),
526	I40E_PTT_UNUSED_ENTRY(239),
527
528	I40E_PTT_UNUSED_ENTRY(240),
529	I40E_PTT_UNUSED_ENTRY(241),
530	I40E_PTT_UNUSED_ENTRY(242),
531	I40E_PTT_UNUSED_ENTRY(243),
532	I40E_PTT_UNUSED_ENTRY(244),
533	I40E_PTT_UNUSED_ENTRY(245),
534	I40E_PTT_UNUSED_ENTRY(246),
535	I40E_PTT_UNUSED_ENTRY(247),
536	I40E_PTT_UNUSED_ENTRY(248),
537	I40E_PTT_UNUSED_ENTRY(249),
538
539	I40E_PTT_UNUSED_ENTRY(250),
540	I40E_PTT_UNUSED_ENTRY(251),
541	I40E_PTT_UNUSED_ENTRY(252),
542	I40E_PTT_UNUSED_ENTRY(253),
543	I40E_PTT_UNUSED_ENTRY(254),
544	I40E_PTT_UNUSED_ENTRY(255)
545};
546
547
548/**
549 * i40e_init_shared_code - Initialize the shared code
550 * @hw: pointer to hardware structure
551 *
552 * This assigns the MAC type and PHY code and inits the NVM.
553 * Does not touch the hardware. This function must be called prior to any
554 * other function in the shared code. The i40e_hw structure should be
555 * memset to 0 prior to calling this function.  The following fields in
556 * hw structure should be filled in prior to calling this function:
557 * hw_addr, back, device_id, vendor_id, subsystem_device_id,
558 * subsystem_vendor_id, and revision_id
559 **/
560enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
561{
562	enum i40e_status_code status = I40E_SUCCESS;
563	u32 reg;
564
565	DEBUGFUNC("i40e_init_shared_code");
566
567	i40e_set_mac_type(hw);
568
569	switch (hw->mac.type) {
570	case I40E_MAC_XL710:
571		break;
572	default:
573		return I40E_ERR_DEVICE_NOT_SUPPORTED;
574	}
575
576	hw->phy.get_link_info = TRUE;
577
578	/* Determine port number */
579	reg = rd32(hw, I40E_PFGEN_PORTNUM);
580	reg = ((reg & I40E_PFGEN_PORTNUM_PORT_NUM_MASK) >>
581	       I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT);
582	hw->port = (u8)reg;
583
584	/* Determine the PF number based on the PCI fn */
585	reg = rd32(hw, I40E_GLPCI_CAPSUP);
586	if (reg & I40E_GLPCI_CAPSUP_ARI_EN_MASK)
587		hw->pf_id = (u8)((hw->bus.device << 3) | hw->bus.func);
588	else
589		hw->pf_id = (u8)hw->bus.func;
590
591	status = i40e_init_nvm(hw);
592	return status;
593}
594
595/**
596 * i40e_aq_mac_address_read - Retrieve the MAC addresses
597 * @hw: pointer to the hw struct
598 * @flags: a return indicator of what addresses were added to the addr store
599 * @addrs: the requestor's mac addr store
600 * @cmd_details: pointer to command details structure or NULL
601 **/
602static enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw,
603				   u16 *flags,
604				   struct i40e_aqc_mac_address_read_data *addrs,
605				   struct i40e_asq_cmd_details *cmd_details)
606{
607	struct i40e_aq_desc desc;
608	struct i40e_aqc_mac_address_read *cmd_data =
609		(struct i40e_aqc_mac_address_read *)&desc.params.raw;
610	enum i40e_status_code status;
611
612	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
613	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
614
615	status = i40e_asq_send_command(hw, &desc, addrs,
616				       sizeof(*addrs), cmd_details);
617	*flags = LE16_TO_CPU(cmd_data->command_flags);
618
619	return status;
620}
621
622/**
623 * i40e_aq_mac_address_write - Change the MAC addresses
624 * @hw: pointer to the hw struct
625 * @flags: indicates which MAC to be written
626 * @mac_addr: address to write
627 * @cmd_details: pointer to command details structure or NULL
628 **/
629enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
630				    u16 flags, u8 *mac_addr,
631				    struct i40e_asq_cmd_details *cmd_details)
632{
633	struct i40e_aq_desc desc;
634	struct i40e_aqc_mac_address_write *cmd_data =
635		(struct i40e_aqc_mac_address_write *)&desc.params.raw;
636	enum i40e_status_code status;
637
638	i40e_fill_default_direct_cmd_desc(&desc,
639					  i40e_aqc_opc_mac_address_write);
640	cmd_data->command_flags = CPU_TO_LE16(flags);
641	cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]);
642	cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) |
643					((u32)mac_addr[3] << 16) |
644					((u32)mac_addr[4] << 8) |
645					mac_addr[5]);
646
647	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
648
649	return status;
650}
651
652/**
653 * i40e_get_mac_addr - get MAC address
654 * @hw: pointer to the HW structure
655 * @mac_addr: pointer to MAC address
656 *
657 * Reads the adapter's MAC address from register
658 **/
659enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
660{
661	struct i40e_aqc_mac_address_read_data addrs;
662	enum i40e_status_code status;
663	u16 flags = 0;
664
665	status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
666
667	if (flags & I40E_AQC_LAN_ADDR_VALID)
668		memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac));
669
670	return status;
671}
672
673/**
674 * i40e_get_port_mac_addr - get Port MAC address
675 * @hw: pointer to the HW structure
676 * @mac_addr: pointer to Port MAC address
677 *
678 * Reads the adapter's Port MAC address
679 **/
680enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
681{
682	struct i40e_aqc_mac_address_read_data addrs;
683	enum i40e_status_code status;
684	u16 flags = 0;
685
686	status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
687	if (status)
688		return status;
689
690	if (flags & I40E_AQC_PORT_ADDR_VALID)
691		memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac));
692	else
693		status = I40E_ERR_INVALID_MAC_ADDR;
694
695	return status;
696}
697
698/**
699 * i40e_pre_tx_queue_cfg - pre tx queue configure
700 * @hw: pointer to the HW structure
701 * @queue: target pf queue index
702 * @enable: state change request
703 *
704 * Handles hw requirement to indicate intention to enable
705 * or disable target queue.
706 **/
707void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable)
708{
709	u32 abs_queue_idx = hw->func_caps.base_queue + queue;
710	u32 reg_block = 0;
711	u32 reg_val;
712
713	if (abs_queue_idx >= 128) {
714		reg_block = abs_queue_idx / 128;
715		abs_queue_idx %= 128;
716	}
717
718	reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
719	reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
720	reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
721
722	if (enable)
723		reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK;
724	else
725		reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
726
727	wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val);
728}
729
730/**
731 * i40e_validate_mac_addr - Validate unicast MAC address
732 * @mac_addr: pointer to MAC address
733 *
734 * Tests a MAC address to ensure it is a valid Individual Address
735 **/
736enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
737{
738	enum i40e_status_code status = I40E_SUCCESS;
739
740	DEBUGFUNC("i40e_validate_mac_addr");
741
742	/* Broadcast addresses ARE multicast addresses
743	 * Make sure it is not a multicast address
744	 * Reject the zero address
745	 */
746	if (I40E_IS_MULTICAST(mac_addr) ||
747	    (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
748	      mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
749		status = I40E_ERR_INVALID_MAC_ADDR;
750
751	return status;
752}
753
754/**
755 * i40e_get_media_type - Gets media type
756 * @hw: pointer to the hardware structure
757 **/
758static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
759{
760	enum i40e_media_type media;
761
762	switch (hw->phy.link_info.phy_type) {
763	case I40E_PHY_TYPE_10GBASE_SR:
764	case I40E_PHY_TYPE_10GBASE_LR:
765	case I40E_PHY_TYPE_1000BASE_SX:
766	case I40E_PHY_TYPE_1000BASE_LX:
767	case I40E_PHY_TYPE_40GBASE_SR4:
768	case I40E_PHY_TYPE_40GBASE_LR4:
769		media = I40E_MEDIA_TYPE_FIBER;
770		break;
771	case I40E_PHY_TYPE_100BASE_TX:
772	case I40E_PHY_TYPE_1000BASE_T:
773	case I40E_PHY_TYPE_10GBASE_T:
774		media = I40E_MEDIA_TYPE_BASET;
775		break;
776	case I40E_PHY_TYPE_10GBASE_CR1_CU:
777	case I40E_PHY_TYPE_40GBASE_CR4_CU:
778	case I40E_PHY_TYPE_10GBASE_CR1:
779	case I40E_PHY_TYPE_40GBASE_CR4:
780	case I40E_PHY_TYPE_10GBASE_SFPP_CU:
781		media = I40E_MEDIA_TYPE_DA;
782		break;
783	case I40E_PHY_TYPE_1000BASE_KX:
784	case I40E_PHY_TYPE_10GBASE_KX4:
785	case I40E_PHY_TYPE_10GBASE_KR:
786	case I40E_PHY_TYPE_40GBASE_KR4:
787		media = I40E_MEDIA_TYPE_BACKPLANE;
788		break;
789	case I40E_PHY_TYPE_SGMII:
790	case I40E_PHY_TYPE_XAUI:
791	case I40E_PHY_TYPE_XFI:
792	case I40E_PHY_TYPE_XLAUI:
793	case I40E_PHY_TYPE_XLPPI:
794	default:
795		media = I40E_MEDIA_TYPE_UNKNOWN;
796		break;
797	}
798
799	return media;
800}
801
802#define I40E_PF_RESET_WAIT_COUNT	100
803/**
804 * i40e_pf_reset - Reset the PF
805 * @hw: pointer to the hardware structure
806 *
807 * Assuming someone else has triggered a global reset,
808 * assure the global reset is complete and then reset the PF
809 **/
810enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw)
811{
812	u32 cnt = 0;
813	u32 cnt1 = 0;
814	u32 reg = 0;
815	u32 grst_del;
816
817	/* Poll for Global Reset steady state in case of recent GRST.
818	 * The grst delay value is in 100ms units, and we'll wait a
819	 * couple counts longer to be sure we don't just miss the end.
820	 */
821	grst_del = rd32(hw, I40E_GLGEN_RSTCTL) & I40E_GLGEN_RSTCTL_GRSTDEL_MASK
822			>> I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
823	for (cnt = 0; cnt < grst_del + 2; cnt++) {
824		reg = rd32(hw, I40E_GLGEN_RSTAT);
825		if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
826			break;
827		i40e_msec_delay(100);
828	}
829	if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
830		DEBUGOUT("Global reset polling failed to complete.\n");
831		return I40E_ERR_RESET_FAILED;
832	}
833
834	/* Now Wait for the FW to be ready */
835	for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) {
836		reg = rd32(hw, I40E_GLNVM_ULD);
837		reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
838			I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK);
839		if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
840			    I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) {
841			DEBUGOUT1("Core and Global modules ready %d\n", cnt1);
842			break;
843		}
844		i40e_msec_delay(10);
845	}
846	if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
847		     I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) {
848		DEBUGOUT("wait for FW Reset complete timedout\n");
849		DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg);
850		return I40E_ERR_RESET_FAILED;
851	}
852
853	/* If there was a Global Reset in progress when we got here,
854	 * we don't need to do the PF Reset
855	 */
856	if (!cnt) {
857		reg = rd32(hw, I40E_PFGEN_CTRL);
858		wr32(hw, I40E_PFGEN_CTRL,
859		     (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
860		for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) {
861			reg = rd32(hw, I40E_PFGEN_CTRL);
862			if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
863				break;
864			i40e_msec_delay(1);
865		}
866		if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
867			DEBUGOUT("PF reset polling failed to complete.\n");
868			return I40E_ERR_RESET_FAILED;
869		}
870	}
871
872	i40e_clear_pxe_mode(hw);
873
874
875	return I40E_SUCCESS;
876}
877
878/**
879 * i40e_clear_hw - clear out any left over hw state
880 * @hw: pointer to the hw struct
881 *
882 * Clear queues and interrupts, typically called at init time,
883 * but after the capabilities have been found so we know how many
884 * queues and msix vectors have been allocated.
885 **/
886void i40e_clear_hw(struct i40e_hw *hw)
887{
888	u32 num_queues, base_queue;
889	u32 num_pf_int;
890	u32 num_vf_int;
891	u32 num_vfs;
892	u32 i, j;
893	u32 val;
894	u32 eol = 0x7ff;
895
896	/* get number of interrupts, queues, and vfs */
897	val = rd32(hw, I40E_GLPCI_CNF2);
898	num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >>
899			I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT;
900	num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >>
901			I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT;
902
903	val = rd32(hw, I40E_PFLAN_QALLOC);
904	base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >>
905			I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
906	j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
907			I40E_PFLAN_QALLOC_LASTQ_SHIFT;
908	if (val & I40E_PFLAN_QALLOC_VALID_MASK)
909		num_queues = (j - base_queue) + 1;
910	else
911		num_queues = 0;
912
913	val = rd32(hw, I40E_PF_VT_PFALLOC);
914	i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >>
915			I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
916	j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
917			I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
918	if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
919		num_vfs = (j - i) + 1;
920	else
921		num_vfs = 0;
922
923	/* stop all the interrupts */
924	wr32(hw, I40E_PFINT_ICR0_ENA, 0);
925	val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
926	for (i = 0; i < num_pf_int - 2; i++)
927		wr32(hw, I40E_PFINT_DYN_CTLN(i), val);
928
929	/* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
930	val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT;
931	wr32(hw, I40E_PFINT_LNKLST0, val);
932	for (i = 0; i < num_pf_int - 2; i++)
933		wr32(hw, I40E_PFINT_LNKLSTN(i), val);
934	val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT;
935	for (i = 0; i < num_vfs; i++)
936		wr32(hw, I40E_VPINT_LNKLST0(i), val);
937	for (i = 0; i < num_vf_int - 2; i++)
938		wr32(hw, I40E_VPINT_LNKLSTN(i), val);
939
940	/* warn the HW of the coming Tx disables */
941	for (i = 0; i < num_queues; i++) {
942		u32 abs_queue_idx = base_queue + i;
943		u32 reg_block = 0;
944
945		if (abs_queue_idx >= 128) {
946			reg_block = abs_queue_idx / 128;
947			abs_queue_idx %= 128;
948		}
949
950		val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
951		val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
952		val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
953		val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
954
955		wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val);
956	}
957	i40e_usec_delay(400);
958
959	/* stop all the queues */
960	for (i = 0; i < num_queues; i++) {
961		wr32(hw, I40E_QINT_TQCTL(i), 0);
962		wr32(hw, I40E_QTX_ENA(i), 0);
963		wr32(hw, I40E_QINT_RQCTL(i), 0);
964		wr32(hw, I40E_QRX_ENA(i), 0);
965	}
966
967	/* short wait for all queue disables to settle */
968	i40e_usec_delay(50);
969}
970
971/**
972 * i40e_clear_pxe_mode - clear pxe operations mode
973 * @hw: pointer to the hw struct
974 *
975 * Make sure all PXE mode settings are cleared, including things
976 * like descriptor fetch/write-back mode.
977 **/
978void i40e_clear_pxe_mode(struct i40e_hw *hw)
979{
980	if (i40e_check_asq_alive(hw))
981		i40e_aq_clear_pxe_mode(hw, NULL);
982}
983
984/**
985 * i40e_led_is_mine - helper to find matching led
986 * @hw: pointer to the hw struct
987 * @idx: index into GPIO registers
988 *
989 * returns: 0 if no match, otherwise the value of the GPIO_CTL register
990 */
991static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx)
992{
993	u32 gpio_val = 0;
994	u32 port;
995
996	if (!hw->func_caps.led[idx])
997		return 0;
998
999	gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx));
1000	port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >>
1001		I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
1002
1003	/* if PRT_NUM_NA is 1 then this LED is not port specific, OR
1004	 * if it is not our port then ignore
1005	 */
1006	if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) ||
1007	    (port != hw->port))
1008		return 0;
1009
1010	return gpio_val;
1011}
1012
1013#define I40E_LED0 22
1014#define I40E_LINK_ACTIVITY 0xC
1015
1016/**
1017 * i40e_led_get - return current on/off mode
1018 * @hw: pointer to the hw struct
1019 *
1020 * The value returned is the 'mode' field as defined in the
1021 * GPIO register definitions: 0x0 = off, 0xf = on, and other
1022 * values are variations of possible behaviors relating to
1023 * blink, link, and wire.
1024 **/
1025u32 i40e_led_get(struct i40e_hw *hw)
1026{
1027	u32 mode = 0;
1028	int i;
1029
1030	/* as per the documentation GPIO 22-29 are the LED
1031	 * GPIO pins named LED0..LED7
1032	 */
1033	for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1034		u32 gpio_val = i40e_led_is_mine(hw, i);
1035
1036		if (!gpio_val)
1037			continue;
1038
1039		mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1040			I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT;
1041		break;
1042	}
1043
1044	return mode;
1045}
1046
1047/**
1048 * i40e_led_set - set new on/off mode
1049 * @hw: pointer to the hw struct
1050 * @mode: 0=off, 0xf=on (else see manual for mode details)
1051 * @blink: TRUE if the LED should blink when on, FALSE if steady
1052 *
1053 * if this function is used to turn on the blink it should
1054 * be used to disable the blink when restoring the original state.
1055 **/
1056void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink)
1057{
1058	int i;
1059
1060	if (mode & 0xfffffff0)
1061		DEBUGOUT1("invalid mode passed in %X\n", mode);
1062
1063	/* as per the documentation GPIO 22-29 are the LED
1064	 * GPIO pins named LED0..LED7
1065	 */
1066	for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1067		u32 gpio_val = i40e_led_is_mine(hw, i);
1068
1069		if (!gpio_val)
1070			continue;
1071
1072		gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
1073		/* this & is a bit of paranoia, but serves as a range check */
1074		gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
1075			     I40E_GLGEN_GPIO_CTL_LED_MODE_MASK);
1076
1077		if (mode == I40E_LINK_ACTIVITY)
1078			blink = FALSE;
1079
1080		gpio_val |= (blink ? 1 : 0) <<
1081			    I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT;
1082
1083		wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
1084		break;
1085	}
1086}
1087
1088/* Admin command wrappers */
1089
1090/**
1091 * i40e_aq_get_phy_capabilities
1092 * @hw: pointer to the hw struct
1093 * @abilities: structure for PHY capabilities to be filled
1094 * @qualified_modules: report Qualified Modules
1095 * @report_init: report init capabilities (active are default)
1096 * @cmd_details: pointer to command details structure or NULL
1097 *
1098 * Returns the various PHY abilities supported on the Port.
1099 **/
1100enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
1101			bool qualified_modules, bool report_init,
1102			struct i40e_aq_get_phy_abilities_resp *abilities,
1103			struct i40e_asq_cmd_details *cmd_details)
1104{
1105	struct i40e_aq_desc desc;
1106	enum i40e_status_code status;
1107	u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
1108
1109	if (!abilities)
1110		return I40E_ERR_PARAM;
1111
1112	i40e_fill_default_direct_cmd_desc(&desc,
1113					  i40e_aqc_opc_get_phy_abilities);
1114
1115	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1116	if (abilities_size > I40E_AQ_LARGE_BUF)
1117		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1118
1119	if (qualified_modules)
1120		desc.params.external.param0 |=
1121			CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
1122
1123	if (report_init)
1124		desc.params.external.param0 |=
1125			CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
1126
1127	status = i40e_asq_send_command(hw, &desc, abilities, abilities_size,
1128				    cmd_details);
1129
1130	if (hw->aq.asq_last_status == I40E_AQ_RC_EIO)
1131		status = I40E_ERR_UNKNOWN_PHY;
1132
1133	return status;
1134}
1135
1136/**
1137 * i40e_aq_set_phy_config
1138 * @hw: pointer to the hw struct
1139 * @config: structure with PHY configuration to be set
1140 * @cmd_details: pointer to command details structure or NULL
1141 *
1142 * Set the various PHY configuration parameters
1143 * supported on the Port.One or more of the Set PHY config parameters may be
1144 * ignored in an MFP mode as the PF may not have the privilege to set some
1145 * of the PHY Config parameters. This status will be indicated by the
1146 * command response.
1147 **/
1148enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
1149				struct i40e_aq_set_phy_config *config,
1150				struct i40e_asq_cmd_details *cmd_details)
1151{
1152	struct i40e_aq_desc desc;
1153	struct i40e_aq_set_phy_config *cmd =
1154		(struct i40e_aq_set_phy_config *)&desc.params.raw;
1155	enum i40e_status_code status;
1156
1157	if (!config)
1158		return I40E_ERR_PARAM;
1159
1160	i40e_fill_default_direct_cmd_desc(&desc,
1161					  i40e_aqc_opc_set_phy_config);
1162
1163	*cmd = *config;
1164
1165	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1166
1167	return status;
1168}
1169
1170/**
1171 * i40e_set_fc
1172 * @hw: pointer to the hw struct
1173 *
1174 * Set the requested flow control mode using set_phy_config.
1175 **/
1176enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
1177				  bool atomic_restart)
1178{
1179	enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
1180	struct i40e_aq_get_phy_abilities_resp abilities;
1181	struct i40e_aq_set_phy_config config;
1182	enum i40e_status_code status;
1183	u8 pause_mask = 0x0;
1184
1185	*aq_failures = 0x0;
1186
1187	switch (fc_mode) {
1188	case I40E_FC_FULL:
1189		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1190		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1191		break;
1192	case I40E_FC_RX_PAUSE:
1193		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1194		break;
1195	case I40E_FC_TX_PAUSE:
1196		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1197		break;
1198	default:
1199		break;
1200	}
1201
1202	/* Get the current phy config */
1203	status = i40e_aq_get_phy_capabilities(hw, FALSE, false, &abilities,
1204					      NULL);
1205	if (status) {
1206		*aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
1207		return status;
1208	}
1209
1210	memset(&config, 0, sizeof(struct i40e_aq_set_phy_config));
1211	/* clear the old pause settings */
1212	config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
1213			   ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
1214	/* set the new abilities */
1215	config.abilities |= pause_mask;
1216	/* If the abilities have changed, then set the new config */
1217	if (config.abilities != abilities.abilities) {
1218		/* Auto restart link so settings take effect */
1219		if (atomic_restart)
1220			config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
1221		/* Copy over all the old settings */
1222		config.phy_type = abilities.phy_type;
1223		config.link_speed = abilities.link_speed;
1224		config.eee_capability = abilities.eee_capability;
1225		config.eeer = abilities.eeer_val;
1226		config.low_power_ctrl = abilities.d3_lpan;
1227		status = i40e_aq_set_phy_config(hw, &config, NULL);
1228
1229		if (status)
1230			*aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
1231	}
1232	/* Update the link info */
1233	status = i40e_update_link_info(hw, TRUE);
1234	if (status) {
1235		/* Wait a little bit (on 40G cards it sometimes takes a really
1236		 * long time for link to come back from the atomic reset)
1237		 * and try once more
1238		 */
1239		i40e_msec_delay(1000);
1240		status = i40e_update_link_info(hw, TRUE);
1241	}
1242	if (status)
1243		*aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
1244
1245	return status;
1246}
1247
1248/**
1249 * i40e_aq_set_mac_config
1250 * @hw: pointer to the hw struct
1251 * @max_frame_size: Maximum Frame Size to be supported by the port
1252 * @crc_en: Tell HW to append a CRC to outgoing frames
1253 * @pacing: Pacing configurations
1254 * @cmd_details: pointer to command details structure or NULL
1255 *
1256 * Configure MAC settings for frame size, jumbo frame support and the
1257 * addition of a CRC by the hardware.
1258 **/
1259enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
1260				u16 max_frame_size,
1261				bool crc_en, u16 pacing,
1262				struct i40e_asq_cmd_details *cmd_details)
1263{
1264	struct i40e_aq_desc desc;
1265	struct i40e_aq_set_mac_config *cmd =
1266		(struct i40e_aq_set_mac_config *)&desc.params.raw;
1267	enum i40e_status_code status;
1268
1269	if (max_frame_size == 0)
1270		return I40E_ERR_PARAM;
1271
1272	i40e_fill_default_direct_cmd_desc(&desc,
1273					  i40e_aqc_opc_set_mac_config);
1274
1275	cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
1276	cmd->params = ((u8)pacing & 0x0F) << 3;
1277	if (crc_en)
1278		cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
1279
1280	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1281
1282	return status;
1283}
1284
1285/**
1286 * i40e_aq_clear_pxe_mode
1287 * @hw: pointer to the hw struct
1288 * @cmd_details: pointer to command details structure or NULL
1289 *
1290 * Tell the firmware that the driver is taking over from PXE
1291 **/
1292enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
1293			struct i40e_asq_cmd_details *cmd_details)
1294{
1295	enum i40e_status_code status;
1296	struct i40e_aq_desc desc;
1297	struct i40e_aqc_clear_pxe *cmd =
1298		(struct i40e_aqc_clear_pxe *)&desc.params.raw;
1299
1300	i40e_fill_default_direct_cmd_desc(&desc,
1301					  i40e_aqc_opc_clear_pxe_mode);
1302
1303	cmd->rx_cnt = 0x2;
1304
1305	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1306
1307	wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
1308
1309	return status;
1310}
1311
1312/**
1313 * i40e_aq_set_link_restart_an
1314 * @hw: pointer to the hw struct
1315 * @enable_link: if TRUE: enable link, if FALSE: disable link
1316 * @cmd_details: pointer to command details structure or NULL
1317 *
1318 * Sets up the link and restarts the Auto-Negotiation over the link.
1319 **/
1320enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
1321		bool enable_link, struct i40e_asq_cmd_details *cmd_details)
1322{
1323	struct i40e_aq_desc desc;
1324	struct i40e_aqc_set_link_restart_an *cmd =
1325		(struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
1326	enum i40e_status_code status;
1327
1328	i40e_fill_default_direct_cmd_desc(&desc,
1329					  i40e_aqc_opc_set_link_restart_an);
1330
1331	cmd->command = I40E_AQ_PHY_RESTART_AN;
1332	if (enable_link)
1333		cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
1334	else
1335		cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
1336
1337	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1338
1339	return status;
1340}
1341
1342/**
1343 * i40e_aq_get_link_info
1344 * @hw: pointer to the hw struct
1345 * @enable_lse: enable/disable LinkStatusEvent reporting
1346 * @link: pointer to link status structure - optional
1347 * @cmd_details: pointer to command details structure or NULL
1348 *
1349 * Returns the link status of the adapter.
1350 **/
1351enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
1352				bool enable_lse, struct i40e_link_status *link,
1353				struct i40e_asq_cmd_details *cmd_details)
1354{
1355	struct i40e_aq_desc desc;
1356	struct i40e_aqc_get_link_status *resp =
1357		(struct i40e_aqc_get_link_status *)&desc.params.raw;
1358	struct i40e_link_status *hw_link_info = &hw->phy.link_info;
1359	enum i40e_status_code status;
1360	bool tx_pause, rx_pause;
1361	u16 command_flags;
1362
1363	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
1364
1365	if (enable_lse)
1366		command_flags = I40E_AQ_LSE_ENABLE;
1367	else
1368		command_flags = I40E_AQ_LSE_DISABLE;
1369	resp->command_flags = CPU_TO_LE16(command_flags);
1370
1371	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1372
1373	if (status != I40E_SUCCESS)
1374		goto aq_get_link_info_exit;
1375
1376	/* save off old link status information */
1377	i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
1378		    sizeof(struct i40e_link_status), I40E_NONDMA_TO_NONDMA);
1379
1380	/* update link status */
1381	hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
1382	hw->phy.media_type = i40e_get_media_type(hw);
1383	hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
1384	hw_link_info->link_info = resp->link_info;
1385	hw_link_info->an_info = resp->an_info;
1386	hw_link_info->ext_info = resp->ext_info;
1387	hw_link_info->loopback = resp->loopback;
1388	hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
1389	hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
1390
1391	/* update fc info */
1392	tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
1393	rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
1394	if (tx_pause & rx_pause)
1395		hw->fc.current_mode = I40E_FC_FULL;
1396	else if (tx_pause)
1397		hw->fc.current_mode = I40E_FC_TX_PAUSE;
1398	else if (rx_pause)
1399		hw->fc.current_mode = I40E_FC_RX_PAUSE;
1400	else
1401		hw->fc.current_mode = I40E_FC_NONE;
1402
1403	if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
1404		hw_link_info->crc_enable = TRUE;
1405	else
1406		hw_link_info->crc_enable = FALSE;
1407
1408	if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_ENABLE))
1409		hw_link_info->lse_enable = TRUE;
1410	else
1411		hw_link_info->lse_enable = FALSE;
1412
1413	/* save link status information */
1414	if (link)
1415		i40e_memcpy(link, hw_link_info, sizeof(struct i40e_link_status),
1416			    I40E_NONDMA_TO_NONDMA);
1417
1418	/* flag cleared so helper functions don't call AQ again */
1419	hw->phy.get_link_info = FALSE;
1420
1421aq_get_link_info_exit:
1422	return status;
1423}
1424
1425/**
1426 * i40e_update_link_info
1427 * @hw: pointer to the hw struct
1428 * @enable_lse: enable/disable LinkStatusEvent reporting
1429 *
1430 * Returns the link status of the adapter
1431 **/
1432enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw,
1433					     bool enable_lse)
1434{
1435	struct i40e_aq_get_phy_abilities_resp abilities;
1436	enum i40e_status_code status;
1437
1438	status = i40e_aq_get_link_info(hw, enable_lse, NULL, NULL);
1439	if (status)
1440		return status;
1441
1442	status = i40e_aq_get_phy_capabilities(hw, FALSE, false,
1443					      &abilities, NULL);
1444	if (status)
1445		return status;
1446
1447	if (abilities.abilities & I40E_AQ_PHY_AN_ENABLED)
1448		hw->phy.link_info.an_enabled = TRUE;
1449	else
1450		hw->phy.link_info.an_enabled = FALSE;
1451
1452	return status;
1453}
1454
1455/**
1456 * i40e_aq_set_phy_int_mask
1457 * @hw: pointer to the hw struct
1458 * @mask: interrupt mask to be set
1459 * @cmd_details: pointer to command details structure or NULL
1460 *
1461 * Set link interrupt mask.
1462 **/
1463enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
1464				u16 mask,
1465				struct i40e_asq_cmd_details *cmd_details)
1466{
1467	struct i40e_aq_desc desc;
1468	struct i40e_aqc_set_phy_int_mask *cmd =
1469		(struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
1470	enum i40e_status_code status;
1471
1472	i40e_fill_default_direct_cmd_desc(&desc,
1473					  i40e_aqc_opc_set_phy_int_mask);
1474
1475	cmd->event_mask = CPU_TO_LE16(mask);
1476
1477	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1478
1479	return status;
1480}
1481
1482/**
1483 * i40e_aq_get_local_advt_reg
1484 * @hw: pointer to the hw struct
1485 * @advt_reg: local AN advertisement register value
1486 * @cmd_details: pointer to command details structure or NULL
1487 *
1488 * Get the Local AN advertisement register value.
1489 **/
1490enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
1491				u64 *advt_reg,
1492				struct i40e_asq_cmd_details *cmd_details)
1493{
1494	struct i40e_aq_desc desc;
1495	struct i40e_aqc_an_advt_reg *resp =
1496		(struct i40e_aqc_an_advt_reg *)&desc.params.raw;
1497	enum i40e_status_code status;
1498
1499	i40e_fill_default_direct_cmd_desc(&desc,
1500					  i40e_aqc_opc_get_local_advt_reg);
1501
1502	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1503
1504	if (status != I40E_SUCCESS)
1505		goto aq_get_local_advt_reg_exit;
1506
1507	*advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
1508	*advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
1509
1510aq_get_local_advt_reg_exit:
1511	return status;
1512}
1513
1514/**
1515 * i40e_aq_set_local_advt_reg
1516 * @hw: pointer to the hw struct
1517 * @advt_reg: local AN advertisement register value
1518 * @cmd_details: pointer to command details structure or NULL
1519 *
1520 * Get the Local AN advertisement register value.
1521 **/
1522enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
1523				u64 advt_reg,
1524				struct i40e_asq_cmd_details *cmd_details)
1525{
1526	struct i40e_aq_desc desc;
1527	struct i40e_aqc_an_advt_reg *cmd =
1528		(struct i40e_aqc_an_advt_reg *)&desc.params.raw;
1529	enum i40e_status_code status;
1530
1531	i40e_fill_default_direct_cmd_desc(&desc,
1532					  i40e_aqc_opc_get_local_advt_reg);
1533
1534	cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
1535	cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
1536
1537	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1538
1539	return status;
1540}
1541
1542/**
1543 * i40e_aq_get_partner_advt
1544 * @hw: pointer to the hw struct
1545 * @advt_reg: AN partner advertisement register value
1546 * @cmd_details: pointer to command details structure or NULL
1547 *
1548 * Get the link partner AN advertisement register value.
1549 **/
1550enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
1551				u64 *advt_reg,
1552				struct i40e_asq_cmd_details *cmd_details)
1553{
1554	struct i40e_aq_desc desc;
1555	struct i40e_aqc_an_advt_reg *resp =
1556		(struct i40e_aqc_an_advt_reg *)&desc.params.raw;
1557	enum i40e_status_code status;
1558
1559	i40e_fill_default_direct_cmd_desc(&desc,
1560					  i40e_aqc_opc_get_partner_advt);
1561
1562	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1563
1564	if (status != I40E_SUCCESS)
1565		goto aq_get_partner_advt_exit;
1566
1567	*advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
1568	*advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
1569
1570aq_get_partner_advt_exit:
1571	return status;
1572}
1573
1574/**
1575 * i40e_aq_set_lb_modes
1576 * @hw: pointer to the hw struct
1577 * @lb_modes: loopback mode to be set
1578 * @cmd_details: pointer to command details structure or NULL
1579 *
1580 * Sets loopback modes.
1581 **/
1582enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
1583				u16 lb_modes,
1584				struct i40e_asq_cmd_details *cmd_details)
1585{
1586	struct i40e_aq_desc desc;
1587	struct i40e_aqc_set_lb_mode *cmd =
1588		(struct i40e_aqc_set_lb_mode *)&desc.params.raw;
1589	enum i40e_status_code status;
1590
1591	i40e_fill_default_direct_cmd_desc(&desc,
1592					  i40e_aqc_opc_set_lb_modes);
1593
1594	cmd->lb_mode = CPU_TO_LE16(lb_modes);
1595
1596	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1597
1598	return status;
1599}
1600
1601/**
1602 * i40e_aq_set_phy_debug
1603 * @hw: pointer to the hw struct
1604 * @cmd_flags: debug command flags
1605 * @cmd_details: pointer to command details structure or NULL
1606 *
1607 * Reset the external PHY.
1608 **/
1609enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
1610				struct i40e_asq_cmd_details *cmd_details)
1611{
1612	struct i40e_aq_desc desc;
1613	struct i40e_aqc_set_phy_debug *cmd =
1614		(struct i40e_aqc_set_phy_debug *)&desc.params.raw;
1615	enum i40e_status_code status;
1616
1617	i40e_fill_default_direct_cmd_desc(&desc,
1618					  i40e_aqc_opc_set_phy_debug);
1619
1620	cmd->command_flags = cmd_flags;
1621
1622	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1623
1624	return status;
1625}
1626
1627/**
1628 * i40e_aq_add_vsi
1629 * @hw: pointer to the hw struct
1630 * @vsi_ctx: pointer to a vsi context struct
1631 * @cmd_details: pointer to command details structure or NULL
1632 *
1633 * Add a VSI context to the hardware.
1634**/
1635enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
1636				struct i40e_vsi_context *vsi_ctx,
1637				struct i40e_asq_cmd_details *cmd_details)
1638{
1639	struct i40e_aq_desc desc;
1640	struct i40e_aqc_add_get_update_vsi *cmd =
1641		(struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
1642	struct i40e_aqc_add_get_update_vsi_completion *resp =
1643		(struct i40e_aqc_add_get_update_vsi_completion *)
1644		&desc.params.raw;
1645	enum i40e_status_code status;
1646
1647	i40e_fill_default_direct_cmd_desc(&desc,
1648					  i40e_aqc_opc_add_vsi);
1649
1650	cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
1651	cmd->connection_type = vsi_ctx->connection_type;
1652	cmd->vf_id = vsi_ctx->vf_num;
1653	cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
1654
1655	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
1656
1657	status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
1658				    sizeof(vsi_ctx->info), cmd_details);
1659
1660	if (status != I40E_SUCCESS)
1661		goto aq_add_vsi_exit;
1662
1663	vsi_ctx->seid = LE16_TO_CPU(resp->seid);
1664	vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
1665	vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
1666	vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
1667
1668aq_add_vsi_exit:
1669	return status;
1670}
1671
1672/**
1673 * i40e_aq_set_default_vsi
1674 * @hw: pointer to the hw struct
1675 * @seid: vsi number
1676 * @cmd_details: pointer to command details structure or NULL
1677 **/
1678enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
1679				u16 seid,
1680				struct i40e_asq_cmd_details *cmd_details)
1681{
1682	struct i40e_aq_desc desc;
1683	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
1684		(struct i40e_aqc_set_vsi_promiscuous_modes *)
1685		&desc.params.raw;
1686	enum i40e_status_code status;
1687
1688	i40e_fill_default_direct_cmd_desc(&desc,
1689					i40e_aqc_opc_set_vsi_promiscuous_modes);
1690
1691	cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
1692	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
1693	cmd->seid = CPU_TO_LE16(seid);
1694
1695	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1696
1697	return status;
1698}
1699
1700/**
1701 * i40e_aq_set_vsi_unicast_promiscuous
1702 * @hw: pointer to the hw struct
1703 * @seid: vsi number
1704 * @set: set unicast promiscuous enable/disable
1705 * @cmd_details: pointer to command details structure or NULL
1706 **/
1707enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
1708				u16 seid, bool set,
1709				struct i40e_asq_cmd_details *cmd_details)
1710{
1711	struct i40e_aq_desc desc;
1712	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
1713		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
1714	enum i40e_status_code status;
1715	u16 flags = 0;
1716
1717	i40e_fill_default_direct_cmd_desc(&desc,
1718					i40e_aqc_opc_set_vsi_promiscuous_modes);
1719
1720	if (set)
1721		flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
1722
1723	cmd->promiscuous_flags = CPU_TO_LE16(flags);
1724
1725	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
1726
1727	cmd->seid = CPU_TO_LE16(seid);
1728	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1729
1730	return status;
1731}
1732
1733/**
1734 * i40e_aq_set_vsi_multicast_promiscuous
1735 * @hw: pointer to the hw struct
1736 * @seid: vsi number
1737 * @set: set multicast promiscuous enable/disable
1738 * @cmd_details: pointer to command details structure or NULL
1739 **/
1740enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
1741				u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
1742{
1743	struct i40e_aq_desc desc;
1744	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
1745		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
1746	enum i40e_status_code status;
1747	u16 flags = 0;
1748
1749	i40e_fill_default_direct_cmd_desc(&desc,
1750					i40e_aqc_opc_set_vsi_promiscuous_modes);
1751
1752	if (set)
1753		flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
1754
1755	cmd->promiscuous_flags = CPU_TO_LE16(flags);
1756
1757	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
1758
1759	cmd->seid = CPU_TO_LE16(seid);
1760	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1761
1762	return status;
1763}
1764
1765/**
1766 * i40e_aq_set_vsi_broadcast
1767 * @hw: pointer to the hw struct
1768 * @seid: vsi number
1769 * @set_filter: TRUE to set filter, FALSE to clear filter
1770 * @cmd_details: pointer to command details structure or NULL
1771 *
1772 * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
1773 **/
1774enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
1775				u16 seid, bool set_filter,
1776				struct i40e_asq_cmd_details *cmd_details)
1777{
1778	struct i40e_aq_desc desc;
1779	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
1780		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
1781	enum i40e_status_code status;
1782
1783	i40e_fill_default_direct_cmd_desc(&desc,
1784					i40e_aqc_opc_set_vsi_promiscuous_modes);
1785
1786	if (set_filter)
1787		cmd->promiscuous_flags
1788			    |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
1789	else
1790		cmd->promiscuous_flags
1791			    &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
1792
1793	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
1794	cmd->seid = CPU_TO_LE16(seid);
1795	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1796
1797	return status;
1798}
1799
1800/**
1801 * i40e_get_vsi_params - get VSI configuration info
1802 * @hw: pointer to the hw struct
1803 * @vsi_ctx: pointer to a vsi context struct
1804 * @cmd_details: pointer to command details structure or NULL
1805 **/
1806enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
1807				struct i40e_vsi_context *vsi_ctx,
1808				struct i40e_asq_cmd_details *cmd_details)
1809{
1810	struct i40e_aq_desc desc;
1811	struct i40e_aqc_add_get_update_vsi *cmd =
1812		(struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
1813	struct i40e_aqc_add_get_update_vsi_completion *resp =
1814		(struct i40e_aqc_add_get_update_vsi_completion *)
1815		&desc.params.raw;
1816	enum i40e_status_code status;
1817
1818	i40e_fill_default_direct_cmd_desc(&desc,
1819					  i40e_aqc_opc_get_vsi_parameters);
1820
1821	cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
1822
1823	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1824
1825	status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
1826				    sizeof(vsi_ctx->info), NULL);
1827
1828	if (status != I40E_SUCCESS)
1829		goto aq_get_vsi_params_exit;
1830
1831	vsi_ctx->seid = LE16_TO_CPU(resp->seid);
1832	vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
1833	vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
1834	vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
1835
1836aq_get_vsi_params_exit:
1837	return status;
1838}
1839
1840/**
1841 * i40e_aq_update_vsi_params
1842 * @hw: pointer to the hw struct
1843 * @vsi_ctx: pointer to a vsi context struct
1844 * @cmd_details: pointer to command details structure or NULL
1845 *
1846 * Update a VSI context.
1847 **/
1848enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
1849				struct i40e_vsi_context *vsi_ctx,
1850				struct i40e_asq_cmd_details *cmd_details)
1851{
1852	struct i40e_aq_desc desc;
1853	struct i40e_aqc_add_get_update_vsi *cmd =
1854		(struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
1855	enum i40e_status_code status;
1856
1857	i40e_fill_default_direct_cmd_desc(&desc,
1858					  i40e_aqc_opc_update_vsi_parameters);
1859	cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
1860
1861	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
1862
1863	status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
1864				    sizeof(vsi_ctx->info), cmd_details);
1865
1866	return status;
1867}
1868
1869/**
1870 * i40e_aq_get_switch_config
1871 * @hw: pointer to the hardware structure
1872 * @buf: pointer to the result buffer
1873 * @buf_size: length of input buffer
1874 * @start_seid: seid to start for the report, 0 == beginning
1875 * @cmd_details: pointer to command details structure or NULL
1876 *
1877 * Fill the buf with switch configuration returned from AdminQ command
1878 **/
1879enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
1880				struct i40e_aqc_get_switch_config_resp *buf,
1881				u16 buf_size, u16 *start_seid,
1882				struct i40e_asq_cmd_details *cmd_details)
1883{
1884	struct i40e_aq_desc desc;
1885	struct i40e_aqc_switch_seid *scfg =
1886		(struct i40e_aqc_switch_seid *)&desc.params.raw;
1887	enum i40e_status_code status;
1888
1889	i40e_fill_default_direct_cmd_desc(&desc,
1890					  i40e_aqc_opc_get_switch_config);
1891	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1892	if (buf_size > I40E_AQ_LARGE_BUF)
1893		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1894	scfg->seid = CPU_TO_LE16(*start_seid);
1895
1896	status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
1897	*start_seid = LE16_TO_CPU(scfg->seid);
1898
1899	return status;
1900}
1901
1902/**
1903 * i40e_aq_get_firmware_version
1904 * @hw: pointer to the hw struct
1905 * @fw_major_version: firmware major version
1906 * @fw_minor_version: firmware minor version
1907 * @api_major_version: major queue version
1908 * @api_minor_version: minor queue version
1909 * @cmd_details: pointer to command details structure or NULL
1910 *
1911 * Get the firmware version from the admin queue commands
1912 **/
1913enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
1914				u16 *fw_major_version, u16 *fw_minor_version,
1915				u16 *api_major_version, u16 *api_minor_version,
1916				struct i40e_asq_cmd_details *cmd_details)
1917{
1918	struct i40e_aq_desc desc;
1919	struct i40e_aqc_get_version *resp =
1920		(struct i40e_aqc_get_version *)&desc.params.raw;
1921	enum i40e_status_code status;
1922
1923	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
1924
1925	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1926
1927	if (status == I40E_SUCCESS) {
1928		if (fw_major_version != NULL)
1929			*fw_major_version = LE16_TO_CPU(resp->fw_major);
1930		if (fw_minor_version != NULL)
1931			*fw_minor_version = LE16_TO_CPU(resp->fw_minor);
1932		if (api_major_version != NULL)
1933			*api_major_version = LE16_TO_CPU(resp->api_major);
1934		if (api_minor_version != NULL)
1935			*api_minor_version = LE16_TO_CPU(resp->api_minor);
1936
1937		/* A workaround to fix the API version in SW */
1938		if (api_major_version && api_minor_version &&
1939		    fw_major_version && fw_minor_version &&
1940		    ((*api_major_version == 1) && (*api_minor_version == 1)) &&
1941		    (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
1942		     (*fw_major_version > 4)))
1943			*api_minor_version = 2;
1944	}
1945
1946	return status;
1947}
1948
1949/**
1950 * i40e_aq_send_driver_version
1951 * @hw: pointer to the hw struct
1952 * @dv: driver's major, minor version
1953 * @cmd_details: pointer to command details structure or NULL
1954 *
1955 * Send the driver version to the firmware
1956 **/
1957enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
1958				struct i40e_driver_version *dv,
1959				struct i40e_asq_cmd_details *cmd_details)
1960{
1961	struct i40e_aq_desc desc;
1962	struct i40e_aqc_driver_version *cmd =
1963		(struct i40e_aqc_driver_version *)&desc.params.raw;
1964	enum i40e_status_code status;
1965	u16 len;
1966
1967	if (dv == NULL)
1968		return I40E_ERR_PARAM;
1969
1970	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
1971
1972	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_SI);
1973	cmd->driver_major_ver = dv->major_version;
1974	cmd->driver_minor_ver = dv->minor_version;
1975	cmd->driver_build_ver = dv->build_version;
1976	cmd->driver_subbuild_ver = dv->subbuild_version;
1977
1978	len = 0;
1979	while (len < sizeof(dv->driver_string) &&
1980	       (dv->driver_string[len] < 0x80) &&
1981	       dv->driver_string[len])
1982		len++;
1983	status = i40e_asq_send_command(hw, &desc, dv->driver_string,
1984				       len, cmd_details);
1985
1986	return status;
1987}
1988
1989/**
1990 * i40e_get_link_status - get status of the HW network link
1991 * @hw: pointer to the hw struct
1992 *
1993 * Returns TRUE if link is up, FALSE if link is down.
1994 *
1995 * Side effect: LinkStatusEvent reporting becomes enabled
1996 **/
1997bool i40e_get_link_status(struct i40e_hw *hw)
1998{
1999	enum i40e_status_code status = I40E_SUCCESS;
2000	bool link_status = FALSE;
2001
2002	if (hw->phy.get_link_info) {
2003		status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
2004
2005		if (status != I40E_SUCCESS)
2006			goto i40e_get_link_status_exit;
2007	}
2008
2009	link_status = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
2010
2011i40e_get_link_status_exit:
2012	return link_status;
2013}
2014
2015/**
2016 * i40e_get_link_speed
2017 * @hw: pointer to the hw struct
2018 *
2019 * Returns the link speed of the adapter.
2020 **/
2021enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
2022{
2023	enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
2024	enum i40e_status_code status = I40E_SUCCESS;
2025
2026	if (hw->phy.get_link_info) {
2027		status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
2028
2029		if (status != I40E_SUCCESS)
2030			goto i40e_link_speed_exit;
2031	}
2032
2033	speed = hw->phy.link_info.link_speed;
2034
2035i40e_link_speed_exit:
2036	return speed;
2037}
2038
2039/**
2040 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2041 * @hw: pointer to the hw struct
2042 * @uplink_seid: the MAC or other gizmo SEID
2043 * @downlink_seid: the VSI SEID
2044 * @enabled_tc: bitmap of TCs to be enabled
2045 * @default_port: TRUE for default port VSI, FALSE for control port
2046 * @enable_l2_filtering: TRUE to add L2 filter table rules to regular forwarding rules for cloud support
2047 * @veb_seid: pointer to where to put the resulting VEB SEID
2048 * @cmd_details: pointer to command details structure or NULL
2049 *
2050 * This asks the FW to add a VEB between the uplink and downlink
2051 * elements.  If the uplink SEID is 0, this will be a floating VEB.
2052 **/
2053enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
2054				u16 downlink_seid, u8 enabled_tc,
2055				bool default_port, bool enable_l2_filtering,
2056				u16 *veb_seid,
2057				struct i40e_asq_cmd_details *cmd_details)
2058{
2059	struct i40e_aq_desc desc;
2060	struct i40e_aqc_add_veb *cmd =
2061		(struct i40e_aqc_add_veb *)&desc.params.raw;
2062	struct i40e_aqc_add_veb_completion *resp =
2063		(struct i40e_aqc_add_veb_completion *)&desc.params.raw;
2064	enum i40e_status_code status;
2065	u16 veb_flags = 0;
2066
2067	/* SEIDs need to either both be set or both be 0 for floating VEB */
2068	if (!!uplink_seid != !!downlink_seid)
2069		return I40E_ERR_PARAM;
2070
2071	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
2072
2073	cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
2074	cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
2075	cmd->enable_tcs = enabled_tc;
2076	if (!uplink_seid)
2077		veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
2078	if (default_port)
2079		veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
2080	else
2081		veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
2082
2083	if (enable_l2_filtering)
2084		veb_flags |= I40E_AQC_ADD_VEB_ENABLE_L2_FILTER;
2085
2086	cmd->veb_flags = CPU_TO_LE16(veb_flags);
2087
2088	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2089
2090	if (!status && veb_seid)
2091		*veb_seid = LE16_TO_CPU(resp->veb_seid);
2092
2093	return status;
2094}
2095
2096/**
2097 * i40e_aq_get_veb_parameters - Retrieve VEB parameters
2098 * @hw: pointer to the hw struct
2099 * @veb_seid: the SEID of the VEB to query
2100 * @switch_id: the uplink switch id
2101 * @floating: set to TRUE if the VEB is floating
2102 * @statistic_index: index of the stats counter block for this VEB
2103 * @vebs_used: number of VEB's used by function
2104 * @vebs_free: total VEB's not reserved by any function
2105 * @cmd_details: pointer to command details structure or NULL
2106 *
2107 * This retrieves the parameters for a particular VEB, specified by
2108 * uplink_seid, and returns them to the caller.
2109 **/
2110enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
2111				u16 veb_seid, u16 *switch_id,
2112				bool *floating, u16 *statistic_index,
2113				u16 *vebs_used, u16 *vebs_free,
2114				struct i40e_asq_cmd_details *cmd_details)
2115{
2116	struct i40e_aq_desc desc;
2117	struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
2118		(struct i40e_aqc_get_veb_parameters_completion *)
2119		&desc.params.raw;
2120	enum i40e_status_code status;
2121
2122	if (veb_seid == 0)
2123		return I40E_ERR_PARAM;
2124
2125	i40e_fill_default_direct_cmd_desc(&desc,
2126					  i40e_aqc_opc_get_veb_parameters);
2127	cmd_resp->seid = CPU_TO_LE16(veb_seid);
2128
2129	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2130	if (status)
2131		goto get_veb_exit;
2132
2133	if (switch_id)
2134		*switch_id = LE16_TO_CPU(cmd_resp->switch_id);
2135	if (statistic_index)
2136		*statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
2137	if (vebs_used)
2138		*vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
2139	if (vebs_free)
2140		*vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
2141	if (floating) {
2142		u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
2143		if (flags & I40E_AQC_ADD_VEB_FLOATING)
2144			*floating = TRUE;
2145		else
2146			*floating = FALSE;
2147	}
2148
2149get_veb_exit:
2150	return status;
2151}
2152
2153/**
2154 * i40e_aq_add_macvlan
2155 * @hw: pointer to the hw struct
2156 * @seid: VSI for the mac address
2157 * @mv_list: list of macvlans to be added
2158 * @count: length of the list
2159 * @cmd_details: pointer to command details structure or NULL
2160 *
2161 * Add MAC/VLAN addresses to the HW filtering
2162 **/
2163enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
2164			struct i40e_aqc_add_macvlan_element_data *mv_list,
2165			u16 count, struct i40e_asq_cmd_details *cmd_details)
2166{
2167	struct i40e_aq_desc desc;
2168	struct i40e_aqc_macvlan *cmd =
2169		(struct i40e_aqc_macvlan *)&desc.params.raw;
2170	enum i40e_status_code status;
2171	u16 buf_size;
2172
2173	if (count == 0 || !mv_list || !hw)
2174		return I40E_ERR_PARAM;
2175
2176	buf_size = count * sizeof(struct i40e_aqc_add_macvlan_element_data);
2177
2178	/* prep the rest of the request */
2179	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
2180	cmd->num_addresses = CPU_TO_LE16(count);
2181	cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2182	cmd->seid[1] = 0;
2183	cmd->seid[2] = 0;
2184
2185	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2186	if (buf_size > I40E_AQ_LARGE_BUF)
2187		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2188
2189	status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2190				    cmd_details);
2191
2192	return status;
2193}
2194
2195/**
2196 * i40e_aq_remove_macvlan
2197 * @hw: pointer to the hw struct
2198 * @seid: VSI for the mac address
2199 * @mv_list: list of macvlans to be removed
2200 * @count: length of the list
2201 * @cmd_details: pointer to command details structure or NULL
2202 *
2203 * Remove MAC/VLAN addresses from the HW filtering
2204 **/
2205enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
2206			struct i40e_aqc_remove_macvlan_element_data *mv_list,
2207			u16 count, struct i40e_asq_cmd_details *cmd_details)
2208{
2209	struct i40e_aq_desc desc;
2210	struct i40e_aqc_macvlan *cmd =
2211		(struct i40e_aqc_macvlan *)&desc.params.raw;
2212	enum i40e_status_code status;
2213	u16 buf_size;
2214
2215	if (count == 0 || !mv_list || !hw)
2216		return I40E_ERR_PARAM;
2217
2218	buf_size = count * sizeof(struct i40e_aqc_remove_macvlan_element_data);
2219
2220	/* prep the rest of the request */
2221	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
2222	cmd->num_addresses = CPU_TO_LE16(count);
2223	cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2224	cmd->seid[1] = 0;
2225	cmd->seid[2] = 0;
2226
2227	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2228	if (buf_size > I40E_AQ_LARGE_BUF)
2229		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2230
2231	status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2232				       cmd_details);
2233
2234	return status;
2235}
2236
2237/**
2238 * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
2239 * @hw: pointer to the hw struct
2240 * @seid: VSI for the vlan filters
2241 * @v_list: list of vlan filters to be added
2242 * @count: length of the list
2243 * @cmd_details: pointer to command details structure or NULL
2244 **/
2245enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
2246			struct i40e_aqc_add_remove_vlan_element_data *v_list,
2247			u8 count, struct i40e_asq_cmd_details *cmd_details)
2248{
2249	struct i40e_aq_desc desc;
2250	struct i40e_aqc_macvlan *cmd =
2251		(struct i40e_aqc_macvlan *)&desc.params.raw;
2252	enum i40e_status_code status;
2253	u16 buf_size;
2254
2255	if (count == 0 || !v_list || !hw)
2256		return I40E_ERR_PARAM;
2257
2258	buf_size = count * sizeof(struct i40e_aqc_add_remove_vlan_element_data);
2259
2260	/* prep the rest of the request */
2261	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
2262	cmd->num_addresses = CPU_TO_LE16(count);
2263	cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
2264	cmd->seid[1] = 0;
2265	cmd->seid[2] = 0;
2266
2267	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2268	if (buf_size > I40E_AQ_LARGE_BUF)
2269		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2270
2271	status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
2272				       cmd_details);
2273
2274	return status;
2275}
2276
2277/**
2278 * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
2279 * @hw: pointer to the hw struct
2280 * @seid: VSI for the vlan filters
2281 * @v_list: list of macvlans to be removed
2282 * @count: length of the list
2283 * @cmd_details: pointer to command details structure or NULL
2284 **/
2285enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
2286			struct i40e_aqc_add_remove_vlan_element_data *v_list,
2287			u8 count, struct i40e_asq_cmd_details *cmd_details)
2288{
2289	struct i40e_aq_desc desc;
2290	struct i40e_aqc_macvlan *cmd =
2291		(struct i40e_aqc_macvlan *)&desc.params.raw;
2292	enum i40e_status_code status;
2293	u16 buf_size;
2294
2295	if (count == 0 || !v_list || !hw)
2296		return I40E_ERR_PARAM;
2297
2298	buf_size = count * sizeof(struct i40e_aqc_add_remove_vlan_element_data);
2299
2300	/* prep the rest of the request */
2301	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
2302	cmd->num_addresses = CPU_TO_LE16(count);
2303	cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
2304	cmd->seid[1] = 0;
2305	cmd->seid[2] = 0;
2306
2307	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2308	if (buf_size > I40E_AQ_LARGE_BUF)
2309		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2310
2311	status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
2312				       cmd_details);
2313
2314	return status;
2315}
2316
2317/**
2318 * i40e_aq_send_msg_to_vf
2319 * @hw: pointer to the hardware structure
2320 * @vfid: vf id to send msg
2321 * @v_opcode: opcodes for VF-PF communication
2322 * @v_retval: return error code
2323 * @msg: pointer to the msg buffer
2324 * @msglen: msg length
2325 * @cmd_details: pointer to command details
2326 *
2327 * send msg to vf
2328 **/
2329enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
2330				u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
2331				struct i40e_asq_cmd_details *cmd_details)
2332{
2333	struct i40e_aq_desc desc;
2334	struct i40e_aqc_pf_vf_message *cmd =
2335		(struct i40e_aqc_pf_vf_message *)&desc.params.raw;
2336	enum i40e_status_code status;
2337
2338	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
2339	cmd->id = CPU_TO_LE32(vfid);
2340	desc.cookie_high = CPU_TO_LE32(v_opcode);
2341	desc.cookie_low = CPU_TO_LE32(v_retval);
2342	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
2343	if (msglen) {
2344		desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
2345						I40E_AQ_FLAG_RD));
2346		if (msglen > I40E_AQ_LARGE_BUF)
2347			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2348		desc.datalen = CPU_TO_LE16(msglen);
2349	}
2350	status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
2351
2352	return status;
2353}
2354
2355/**
2356 * i40e_aq_debug_write_register
2357 * @hw: pointer to the hw struct
2358 * @reg_addr: register address
2359 * @reg_val: register value
2360 * @cmd_details: pointer to command details structure or NULL
2361 *
2362 * Write to a register using the admin queue commands
2363 **/
2364enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
2365				u32 reg_addr, u64 reg_val,
2366				struct i40e_asq_cmd_details *cmd_details)
2367{
2368	struct i40e_aq_desc desc;
2369	struct i40e_aqc_debug_reg_read_write *cmd =
2370		(struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
2371	enum i40e_status_code status;
2372
2373	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
2374
2375	cmd->address = CPU_TO_LE32(reg_addr);
2376	cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
2377	cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
2378
2379	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2380
2381	return status;
2382}
2383
2384/**
2385 * i40e_aq_get_hmc_resource_profile
2386 * @hw: pointer to the hw struct
2387 * @profile: type of profile the HMC is to be set as
2388 * @pe_vf_enabled_count: the number of PE enabled VFs the system has
2389 * @cmd_details: pointer to command details structure or NULL
2390 *
2391 * query the HMC profile of the device.
2392 **/
2393enum i40e_status_code i40e_aq_get_hmc_resource_profile(struct i40e_hw *hw,
2394				enum i40e_aq_hmc_profile *profile,
2395				u8 *pe_vf_enabled_count,
2396				struct i40e_asq_cmd_details *cmd_details)
2397{
2398	struct i40e_aq_desc desc;
2399	struct i40e_aq_get_set_hmc_resource_profile *resp =
2400		(struct i40e_aq_get_set_hmc_resource_profile *)&desc.params.raw;
2401	enum i40e_status_code status;
2402
2403	i40e_fill_default_direct_cmd_desc(&desc,
2404				i40e_aqc_opc_query_hmc_resource_profile);
2405	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2406
2407	*profile = (enum i40e_aq_hmc_profile)(resp->pm_profile &
2408		   I40E_AQ_GET_HMC_RESOURCE_PROFILE_PM_MASK);
2409	*pe_vf_enabled_count = resp->pe_vf_enabled &
2410			       I40E_AQ_GET_HMC_RESOURCE_PROFILE_COUNT_MASK;
2411
2412	return status;
2413}
2414
2415/**
2416 * i40e_aq_set_hmc_resource_profile
2417 * @hw: pointer to the hw struct
2418 * @profile: type of profile the HMC is to be set as
2419 * @pe_vf_enabled_count: the number of PE enabled VFs the system has
2420 * @cmd_details: pointer to command details structure or NULL
2421 *
2422 * set the HMC profile of the device.
2423 **/
2424enum i40e_status_code i40e_aq_set_hmc_resource_profile(struct i40e_hw *hw,
2425				enum i40e_aq_hmc_profile profile,
2426				u8 pe_vf_enabled_count,
2427				struct i40e_asq_cmd_details *cmd_details)
2428{
2429	struct i40e_aq_desc desc;
2430	struct i40e_aq_get_set_hmc_resource_profile *cmd =
2431		(struct i40e_aq_get_set_hmc_resource_profile *)&desc.params.raw;
2432	enum i40e_status_code status;
2433
2434	i40e_fill_default_direct_cmd_desc(&desc,
2435					i40e_aqc_opc_set_hmc_resource_profile);
2436
2437	cmd->pm_profile = (u8)profile;
2438	cmd->pe_vf_enabled = pe_vf_enabled_count;
2439
2440	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2441
2442	return status;
2443}
2444
2445/**
2446 * i40e_aq_request_resource
2447 * @hw: pointer to the hw struct
2448 * @resource: resource id
2449 * @access: access type
2450 * @sdp_number: resource number
2451 * @timeout: the maximum time in ms that the driver may hold the resource
2452 * @cmd_details: pointer to command details structure or NULL
2453 *
2454 * requests common resource using the admin queue commands
2455 **/
2456enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
2457				enum i40e_aq_resources_ids resource,
2458				enum i40e_aq_resource_access_type access,
2459				u8 sdp_number, u64 *timeout,
2460				struct i40e_asq_cmd_details *cmd_details)
2461{
2462	struct i40e_aq_desc desc;
2463	struct i40e_aqc_request_resource *cmd_resp =
2464		(struct i40e_aqc_request_resource *)&desc.params.raw;
2465	enum i40e_status_code status;
2466
2467	DEBUGFUNC("i40e_aq_request_resource");
2468
2469	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
2470
2471	cmd_resp->resource_id = CPU_TO_LE16(resource);
2472	cmd_resp->access_type = CPU_TO_LE16(access);
2473	cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
2474
2475	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2476	/* The completion specifies the maximum time in ms that the driver
2477	 * may hold the resource in the Timeout field.
2478	 * If the resource is held by someone else, the command completes with
2479	 * busy return value and the timeout field indicates the maximum time
2480	 * the current owner of the resource has to free it.
2481	 */
2482	if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
2483		*timeout = LE32_TO_CPU(cmd_resp->timeout);
2484
2485	return status;
2486}
2487
2488/**
2489 * i40e_aq_release_resource
2490 * @hw: pointer to the hw struct
2491 * @resource: resource id
2492 * @sdp_number: resource number
2493 * @cmd_details: pointer to command details structure or NULL
2494 *
2495 * release common resource using the admin queue commands
2496 **/
2497enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
2498				enum i40e_aq_resources_ids resource,
2499				u8 sdp_number,
2500				struct i40e_asq_cmd_details *cmd_details)
2501{
2502	struct i40e_aq_desc desc;
2503	struct i40e_aqc_request_resource *cmd =
2504		(struct i40e_aqc_request_resource *)&desc.params.raw;
2505	enum i40e_status_code status;
2506
2507	DEBUGFUNC("i40e_aq_release_resource");
2508
2509	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
2510
2511	cmd->resource_id = CPU_TO_LE16(resource);
2512	cmd->resource_number = CPU_TO_LE32(sdp_number);
2513
2514	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2515
2516	return status;
2517}
2518
2519/**
2520 * i40e_aq_read_nvm
2521 * @hw: pointer to the hw struct
2522 * @module_pointer: module pointer location in words from the NVM beginning
2523 * @offset: byte offset from the module beginning
2524 * @length: length of the section to be read (in bytes from the offset)
2525 * @data: command buffer (size [bytes] = length)
2526 * @last_command: tells if this is the last command in a series
2527 * @cmd_details: pointer to command details structure or NULL
2528 *
2529 * Read the NVM using the admin queue commands
2530 **/
2531enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
2532				u32 offset, u16 length, void *data,
2533				bool last_command,
2534				struct i40e_asq_cmd_details *cmd_details)
2535{
2536	struct i40e_aq_desc desc;
2537	struct i40e_aqc_nvm_update *cmd =
2538		(struct i40e_aqc_nvm_update *)&desc.params.raw;
2539	enum i40e_status_code status;
2540
2541	DEBUGFUNC("i40e_aq_read_nvm");
2542
2543	/* In offset the highest byte must be zeroed. */
2544	if (offset & 0xFF000000) {
2545		status = I40E_ERR_PARAM;
2546		goto i40e_aq_read_nvm_exit;
2547	}
2548
2549	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
2550
2551	/* If this is the last command in a series, set the proper flag. */
2552	if (last_command)
2553		cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
2554	cmd->module_pointer = module_pointer;
2555	cmd->offset = CPU_TO_LE32(offset);
2556	cmd->length = CPU_TO_LE16(length);
2557
2558	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2559	if (length > I40E_AQ_LARGE_BUF)
2560		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2561
2562	status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
2563
2564i40e_aq_read_nvm_exit:
2565	return status;
2566}
2567
2568/**
2569 * i40e_aq_erase_nvm
2570 * @hw: pointer to the hw struct
2571 * @module_pointer: module pointer location in words from the NVM beginning
2572 * @offset: offset in the module (expressed in 4 KB from module's beginning)
2573 * @length: length of the section to be erased (expressed in 4 KB)
2574 * @last_command: tells if this is the last command in a series
2575 * @cmd_details: pointer to command details structure or NULL
2576 *
2577 * Erase the NVM sector using the admin queue commands
2578 **/
2579enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
2580				u32 offset, u16 length, bool last_command,
2581				struct i40e_asq_cmd_details *cmd_details)
2582{
2583	struct i40e_aq_desc desc;
2584	struct i40e_aqc_nvm_update *cmd =
2585		(struct i40e_aqc_nvm_update *)&desc.params.raw;
2586	enum i40e_status_code status;
2587
2588	DEBUGFUNC("i40e_aq_erase_nvm");
2589
2590	/* In offset the highest byte must be zeroed. */
2591	if (offset & 0xFF000000) {
2592		status = I40E_ERR_PARAM;
2593		goto i40e_aq_erase_nvm_exit;
2594	}
2595
2596	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
2597
2598	/* If this is the last command in a series, set the proper flag. */
2599	if (last_command)
2600		cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
2601	cmd->module_pointer = module_pointer;
2602	cmd->offset = CPU_TO_LE32(offset);
2603	cmd->length = CPU_TO_LE16(length);
2604
2605	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2606
2607i40e_aq_erase_nvm_exit:
2608	return status;
2609}
2610
2611#define I40E_DEV_FUNC_CAP_SWITCH_MODE	0x01
2612#define I40E_DEV_FUNC_CAP_MGMT_MODE	0x02
2613#define I40E_DEV_FUNC_CAP_NPAR		0x03
2614#define I40E_DEV_FUNC_CAP_OS2BMC	0x04
2615#define I40E_DEV_FUNC_CAP_VALID_FUNC	0x05
2616#define I40E_DEV_FUNC_CAP_SRIOV_1_1	0x12
2617#define I40E_DEV_FUNC_CAP_VF		0x13
2618#define I40E_DEV_FUNC_CAP_VMDQ		0x14
2619#define I40E_DEV_FUNC_CAP_802_1_QBG	0x15
2620#define I40E_DEV_FUNC_CAP_802_1_QBH	0x16
2621#define I40E_DEV_FUNC_CAP_VSI		0x17
2622#define I40E_DEV_FUNC_CAP_DCB		0x18
2623#define I40E_DEV_FUNC_CAP_FCOE		0x21
2624#define I40E_DEV_FUNC_CAP_RSS		0x40
2625#define I40E_DEV_FUNC_CAP_RX_QUEUES	0x41
2626#define I40E_DEV_FUNC_CAP_TX_QUEUES	0x42
2627#define I40E_DEV_FUNC_CAP_MSIX		0x43
2628#define I40E_DEV_FUNC_CAP_MSIX_VF	0x44
2629#define I40E_DEV_FUNC_CAP_FLOW_DIRECTOR	0x45
2630#define I40E_DEV_FUNC_CAP_IEEE_1588	0x46
2631#define I40E_DEV_FUNC_CAP_MFP_MODE_1	0xF1
2632#define I40E_DEV_FUNC_CAP_CEM		0xF2
2633#define I40E_DEV_FUNC_CAP_IWARP		0x51
2634#define I40E_DEV_FUNC_CAP_LED		0x61
2635#define I40E_DEV_FUNC_CAP_SDP		0x62
2636#define I40E_DEV_FUNC_CAP_MDIO		0x63
2637
2638/**
2639 * i40e_parse_discover_capabilities
2640 * @hw: pointer to the hw struct
2641 * @buff: pointer to a buffer containing device/function capability records
2642 * @cap_count: number of capability records in the list
2643 * @list_type_opc: type of capabilities list to parse
2644 *
2645 * Parse the device/function capabilities list.
2646 **/
2647static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
2648				     u32 cap_count,
2649				     enum i40e_admin_queue_opc list_type_opc)
2650{
2651	struct i40e_aqc_list_capabilities_element_resp *cap;
2652	u32 number, logical_id, phys_id;
2653	struct i40e_hw_capabilities *p;
2654	u32 i = 0;
2655	u16 id;
2656
2657	cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
2658
2659	if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
2660		p = (struct i40e_hw_capabilities *)&hw->dev_caps;
2661	else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
2662		p = (struct i40e_hw_capabilities *)&hw->func_caps;
2663	else
2664		return;
2665
2666	for (i = 0; i < cap_count; i++, cap++) {
2667		id = LE16_TO_CPU(cap->id);
2668		number = LE32_TO_CPU(cap->number);
2669		logical_id = LE32_TO_CPU(cap->logical_id);
2670		phys_id = LE32_TO_CPU(cap->phys_id);
2671
2672		switch (id) {
2673		case I40E_DEV_FUNC_CAP_SWITCH_MODE:
2674			p->switch_mode = number;
2675			break;
2676		case I40E_DEV_FUNC_CAP_MGMT_MODE:
2677			p->management_mode = number;
2678			break;
2679		case I40E_DEV_FUNC_CAP_NPAR:
2680			p->npar_enable = number;
2681			break;
2682		case I40E_DEV_FUNC_CAP_OS2BMC:
2683			p->os2bmc = number;
2684			break;
2685		case I40E_DEV_FUNC_CAP_VALID_FUNC:
2686			p->valid_functions = number;
2687			break;
2688		case I40E_DEV_FUNC_CAP_SRIOV_1_1:
2689			if (number == 1)
2690				p->sr_iov_1_1 = TRUE;
2691			break;
2692		case I40E_DEV_FUNC_CAP_VF:
2693			p->num_vfs = number;
2694			p->vf_base_id = logical_id;
2695			break;
2696		case I40E_DEV_FUNC_CAP_VMDQ:
2697			if (number == 1)
2698				p->vmdq = TRUE;
2699			break;
2700		case I40E_DEV_FUNC_CAP_802_1_QBG:
2701			if (number == 1)
2702				p->evb_802_1_qbg = TRUE;
2703			break;
2704		case I40E_DEV_FUNC_CAP_802_1_QBH:
2705			if (number == 1)
2706				p->evb_802_1_qbh = TRUE;
2707			break;
2708		case I40E_DEV_FUNC_CAP_VSI:
2709			p->num_vsis = number;
2710			break;
2711		case I40E_DEV_FUNC_CAP_DCB:
2712			if (number == 1) {
2713				p->dcb = TRUE;
2714				p->enabled_tcmap = logical_id;
2715				p->maxtc = phys_id;
2716			}
2717			break;
2718		case I40E_DEV_FUNC_CAP_FCOE:
2719			if (number == 1)
2720				p->fcoe = TRUE;
2721			break;
2722		case I40E_DEV_FUNC_CAP_RSS:
2723			p->rss = TRUE;
2724			p->rss_table_size = number;
2725			p->rss_table_entry_width = logical_id;
2726			break;
2727		case I40E_DEV_FUNC_CAP_RX_QUEUES:
2728			p->num_rx_qp = number;
2729			p->base_queue = phys_id;
2730			break;
2731		case I40E_DEV_FUNC_CAP_TX_QUEUES:
2732			p->num_tx_qp = number;
2733			p->base_queue = phys_id;
2734			break;
2735		case I40E_DEV_FUNC_CAP_MSIX:
2736			p->num_msix_vectors = number;
2737			break;
2738		case I40E_DEV_FUNC_CAP_MSIX_VF:
2739			p->num_msix_vectors_vf = number;
2740			break;
2741		case I40E_DEV_FUNC_CAP_MFP_MODE_1:
2742			if (number == 1)
2743				p->mfp_mode_1 = TRUE;
2744			break;
2745		case I40E_DEV_FUNC_CAP_CEM:
2746			if (number == 1)
2747				p->mgmt_cem = TRUE;
2748			break;
2749		case I40E_DEV_FUNC_CAP_IWARP:
2750			if (number == 1)
2751				p->iwarp = TRUE;
2752			break;
2753		case I40E_DEV_FUNC_CAP_LED:
2754			if (phys_id < I40E_HW_CAP_MAX_GPIO)
2755				p->led[phys_id] = TRUE;
2756			break;
2757		case I40E_DEV_FUNC_CAP_SDP:
2758			if (phys_id < I40E_HW_CAP_MAX_GPIO)
2759				p->sdp[phys_id] = TRUE;
2760			break;
2761		case I40E_DEV_FUNC_CAP_MDIO:
2762			if (number == 1) {
2763				p->mdio_port_num = phys_id;
2764				p->mdio_port_mode = logical_id;
2765			}
2766			break;
2767		case I40E_DEV_FUNC_CAP_IEEE_1588:
2768			if (number == 1)
2769				p->ieee_1588 = TRUE;
2770			break;
2771		case I40E_DEV_FUNC_CAP_FLOW_DIRECTOR:
2772			p->fd = TRUE;
2773			p->fd_filters_guaranteed = number;
2774			p->fd_filters_best_effort = logical_id;
2775			break;
2776		default:
2777			break;
2778		}
2779	}
2780
2781	/* Software override ensuring FCoE is disabled if npar or mfp
2782	 * mode because it is not supported in these modes.
2783	 */
2784	if (p->npar_enable || p->mfp_mode_1)
2785		p->fcoe = FALSE;
2786
2787	/* additional HW specific goodies that might
2788	 * someday be HW version specific
2789	 */
2790	p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
2791}
2792
2793/**
2794 * i40e_aq_discover_capabilities
2795 * @hw: pointer to the hw struct
2796 * @buff: a virtual buffer to hold the capabilities
2797 * @buff_size: Size of the virtual buffer
2798 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
2799 * @list_type_opc: capabilities type to discover - pass in the command opcode
2800 * @cmd_details: pointer to command details structure or NULL
2801 *
2802 * Get the device capabilities descriptions from the firmware
2803 **/
2804enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
2805				void *buff, u16 buff_size, u16 *data_size,
2806				enum i40e_admin_queue_opc list_type_opc,
2807				struct i40e_asq_cmd_details *cmd_details)
2808{
2809	struct i40e_aqc_list_capabilites *cmd;
2810	struct i40e_aq_desc desc;
2811	enum i40e_status_code status = I40E_SUCCESS;
2812
2813	cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
2814
2815	if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
2816		list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
2817		status = I40E_ERR_PARAM;
2818		goto exit;
2819	}
2820
2821	i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
2822
2823	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2824	if (buff_size > I40E_AQ_LARGE_BUF)
2825		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2826
2827	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
2828	*data_size = LE16_TO_CPU(desc.datalen);
2829
2830	if (status)
2831		goto exit;
2832
2833	i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
2834					 list_type_opc);
2835
2836exit:
2837	return status;
2838}
2839
2840/**
2841 * i40e_aq_update_nvm
2842 * @hw: pointer to the hw struct
2843 * @module_pointer: module pointer location in words from the NVM beginning
2844 * @offset: byte offset from the module beginning
2845 * @length: length of the section to be written (in bytes from the offset)
2846 * @data: command buffer (size [bytes] = length)
2847 * @last_command: tells if this is the last command in a series
2848 * @cmd_details: pointer to command details structure or NULL
2849 *
2850 * Update the NVM using the admin queue commands
2851 **/
2852enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
2853				u32 offset, u16 length, void *data,
2854				bool last_command,
2855				struct i40e_asq_cmd_details *cmd_details)
2856{
2857	struct i40e_aq_desc desc;
2858	struct i40e_aqc_nvm_update *cmd =
2859		(struct i40e_aqc_nvm_update *)&desc.params.raw;
2860	enum i40e_status_code status;
2861
2862	DEBUGFUNC("i40e_aq_update_nvm");
2863
2864	/* In offset the highest byte must be zeroed. */
2865	if (offset & 0xFF000000) {
2866		status = I40E_ERR_PARAM;
2867		goto i40e_aq_update_nvm_exit;
2868	}
2869
2870	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
2871
2872	/* If this is the last command in a series, set the proper flag. */
2873	if (last_command)
2874		cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
2875	cmd->module_pointer = module_pointer;
2876	cmd->offset = CPU_TO_LE32(offset);
2877	cmd->length = CPU_TO_LE16(length);
2878
2879	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2880	if (length > I40E_AQ_LARGE_BUF)
2881		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2882
2883	status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
2884
2885i40e_aq_update_nvm_exit:
2886	return status;
2887}
2888
2889/**
2890 * i40e_aq_get_lldp_mib
2891 * @hw: pointer to the hw struct
2892 * @bridge_type: type of bridge requested
2893 * @mib_type: Local, Remote or both Local and Remote MIBs
2894 * @buff: pointer to a user supplied buffer to store the MIB block
2895 * @buff_size: size of the buffer (in bytes)
2896 * @local_len : length of the returned Local LLDP MIB
2897 * @remote_len: length of the returned Remote LLDP MIB
2898 * @cmd_details: pointer to command details structure or NULL
2899 *
2900 * Requests the complete LLDP MIB (entire packet).
2901 **/
2902enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
2903				u8 mib_type, void *buff, u16 buff_size,
2904				u16 *local_len, u16 *remote_len,
2905				struct i40e_asq_cmd_details *cmd_details)
2906{
2907	struct i40e_aq_desc desc;
2908	struct i40e_aqc_lldp_get_mib *cmd =
2909		(struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
2910	struct i40e_aqc_lldp_get_mib *resp =
2911		(struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
2912	enum i40e_status_code status;
2913
2914	if (buff_size == 0 || !buff)
2915		return I40E_ERR_PARAM;
2916
2917	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
2918	/* Indirect Command */
2919	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2920
2921	cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
2922	cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
2923		       I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
2924
2925	desc.datalen = CPU_TO_LE16(buff_size);
2926
2927	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2928	if (buff_size > I40E_AQ_LARGE_BUF)
2929		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2930
2931	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
2932	if (!status) {
2933		if (local_len != NULL)
2934			*local_len = LE16_TO_CPU(resp->local_len);
2935		if (remote_len != NULL)
2936			*remote_len = LE16_TO_CPU(resp->remote_len);
2937	}
2938
2939	return status;
2940}
2941
2942/**
2943 * i40e_aq_cfg_lldp_mib_change_event
2944 * @hw: pointer to the hw struct
2945 * @enable_update: Enable or Disable event posting
2946 * @cmd_details: pointer to command details structure or NULL
2947 *
2948 * Enable or Disable posting of an event on ARQ when LLDP MIB
2949 * associated with the interface changes
2950 **/
2951enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
2952				bool enable_update,
2953				struct i40e_asq_cmd_details *cmd_details)
2954{
2955	struct i40e_aq_desc desc;
2956	struct i40e_aqc_lldp_update_mib *cmd =
2957		(struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
2958	enum i40e_status_code status;
2959
2960	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
2961
2962	if (!enable_update)
2963		cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
2964
2965	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2966
2967	return status;
2968}
2969
2970/**
2971 * i40e_aq_add_lldp_tlv
2972 * @hw: pointer to the hw struct
2973 * @bridge_type: type of bridge
2974 * @buff: buffer with TLV to add
2975 * @buff_size: length of the buffer
2976 * @tlv_len: length of the TLV to be added
2977 * @mib_len: length of the LLDP MIB returned in response
2978 * @cmd_details: pointer to command details structure or NULL
2979 *
2980 * Add the specified TLV to LLDP Local MIB for the given bridge type,
2981 * it is responsibility of the caller to make sure that the TLV is not
2982 * already present in the LLDPDU.
2983 * In return firmware will write the complete LLDP MIB with the newly
2984 * added TLV in the response buffer.
2985 **/
2986enum i40e_status_code i40e_aq_add_lldp_tlv(struct i40e_hw *hw, u8 bridge_type,
2987				void *buff, u16 buff_size, u16 tlv_len,
2988				u16 *mib_len,
2989				struct i40e_asq_cmd_details *cmd_details)
2990{
2991	struct i40e_aq_desc desc;
2992	struct i40e_aqc_lldp_add_tlv *cmd =
2993		(struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
2994	enum i40e_status_code status;
2995
2996	if (buff_size == 0 || !buff || tlv_len == 0)
2997		return I40E_ERR_PARAM;
2998
2999	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_add_tlv);
3000
3001	/* Indirect Command */
3002	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3003	if (buff_size > I40E_AQ_LARGE_BUF)
3004		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3005	desc.datalen = CPU_TO_LE16(buff_size);
3006
3007	cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3008		      I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3009	cmd->len = CPU_TO_LE16(tlv_len);
3010
3011	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3012	if (!status) {
3013		if (mib_len != NULL)
3014			*mib_len = LE16_TO_CPU(desc.datalen);
3015	}
3016
3017	return status;
3018}
3019
3020/**
3021 * i40e_aq_update_lldp_tlv
3022 * @hw: pointer to the hw struct
3023 * @bridge_type: type of bridge
3024 * @buff: buffer with TLV to update
3025 * @buff_size: size of the buffer holding original and updated TLVs
3026 * @old_len: Length of the Original TLV
3027 * @new_len: Length of the Updated TLV
3028 * @offset: offset of the updated TLV in the buff
3029 * @mib_len: length of the returned LLDP MIB
3030 * @cmd_details: pointer to command details structure or NULL
3031 *
3032 * Update the specified TLV to the LLDP Local MIB for the given bridge type.
3033 * Firmware will place the complete LLDP MIB in response buffer with the
3034 * updated TLV.
3035 **/
3036enum i40e_status_code i40e_aq_update_lldp_tlv(struct i40e_hw *hw,
3037				u8 bridge_type, void *buff, u16 buff_size,
3038				u16 old_len, u16 new_len, u16 offset,
3039				u16 *mib_len,
3040				struct i40e_asq_cmd_details *cmd_details)
3041{
3042	struct i40e_aq_desc desc;
3043	struct i40e_aqc_lldp_update_tlv *cmd =
3044		(struct i40e_aqc_lldp_update_tlv *)&desc.params.raw;
3045	enum i40e_status_code status;
3046
3047	if (buff_size == 0 || !buff || offset == 0 ||
3048	    old_len == 0 || new_len == 0)
3049		return I40E_ERR_PARAM;
3050
3051	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_tlv);
3052
3053	/* Indirect Command */
3054	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3055	if (buff_size > I40E_AQ_LARGE_BUF)
3056		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3057	desc.datalen = CPU_TO_LE16(buff_size);
3058
3059	cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3060		      I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3061	cmd->old_len = CPU_TO_LE16(old_len);
3062	cmd->new_offset = CPU_TO_LE16(offset);
3063	cmd->new_len = CPU_TO_LE16(new_len);
3064
3065	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3066	if (!status) {
3067		if (mib_len != NULL)
3068			*mib_len = LE16_TO_CPU(desc.datalen);
3069	}
3070
3071	return status;
3072}
3073
3074/**
3075 * i40e_aq_delete_lldp_tlv
3076 * @hw: pointer to the hw struct
3077 * @bridge_type: type of bridge
3078 * @buff: pointer to a user supplied buffer that has the TLV
3079 * @buff_size: length of the buffer
3080 * @tlv_len: length of the TLV to be deleted
3081 * @mib_len: length of the returned LLDP MIB
3082 * @cmd_details: pointer to command details structure or NULL
3083 *
3084 * Delete the specified TLV from LLDP Local MIB for the given bridge type.
3085 * The firmware places the entire LLDP MIB in the response buffer.
3086 **/
3087enum i40e_status_code i40e_aq_delete_lldp_tlv(struct i40e_hw *hw,
3088				u8 bridge_type, void *buff, u16 buff_size,
3089				u16 tlv_len, u16 *mib_len,
3090				struct i40e_asq_cmd_details *cmd_details)
3091{
3092	struct i40e_aq_desc desc;
3093	struct i40e_aqc_lldp_add_tlv *cmd =
3094		(struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
3095	enum i40e_status_code status;
3096
3097	if (buff_size == 0 || !buff)
3098		return I40E_ERR_PARAM;
3099
3100	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_delete_tlv);
3101
3102	/* Indirect Command */
3103	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3104	if (buff_size > I40E_AQ_LARGE_BUF)
3105		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3106	desc.datalen = CPU_TO_LE16(buff_size);
3107	cmd->len = CPU_TO_LE16(tlv_len);
3108	cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3109		      I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3110
3111	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3112	if (!status) {
3113		if (mib_len != NULL)
3114			*mib_len = LE16_TO_CPU(desc.datalen);
3115	}
3116
3117	return status;
3118}
3119
3120/**
3121 * i40e_aq_stop_lldp
3122 * @hw: pointer to the hw struct
3123 * @shutdown_agent: True if LLDP Agent needs to be Shutdown
3124 * @cmd_details: pointer to command details structure or NULL
3125 *
3126 * Stop or Shutdown the embedded LLDP Agent
3127 **/
3128enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
3129				struct i40e_asq_cmd_details *cmd_details)
3130{
3131	struct i40e_aq_desc desc;
3132	struct i40e_aqc_lldp_stop *cmd =
3133		(struct i40e_aqc_lldp_stop *)&desc.params.raw;
3134	enum i40e_status_code status;
3135
3136	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
3137
3138	if (shutdown_agent)
3139		cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
3140
3141	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3142
3143	return status;
3144}
3145
3146/**
3147 * i40e_aq_start_lldp
3148 * @hw: pointer to the hw struct
3149 * @cmd_details: pointer to command details structure or NULL
3150 *
3151 * Start the embedded LLDP Agent on all ports.
3152 **/
3153enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
3154				struct i40e_asq_cmd_details *cmd_details)
3155{
3156	struct i40e_aq_desc desc;
3157	struct i40e_aqc_lldp_start *cmd =
3158		(struct i40e_aqc_lldp_start *)&desc.params.raw;
3159	enum i40e_status_code status;
3160
3161	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
3162
3163	cmd->command = I40E_AQ_LLDP_AGENT_START;
3164
3165	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3166
3167	return status;
3168}
3169
3170/**
3171 * i40e_aq_add_udp_tunnel
3172 * @hw: pointer to the hw struct
3173 * @udp_port: the UDP port to add
3174 * @header_len: length of the tunneling header length in DWords
3175 * @protocol_index: protocol index type
3176 * @filter_index: pointer to filter index
3177 * @cmd_details: pointer to command details structure or NULL
3178 **/
3179enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
3180				u16 udp_port, u8 protocol_index,
3181				u8 *filter_index,
3182				struct i40e_asq_cmd_details *cmd_details)
3183{
3184	struct i40e_aq_desc desc;
3185	struct i40e_aqc_add_udp_tunnel *cmd =
3186		(struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
3187	struct i40e_aqc_del_udp_tunnel_completion *resp =
3188		(struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
3189	enum i40e_status_code status;
3190
3191	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
3192
3193	cmd->udp_port = CPU_TO_LE16(udp_port);
3194	cmd->protocol_type = protocol_index;
3195
3196	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3197
3198	if (!status)
3199		*filter_index = resp->index;
3200
3201	return status;
3202}
3203
3204/**
3205 * i40e_aq_del_udp_tunnel
3206 * @hw: pointer to the hw struct
3207 * @index: filter index
3208 * @cmd_details: pointer to command details structure or NULL
3209 **/
3210enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
3211				struct i40e_asq_cmd_details *cmd_details)
3212{
3213	struct i40e_aq_desc desc;
3214	struct i40e_aqc_remove_udp_tunnel *cmd =
3215		(struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
3216	enum i40e_status_code status;
3217
3218	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
3219
3220	cmd->index = index;
3221
3222	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3223
3224	return status;
3225}
3226
3227/**
3228 * i40e_aq_get_switch_resource_alloc (0x0204)
3229 * @hw: pointer to the hw struct
3230 * @num_entries: pointer to u8 to store the number of resource entries returned
3231 * @buf: pointer to a user supplied buffer.  This buffer must be large enough
3232 *        to store the resource information for all resource types.  Each
3233 *        resource type is a i40e_aqc_switch_resource_alloc_data structure.
3234 * @count: size, in bytes, of the buffer provided
3235 * @cmd_details: pointer to command details structure or NULL
3236 *
3237 * Query the resources allocated to a function.
3238 **/
3239enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
3240			u8 *num_entries,
3241			struct i40e_aqc_switch_resource_alloc_element_resp *buf,
3242			u16 count,
3243			struct i40e_asq_cmd_details *cmd_details)
3244{
3245	struct i40e_aq_desc desc;
3246	struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
3247		(struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
3248	enum i40e_status_code status;
3249	u16 length = count
3250		   * sizeof(struct i40e_aqc_switch_resource_alloc_element_resp);
3251
3252	i40e_fill_default_direct_cmd_desc(&desc,
3253					i40e_aqc_opc_get_switch_resource_alloc);
3254
3255	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3256	if (length > I40E_AQ_LARGE_BUF)
3257		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3258
3259	status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
3260
3261	if (!status)
3262		*num_entries = cmd_resp->num_entries;
3263
3264	return status;
3265}
3266
3267/**
3268 * i40e_aq_delete_element - Delete switch element
3269 * @hw: pointer to the hw struct
3270 * @seid: the SEID to delete from the switch
3271 * @cmd_details: pointer to command details structure or NULL
3272 *
3273 * This deletes a switch element from the switch.
3274 **/
3275enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
3276				struct i40e_asq_cmd_details *cmd_details)
3277{
3278	struct i40e_aq_desc desc;
3279	struct i40e_aqc_switch_seid *cmd =
3280		(struct i40e_aqc_switch_seid *)&desc.params.raw;
3281	enum i40e_status_code status;
3282
3283	if (seid == 0)
3284		return I40E_ERR_PARAM;
3285
3286	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
3287
3288	cmd->seid = CPU_TO_LE16(seid);
3289
3290	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3291
3292	return status;
3293}
3294
3295/**
3296 * i40_aq_add_pvirt - Instantiate a Port Virtualizer on a port
3297 * @hw: pointer to the hw struct
3298 * @flags: component flags
3299 * @mac_seid: uplink seid (MAC SEID)
3300 * @vsi_seid: connected vsi seid
3301 * @ret_seid: seid of create pv component
3302 *
3303 * This instantiates an i40e port virtualizer with specified flags.
3304 * Depending on specified flags the port virtualizer can act as a
3305 * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
3306 */
3307enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
3308				       u16 mac_seid, u16 vsi_seid,
3309				       u16 *ret_seid)
3310{
3311	struct i40e_aq_desc desc;
3312	struct i40e_aqc_add_update_pv *cmd =
3313		(struct i40e_aqc_add_update_pv *)&desc.params.raw;
3314	struct i40e_aqc_add_update_pv_completion *resp =
3315		(struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
3316	enum i40e_status_code status;
3317
3318	if (vsi_seid == 0)
3319		return I40E_ERR_PARAM;
3320
3321	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
3322	cmd->command_flags = CPU_TO_LE16(flags);
3323	cmd->uplink_seid = CPU_TO_LE16(mac_seid);
3324	cmd->connected_seid = CPU_TO_LE16(vsi_seid);
3325
3326	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
3327	if (!status && ret_seid)
3328		*ret_seid = LE16_TO_CPU(resp->pv_seid);
3329
3330	return status;
3331}
3332
3333/**
3334 * i40e_aq_add_tag - Add an S/E-tag
3335 * @hw: pointer to the hw struct
3336 * @direct_to_queue: should s-tag direct flow to a specific queue
3337 * @vsi_seid: VSI SEID to use this tag
3338 * @tag: value of the tag
3339 * @queue_num: queue number, only valid is direct_to_queue is TRUE
3340 * @tags_used: return value, number of tags in use by this PF
3341 * @tags_free: return value, number of unallocated tags
3342 * @cmd_details: pointer to command details structure or NULL
3343 *
3344 * This associates an S- or E-tag to a VSI in the switch complex.  It returns
3345 * the number of tags allocated by the PF, and the number of unallocated
3346 * tags available.
3347 **/
3348enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
3349				u16 vsi_seid, u16 tag, u16 queue_num,
3350				u16 *tags_used, u16 *tags_free,
3351				struct i40e_asq_cmd_details *cmd_details)
3352{
3353	struct i40e_aq_desc desc;
3354	struct i40e_aqc_add_tag *cmd =
3355		(struct i40e_aqc_add_tag *)&desc.params.raw;
3356	struct i40e_aqc_add_remove_tag_completion *resp =
3357		(struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
3358	enum i40e_status_code status;
3359
3360	if (vsi_seid == 0)
3361		return I40E_ERR_PARAM;
3362
3363	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
3364
3365	cmd->seid = CPU_TO_LE16(vsi_seid);
3366	cmd->tag = CPU_TO_LE16(tag);
3367	if (direct_to_queue) {
3368		cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
3369		cmd->queue_number = CPU_TO_LE16(queue_num);
3370	}
3371
3372	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3373
3374	if (!status) {
3375		if (tags_used != NULL)
3376			*tags_used = LE16_TO_CPU(resp->tags_used);
3377		if (tags_free != NULL)
3378			*tags_free = LE16_TO_CPU(resp->tags_free);
3379	}
3380
3381	return status;
3382}
3383
3384/**
3385 * i40e_aq_remove_tag - Remove an S- or E-tag
3386 * @hw: pointer to the hw struct
3387 * @vsi_seid: VSI SEID this tag is associated with
3388 * @tag: value of the S-tag to delete
3389 * @tags_used: return value, number of tags in use by this PF
3390 * @tags_free: return value, number of unallocated tags
3391 * @cmd_details: pointer to command details structure or NULL
3392 *
3393 * This deletes an S- or E-tag from a VSI in the switch complex.  It returns
3394 * the number of tags allocated by the PF, and the number of unallocated
3395 * tags available.
3396 **/
3397enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
3398				u16 tag, u16 *tags_used, u16 *tags_free,
3399				struct i40e_asq_cmd_details *cmd_details)
3400{
3401	struct i40e_aq_desc desc;
3402	struct i40e_aqc_remove_tag *cmd =
3403		(struct i40e_aqc_remove_tag *)&desc.params.raw;
3404	struct i40e_aqc_add_remove_tag_completion *resp =
3405		(struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
3406	enum i40e_status_code status;
3407
3408	if (vsi_seid == 0)
3409		return I40E_ERR_PARAM;
3410
3411	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
3412
3413	cmd->seid = CPU_TO_LE16(vsi_seid);
3414	cmd->tag = CPU_TO_LE16(tag);
3415
3416	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3417
3418	if (!status) {
3419		if (tags_used != NULL)
3420			*tags_used = LE16_TO_CPU(resp->tags_used);
3421		if (tags_free != NULL)
3422			*tags_free = LE16_TO_CPU(resp->tags_free);
3423	}
3424
3425	return status;
3426}
3427
3428/**
3429 * i40e_aq_add_mcast_etag - Add a multicast E-tag
3430 * @hw: pointer to the hw struct
3431 * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
3432 * @etag: value of E-tag to add
3433 * @num_tags_in_buf: number of unicast E-tags in indirect buffer
3434 * @buf: address of indirect buffer
3435 * @tags_used: return value, number of E-tags in use by this port
3436 * @tags_free: return value, number of unallocated M-tags
3437 * @cmd_details: pointer to command details structure or NULL
3438 *
3439 * This associates a multicast E-tag to a port virtualizer.  It will return
3440 * the number of tags allocated by the PF, and the number of unallocated
3441 * tags available.
3442 *
3443 * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
3444 * num_tags_in_buf long.
3445 **/
3446enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
3447				u16 etag, u8 num_tags_in_buf, void *buf,
3448				u16 *tags_used, u16 *tags_free,
3449				struct i40e_asq_cmd_details *cmd_details)
3450{
3451	struct i40e_aq_desc desc;
3452	struct i40e_aqc_add_remove_mcast_etag *cmd =
3453		(struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
3454	struct i40e_aqc_add_remove_mcast_etag_completion *resp =
3455	   (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
3456	enum i40e_status_code status;
3457	u16 length = sizeof(u16) * num_tags_in_buf;
3458
3459	if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
3460		return I40E_ERR_PARAM;
3461
3462	i40e_fill_default_direct_cmd_desc(&desc,
3463					  i40e_aqc_opc_add_multicast_etag);
3464
3465	cmd->pv_seid = CPU_TO_LE16(pv_seid);
3466	cmd->etag = CPU_TO_LE16(etag);
3467	cmd->num_unicast_etags = num_tags_in_buf;
3468
3469	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3470	if (length > I40E_AQ_LARGE_BUF)
3471		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3472
3473	status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
3474
3475	if (!status) {
3476		if (tags_used != NULL)
3477			*tags_used = LE16_TO_CPU(resp->mcast_etags_used);
3478		if (tags_free != NULL)
3479			*tags_free = LE16_TO_CPU(resp->mcast_etags_free);
3480	}
3481
3482	return status;
3483}
3484
3485/**
3486 * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
3487 * @hw: pointer to the hw struct
3488 * @pv_seid: Port Virtualizer SEID this M-tag is associated with
3489 * @etag: value of the E-tag to remove
3490 * @tags_used: return value, number of tags in use by this port
3491 * @tags_free: return value, number of unallocated tags
3492 * @cmd_details: pointer to command details structure or NULL
3493 *
3494 * This deletes an E-tag from the port virtualizer.  It will return
3495 * the number of tags allocated by the port, and the number of unallocated
3496 * tags available.
3497 **/
3498enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
3499				u16 etag, u16 *tags_used, u16 *tags_free,
3500				struct i40e_asq_cmd_details *cmd_details)
3501{
3502	struct i40e_aq_desc desc;
3503	struct i40e_aqc_add_remove_mcast_etag *cmd =
3504		(struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
3505	struct i40e_aqc_add_remove_mcast_etag_completion *resp =
3506	   (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
3507	enum i40e_status_code status;
3508
3509
3510	if (pv_seid == 0)
3511		return I40E_ERR_PARAM;
3512
3513	i40e_fill_default_direct_cmd_desc(&desc,
3514					  i40e_aqc_opc_remove_multicast_etag);
3515
3516	cmd->pv_seid = CPU_TO_LE16(pv_seid);
3517	cmd->etag = CPU_TO_LE16(etag);
3518
3519	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3520
3521	if (!status) {
3522		if (tags_used != NULL)
3523			*tags_used = LE16_TO_CPU(resp->mcast_etags_used);
3524		if (tags_free != NULL)
3525			*tags_free = LE16_TO_CPU(resp->mcast_etags_free);
3526	}
3527
3528	return status;
3529}
3530
3531/**
3532 * i40e_aq_update_tag - Update an S/E-tag
3533 * @hw: pointer to the hw struct
3534 * @vsi_seid: VSI SEID using this S-tag
3535 * @old_tag: old tag value
3536 * @new_tag: new tag value
3537 * @tags_used: return value, number of tags in use by this PF
3538 * @tags_free: return value, number of unallocated tags
3539 * @cmd_details: pointer to command details structure or NULL
3540 *
3541 * This updates the value of the tag currently attached to this VSI
3542 * in the switch complex.  It will return the number of tags allocated
3543 * by the PF, and the number of unallocated tags available.
3544 **/
3545enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
3546				u16 old_tag, u16 new_tag, u16 *tags_used,
3547				u16 *tags_free,
3548				struct i40e_asq_cmd_details *cmd_details)
3549{
3550	struct i40e_aq_desc desc;
3551	struct i40e_aqc_update_tag *cmd =
3552		(struct i40e_aqc_update_tag *)&desc.params.raw;
3553	struct i40e_aqc_update_tag_completion *resp =
3554		(struct i40e_aqc_update_tag_completion *)&desc.params.raw;
3555	enum i40e_status_code status;
3556
3557	if (vsi_seid == 0)
3558		return I40E_ERR_PARAM;
3559
3560	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
3561
3562	cmd->seid = CPU_TO_LE16(vsi_seid);
3563	cmd->old_tag = CPU_TO_LE16(old_tag);
3564	cmd->new_tag = CPU_TO_LE16(new_tag);
3565
3566	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3567
3568	if (!status) {
3569		if (tags_used != NULL)
3570			*tags_used = LE16_TO_CPU(resp->tags_used);
3571		if (tags_free != NULL)
3572			*tags_free = LE16_TO_CPU(resp->tags_free);
3573	}
3574
3575	return status;
3576}
3577
3578/**
3579 * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
3580 * @hw: pointer to the hw struct
3581 * @tcmap: TC map for request/release any ignore PFC condition
3582 * @request: request or release ignore PFC condition
3583 * @tcmap_ret: return TCs for which PFC is currently ignored
3584 * @cmd_details: pointer to command details structure or NULL
3585 *
3586 * This sends out request/release to ignore PFC condition for a TC.
3587 * It will return the TCs for which PFC is currently ignored.
3588 **/
3589enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
3590				bool request, u8 *tcmap_ret,
3591				struct i40e_asq_cmd_details *cmd_details)
3592{
3593	struct i40e_aq_desc desc;
3594	struct i40e_aqc_pfc_ignore *cmd_resp =
3595		(struct i40e_aqc_pfc_ignore *)&desc.params.raw;
3596	enum i40e_status_code status;
3597
3598	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
3599
3600	if (request)
3601		cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
3602
3603	cmd_resp->tc_bitmap = tcmap;
3604
3605	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3606
3607	if (!status) {
3608		if (tcmap_ret != NULL)
3609			*tcmap_ret = cmd_resp->tc_bitmap;
3610	}
3611
3612	return status;
3613}
3614
3615/**
3616 * i40e_aq_dcb_updated - DCB Updated Command
3617 * @hw: pointer to the hw struct
3618 * @cmd_details: pointer to command details structure or NULL
3619 *
3620 * When LLDP is handled in PF this command is used by the PF
3621 * to notify EMP that a DCB setting is modified.
3622 * When LLDP is handled in EMP this command is used by the PF
3623 * to notify EMP whenever one of the following parameters get
3624 * modified:
3625 *   - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
3626 *   - PCIRTT in PRTDCB_GENC.PCIRTT
3627 *   - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
3628 * EMP will return when the shared RPB settings have been
3629 * recomputed and modified. The retval field in the descriptor
3630 * will be set to 0 when RPB is modified.
3631 **/
3632enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
3633				struct i40e_asq_cmd_details *cmd_details)
3634{
3635	struct i40e_aq_desc desc;
3636	enum i40e_status_code status;
3637
3638	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
3639
3640	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3641
3642	return status;
3643}
3644
3645/**
3646 * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
3647 * @hw: pointer to the hw struct
3648 * @seid: defines the SEID of the switch for which the stats are requested
3649 * @vlan_id: the VLAN ID for which the statistics are requested
3650 * @stat_index: index of the statistics counters block assigned to this VLAN
3651 * @cmd_details: pointer to command details structure or NULL
3652 *
3653 * XL710 supports 128 smonVlanStats counters.This command is used to
3654 * allocate a set of smonVlanStats counters to a specific VLAN in a specific
3655 * switch.
3656 **/
3657enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
3658				u16 vlan_id, u16 *stat_index,
3659				struct i40e_asq_cmd_details *cmd_details)
3660{
3661	struct i40e_aq_desc desc;
3662	struct i40e_aqc_add_remove_statistics *cmd_resp =
3663		(struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
3664	enum i40e_status_code status;
3665
3666	if ((seid == 0) || (stat_index == NULL))
3667		return I40E_ERR_PARAM;
3668
3669	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
3670
3671	cmd_resp->seid = CPU_TO_LE16(seid);
3672	cmd_resp->vlan = CPU_TO_LE16(vlan_id);
3673
3674	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3675
3676	if (!status)
3677		*stat_index = LE16_TO_CPU(cmd_resp->stat_index);
3678
3679	return status;
3680}
3681
3682/**
3683 * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
3684 * @hw: pointer to the hw struct
3685 * @seid: defines the SEID of the switch for which the stats are requested
3686 * @vlan_id: the VLAN ID for which the statistics are requested
3687 * @stat_index: index of the statistics counters block assigned to this VLAN
3688 * @cmd_details: pointer to command details structure or NULL
3689 *
3690 * XL710 supports 128 smonVlanStats counters.This command is used to
3691 * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
3692 * switch.
3693 **/
3694enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
3695				u16 vlan_id, u16 stat_index,
3696				struct i40e_asq_cmd_details *cmd_details)
3697{
3698	struct i40e_aq_desc desc;
3699	struct i40e_aqc_add_remove_statistics *cmd =
3700		(struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
3701	enum i40e_status_code status;
3702
3703	if (seid == 0)
3704		return I40E_ERR_PARAM;
3705
3706	i40e_fill_default_direct_cmd_desc(&desc,
3707					  i40e_aqc_opc_remove_statistics);
3708
3709	cmd->seid = CPU_TO_LE16(seid);
3710	cmd->vlan  = CPU_TO_LE16(vlan_id);
3711	cmd->stat_index = CPU_TO_LE16(stat_index);
3712
3713	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3714
3715	return status;
3716}
3717
3718/**
3719 * i40e_aq_set_port_parameters - set physical port parameters.
3720 * @hw: pointer to the hw struct
3721 * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
3722 * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
3723 * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
3724 * @double_vlan: if set double VLAN is enabled
3725 * @cmd_details: pointer to command details structure or NULL
3726 **/
3727enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
3728				u16 bad_frame_vsi, bool save_bad_pac,
3729				bool pad_short_pac, bool double_vlan,
3730				struct i40e_asq_cmd_details *cmd_details)
3731{
3732	struct i40e_aqc_set_port_parameters *cmd;
3733	enum i40e_status_code status;
3734	struct i40e_aq_desc desc;
3735	u16 command_flags = 0;
3736
3737	cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
3738
3739	i40e_fill_default_direct_cmd_desc(&desc,
3740					  i40e_aqc_opc_set_port_parameters);
3741
3742	cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
3743	if (save_bad_pac)
3744		command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
3745	if (pad_short_pac)
3746		command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
3747	if (double_vlan)
3748		command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
3749	cmd->command_flags = CPU_TO_LE16(command_flags);
3750
3751	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3752
3753	return status;
3754}
3755
3756/**
3757 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
3758 * @hw: pointer to the hw struct
3759 * @seid: seid for the physical port/switching component/vsi
3760 * @buff: Indirect buffer to hold data parameters and response
3761 * @buff_size: Indirect buffer size
3762 * @opcode: Tx scheduler AQ command opcode
3763 * @cmd_details: pointer to command details structure or NULL
3764 *
3765 * Generic command handler for Tx scheduler AQ commands
3766 **/
3767static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
3768				void *buff, u16 buff_size,
3769				 enum i40e_admin_queue_opc opcode,
3770				struct i40e_asq_cmd_details *cmd_details)
3771{
3772	struct i40e_aq_desc desc;
3773	struct i40e_aqc_tx_sched_ind *cmd =
3774		(struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
3775	enum i40e_status_code status;
3776	bool cmd_param_flag = FALSE;
3777
3778	switch (opcode) {
3779	case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
3780	case i40e_aqc_opc_configure_vsi_tc_bw:
3781	case i40e_aqc_opc_enable_switching_comp_ets:
3782	case i40e_aqc_opc_modify_switching_comp_ets:
3783	case i40e_aqc_opc_disable_switching_comp_ets:
3784	case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
3785	case i40e_aqc_opc_configure_switching_comp_bw_config:
3786		cmd_param_flag = TRUE;
3787		break;
3788	case i40e_aqc_opc_query_vsi_bw_config:
3789	case i40e_aqc_opc_query_vsi_ets_sla_config:
3790	case i40e_aqc_opc_query_switching_comp_ets_config:
3791	case i40e_aqc_opc_query_port_ets_config:
3792	case i40e_aqc_opc_query_switching_comp_bw_config:
3793		cmd_param_flag = FALSE;
3794		break;
3795	default:
3796		return I40E_ERR_PARAM;
3797	}
3798
3799	i40e_fill_default_direct_cmd_desc(&desc, opcode);
3800
3801	/* Indirect command */
3802	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3803	if (cmd_param_flag)
3804		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
3805	if (buff_size > I40E_AQ_LARGE_BUF)
3806		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3807
3808	desc.datalen = CPU_TO_LE16(buff_size);
3809
3810	cmd->vsi_seid = CPU_TO_LE16(seid);
3811
3812	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3813
3814	return status;
3815}
3816
3817/**
3818 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
3819 * @hw: pointer to the hw struct
3820 * @seid: VSI seid
3821 * @credit: BW limit credits (0 = disabled)
3822 * @max_credit: Max BW limit credits
3823 * @cmd_details: pointer to command details structure or NULL
3824 **/
3825enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
3826				u16 seid, u16 credit, u8 max_credit,
3827				struct i40e_asq_cmd_details *cmd_details)
3828{
3829	struct i40e_aq_desc desc;
3830	struct i40e_aqc_configure_vsi_bw_limit *cmd =
3831		(struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
3832	enum i40e_status_code status;
3833
3834	i40e_fill_default_direct_cmd_desc(&desc,
3835					  i40e_aqc_opc_configure_vsi_bw_limit);
3836
3837	cmd->vsi_seid = CPU_TO_LE16(seid);
3838	cmd->credit = CPU_TO_LE16(credit);
3839	cmd->max_credit = max_credit;
3840
3841	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3842
3843	return status;
3844}
3845
3846/**
3847 * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
3848 * @hw: pointer to the hw struct
3849 * @seid: switching component seid
3850 * @credit: BW limit credits (0 = disabled)
3851 * @max_bw: Max BW limit credits
3852 * @cmd_details: pointer to command details structure or NULL
3853 **/
3854enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
3855				u16 seid, u16 credit, u8 max_bw,
3856				struct i40e_asq_cmd_details *cmd_details)
3857{
3858	struct i40e_aq_desc desc;
3859	struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
3860	  (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
3861	enum i40e_status_code status;
3862
3863	i40e_fill_default_direct_cmd_desc(&desc,
3864				i40e_aqc_opc_configure_switching_comp_bw_limit);
3865
3866	cmd->seid = CPU_TO_LE16(seid);
3867	cmd->credit = CPU_TO_LE16(credit);
3868	cmd->max_bw = max_bw;
3869
3870	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3871
3872	return status;
3873}
3874
3875/**
3876 * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
3877 * @hw: pointer to the hw struct
3878 * @seid: VSI seid
3879 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
3880 * @cmd_details: pointer to command details structure or NULL
3881 **/
3882enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
3883			u16 seid,
3884			struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
3885			struct i40e_asq_cmd_details *cmd_details)
3886{
3887	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
3888				    i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
3889				    cmd_details);
3890}
3891
3892/**
3893 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
3894 * @hw: pointer to the hw struct
3895 * @seid: VSI seid
3896 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
3897 * @cmd_details: pointer to command details structure or NULL
3898 **/
3899enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
3900			u16 seid,
3901			struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
3902			struct i40e_asq_cmd_details *cmd_details)
3903{
3904	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
3905				    i40e_aqc_opc_configure_vsi_tc_bw,
3906				    cmd_details);
3907}
3908
3909/**
3910 * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
3911 * @hw: pointer to the hw struct
3912 * @seid: seid of the switching component
3913 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
3914 * @cmd_details: pointer to command details structure or NULL
3915 **/
3916enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
3917	struct i40e_hw *hw, u16 seid,
3918	struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
3919	struct i40e_asq_cmd_details *cmd_details)
3920{
3921	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
3922			    i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
3923			    cmd_details);
3924}
3925
3926/**
3927 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
3928 * @hw: pointer to the hw struct
3929 * @seid: seid of the VSI
3930 * @bw_data: Buffer to hold VSI BW configuration
3931 * @cmd_details: pointer to command details structure or NULL
3932 **/
3933enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
3934			u16 seid,
3935			struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
3936			struct i40e_asq_cmd_details *cmd_details)
3937{
3938	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
3939				    i40e_aqc_opc_query_vsi_bw_config,
3940				    cmd_details);
3941}
3942
3943/**
3944 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
3945 * @hw: pointer to the hw struct
3946 * @seid: seid of the VSI
3947 * @bw_data: Buffer to hold VSI BW configuration per TC
3948 * @cmd_details: pointer to command details structure or NULL
3949 **/
3950enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
3951			u16 seid,
3952			struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
3953			struct i40e_asq_cmd_details *cmd_details)
3954{
3955	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
3956				    i40e_aqc_opc_query_vsi_ets_sla_config,
3957				    cmd_details);
3958}
3959
3960/**
3961 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
3962 * @hw: pointer to the hw struct
3963 * @seid: seid of the switching component
3964 * @bw_data: Buffer to hold switching component's per TC BW config
3965 * @cmd_details: pointer to command details structure or NULL
3966 **/
3967enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
3968		u16 seid,
3969		struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
3970		struct i40e_asq_cmd_details *cmd_details)
3971{
3972	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
3973				   i40e_aqc_opc_query_switching_comp_ets_config,
3974				   cmd_details);
3975}
3976
3977/**
3978 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
3979 * @hw: pointer to the hw struct
3980 * @seid: seid of the VSI or switching component connected to Physical Port
3981 * @bw_data: Buffer to hold current ETS configuration for the Physical Port
3982 * @cmd_details: pointer to command details structure or NULL
3983 **/
3984enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
3985			u16 seid,
3986			struct i40e_aqc_query_port_ets_config_resp *bw_data,
3987			struct i40e_asq_cmd_details *cmd_details)
3988{
3989	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
3990				    i40e_aqc_opc_query_port_ets_config,
3991				    cmd_details);
3992}
3993
3994/**
3995 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
3996 * @hw: pointer to the hw struct
3997 * @seid: seid of the switching component
3998 * @bw_data: Buffer to hold switching component's BW configuration
3999 * @cmd_details: pointer to command details structure or NULL
4000 **/
4001enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
4002		u16 seid,
4003		struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
4004		struct i40e_asq_cmd_details *cmd_details)
4005{
4006	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
4007				    i40e_aqc_opc_query_switching_comp_bw_config,
4008				    cmd_details);
4009}
4010
4011/**
4012 * i40e_validate_filter_settings
4013 * @hw: pointer to the hardware structure
4014 * @settings: Filter control settings
4015 *
4016 * Check and validate the filter control settings passed.
4017 * The function checks for the valid filter/context sizes being
4018 * passed for FCoE and PE.
4019 *
4020 * Returns I40E_SUCCESS if the values passed are valid and within
4021 * range else returns an error.
4022 **/
4023static enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
4024				struct i40e_filter_control_settings *settings)
4025{
4026	u32 fcoe_cntx_size, fcoe_filt_size;
4027	u32 pe_cntx_size, pe_filt_size;
4028	u32 fcoe_fmax;
4029
4030	u32 val;
4031
4032	/* Validate FCoE settings passed */
4033	switch (settings->fcoe_filt_num) {
4034	case I40E_HASH_FILTER_SIZE_1K:
4035	case I40E_HASH_FILTER_SIZE_2K:
4036	case I40E_HASH_FILTER_SIZE_4K:
4037	case I40E_HASH_FILTER_SIZE_8K:
4038	case I40E_HASH_FILTER_SIZE_16K:
4039	case I40E_HASH_FILTER_SIZE_32K:
4040		fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
4041		fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
4042		break;
4043	default:
4044		return I40E_ERR_PARAM;
4045	}
4046
4047	switch (settings->fcoe_cntx_num) {
4048	case I40E_DMA_CNTX_SIZE_512:
4049	case I40E_DMA_CNTX_SIZE_1K:
4050	case I40E_DMA_CNTX_SIZE_2K:
4051	case I40E_DMA_CNTX_SIZE_4K:
4052		fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
4053		fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
4054		break;
4055	default:
4056		return I40E_ERR_PARAM;
4057	}
4058
4059	/* Validate PE settings passed */
4060	switch (settings->pe_filt_num) {
4061	case I40E_HASH_FILTER_SIZE_1K:
4062	case I40E_HASH_FILTER_SIZE_2K:
4063	case I40E_HASH_FILTER_SIZE_4K:
4064	case I40E_HASH_FILTER_SIZE_8K:
4065	case I40E_HASH_FILTER_SIZE_16K:
4066	case I40E_HASH_FILTER_SIZE_32K:
4067	case I40E_HASH_FILTER_SIZE_64K:
4068	case I40E_HASH_FILTER_SIZE_128K:
4069	case I40E_HASH_FILTER_SIZE_256K:
4070	case I40E_HASH_FILTER_SIZE_512K:
4071	case I40E_HASH_FILTER_SIZE_1M:
4072		pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
4073		pe_filt_size <<= (u32)settings->pe_filt_num;
4074		break;
4075	default:
4076		return I40E_ERR_PARAM;
4077	}
4078
4079	switch (settings->pe_cntx_num) {
4080	case I40E_DMA_CNTX_SIZE_512:
4081	case I40E_DMA_CNTX_SIZE_1K:
4082	case I40E_DMA_CNTX_SIZE_2K:
4083	case I40E_DMA_CNTX_SIZE_4K:
4084	case I40E_DMA_CNTX_SIZE_8K:
4085	case I40E_DMA_CNTX_SIZE_16K:
4086	case I40E_DMA_CNTX_SIZE_32K:
4087	case I40E_DMA_CNTX_SIZE_64K:
4088	case I40E_DMA_CNTX_SIZE_128K:
4089	case I40E_DMA_CNTX_SIZE_256K:
4090		pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
4091		pe_cntx_size <<= (u32)settings->pe_cntx_num;
4092		break;
4093	default:
4094		return I40E_ERR_PARAM;
4095	}
4096
4097	/* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
4098	val = rd32(hw, I40E_GLHMC_FCOEFMAX);
4099	fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
4100		     >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
4101	if (fcoe_filt_size + fcoe_cntx_size >  fcoe_fmax)
4102		return I40E_ERR_INVALID_SIZE;
4103
4104	return I40E_SUCCESS;
4105}
4106
4107/**
4108 * i40e_set_filter_control
4109 * @hw: pointer to the hardware structure
4110 * @settings: Filter control settings
4111 *
4112 * Set the Queue Filters for PE/FCoE and enable filters required
4113 * for a single PF. It is expected that these settings are programmed
4114 * at the driver initialization time.
4115 **/
4116enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
4117				struct i40e_filter_control_settings *settings)
4118{
4119	enum i40e_status_code ret = I40E_SUCCESS;
4120	u32 hash_lut_size = 0;
4121	u32 val;
4122
4123	if (!settings)
4124		return I40E_ERR_PARAM;
4125
4126	/* Validate the input settings */
4127	ret = i40e_validate_filter_settings(hw, settings);
4128	if (ret)
4129		return ret;
4130
4131	/* Read the PF Queue Filter control register */
4132	val = rd32(hw, I40E_PFQF_CTL_0);
4133
4134	/* Program required PE hash buckets for the PF */
4135	val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
4136	val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
4137		I40E_PFQF_CTL_0_PEHSIZE_MASK;
4138	/* Program required PE contexts for the PF */
4139	val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
4140	val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
4141		I40E_PFQF_CTL_0_PEDSIZE_MASK;
4142
4143	/* Program required FCoE hash buckets for the PF */
4144	val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
4145	val |= ((u32)settings->fcoe_filt_num <<
4146			I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
4147		I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
4148	/* Program required FCoE DDP contexts for the PF */
4149	val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
4150	val |= ((u32)settings->fcoe_cntx_num <<
4151			I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
4152		I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
4153
4154	/* Program Hash LUT size for the PF */
4155	val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
4156	if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
4157		hash_lut_size = 1;
4158	val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
4159		I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
4160
4161	/* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
4162	if (settings->enable_fdir)
4163		val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
4164	if (settings->enable_ethtype)
4165		val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
4166	if (settings->enable_macvlan)
4167		val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
4168
4169	wr32(hw, I40E_PFQF_CTL_0, val);
4170
4171	return I40E_SUCCESS;
4172}
4173
4174/**
4175 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
4176 * @hw: pointer to the hw struct
4177 * @mac_addr: MAC address to use in the filter
4178 * @ethtype: Ethertype to use in the filter
4179 * @flags: Flags that needs to be applied to the filter
4180 * @vsi_seid: seid of the control VSI
4181 * @queue: VSI queue number to send the packet to
4182 * @is_add: Add control packet filter if True else remove
4183 * @stats: Structure to hold information on control filter counts
4184 * @cmd_details: pointer to command details structure or NULL
4185 *
4186 * This command will Add or Remove control packet filter for a control VSI.
4187 * In return it will update the total number of perfect filter count in
4188 * the stats member.
4189 **/
4190enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
4191				u8 *mac_addr, u16 ethtype, u16 flags,
4192				u16 vsi_seid, u16 queue, bool is_add,
4193				struct i40e_control_filter_stats *stats,
4194				struct i40e_asq_cmd_details *cmd_details)
4195{
4196	struct i40e_aq_desc desc;
4197	struct i40e_aqc_add_remove_control_packet_filter *cmd =
4198		(struct i40e_aqc_add_remove_control_packet_filter *)
4199		&desc.params.raw;
4200	struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
4201		(struct i40e_aqc_add_remove_control_packet_filter_completion *)
4202		&desc.params.raw;
4203	enum i40e_status_code status;
4204
4205	if (vsi_seid == 0)
4206		return I40E_ERR_PARAM;
4207
4208	if (is_add) {
4209		i40e_fill_default_direct_cmd_desc(&desc,
4210				i40e_aqc_opc_add_control_packet_filter);
4211		cmd->queue = CPU_TO_LE16(queue);
4212	} else {
4213		i40e_fill_default_direct_cmd_desc(&desc,
4214				i40e_aqc_opc_remove_control_packet_filter);
4215	}
4216
4217	if (mac_addr)
4218		i40e_memcpy(cmd->mac, mac_addr, I40E_ETH_LENGTH_OF_ADDRESS,
4219			    I40E_NONDMA_TO_NONDMA);
4220
4221	cmd->etype = CPU_TO_LE16(ethtype);
4222	cmd->flags = CPU_TO_LE16(flags);
4223	cmd->seid = CPU_TO_LE16(vsi_seid);
4224
4225	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4226
4227	if (!status && stats) {
4228		stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
4229		stats->etype_used = LE16_TO_CPU(resp->etype_used);
4230		stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
4231		stats->etype_free = LE16_TO_CPU(resp->etype_free);
4232	}
4233
4234	return status;
4235}
4236
4237/**
4238 * i40e_aq_add_cloud_filters
4239 * @hw: pointer to the hardware structure
4240 * @seid: VSI seid to add cloud filters from
4241 * @filters: Buffer which contains the filters to be added
4242 * @filter_count: number of filters contained in the buffer
4243 *
4244 * Set the cloud filters for a given VSI.  The contents of the
4245 * i40e_aqc_add_remove_cloud_filters_element_data are filled
4246 * in by the caller of the function.
4247 *
4248 **/
4249enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
4250	u16 seid,
4251	struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
4252	u8 filter_count)
4253{
4254	struct i40e_aq_desc desc;
4255	struct i40e_aqc_add_remove_cloud_filters *cmd =
4256	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
4257	u16 buff_len;
4258	enum i40e_status_code status;
4259
4260	i40e_fill_default_direct_cmd_desc(&desc,
4261					  i40e_aqc_opc_add_cloud_filters);
4262
4263	buff_len = sizeof(struct i40e_aqc_add_remove_cloud_filters_element_data) *
4264			  filter_count;
4265	desc.datalen = CPU_TO_LE16(buff_len);
4266	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4267	cmd->num_filters = filter_count;
4268	cmd->seid = CPU_TO_LE16(seid);
4269
4270	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
4271
4272	return status;
4273}
4274
4275/**
4276 * i40e_aq_remove_cloud_filters
4277 * @hw: pointer to the hardware structure
4278 * @seid: VSI seid to remove cloud filters from
4279 * @filters: Buffer which contains the filters to be removed
4280 * @filter_count: number of filters contained in the buffer
4281 *
4282 * Remove the cloud filters for a given VSI.  The contents of the
4283 * i40e_aqc_add_remove_cloud_filters_element_data are filled
4284 * in by the caller of the function.
4285 *
4286 **/
4287enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
4288		u16 seid,
4289		struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
4290		u8 filter_count)
4291{
4292	struct i40e_aq_desc desc;
4293	struct i40e_aqc_add_remove_cloud_filters *cmd =
4294	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
4295	enum i40e_status_code status;
4296	u16 buff_len;
4297
4298	i40e_fill_default_direct_cmd_desc(&desc,
4299					  i40e_aqc_opc_remove_cloud_filters);
4300
4301	buff_len = sizeof(struct i40e_aqc_add_remove_cloud_filters_element_data) *
4302		filter_count;
4303	desc.datalen = CPU_TO_LE16(buff_len);
4304	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4305	cmd->num_filters = filter_count;
4306	cmd->seid = CPU_TO_LE16(seid);
4307
4308	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
4309
4310	return status;
4311}
4312
4313/**
4314 * i40e_aq_alternate_write
4315 * @hw: pointer to the hardware structure
4316 * @reg_addr0: address of first dword to be read
4317 * @reg_val0: value to be written under 'reg_addr0'
4318 * @reg_addr1: address of second dword to be read
4319 * @reg_val1: value to be written under 'reg_addr1'
4320 *
4321 * Write one or two dwords to alternate structure. Fields are indicated
4322 * by 'reg_addr0' and 'reg_addr1' register numbers.
4323 *
4324 **/
4325enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
4326				u32 reg_addr0, u32 reg_val0,
4327				u32 reg_addr1, u32 reg_val1)
4328{
4329	struct i40e_aq_desc desc;
4330	struct i40e_aqc_alternate_write *cmd_resp =
4331		(struct i40e_aqc_alternate_write *)&desc.params.raw;
4332	enum i40e_status_code status;
4333
4334	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
4335	cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
4336	cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
4337	cmd_resp->data0 = CPU_TO_LE32(reg_val0);
4338	cmd_resp->data1 = CPU_TO_LE32(reg_val1);
4339
4340	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4341
4342	return status;
4343}
4344
4345/**
4346 * i40e_aq_alternate_write_indirect
4347 * @hw: pointer to the hardware structure
4348 * @addr: address of a first register to be modified
4349 * @dw_count: number of alternate structure fields to write
4350 * @buffer: pointer to the command buffer
4351 *
4352 * Write 'dw_count' dwords from 'buffer' to alternate structure
4353 * starting at 'addr'.
4354 *
4355 **/
4356enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
4357				u32 addr, u32 dw_count, void *buffer)
4358{
4359	struct i40e_aq_desc desc;
4360	struct i40e_aqc_alternate_ind_write *cmd_resp =
4361		(struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
4362	enum i40e_status_code status;
4363
4364	if (buffer == NULL)
4365		return I40E_ERR_PARAM;
4366
4367	/* Indirect command */
4368	i40e_fill_default_direct_cmd_desc(&desc,
4369					 i40e_aqc_opc_alternate_write_indirect);
4370
4371	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
4372	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
4373	if (dw_count > (I40E_AQ_LARGE_BUF/4))
4374		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4375
4376	cmd_resp->address = CPU_TO_LE32(addr);
4377	cmd_resp->length = CPU_TO_LE32(dw_count);
4378	cmd_resp->addr_high = CPU_TO_LE32(I40E_HI_WORD((u64)buffer));
4379	cmd_resp->addr_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buffer));
4380
4381	status = i40e_asq_send_command(hw, &desc, buffer,
4382				       I40E_LO_DWORD(4*dw_count), NULL);
4383
4384	return status;
4385}
4386
4387/**
4388 * i40e_aq_alternate_read
4389 * @hw: pointer to the hardware structure
4390 * @reg_addr0: address of first dword to be read
4391 * @reg_val0: pointer for data read from 'reg_addr0'
4392 * @reg_addr1: address of second dword to be read
4393 * @reg_val1: pointer for data read from 'reg_addr1'
4394 *
4395 * Read one or two dwords from alternate structure. Fields are indicated
4396 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
4397 * is not passed then only register at 'reg_addr0' is read.
4398 *
4399 **/
4400enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
4401				u32 reg_addr0, u32 *reg_val0,
4402				u32 reg_addr1, u32 *reg_val1)
4403{
4404	struct i40e_aq_desc desc;
4405	struct i40e_aqc_alternate_write *cmd_resp =
4406		(struct i40e_aqc_alternate_write *)&desc.params.raw;
4407	enum i40e_status_code status;
4408
4409	if (reg_val0 == NULL)
4410		return I40E_ERR_PARAM;
4411
4412	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
4413	cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
4414	cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
4415
4416	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4417
4418	if (status == I40E_SUCCESS) {
4419		*reg_val0 = LE32_TO_CPU(cmd_resp->data0);
4420
4421		if (reg_val1 != NULL)
4422			*reg_val1 = LE32_TO_CPU(cmd_resp->data1);
4423	}
4424
4425	return status;
4426}
4427
4428/**
4429 * i40e_aq_alternate_read_indirect
4430 * @hw: pointer to the hardware structure
4431 * @addr: address of the alternate structure field
4432 * @dw_count: number of alternate structure fields to read
4433 * @buffer: pointer to the command buffer
4434 *
4435 * Read 'dw_count' dwords from alternate structure starting at 'addr' and
4436 * place them in 'buffer'. The buffer should be allocated by caller.
4437 *
4438 **/
4439enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
4440				u32 addr, u32 dw_count, void *buffer)
4441{
4442	struct i40e_aq_desc desc;
4443	struct i40e_aqc_alternate_ind_write *cmd_resp =
4444		(struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
4445	enum i40e_status_code status;
4446
4447	if (buffer == NULL)
4448		return I40E_ERR_PARAM;
4449
4450	/* Indirect command */
4451	i40e_fill_default_direct_cmd_desc(&desc,
4452		i40e_aqc_opc_alternate_read_indirect);
4453
4454	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
4455	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
4456	if (dw_count > (I40E_AQ_LARGE_BUF/4))
4457		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4458
4459	cmd_resp->address = CPU_TO_LE32(addr);
4460	cmd_resp->length = CPU_TO_LE32(dw_count);
4461	cmd_resp->addr_high = CPU_TO_LE32(I40E_HI_DWORD((u64)buffer));
4462	cmd_resp->addr_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buffer));
4463
4464	status = i40e_asq_send_command(hw, &desc, buffer,
4465				       I40E_LO_DWORD(4*dw_count), NULL);
4466
4467	return status;
4468}
4469
4470/**
4471 *  i40e_aq_alternate_clear
4472 *  @hw: pointer to the HW structure.
4473 *
4474 *  Clear the alternate structures of the port from which the function
4475 *  is called.
4476 *
4477 **/
4478enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
4479{
4480	struct i40e_aq_desc desc;
4481	enum i40e_status_code status;
4482
4483	i40e_fill_default_direct_cmd_desc(&desc,
4484					  i40e_aqc_opc_alternate_clear_port);
4485
4486	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4487
4488	return status;
4489}
4490
4491/**
4492 *  i40e_aq_alternate_write_done
4493 *  @hw: pointer to the HW structure.
4494 *  @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
4495 *  @reset_needed: indicates the SW should trigger GLOBAL reset
4496 *
4497 *  Indicates to the FW that alternate structures have been changed.
4498 *
4499 **/
4500enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
4501		u8 bios_mode, bool *reset_needed)
4502{
4503	struct i40e_aq_desc desc;
4504	struct i40e_aqc_alternate_write_done *cmd =
4505		(struct i40e_aqc_alternate_write_done *)&desc.params.raw;
4506	enum i40e_status_code status;
4507
4508	if (reset_needed == NULL)
4509		return I40E_ERR_PARAM;
4510
4511	i40e_fill_default_direct_cmd_desc(&desc,
4512					  i40e_aqc_opc_alternate_write_done);
4513
4514	cmd->cmd_flags = CPU_TO_LE16(bios_mode);
4515
4516	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4517	if (!status)
4518		*reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
4519				 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
4520
4521	return status;
4522}
4523
4524/**
4525 *  i40e_aq_set_oem_mode
4526 *  @hw: pointer to the HW structure.
4527 *  @oem_mode: the OEM mode to be used
4528 *
4529 *  Sets the device to a specific operating mode. Currently the only supported
4530 *  mode is no_clp, which causes FW to refrain from using Alternate RAM.
4531 *
4532 **/
4533enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
4534		u8 oem_mode)
4535{
4536	struct i40e_aq_desc desc;
4537	struct i40e_aqc_alternate_write_done *cmd =
4538		(struct i40e_aqc_alternate_write_done *)&desc.params.raw;
4539	enum i40e_status_code status;
4540
4541	i40e_fill_default_direct_cmd_desc(&desc,
4542					  i40e_aqc_opc_alternate_set_mode);
4543
4544	cmd->cmd_flags = CPU_TO_LE16(oem_mode);
4545
4546	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4547
4548	return status;
4549}
4550
4551/**
4552 * i40e_aq_resume_port_tx
4553 * @hw: pointer to the hardware structure
4554 * @cmd_details: pointer to command details structure or NULL
4555 *
4556 * Resume port's Tx traffic
4557 **/
4558enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
4559				struct i40e_asq_cmd_details *cmd_details)
4560{
4561	struct i40e_aq_desc desc;
4562	enum i40e_status_code status;
4563
4564	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
4565
4566	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4567
4568	return status;
4569}
4570
4571/**
4572 * i40e_set_pci_config_data - store PCI bus info
4573 * @hw: pointer to hardware structure
4574 * @link_status: the link status word from PCI config space
4575 *
4576 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
4577 **/
4578void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
4579{
4580	hw->bus.type = i40e_bus_type_pci_express;
4581
4582	switch (link_status & I40E_PCI_LINK_WIDTH) {
4583	case I40E_PCI_LINK_WIDTH_1:
4584		hw->bus.width = i40e_bus_width_pcie_x1;
4585		break;
4586	case I40E_PCI_LINK_WIDTH_2:
4587		hw->bus.width = i40e_bus_width_pcie_x2;
4588		break;
4589	case I40E_PCI_LINK_WIDTH_4:
4590		hw->bus.width = i40e_bus_width_pcie_x4;
4591		break;
4592	case I40E_PCI_LINK_WIDTH_8:
4593		hw->bus.width = i40e_bus_width_pcie_x8;
4594		break;
4595	default:
4596		hw->bus.width = i40e_bus_width_unknown;
4597		break;
4598	}
4599
4600	switch (link_status & I40E_PCI_LINK_SPEED) {
4601	case I40E_PCI_LINK_SPEED_2500:
4602		hw->bus.speed = i40e_bus_speed_2500;
4603		break;
4604	case I40E_PCI_LINK_SPEED_5000:
4605		hw->bus.speed = i40e_bus_speed_5000;
4606		break;
4607	case I40E_PCI_LINK_SPEED_8000:
4608		hw->bus.speed = i40e_bus_speed_8000;
4609		break;
4610	default:
4611		hw->bus.speed = i40e_bus_speed_unknown;
4612		break;
4613	}
4614}
4615
4616/**
4617 * i40e_read_bw_from_alt_ram
4618 * @hw: pointer to the hardware structure
4619 * @max_bw: pointer for max_bw read
4620 * @min_bw: pointer for min_bw read
4621 * @min_valid: pointer for bool that is TRUE if min_bw is a valid value
4622 * @max_valid: pointer for bool that is TRUE if max_bw is a valid value
4623 *
4624 * Read bw from the alternate ram for the given pf
4625 **/
4626enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
4627					u32 *max_bw, u32 *min_bw,
4628					bool *min_valid, bool *max_valid)
4629{
4630	enum i40e_status_code status;
4631	u32 max_bw_addr, min_bw_addr;
4632
4633	/* Calculate the address of the min/max bw registers */
4634	max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
4635		I40E_ALT_STRUCT_MAX_BW_OFFSET +
4636		(I40E_ALT_STRUCT_DWORDS_PER_PF*hw->pf_id);
4637	min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
4638		I40E_ALT_STRUCT_MIN_BW_OFFSET +
4639		(I40E_ALT_STRUCT_DWORDS_PER_PF*hw->pf_id);
4640
4641	/* Read the bandwidths from alt ram */
4642	status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
4643					min_bw_addr, min_bw);
4644
4645	if (*min_bw & I40E_ALT_BW_VALID_MASK)
4646		*min_valid = TRUE;
4647	else
4648		*min_valid = FALSE;
4649
4650	if (*max_bw & I40E_ALT_BW_VALID_MASK)
4651		*max_valid = TRUE;
4652	else
4653		*max_valid = FALSE;
4654
4655	return status;
4656}
4657
4658/**
4659 * i40e_aq_configure_partition_bw
4660 * @hw: pointer to the hardware structure
4661 * @bw_data: Buffer holding valid pfs and bw limits
4662 * @cmd_details: pointer to command details
4663 *
4664 * Configure partitions guaranteed/max bw
4665 **/
4666enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
4667			struct i40e_aqc_configure_partition_bw_data *bw_data,
4668			struct i40e_asq_cmd_details *cmd_details)
4669{
4670	enum i40e_status_code status;
4671	struct i40e_aq_desc desc;
4672	u16 bwd_size = sizeof(struct i40e_aqc_configure_partition_bw_data);
4673
4674	i40e_fill_default_direct_cmd_desc(&desc,
4675				i40e_aqc_opc_configure_partition_bw);
4676
4677	/* Indirect command */
4678	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4679	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
4680
4681	if (bwd_size > I40E_AQ_LARGE_BUF)
4682		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4683
4684	desc.datalen = CPU_TO_LE16(bwd_size);
4685
4686	status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
4687
4688	return status;
4689}
4690
4691/**
4692 * i40e_aq_send_msg_to_pf
4693 * @hw: pointer to the hardware structure
4694 * @v_opcode: opcodes for VF-PF communication
4695 * @v_retval: return error code
4696 * @msg: pointer to the msg buffer
4697 * @msglen: msg length
4698 * @cmd_details: pointer to command details
4699 *
4700 * Send message to PF driver using admin queue. By default, this message
4701 * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for
4702 * completion before returning.
4703 **/
4704enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
4705				enum i40e_virtchnl_ops v_opcode,
4706				enum i40e_status_code v_retval,
4707				u8 *msg, u16 msglen,
4708				struct i40e_asq_cmd_details *cmd_details)
4709{
4710	struct i40e_aq_desc desc;
4711	struct i40e_asq_cmd_details details;
4712	enum i40e_status_code status;
4713
4714	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
4715	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
4716	desc.cookie_high = CPU_TO_LE32(v_opcode);
4717	desc.cookie_low = CPU_TO_LE32(v_retval);
4718	if (msglen) {
4719		desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF
4720						| I40E_AQ_FLAG_RD));
4721		if (msglen > I40E_AQ_LARGE_BUF)
4722			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4723		desc.datalen = CPU_TO_LE16(msglen);
4724	}
4725	if (!cmd_details) {
4726		i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM);
4727		details.async = TRUE;
4728		cmd_details = &details;
4729	}
4730	status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg,
4731				       msglen, cmd_details);
4732	return status;
4733}
4734
4735/**
4736 * i40e_vf_parse_hw_config
4737 * @hw: pointer to the hardware structure
4738 * @msg: pointer to the virtual channel VF resource structure
4739 *
4740 * Given a VF resource message from the PF, populate the hw struct
4741 * with appropriate information.
4742 **/
4743void i40e_vf_parse_hw_config(struct i40e_hw *hw,
4744			     struct i40e_virtchnl_vf_resource *msg)
4745{
4746	struct i40e_virtchnl_vsi_resource *vsi_res;
4747	int i;
4748
4749	vsi_res = &msg->vsi_res[0];
4750
4751	hw->dev_caps.num_vsis = msg->num_vsis;
4752	hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
4753	hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
4754	hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
4755	hw->dev_caps.dcb = msg->vf_offload_flags &
4756			   I40E_VIRTCHNL_VF_OFFLOAD_L2;
4757	hw->dev_caps.fcoe = (msg->vf_offload_flags &
4758			     I40E_VIRTCHNL_VF_OFFLOAD_FCOE) ? 1 : 0;
4759	hw->dev_caps.iwarp = (msg->vf_offload_flags &
4760			      I40E_VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0;
4761	for (i = 0; i < msg->num_vsis; i++) {
4762		if (vsi_res->vsi_type == I40E_VSI_SRIOV) {
4763			i40e_memcpy(hw->mac.perm_addr,
4764				    vsi_res->default_mac_addr,
4765				    I40E_ETH_LENGTH_OF_ADDRESS,
4766				    I40E_NONDMA_TO_NONDMA);
4767			i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
4768				    I40E_ETH_LENGTH_OF_ADDRESS,
4769				    I40E_NONDMA_TO_NONDMA);
4770		}
4771		vsi_res++;
4772	}
4773}
4774
4775/**
4776 * i40e_vf_reset
4777 * @hw: pointer to the hardware structure
4778 *
4779 * Send a VF_RESET message to the PF. Does not wait for response from PF
4780 * as none will be forthcoming. Immediately after calling this function,
4781 * the admin queue should be shut down and (optionally) reinitialized.
4782 **/
4783enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw)
4784{
4785	return i40e_aq_send_msg_to_pf(hw, I40E_VIRTCHNL_OP_RESET_VF,
4786				      I40E_SUCCESS, NULL, 0, NULL);
4787}
4788