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