xref: /freebsd/sys/dev/ixl/i40e_common.c (revision 18054d0220cfc8df9c9568c437bd6fbb59d53c3c)
1 /******************************************************************************
2 
3   Copyright (c) 2013-2018, 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 "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_B:
59 		case I40E_DEV_ID_KX_C:
60 		case I40E_DEV_ID_QSFP_A:
61 		case I40E_DEV_ID_QSFP_B:
62 		case I40E_DEV_ID_QSFP_C:
63 		case I40E_DEV_ID_10G_BASE_T:
64 		case I40E_DEV_ID_10G_BASE_T4:
65 		case I40E_DEV_ID_10G_BASE_T_BC:
66 		case I40E_DEV_ID_10G_B:
67 		case I40E_DEV_ID_10G_SFP:
68 		case I40E_DEV_ID_5G_BASE_T_BC:
69 		case I40E_DEV_ID_1G_BASE_T_BC:
70 		case I40E_DEV_ID_20G_KR2:
71 		case I40E_DEV_ID_20G_KR2_A:
72 		case I40E_DEV_ID_25G_B:
73 		case I40E_DEV_ID_25G_SFP28:
74 		case I40E_DEV_ID_X710_N3000:
75 		case I40E_DEV_ID_XXV710_N3000:
76 			hw->mac.type = I40E_MAC_XL710;
77 			break;
78 		case I40E_DEV_ID_KX_X722:
79 		case I40E_DEV_ID_QSFP_X722:
80 		case I40E_DEV_ID_SFP_X722:
81 		case I40E_DEV_ID_1G_BASE_T_X722:
82 		case I40E_DEV_ID_10G_BASE_T_X722:
83 		case I40E_DEV_ID_SFP_I_X722:
84 			hw->mac.type = I40E_MAC_X722;
85 			break;
86 		case I40E_DEV_ID_X722_VF:
87 			hw->mac.type = I40E_MAC_X722_VF;
88 			break;
89 		case I40E_DEV_ID_VF:
90 		case I40E_DEV_ID_VF_HV:
91 		case I40E_DEV_ID_ADAPTIVE_VF:
92 			hw->mac.type = I40E_MAC_VF;
93 			break;
94 		default:
95 			hw->mac.type = I40E_MAC_GENERIC;
96 			break;
97 		}
98 	} else {
99 		status = I40E_ERR_DEVICE_NOT_SUPPORTED;
100 	}
101 
102 	DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n",
103 		  hw->mac.type, status);
104 	return status;
105 }
106 
107 /**
108  * i40e_aq_str - convert AQ err code to a string
109  * @hw: pointer to the HW structure
110  * @aq_err: the AQ error code to convert
111  **/
112 const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err)
113 {
114 	switch (aq_err) {
115 	case I40E_AQ_RC_OK:
116 		return "OK";
117 	case I40E_AQ_RC_EPERM:
118 		return "I40E_AQ_RC_EPERM";
119 	case I40E_AQ_RC_ENOENT:
120 		return "I40E_AQ_RC_ENOENT";
121 	case I40E_AQ_RC_ESRCH:
122 		return "I40E_AQ_RC_ESRCH";
123 	case I40E_AQ_RC_EINTR:
124 		return "I40E_AQ_RC_EINTR";
125 	case I40E_AQ_RC_EIO:
126 		return "I40E_AQ_RC_EIO";
127 	case I40E_AQ_RC_ENXIO:
128 		return "I40E_AQ_RC_ENXIO";
129 	case I40E_AQ_RC_E2BIG:
130 		return "I40E_AQ_RC_E2BIG";
131 	case I40E_AQ_RC_EAGAIN:
132 		return "I40E_AQ_RC_EAGAIN";
133 	case I40E_AQ_RC_ENOMEM:
134 		return "I40E_AQ_RC_ENOMEM";
135 	case I40E_AQ_RC_EACCES:
136 		return "I40E_AQ_RC_EACCES";
137 	case I40E_AQ_RC_EFAULT:
138 		return "I40E_AQ_RC_EFAULT";
139 	case I40E_AQ_RC_EBUSY:
140 		return "I40E_AQ_RC_EBUSY";
141 	case I40E_AQ_RC_EEXIST:
142 		return "I40E_AQ_RC_EEXIST";
143 	case I40E_AQ_RC_EINVAL:
144 		return "I40E_AQ_RC_EINVAL";
145 	case I40E_AQ_RC_ENOTTY:
146 		return "I40E_AQ_RC_ENOTTY";
147 	case I40E_AQ_RC_ENOSPC:
148 		return "I40E_AQ_RC_ENOSPC";
149 	case I40E_AQ_RC_ENOSYS:
150 		return "I40E_AQ_RC_ENOSYS";
151 	case I40E_AQ_RC_ERANGE:
152 		return "I40E_AQ_RC_ERANGE";
153 	case I40E_AQ_RC_EFLUSHED:
154 		return "I40E_AQ_RC_EFLUSHED";
155 	case I40E_AQ_RC_BAD_ADDR:
156 		return "I40E_AQ_RC_BAD_ADDR";
157 	case I40E_AQ_RC_EMODE:
158 		return "I40E_AQ_RC_EMODE";
159 	case I40E_AQ_RC_EFBIG:
160 		return "I40E_AQ_RC_EFBIG";
161 	}
162 
163 	snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
164 	return hw->err_str;
165 }
166 
167 /**
168  * i40e_stat_str - convert status err code to a string
169  * @hw: pointer to the HW structure
170  * @stat_err: the status error code to convert
171  **/
172 const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err)
173 {
174 	switch (stat_err) {
175 	case I40E_SUCCESS:
176 		return "OK";
177 	case I40E_ERR_NVM:
178 		return "I40E_ERR_NVM";
179 	case I40E_ERR_NVM_CHECKSUM:
180 		return "I40E_ERR_NVM_CHECKSUM";
181 	case I40E_ERR_PHY:
182 		return "I40E_ERR_PHY";
183 	case I40E_ERR_CONFIG:
184 		return "I40E_ERR_CONFIG";
185 	case I40E_ERR_PARAM:
186 		return "I40E_ERR_PARAM";
187 	case I40E_ERR_MAC_TYPE:
188 		return "I40E_ERR_MAC_TYPE";
189 	case I40E_ERR_UNKNOWN_PHY:
190 		return "I40E_ERR_UNKNOWN_PHY";
191 	case I40E_ERR_LINK_SETUP:
192 		return "I40E_ERR_LINK_SETUP";
193 	case I40E_ERR_ADAPTER_STOPPED:
194 		return "I40E_ERR_ADAPTER_STOPPED";
195 	case I40E_ERR_INVALID_MAC_ADDR:
196 		return "I40E_ERR_INVALID_MAC_ADDR";
197 	case I40E_ERR_DEVICE_NOT_SUPPORTED:
198 		return "I40E_ERR_DEVICE_NOT_SUPPORTED";
199 	case I40E_ERR_PRIMARY_REQUESTS_PENDING:
200 		return "I40E_ERR_PRIMARY_REQUESTS_PENDING";
201 	case I40E_ERR_INVALID_LINK_SETTINGS:
202 		return "I40E_ERR_INVALID_LINK_SETTINGS";
203 	case I40E_ERR_AUTONEG_NOT_COMPLETE:
204 		return "I40E_ERR_AUTONEG_NOT_COMPLETE";
205 	case I40E_ERR_RESET_FAILED:
206 		return "I40E_ERR_RESET_FAILED";
207 	case I40E_ERR_SWFW_SYNC:
208 		return "I40E_ERR_SWFW_SYNC";
209 	case I40E_ERR_NO_AVAILABLE_VSI:
210 		return "I40E_ERR_NO_AVAILABLE_VSI";
211 	case I40E_ERR_NO_MEMORY:
212 		return "I40E_ERR_NO_MEMORY";
213 	case I40E_ERR_BAD_PTR:
214 		return "I40E_ERR_BAD_PTR";
215 	case I40E_ERR_RING_FULL:
216 		return "I40E_ERR_RING_FULL";
217 	case I40E_ERR_INVALID_PD_ID:
218 		return "I40E_ERR_INVALID_PD_ID";
219 	case I40E_ERR_INVALID_QP_ID:
220 		return "I40E_ERR_INVALID_QP_ID";
221 	case I40E_ERR_INVALID_CQ_ID:
222 		return "I40E_ERR_INVALID_CQ_ID";
223 	case I40E_ERR_INVALID_CEQ_ID:
224 		return "I40E_ERR_INVALID_CEQ_ID";
225 	case I40E_ERR_INVALID_AEQ_ID:
226 		return "I40E_ERR_INVALID_AEQ_ID";
227 	case I40E_ERR_INVALID_SIZE:
228 		return "I40E_ERR_INVALID_SIZE";
229 	case I40E_ERR_INVALID_ARP_INDEX:
230 		return "I40E_ERR_INVALID_ARP_INDEX";
231 	case I40E_ERR_INVALID_FPM_FUNC_ID:
232 		return "I40E_ERR_INVALID_FPM_FUNC_ID";
233 	case I40E_ERR_QP_INVALID_MSG_SIZE:
234 		return "I40E_ERR_QP_INVALID_MSG_SIZE";
235 	case I40E_ERR_QP_TOOMANY_WRS_POSTED:
236 		return "I40E_ERR_QP_TOOMANY_WRS_POSTED";
237 	case I40E_ERR_INVALID_FRAG_COUNT:
238 		return "I40E_ERR_INVALID_FRAG_COUNT";
239 	case I40E_ERR_QUEUE_EMPTY:
240 		return "I40E_ERR_QUEUE_EMPTY";
241 	case I40E_ERR_INVALID_ALIGNMENT:
242 		return "I40E_ERR_INVALID_ALIGNMENT";
243 	case I40E_ERR_FLUSHED_QUEUE:
244 		return "I40E_ERR_FLUSHED_QUEUE";
245 	case I40E_ERR_INVALID_PUSH_PAGE_INDEX:
246 		return "I40E_ERR_INVALID_PUSH_PAGE_INDEX";
247 	case I40E_ERR_INVALID_IMM_DATA_SIZE:
248 		return "I40E_ERR_INVALID_IMM_DATA_SIZE";
249 	case I40E_ERR_TIMEOUT:
250 		return "I40E_ERR_TIMEOUT";
251 	case I40E_ERR_OPCODE_MISMATCH:
252 		return "I40E_ERR_OPCODE_MISMATCH";
253 	case I40E_ERR_CQP_COMPL_ERROR:
254 		return "I40E_ERR_CQP_COMPL_ERROR";
255 	case I40E_ERR_INVALID_VF_ID:
256 		return "I40E_ERR_INVALID_VF_ID";
257 	case I40E_ERR_INVALID_HMCFN_ID:
258 		return "I40E_ERR_INVALID_HMCFN_ID";
259 	case I40E_ERR_BACKING_PAGE_ERROR:
260 		return "I40E_ERR_BACKING_PAGE_ERROR";
261 	case I40E_ERR_NO_PBLCHUNKS_AVAILABLE:
262 		return "I40E_ERR_NO_PBLCHUNKS_AVAILABLE";
263 	case I40E_ERR_INVALID_PBLE_INDEX:
264 		return "I40E_ERR_INVALID_PBLE_INDEX";
265 	case I40E_ERR_INVALID_SD_INDEX:
266 		return "I40E_ERR_INVALID_SD_INDEX";
267 	case I40E_ERR_INVALID_PAGE_DESC_INDEX:
268 		return "I40E_ERR_INVALID_PAGE_DESC_INDEX";
269 	case I40E_ERR_INVALID_SD_TYPE:
270 		return "I40E_ERR_INVALID_SD_TYPE";
271 	case I40E_ERR_MEMCPY_FAILED:
272 		return "I40E_ERR_MEMCPY_FAILED";
273 	case I40E_ERR_INVALID_HMC_OBJ_INDEX:
274 		return "I40E_ERR_INVALID_HMC_OBJ_INDEX";
275 	case I40E_ERR_INVALID_HMC_OBJ_COUNT:
276 		return "I40E_ERR_INVALID_HMC_OBJ_COUNT";
277 	case I40E_ERR_INVALID_SRQ_ARM_LIMIT:
278 		return "I40E_ERR_INVALID_SRQ_ARM_LIMIT";
279 	case I40E_ERR_SRQ_ENABLED:
280 		return "I40E_ERR_SRQ_ENABLED";
281 	case I40E_ERR_ADMIN_QUEUE_ERROR:
282 		return "I40E_ERR_ADMIN_QUEUE_ERROR";
283 	case I40E_ERR_ADMIN_QUEUE_TIMEOUT:
284 		return "I40E_ERR_ADMIN_QUEUE_TIMEOUT";
285 	case I40E_ERR_BUF_TOO_SHORT:
286 		return "I40E_ERR_BUF_TOO_SHORT";
287 	case I40E_ERR_ADMIN_QUEUE_FULL:
288 		return "I40E_ERR_ADMIN_QUEUE_FULL";
289 	case I40E_ERR_ADMIN_QUEUE_NO_WORK:
290 		return "I40E_ERR_ADMIN_QUEUE_NO_WORK";
291 	case I40E_ERR_BAD_IWARP_CQE:
292 		return "I40E_ERR_BAD_IWARP_CQE";
293 	case I40E_ERR_NVM_BLANK_MODE:
294 		return "I40E_ERR_NVM_BLANK_MODE";
295 	case I40E_ERR_NOT_IMPLEMENTED:
296 		return "I40E_ERR_NOT_IMPLEMENTED";
297 	case I40E_ERR_PE_DOORBELL_NOT_ENABLED:
298 		return "I40E_ERR_PE_DOORBELL_NOT_ENABLED";
299 	case I40E_ERR_DIAG_TEST_FAILED:
300 		return "I40E_ERR_DIAG_TEST_FAILED";
301 	case I40E_ERR_NOT_READY:
302 		return "I40E_ERR_NOT_READY";
303 	case I40E_NOT_SUPPORTED:
304 		return "I40E_NOT_SUPPORTED";
305 	case I40E_ERR_FIRMWARE_API_VERSION:
306 		return "I40E_ERR_FIRMWARE_API_VERSION";
307 	case I40E_ERR_ADMIN_QUEUE_CRITICAL_ERROR:
308 		return "I40E_ERR_ADMIN_QUEUE_CRITICAL_ERROR";
309 	}
310 
311 	snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
312 	return hw->err_str;
313 }
314 
315 /**
316  * i40e_debug_aq
317  * @hw: debug mask related to admin queue
318  * @mask: debug mask
319  * @desc: pointer to admin queue descriptor
320  * @buffer: pointer to command buffer
321  * @buf_len: max length of buffer
322  *
323  * Dumps debug log about adminq command with descriptor contents.
324  **/
325 void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
326 		   void *buffer, u16 buf_len)
327 {
328 	struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
329 	u32 effective_mask = hw->debug_mask & mask;
330 	u8 *buf = (u8 *)buffer;
331 	u16 len;
332 	u16 i;
333 
334 	if (!effective_mask || !desc)
335 		return;
336 
337 	len = LE16_TO_CPU(aq_desc->datalen);
338 
339 	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR,
340 		   "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
341 		   LE16_TO_CPU(aq_desc->opcode),
342 		   LE16_TO_CPU(aq_desc->flags),
343 		   LE16_TO_CPU(aq_desc->datalen),
344 		   LE16_TO_CPU(aq_desc->retval));
345 	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR,
346 		   "\tcookie (h,l) 0x%08X 0x%08X\n",
347 		   LE32_TO_CPU(aq_desc->cookie_high),
348 		   LE32_TO_CPU(aq_desc->cookie_low));
349 	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR,
350 		   "\tparam (0,1)  0x%08X 0x%08X\n",
351 		   LE32_TO_CPU(aq_desc->params.internal.param0),
352 		   LE32_TO_CPU(aq_desc->params.internal.param1));
353 	i40e_debug(hw, mask & I40E_DEBUG_AQ_DESCRIPTOR,
354 		   "\taddr (h,l)   0x%08X 0x%08X\n",
355 		   LE32_TO_CPU(aq_desc->params.external.addr_high),
356 		   LE32_TO_CPU(aq_desc->params.external.addr_low));
357 
358 	if (buffer && (buf_len != 0) && (len != 0) &&
359 	    (effective_mask & I40E_DEBUG_AQ_DESC_BUFFER)) {
360 		i40e_debug(hw, mask, "AQ CMD Buffer:\n");
361 		if (buf_len < len)
362 			len = buf_len;
363 		/* write the full 16-byte chunks */
364 		for (i = 0; i < (len - 16); i += 16)
365 			i40e_debug(hw, mask,
366 				   "\t0x%04X  %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
367 				   i, buf[i], buf[i+1], buf[i+2], buf[i+3],
368 				   buf[i+4], buf[i+5], buf[i+6], buf[i+7],
369 				   buf[i+8], buf[i+9], buf[i+10], buf[i+11],
370 				   buf[i+12], buf[i+13], buf[i+14], buf[i+15]);
371 		/* the most we could have left is 16 bytes, pad with zeros */
372 		if (i < len) {
373 			char d_buf[16];
374 			int j, i_sav;
375 
376 			i_sav = i;
377 			memset(d_buf, 0, sizeof(d_buf));
378 			for (j = 0; i < len; j++, i++)
379 				d_buf[j] = buf[i];
380 			i40e_debug(hw, mask,
381 				   "\t0x%04X  %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
382 				   i_sav, d_buf[0], d_buf[1], d_buf[2], d_buf[3],
383 				   d_buf[4], d_buf[5], d_buf[6], d_buf[7],
384 				   d_buf[8], d_buf[9], d_buf[10], d_buf[11],
385 				   d_buf[12], d_buf[13], d_buf[14], d_buf[15]);
386 		}
387 	}
388 }
389 
390 /**
391  * i40e_check_asq_alive
392  * @hw: pointer to the hw struct
393  *
394  * Returns TRUE if Queue is enabled else FALSE.
395  **/
396 bool i40e_check_asq_alive(struct i40e_hw *hw)
397 {
398 	if (hw->aq.asq.len) {
399 		if (!i40e_is_vf(hw))
400 			return !!(rd32(hw, hw->aq.asq.len) &
401 				I40E_PF_ATQLEN_ATQENABLE_MASK);
402 		else
403 			return !!(rd32(hw, hw->aq.asq.len) &
404 				I40E_VF_ATQLEN1_ATQENABLE_MASK);
405 	}
406 	return FALSE;
407 }
408 
409 /**
410  * i40e_aq_queue_shutdown
411  * @hw: pointer to the hw struct
412  * @unloading: is the driver unloading itself
413  *
414  * Tell the Firmware that we're shutting down the AdminQ and whether
415  * or not the driver is unloading as well.
416  **/
417 enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
418 					     bool unloading)
419 {
420 	struct i40e_aq_desc desc;
421 	struct i40e_aqc_queue_shutdown *cmd =
422 		(struct i40e_aqc_queue_shutdown *)&desc.params.raw;
423 	enum i40e_status_code status;
424 
425 	i40e_fill_default_direct_cmd_desc(&desc,
426 					  i40e_aqc_opc_queue_shutdown);
427 
428 	if (unloading)
429 		cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING);
430 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
431 
432 	return status;
433 }
434 
435 /**
436  * i40e_aq_get_set_rss_lut
437  * @hw: pointer to the hardware structure
438  * @vsi_id: vsi fw index
439  * @pf_lut: for PF table set TRUE, for VSI table set FALSE
440  * @lut: pointer to the lut buffer provided by the caller
441  * @lut_size: size of the lut buffer
442  * @set: set TRUE to set the table, FALSE to get the table
443  *
444  * Internal function to get or set RSS look up table
445  **/
446 static enum i40e_status_code i40e_aq_get_set_rss_lut(struct i40e_hw *hw,
447 						     u16 vsi_id, bool pf_lut,
448 						     u8 *lut, u16 lut_size,
449 						     bool set)
450 {
451 	enum i40e_status_code status;
452 	struct i40e_aq_desc desc;
453 	struct i40e_aqc_get_set_rss_lut *cmd_resp =
454 		   (struct i40e_aqc_get_set_rss_lut *)&desc.params.raw;
455 
456 	if (set)
457 		i40e_fill_default_direct_cmd_desc(&desc,
458 						  i40e_aqc_opc_set_rss_lut);
459 	else
460 		i40e_fill_default_direct_cmd_desc(&desc,
461 						  i40e_aqc_opc_get_rss_lut);
462 
463 	/* Indirect command */
464 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
465 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
466 
467 	cmd_resp->vsi_id =
468 			CPU_TO_LE16((u16)((vsi_id <<
469 					  I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
470 					  I40E_AQC_SET_RSS_LUT_VSI_ID_MASK));
471 	cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_LUT_VSI_VALID);
472 
473 	if (pf_lut)
474 		cmd_resp->flags |= CPU_TO_LE16((u16)
475 					((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
476 					I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
477 					I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
478 	else
479 		cmd_resp->flags |= CPU_TO_LE16((u16)
480 					((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
481 					I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
482 					I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
483 
484 	status = i40e_asq_send_command(hw, &desc, lut, lut_size, NULL);
485 
486 	return status;
487 }
488 
489 /**
490  * i40e_aq_get_rss_lut
491  * @hw: pointer to the hardware structure
492  * @vsi_id: vsi fw index
493  * @pf_lut: for PF table set TRUE, for VSI table set FALSE
494  * @lut: pointer to the lut buffer provided by the caller
495  * @lut_size: size of the lut buffer
496  *
497  * get the RSS lookup table, PF or VSI type
498  **/
499 enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 vsi_id,
500 					  bool pf_lut, u8 *lut, u16 lut_size)
501 {
502 	return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
503 				       FALSE);
504 }
505 
506 /**
507  * i40e_aq_set_rss_lut
508  * @hw: pointer to the hardware structure
509  * @vsi_id: vsi fw index
510  * @pf_lut: for PF table set TRUE, for VSI table set FALSE
511  * @lut: pointer to the lut buffer provided by the caller
512  * @lut_size: size of the lut buffer
513  *
514  * set the RSS lookup table, PF or VSI type
515  **/
516 enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 vsi_id,
517 					  bool pf_lut, u8 *lut, u16 lut_size)
518 {
519 	return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, TRUE);
520 }
521 
522 /**
523  * i40e_aq_get_set_rss_key
524  * @hw: pointer to the hw struct
525  * @vsi_id: vsi fw index
526  * @key: pointer to key info struct
527  * @set: set TRUE to set the key, FALSE to get the key
528  *
529  * get the RSS key per VSI
530  **/
531 static enum i40e_status_code i40e_aq_get_set_rss_key(struct i40e_hw *hw,
532 				      u16 vsi_id,
533 				      struct i40e_aqc_get_set_rss_key_data *key,
534 				      bool set)
535 {
536 	enum i40e_status_code status;
537 	struct i40e_aq_desc desc;
538 	struct i40e_aqc_get_set_rss_key *cmd_resp =
539 			(struct i40e_aqc_get_set_rss_key *)&desc.params.raw;
540 	u16 key_size = sizeof(struct i40e_aqc_get_set_rss_key_data);
541 
542 	if (set)
543 		i40e_fill_default_direct_cmd_desc(&desc,
544 						  i40e_aqc_opc_set_rss_key);
545 	else
546 		i40e_fill_default_direct_cmd_desc(&desc,
547 						  i40e_aqc_opc_get_rss_key);
548 
549 	/* Indirect command */
550 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
551 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
552 
553 	cmd_resp->vsi_id =
554 			CPU_TO_LE16((u16)((vsi_id <<
555 					  I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
556 					  I40E_AQC_SET_RSS_KEY_VSI_ID_MASK));
557 	cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_KEY_VSI_VALID);
558 
559 	status = i40e_asq_send_command(hw, &desc, key, key_size, NULL);
560 
561 	return status;
562 }
563 
564 /**
565  * i40e_aq_get_rss_key
566  * @hw: pointer to the hw struct
567  * @vsi_id: vsi fw index
568  * @key: pointer to key info struct
569  *
570  **/
571 enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
572 				      u16 vsi_id,
573 				      struct i40e_aqc_get_set_rss_key_data *key)
574 {
575 	return i40e_aq_get_set_rss_key(hw, vsi_id, key, FALSE);
576 }
577 
578 /**
579  * i40e_aq_set_rss_key
580  * @hw: pointer to the hw struct
581  * @vsi_id: vsi fw index
582  * @key: pointer to key info struct
583  *
584  * set the RSS key per VSI
585  **/
586 enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
587 				      u16 vsi_id,
588 				      struct i40e_aqc_get_set_rss_key_data *key)
589 {
590 	return i40e_aq_get_set_rss_key(hw, vsi_id, key, TRUE);
591 }
592 
593 /* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
594  * hardware to a bit-field that can be used by SW to more easily determine the
595  * packet type.
596  *
597  * Macros are used to shorten the table lines and make this table human
598  * readable.
599  *
600  * We store the PTYPE in the top byte of the bit field - this is just so that
601  * we can check that the table doesn't have a row missing, as the index into
602  * the table should be the PTYPE.
603  *
604  * Typical work flow:
605  *
606  * IF NOT i40e_ptype_lookup[ptype].known
607  * THEN
608  *      Packet is unknown
609  * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
610  *      Use the rest of the fields to look at the tunnels, inner protocols, etc
611  * ELSE
612  *      Use the enum i40e_rx_l2_ptype to decode the packet type
613  * ENDIF
614  */
615 
616 /* macro to make the table lines short */
617 #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
618 	{	PTYPE, \
619 		1, \
620 		I40E_RX_PTYPE_OUTER_##OUTER_IP, \
621 		I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \
622 		I40E_RX_PTYPE_##OUTER_FRAG, \
623 		I40E_RX_PTYPE_TUNNEL_##T, \
624 		I40E_RX_PTYPE_TUNNEL_END_##TE, \
625 		I40E_RX_PTYPE_##TEF, \
626 		I40E_RX_PTYPE_INNER_PROT_##I, \
627 		I40E_RX_PTYPE_PAYLOAD_LAYER_##PL }
628 
629 #define I40E_PTT_UNUSED_ENTRY(PTYPE) \
630 		{ PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
631 
632 /* shorter macros makes the table fit but are terse */
633 #define I40E_RX_PTYPE_NOF		I40E_RX_PTYPE_NOT_FRAG
634 #define I40E_RX_PTYPE_FRG		I40E_RX_PTYPE_FRAG
635 #define I40E_RX_PTYPE_INNER_PROT_TS	I40E_RX_PTYPE_INNER_PROT_TIMESYNC
636 
637 /* Lookup table mapping the HW PTYPE to the bit field for decoding */
638 struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
639 	/* L2 Packet types */
640 	I40E_PTT_UNUSED_ENTRY(0),
641 	I40E_PTT(1,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
642 	I40E_PTT(2,  L2, NONE, NOF, NONE, NONE, NOF, TS,   PAY2),
643 	I40E_PTT(3,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
644 	I40E_PTT_UNUSED_ENTRY(4),
645 	I40E_PTT_UNUSED_ENTRY(5),
646 	I40E_PTT(6,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
647 	I40E_PTT(7,  L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
648 	I40E_PTT_UNUSED_ENTRY(8),
649 	I40E_PTT_UNUSED_ENTRY(9),
650 	I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
651 	I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
652 	I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
653 	I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
654 	I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
655 	I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
656 	I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
657 	I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
658 	I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
659 	I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
660 	I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
661 	I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
662 
663 	/* Non Tunneled IPv4 */
664 	I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
665 	I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
666 	I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP,  PAY4),
667 	I40E_PTT_UNUSED_ENTRY(25),
668 	I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP,  PAY4),
669 	I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
670 	I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
671 
672 	/* IPv4 --> IPv4 */
673 	I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
674 	I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
675 	I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP,  PAY4),
676 	I40E_PTT_UNUSED_ENTRY(32),
677 	I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP,  PAY4),
678 	I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
679 	I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
680 
681 	/* IPv4 --> IPv6 */
682 	I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
683 	I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
684 	I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP,  PAY4),
685 	I40E_PTT_UNUSED_ENTRY(39),
686 	I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP,  PAY4),
687 	I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
688 	I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
689 
690 	/* IPv4 --> GRE/NAT */
691 	I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
692 
693 	/* IPv4 --> GRE/NAT --> IPv4 */
694 	I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
695 	I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
696 	I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4),
697 	I40E_PTT_UNUSED_ENTRY(47),
698 	I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4),
699 	I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
700 	I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
701 
702 	/* IPv4 --> GRE/NAT --> IPv6 */
703 	I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
704 	I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
705 	I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4),
706 	I40E_PTT_UNUSED_ENTRY(54),
707 	I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4),
708 	I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
709 	I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
710 
711 	/* IPv4 --> GRE/NAT --> MAC */
712 	I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
713 
714 	/* IPv4 --> GRE/NAT --> MAC --> IPv4 */
715 	I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
716 	I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
717 	I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4),
718 	I40E_PTT_UNUSED_ENTRY(62),
719 	I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4),
720 	I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
721 	I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
722 
723 	/* IPv4 --> GRE/NAT -> MAC --> IPv6 */
724 	I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
725 	I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
726 	I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4),
727 	I40E_PTT_UNUSED_ENTRY(69),
728 	I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4),
729 	I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
730 	I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
731 
732 	/* IPv4 --> GRE/NAT --> MAC/VLAN */
733 	I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
734 
735 	/* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
736 	I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
737 	I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
738 	I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4),
739 	I40E_PTT_UNUSED_ENTRY(77),
740 	I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4),
741 	I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
742 	I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
743 
744 	/* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
745 	I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
746 	I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
747 	I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4),
748 	I40E_PTT_UNUSED_ENTRY(84),
749 	I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4),
750 	I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
751 	I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
752 
753 	/* Non Tunneled IPv6 */
754 	I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
755 	I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
756 	I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP,  PAY4),
757 	I40E_PTT_UNUSED_ENTRY(91),
758 	I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP,  PAY4),
759 	I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
760 	I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
761 
762 	/* IPv6 --> IPv4 */
763 	I40E_PTT(95,  IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
764 	I40E_PTT(96,  IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
765 	I40E_PTT(97,  IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP,  PAY4),
766 	I40E_PTT_UNUSED_ENTRY(98),
767 	I40E_PTT(99,  IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP,  PAY4),
768 	I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
769 	I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
770 
771 	/* IPv6 --> IPv6 */
772 	I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
773 	I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
774 	I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP,  PAY4),
775 	I40E_PTT_UNUSED_ENTRY(105),
776 	I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP,  PAY4),
777 	I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
778 	I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
779 
780 	/* IPv6 --> GRE/NAT */
781 	I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
782 
783 	/* IPv6 --> GRE/NAT -> IPv4 */
784 	I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
785 	I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
786 	I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP,  PAY4),
787 	I40E_PTT_UNUSED_ENTRY(113),
788 	I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP,  PAY4),
789 	I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
790 	I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
791 
792 	/* IPv6 --> GRE/NAT -> IPv6 */
793 	I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
794 	I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
795 	I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP,  PAY4),
796 	I40E_PTT_UNUSED_ENTRY(120),
797 	I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP,  PAY4),
798 	I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
799 	I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
800 
801 	/* IPv6 --> GRE/NAT -> MAC */
802 	I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
803 
804 	/* IPv6 --> GRE/NAT -> MAC -> IPv4 */
805 	I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
806 	I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
807 	I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP,  PAY4),
808 	I40E_PTT_UNUSED_ENTRY(128),
809 	I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP,  PAY4),
810 	I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
811 	I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
812 
813 	/* IPv6 --> GRE/NAT -> MAC -> IPv6 */
814 	I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
815 	I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
816 	I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP,  PAY4),
817 	I40E_PTT_UNUSED_ENTRY(135),
818 	I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP,  PAY4),
819 	I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
820 	I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
821 
822 	/* IPv6 --> GRE/NAT -> MAC/VLAN */
823 	I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
824 
825 	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
826 	I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
827 	I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
828 	I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP,  PAY4),
829 	I40E_PTT_UNUSED_ENTRY(143),
830 	I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP,  PAY4),
831 	I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
832 	I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
833 
834 	/* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
835 	I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
836 	I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
837 	I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP,  PAY4),
838 	I40E_PTT_UNUSED_ENTRY(150),
839 	I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP,  PAY4),
840 	I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
841 	I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
842 
843 	/* unused entries */
844 	I40E_PTT_UNUSED_ENTRY(154),
845 	I40E_PTT_UNUSED_ENTRY(155),
846 	I40E_PTT_UNUSED_ENTRY(156),
847 	I40E_PTT_UNUSED_ENTRY(157),
848 	I40E_PTT_UNUSED_ENTRY(158),
849 	I40E_PTT_UNUSED_ENTRY(159),
850 
851 	I40E_PTT_UNUSED_ENTRY(160),
852 	I40E_PTT_UNUSED_ENTRY(161),
853 	I40E_PTT_UNUSED_ENTRY(162),
854 	I40E_PTT_UNUSED_ENTRY(163),
855 	I40E_PTT_UNUSED_ENTRY(164),
856 	I40E_PTT_UNUSED_ENTRY(165),
857 	I40E_PTT_UNUSED_ENTRY(166),
858 	I40E_PTT_UNUSED_ENTRY(167),
859 	I40E_PTT_UNUSED_ENTRY(168),
860 	I40E_PTT_UNUSED_ENTRY(169),
861 
862 	I40E_PTT_UNUSED_ENTRY(170),
863 	I40E_PTT_UNUSED_ENTRY(171),
864 	I40E_PTT_UNUSED_ENTRY(172),
865 	I40E_PTT_UNUSED_ENTRY(173),
866 	I40E_PTT_UNUSED_ENTRY(174),
867 	I40E_PTT_UNUSED_ENTRY(175),
868 	I40E_PTT_UNUSED_ENTRY(176),
869 	I40E_PTT_UNUSED_ENTRY(177),
870 	I40E_PTT_UNUSED_ENTRY(178),
871 	I40E_PTT_UNUSED_ENTRY(179),
872 
873 	I40E_PTT_UNUSED_ENTRY(180),
874 	I40E_PTT_UNUSED_ENTRY(181),
875 	I40E_PTT_UNUSED_ENTRY(182),
876 	I40E_PTT_UNUSED_ENTRY(183),
877 	I40E_PTT_UNUSED_ENTRY(184),
878 	I40E_PTT_UNUSED_ENTRY(185),
879 	I40E_PTT_UNUSED_ENTRY(186),
880 	I40E_PTT_UNUSED_ENTRY(187),
881 	I40E_PTT_UNUSED_ENTRY(188),
882 	I40E_PTT_UNUSED_ENTRY(189),
883 
884 	I40E_PTT_UNUSED_ENTRY(190),
885 	I40E_PTT_UNUSED_ENTRY(191),
886 	I40E_PTT_UNUSED_ENTRY(192),
887 	I40E_PTT_UNUSED_ENTRY(193),
888 	I40E_PTT_UNUSED_ENTRY(194),
889 	I40E_PTT_UNUSED_ENTRY(195),
890 	I40E_PTT_UNUSED_ENTRY(196),
891 	I40E_PTT_UNUSED_ENTRY(197),
892 	I40E_PTT_UNUSED_ENTRY(198),
893 	I40E_PTT_UNUSED_ENTRY(199),
894 
895 	I40E_PTT_UNUSED_ENTRY(200),
896 	I40E_PTT_UNUSED_ENTRY(201),
897 	I40E_PTT_UNUSED_ENTRY(202),
898 	I40E_PTT_UNUSED_ENTRY(203),
899 	I40E_PTT_UNUSED_ENTRY(204),
900 	I40E_PTT_UNUSED_ENTRY(205),
901 	I40E_PTT_UNUSED_ENTRY(206),
902 	I40E_PTT_UNUSED_ENTRY(207),
903 	I40E_PTT_UNUSED_ENTRY(208),
904 	I40E_PTT_UNUSED_ENTRY(209),
905 
906 	I40E_PTT_UNUSED_ENTRY(210),
907 	I40E_PTT_UNUSED_ENTRY(211),
908 	I40E_PTT_UNUSED_ENTRY(212),
909 	I40E_PTT_UNUSED_ENTRY(213),
910 	I40E_PTT_UNUSED_ENTRY(214),
911 	I40E_PTT_UNUSED_ENTRY(215),
912 	I40E_PTT_UNUSED_ENTRY(216),
913 	I40E_PTT_UNUSED_ENTRY(217),
914 	I40E_PTT_UNUSED_ENTRY(218),
915 	I40E_PTT_UNUSED_ENTRY(219),
916 
917 	I40E_PTT_UNUSED_ENTRY(220),
918 	I40E_PTT_UNUSED_ENTRY(221),
919 	I40E_PTT_UNUSED_ENTRY(222),
920 	I40E_PTT_UNUSED_ENTRY(223),
921 	I40E_PTT_UNUSED_ENTRY(224),
922 	I40E_PTT_UNUSED_ENTRY(225),
923 	I40E_PTT_UNUSED_ENTRY(226),
924 	I40E_PTT_UNUSED_ENTRY(227),
925 	I40E_PTT_UNUSED_ENTRY(228),
926 	I40E_PTT_UNUSED_ENTRY(229),
927 
928 	I40E_PTT_UNUSED_ENTRY(230),
929 	I40E_PTT_UNUSED_ENTRY(231),
930 	I40E_PTT_UNUSED_ENTRY(232),
931 	I40E_PTT_UNUSED_ENTRY(233),
932 	I40E_PTT_UNUSED_ENTRY(234),
933 	I40E_PTT_UNUSED_ENTRY(235),
934 	I40E_PTT_UNUSED_ENTRY(236),
935 	I40E_PTT_UNUSED_ENTRY(237),
936 	I40E_PTT_UNUSED_ENTRY(238),
937 	I40E_PTT_UNUSED_ENTRY(239),
938 
939 	I40E_PTT_UNUSED_ENTRY(240),
940 	I40E_PTT_UNUSED_ENTRY(241),
941 	I40E_PTT_UNUSED_ENTRY(242),
942 	I40E_PTT_UNUSED_ENTRY(243),
943 	I40E_PTT_UNUSED_ENTRY(244),
944 	I40E_PTT_UNUSED_ENTRY(245),
945 	I40E_PTT_UNUSED_ENTRY(246),
946 	I40E_PTT_UNUSED_ENTRY(247),
947 	I40E_PTT_UNUSED_ENTRY(248),
948 	I40E_PTT_UNUSED_ENTRY(249),
949 
950 	I40E_PTT_UNUSED_ENTRY(250),
951 	I40E_PTT_UNUSED_ENTRY(251),
952 	I40E_PTT_UNUSED_ENTRY(252),
953 	I40E_PTT_UNUSED_ENTRY(253),
954 	I40E_PTT_UNUSED_ENTRY(254),
955 	I40E_PTT_UNUSED_ENTRY(255)
956 };
957 
958 
959 /**
960  * i40e_validate_mac_addr - Validate unicast MAC address
961  * @mac_addr: pointer to MAC address
962  *
963  * Tests a MAC address to ensure it is a valid Individual Address
964  **/
965 enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
966 {
967 	enum i40e_status_code status = I40E_SUCCESS;
968 
969 	DEBUGFUNC("i40e_validate_mac_addr");
970 
971 	/* Broadcast addresses ARE multicast addresses
972 	 * Make sure it is not a multicast address
973 	 * Reject the zero address
974 	 */
975 	if (I40E_IS_MULTICAST(mac_addr) ||
976 	    (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
977 	      mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
978 		status = I40E_ERR_INVALID_MAC_ADDR;
979 
980 	return status;
981 }
982 
983 /**
984  * i40e_init_shared_code - Initialize the shared code
985  * @hw: pointer to hardware structure
986  *
987  * This assigns the MAC type and PHY code and inits the NVM.
988  * Does not touch the hardware. This function must be called prior to any
989  * other function in the shared code. The i40e_hw structure should be
990  * memset to 0 prior to calling this function.  The following fields in
991  * hw structure should be filled in prior to calling this function:
992  * hw_addr, back, device_id, vendor_id, subsystem_device_id,
993  * subsystem_vendor_id, and revision_id
994  **/
995 enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
996 {
997 	enum i40e_status_code status = I40E_SUCCESS;
998 	u32 port, ari, func_rid;
999 
1000 	DEBUGFUNC("i40e_init_shared_code");
1001 
1002 	i40e_set_mac_type(hw);
1003 
1004 	switch (hw->mac.type) {
1005 	case I40E_MAC_XL710:
1006 	case I40E_MAC_X722:
1007 		break;
1008 	default:
1009 		return I40E_ERR_DEVICE_NOT_SUPPORTED;
1010 	}
1011 
1012 	hw->phy.get_link_info = TRUE;
1013 
1014 	/* Determine port number and PF number*/
1015 	port = (rd32(hw, I40E_PFGEN_PORTNUM) & I40E_PFGEN_PORTNUM_PORT_NUM_MASK)
1016 					   >> I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT;
1017 	hw->port = (u8)port;
1018 	ari = (rd32(hw, I40E_GLPCI_CAPSUP) & I40E_GLPCI_CAPSUP_ARI_EN_MASK) >>
1019 						 I40E_GLPCI_CAPSUP_ARI_EN_SHIFT;
1020 	func_rid = rd32(hw, I40E_PF_FUNC_RID);
1021 	if (ari)
1022 		hw->pf_id = (u8)(func_rid & 0xff);
1023 	else
1024 		hw->pf_id = (u8)(func_rid & 0x7);
1025 
1026 	/* NVMUpdate features structure initialization */
1027 	hw->nvmupd_features.major = I40E_NVMUPD_FEATURES_API_VER_MAJOR;
1028 	hw->nvmupd_features.minor = I40E_NVMUPD_FEATURES_API_VER_MINOR;
1029 	hw->nvmupd_features.size = sizeof(hw->nvmupd_features);
1030 	i40e_memset(hw->nvmupd_features.features, 0x0,
1031 		    I40E_NVMUPD_FEATURES_API_FEATURES_ARRAY_LEN *
1032 		    sizeof(*hw->nvmupd_features.features),
1033 		    I40E_NONDMA_MEM);
1034 
1035 	/* No features supported at the moment */
1036 	hw->nvmupd_features.features[0] = 0;
1037 
1038 	status = i40e_init_nvm(hw);
1039 	return status;
1040 }
1041 
1042 /**
1043  * i40e_aq_mac_address_read - Retrieve the MAC addresses
1044  * @hw: pointer to the hw struct
1045  * @flags: a return indicator of what addresses were added to the addr store
1046  * @addrs: the requestor's mac addr store
1047  * @cmd_details: pointer to command details structure or NULL
1048  **/
1049 static enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw,
1050 				   u16 *flags,
1051 				   struct i40e_aqc_mac_address_read_data *addrs,
1052 				   struct i40e_asq_cmd_details *cmd_details)
1053 {
1054 	struct i40e_aq_desc desc;
1055 	struct i40e_aqc_mac_address_read *cmd_data =
1056 		(struct i40e_aqc_mac_address_read *)&desc.params.raw;
1057 	enum i40e_status_code status;
1058 
1059 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
1060 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
1061 
1062 	status = i40e_asq_send_command(hw, &desc, addrs,
1063 				       sizeof(*addrs), cmd_details);
1064 	*flags = LE16_TO_CPU(cmd_data->command_flags);
1065 
1066 	return status;
1067 }
1068 
1069 /**
1070  * i40e_aq_mac_address_write - Change the MAC addresses
1071  * @hw: pointer to the hw struct
1072  * @flags: indicates which MAC to be written
1073  * @mac_addr: address to write
1074  * @cmd_details: pointer to command details structure or NULL
1075  **/
1076 enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
1077 				    u16 flags, u8 *mac_addr,
1078 				    struct i40e_asq_cmd_details *cmd_details)
1079 {
1080 	struct i40e_aq_desc desc;
1081 	struct i40e_aqc_mac_address_write *cmd_data =
1082 		(struct i40e_aqc_mac_address_write *)&desc.params.raw;
1083 	enum i40e_status_code status;
1084 
1085 	i40e_fill_default_direct_cmd_desc(&desc,
1086 					  i40e_aqc_opc_mac_address_write);
1087 	cmd_data->command_flags = CPU_TO_LE16(flags);
1088 	cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]);
1089 	cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) |
1090 					((u32)mac_addr[3] << 16) |
1091 					((u32)mac_addr[4] << 8) |
1092 					mac_addr[5]);
1093 
1094 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1095 
1096 	return status;
1097 }
1098 
1099 /**
1100  * i40e_get_mac_addr - get MAC address
1101  * @hw: pointer to the HW structure
1102  * @mac_addr: pointer to MAC address
1103  *
1104  * Reads the adapter's MAC address from register
1105  **/
1106 enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1107 {
1108 	struct i40e_aqc_mac_address_read_data addrs;
1109 	enum i40e_status_code status;
1110 	u16 flags = 0;
1111 
1112 	status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1113 
1114 	if (flags & I40E_AQC_LAN_ADDR_VALID)
1115 		i40e_memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac),
1116 			I40E_NONDMA_TO_NONDMA);
1117 
1118 	return status;
1119 }
1120 
1121 /**
1122  * i40e_get_port_mac_addr - get Port MAC address
1123  * @hw: pointer to the HW structure
1124  * @mac_addr: pointer to Port MAC address
1125  *
1126  * Reads the adapter's Port MAC address
1127  **/
1128 enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1129 {
1130 	struct i40e_aqc_mac_address_read_data addrs;
1131 	enum i40e_status_code status;
1132 	u16 flags = 0;
1133 
1134 	status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1135 	if (status)
1136 		return status;
1137 
1138 	if (flags & I40E_AQC_PORT_ADDR_VALID)
1139 		i40e_memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac),
1140 			I40E_NONDMA_TO_NONDMA);
1141 	else
1142 		status = I40E_ERR_INVALID_MAC_ADDR;
1143 
1144 	return status;
1145 }
1146 
1147 /**
1148  * i40e_pre_tx_queue_cfg - pre tx queue configure
1149  * @hw: pointer to the HW structure
1150  * @queue: target pf queue index
1151  * @enable: state change request
1152  *
1153  * Handles hw requirement to indicate intention to enable
1154  * or disable target queue.
1155  **/
1156 void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable)
1157 {
1158 	u32 abs_queue_idx = hw->func_caps.base_queue + queue;
1159 	u32 reg_block = 0;
1160 	u32 reg_val;
1161 
1162 	if (abs_queue_idx >= 128) {
1163 		reg_block = abs_queue_idx / 128;
1164 		abs_queue_idx %= 128;
1165 	}
1166 
1167 	reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1168 	reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1169 	reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1170 
1171 	if (enable)
1172 		reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK;
1173 	else
1174 		reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1175 
1176 	wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val);
1177 }
1178 
1179 /**
1180  *  i40e_read_pba_string - Reads part number string from EEPROM
1181  *  @hw: pointer to hardware structure
1182  *  @pba_num: stores the part number string from the EEPROM
1183  *  @pba_num_size: part number string buffer length
1184  *
1185  *  Reads the part number string from the EEPROM.
1186  **/
1187 enum i40e_status_code i40e_read_pba_string(struct i40e_hw *hw, u8 *pba_num,
1188 					    u32 pba_num_size)
1189 {
1190 	enum i40e_status_code status = I40E_SUCCESS;
1191 	u16 pba_word = 0;
1192 	u16 pba_size = 0;
1193 	u16 pba_ptr = 0;
1194 	u16 i = 0;
1195 
1196 	status = i40e_read_nvm_word(hw, I40E_SR_PBA_FLAGS, &pba_word);
1197 	if ((status != I40E_SUCCESS) || (pba_word != 0xFAFA)) {
1198 		DEBUGOUT("Failed to read PBA flags or flag is invalid.\n");
1199 		return status;
1200 	}
1201 
1202 	status = i40e_read_nvm_word(hw, I40E_SR_PBA_BLOCK_PTR, &pba_ptr);
1203 	if (status != I40E_SUCCESS) {
1204 		DEBUGOUT("Failed to read PBA Block pointer.\n");
1205 		return status;
1206 	}
1207 
1208 	status = i40e_read_nvm_word(hw, pba_ptr, &pba_size);
1209 	if (status != I40E_SUCCESS) {
1210 		DEBUGOUT("Failed to read PBA Block size.\n");
1211 		return status;
1212 	}
1213 
1214 	/* Subtract one to get PBA word count (PBA Size word is included in
1215 	 * total size)
1216 	 */
1217 	pba_size--;
1218 	if (pba_num_size < (((u32)pba_size * 2) + 1)) {
1219 		DEBUGOUT("Buffer to small for PBA data.\n");
1220 		return I40E_ERR_PARAM;
1221 	}
1222 
1223 	for (i = 0; i < pba_size; i++) {
1224 		status = i40e_read_nvm_word(hw, (pba_ptr + 1) + i, &pba_word);
1225 		if (status != I40E_SUCCESS) {
1226 			DEBUGOUT1("Failed to read PBA Block word %d.\n", i);
1227 			return status;
1228 		}
1229 
1230 		pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
1231 		pba_num[(i * 2) + 1] = pba_word & 0xFF;
1232 	}
1233 	pba_num[(pba_size * 2)] = '\0';
1234 
1235 	return status;
1236 }
1237 
1238 /**
1239  * i40e_get_media_type - Gets media type
1240  * @hw: pointer to the hardware structure
1241  **/
1242 static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
1243 {
1244 	enum i40e_media_type media;
1245 
1246 	switch (hw->phy.link_info.phy_type) {
1247 	case I40E_PHY_TYPE_10GBASE_SR:
1248 	case I40E_PHY_TYPE_10GBASE_LR:
1249 	case I40E_PHY_TYPE_1000BASE_SX:
1250 	case I40E_PHY_TYPE_1000BASE_LX:
1251 	case I40E_PHY_TYPE_40GBASE_SR4:
1252 	case I40E_PHY_TYPE_40GBASE_LR4:
1253 	case I40E_PHY_TYPE_25GBASE_LR:
1254 	case I40E_PHY_TYPE_25GBASE_SR:
1255 	case I40E_PHY_TYPE_10GBASE_AOC:
1256 	case I40E_PHY_TYPE_25GBASE_AOC:
1257 	case I40E_PHY_TYPE_40GBASE_AOC:
1258 		media = I40E_MEDIA_TYPE_FIBER;
1259 		break;
1260 	case I40E_PHY_TYPE_100BASE_TX:
1261 	case I40E_PHY_TYPE_1000BASE_T:
1262 	case I40E_PHY_TYPE_2_5GBASE_T_LINK_STATUS:
1263 	case I40E_PHY_TYPE_5GBASE_T_LINK_STATUS:
1264 	case I40E_PHY_TYPE_10GBASE_T:
1265 		media = I40E_MEDIA_TYPE_BASET;
1266 		break;
1267 	case I40E_PHY_TYPE_10GBASE_CR1_CU:
1268 	case I40E_PHY_TYPE_40GBASE_CR4_CU:
1269 	case I40E_PHY_TYPE_10GBASE_CR1:
1270 	case I40E_PHY_TYPE_40GBASE_CR4:
1271 	case I40E_PHY_TYPE_10GBASE_SFPP_CU:
1272 	case I40E_PHY_TYPE_25GBASE_CR:
1273 	case I40E_PHY_TYPE_25GBASE_ACC:
1274 		media = I40E_MEDIA_TYPE_DA;
1275 		break;
1276 	case I40E_PHY_TYPE_1000BASE_KX:
1277 	case I40E_PHY_TYPE_10GBASE_KX4:
1278 	case I40E_PHY_TYPE_10GBASE_KR:
1279 	case I40E_PHY_TYPE_40GBASE_KR4:
1280 	case I40E_PHY_TYPE_20GBASE_KR2:
1281 	case I40E_PHY_TYPE_25GBASE_KR:
1282 		media = I40E_MEDIA_TYPE_BACKPLANE;
1283 		break;
1284 	case I40E_PHY_TYPE_SGMII:
1285 	case I40E_PHY_TYPE_XAUI:
1286 	case I40E_PHY_TYPE_XFI:
1287 	case I40E_PHY_TYPE_XLAUI:
1288 	case I40E_PHY_TYPE_XLPPI:
1289 	default:
1290 		media = I40E_MEDIA_TYPE_UNKNOWN;
1291 		break;
1292 	}
1293 
1294 	return media;
1295 }
1296 
1297 /**
1298  * i40e_poll_globr - Poll for Global Reset completion
1299  * @hw: pointer to the hardware structure
1300  * @retry_limit: how many times to retry before failure
1301  **/
1302 static enum i40e_status_code i40e_poll_globr(struct i40e_hw *hw,
1303 					     u32 retry_limit)
1304 {
1305 	u32 cnt, reg = 0;
1306 
1307 	for (cnt = 0; cnt < retry_limit; cnt++) {
1308 		reg = rd32(hw, I40E_GLGEN_RSTAT);
1309 		if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
1310 			return I40E_SUCCESS;
1311 		i40e_msec_delay(100);
1312 	}
1313 
1314 	DEBUGOUT("Global reset failed.\n");
1315 	DEBUGOUT1("I40E_GLGEN_RSTAT = 0x%x\n", reg);
1316 
1317 	return I40E_ERR_RESET_FAILED;
1318 }
1319 
1320 #define I40E_PF_RESET_WAIT_COUNT	1000
1321 /**
1322  * i40e_pf_reset - Reset the PF
1323  * @hw: pointer to the hardware structure
1324  *
1325  * Assuming someone else has triggered a global reset,
1326  * assure the global reset is complete and then reset the PF
1327  **/
1328 enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw)
1329 {
1330 	u32 cnt = 0;
1331 	u32 cnt1 = 0;
1332 	u32 reg = 0;
1333 	u32 grst_del;
1334 
1335 	/* Poll for Global Reset steady state in case of recent GRST.
1336 	 * The grst delay value is in 100ms units, and we'll wait a
1337 	 * couple counts longer to be sure we don't just miss the end.
1338 	 */
1339 	grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) &
1340 			I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >>
1341 			I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
1342 
1343 	grst_del = min(grst_del * 20, 160U);
1344 
1345 	for (cnt = 0; cnt < grst_del; cnt++) {
1346 		reg = rd32(hw, I40E_GLGEN_RSTAT);
1347 		if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
1348 			break;
1349 		i40e_msec_delay(100);
1350 	}
1351 	if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1352 		DEBUGOUT("Global reset polling failed to complete.\n");
1353 		return I40E_ERR_RESET_FAILED;
1354 	}
1355 
1356 	/* Now Wait for the FW to be ready */
1357 	for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) {
1358 		reg = rd32(hw, I40E_GLNVM_ULD);
1359 		reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1360 			I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK);
1361 		if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1362 			    I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) {
1363 			DEBUGOUT1("Core and Global modules ready %d\n", cnt1);
1364 			break;
1365 		}
1366 		i40e_msec_delay(10);
1367 	}
1368 	if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1369 		     I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) {
1370 		DEBUGOUT("wait for FW Reset complete timedout\n");
1371 		DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg);
1372 		return I40E_ERR_RESET_FAILED;
1373 	}
1374 
1375 	/* If there was a Global Reset in progress when we got here,
1376 	 * we don't need to do the PF Reset
1377 	 */
1378 	if (!cnt) {
1379 		u32 reg2 = 0;
1380 
1381 		reg = rd32(hw, I40E_PFGEN_CTRL);
1382 		wr32(hw, I40E_PFGEN_CTRL,
1383 		     (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
1384 		for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) {
1385 			reg = rd32(hw, I40E_PFGEN_CTRL);
1386 			if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
1387 				break;
1388 			reg2 = rd32(hw, I40E_GLGEN_RSTAT);
1389 			if (reg2 & I40E_GLGEN_RSTAT_DEVSTATE_MASK)
1390 				break;
1391 			i40e_msec_delay(1);
1392 		}
1393 		if (reg2 & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1394 			if (i40e_poll_globr(hw, grst_del) != I40E_SUCCESS)
1395 				return I40E_ERR_RESET_FAILED;
1396 		} else if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
1397 			DEBUGOUT("PF reset polling failed to complete.\n");
1398 			return I40E_ERR_RESET_FAILED;
1399 		}
1400 	}
1401 
1402 	i40e_clear_pxe_mode(hw);
1403 
1404 
1405 	return I40E_SUCCESS;
1406 }
1407 
1408 /**
1409  * i40e_clear_hw - clear out any left over hw state
1410  * @hw: pointer to the hw struct
1411  *
1412  * Clear queues and interrupts, typically called at init time,
1413  * but after the capabilities have been found so we know how many
1414  * queues and msix vectors have been allocated.
1415  **/
1416 void i40e_clear_hw(struct i40e_hw *hw)
1417 {
1418 	u32 num_queues, base_queue;
1419 	u32 num_pf_int;
1420 	u32 num_vf_int;
1421 	u32 num_vfs;
1422 	u32 i, j;
1423 	u32 val;
1424 	u32 eol = 0x7ff;
1425 
1426 	/* get number of interrupts, queues, and vfs */
1427 	val = rd32(hw, I40E_GLPCI_CNF2);
1428 	num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >>
1429 			I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT;
1430 	num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >>
1431 			I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT;
1432 
1433 	val = rd32(hw, I40E_PFLAN_QALLOC);
1434 	base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >>
1435 			I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
1436 	j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
1437 			I40E_PFLAN_QALLOC_LASTQ_SHIFT;
1438 	if (val & I40E_PFLAN_QALLOC_VALID_MASK)
1439 		num_queues = (j - base_queue) + 1;
1440 	else
1441 		num_queues = 0;
1442 
1443 	val = rd32(hw, I40E_PF_VT_PFALLOC);
1444 	i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >>
1445 			I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
1446 	j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
1447 			I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
1448 	if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
1449 		num_vfs = (j - i) + 1;
1450 	else
1451 		num_vfs = 0;
1452 
1453 	/* stop all the interrupts */
1454 	wr32(hw, I40E_PFINT_ICR0_ENA, 0);
1455 	val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
1456 	for (i = 0; i < num_pf_int - 2; i++)
1457 		wr32(hw, I40E_PFINT_DYN_CTLN(i), val);
1458 
1459 	/* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
1460 	val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1461 	wr32(hw, I40E_PFINT_LNKLST0, val);
1462 	for (i = 0; i < num_pf_int - 2; i++)
1463 		wr32(hw, I40E_PFINT_LNKLSTN(i), val);
1464 	val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1465 	for (i = 0; i < num_vfs; i++)
1466 		wr32(hw, I40E_VPINT_LNKLST0(i), val);
1467 	for (i = 0; i < num_vf_int - 2; i++)
1468 		wr32(hw, I40E_VPINT_LNKLSTN(i), val);
1469 
1470 	/* warn the HW of the coming Tx disables */
1471 	for (i = 0; i < num_queues; i++) {
1472 		u32 abs_queue_idx = base_queue + i;
1473 		u32 reg_block = 0;
1474 
1475 		if (abs_queue_idx >= 128) {
1476 			reg_block = abs_queue_idx / 128;
1477 			abs_queue_idx %= 128;
1478 		}
1479 
1480 		val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1481 		val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1482 		val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1483 		val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1484 
1485 		wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val);
1486 	}
1487 	i40e_usec_delay(400);
1488 
1489 	/* stop all the queues */
1490 	for (i = 0; i < num_queues; i++) {
1491 		wr32(hw, I40E_QINT_TQCTL(i), 0);
1492 		wr32(hw, I40E_QTX_ENA(i), 0);
1493 		wr32(hw, I40E_QINT_RQCTL(i), 0);
1494 		wr32(hw, I40E_QRX_ENA(i), 0);
1495 	}
1496 
1497 	/* short wait for all queue disables to settle */
1498 	i40e_usec_delay(50);
1499 }
1500 
1501 /**
1502  * i40e_clear_pxe_mode - clear pxe operations mode
1503  * @hw: pointer to the hw struct
1504  *
1505  * Make sure all PXE mode settings are cleared, including things
1506  * like descriptor fetch/write-back mode.
1507  **/
1508 void i40e_clear_pxe_mode(struct i40e_hw *hw)
1509 {
1510 	if (i40e_check_asq_alive(hw))
1511 		i40e_aq_clear_pxe_mode(hw, NULL);
1512 }
1513 
1514 /**
1515  * i40e_led_is_mine - helper to find matching led
1516  * @hw: pointer to the hw struct
1517  * @idx: index into GPIO registers
1518  *
1519  * returns: 0 if no match, otherwise the value of the GPIO_CTL register
1520  */
1521 static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx)
1522 {
1523 	u32 gpio_val = 0;
1524 	u32 port;
1525 
1526 	if (!I40E_IS_X710TL_DEVICE(hw->device_id) &&
1527 	    !hw->func_caps.led[idx])
1528 		return 0;
1529 	gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx));
1530 	port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >>
1531 		I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
1532 
1533 	/* if PRT_NUM_NA is 1 then this LED is not port specific, OR
1534 	 * if it is not our port then ignore
1535 	 */
1536 	if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) ||
1537 	    (port != hw->port))
1538 		return 0;
1539 
1540 	return gpio_val;
1541 }
1542 
1543 #define I40E_COMBINED_ACTIVITY 0xA
1544 #define I40E_FILTER_ACTIVITY 0xE
1545 #define I40E_LINK_ACTIVITY 0xC
1546 #define I40E_MAC_ACTIVITY 0xD
1547 #define I40E_FW_LED BIT(4)
1548 #define I40E_LED_MODE_VALID (I40E_GLGEN_GPIO_CTL_LED_MODE_MASK >> \
1549 			     I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT)
1550 
1551 #define I40E_LED0 22
1552 
1553 #define I40E_PIN_FUNC_SDP 0x0
1554 #define I40E_PIN_FUNC_LED 0x1
1555 
1556 /**
1557  * i40e_led_get - return current on/off mode
1558  * @hw: pointer to the hw struct
1559  *
1560  * The value returned is the 'mode' field as defined in the
1561  * GPIO register definitions: 0x0 = off, 0xf = on, and other
1562  * values are variations of possible behaviors relating to
1563  * blink, link, and wire.
1564  **/
1565 u32 i40e_led_get(struct i40e_hw *hw)
1566 {
1567 	u32 mode = 0;
1568 	int i;
1569 
1570 	/* as per the documentation GPIO 22-29 are the LED
1571 	 * GPIO pins named LED0..LED7
1572 	 */
1573 	for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1574 		u32 gpio_val = i40e_led_is_mine(hw, i);
1575 
1576 		if (!gpio_val)
1577 			continue;
1578 
1579 
1580 		mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1581 			I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT;
1582 		break;
1583 	}
1584 
1585 	return mode;
1586 }
1587 
1588 /**
1589  * i40e_led_set - set new on/off mode
1590  * @hw: pointer to the hw struct
1591  * @mode: 0=off, 0xf=on (else see manual for mode details)
1592  * @blink: TRUE if the LED should blink when on, FALSE if steady
1593  *
1594  * if this function is used to turn on the blink it should
1595  * be used to disable the blink when restoring the original state.
1596  **/
1597 void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink)
1598 {
1599 	int i;
1600 
1601 	if (mode & ~I40E_LED_MODE_VALID) {
1602 		DEBUGOUT1("invalid mode passed in %X\n", mode);
1603 		return;
1604 	}
1605 
1606 	/* as per the documentation GPIO 22-29 are the LED
1607 	 * GPIO pins named LED0..LED7
1608 	 */
1609 	for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1610 		u32 gpio_val = i40e_led_is_mine(hw, i);
1611 
1612 		if (!gpio_val)
1613 			continue;
1614 
1615 
1616 		if (I40E_IS_X710TL_DEVICE(hw->device_id)) {
1617 			u32 pin_func = 0;
1618 
1619 			if (mode & I40E_FW_LED)
1620 				pin_func = I40E_PIN_FUNC_SDP;
1621 			else
1622 				pin_func = I40E_PIN_FUNC_LED;
1623 
1624 			gpio_val &= ~I40E_GLGEN_GPIO_CTL_PIN_FUNC_MASK;
1625 			gpio_val |= ((pin_func <<
1626 				     I40E_GLGEN_GPIO_CTL_PIN_FUNC_SHIFT) &
1627 				     I40E_GLGEN_GPIO_CTL_PIN_FUNC_MASK);
1628 		}
1629 		gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
1630 		/* this & is a bit of paranoia, but serves as a range check */
1631 		gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
1632 			     I40E_GLGEN_GPIO_CTL_LED_MODE_MASK);
1633 
1634 		if (blink)
1635 			gpio_val |= BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1636 		else
1637 			gpio_val &= ~BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1638 
1639 		wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
1640 		break;
1641 	}
1642 }
1643 
1644 /* Admin command wrappers */
1645 
1646 /**
1647  * i40e_aq_get_phy_capabilities
1648  * @hw: pointer to the hw struct
1649  * @abilities: structure for PHY capabilities to be filled
1650  * @qualified_modules: report Qualified Modules
1651  * @report_init: report init capabilities (active are default)
1652  * @cmd_details: pointer to command details structure or NULL
1653  *
1654  * Returns the various PHY abilities supported on the Port.
1655  **/
1656 enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
1657 			bool qualified_modules, bool report_init,
1658 			struct i40e_aq_get_phy_abilities_resp *abilities,
1659 			struct i40e_asq_cmd_details *cmd_details)
1660 {
1661 	struct i40e_aq_desc desc;
1662 	enum i40e_status_code status;
1663 	u16 max_delay = I40E_MAX_PHY_TIMEOUT, total_delay = 0;
1664 	u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
1665 
1666 	if (!abilities)
1667 		return I40E_ERR_PARAM;
1668 
1669 	do {
1670 		i40e_fill_default_direct_cmd_desc(&desc,
1671 					       i40e_aqc_opc_get_phy_abilities);
1672 
1673 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1674 		if (abilities_size > I40E_AQ_LARGE_BUF)
1675 			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1676 
1677 		if (qualified_modules)
1678 			desc.params.external.param0 |=
1679 			CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
1680 
1681 		if (report_init)
1682 			desc.params.external.param0 |=
1683 			CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
1684 
1685 		status = i40e_asq_send_command(hw, &desc, abilities,
1686 					       abilities_size, cmd_details);
1687 
1688 		switch (hw->aq.asq_last_status) {
1689 		case I40E_AQ_RC_EIO:
1690 			status = I40E_ERR_UNKNOWN_PHY;
1691 			break;
1692 		case I40E_AQ_RC_EAGAIN:
1693 			i40e_msec_delay(1);
1694 			total_delay++;
1695 			status = I40E_ERR_TIMEOUT;
1696 			break;
1697 		/* also covers I40E_AQ_RC_OK */
1698 		default:
1699 			break;
1700 		}
1701 
1702 	} while ((hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN) &&
1703 		(total_delay < max_delay));
1704 
1705 	if (status != I40E_SUCCESS)
1706 		return status;
1707 
1708 	if (report_init) {
1709 		if (hw->mac.type ==  I40E_MAC_XL710 &&
1710 		    hw->aq.api_maj_ver == I40E_FW_API_VERSION_MAJOR &&
1711 		    hw->aq.api_min_ver >= I40E_MINOR_VER_GET_LINK_INFO_XL710) {
1712 			status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
1713 		} else {
1714 			hw->phy.phy_types = LE32_TO_CPU(abilities->phy_type);
1715 			hw->phy.phy_types |=
1716 					((u64)abilities->phy_type_ext << 32);
1717 		}
1718 	}
1719 
1720 	return status;
1721 }
1722 
1723 /**
1724  * i40e_aq_set_phy_config
1725  * @hw: pointer to the hw struct
1726  * @config: structure with PHY configuration to be set
1727  * @cmd_details: pointer to command details structure or NULL
1728  *
1729  * Set the various PHY configuration parameters
1730  * supported on the Port.One or more of the Set PHY config parameters may be
1731  * ignored in an MFP mode as the PF may not have the privilege to set some
1732  * of the PHY Config parameters. This status will be indicated by the
1733  * command response.
1734  **/
1735 enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
1736 				struct i40e_aq_set_phy_config *config,
1737 				struct i40e_asq_cmd_details *cmd_details)
1738 {
1739 	struct i40e_aq_desc desc;
1740 	struct i40e_aq_set_phy_config *cmd =
1741 		(struct i40e_aq_set_phy_config *)&desc.params.raw;
1742 	enum i40e_status_code status;
1743 
1744 	if (!config)
1745 		return I40E_ERR_PARAM;
1746 
1747 	i40e_fill_default_direct_cmd_desc(&desc,
1748 					  i40e_aqc_opc_set_phy_config);
1749 
1750 	*cmd = *config;
1751 
1752 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1753 
1754 	return status;
1755 }
1756 
1757 /**
1758  * i40e_set_fc
1759  * @hw: pointer to the hw struct
1760  * @aq_failures: buffer to return AdminQ failure information
1761  * @atomic_restart: whether to enable atomic link restart
1762  *
1763  * Set the requested flow control mode using set_phy_config.
1764  **/
1765 enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
1766 				  bool atomic_restart)
1767 {
1768 	enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
1769 	struct i40e_aq_get_phy_abilities_resp abilities;
1770 	struct i40e_aq_set_phy_config config;
1771 	enum i40e_status_code status;
1772 	u8 pause_mask = 0x0;
1773 
1774 	*aq_failures = 0x0;
1775 
1776 	switch (fc_mode) {
1777 	case I40E_FC_FULL:
1778 		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1779 		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1780 		break;
1781 	case I40E_FC_RX_PAUSE:
1782 		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1783 		break;
1784 	case I40E_FC_TX_PAUSE:
1785 		pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1786 		break;
1787 	default:
1788 		break;
1789 	}
1790 
1791 	/* Get the current phy config */
1792 	status = i40e_aq_get_phy_capabilities(hw, FALSE, false, &abilities,
1793 					      NULL);
1794 	if (status) {
1795 		*aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
1796 		return status;
1797 	}
1798 
1799 	memset(&config, 0, sizeof(config));
1800 	/* clear the old pause settings */
1801 	config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
1802 			   ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
1803 	/* set the new abilities */
1804 	config.abilities |= pause_mask;
1805 	/* If the abilities have changed, then set the new config */
1806 	if (config.abilities != abilities.abilities) {
1807 		/* Auto restart link so settings take effect */
1808 		if (atomic_restart)
1809 			config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
1810 		/* Copy over all the old settings */
1811 		config.phy_type = abilities.phy_type;
1812 		config.phy_type_ext = abilities.phy_type_ext;
1813 		config.link_speed = abilities.link_speed;
1814 		config.eee_capability = abilities.eee_capability;
1815 		config.eeer = abilities.eeer_val;
1816 		config.low_power_ctrl = abilities.d3_lpan;
1817 		config.fec_config = abilities.fec_cfg_curr_mod_ext_info &
1818 				    I40E_AQ_PHY_FEC_CONFIG_MASK;
1819 		status = i40e_aq_set_phy_config(hw, &config, NULL);
1820 
1821 		if (status)
1822 			*aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
1823 	}
1824 	/* Update the link info */
1825 	status = i40e_update_link_info(hw);
1826 	if (status) {
1827 		/* Wait a little bit (on 40G cards it sometimes takes a really
1828 		 * long time for link to come back from the atomic reset)
1829 		 * and try once more
1830 		 */
1831 		i40e_msec_delay(1000);
1832 		status = i40e_update_link_info(hw);
1833 	}
1834 	if (status)
1835 		*aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
1836 
1837 	return status;
1838 }
1839 
1840 /**
1841  * i40e_aq_set_mac_config
1842  * @hw: pointer to the hw struct
1843  * @max_frame_size: Maximum Frame Size to be supported by the port
1844  * @crc_en: Tell HW to append a CRC to outgoing frames
1845  * @pacing: Pacing configurations
1846  * @auto_drop_blocking_packets: Tell HW to drop packets if TC queue is blocked
1847  * @cmd_details: pointer to command details structure or NULL
1848  *
1849  * Configure MAC settings for frame size, jumbo frame support and the
1850  * addition of a CRC by the hardware.
1851  **/
1852 enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
1853 				u16 max_frame_size,
1854 				bool crc_en, u16 pacing,
1855 				bool auto_drop_blocking_packets,
1856 				struct i40e_asq_cmd_details *cmd_details)
1857 {
1858 	struct i40e_aq_desc desc;
1859 	struct i40e_aq_set_mac_config *cmd =
1860 		(struct i40e_aq_set_mac_config *)&desc.params.raw;
1861 	enum i40e_status_code status;
1862 
1863 	if (max_frame_size == 0)
1864 		return I40E_ERR_PARAM;
1865 
1866 	i40e_fill_default_direct_cmd_desc(&desc,
1867 					  i40e_aqc_opc_set_mac_config);
1868 
1869 	cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
1870 	cmd->params = ((u8)pacing & 0x0F) << 3;
1871 	if (crc_en)
1872 		cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
1873 
1874 	if (auto_drop_blocking_packets) {
1875 		if (hw->flags & I40E_HW_FLAG_DROP_MODE)
1876 			cmd->params |=
1877 				I40E_AQ_SET_MAC_CONFIG_DROP_BLOCKING_PACKET_EN;
1878 		else
1879 			i40e_debug(hw, I40E_DEBUG_ALL,
1880 				   "This FW api version does not support drop mode.\n");
1881 	}
1882 
1883 #define I40E_AQ_SET_MAC_CONFIG_FC_DEFAULT_THRESHOLD	0x7FFF
1884 	cmd->fc_refresh_threshold =
1885 		CPU_TO_LE16(I40E_AQ_SET_MAC_CONFIG_FC_DEFAULT_THRESHOLD);
1886 
1887 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1888 
1889 	return status;
1890 }
1891 
1892 /**
1893  * i40e_aq_clear_pxe_mode
1894  * @hw: pointer to the hw struct
1895  * @cmd_details: pointer to command details structure or NULL
1896  *
1897  * Tell the firmware that the driver is taking over from PXE
1898  **/
1899 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
1900 			struct i40e_asq_cmd_details *cmd_details)
1901 {
1902 	enum i40e_status_code status;
1903 	struct i40e_aq_desc desc;
1904 	struct i40e_aqc_clear_pxe *cmd =
1905 		(struct i40e_aqc_clear_pxe *)&desc.params.raw;
1906 
1907 	i40e_fill_default_direct_cmd_desc(&desc,
1908 					  i40e_aqc_opc_clear_pxe_mode);
1909 
1910 	cmd->rx_cnt = 0x2;
1911 
1912 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1913 
1914 	wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
1915 
1916 	return status;
1917 }
1918 
1919 /**
1920  * i40e_aq_set_link_restart_an
1921  * @hw: pointer to the hw struct
1922  * @enable_link: if TRUE: enable link, if FALSE: disable link
1923  * @cmd_details: pointer to command details structure or NULL
1924  *
1925  * Sets up the link and restarts the Auto-Negotiation over the link.
1926  **/
1927 enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
1928 		bool enable_link, struct i40e_asq_cmd_details *cmd_details)
1929 {
1930 	struct i40e_aq_desc desc;
1931 	struct i40e_aqc_set_link_restart_an *cmd =
1932 		(struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
1933 	enum i40e_status_code status;
1934 
1935 	i40e_fill_default_direct_cmd_desc(&desc,
1936 					  i40e_aqc_opc_set_link_restart_an);
1937 
1938 	cmd->command = I40E_AQ_PHY_RESTART_AN;
1939 	if (enable_link)
1940 		cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
1941 	else
1942 		cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
1943 
1944 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1945 
1946 	return status;
1947 }
1948 
1949 /**
1950  * i40e_aq_get_link_info
1951  * @hw: pointer to the hw struct
1952  * @enable_lse: enable/disable LinkStatusEvent reporting
1953  * @link: pointer to link status structure - optional
1954  * @cmd_details: pointer to command details structure or NULL
1955  *
1956  * Returns the link status of the adapter.
1957  **/
1958 enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
1959 				bool enable_lse, struct i40e_link_status *link,
1960 				struct i40e_asq_cmd_details *cmd_details)
1961 {
1962 	struct i40e_aq_desc desc;
1963 	struct i40e_aqc_get_link_status *resp =
1964 		(struct i40e_aqc_get_link_status *)&desc.params.raw;
1965 	struct i40e_link_status *hw_link_info = &hw->phy.link_info;
1966 	enum i40e_status_code status;
1967 	bool tx_pause, rx_pause;
1968 	u16 command_flags;
1969 
1970 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
1971 
1972 	if (enable_lse)
1973 		command_flags = I40E_AQ_LSE_ENABLE;
1974 	else
1975 		command_flags = I40E_AQ_LSE_DISABLE;
1976 	resp->command_flags = CPU_TO_LE16(command_flags);
1977 
1978 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1979 
1980 	if (status != I40E_SUCCESS)
1981 		goto aq_get_link_info_exit;
1982 
1983 	/* save off old link status information */
1984 	i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
1985 		    sizeof(*hw_link_info), I40E_NONDMA_TO_NONDMA);
1986 
1987 	/* update link status */
1988 	hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
1989 	hw->phy.media_type = i40e_get_media_type(hw);
1990 	hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
1991 	hw_link_info->link_info = resp->link_info;
1992 	hw_link_info->an_info = resp->an_info;
1993 	hw_link_info->fec_info = resp->config & (I40E_AQ_CONFIG_FEC_KR_ENA |
1994 						 I40E_AQ_CONFIG_FEC_RS_ENA);
1995 	hw_link_info->ext_info = resp->ext_info;
1996 	hw_link_info->loopback = resp->loopback & I40E_AQ_LOOPBACK_MASK;
1997 	hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
1998 	hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
1999 
2000 	/* update fc info */
2001 	tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
2002 	rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
2003 	if (tx_pause & rx_pause)
2004 		hw->fc.current_mode = I40E_FC_FULL;
2005 	else if (tx_pause)
2006 		hw->fc.current_mode = I40E_FC_TX_PAUSE;
2007 	else if (rx_pause)
2008 		hw->fc.current_mode = I40E_FC_RX_PAUSE;
2009 	else
2010 		hw->fc.current_mode = I40E_FC_NONE;
2011 
2012 	if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
2013 		hw_link_info->crc_enable = TRUE;
2014 	else
2015 		hw_link_info->crc_enable = FALSE;
2016 
2017 	if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_IS_ENABLED))
2018 		hw_link_info->lse_enable = TRUE;
2019 	else
2020 		hw_link_info->lse_enable = FALSE;
2021 
2022 	if ((hw->mac.type == I40E_MAC_XL710) &&
2023 	    (hw->aq.fw_maj_ver < 4 || (hw->aq.fw_maj_ver == 4 &&
2024 	     hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
2025 		hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
2026 
2027 	/* 'Get Link Status' response data structure from X722 FW has
2028 	 * different format and does not contain this information
2029 	 */
2030 	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE &&
2031 	    hw->mac.type != I40E_MAC_X722) {
2032 		__le32 tmp;
2033 
2034 		i40e_memcpy(&tmp, resp->link_type, sizeof(tmp),
2035 			    I40E_NONDMA_TO_NONDMA);
2036 		hw->phy.phy_types = LE32_TO_CPU(tmp);
2037 		hw->phy.phy_types |= ((u64)resp->link_type_ext << 32);
2038 	}
2039 
2040 	/* save link status information */
2041 	if (link)
2042 		i40e_memcpy(link, hw_link_info, sizeof(*hw_link_info),
2043 			    I40E_NONDMA_TO_NONDMA);
2044 
2045 	/* flag cleared so helper functions don't call AQ again */
2046 	hw->phy.get_link_info = FALSE;
2047 
2048 aq_get_link_info_exit:
2049 	return status;
2050 }
2051 
2052 /**
2053  * i40e_aq_set_phy_int_mask
2054  * @hw: pointer to the hw struct
2055  * @mask: interrupt mask to be set
2056  * @cmd_details: pointer to command details structure or NULL
2057  *
2058  * Set link interrupt mask.
2059  **/
2060 enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
2061 				u16 mask,
2062 				struct i40e_asq_cmd_details *cmd_details)
2063 {
2064 	struct i40e_aq_desc desc;
2065 	struct i40e_aqc_set_phy_int_mask *cmd =
2066 		(struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
2067 	enum i40e_status_code status;
2068 
2069 	i40e_fill_default_direct_cmd_desc(&desc,
2070 					  i40e_aqc_opc_set_phy_int_mask);
2071 
2072 	cmd->event_mask = CPU_TO_LE16(mask);
2073 
2074 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2075 
2076 	return status;
2077 }
2078 
2079 /**
2080  * i40e_aq_get_local_advt_reg
2081  * @hw: pointer to the hw struct
2082  * @advt_reg: local AN advertisement register value
2083  * @cmd_details: pointer to command details structure or NULL
2084  *
2085  * Get the Local AN advertisement register value.
2086  **/
2087 enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
2088 				u64 *advt_reg,
2089 				struct i40e_asq_cmd_details *cmd_details)
2090 {
2091 	struct i40e_aq_desc desc;
2092 	struct i40e_aqc_an_advt_reg *resp =
2093 		(struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2094 	enum i40e_status_code status;
2095 
2096 	i40e_fill_default_direct_cmd_desc(&desc,
2097 					  i40e_aqc_opc_get_local_advt_reg);
2098 
2099 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2100 
2101 	if (status != I40E_SUCCESS)
2102 		goto aq_get_local_advt_reg_exit;
2103 
2104 	*advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2105 	*advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2106 
2107 aq_get_local_advt_reg_exit:
2108 	return status;
2109 }
2110 
2111 /**
2112  * i40e_aq_set_local_advt_reg
2113  * @hw: pointer to the hw struct
2114  * @advt_reg: local AN advertisement register value
2115  * @cmd_details: pointer to command details structure or NULL
2116  *
2117  * Get the Local AN advertisement register value.
2118  **/
2119 enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
2120 				u64 advt_reg,
2121 				struct i40e_asq_cmd_details *cmd_details)
2122 {
2123 	struct i40e_aq_desc desc;
2124 	struct i40e_aqc_an_advt_reg *cmd =
2125 		(struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2126 	enum i40e_status_code status;
2127 
2128 	i40e_fill_default_direct_cmd_desc(&desc,
2129 					  i40e_aqc_opc_get_local_advt_reg);
2130 
2131 	cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
2132 	cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
2133 
2134 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2135 
2136 	return status;
2137 }
2138 
2139 /**
2140  * i40e_aq_get_partner_advt
2141  * @hw: pointer to the hw struct
2142  * @advt_reg: AN partner advertisement register value
2143  * @cmd_details: pointer to command details structure or NULL
2144  *
2145  * Get the link partner AN advertisement register value.
2146  **/
2147 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
2148 				u64 *advt_reg,
2149 				struct i40e_asq_cmd_details *cmd_details)
2150 {
2151 	struct i40e_aq_desc desc;
2152 	struct i40e_aqc_an_advt_reg *resp =
2153 		(struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2154 	enum i40e_status_code status;
2155 
2156 	i40e_fill_default_direct_cmd_desc(&desc,
2157 					  i40e_aqc_opc_get_partner_advt);
2158 
2159 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2160 
2161 	if (status != I40E_SUCCESS)
2162 		goto aq_get_partner_advt_exit;
2163 
2164 	*advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2165 	*advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2166 
2167 aq_get_partner_advt_exit:
2168 	return status;
2169 }
2170 
2171 /**
2172  * i40e_aq_set_lb_modes
2173  * @hw: pointer to the hw struct
2174  * @lb_modes: loopback mode to be set
2175  * @cmd_details: pointer to command details structure or NULL
2176  *
2177  * Sets loopback modes.
2178  **/
2179 enum i40e_status_code
2180 i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 lb_type, u8 speed,
2181 		     struct i40e_asq_cmd_details *cmd_details)
2182 {
2183 	struct i40e_aq_desc desc;
2184 	struct i40e_aqc_set_lb_mode *cmd =
2185 		(struct i40e_aqc_set_lb_mode *)&desc.params.raw;
2186 	enum i40e_status_code status;
2187 
2188 	i40e_fill_default_direct_cmd_desc(&desc,
2189 					  i40e_aqc_opc_set_lb_modes);
2190 
2191 	cmd->lb_level = lb_level;
2192 	cmd->lb_type = lb_type;
2193 	cmd->speed = speed;
2194 	if (speed)
2195 		cmd->force_speed = 1;
2196 
2197 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2198 
2199 	return status;
2200 }
2201 
2202 /**
2203  * i40e_aq_set_phy_debug
2204  * @hw: pointer to the hw struct
2205  * @cmd_flags: debug command flags
2206  * @cmd_details: pointer to command details structure or NULL
2207  *
2208  * Reset the external PHY.
2209  **/
2210 enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
2211 				struct i40e_asq_cmd_details *cmd_details)
2212 {
2213 	struct i40e_aq_desc desc;
2214 	struct i40e_aqc_set_phy_debug *cmd =
2215 		(struct i40e_aqc_set_phy_debug *)&desc.params.raw;
2216 	enum i40e_status_code status;
2217 
2218 	i40e_fill_default_direct_cmd_desc(&desc,
2219 					  i40e_aqc_opc_set_phy_debug);
2220 
2221 	cmd->command_flags = cmd_flags;
2222 
2223 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2224 
2225 	return status;
2226 }
2227 
2228 /**
2229  * i40e_hw_ver_ge
2230  * @hw: pointer to the hw struct
2231  * @maj: api major value
2232  * @min: api minor value
2233  *
2234  * Assert whether current HW api version is greater/equal than provided.
2235  **/
2236 static bool i40e_hw_ver_ge(struct i40e_hw *hw, u16 maj, u16 min)
2237 {
2238 	if (hw->aq.api_maj_ver > maj ||
2239 	    (hw->aq.api_maj_ver == maj && hw->aq.api_min_ver >= min))
2240 		return TRUE;
2241 	return FALSE;
2242 }
2243 
2244 /**
2245  * i40e_aq_add_vsi
2246  * @hw: pointer to the hw struct
2247  * @vsi_ctx: pointer to a vsi context struct
2248  * @cmd_details: pointer to command details structure or NULL
2249  *
2250  * Add a VSI context to the hardware.
2251 **/
2252 enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
2253 				struct i40e_vsi_context *vsi_ctx,
2254 				struct i40e_asq_cmd_details *cmd_details)
2255 {
2256 	struct i40e_aq_desc desc;
2257 	struct i40e_aqc_add_get_update_vsi *cmd =
2258 		(struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2259 	struct i40e_aqc_add_get_update_vsi_completion *resp =
2260 		(struct i40e_aqc_add_get_update_vsi_completion *)
2261 		&desc.params.raw;
2262 	enum i40e_status_code status;
2263 
2264 	i40e_fill_default_direct_cmd_desc(&desc,
2265 					  i40e_aqc_opc_add_vsi);
2266 
2267 	cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
2268 	cmd->connection_type = vsi_ctx->connection_type;
2269 	cmd->vf_id = vsi_ctx->vf_num;
2270 	cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
2271 
2272 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2273 
2274 	status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2275 				       sizeof(vsi_ctx->info), cmd_details);
2276 
2277 	if (status != I40E_SUCCESS)
2278 		goto aq_add_vsi_exit;
2279 
2280 	vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2281 	vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2282 	vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2283 	vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2284 
2285 aq_add_vsi_exit:
2286 	return status;
2287 }
2288 
2289 /**
2290  * i40e_aq_set_default_vsi
2291  * @hw: pointer to the hw struct
2292  * @seid: vsi number
2293  * @cmd_details: pointer to command details structure or NULL
2294  **/
2295 enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
2296 				u16 seid,
2297 				struct i40e_asq_cmd_details *cmd_details)
2298 {
2299 	struct i40e_aq_desc desc;
2300 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2301 		(struct i40e_aqc_set_vsi_promiscuous_modes *)
2302 		&desc.params.raw;
2303 	enum i40e_status_code status;
2304 
2305 	i40e_fill_default_direct_cmd_desc(&desc,
2306 					i40e_aqc_opc_set_vsi_promiscuous_modes);
2307 
2308 	cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2309 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2310 	cmd->seid = CPU_TO_LE16(seid);
2311 
2312 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2313 
2314 	return status;
2315 }
2316 
2317 /**
2318  * i40e_aq_clear_default_vsi
2319  * @hw: pointer to the hw struct
2320  * @seid: vsi number
2321  * @cmd_details: pointer to command details structure or NULL
2322  **/
2323 enum i40e_status_code i40e_aq_clear_default_vsi(struct i40e_hw *hw,
2324 				u16 seid,
2325 				struct i40e_asq_cmd_details *cmd_details)
2326 {
2327 	struct i40e_aq_desc desc;
2328 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2329 		(struct i40e_aqc_set_vsi_promiscuous_modes *)
2330 		&desc.params.raw;
2331 	enum i40e_status_code status;
2332 
2333 	i40e_fill_default_direct_cmd_desc(&desc,
2334 					i40e_aqc_opc_set_vsi_promiscuous_modes);
2335 
2336 	cmd->promiscuous_flags = CPU_TO_LE16(0);
2337 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2338 	cmd->seid = CPU_TO_LE16(seid);
2339 
2340 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2341 
2342 	return status;
2343 }
2344 
2345 /**
2346  * i40e_aq_set_vsi_unicast_promiscuous
2347  * @hw: pointer to the hw struct
2348  * @seid: vsi number
2349  * @set: set unicast promiscuous enable/disable
2350  * @cmd_details: pointer to command details structure or NULL
2351  * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
2352  **/
2353 enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
2354 				u16 seid, bool set,
2355 				struct i40e_asq_cmd_details *cmd_details,
2356 				bool rx_only_promisc)
2357 {
2358 	struct i40e_aq_desc desc;
2359 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2360 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2361 	enum i40e_status_code status;
2362 	u16 flags = 0;
2363 
2364 	i40e_fill_default_direct_cmd_desc(&desc,
2365 					i40e_aqc_opc_set_vsi_promiscuous_modes);
2366 
2367 	if (set) {
2368 		flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2369 		if (rx_only_promisc && i40e_hw_ver_ge(hw, 1, 5))
2370 			flags |= I40E_AQC_SET_VSI_PROMISC_RX_ONLY;
2371 	}
2372 
2373 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
2374 
2375 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2376 	if (i40e_hw_ver_ge(hw, 1, 5))
2377 		cmd->valid_flags |=
2378 			CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_RX_ONLY);
2379 
2380 	cmd->seid = CPU_TO_LE16(seid);
2381 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2382 
2383 	return status;
2384 }
2385 
2386 /**
2387  * i40e_aq_set_vsi_multicast_promiscuous
2388  * @hw: pointer to the hw struct
2389  * @seid: vsi number
2390  * @set: set multicast promiscuous enable/disable
2391  * @cmd_details: pointer to command details structure or NULL
2392  **/
2393 enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
2394 				u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
2395 {
2396 	struct i40e_aq_desc desc;
2397 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2398 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2399 	enum i40e_status_code status;
2400 	u16 flags = 0;
2401 
2402 	i40e_fill_default_direct_cmd_desc(&desc,
2403 					i40e_aqc_opc_set_vsi_promiscuous_modes);
2404 
2405 	if (set)
2406 		flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2407 
2408 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
2409 
2410 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2411 
2412 	cmd->seid = CPU_TO_LE16(seid);
2413 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2414 
2415 	return status;
2416 }
2417 
2418 /**
2419 * i40e_aq_set_vsi_full_promiscuous
2420 * @hw: pointer to the hw struct
2421 * @seid: VSI number
2422 * @set: set promiscuous enable/disable
2423 * @cmd_details: pointer to command details structure or NULL
2424 **/
2425 enum i40e_status_code i40e_aq_set_vsi_full_promiscuous(struct i40e_hw *hw,
2426 				u16 seid, bool set,
2427 				struct i40e_asq_cmd_details *cmd_details)
2428 {
2429 	struct i40e_aq_desc desc;
2430 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2431 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2432 	enum i40e_status_code status;
2433 	u16 flags = 0;
2434 
2435 	i40e_fill_default_direct_cmd_desc(&desc,
2436 		i40e_aqc_opc_set_vsi_promiscuous_modes);
2437 
2438 	if (set)
2439 		flags = I40E_AQC_SET_VSI_PROMISC_UNICAST   |
2440 			I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2441 			I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2442 
2443 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
2444 
2445 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST   |
2446 				       I40E_AQC_SET_VSI_PROMISC_MULTICAST |
2447 				       I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2448 
2449 	cmd->seid = CPU_TO_LE16(seid);
2450 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2451 
2452 	return status;
2453 }
2454 
2455 /**
2456  * i40e_aq_set_vsi_mc_promisc_on_vlan
2457  * @hw: pointer to the hw struct
2458  * @seid: vsi number
2459  * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2460  * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
2461  * @cmd_details: pointer to command details structure or NULL
2462  **/
2463 enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
2464 				u16 seid, bool enable, u16 vid,
2465 				struct i40e_asq_cmd_details *cmd_details)
2466 {
2467 	struct i40e_aq_desc desc;
2468 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2469 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2470 	enum i40e_status_code status;
2471 	u16 flags = 0;
2472 
2473 	i40e_fill_default_direct_cmd_desc(&desc,
2474 					i40e_aqc_opc_set_vsi_promiscuous_modes);
2475 
2476 	if (enable)
2477 		flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2478 
2479 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
2480 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2481 	cmd->seid = CPU_TO_LE16(seid);
2482 	cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2483 
2484 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2485 
2486 	return status;
2487 }
2488 
2489 /**
2490  * i40e_aq_set_vsi_uc_promisc_on_vlan
2491  * @hw: pointer to the hw struct
2492  * @seid: vsi number
2493  * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2494  * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
2495  * @cmd_details: pointer to command details structure or NULL
2496  **/
2497 enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
2498 				u16 seid, bool enable, u16 vid,
2499 				struct i40e_asq_cmd_details *cmd_details)
2500 {
2501 	struct i40e_aq_desc desc;
2502 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2503 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2504 	enum i40e_status_code status;
2505 	u16 flags = 0;
2506 
2507 	i40e_fill_default_direct_cmd_desc(&desc,
2508 					i40e_aqc_opc_set_vsi_promiscuous_modes);
2509 
2510 	if (enable) {
2511 		flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2512 		if (i40e_hw_ver_ge(hw, 1, 5))
2513 			flags |= I40E_AQC_SET_VSI_PROMISC_RX_ONLY;
2514 	}
2515 
2516 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
2517 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2518 	if (i40e_hw_ver_ge(hw, 1, 5))
2519 		cmd->valid_flags |=
2520 			CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_RX_ONLY);
2521 	cmd->seid = CPU_TO_LE16(seid);
2522 	cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2523 
2524 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2525 
2526 	return status;
2527 }
2528 
2529 /**
2530  * i40e_aq_set_vsi_bc_promisc_on_vlan
2531  * @hw: pointer to the hw struct
2532  * @seid: vsi number
2533  * @enable: set broadcast promiscuous enable/disable for a given VLAN
2534  * @vid: The VLAN tag filter - capture any broadcast packet with this VLAN tag
2535  * @cmd_details: pointer to command details structure or NULL
2536  **/
2537 enum i40e_status_code i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw *hw,
2538 				u16 seid, bool enable, u16 vid,
2539 				struct i40e_asq_cmd_details *cmd_details)
2540 {
2541 	struct i40e_aq_desc desc;
2542 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2543 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2544 	enum i40e_status_code status;
2545 	u16 flags = 0;
2546 
2547 	i40e_fill_default_direct_cmd_desc(&desc,
2548 					i40e_aqc_opc_set_vsi_promiscuous_modes);
2549 
2550 	if (enable)
2551 		flags |= I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2552 
2553 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
2554 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2555 	cmd->seid = CPU_TO_LE16(seid);
2556 	cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2557 
2558 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2559 
2560 	return status;
2561 }
2562 
2563 /**
2564  * i40e_aq_set_vsi_broadcast
2565  * @hw: pointer to the hw struct
2566  * @seid: vsi number
2567  * @set_filter: TRUE to set filter, FALSE to clear filter
2568  * @cmd_details: pointer to command details structure or NULL
2569  *
2570  * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
2571  **/
2572 enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
2573 				u16 seid, bool set_filter,
2574 				struct i40e_asq_cmd_details *cmd_details)
2575 {
2576 	struct i40e_aq_desc desc;
2577 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2578 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2579 	enum i40e_status_code status;
2580 
2581 	i40e_fill_default_direct_cmd_desc(&desc,
2582 					i40e_aqc_opc_set_vsi_promiscuous_modes);
2583 
2584 	if (set_filter)
2585 		cmd->promiscuous_flags
2586 			    |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2587 	else
2588 		cmd->promiscuous_flags
2589 			    &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2590 
2591 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2592 	cmd->seid = CPU_TO_LE16(seid);
2593 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2594 
2595 	return status;
2596 }
2597 
2598 /**
2599  * i40e_aq_set_vsi_vlan_promisc - control the VLAN promiscuous setting
2600  * @hw: pointer to the hw struct
2601  * @seid: vsi number
2602  * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2603  * @cmd_details: pointer to command details structure or NULL
2604  **/
2605 enum i40e_status_code i40e_aq_set_vsi_vlan_promisc(struct i40e_hw *hw,
2606 				u16 seid, bool enable,
2607 				struct i40e_asq_cmd_details *cmd_details)
2608 {
2609 	struct i40e_aq_desc desc;
2610 	struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2611 		(struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2612 	enum i40e_status_code status;
2613 	u16 flags = 0;
2614 
2615 	i40e_fill_default_direct_cmd_desc(&desc,
2616 					i40e_aqc_opc_set_vsi_promiscuous_modes);
2617 	if (enable)
2618 		flags |= I40E_AQC_SET_VSI_PROMISC_VLAN;
2619 
2620 	cmd->promiscuous_flags = CPU_TO_LE16(flags);
2621 	cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_VLAN);
2622 	cmd->seid = CPU_TO_LE16(seid);
2623 
2624 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2625 
2626 	return status;
2627 }
2628 
2629 /**
2630  * i40e_aq_get_vsi_params - get VSI configuration info
2631  * @hw: pointer to the hw struct
2632  * @vsi_ctx: pointer to a vsi context struct
2633  * @cmd_details: pointer to command details structure or NULL
2634  **/
2635 enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
2636 				struct i40e_vsi_context *vsi_ctx,
2637 				struct i40e_asq_cmd_details *cmd_details)
2638 {
2639 	struct i40e_aq_desc desc;
2640 	struct i40e_aqc_add_get_update_vsi *cmd =
2641 		(struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2642 	struct i40e_aqc_add_get_update_vsi_completion *resp =
2643 		(struct i40e_aqc_add_get_update_vsi_completion *)
2644 		&desc.params.raw;
2645 	enum i40e_status_code status;
2646 
2647 	i40e_fill_default_direct_cmd_desc(&desc,
2648 					  i40e_aqc_opc_get_vsi_parameters);
2649 
2650 	cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2651 
2652 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2653 
2654 	status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2655 				    sizeof(vsi_ctx->info), NULL);
2656 
2657 	if (status != I40E_SUCCESS)
2658 		goto aq_get_vsi_params_exit;
2659 
2660 	vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2661 	vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2662 	vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2663 	vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2664 
2665 aq_get_vsi_params_exit:
2666 	return status;
2667 }
2668 
2669 /**
2670  * i40e_aq_update_vsi_params
2671  * @hw: pointer to the hw struct
2672  * @vsi_ctx: pointer to a vsi context struct
2673  * @cmd_details: pointer to command details structure or NULL
2674  *
2675  * Update a VSI context.
2676  **/
2677 enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
2678 				struct i40e_vsi_context *vsi_ctx,
2679 				struct i40e_asq_cmd_details *cmd_details)
2680 {
2681 	struct i40e_aq_desc desc;
2682 	struct i40e_aqc_add_get_update_vsi *cmd =
2683 		(struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2684 	struct i40e_aqc_add_get_update_vsi_completion *resp =
2685 		(struct i40e_aqc_add_get_update_vsi_completion *)
2686 		&desc.params.raw;
2687 	enum i40e_status_code status;
2688 
2689 	i40e_fill_default_direct_cmd_desc(&desc,
2690 					  i40e_aqc_opc_update_vsi_parameters);
2691 	cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2692 
2693 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2694 
2695 	status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2696 				       sizeof(vsi_ctx->info), cmd_details);
2697 
2698 	vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2699 	vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2700 
2701 	return status;
2702 }
2703 
2704 /**
2705  * i40e_aq_get_switch_config
2706  * @hw: pointer to the hardware structure
2707  * @buf: pointer to the result buffer
2708  * @buf_size: length of input buffer
2709  * @start_seid: seid to start for the report, 0 == beginning
2710  * @cmd_details: pointer to command details structure or NULL
2711  *
2712  * Fill the buf with switch configuration returned from AdminQ command
2713  **/
2714 enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
2715 				struct i40e_aqc_get_switch_config_resp *buf,
2716 				u16 buf_size, u16 *start_seid,
2717 				struct i40e_asq_cmd_details *cmd_details)
2718 {
2719 	struct i40e_aq_desc desc;
2720 	struct i40e_aqc_switch_seid *scfg =
2721 		(struct i40e_aqc_switch_seid *)&desc.params.raw;
2722 	enum i40e_status_code status;
2723 
2724 	i40e_fill_default_direct_cmd_desc(&desc,
2725 					  i40e_aqc_opc_get_switch_config);
2726 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2727 	if (buf_size > I40E_AQ_LARGE_BUF)
2728 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2729 	scfg->seid = CPU_TO_LE16(*start_seid);
2730 
2731 	status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
2732 	*start_seid = LE16_TO_CPU(scfg->seid);
2733 
2734 	return status;
2735 }
2736 
2737 /**
2738  * i40e_aq_set_switch_config
2739  * @hw: pointer to the hardware structure
2740  * @flags: bit flag values to set
2741  * @mode: cloud filter mode
2742  * @valid_flags: which bit flags to set
2743  * @cmd_details: pointer to command details structure or NULL
2744  *
2745  * Set switch configuration bits
2746  **/
2747 enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
2748 				u16 flags, u16 valid_flags, u8 mode,
2749 				struct i40e_asq_cmd_details *cmd_details)
2750 {
2751 	struct i40e_aq_desc desc;
2752 	struct i40e_aqc_set_switch_config *scfg =
2753 		(struct i40e_aqc_set_switch_config *)&desc.params.raw;
2754 	enum i40e_status_code status;
2755 
2756 	i40e_fill_default_direct_cmd_desc(&desc,
2757 					  i40e_aqc_opc_set_switch_config);
2758 	scfg->flags = CPU_TO_LE16(flags);
2759 	scfg->valid_flags = CPU_TO_LE16(valid_flags);
2760 	scfg->mode = mode;
2761 	if (hw->flags & I40E_HW_FLAG_802_1AD_CAPABLE) {
2762 		scfg->switch_tag = CPU_TO_LE16(hw->switch_tag);
2763 		scfg->first_tag = CPU_TO_LE16(hw->first_tag);
2764 		scfg->second_tag = CPU_TO_LE16(hw->second_tag);
2765 	}
2766 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2767 
2768 	return status;
2769 }
2770 
2771 /**
2772  * i40e_aq_get_firmware_version
2773  * @hw: pointer to the hw struct
2774  * @fw_major_version: firmware major version
2775  * @fw_minor_version: firmware minor version
2776  * @fw_build: firmware build number
2777  * @api_major_version: major queue version
2778  * @api_minor_version: minor queue version
2779  * @cmd_details: pointer to command details structure or NULL
2780  *
2781  * Get the firmware version from the admin queue commands
2782  **/
2783 enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
2784 				u16 *fw_major_version, u16 *fw_minor_version,
2785 				u32 *fw_build,
2786 				u16 *api_major_version, u16 *api_minor_version,
2787 				struct i40e_asq_cmd_details *cmd_details)
2788 {
2789 	struct i40e_aq_desc desc;
2790 	struct i40e_aqc_get_version *resp =
2791 		(struct i40e_aqc_get_version *)&desc.params.raw;
2792 	enum i40e_status_code status;
2793 
2794 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
2795 
2796 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2797 
2798 	if (status == I40E_SUCCESS) {
2799 		if (fw_major_version != NULL)
2800 			*fw_major_version = LE16_TO_CPU(resp->fw_major);
2801 		if (fw_minor_version != NULL)
2802 			*fw_minor_version = LE16_TO_CPU(resp->fw_minor);
2803 		if (fw_build != NULL)
2804 			*fw_build = LE32_TO_CPU(resp->fw_build);
2805 		if (api_major_version != NULL)
2806 			*api_major_version = LE16_TO_CPU(resp->api_major);
2807 		if (api_minor_version != NULL)
2808 			*api_minor_version = LE16_TO_CPU(resp->api_minor);
2809 
2810 		/* A workaround to fix the API version in SW */
2811 		if (api_major_version && api_minor_version &&
2812 		    fw_major_version && fw_minor_version &&
2813 		    ((*api_major_version == 1) && (*api_minor_version == 1)) &&
2814 		    (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
2815 		     (*fw_major_version > 4)))
2816 			*api_minor_version = 2;
2817 	}
2818 
2819 	return status;
2820 }
2821 
2822 /**
2823  * i40e_aq_send_driver_version
2824  * @hw: pointer to the hw struct
2825  * @dv: driver's major, minor version
2826  * @cmd_details: pointer to command details structure or NULL
2827  *
2828  * Send the driver version to the firmware
2829  **/
2830 enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
2831 				struct i40e_driver_version *dv,
2832 				struct i40e_asq_cmd_details *cmd_details)
2833 {
2834 	struct i40e_aq_desc desc;
2835 	struct i40e_aqc_driver_version *cmd =
2836 		(struct i40e_aqc_driver_version *)&desc.params.raw;
2837 	enum i40e_status_code status;
2838 	u16 len;
2839 
2840 	if (dv == NULL)
2841 		return I40E_ERR_PARAM;
2842 
2843 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
2844 
2845 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
2846 	cmd->driver_major_ver = dv->major_version;
2847 	cmd->driver_minor_ver = dv->minor_version;
2848 	cmd->driver_build_ver = dv->build_version;
2849 	cmd->driver_subbuild_ver = dv->subbuild_version;
2850 
2851 	len = 0;
2852 	while (len < sizeof(dv->driver_string) &&
2853 	       (dv->driver_string[len] < 0x80) &&
2854 	       dv->driver_string[len])
2855 		len++;
2856 	status = i40e_asq_send_command(hw, &desc, dv->driver_string,
2857 				       len, cmd_details);
2858 
2859 	return status;
2860 }
2861 
2862 /**
2863  * i40e_get_link_status - get status of the HW network link
2864  * @hw: pointer to the hw struct
2865  * @link_up: pointer to bool (TRUE/FALSE = linkup/linkdown)
2866  *
2867  * Variable link_up TRUE if link is up, FALSE if link is down.
2868  * The variable link_up is invalid if returned value of status != I40E_SUCCESS
2869  *
2870  * Side effect: LinkStatusEvent reporting becomes enabled
2871  **/
2872 enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
2873 {
2874 	enum i40e_status_code status = I40E_SUCCESS;
2875 
2876 	if (hw->phy.get_link_info) {
2877 		status = i40e_update_link_info(hw);
2878 
2879 		if (status != I40E_SUCCESS)
2880 			i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
2881 				   status);
2882 	}
2883 
2884 	*link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
2885 
2886 	return status;
2887 }
2888 
2889 /**
2890  * i40e_update_link_info - update status of the HW network link
2891  * @hw: pointer to the hw struct
2892  **/
2893 enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
2894 {
2895 	struct i40e_aq_get_phy_abilities_resp abilities;
2896 	enum i40e_status_code status = I40E_SUCCESS;
2897 
2898 	status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
2899 	if (status)
2900 		return status;
2901 
2902 	/* extra checking needed to ensure link info to user is timely */
2903 	if (((hw->phy.link_info.link_info & I40E_AQ_MEDIA_AVAILABLE) &&
2904 	     ((hw->phy.link_info.link_info & I40E_AQ_LINK_UP) ||
2905 	      !(hw->phy.link_info_old.link_info & I40E_AQ_LINK_UP))) ||
2906 	    hw->mac.type == I40E_MAC_X722) {
2907 		status = i40e_aq_get_phy_capabilities(hw, FALSE,
2908 						      hw->mac.type ==
2909 						      I40E_MAC_X722,
2910 						      &abilities, NULL);
2911 		if (status)
2912 			return status;
2913 
2914 		if (abilities.fec_cfg_curr_mod_ext_info &
2915 		    I40E_AQ_ENABLE_FEC_AUTO)
2916 			hw->phy.link_info.req_fec_info =
2917 				(I40E_AQ_REQUEST_FEC_KR |
2918 				 I40E_AQ_REQUEST_FEC_RS);
2919 		else
2920 			hw->phy.link_info.req_fec_info =
2921 				abilities.fec_cfg_curr_mod_ext_info &
2922 				(I40E_AQ_REQUEST_FEC_KR |
2923 				 I40E_AQ_REQUEST_FEC_RS);
2924 
2925 		i40e_memcpy(hw->phy.link_info.module_type, &abilities.module_type,
2926 			sizeof(hw->phy.link_info.module_type), I40E_NONDMA_TO_NONDMA);
2927 	}
2928 	return status;
2929 }
2930 
2931 
2932 /**
2933  * i40e_get_link_speed
2934  * @hw: pointer to the hw struct
2935  *
2936  * Returns the link speed of the adapter.
2937  **/
2938 enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
2939 {
2940 	enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
2941 	enum i40e_status_code status = I40E_SUCCESS;
2942 
2943 	if (hw->phy.get_link_info) {
2944 		status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
2945 
2946 		if (status != I40E_SUCCESS)
2947 			goto i40e_link_speed_exit;
2948 	}
2949 
2950 	speed = hw->phy.link_info.link_speed;
2951 
2952 i40e_link_speed_exit:
2953 	return speed;
2954 }
2955 
2956 /**
2957  * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2958  * @hw: pointer to the hw struct
2959  * @uplink_seid: the MAC or other gizmo SEID
2960  * @downlink_seid: the VSI SEID
2961  * @enabled_tc: bitmap of TCs to be enabled
2962  * @default_port: TRUE for default port VSI, FALSE for control port
2963  * @veb_seid: pointer to where to put the resulting VEB SEID
2964  * @enable_stats: TRUE to turn on VEB stats
2965  * @cmd_details: pointer to command details structure or NULL
2966  *
2967  * This asks the FW to add a VEB between the uplink and downlink
2968  * elements.  If the uplink SEID is 0, this will be a floating VEB.
2969  **/
2970 enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
2971 				u16 downlink_seid, u8 enabled_tc,
2972 				bool default_port, u16 *veb_seid,
2973 				bool enable_stats,
2974 				struct i40e_asq_cmd_details *cmd_details)
2975 {
2976 	struct i40e_aq_desc desc;
2977 	struct i40e_aqc_add_veb *cmd =
2978 		(struct i40e_aqc_add_veb *)&desc.params.raw;
2979 	struct i40e_aqc_add_veb_completion *resp =
2980 		(struct i40e_aqc_add_veb_completion *)&desc.params.raw;
2981 	enum i40e_status_code status;
2982 	u16 veb_flags = 0;
2983 
2984 	/* SEIDs need to either both be set or both be 0 for floating VEB */
2985 	if (!!uplink_seid != !!downlink_seid)
2986 		return I40E_ERR_PARAM;
2987 
2988 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
2989 
2990 	cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
2991 	cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
2992 	cmd->enable_tcs = enabled_tc;
2993 	if (!uplink_seid)
2994 		veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
2995 	if (default_port)
2996 		veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
2997 	else
2998 		veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
2999 
3000 	/* reverse logic here: set the bitflag to disable the stats */
3001 	if (!enable_stats)
3002 		veb_flags |= I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS;
3003 
3004 	cmd->veb_flags = CPU_TO_LE16(veb_flags);
3005 
3006 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3007 
3008 	if (!status && veb_seid)
3009 		*veb_seid = LE16_TO_CPU(resp->veb_seid);
3010 
3011 	return status;
3012 }
3013 
3014 /**
3015  * i40e_aq_get_veb_parameters - Retrieve VEB parameters
3016  * @hw: pointer to the hw struct
3017  * @veb_seid: the SEID of the VEB to query
3018  * @switch_id: the uplink switch id
3019  * @floating: set to TRUE if the VEB is floating
3020  * @statistic_index: index of the stats counter block for this VEB
3021  * @vebs_used: number of VEB's used by function
3022  * @vebs_free: total VEB's not reserved by any function
3023  * @cmd_details: pointer to command details structure or NULL
3024  *
3025  * This retrieves the parameters for a particular VEB, specified by
3026  * uplink_seid, and returns them to the caller.
3027  **/
3028 enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
3029 				u16 veb_seid, u16 *switch_id,
3030 				bool *floating, u16 *statistic_index,
3031 				u16 *vebs_used, u16 *vebs_free,
3032 				struct i40e_asq_cmd_details *cmd_details)
3033 {
3034 	struct i40e_aq_desc desc;
3035 	struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
3036 		(struct i40e_aqc_get_veb_parameters_completion *)
3037 		&desc.params.raw;
3038 	enum i40e_status_code status;
3039 
3040 	if (veb_seid == 0)
3041 		return I40E_ERR_PARAM;
3042 
3043 	i40e_fill_default_direct_cmd_desc(&desc,
3044 					  i40e_aqc_opc_get_veb_parameters);
3045 	cmd_resp->seid = CPU_TO_LE16(veb_seid);
3046 
3047 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3048 	if (status)
3049 		goto get_veb_exit;
3050 
3051 	if (switch_id)
3052 		*switch_id = LE16_TO_CPU(cmd_resp->switch_id);
3053 	if (statistic_index)
3054 		*statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
3055 	if (vebs_used)
3056 		*vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
3057 	if (vebs_free)
3058 		*vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
3059 	if (floating) {
3060 		u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
3061 
3062 		if (flags & I40E_AQC_ADD_VEB_FLOATING)
3063 			*floating = TRUE;
3064 		else
3065 			*floating = FALSE;
3066 	}
3067 
3068 get_veb_exit:
3069 	return status;
3070 }
3071 
3072 /**
3073  * i40e_aq_add_macvlan
3074  * @hw: pointer to the hw struct
3075  * @seid: VSI for the mac address
3076  * @mv_list: list of macvlans to be added
3077  * @count: length of the list
3078  * @cmd_details: pointer to command details structure or NULL
3079  *
3080  * Add MAC/VLAN addresses to the HW filtering
3081  **/
3082 enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
3083 			struct i40e_aqc_add_macvlan_element_data *mv_list,
3084 			u16 count, struct i40e_asq_cmd_details *cmd_details)
3085 {
3086 	struct i40e_aq_desc desc;
3087 	struct i40e_aqc_macvlan *cmd =
3088 		(struct i40e_aqc_macvlan *)&desc.params.raw;
3089 	enum i40e_status_code status;
3090 	u16 buf_size;
3091 	int i;
3092 
3093 	if (count == 0 || !mv_list || !hw)
3094 		return I40E_ERR_PARAM;
3095 
3096 	buf_size = count * sizeof(*mv_list);
3097 
3098 	/* prep the rest of the request */
3099 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
3100 	cmd->num_addresses = CPU_TO_LE16(count);
3101 	cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
3102 	cmd->seid[1] = 0;
3103 	cmd->seid[2] = 0;
3104 
3105 	for (i = 0; i < count; i++)
3106 		if (I40E_IS_MULTICAST(mv_list[i].mac_addr))
3107 			mv_list[i].flags |=
3108 			    CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);
3109 
3110 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3111 	if (buf_size > I40E_AQ_LARGE_BUF)
3112 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3113 
3114 	status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
3115 				       cmd_details);
3116 
3117 	return status;
3118 }
3119 
3120 /**
3121  * i40e_aq_remove_macvlan
3122  * @hw: pointer to the hw struct
3123  * @seid: VSI for the mac address
3124  * @mv_list: list of macvlans to be removed
3125  * @count: length of the list
3126  * @cmd_details: pointer to command details structure or NULL
3127  *
3128  * Remove MAC/VLAN addresses from the HW filtering
3129  **/
3130 enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
3131 			struct i40e_aqc_remove_macvlan_element_data *mv_list,
3132 			u16 count, struct i40e_asq_cmd_details *cmd_details)
3133 {
3134 	struct i40e_aq_desc desc;
3135 	struct i40e_aqc_macvlan *cmd =
3136 		(struct i40e_aqc_macvlan *)&desc.params.raw;
3137 	enum i40e_status_code status;
3138 	u16 buf_size;
3139 
3140 	if (count == 0 || !mv_list || !hw)
3141 		return I40E_ERR_PARAM;
3142 
3143 	buf_size = count * sizeof(*mv_list);
3144 
3145 	/* prep the rest of the request */
3146 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
3147 	cmd->num_addresses = CPU_TO_LE16(count);
3148 	cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
3149 	cmd->seid[1] = 0;
3150 	cmd->seid[2] = 0;
3151 
3152 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3153 	if (buf_size > I40E_AQ_LARGE_BUF)
3154 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3155 
3156 	status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
3157 				       cmd_details);
3158 
3159 	return status;
3160 }
3161 
3162 /**
3163  * i40e_mirrorrule_op - Internal helper function to add/delete mirror rule
3164  * @hw: pointer to the hw struct
3165  * @opcode: AQ opcode for add or delete mirror rule
3166  * @sw_seid: Switch SEID (to which rule refers)
3167  * @rule_type: Rule Type (ingress/egress/VLAN)
3168  * @id: Destination VSI SEID or Rule ID
3169  * @count: length of the list
3170  * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3171  * @cmd_details: pointer to command details structure or NULL
3172  * @rule_id: Rule ID returned from FW
3173  * @rules_used: Number of rules used in internal switch
3174  * @rules_free: Number of rules free in internal switch
3175  *
3176  * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
3177  * VEBs/VEPA elements only
3178  **/
3179 static enum i40e_status_code i40e_mirrorrule_op(struct i40e_hw *hw,
3180 			u16 opcode, u16 sw_seid, u16 rule_type, u16 id,
3181 			u16 count, __le16 *mr_list,
3182 			struct i40e_asq_cmd_details *cmd_details,
3183 			u16 *rule_id, u16 *rules_used, u16 *rules_free)
3184 {
3185 	struct i40e_aq_desc desc;
3186 	struct i40e_aqc_add_delete_mirror_rule *cmd =
3187 		(struct i40e_aqc_add_delete_mirror_rule *)&desc.params.raw;
3188 	struct i40e_aqc_add_delete_mirror_rule_completion *resp =
3189 	(struct i40e_aqc_add_delete_mirror_rule_completion *)&desc.params.raw;
3190 	enum i40e_status_code status;
3191 	u16 buf_size;
3192 
3193 	buf_size = count * sizeof(*mr_list);
3194 
3195 	/* prep the rest of the request */
3196 	i40e_fill_default_direct_cmd_desc(&desc, opcode);
3197 	cmd->seid = CPU_TO_LE16(sw_seid);
3198 	cmd->rule_type = CPU_TO_LE16(rule_type &
3199 				     I40E_AQC_MIRROR_RULE_TYPE_MASK);
3200 	cmd->num_entries = CPU_TO_LE16(count);
3201 	/* Dest VSI for add, rule_id for delete */
3202 	cmd->destination = CPU_TO_LE16(id);
3203 	if (mr_list) {
3204 		desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3205 						I40E_AQ_FLAG_RD));
3206 		if (buf_size > I40E_AQ_LARGE_BUF)
3207 			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3208 	}
3209 
3210 	status = i40e_asq_send_command(hw, &desc, mr_list, buf_size,
3211 				       cmd_details);
3212 	if (status == I40E_SUCCESS ||
3213 	    hw->aq.asq_last_status == I40E_AQ_RC_ENOSPC) {
3214 		if (rule_id)
3215 			*rule_id = LE16_TO_CPU(resp->rule_id);
3216 		if (rules_used)
3217 			*rules_used = LE16_TO_CPU(resp->mirror_rules_used);
3218 		if (rules_free)
3219 			*rules_free = LE16_TO_CPU(resp->mirror_rules_free);
3220 	}
3221 	return status;
3222 }
3223 
3224 /**
3225  * i40e_aq_add_mirrorrule - add a mirror rule
3226  * @hw: pointer to the hw struct
3227  * @sw_seid: Switch SEID (to which rule refers)
3228  * @rule_type: Rule Type (ingress/egress/VLAN)
3229  * @dest_vsi: SEID of VSI to which packets will be mirrored
3230  * @count: length of the list
3231  * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3232  * @cmd_details: pointer to command details structure or NULL
3233  * @rule_id: Rule ID returned from FW
3234  * @rules_used: Number of rules used in internal switch
3235  * @rules_free: Number of rules free in internal switch
3236  *
3237  * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
3238  **/
3239 enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3240 			u16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,
3241 			struct i40e_asq_cmd_details *cmd_details,
3242 			u16 *rule_id, u16 *rules_used, u16 *rules_free)
3243 {
3244 	if (!(rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS ||
3245 	    rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS)) {
3246 		if (count == 0 || !mr_list)
3247 			return I40E_ERR_PARAM;
3248 	}
3249 
3250 	return i40e_mirrorrule_op(hw, i40e_aqc_opc_add_mirror_rule, sw_seid,
3251 				  rule_type, dest_vsi, count, mr_list,
3252 				  cmd_details, rule_id, rules_used, rules_free);
3253 }
3254 
3255 /**
3256  * i40e_aq_delete_mirrorrule - delete a mirror rule
3257  * @hw: pointer to the hw struct
3258  * @sw_seid: Switch SEID (to which rule refers)
3259  * @rule_type: Rule Type (ingress/egress/VLAN)
3260  * @count: length of the list
3261  * @rule_id: Rule ID that is returned in the receive desc as part of
3262  *		add_mirrorrule.
3263  * @mr_list: list of mirrored VLAN IDs to be removed
3264  * @cmd_details: pointer to command details structure or NULL
3265  * @rules_used: Number of rules used in internal switch
3266  * @rules_free: Number of rules free in internal switch
3267  *
3268  * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
3269  **/
3270 enum i40e_status_code i40e_aq_delete_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3271 			u16 rule_type, u16 rule_id, u16 count, __le16 *mr_list,
3272 			struct i40e_asq_cmd_details *cmd_details,
3273 			u16 *rules_used, u16 *rules_free)
3274 {
3275 	/* Rule ID has to be valid except rule_type: INGRESS VLAN mirroring */
3276 	if (rule_type == I40E_AQC_MIRROR_RULE_TYPE_VLAN) {
3277 		/* count and mr_list shall be valid for rule_type INGRESS VLAN
3278 		 * mirroring. For other rule_type, count and rule_type should
3279 		 * not matter.
3280 		 */
3281 		if (count == 0 || !mr_list)
3282 			return I40E_ERR_PARAM;
3283 	}
3284 
3285 	return i40e_mirrorrule_op(hw, i40e_aqc_opc_delete_mirror_rule, sw_seid,
3286 				  rule_type, rule_id, count, mr_list,
3287 				  cmd_details, NULL, rules_used, rules_free);
3288 }
3289 
3290 /**
3291  * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
3292  * @hw: pointer to the hw struct
3293  * @seid: VSI for the vlan filters
3294  * @v_list: list of vlan filters to be added
3295  * @count: length of the list
3296  * @cmd_details: pointer to command details structure or NULL
3297  **/
3298 enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
3299 			struct i40e_aqc_add_remove_vlan_element_data *v_list,
3300 			u8 count, struct i40e_asq_cmd_details *cmd_details)
3301 {
3302 	struct i40e_aq_desc desc;
3303 	struct i40e_aqc_macvlan *cmd =
3304 		(struct i40e_aqc_macvlan *)&desc.params.raw;
3305 	enum i40e_status_code status;
3306 	u16 buf_size;
3307 
3308 	if (count == 0 || !v_list || !hw)
3309 		return I40E_ERR_PARAM;
3310 
3311 	buf_size = count * sizeof(*v_list);
3312 
3313 	/* prep the rest of the request */
3314 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
3315 	cmd->num_addresses = CPU_TO_LE16(count);
3316 	cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3317 	cmd->seid[1] = 0;
3318 	cmd->seid[2] = 0;
3319 
3320 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3321 	if (buf_size > I40E_AQ_LARGE_BUF)
3322 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3323 
3324 	status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3325 				       cmd_details);
3326 
3327 	return status;
3328 }
3329 
3330 /**
3331  * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
3332  * @hw: pointer to the hw struct
3333  * @seid: VSI for the vlan filters
3334  * @v_list: list of macvlans to be removed
3335  * @count: length of the list
3336  * @cmd_details: pointer to command details structure or NULL
3337  **/
3338 enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
3339 			struct i40e_aqc_add_remove_vlan_element_data *v_list,
3340 			u8 count, struct i40e_asq_cmd_details *cmd_details)
3341 {
3342 	struct i40e_aq_desc desc;
3343 	struct i40e_aqc_macvlan *cmd =
3344 		(struct i40e_aqc_macvlan *)&desc.params.raw;
3345 	enum i40e_status_code status;
3346 	u16 buf_size;
3347 
3348 	if (count == 0 || !v_list || !hw)
3349 		return I40E_ERR_PARAM;
3350 
3351 	buf_size = count * sizeof(*v_list);
3352 
3353 	/* prep the rest of the request */
3354 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
3355 	cmd->num_addresses = CPU_TO_LE16(count);
3356 	cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3357 	cmd->seid[1] = 0;
3358 	cmd->seid[2] = 0;
3359 
3360 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3361 	if (buf_size > I40E_AQ_LARGE_BUF)
3362 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3363 
3364 	status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3365 				       cmd_details);
3366 
3367 	return status;
3368 }
3369 
3370 /**
3371  * i40e_aq_send_msg_to_vf
3372  * @hw: pointer to the hardware structure
3373  * @vfid: vf id to send msg
3374  * @v_opcode: opcodes for VF-PF communication
3375  * @v_retval: return error code
3376  * @msg: pointer to the msg buffer
3377  * @msglen: msg length
3378  * @cmd_details: pointer to command details
3379  *
3380  * send msg to vf
3381  **/
3382 enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
3383 				u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
3384 				struct i40e_asq_cmd_details *cmd_details)
3385 {
3386 	struct i40e_aq_desc desc;
3387 	struct i40e_aqc_pf_vf_message *cmd =
3388 		(struct i40e_aqc_pf_vf_message *)&desc.params.raw;
3389 	enum i40e_status_code status;
3390 
3391 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
3392 	cmd->id = CPU_TO_LE32(vfid);
3393 	desc.cookie_high = CPU_TO_LE32(v_opcode);
3394 	desc.cookie_low = CPU_TO_LE32(v_retval);
3395 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
3396 	if (msglen) {
3397 		desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3398 						I40E_AQ_FLAG_RD));
3399 		if (msglen > I40E_AQ_LARGE_BUF)
3400 			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3401 		desc.datalen = CPU_TO_LE16(msglen);
3402 	}
3403 	status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
3404 
3405 	return status;
3406 }
3407 
3408 /**
3409  * i40e_aq_debug_read_register
3410  * @hw: pointer to the hw struct
3411  * @reg_addr: register address
3412  * @reg_val: register value
3413  * @cmd_details: pointer to command details structure or NULL
3414  *
3415  * Read the register using the admin queue commands
3416  **/
3417 enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
3418 				u32 reg_addr, u64 *reg_val,
3419 				struct i40e_asq_cmd_details *cmd_details)
3420 {
3421 	struct i40e_aq_desc desc;
3422 	struct i40e_aqc_debug_reg_read_write *cmd_resp =
3423 		(struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3424 	enum i40e_status_code status;
3425 
3426 	if (reg_val == NULL)
3427 		return I40E_ERR_PARAM;
3428 
3429 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_read_reg);
3430 
3431 	cmd_resp->address = CPU_TO_LE32(reg_addr);
3432 
3433 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3434 
3435 	if (status == I40E_SUCCESS) {
3436 		*reg_val = ((u64)LE32_TO_CPU(cmd_resp->value_high) << 32) |
3437 			   (u64)LE32_TO_CPU(cmd_resp->value_low);
3438 	}
3439 
3440 	return status;
3441 }
3442 
3443 /**
3444  * i40e_aq_debug_write_register
3445  * @hw: pointer to the hw struct
3446  * @reg_addr: register address
3447  * @reg_val: register value
3448  * @cmd_details: pointer to command details structure or NULL
3449  *
3450  * Write to a register using the admin queue commands
3451  **/
3452 enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
3453 				u32 reg_addr, u64 reg_val,
3454 				struct i40e_asq_cmd_details *cmd_details)
3455 {
3456 	struct i40e_aq_desc desc;
3457 	struct i40e_aqc_debug_reg_read_write *cmd =
3458 		(struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3459 	enum i40e_status_code status;
3460 
3461 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
3462 
3463 	cmd->address = CPU_TO_LE32(reg_addr);
3464 	cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
3465 	cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
3466 
3467 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3468 
3469 	return status;
3470 }
3471 
3472 /**
3473  * i40e_aq_request_resource
3474  * @hw: pointer to the hw struct
3475  * @resource: resource id
3476  * @access: access type
3477  * @sdp_number: resource number
3478  * @timeout: the maximum time in ms that the driver may hold the resource
3479  * @cmd_details: pointer to command details structure or NULL
3480  *
3481  * requests common resource using the admin queue commands
3482  **/
3483 enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
3484 				enum i40e_aq_resources_ids resource,
3485 				enum i40e_aq_resource_access_type access,
3486 				u8 sdp_number, u64 *timeout,
3487 				struct i40e_asq_cmd_details *cmd_details)
3488 {
3489 	struct i40e_aq_desc desc;
3490 	struct i40e_aqc_request_resource *cmd_resp =
3491 		(struct i40e_aqc_request_resource *)&desc.params.raw;
3492 	enum i40e_status_code status;
3493 
3494 	DEBUGFUNC("i40e_aq_request_resource");
3495 
3496 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
3497 
3498 	cmd_resp->resource_id = CPU_TO_LE16(resource);
3499 	cmd_resp->access_type = CPU_TO_LE16(access);
3500 	cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
3501 
3502 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3503 	/* The completion specifies the maximum time in ms that the driver
3504 	 * may hold the resource in the Timeout field.
3505 	 * If the resource is held by someone else, the command completes with
3506 	 * busy return value and the timeout field indicates the maximum time
3507 	 * the current owner of the resource has to free it.
3508 	 */
3509 	if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
3510 		*timeout = LE32_TO_CPU(cmd_resp->timeout);
3511 
3512 	return status;
3513 }
3514 
3515 /**
3516  * i40e_aq_release_resource
3517  * @hw: pointer to the hw struct
3518  * @resource: resource id
3519  * @sdp_number: resource number
3520  * @cmd_details: pointer to command details structure or NULL
3521  *
3522  * release common resource using the admin queue commands
3523  **/
3524 enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
3525 				enum i40e_aq_resources_ids resource,
3526 				u8 sdp_number,
3527 				struct i40e_asq_cmd_details *cmd_details)
3528 {
3529 	struct i40e_aq_desc desc;
3530 	struct i40e_aqc_request_resource *cmd =
3531 		(struct i40e_aqc_request_resource *)&desc.params.raw;
3532 	enum i40e_status_code status;
3533 
3534 	DEBUGFUNC("i40e_aq_release_resource");
3535 
3536 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
3537 
3538 	cmd->resource_id = CPU_TO_LE16(resource);
3539 	cmd->resource_number = CPU_TO_LE32(sdp_number);
3540 
3541 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3542 
3543 	return status;
3544 }
3545 
3546 /**
3547  * i40e_aq_read_nvm
3548  * @hw: pointer to the hw struct
3549  * @module_pointer: module pointer location in words from the NVM beginning
3550  * @offset: byte offset from the module beginning
3551  * @length: length of the section to be read (in bytes from the offset)
3552  * @data: command buffer (size [bytes] = length)
3553  * @last_command: tells if this is the last command in a series
3554  * @cmd_details: pointer to command details structure or NULL
3555  *
3556  * Read the NVM using the admin queue commands
3557  **/
3558 enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
3559 				u32 offset, u16 length, void *data,
3560 				bool last_command,
3561 				struct i40e_asq_cmd_details *cmd_details)
3562 {
3563 	struct i40e_aq_desc desc;
3564 	struct i40e_aqc_nvm_update *cmd =
3565 		(struct i40e_aqc_nvm_update *)&desc.params.raw;
3566 	enum i40e_status_code status;
3567 
3568 	DEBUGFUNC("i40e_aq_read_nvm");
3569 
3570 	/* In offset the highest byte must be zeroed. */
3571 	if (offset & 0xFF000000) {
3572 		status = I40E_ERR_PARAM;
3573 		goto i40e_aq_read_nvm_exit;
3574 	}
3575 
3576 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
3577 
3578 	/* If this is the last command in a series, set the proper flag. */
3579 	if (last_command)
3580 		cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3581 	cmd->module_pointer = module_pointer;
3582 	cmd->offset = CPU_TO_LE32(offset);
3583 	cmd->length = CPU_TO_LE16(length);
3584 
3585 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3586 	if (length > I40E_AQ_LARGE_BUF)
3587 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3588 
3589 	status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3590 
3591 i40e_aq_read_nvm_exit:
3592 	return status;
3593 }
3594 
3595 /**
3596  * i40e_aq_read_nvm_config - read an nvm config block
3597  * @hw: pointer to the hw struct
3598  * @cmd_flags: NVM access admin command bits
3599  * @field_id: field or feature id
3600  * @data: buffer for result
3601  * @buf_size: buffer size
3602  * @element_count: pointer to count of elements read by FW
3603  * @cmd_details: pointer to command details structure or NULL
3604  **/
3605 enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
3606 				u8 cmd_flags, u32 field_id, void *data,
3607 				u16 buf_size, u16 *element_count,
3608 				struct i40e_asq_cmd_details *cmd_details)
3609 {
3610 	struct i40e_aq_desc desc;
3611 	struct i40e_aqc_nvm_config_read *cmd =
3612 		(struct i40e_aqc_nvm_config_read *)&desc.params.raw;
3613 	enum i40e_status_code status;
3614 
3615 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_read);
3616 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF));
3617 	if (buf_size > I40E_AQ_LARGE_BUF)
3618 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3619 
3620 	cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3621 	cmd->element_id = CPU_TO_LE16((u16)(0xffff & field_id));
3622 	if (cmd_flags & I40E_AQ_ANVM_FEATURE_OR_IMMEDIATE_MASK)
3623 		cmd->element_id_msw = CPU_TO_LE16((u16)(field_id >> 16));
3624 	else
3625 		cmd->element_id_msw = 0;
3626 
3627 	status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3628 
3629 	if (!status && element_count)
3630 		*element_count = LE16_TO_CPU(cmd->element_count);
3631 
3632 	return status;
3633 }
3634 
3635 /**
3636  * i40e_aq_write_nvm_config - write an nvm config block
3637  * @hw: pointer to the hw struct
3638  * @cmd_flags: NVM access admin command bits
3639  * @data: buffer for result
3640  * @buf_size: buffer size
3641  * @element_count: count of elements to be written
3642  * @cmd_details: pointer to command details structure or NULL
3643  **/
3644 enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
3645 				u8 cmd_flags, void *data, u16 buf_size,
3646 				u16 element_count,
3647 				struct i40e_asq_cmd_details *cmd_details)
3648 {
3649 	struct i40e_aq_desc desc;
3650 	struct i40e_aqc_nvm_config_write *cmd =
3651 		(struct i40e_aqc_nvm_config_write *)&desc.params.raw;
3652 	enum i40e_status_code status;
3653 
3654 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_write);
3655 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3656 	if (buf_size > I40E_AQ_LARGE_BUF)
3657 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3658 
3659 	cmd->element_count = CPU_TO_LE16(element_count);
3660 	cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3661 	status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3662 
3663 	return status;
3664 }
3665 
3666 /**
3667  * i40e_aq_nvm_update_in_process
3668  * @hw: pointer to the hw struct
3669  * @update_flow_state: True indicates that update flow starts, FALSE that ends
3670  * @cmd_details: pointer to command details structure or NULL
3671  *
3672  * Indicate NVM update in process.
3673  **/
3674 enum i40e_status_code i40e_aq_nvm_update_in_process(struct i40e_hw *hw,
3675 				bool update_flow_state,
3676 				struct i40e_asq_cmd_details *cmd_details)
3677 {
3678 	struct i40e_aq_desc desc;
3679 	struct i40e_aqc_nvm_update_in_process *cmd =
3680 		(struct i40e_aqc_nvm_update_in_process *)&desc.params.raw;
3681 	enum i40e_status_code status;
3682 
3683 	i40e_fill_default_direct_cmd_desc(&desc,
3684 					  i40e_aqc_opc_nvm_update_in_process);
3685 
3686 	cmd->command = I40E_AQ_UPDATE_FLOW_END;
3687 
3688 	if (update_flow_state)
3689 		cmd->command |= I40E_AQ_UPDATE_FLOW_START;
3690 
3691 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3692 
3693 	return status;
3694 }
3695 
3696 /**
3697  * i40e_aq_min_rollback_rev_update - triggers an ow after update
3698  * @hw: pointer to the hw struct
3699  * @mode: opt-in mode, 1b for single module update, 0b for bulk update
3700  * @module: module to be updated. Ignored if mode is 0b
3701  * @min_rrev: value of the new minimal version. Ignored if mode is 0b
3702  * @cmd_details: pointer to command details structure or NULL
3703  **/
3704 enum i40e_status_code
3705 i40e_aq_min_rollback_rev_update(struct i40e_hw *hw, u8 mode, u8 module,
3706 				u32 min_rrev,
3707 				struct i40e_asq_cmd_details *cmd_details)
3708 {
3709 	struct i40e_aq_desc desc;
3710 	struct i40e_aqc_rollback_revision_update *cmd =
3711 		(struct i40e_aqc_rollback_revision_update *)&desc.params.raw;
3712 	enum i40e_status_code status;
3713 
3714 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rollback_revision_update);
3715 	cmd->optin_mode = mode;
3716 	cmd->module_selected = module;
3717 	cmd->min_rrev = min_rrev;
3718 
3719 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3720 
3721 	return status;
3722 }
3723 
3724 /**
3725  * i40e_aq_oem_post_update - triggers an OEM specific flow after update
3726  * @hw: pointer to the hw struct
3727  * @buff: buffer for result
3728  * @buff_size: buffer size
3729  * @cmd_details: pointer to command details structure or NULL
3730  **/
3731 enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
3732 				void *buff, u16 buff_size,
3733 				struct i40e_asq_cmd_details *cmd_details)
3734 {
3735 	struct i40e_aq_desc desc;
3736 	enum i40e_status_code status;
3737 
3738 
3739 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_oem_post_update);
3740 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3741 	if (status && LE16_TO_CPU(desc.retval) == I40E_AQ_RC_ESRCH)
3742 		status = I40E_ERR_NOT_IMPLEMENTED;
3743 
3744 	return status;
3745 }
3746 
3747 /**
3748  * i40e_aq_erase_nvm
3749  * @hw: pointer to the hw struct
3750  * @module_pointer: module pointer location in words from the NVM beginning
3751  * @offset: offset in the module (expressed in 4 KB from module's beginning)
3752  * @length: length of the section to be erased (expressed in 4 KB)
3753  * @last_command: tells if this is the last command in a series
3754  * @cmd_details: pointer to command details structure or NULL
3755  *
3756  * Erase the NVM sector using the admin queue commands
3757  **/
3758 enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
3759 				u32 offset, u16 length, bool last_command,
3760 				struct i40e_asq_cmd_details *cmd_details)
3761 {
3762 	struct i40e_aq_desc desc;
3763 	struct i40e_aqc_nvm_update *cmd =
3764 		(struct i40e_aqc_nvm_update *)&desc.params.raw;
3765 	enum i40e_status_code status;
3766 
3767 	DEBUGFUNC("i40e_aq_erase_nvm");
3768 
3769 	/* In offset the highest byte must be zeroed. */
3770 	if (offset & 0xFF000000) {
3771 		status = I40E_ERR_PARAM;
3772 		goto i40e_aq_erase_nvm_exit;
3773 	}
3774 
3775 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
3776 
3777 	/* If this is the last command in a series, set the proper flag. */
3778 	if (last_command)
3779 		cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3780 	cmd->module_pointer = module_pointer;
3781 	cmd->offset = CPU_TO_LE32(offset);
3782 	cmd->length = CPU_TO_LE16(length);
3783 
3784 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3785 
3786 i40e_aq_erase_nvm_exit:
3787 	return status;
3788 }
3789 
3790 /**
3791  * i40e_parse_discover_capabilities
3792  * @hw: pointer to the hw struct
3793  * @buff: pointer to a buffer containing device/function capability records
3794  * @cap_count: number of capability records in the list
3795  * @list_type_opc: type of capabilities list to parse
3796  *
3797  * Parse the device/function capabilities list.
3798  **/
3799 static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
3800 				     u32 cap_count,
3801 				     enum i40e_admin_queue_opc list_type_opc)
3802 {
3803 	struct i40e_aqc_list_capabilities_element_resp *cap;
3804 	u32 valid_functions, num_functions;
3805 	u32 number, logical_id, phys_id;
3806 	struct i40e_hw_capabilities *p;
3807 	enum i40e_status_code status;
3808 	u16 id, ocp_cfg_word0;
3809 	u8 major_rev;
3810 	u32 i = 0;
3811 
3812 	cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
3813 
3814 	if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
3815 		p = (struct i40e_hw_capabilities *)&hw->dev_caps;
3816 	else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
3817 		p = (struct i40e_hw_capabilities *)&hw->func_caps;
3818 	else
3819 		return;
3820 
3821 	for (i = 0; i < cap_count; i++, cap++) {
3822 		id = LE16_TO_CPU(cap->id);
3823 		number = LE32_TO_CPU(cap->number);
3824 		logical_id = LE32_TO_CPU(cap->logical_id);
3825 		phys_id = LE32_TO_CPU(cap->phys_id);
3826 		major_rev = cap->major_rev;
3827 
3828 		switch (id) {
3829 		case I40E_AQ_CAP_ID_SWITCH_MODE:
3830 			p->switch_mode = number;
3831 			i40e_debug(hw, I40E_DEBUG_INIT,
3832 				   "HW Capability: Switch mode = %d\n",
3833 				   p->switch_mode);
3834 			break;
3835 		case I40E_AQ_CAP_ID_MNG_MODE:
3836 			p->management_mode = number;
3837 			if (major_rev > 1) {
3838 				p->mng_protocols_over_mctp = logical_id;
3839 				i40e_debug(hw, I40E_DEBUG_INIT,
3840 					   "HW Capability: Protocols over MCTP = %d\n",
3841 					   p->mng_protocols_over_mctp);
3842 			} else {
3843 				p->mng_protocols_over_mctp = 0;
3844 			}
3845 			i40e_debug(hw, I40E_DEBUG_INIT,
3846 				   "HW Capability: Management Mode = %d\n",
3847 				   p->management_mode);
3848 			break;
3849 		case I40E_AQ_CAP_ID_NPAR_ACTIVE:
3850 			p->npar_enable = number;
3851 			i40e_debug(hw, I40E_DEBUG_INIT,
3852 				   "HW Capability: NPAR enable = %d\n",
3853 				   p->npar_enable);
3854 			break;
3855 		case I40E_AQ_CAP_ID_OS2BMC_CAP:
3856 			p->os2bmc = number;
3857 			i40e_debug(hw, I40E_DEBUG_INIT,
3858 				   "HW Capability: OS2BMC = %d\n", p->os2bmc);
3859 			break;
3860 		case I40E_AQ_CAP_ID_FUNCTIONS_VALID:
3861 			p->valid_functions = number;
3862 			i40e_debug(hw, I40E_DEBUG_INIT,
3863 				   "HW Capability: Valid Functions = %d\n",
3864 				   p->valid_functions);
3865 			break;
3866 		case I40E_AQ_CAP_ID_SRIOV:
3867 			if (number == 1)
3868 				p->sr_iov_1_1 = TRUE;
3869 			i40e_debug(hw, I40E_DEBUG_INIT,
3870 				   "HW Capability: SR-IOV = %d\n",
3871 				   p->sr_iov_1_1);
3872 			break;
3873 		case I40E_AQ_CAP_ID_VF:
3874 			p->num_vfs = number;
3875 			p->vf_base_id = logical_id;
3876 			i40e_debug(hw, I40E_DEBUG_INIT,
3877 				   "HW Capability: VF count = %d\n",
3878 				   p->num_vfs);
3879 			i40e_debug(hw, I40E_DEBUG_INIT,
3880 				   "HW Capability: VF base_id = %d\n",
3881 				   p->vf_base_id);
3882 			break;
3883 		case I40E_AQ_CAP_ID_VMDQ:
3884 			if (number == 1)
3885 				p->vmdq = TRUE;
3886 			i40e_debug(hw, I40E_DEBUG_INIT,
3887 				   "HW Capability: VMDQ = %d\n", p->vmdq);
3888 			break;
3889 		case I40E_AQ_CAP_ID_8021QBG:
3890 			if (number == 1)
3891 				p->evb_802_1_qbg = TRUE;
3892 			i40e_debug(hw, I40E_DEBUG_INIT,
3893 				   "HW Capability: 802.1Qbg = %d\n", number);
3894 			break;
3895 		case I40E_AQ_CAP_ID_8021QBR:
3896 			if (number == 1)
3897 				p->evb_802_1_qbh = TRUE;
3898 			i40e_debug(hw, I40E_DEBUG_INIT,
3899 				   "HW Capability: 802.1Qbh = %d\n", number);
3900 			break;
3901 		case I40E_AQ_CAP_ID_VSI:
3902 			p->num_vsis = number;
3903 			i40e_debug(hw, I40E_DEBUG_INIT,
3904 				   "HW Capability: VSI count = %d\n",
3905 				   p->num_vsis);
3906 			break;
3907 		case I40E_AQ_CAP_ID_DCB:
3908 			if (number == 1) {
3909 				p->dcb = TRUE;
3910 				p->enabled_tcmap = logical_id;
3911 				p->maxtc = phys_id;
3912 			}
3913 			i40e_debug(hw, I40E_DEBUG_INIT,
3914 				   "HW Capability: DCB = %d\n", p->dcb);
3915 			i40e_debug(hw, I40E_DEBUG_INIT,
3916 				   "HW Capability: TC Mapping = %d\n",
3917 				   logical_id);
3918 			i40e_debug(hw, I40E_DEBUG_INIT,
3919 				   "HW Capability: TC Max = %d\n", p->maxtc);
3920 			break;
3921 		case I40E_AQ_CAP_ID_FCOE:
3922 			if (number == 1)
3923 				p->fcoe = TRUE;
3924 			i40e_debug(hw, I40E_DEBUG_INIT,
3925 				   "HW Capability: FCOE = %d\n", p->fcoe);
3926 			break;
3927 		case I40E_AQ_CAP_ID_ISCSI:
3928 			if (number == 1)
3929 				p->iscsi = TRUE;
3930 			i40e_debug(hw, I40E_DEBUG_INIT,
3931 				   "HW Capability: iSCSI = %d\n", p->iscsi);
3932 			break;
3933 		case I40E_AQ_CAP_ID_RSS:
3934 			p->rss = TRUE;
3935 			p->rss_table_size = number;
3936 			p->rss_table_entry_width = logical_id;
3937 			i40e_debug(hw, I40E_DEBUG_INIT,
3938 				   "HW Capability: RSS = %d\n", p->rss);
3939 			i40e_debug(hw, I40E_DEBUG_INIT,
3940 				   "HW Capability: RSS table size = %d\n",
3941 				   p->rss_table_size);
3942 			i40e_debug(hw, I40E_DEBUG_INIT,
3943 				   "HW Capability: RSS table width = %d\n",
3944 				   p->rss_table_entry_width);
3945 			break;
3946 		case I40E_AQ_CAP_ID_RXQ:
3947 			p->num_rx_qp = number;
3948 			p->base_queue = phys_id;
3949 			i40e_debug(hw, I40E_DEBUG_INIT,
3950 				   "HW Capability: Rx QP = %d\n", number);
3951 			i40e_debug(hw, I40E_DEBUG_INIT,
3952 				   "HW Capability: base_queue = %d\n",
3953 				   p->base_queue);
3954 			break;
3955 		case I40E_AQ_CAP_ID_TXQ:
3956 			p->num_tx_qp = number;
3957 			p->base_queue = phys_id;
3958 			i40e_debug(hw, I40E_DEBUG_INIT,
3959 				   "HW Capability: Tx QP = %d\n", number);
3960 			i40e_debug(hw, I40E_DEBUG_INIT,
3961 				   "HW Capability: base_queue = %d\n",
3962 				   p->base_queue);
3963 			break;
3964 		case I40E_AQ_CAP_ID_MSIX:
3965 			p->num_msix_vectors = number;
3966 			i40e_debug(hw, I40E_DEBUG_INIT,
3967 				   "HW Capability: MSIX vector count = %d\n",
3968 				   p->num_msix_vectors);
3969 			break;
3970 		case I40E_AQ_CAP_ID_VF_MSIX:
3971 			p->num_msix_vectors_vf = number;
3972 			i40e_debug(hw, I40E_DEBUG_INIT,
3973 				   "HW Capability: MSIX VF vector count = %d\n",
3974 				   p->num_msix_vectors_vf);
3975 			break;
3976 		case I40E_AQ_CAP_ID_FLEX10:
3977 			if (major_rev == 1) {
3978 				if (number == 1) {
3979 					p->flex10_enable = TRUE;
3980 					p->flex10_capable = TRUE;
3981 				}
3982 			} else {
3983 				/* Capability revision >= 2 */
3984 				if (number & 1)
3985 					p->flex10_enable = TRUE;
3986 				if (number & 2)
3987 					p->flex10_capable = TRUE;
3988 			}
3989 			p->flex10_mode = logical_id;
3990 			p->flex10_status = phys_id;
3991 			i40e_debug(hw, I40E_DEBUG_INIT,
3992 				   "HW Capability: Flex10 mode = %d\n",
3993 				   p->flex10_mode);
3994 			i40e_debug(hw, I40E_DEBUG_INIT,
3995 				   "HW Capability: Flex10 status = %d\n",
3996 				   p->flex10_status);
3997 			break;
3998 		case I40E_AQ_CAP_ID_CEM:
3999 			if (number == 1)
4000 				p->mgmt_cem = TRUE;
4001 			i40e_debug(hw, I40E_DEBUG_INIT,
4002 				   "HW Capability: CEM = %d\n", p->mgmt_cem);
4003 			break;
4004 		case I40E_AQ_CAP_ID_IWARP:
4005 			if (number == 1)
4006 				p->iwarp = TRUE;
4007 			i40e_debug(hw, I40E_DEBUG_INIT,
4008 				   "HW Capability: iWARP = %d\n", p->iwarp);
4009 			break;
4010 		case I40E_AQ_CAP_ID_LED:
4011 			if (phys_id < I40E_HW_CAP_MAX_GPIO)
4012 				p->led[phys_id] = TRUE;
4013 			i40e_debug(hw, I40E_DEBUG_INIT,
4014 				   "HW Capability: LED - PIN %d\n", phys_id);
4015 			break;
4016 		case I40E_AQ_CAP_ID_SDP:
4017 			if (phys_id < I40E_HW_CAP_MAX_GPIO)
4018 				p->sdp[phys_id] = TRUE;
4019 			i40e_debug(hw, I40E_DEBUG_INIT,
4020 				   "HW Capability: SDP - PIN %d\n", phys_id);
4021 			break;
4022 		case I40E_AQ_CAP_ID_MDIO:
4023 			if (number == 1) {
4024 				p->mdio_port_num = phys_id;
4025 				p->mdio_port_mode = logical_id;
4026 			}
4027 			i40e_debug(hw, I40E_DEBUG_INIT,
4028 				   "HW Capability: MDIO port number = %d\n",
4029 				   p->mdio_port_num);
4030 			i40e_debug(hw, I40E_DEBUG_INIT,
4031 				   "HW Capability: MDIO port mode = %d\n",
4032 				   p->mdio_port_mode);
4033 			break;
4034 		case I40E_AQ_CAP_ID_1588:
4035 			if (number == 1)
4036 				p->ieee_1588 = TRUE;
4037 			i40e_debug(hw, I40E_DEBUG_INIT,
4038 				   "HW Capability: IEEE 1588 = %d\n",
4039 				   p->ieee_1588);
4040 			break;
4041 		case I40E_AQ_CAP_ID_FLOW_DIRECTOR:
4042 			p->fd = TRUE;
4043 			p->fd_filters_guaranteed = number;
4044 			p->fd_filters_best_effort = logical_id;
4045 			i40e_debug(hw, I40E_DEBUG_INIT,
4046 				   "HW Capability: Flow Director = 1\n");
4047 			i40e_debug(hw, I40E_DEBUG_INIT,
4048 				   "HW Capability: Guaranteed FD filters = %d\n",
4049 				   p->fd_filters_guaranteed);
4050 			break;
4051 		case I40E_AQ_CAP_ID_WSR_PROT:
4052 			p->wr_csr_prot = (u64)number;
4053 			p->wr_csr_prot |= (u64)logical_id << 32;
4054 			i40e_debug(hw, I40E_DEBUG_INIT,
4055 				   "HW Capability: wr_csr_prot = 0x%llX\n\n",
4056 				   (unsigned long long)(p->wr_csr_prot & 0xffff));
4057 			break;
4058 		case I40E_AQ_CAP_ID_DIS_UNUSED_PORTS:
4059 			p->dis_unused_ports = (bool)number;
4060 			i40e_debug(hw, I40E_DEBUG_INIT,
4061 				   "HW Capability: dis_unused_ports = %d\n\n",
4062 				   p->dis_unused_ports);
4063 			break;
4064 		case I40E_AQ_CAP_ID_NVM_MGMT:
4065 			if (number & I40E_NVM_MGMT_SEC_REV_DISABLED)
4066 				p->sec_rev_disabled = TRUE;
4067 			if (number & I40E_NVM_MGMT_UPDATE_DISABLED)
4068 				p->update_disabled = TRUE;
4069 			break;
4070 		case I40E_AQ_CAP_ID_WOL_AND_PROXY:
4071 			hw->num_wol_proxy_filters = (u16)number;
4072 			hw->wol_proxy_vsi_seid = (u16)logical_id;
4073 			p->apm_wol_support = phys_id & I40E_WOL_SUPPORT_MASK;
4074 			if (phys_id & I40E_ACPI_PROGRAMMING_METHOD_MASK)
4075 				p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_AQC_FPK;
4076 			else
4077 				p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_HW_FVL;
4078 			p->proxy_support = (phys_id & I40E_PROXY_SUPPORT_MASK) ? 1 : 0;
4079 			i40e_debug(hw, I40E_DEBUG_INIT,
4080 				   "HW Capability: WOL proxy filters = %d\n",
4081 				   hw->num_wol_proxy_filters);
4082 			break;
4083 		default:
4084 			break;
4085 		}
4086 	}
4087 
4088 	if (p->fcoe)
4089 		i40e_debug(hw, I40E_DEBUG_ALL, "device is FCoE capable\n");
4090 
4091 	/* Always disable FCoE if compiled without the I40E_FCOE_ENA flag */
4092 	p->fcoe = FALSE;
4093 
4094 	/* count the enabled ports (aka the "not disabled" ports) */
4095 	hw->num_ports = 0;
4096 	for (i = 0; i < 4; i++) {
4097 		u32 port_cfg_reg = I40E_PRTGEN_CNF + (4 * i);
4098 		u64 port_cfg = 0;
4099 
4100 		/* use AQ read to get the physical register offset instead
4101 		 * of the port relative offset
4102 		 */
4103 		i40e_aq_debug_read_register(hw, port_cfg_reg, &port_cfg, NULL);
4104 		if (!(port_cfg & I40E_PRTGEN_CNF_PORT_DIS_MASK))
4105 			hw->num_ports++;
4106 	}
4107 
4108 	/* OCP cards case: if a mezz is removed the ethernet port is at
4109 	 * disabled state in PRTGEN_CNF register. Additional NVM read is
4110 	 * needed in order to check if we are dealing with OCP card.
4111 	 * Those cards have 4 PFs at minimum, so using PRTGEN_CNF for counting
4112 	 * physical ports results in wrong partition id calculation and thus
4113 	 * not supporting WoL.
4114 	 */
4115 	if (hw->mac.type == I40E_MAC_X722) {
4116 		if (i40e_acquire_nvm(hw, I40E_RESOURCE_READ) == I40E_SUCCESS) {
4117 			status = i40e_aq_read_nvm(hw, I40E_SR_EMP_MODULE_PTR,
4118 						  2 * I40E_SR_OCP_CFG_WORD0,
4119 						  sizeof(ocp_cfg_word0),
4120 						  &ocp_cfg_word0, TRUE, NULL);
4121 			if (status == I40E_SUCCESS &&
4122 			    (ocp_cfg_word0 & I40E_SR_OCP_ENABLED))
4123 				hw->num_ports = 4;
4124 			i40e_release_nvm(hw);
4125 		}
4126 	}
4127 
4128 	valid_functions = p->valid_functions;
4129 	num_functions = 0;
4130 	while (valid_functions) {
4131 		if (valid_functions & 1)
4132 			num_functions++;
4133 		valid_functions >>= 1;
4134 	}
4135 
4136 	/* partition id is 1-based, and functions are evenly spread
4137 	 * across the ports as partitions
4138 	 */
4139 	if (hw->num_ports != 0) {
4140 		hw->partition_id = (hw->pf_id / hw->num_ports) + 1;
4141 		hw->num_partitions = num_functions / hw->num_ports;
4142 	}
4143 
4144 	/* additional HW specific goodies that might
4145 	 * someday be HW version specific
4146 	 */
4147 	p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
4148 }
4149 
4150 /**
4151  * i40e_aq_discover_capabilities
4152  * @hw: pointer to the hw struct
4153  * @buff: a virtual buffer to hold the capabilities
4154  * @buff_size: Size of the virtual buffer
4155  * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
4156  * @list_type_opc: capabilities type to discover - pass in the command opcode
4157  * @cmd_details: pointer to command details structure or NULL
4158  *
4159  * Get the device capabilities descriptions from the firmware
4160  **/
4161 enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
4162 				void *buff, u16 buff_size, u16 *data_size,
4163 				enum i40e_admin_queue_opc list_type_opc,
4164 				struct i40e_asq_cmd_details *cmd_details)
4165 {
4166 	struct i40e_aqc_list_capabilites *cmd;
4167 	struct i40e_aq_desc desc;
4168 	enum i40e_status_code status = I40E_SUCCESS;
4169 
4170 	cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
4171 
4172 	if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
4173 		list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
4174 		status = I40E_ERR_PARAM;
4175 		goto exit;
4176 	}
4177 
4178 	i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
4179 
4180 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4181 	if (buff_size > I40E_AQ_LARGE_BUF)
4182 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4183 
4184 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4185 	*data_size = LE16_TO_CPU(desc.datalen);
4186 
4187 	if (status)
4188 		goto exit;
4189 
4190 	i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
4191 					 list_type_opc);
4192 
4193 exit:
4194 	return status;
4195 }
4196 
4197 /**
4198  * i40e_aq_update_nvm
4199  * @hw: pointer to the hw struct
4200  * @module_pointer: module pointer location in words from the NVM beginning
4201  * @offset: byte offset from the module beginning
4202  * @length: length of the section to be written (in bytes from the offset)
4203  * @data: command buffer (size [bytes] = length)
4204  * @last_command: tells if this is the last command in a series
4205  * @preservation_flags: Preservation mode flags
4206  * @cmd_details: pointer to command details structure or NULL
4207  *
4208  * Update the NVM using the admin queue commands
4209  **/
4210 enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
4211 				u32 offset, u16 length, void *data,
4212 				bool last_command, u8 preservation_flags,
4213 				struct i40e_asq_cmd_details *cmd_details)
4214 {
4215 	struct i40e_aq_desc desc;
4216 	struct i40e_aqc_nvm_update *cmd =
4217 		(struct i40e_aqc_nvm_update *)&desc.params.raw;
4218 	enum i40e_status_code status;
4219 
4220 	DEBUGFUNC("i40e_aq_update_nvm");
4221 
4222 	/* In offset the highest byte must be zeroed. */
4223 	if (offset & 0xFF000000) {
4224 		status = I40E_ERR_PARAM;
4225 		goto i40e_aq_update_nvm_exit;
4226 	}
4227 
4228 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
4229 
4230 	/* If this is the last command in a series, set the proper flag. */
4231 	if (last_command)
4232 		cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
4233 	if (hw->mac.type == I40E_MAC_X722) {
4234 		if (preservation_flags == I40E_NVM_PRESERVATION_FLAGS_SELECTED)
4235 			cmd->command_flags |=
4236 				(I40E_AQ_NVM_PRESERVATION_FLAGS_SELECTED <<
4237 				 I40E_AQ_NVM_PRESERVATION_FLAGS_SHIFT);
4238 		else if (preservation_flags == I40E_NVM_PRESERVATION_FLAGS_ALL)
4239 			cmd->command_flags |=
4240 				(I40E_AQ_NVM_PRESERVATION_FLAGS_ALL <<
4241 				 I40E_AQ_NVM_PRESERVATION_FLAGS_SHIFT);
4242 	}
4243 	cmd->module_pointer = module_pointer;
4244 	cmd->offset = CPU_TO_LE32(offset);
4245 	cmd->length = CPU_TO_LE16(length);
4246 
4247 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4248 	if (length > I40E_AQ_LARGE_BUF)
4249 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4250 
4251 	status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
4252 
4253 i40e_aq_update_nvm_exit:
4254 	return status;
4255 }
4256 
4257 /**
4258  * i40e_aq_get_lldp_mib
4259  * @hw: pointer to the hw struct
4260  * @bridge_type: type of bridge requested
4261  * @mib_type: Local, Remote or both Local and Remote MIBs
4262  * @buff: pointer to a user supplied buffer to store the MIB block
4263  * @buff_size: size of the buffer (in bytes)
4264  * @local_len : length of the returned Local LLDP MIB
4265  * @remote_len: length of the returned Remote LLDP MIB
4266  * @cmd_details: pointer to command details structure or NULL
4267  *
4268  * Requests the complete LLDP MIB (entire packet).
4269  **/
4270 enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
4271 				u8 mib_type, void *buff, u16 buff_size,
4272 				u16 *local_len, u16 *remote_len,
4273 				struct i40e_asq_cmd_details *cmd_details)
4274 {
4275 	struct i40e_aq_desc desc;
4276 	struct i40e_aqc_lldp_get_mib *cmd =
4277 		(struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
4278 	struct i40e_aqc_lldp_get_mib *resp =
4279 		(struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
4280 	enum i40e_status_code status;
4281 
4282 	if (buff_size == 0 || !buff)
4283 		return I40E_ERR_PARAM;
4284 
4285 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
4286 	/* Indirect Command */
4287 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4288 
4289 	cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
4290 	cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4291 		       I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4292 
4293 	desc.datalen = CPU_TO_LE16(buff_size);
4294 
4295 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4296 	if (buff_size > I40E_AQ_LARGE_BUF)
4297 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4298 
4299 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4300 	if (!status) {
4301 		if (local_len != NULL)
4302 			*local_len = LE16_TO_CPU(resp->local_len);
4303 		if (remote_len != NULL)
4304 			*remote_len = LE16_TO_CPU(resp->remote_len);
4305 	}
4306 
4307 	return status;
4308 }
4309 
4310  /**
4311  * i40e_aq_set_lldp_mib - Set the LLDP MIB
4312  * @hw: pointer to the hw struct
4313  * @mib_type: Local, Remote or both Local and Remote MIBs
4314  * @buff: pointer to a user supplied buffer to store the MIB block
4315  * @buff_size: size of the buffer (in bytes)
4316  * @cmd_details: pointer to command details structure or NULL
4317  *
4318  * Set the LLDP MIB.
4319  **/
4320 enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
4321 				u8 mib_type, void *buff, u16 buff_size,
4322 				struct i40e_asq_cmd_details *cmd_details)
4323 {
4324 	struct i40e_aq_desc desc;
4325 	struct i40e_aqc_lldp_set_local_mib *cmd =
4326 		(struct i40e_aqc_lldp_set_local_mib *)&desc.params.raw;
4327 	enum i40e_status_code status;
4328 
4329 	if (buff_size == 0 || !buff)
4330 		return I40E_ERR_PARAM;
4331 
4332 	i40e_fill_default_direct_cmd_desc(&desc,
4333 				i40e_aqc_opc_lldp_set_local_mib);
4334 	/* Indirect Command */
4335 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4336 	if (buff_size > I40E_AQ_LARGE_BUF)
4337 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4338 	desc.datalen = CPU_TO_LE16(buff_size);
4339 
4340 	cmd->type = mib_type;
4341 	cmd->length = CPU_TO_LE16(buff_size);
4342 	cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)buff));
4343 	cmd->address_low =  CPU_TO_LE32(I40E_LO_DWORD((u64)buff));
4344 
4345 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4346 	return status;
4347 }
4348 
4349 /**
4350  * i40e_aq_cfg_lldp_mib_change_event
4351  * @hw: pointer to the hw struct
4352  * @enable_update: Enable or Disable event posting
4353  * @cmd_details: pointer to command details structure or NULL
4354  *
4355  * Enable or Disable posting of an event on ARQ when LLDP MIB
4356  * associated with the interface changes
4357  **/
4358 enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
4359 				bool enable_update,
4360 				struct i40e_asq_cmd_details *cmd_details)
4361 {
4362 	struct i40e_aq_desc desc;
4363 	struct i40e_aqc_lldp_update_mib *cmd =
4364 		(struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
4365 	enum i40e_status_code status;
4366 
4367 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
4368 
4369 	if (!enable_update)
4370 		cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
4371 
4372 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4373 
4374 	return status;
4375 }
4376 
4377 /**
4378  * i40e_aq_restore_lldp
4379  * @hw: pointer to the hw struct
4380  * @setting: pointer to factory setting variable or NULL
4381  * @restore: True if factory settings should be restored
4382  * @cmd_details: pointer to command details structure or NULL
4383  *
4384  * Restore LLDP Agent factory settings if @restore set to True. In other case
4385  * only returns factory setting in AQ response.
4386  **/
4387 enum i40e_status_code
4388 i40e_aq_restore_lldp(struct i40e_hw *hw, u8 *setting, bool restore,
4389 		     struct i40e_asq_cmd_details *cmd_details)
4390 {
4391 	struct i40e_aq_desc desc;
4392 	struct i40e_aqc_lldp_restore *cmd =
4393 		(struct i40e_aqc_lldp_restore *)&desc.params.raw;
4394 	enum i40e_status_code status;
4395 
4396 	if (!(hw->flags & I40E_HW_FLAG_FW_LLDP_PERSISTENT)) {
4397 		i40e_debug(hw, I40E_DEBUG_ALL,
4398 			   "Restore LLDP not supported by current FW version.\n");
4399 		return I40E_ERR_DEVICE_NOT_SUPPORTED;
4400 	}
4401 
4402 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_restore);
4403 
4404 	if (restore)
4405 		cmd->command |= I40E_AQ_LLDP_AGENT_RESTORE;
4406 
4407 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4408 
4409 	if (setting)
4410 		*setting = cmd->command & 1;
4411 
4412 	return status;
4413 }
4414 
4415 /**
4416  * i40e_aq_stop_lldp
4417  * @hw: pointer to the hw struct
4418  * @shutdown_agent: True if LLDP Agent needs to be Shutdown
4419  * @persist: True if stop of LLDP should be persistent across power cycles
4420  * @cmd_details: pointer to command details structure or NULL
4421  *
4422  * Stop or Shutdown the embedded LLDP Agent
4423  **/
4424 enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
4425 				bool persist,
4426 				struct i40e_asq_cmd_details *cmd_details)
4427 {
4428 	struct i40e_aq_desc desc;
4429 	struct i40e_aqc_lldp_stop *cmd =
4430 		(struct i40e_aqc_lldp_stop *)&desc.params.raw;
4431 	enum i40e_status_code status;
4432 
4433 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
4434 
4435 	if (shutdown_agent)
4436 		cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
4437 
4438 	if (persist) {
4439 		if (hw->flags & I40E_HW_FLAG_FW_LLDP_PERSISTENT)
4440 			cmd->command |= I40E_AQ_LLDP_AGENT_STOP_PERSIST;
4441 		else
4442 			i40e_debug(hw, I40E_DEBUG_ALL,
4443 				   "Persistent Stop LLDP not supported by current FW version.\n");
4444 	}
4445 
4446 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4447 
4448 	return status;
4449 }
4450 
4451 /**
4452  * i40e_aq_start_lldp
4453  * @hw: pointer to the hw struct
4454  * @persist: True if start of LLDP should be persistent across power cycles
4455  * @cmd_details: pointer to command details structure or NULL
4456  *
4457  * Start the embedded LLDP Agent on all ports.
4458  **/
4459 enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
4460 				bool persist,
4461 				struct i40e_asq_cmd_details *cmd_details)
4462 {
4463 	struct i40e_aq_desc desc;
4464 	struct i40e_aqc_lldp_start *cmd =
4465 		(struct i40e_aqc_lldp_start *)&desc.params.raw;
4466 	enum i40e_status_code status;
4467 
4468 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
4469 
4470 	cmd->command = I40E_AQ_LLDP_AGENT_START;
4471 
4472 	if (persist) {
4473 		if (hw->flags & I40E_HW_FLAG_FW_LLDP_PERSISTENT)
4474 			cmd->command |= I40E_AQ_LLDP_AGENT_START_PERSIST;
4475 		else
4476 			i40e_debug(hw, I40E_DEBUG_ALL,
4477 				   "Persistent Start LLDP not supported by current FW version.\n");
4478 	}
4479 
4480 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4481 
4482 	return status;
4483 }
4484 
4485 /**
4486  * i40e_aq_set_dcb_parameters
4487  * @hw: pointer to the hw struct
4488  * @cmd_details: pointer to command details structure or NULL
4489  * @dcb_enable: True if DCB configuration needs to be applied
4490  *
4491  **/
4492 enum i40e_status_code
4493 i40e_aq_set_dcb_parameters(struct i40e_hw *hw, bool dcb_enable,
4494 			   struct i40e_asq_cmd_details *cmd_details)
4495 {
4496 	struct i40e_aq_desc desc;
4497 	struct i40e_aqc_set_dcb_parameters *cmd =
4498 		(struct i40e_aqc_set_dcb_parameters *)&desc.params.raw;
4499 	enum i40e_status_code status;
4500 
4501 	if (!(hw->flags & I40E_HW_FLAG_FW_LLDP_STOPPABLE))
4502 		return I40E_ERR_DEVICE_NOT_SUPPORTED;
4503 
4504 	i40e_fill_default_direct_cmd_desc(&desc,
4505 					  i40e_aqc_opc_set_dcb_parameters);
4506 
4507 	if (dcb_enable) {
4508 		cmd->valid_flags = I40E_DCB_VALID;
4509 		cmd->command = I40E_AQ_DCB_SET_AGENT;
4510 	}
4511 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4512 
4513 	return status;
4514 }
4515 
4516 /**
4517  * i40e_aq_get_cee_dcb_config
4518  * @hw: pointer to the hw struct
4519  * @buff: response buffer that stores CEE operational configuration
4520  * @buff_size: size of the buffer passed
4521  * @cmd_details: pointer to command details structure or NULL
4522  *
4523  * Get CEE DCBX mode operational configuration from firmware
4524  **/
4525 enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
4526 				void *buff, u16 buff_size,
4527 				struct i40e_asq_cmd_details *cmd_details)
4528 {
4529 	struct i40e_aq_desc desc;
4530 	enum i40e_status_code status;
4531 
4532 	if (buff_size == 0 || !buff)
4533 		return I40E_ERR_PARAM;
4534 
4535 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_cee_dcb_cfg);
4536 
4537 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4538 	status = i40e_asq_send_command(hw, &desc, (void *)buff, buff_size,
4539 				       cmd_details);
4540 
4541 	return status;
4542 }
4543 
4544 /**
4545  * i40e_aq_start_stop_dcbx - Start/Stop DCBx service in FW
4546  * @hw: pointer to the hw struct
4547  * @start_agent: True if DCBx Agent needs to be Started
4548  *				False if DCBx Agent needs to be Stopped
4549  * @cmd_details: pointer to command details structure or NULL
4550  *
4551  * Start/Stop the embedded dcbx Agent
4552  **/
4553 enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
4554 				bool start_agent,
4555 				struct i40e_asq_cmd_details *cmd_details)
4556 {
4557 	struct i40e_aq_desc desc;
4558 	struct i40e_aqc_lldp_stop_start_specific_agent *cmd =
4559 		(struct i40e_aqc_lldp_stop_start_specific_agent *)
4560 				&desc.params.raw;
4561 	enum i40e_status_code status;
4562 
4563 	i40e_fill_default_direct_cmd_desc(&desc,
4564 				i40e_aqc_opc_lldp_stop_start_spec_agent);
4565 
4566 	if (start_agent)
4567 		cmd->command = I40E_AQC_START_SPECIFIC_AGENT_MASK;
4568 
4569 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4570 
4571 	return status;
4572 }
4573 
4574 /**
4575  * i40e_aq_add_udp_tunnel
4576  * @hw: pointer to the hw struct
4577  * @udp_port: the UDP port to add in Host byte order
4578  * @protocol_index: protocol index type
4579  * @filter_index: pointer to filter index
4580  * @cmd_details: pointer to command details structure or NULL
4581  *
4582  * Note: Firmware expects the udp_port value to be in Little Endian format,
4583  * and this function will call CPU_TO_LE16 to convert from Host byte order to
4584  * Little Endian order.
4585  **/
4586 enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
4587 				u16 udp_port, u8 protocol_index,
4588 				u8 *filter_index,
4589 				struct i40e_asq_cmd_details *cmd_details)
4590 {
4591 	struct i40e_aq_desc desc;
4592 	struct i40e_aqc_add_udp_tunnel *cmd =
4593 		(struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
4594 	struct i40e_aqc_del_udp_tunnel_completion *resp =
4595 		(struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
4596 	enum i40e_status_code status;
4597 
4598 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
4599 
4600 	cmd->udp_port = CPU_TO_LE16(udp_port);
4601 	cmd->protocol_type = protocol_index;
4602 
4603 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4604 
4605 	if (!status && filter_index)
4606 		*filter_index = resp->index;
4607 
4608 	return status;
4609 }
4610 
4611 /**
4612  * i40e_aq_del_udp_tunnel
4613  * @hw: pointer to the hw struct
4614  * @index: filter index
4615  * @cmd_details: pointer to command details structure or NULL
4616  **/
4617 enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
4618 				struct i40e_asq_cmd_details *cmd_details)
4619 {
4620 	struct i40e_aq_desc desc;
4621 	struct i40e_aqc_remove_udp_tunnel *cmd =
4622 		(struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
4623 	enum i40e_status_code status;
4624 
4625 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
4626 
4627 	cmd->index = index;
4628 
4629 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4630 
4631 	return status;
4632 }
4633 
4634 /**
4635  * i40e_aq_get_switch_resource_alloc - command (0x0204) to get allocations
4636  * @hw: pointer to the hw struct
4637  * @num_entries: pointer to u8 to store the number of resource entries returned
4638  * @buf: pointer to a user supplied buffer.  This buffer must be large enough
4639  *        to store the resource information for all resource types.  Each
4640  *        resource type is a i40e_aqc_switch_resource_alloc_data structure.
4641  * @count: size, in bytes, of the buffer provided
4642  * @cmd_details: pointer to command details structure or NULL
4643  *
4644  * Query the resources allocated to a function.
4645  **/
4646 enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
4647 			u8 *num_entries,
4648 			struct i40e_aqc_switch_resource_alloc_element_resp *buf,
4649 			u16 count,
4650 			struct i40e_asq_cmd_details *cmd_details)
4651 {
4652 	struct i40e_aq_desc desc;
4653 	struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
4654 		(struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
4655 	enum i40e_status_code status;
4656 	u16 length = count * sizeof(*buf);
4657 
4658 	i40e_fill_default_direct_cmd_desc(&desc,
4659 					i40e_aqc_opc_get_switch_resource_alloc);
4660 
4661 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4662 	if (length > I40E_AQ_LARGE_BUF)
4663 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4664 
4665 	status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4666 
4667 	if (!status && num_entries)
4668 		*num_entries = cmd_resp->num_entries;
4669 
4670 	return status;
4671 }
4672 
4673 /**
4674  * i40e_aq_delete_element - Delete switch element
4675  * @hw: pointer to the hw struct
4676  * @seid: the SEID to delete from the switch
4677  * @cmd_details: pointer to command details structure or NULL
4678  *
4679  * This deletes a switch element from the switch.
4680  **/
4681 enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
4682 				struct i40e_asq_cmd_details *cmd_details)
4683 {
4684 	struct i40e_aq_desc desc;
4685 	struct i40e_aqc_switch_seid *cmd =
4686 		(struct i40e_aqc_switch_seid *)&desc.params.raw;
4687 	enum i40e_status_code status;
4688 
4689 	if (seid == 0)
4690 		return I40E_ERR_PARAM;
4691 
4692 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
4693 
4694 	cmd->seid = CPU_TO_LE16(seid);
4695 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4696 
4697 	return status;
4698 }
4699 
4700 /**
4701  * i40e_aq_add_pvirt - Instantiate a Port Virtualizer on a port
4702  * @hw: pointer to the hw struct
4703  * @flags: component flags
4704  * @mac_seid: uplink seid (MAC SEID)
4705  * @vsi_seid: connected vsi seid
4706  * @ret_seid: seid of create pv component
4707  *
4708  * This instantiates an i40e port virtualizer with specified flags.
4709  * Depending on specified flags the port virtualizer can act as a
4710  * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
4711  */
4712 enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
4713 				       u16 mac_seid, u16 vsi_seid,
4714 				       u16 *ret_seid)
4715 {
4716 	struct i40e_aq_desc desc;
4717 	struct i40e_aqc_add_update_pv *cmd =
4718 		(struct i40e_aqc_add_update_pv *)&desc.params.raw;
4719 	struct i40e_aqc_add_update_pv_completion *resp =
4720 		(struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
4721 	enum i40e_status_code status;
4722 
4723 	if (vsi_seid == 0)
4724 		return I40E_ERR_PARAM;
4725 
4726 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
4727 	cmd->command_flags = CPU_TO_LE16(flags);
4728 	cmd->uplink_seid = CPU_TO_LE16(mac_seid);
4729 	cmd->connected_seid = CPU_TO_LE16(vsi_seid);
4730 
4731 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4732 	if (!status && ret_seid)
4733 		*ret_seid = LE16_TO_CPU(resp->pv_seid);
4734 
4735 	return status;
4736 }
4737 
4738 /**
4739  * i40e_aq_add_tag - Add an S/E-tag
4740  * @hw: pointer to the hw struct
4741  * @direct_to_queue: should s-tag direct flow to a specific queue
4742  * @vsi_seid: VSI SEID to use this tag
4743  * @tag: value of the tag
4744  * @queue_num: queue number, only valid is direct_to_queue is TRUE
4745  * @tags_used: return value, number of tags in use by this PF
4746  * @tags_free: return value, number of unallocated tags
4747  * @cmd_details: pointer to command details structure or NULL
4748  *
4749  * This associates an S- or E-tag to a VSI in the switch complex.  It returns
4750  * the number of tags allocated by the PF, and the number of unallocated
4751  * tags available.
4752  **/
4753 enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
4754 				u16 vsi_seid, u16 tag, u16 queue_num,
4755 				u16 *tags_used, u16 *tags_free,
4756 				struct i40e_asq_cmd_details *cmd_details)
4757 {
4758 	struct i40e_aq_desc desc;
4759 	struct i40e_aqc_add_tag *cmd =
4760 		(struct i40e_aqc_add_tag *)&desc.params.raw;
4761 	struct i40e_aqc_add_remove_tag_completion *resp =
4762 		(struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4763 	enum i40e_status_code status;
4764 
4765 	if (vsi_seid == 0)
4766 		return I40E_ERR_PARAM;
4767 
4768 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
4769 
4770 	cmd->seid = CPU_TO_LE16(vsi_seid);
4771 	cmd->tag = CPU_TO_LE16(tag);
4772 	if (direct_to_queue) {
4773 		cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
4774 		cmd->queue_number = CPU_TO_LE16(queue_num);
4775 	}
4776 
4777 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4778 
4779 	if (!status) {
4780 		if (tags_used != NULL)
4781 			*tags_used = LE16_TO_CPU(resp->tags_used);
4782 		if (tags_free != NULL)
4783 			*tags_free = LE16_TO_CPU(resp->tags_free);
4784 	}
4785 
4786 	return status;
4787 }
4788 
4789 /**
4790  * i40e_aq_remove_tag - Remove an S- or E-tag
4791  * @hw: pointer to the hw struct
4792  * @vsi_seid: VSI SEID this tag is associated with
4793  * @tag: value of the S-tag to delete
4794  * @tags_used: return value, number of tags in use by this PF
4795  * @tags_free: return value, number of unallocated tags
4796  * @cmd_details: pointer to command details structure or NULL
4797  *
4798  * This deletes an S- or E-tag from a VSI in the switch complex.  It returns
4799  * the number of tags allocated by the PF, and the number of unallocated
4800  * tags available.
4801  **/
4802 enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
4803 				u16 tag, u16 *tags_used, u16 *tags_free,
4804 				struct i40e_asq_cmd_details *cmd_details)
4805 {
4806 	struct i40e_aq_desc desc;
4807 	struct i40e_aqc_remove_tag *cmd =
4808 		(struct i40e_aqc_remove_tag *)&desc.params.raw;
4809 	struct i40e_aqc_add_remove_tag_completion *resp =
4810 		(struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4811 	enum i40e_status_code status;
4812 
4813 	if (vsi_seid == 0)
4814 		return I40E_ERR_PARAM;
4815 
4816 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
4817 
4818 	cmd->seid = CPU_TO_LE16(vsi_seid);
4819 	cmd->tag = CPU_TO_LE16(tag);
4820 
4821 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4822 
4823 	if (!status) {
4824 		if (tags_used != NULL)
4825 			*tags_used = LE16_TO_CPU(resp->tags_used);
4826 		if (tags_free != NULL)
4827 			*tags_free = LE16_TO_CPU(resp->tags_free);
4828 	}
4829 
4830 	return status;
4831 }
4832 
4833 /**
4834  * i40e_aq_add_mcast_etag - Add a multicast E-tag
4835  * @hw: pointer to the hw struct
4836  * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
4837  * @etag: value of E-tag to add
4838  * @num_tags_in_buf: number of unicast E-tags in indirect buffer
4839  * @buf: address of indirect buffer
4840  * @tags_used: return value, number of E-tags in use by this port
4841  * @tags_free: return value, number of unallocated M-tags
4842  * @cmd_details: pointer to command details structure or NULL
4843  *
4844  * This associates a multicast E-tag to a port virtualizer.  It will return
4845  * the number of tags allocated by the PF, and the number of unallocated
4846  * tags available.
4847  *
4848  * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
4849  * num_tags_in_buf long.
4850  **/
4851 enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4852 				u16 etag, u8 num_tags_in_buf, void *buf,
4853 				u16 *tags_used, u16 *tags_free,
4854 				struct i40e_asq_cmd_details *cmd_details)
4855 {
4856 	struct i40e_aq_desc desc;
4857 	struct i40e_aqc_add_remove_mcast_etag *cmd =
4858 		(struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4859 	struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4860 	   (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4861 	enum i40e_status_code status;
4862 	u16 length = sizeof(u16) * num_tags_in_buf;
4863 
4864 	if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
4865 		return I40E_ERR_PARAM;
4866 
4867 	i40e_fill_default_direct_cmd_desc(&desc,
4868 					  i40e_aqc_opc_add_multicast_etag);
4869 
4870 	cmd->pv_seid = CPU_TO_LE16(pv_seid);
4871 	cmd->etag = CPU_TO_LE16(etag);
4872 	cmd->num_unicast_etags = num_tags_in_buf;
4873 
4874 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4875 
4876 	status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4877 
4878 	if (!status) {
4879 		if (tags_used != NULL)
4880 			*tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4881 		if (tags_free != NULL)
4882 			*tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4883 	}
4884 
4885 	return status;
4886 }
4887 
4888 /**
4889  * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
4890  * @hw: pointer to the hw struct
4891  * @pv_seid: Port Virtualizer SEID this M-tag is associated with
4892  * @etag: value of the E-tag to remove
4893  * @tags_used: return value, number of tags in use by this port
4894  * @tags_free: return value, number of unallocated tags
4895  * @cmd_details: pointer to command details structure or NULL
4896  *
4897  * This deletes an E-tag from the port virtualizer.  It will return
4898  * the number of tags allocated by the port, and the number of unallocated
4899  * tags available.
4900  **/
4901 enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4902 				u16 etag, u16 *tags_used, u16 *tags_free,
4903 				struct i40e_asq_cmd_details *cmd_details)
4904 {
4905 	struct i40e_aq_desc desc;
4906 	struct i40e_aqc_add_remove_mcast_etag *cmd =
4907 		(struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4908 	struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4909 	   (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4910 	enum i40e_status_code status;
4911 
4912 
4913 	if (pv_seid == 0)
4914 		return I40E_ERR_PARAM;
4915 
4916 	i40e_fill_default_direct_cmd_desc(&desc,
4917 					  i40e_aqc_opc_remove_multicast_etag);
4918 
4919 	cmd->pv_seid = CPU_TO_LE16(pv_seid);
4920 	cmd->etag = CPU_TO_LE16(etag);
4921 
4922 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4923 
4924 	if (!status) {
4925 		if (tags_used != NULL)
4926 			*tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4927 		if (tags_free != NULL)
4928 			*tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4929 	}
4930 
4931 	return status;
4932 }
4933 
4934 /**
4935  * i40e_aq_update_tag - Update an S/E-tag
4936  * @hw: pointer to the hw struct
4937  * @vsi_seid: VSI SEID using this S-tag
4938  * @old_tag: old tag value
4939  * @new_tag: new tag value
4940  * @tags_used: return value, number of tags in use by this PF
4941  * @tags_free: return value, number of unallocated tags
4942  * @cmd_details: pointer to command details structure or NULL
4943  *
4944  * This updates the value of the tag currently attached to this VSI
4945  * in the switch complex.  It will return the number of tags allocated
4946  * by the PF, and the number of unallocated tags available.
4947  **/
4948 enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
4949 				u16 old_tag, u16 new_tag, u16 *tags_used,
4950 				u16 *tags_free,
4951 				struct i40e_asq_cmd_details *cmd_details)
4952 {
4953 	struct i40e_aq_desc desc;
4954 	struct i40e_aqc_update_tag *cmd =
4955 		(struct i40e_aqc_update_tag *)&desc.params.raw;
4956 	struct i40e_aqc_update_tag_completion *resp =
4957 		(struct i40e_aqc_update_tag_completion *)&desc.params.raw;
4958 	enum i40e_status_code status;
4959 
4960 	if (vsi_seid == 0)
4961 		return I40E_ERR_PARAM;
4962 
4963 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
4964 
4965 	cmd->seid = CPU_TO_LE16(vsi_seid);
4966 	cmd->old_tag = CPU_TO_LE16(old_tag);
4967 	cmd->new_tag = CPU_TO_LE16(new_tag);
4968 
4969 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4970 
4971 	if (!status) {
4972 		if (tags_used != NULL)
4973 			*tags_used = LE16_TO_CPU(resp->tags_used);
4974 		if (tags_free != NULL)
4975 			*tags_free = LE16_TO_CPU(resp->tags_free);
4976 	}
4977 
4978 	return status;
4979 }
4980 
4981 /**
4982  * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
4983  * @hw: pointer to the hw struct
4984  * @tcmap: TC map for request/release any ignore PFC condition
4985  * @request: request or release ignore PFC condition
4986  * @tcmap_ret: return TCs for which PFC is currently ignored
4987  * @cmd_details: pointer to command details structure or NULL
4988  *
4989  * This sends out request/release to ignore PFC condition for a TC.
4990  * It will return the TCs for which PFC is currently ignored.
4991  **/
4992 enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
4993 				bool request, u8 *tcmap_ret,
4994 				struct i40e_asq_cmd_details *cmd_details)
4995 {
4996 	struct i40e_aq_desc desc;
4997 	struct i40e_aqc_pfc_ignore *cmd_resp =
4998 		(struct i40e_aqc_pfc_ignore *)&desc.params.raw;
4999 	enum i40e_status_code status;
5000 
5001 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
5002 
5003 	if (request)
5004 		cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
5005 
5006 	cmd_resp->tc_bitmap = tcmap;
5007 
5008 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5009 
5010 	if (!status) {
5011 		if (tcmap_ret != NULL)
5012 			*tcmap_ret = cmd_resp->tc_bitmap;
5013 	}
5014 
5015 	return status;
5016 }
5017 
5018 /**
5019  * i40e_aq_dcb_updated - DCB Updated Command
5020  * @hw: pointer to the hw struct
5021  * @cmd_details: pointer to command details structure or NULL
5022  *
5023  * When LLDP is handled in PF this command is used by the PF
5024  * to notify EMP that a DCB setting is modified.
5025  * When LLDP is handled in EMP this command is used by the PF
5026  * to notify EMP whenever one of the following parameters get
5027  * modified:
5028  *   - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
5029  *   - PCIRTT in PRTDCB_GENC.PCIRTT
5030  *   - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
5031  * EMP will return when the shared RPB settings have been
5032  * recomputed and modified. The retval field in the descriptor
5033  * will be set to 0 when RPB is modified.
5034  **/
5035 enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
5036 				struct i40e_asq_cmd_details *cmd_details)
5037 {
5038 	struct i40e_aq_desc desc;
5039 	enum i40e_status_code status;
5040 
5041 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
5042 
5043 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5044 
5045 	return status;
5046 }
5047 
5048 /**
5049  * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
5050  * @hw: pointer to the hw struct
5051  * @seid: defines the SEID of the switch for which the stats are requested
5052  * @vlan_id: the VLAN ID for which the statistics are requested
5053  * @stat_index: index of the statistics counters block assigned to this VLAN
5054  * @cmd_details: pointer to command details structure or NULL
5055  *
5056  * XL710 supports 128 smonVlanStats counters.This command is used to
5057  * allocate a set of smonVlanStats counters to a specific VLAN in a specific
5058  * switch.
5059  **/
5060 enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
5061 				u16 vlan_id, u16 *stat_index,
5062 				struct i40e_asq_cmd_details *cmd_details)
5063 {
5064 	struct i40e_aq_desc desc;
5065 	struct i40e_aqc_add_remove_statistics *cmd_resp =
5066 		(struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
5067 	enum i40e_status_code status;
5068 
5069 	if ((seid == 0) || (stat_index == NULL))
5070 		return I40E_ERR_PARAM;
5071 
5072 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
5073 
5074 	cmd_resp->seid = CPU_TO_LE16(seid);
5075 	cmd_resp->vlan = CPU_TO_LE16(vlan_id);
5076 
5077 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5078 
5079 	if (!status && stat_index)
5080 		*stat_index = LE16_TO_CPU(cmd_resp->stat_index);
5081 
5082 	return status;
5083 }
5084 
5085 /**
5086  * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
5087  * @hw: pointer to the hw struct
5088  * @seid: defines the SEID of the switch for which the stats are requested
5089  * @vlan_id: the VLAN ID for which the statistics are requested
5090  * @stat_index: index of the statistics counters block assigned to this VLAN
5091  * @cmd_details: pointer to command details structure or NULL
5092  *
5093  * XL710 supports 128 smonVlanStats counters.This command is used to
5094  * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
5095  * switch.
5096  **/
5097 enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
5098 				u16 vlan_id, u16 stat_index,
5099 				struct i40e_asq_cmd_details *cmd_details)
5100 {
5101 	struct i40e_aq_desc desc;
5102 	struct i40e_aqc_add_remove_statistics *cmd =
5103 		(struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
5104 	enum i40e_status_code status;
5105 
5106 	if (seid == 0)
5107 		return I40E_ERR_PARAM;
5108 
5109 	i40e_fill_default_direct_cmd_desc(&desc,
5110 					  i40e_aqc_opc_remove_statistics);
5111 
5112 	cmd->seid = CPU_TO_LE16(seid);
5113 	cmd->vlan  = CPU_TO_LE16(vlan_id);
5114 	cmd->stat_index = CPU_TO_LE16(stat_index);
5115 
5116 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5117 
5118 	return status;
5119 }
5120 
5121 /**
5122  * i40e_aq_set_port_parameters - set physical port parameters.
5123  * @hw: pointer to the hw struct
5124  * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
5125  * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
5126  * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
5127  * @double_vlan: if set double VLAN is enabled
5128  * @cmd_details: pointer to command details structure or NULL
5129  **/
5130 enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
5131 				u16 bad_frame_vsi, bool save_bad_pac,
5132 				bool pad_short_pac, bool double_vlan,
5133 				struct i40e_asq_cmd_details *cmd_details)
5134 {
5135 	struct i40e_aqc_set_port_parameters *cmd;
5136 	enum i40e_status_code status;
5137 	struct i40e_aq_desc desc;
5138 	u16 command_flags = 0;
5139 
5140 	cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
5141 
5142 	i40e_fill_default_direct_cmd_desc(&desc,
5143 					  i40e_aqc_opc_set_port_parameters);
5144 
5145 	cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
5146 	if (save_bad_pac)
5147 		command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
5148 	if (pad_short_pac)
5149 		command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
5150 	if (double_vlan)
5151 		command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
5152 	cmd->command_flags = CPU_TO_LE16(command_flags);
5153 
5154 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5155 
5156 	return status;
5157 }
5158 
5159 /**
5160  * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
5161  * @hw: pointer to the hw struct
5162  * @seid: seid for the physical port/switching component/vsi
5163  * @buff: Indirect buffer to hold data parameters and response
5164  * @buff_size: Indirect buffer size
5165  * @opcode: Tx scheduler AQ command opcode
5166  * @cmd_details: pointer to command details structure or NULL
5167  *
5168  * Generic command handler for Tx scheduler AQ commands
5169  **/
5170 static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
5171 				void *buff, u16 buff_size,
5172 				 enum i40e_admin_queue_opc opcode,
5173 				struct i40e_asq_cmd_details *cmd_details)
5174 {
5175 	struct i40e_aq_desc desc;
5176 	struct i40e_aqc_tx_sched_ind *cmd =
5177 		(struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
5178 	enum i40e_status_code status;
5179 	bool cmd_param_flag = FALSE;
5180 
5181 	switch (opcode) {
5182 	case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
5183 	case i40e_aqc_opc_configure_vsi_tc_bw:
5184 	case i40e_aqc_opc_enable_switching_comp_ets:
5185 	case i40e_aqc_opc_modify_switching_comp_ets:
5186 	case i40e_aqc_opc_disable_switching_comp_ets:
5187 	case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
5188 	case i40e_aqc_opc_configure_switching_comp_bw_config:
5189 		cmd_param_flag = TRUE;
5190 		break;
5191 	case i40e_aqc_opc_query_vsi_bw_config:
5192 	case i40e_aqc_opc_query_vsi_ets_sla_config:
5193 	case i40e_aqc_opc_query_switching_comp_ets_config:
5194 	case i40e_aqc_opc_query_port_ets_config:
5195 	case i40e_aqc_opc_query_switching_comp_bw_config:
5196 		cmd_param_flag = FALSE;
5197 		break;
5198 	default:
5199 		return I40E_ERR_PARAM;
5200 	}
5201 
5202 	i40e_fill_default_direct_cmd_desc(&desc, opcode);
5203 
5204 	/* Indirect command */
5205 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5206 	if (cmd_param_flag)
5207 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
5208 	if (buff_size > I40E_AQ_LARGE_BUF)
5209 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5210 
5211 	desc.datalen = CPU_TO_LE16(buff_size);
5212 
5213 	cmd->vsi_seid = CPU_TO_LE16(seid);
5214 
5215 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
5216 
5217 	return status;
5218 }
5219 
5220 /**
5221  * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
5222  * @hw: pointer to the hw struct
5223  * @seid: VSI seid
5224  * @credit: BW limit credits (0 = disabled)
5225  * @max_credit: Max BW limit credits
5226  * @cmd_details: pointer to command details structure or NULL
5227  **/
5228 enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
5229 				u16 seid, u16 credit, u8 max_credit,
5230 				struct i40e_asq_cmd_details *cmd_details)
5231 {
5232 	struct i40e_aq_desc desc;
5233 	struct i40e_aqc_configure_vsi_bw_limit *cmd =
5234 		(struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
5235 	enum i40e_status_code status;
5236 
5237 	i40e_fill_default_direct_cmd_desc(&desc,
5238 					  i40e_aqc_opc_configure_vsi_bw_limit);
5239 
5240 	cmd->vsi_seid = CPU_TO_LE16(seid);
5241 	cmd->credit = CPU_TO_LE16(credit);
5242 	cmd->max_credit = max_credit;
5243 
5244 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5245 
5246 	return status;
5247 }
5248 
5249 /**
5250  * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
5251  * @hw: pointer to the hw struct
5252  * @seid: switching component seid
5253  * @credit: BW limit credits (0 = disabled)
5254  * @max_bw: Max BW limit credits
5255  * @cmd_details: pointer to command details structure or NULL
5256  **/
5257 enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
5258 				u16 seid, u16 credit, u8 max_bw,
5259 				struct i40e_asq_cmd_details *cmd_details)
5260 {
5261 	struct i40e_aq_desc desc;
5262 	struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
5263 	  (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
5264 	enum i40e_status_code status;
5265 
5266 	i40e_fill_default_direct_cmd_desc(&desc,
5267 				i40e_aqc_opc_configure_switching_comp_bw_limit);
5268 
5269 	cmd->seid = CPU_TO_LE16(seid);
5270 	cmd->credit = CPU_TO_LE16(credit);
5271 	cmd->max_bw = max_bw;
5272 
5273 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5274 
5275 	return status;
5276 }
5277 
5278 /**
5279  * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
5280  * @hw: pointer to the hw struct
5281  * @seid: VSI seid
5282  * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5283  * @cmd_details: pointer to command details structure or NULL
5284  **/
5285 enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
5286 			u16 seid,
5287 			struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
5288 			struct i40e_asq_cmd_details *cmd_details)
5289 {
5290 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5291 				    i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
5292 				    cmd_details);
5293 }
5294 
5295 /**
5296  * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
5297  * @hw: pointer to the hw struct
5298  * @seid: VSI seid
5299  * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
5300  * @cmd_details: pointer to command details structure or NULL
5301  **/
5302 enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
5303 			u16 seid,
5304 			struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
5305 			struct i40e_asq_cmd_details *cmd_details)
5306 {
5307 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5308 				    i40e_aqc_opc_configure_vsi_tc_bw,
5309 				    cmd_details);
5310 }
5311 
5312 /**
5313  * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
5314  * @hw: pointer to the hw struct
5315  * @seid: seid of the switching component
5316  * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5317  * @cmd_details: pointer to command details structure or NULL
5318  **/
5319 enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
5320 	struct i40e_hw *hw, u16 seid,
5321 	struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
5322 	struct i40e_asq_cmd_details *cmd_details)
5323 {
5324 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5325 			    i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
5326 			    cmd_details);
5327 }
5328 
5329 /**
5330  * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
5331  * @hw: pointer to the hw struct
5332  * @seid: seid of the VSI
5333  * @bw_data: Buffer to hold VSI BW configuration
5334  * @cmd_details: pointer to command details structure or NULL
5335  **/
5336 enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
5337 			u16 seid,
5338 			struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
5339 			struct i40e_asq_cmd_details *cmd_details)
5340 {
5341 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5342 				    i40e_aqc_opc_query_vsi_bw_config,
5343 				    cmd_details);
5344 }
5345 
5346 /**
5347  * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
5348  * @hw: pointer to the hw struct
5349  * @seid: seid of the VSI
5350  * @bw_data: Buffer to hold VSI BW configuration per TC
5351  * @cmd_details: pointer to command details structure or NULL
5352  **/
5353 enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
5354 			u16 seid,
5355 			struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
5356 			struct i40e_asq_cmd_details *cmd_details)
5357 {
5358 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5359 				    i40e_aqc_opc_query_vsi_ets_sla_config,
5360 				    cmd_details);
5361 }
5362 
5363 /**
5364  * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
5365  * @hw: pointer to the hw struct
5366  * @seid: seid of the switching component
5367  * @bw_data: Buffer to hold switching component's per TC BW config
5368  * @cmd_details: pointer to command details structure or NULL
5369  **/
5370 enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
5371 		u16 seid,
5372 		struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
5373 		struct i40e_asq_cmd_details *cmd_details)
5374 {
5375 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5376 				   i40e_aqc_opc_query_switching_comp_ets_config,
5377 				   cmd_details);
5378 }
5379 
5380 /**
5381  * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
5382  * @hw: pointer to the hw struct
5383  * @seid: seid of the VSI or switching component connected to Physical Port
5384  * @bw_data: Buffer to hold current ETS configuration for the Physical Port
5385  * @cmd_details: pointer to command details structure or NULL
5386  **/
5387 enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
5388 			u16 seid,
5389 			struct i40e_aqc_query_port_ets_config_resp *bw_data,
5390 			struct i40e_asq_cmd_details *cmd_details)
5391 {
5392 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5393 				    i40e_aqc_opc_query_port_ets_config,
5394 				    cmd_details);
5395 }
5396 
5397 /**
5398  * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
5399  * @hw: pointer to the hw struct
5400  * @seid: seid of the switching component
5401  * @bw_data: Buffer to hold switching component's BW configuration
5402  * @cmd_details: pointer to command details structure or NULL
5403  **/
5404 enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
5405 		u16 seid,
5406 		struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
5407 		struct i40e_asq_cmd_details *cmd_details)
5408 {
5409 	return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5410 				    i40e_aqc_opc_query_switching_comp_bw_config,
5411 				    cmd_details);
5412 }
5413 
5414 /**
5415  * i40e_validate_filter_settings
5416  * @hw: pointer to the hardware structure
5417  * @settings: Filter control settings
5418  *
5419  * Check and validate the filter control settings passed.
5420  * The function checks for the valid filter/context sizes being
5421  * passed for FCoE and PE.
5422  *
5423  * Returns I40E_SUCCESS if the values passed are valid and within
5424  * range else returns an error.
5425  **/
5426 static enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
5427 				struct i40e_filter_control_settings *settings)
5428 {
5429 	u32 fcoe_cntx_size, fcoe_filt_size;
5430 	u32 fcoe_fmax;
5431 
5432 	u32 val;
5433 
5434 	/* Validate FCoE settings passed */
5435 	switch (settings->fcoe_filt_num) {
5436 	case I40E_HASH_FILTER_SIZE_1K:
5437 	case I40E_HASH_FILTER_SIZE_2K:
5438 	case I40E_HASH_FILTER_SIZE_4K:
5439 	case I40E_HASH_FILTER_SIZE_8K:
5440 	case I40E_HASH_FILTER_SIZE_16K:
5441 	case I40E_HASH_FILTER_SIZE_32K:
5442 		fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5443 		fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
5444 		break;
5445 	default:
5446 		return I40E_ERR_PARAM;
5447 	}
5448 
5449 	switch (settings->fcoe_cntx_num) {
5450 	case I40E_DMA_CNTX_SIZE_512:
5451 	case I40E_DMA_CNTX_SIZE_1K:
5452 	case I40E_DMA_CNTX_SIZE_2K:
5453 	case I40E_DMA_CNTX_SIZE_4K:
5454 		fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5455 		fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
5456 		break;
5457 	default:
5458 		return I40E_ERR_PARAM;
5459 	}
5460 
5461 	/* Validate PE settings passed */
5462 	switch (settings->pe_filt_num) {
5463 	case I40E_HASH_FILTER_SIZE_1K:
5464 	case I40E_HASH_FILTER_SIZE_2K:
5465 	case I40E_HASH_FILTER_SIZE_4K:
5466 	case I40E_HASH_FILTER_SIZE_8K:
5467 	case I40E_HASH_FILTER_SIZE_16K:
5468 	case I40E_HASH_FILTER_SIZE_32K:
5469 	case I40E_HASH_FILTER_SIZE_64K:
5470 	case I40E_HASH_FILTER_SIZE_128K:
5471 	case I40E_HASH_FILTER_SIZE_256K:
5472 	case I40E_HASH_FILTER_SIZE_512K:
5473 	case I40E_HASH_FILTER_SIZE_1M:
5474 		break;
5475 	default:
5476 		return I40E_ERR_PARAM;
5477 	}
5478 
5479 	switch (settings->pe_cntx_num) {
5480 	case I40E_DMA_CNTX_SIZE_512:
5481 	case I40E_DMA_CNTX_SIZE_1K:
5482 	case I40E_DMA_CNTX_SIZE_2K:
5483 	case I40E_DMA_CNTX_SIZE_4K:
5484 	case I40E_DMA_CNTX_SIZE_8K:
5485 	case I40E_DMA_CNTX_SIZE_16K:
5486 	case I40E_DMA_CNTX_SIZE_32K:
5487 	case I40E_DMA_CNTX_SIZE_64K:
5488 	case I40E_DMA_CNTX_SIZE_128K:
5489 	case I40E_DMA_CNTX_SIZE_256K:
5490 		break;
5491 	default:
5492 		return I40E_ERR_PARAM;
5493 	}
5494 
5495 	/* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
5496 	val = rd32(hw, I40E_GLHMC_FCOEFMAX);
5497 	fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
5498 		     >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
5499 	if (fcoe_filt_size + fcoe_cntx_size >  fcoe_fmax)
5500 		return I40E_ERR_INVALID_SIZE;
5501 
5502 	return I40E_SUCCESS;
5503 }
5504 
5505 /**
5506  * i40e_set_filter_control
5507  * @hw: pointer to the hardware structure
5508  * @settings: Filter control settings
5509  *
5510  * Set the Queue Filters for PE/FCoE and enable filters required
5511  * for a single PF. It is expected that these settings are programmed
5512  * at the driver initialization time.
5513  **/
5514 enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
5515 				struct i40e_filter_control_settings *settings)
5516 {
5517 	enum i40e_status_code ret = I40E_SUCCESS;
5518 	u32 hash_lut_size = 0;
5519 	u32 val;
5520 
5521 	if (!settings)
5522 		return I40E_ERR_PARAM;
5523 
5524 	/* Validate the input settings */
5525 	ret = i40e_validate_filter_settings(hw, settings);
5526 	if (ret)
5527 		return ret;
5528 
5529 	/* Read the PF Queue Filter control register */
5530 	val = i40e_read_rx_ctl(hw, I40E_PFQF_CTL_0);
5531 
5532 	/* Program required PE hash buckets for the PF */
5533 	val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
5534 	val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
5535 		I40E_PFQF_CTL_0_PEHSIZE_MASK;
5536 	/* Program required PE contexts for the PF */
5537 	val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
5538 	val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
5539 		I40E_PFQF_CTL_0_PEDSIZE_MASK;
5540 
5541 	/* Program required FCoE hash buckets for the PF */
5542 	val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5543 	val |= ((u32)settings->fcoe_filt_num <<
5544 			I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
5545 		I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5546 	/* Program required FCoE DDP contexts for the PF */
5547 	val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5548 	val |= ((u32)settings->fcoe_cntx_num <<
5549 			I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
5550 		I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5551 
5552 	/* Program Hash LUT size for the PF */
5553 	val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5554 	if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
5555 		hash_lut_size = 1;
5556 	val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
5557 		I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5558 
5559 	/* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
5560 	if (settings->enable_fdir)
5561 		val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
5562 	if (settings->enable_ethtype)
5563 		val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
5564 	if (settings->enable_macvlan)
5565 		val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
5566 
5567 	i40e_write_rx_ctl(hw, I40E_PFQF_CTL_0, val);
5568 
5569 	return I40E_SUCCESS;
5570 }
5571 
5572 /**
5573  * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
5574  * @hw: pointer to the hw struct
5575  * @mac_addr: MAC address to use in the filter
5576  * @ethtype: Ethertype to use in the filter
5577  * @flags: Flags that needs to be applied to the filter
5578  * @vsi_seid: seid of the control VSI
5579  * @queue: VSI queue number to send the packet to
5580  * @is_add: Add control packet filter if True else remove
5581  * @stats: Structure to hold information on control filter counts
5582  * @cmd_details: pointer to command details structure or NULL
5583  *
5584  * This command will Add or Remove control packet filter for a control VSI.
5585  * In return it will update the total number of perfect filter count in
5586  * the stats member.
5587  **/
5588 enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
5589 				u8 *mac_addr, u16 ethtype, u16 flags,
5590 				u16 vsi_seid, u16 queue, bool is_add,
5591 				struct i40e_control_filter_stats *stats,
5592 				struct i40e_asq_cmd_details *cmd_details)
5593 {
5594 	struct i40e_aq_desc desc;
5595 	struct i40e_aqc_add_remove_control_packet_filter *cmd =
5596 		(struct i40e_aqc_add_remove_control_packet_filter *)
5597 		&desc.params.raw;
5598 	struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
5599 		(struct i40e_aqc_add_remove_control_packet_filter_completion *)
5600 		&desc.params.raw;
5601 	enum i40e_status_code status;
5602 
5603 	if (vsi_seid == 0)
5604 		return I40E_ERR_PARAM;
5605 
5606 	if (is_add) {
5607 		i40e_fill_default_direct_cmd_desc(&desc,
5608 				i40e_aqc_opc_add_control_packet_filter);
5609 		cmd->queue = CPU_TO_LE16(queue);
5610 	} else {
5611 		i40e_fill_default_direct_cmd_desc(&desc,
5612 				i40e_aqc_opc_remove_control_packet_filter);
5613 	}
5614 
5615 	if (mac_addr)
5616 		i40e_memcpy(cmd->mac, mac_addr, ETH_ALEN,
5617 			    I40E_NONDMA_TO_NONDMA);
5618 
5619 	cmd->etype = CPU_TO_LE16(ethtype);
5620 	cmd->flags = CPU_TO_LE16(flags);
5621 	cmd->seid = CPU_TO_LE16(vsi_seid);
5622 
5623 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5624 
5625 	if (!status && stats) {
5626 		stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
5627 		stats->etype_used = LE16_TO_CPU(resp->etype_used);
5628 		stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
5629 		stats->etype_free = LE16_TO_CPU(resp->etype_free);
5630 	}
5631 
5632 	return status;
5633 }
5634 
5635 /**
5636  * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
5637  * @hw: pointer to the hw struct
5638  * @seid: VSI seid to add ethertype filter from
5639  **/
5640 void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
5641 						    u16 seid)
5642 {
5643 #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
5644 	u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
5645 		   I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
5646 		   I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
5647 	u16 ethtype = I40E_FLOW_CONTROL_ETHTYPE;
5648 	enum i40e_status_code status;
5649 
5650 	status = i40e_aq_add_rem_control_packet_filter(hw, NULL, ethtype, flag,
5651 						       seid, 0, TRUE, NULL,
5652 						       NULL);
5653 	if (status)
5654 		DEBUGOUT("Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
5655 }
5656 
5657 /**
5658  * i40e_fix_up_geneve_vni - adjust Geneve VNI for HW issue
5659  * @filters: list of cloud filters
5660  * @filter_count: length of list
5661  *
5662  * There's an issue in the device where the Geneve VNI layout needs
5663  * to be shifted 1 byte over from the VxLAN VNI
5664  **/
5665 static void i40e_fix_up_geneve_vni(
5666 	struct i40e_aqc_cloud_filters_element_data *filters,
5667 	u8 filter_count)
5668 {
5669 	struct i40e_aqc_cloud_filters_element_data *f = filters;
5670 	int i;
5671 
5672 	for (i = 0; i < filter_count; i++) {
5673 		u16 tnl_type;
5674 		u32 ti;
5675 
5676 		tnl_type = (LE16_TO_CPU(f[i].flags) &
5677 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5678 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5679 		if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5680 			ti = LE32_TO_CPU(f[i].tenant_id);
5681 			f[i].tenant_id = CPU_TO_LE32(ti << 8);
5682 		}
5683 	}
5684 }
5685 
5686 /**
5687  * i40e_aq_add_cloud_filters
5688  * @hw: pointer to the hardware structure
5689  * @seid: VSI seid to add cloud filters from
5690  * @filters: Buffer which contains the filters to be added
5691  * @filter_count: number of filters contained in the buffer
5692  *
5693  * Set the cloud filters for a given VSI.  The contents of the
5694  * i40e_aqc_cloud_filters_element_data are filled
5695  * in by the caller of the function.
5696  *
5697  **/
5698 enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
5699 	u16 seid,
5700 	struct i40e_aqc_cloud_filters_element_data *filters,
5701 	u8 filter_count)
5702 {
5703 	struct i40e_aq_desc desc;
5704 	struct i40e_aqc_add_remove_cloud_filters *cmd =
5705 	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5706 	enum i40e_status_code status;
5707 	u16 buff_len;
5708 
5709 	i40e_fill_default_direct_cmd_desc(&desc,
5710 					  i40e_aqc_opc_add_cloud_filters);
5711 
5712 	buff_len = filter_count * sizeof(*filters);
5713 	desc.datalen = CPU_TO_LE16(buff_len);
5714 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5715 	cmd->num_filters = filter_count;
5716 	cmd->seid = CPU_TO_LE16(seid);
5717 
5718 	i40e_fix_up_geneve_vni(filters, filter_count);
5719 
5720 	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5721 
5722 	return status;
5723 }
5724 
5725 /**
5726  * i40e_aq_add_cloud_filters_bb
5727  * @hw: pointer to the hardware structure
5728  * @seid: VSI seid to add cloud filters from
5729  * @filters: Buffer which contains the filters in big buffer to be added
5730  * @filter_count: number of filters contained in the buffer
5731  *
5732  * Set the cloud filters for a given VSI.  The contents of the
5733  * i40e_aqc_cloud_filters_element_bb are filled in by the caller of the
5734  * the function.
5735  *
5736  **/
5737 enum i40e_status_code
5738 i40e_aq_add_cloud_filters_bb(struct i40e_hw *hw, u16 seid,
5739 			     struct i40e_aqc_cloud_filters_element_bb *filters,
5740 			     u8 filter_count)
5741 {
5742 	struct i40e_aq_desc desc;
5743 	struct i40e_aqc_add_remove_cloud_filters *cmd =
5744 	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5745 	enum i40e_status_code status;
5746 	u16 buff_len;
5747 	int i;
5748 
5749 	i40e_fill_default_direct_cmd_desc(&desc,
5750 					  i40e_aqc_opc_add_cloud_filters);
5751 
5752 	buff_len = filter_count * sizeof(*filters);
5753 	desc.datalen = CPU_TO_LE16(buff_len);
5754 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5755 	cmd->num_filters = filter_count;
5756 	cmd->seid = CPU_TO_LE16(seid);
5757 	cmd->big_buffer_flag = I40E_AQC_ADD_CLOUD_CMD_BB;
5758 
5759 	for (i = 0; i < filter_count; i++) {
5760 		u16 tnl_type;
5761 		u32 ti;
5762 
5763 		tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5764 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5765 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5766 
5767 		/* Due to hardware eccentricities, the VNI for Geneve is shifted
5768 		 * one more byte further than normally used for Tenant ID in
5769 		 * other tunnel types.
5770 		 */
5771 		if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5772 			ti = LE32_TO_CPU(filters[i].element.tenant_id);
5773 			filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5774 		}
5775 	}
5776 
5777 	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5778 
5779 	return status;
5780 }
5781 
5782 /**
5783  * i40e_aq_rem_cloud_filters
5784  * @hw: pointer to the hardware structure
5785  * @seid: VSI seid to remove cloud filters from
5786  * @filters: Buffer which contains the filters to be removed
5787  * @filter_count: number of filters contained in the buffer
5788  *
5789  * Remove the cloud filters for a given VSI.  The contents of the
5790  * i40e_aqc_cloud_filters_element_data are filled in by the caller
5791  * of the function.
5792  *
5793  **/
5794 enum i40e_status_code
5795 i40e_aq_rem_cloud_filters(struct i40e_hw *hw, u16 seid,
5796 			  struct i40e_aqc_cloud_filters_element_data *filters,
5797 			  u8 filter_count)
5798 {
5799 	struct i40e_aq_desc desc;
5800 	struct i40e_aqc_add_remove_cloud_filters *cmd =
5801 	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5802 	enum i40e_status_code status;
5803 	u16 buff_len;
5804 
5805 	i40e_fill_default_direct_cmd_desc(&desc,
5806 					  i40e_aqc_opc_remove_cloud_filters);
5807 
5808 	buff_len = filter_count * sizeof(*filters);
5809 	desc.datalen = CPU_TO_LE16(buff_len);
5810 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5811 	cmd->num_filters = filter_count;
5812 	cmd->seid = CPU_TO_LE16(seid);
5813 
5814 	i40e_fix_up_geneve_vni(filters, filter_count);
5815 
5816 	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5817 
5818 	return status;
5819 }
5820 
5821 /**
5822  * i40e_aq_rem_cloud_filters_bb
5823  * @hw: pointer to the hardware structure
5824  * @seid: VSI seid to remove cloud filters from
5825  * @filters: Buffer which contains the filters in big buffer to be removed
5826  * @filter_count: number of filters contained in the buffer
5827  *
5828  * Remove the big buffer cloud filters for a given VSI.  The contents of the
5829  * i40e_aqc_cloud_filters_element_bb are filled in by the caller of the
5830  * function.
5831  *
5832  **/
5833 enum i40e_status_code
5834 i40e_aq_rem_cloud_filters_bb(struct i40e_hw *hw, u16 seid,
5835 			     struct i40e_aqc_cloud_filters_element_bb *filters,
5836 			     u8 filter_count)
5837 {
5838 	struct i40e_aq_desc desc;
5839 	struct i40e_aqc_add_remove_cloud_filters *cmd =
5840 	(struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5841 	enum i40e_status_code status;
5842 	u16 buff_len;
5843 	int i;
5844 
5845 	i40e_fill_default_direct_cmd_desc(&desc,
5846 					  i40e_aqc_opc_remove_cloud_filters);
5847 
5848 	buff_len = filter_count * sizeof(*filters);
5849 	desc.datalen = CPU_TO_LE16(buff_len);
5850 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5851 	cmd->num_filters = filter_count;
5852 	cmd->seid = CPU_TO_LE16(seid);
5853 	cmd->big_buffer_flag = I40E_AQC_ADD_CLOUD_CMD_BB;
5854 
5855 	for (i = 0; i < filter_count; i++) {
5856 		u16 tnl_type;
5857 		u32 ti;
5858 
5859 		tnl_type = (LE16_TO_CPU(filters[i].element.flags) &
5860 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5861 			   I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5862 
5863 		/* Due to hardware eccentricities, the VNI for Geneve is shifted
5864 		 * one more byte further than normally used for Tenant ID in
5865 		 * other tunnel types.
5866 		 */
5867 		if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5868 			ti = LE32_TO_CPU(filters[i].element.tenant_id);
5869 			filters[i].element.tenant_id = CPU_TO_LE32(ti << 8);
5870 		}
5871 	}
5872 
5873 	status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5874 
5875 	return status;
5876 }
5877 
5878 /**
5879  * i40e_aq_replace_cloud_filters - Replace cloud filter command
5880  * @hw: pointer to the hw struct
5881  * @filters: pointer to the i40e_aqc_replace_cloud_filter_cmd struct
5882  * @cmd_buf: pointer to the i40e_aqc_replace_cloud_filter_cmd_buf struct
5883  *
5884  **/
5885 enum
5886 i40e_status_code i40e_aq_replace_cloud_filters(struct i40e_hw *hw,
5887 	struct i40e_aqc_replace_cloud_filters_cmd *filters,
5888 	struct i40e_aqc_replace_cloud_filters_cmd_buf *cmd_buf)
5889 {
5890 	struct i40e_aq_desc desc;
5891 	struct i40e_aqc_replace_cloud_filters_cmd *cmd =
5892 		(struct i40e_aqc_replace_cloud_filters_cmd *)&desc.params.raw;
5893 	enum i40e_status_code status = I40E_SUCCESS;
5894 	int i = 0;
5895 
5896 	/* X722 doesn't support this command */
5897 	if (hw->mac.type == I40E_MAC_X722)
5898 		return I40E_ERR_DEVICE_NOT_SUPPORTED;
5899 
5900 	/* need FW version greater than 6.00 */
5901 	if (hw->aq.fw_maj_ver < 6)
5902 		return I40E_NOT_SUPPORTED;
5903 
5904 	i40e_fill_default_direct_cmd_desc(&desc,
5905 					  i40e_aqc_opc_replace_cloud_filters);
5906 
5907 	desc.datalen = CPU_TO_LE16(32);
5908 	desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5909 	cmd->old_filter_type = filters->old_filter_type;
5910 	cmd->new_filter_type = filters->new_filter_type;
5911 	cmd->valid_flags = filters->valid_flags;
5912 	cmd->tr_bit = filters->tr_bit;
5913 	cmd->tr_bit2 = filters->tr_bit2;
5914 
5915 	status = i40e_asq_send_command(hw, &desc, cmd_buf,
5916 		sizeof(struct i40e_aqc_replace_cloud_filters_cmd_buf),  NULL);
5917 
5918 	/* for get cloud filters command */
5919 	for (i = 0; i < 32; i += 4) {
5920 		cmd_buf->filters[i / 4].filter_type = cmd_buf->data[i];
5921 		cmd_buf->filters[i / 4].input[0] = cmd_buf->data[i + 1];
5922 		cmd_buf->filters[i / 4].input[1] = cmd_buf->data[i + 2];
5923 		cmd_buf->filters[i / 4].input[2] = cmd_buf->data[i + 3];
5924 	}
5925 
5926 	return status;
5927 }
5928 
5929 
5930 /**
5931  * i40e_aq_alternate_write
5932  * @hw: pointer to the hardware structure
5933  * @reg_addr0: address of first dword to be read
5934  * @reg_val0: value to be written under 'reg_addr0'
5935  * @reg_addr1: address of second dword to be read
5936  * @reg_val1: value to be written under 'reg_addr1'
5937  *
5938  * Write one or two dwords to alternate structure. Fields are indicated
5939  * by 'reg_addr0' and 'reg_addr1' register numbers.
5940  *
5941  **/
5942 enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
5943 				u32 reg_addr0, u32 reg_val0,
5944 				u32 reg_addr1, u32 reg_val1)
5945 {
5946 	struct i40e_aq_desc desc;
5947 	struct i40e_aqc_alternate_write *cmd_resp =
5948 		(struct i40e_aqc_alternate_write *)&desc.params.raw;
5949 	enum i40e_status_code status;
5950 
5951 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
5952 	cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5953 	cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5954 	cmd_resp->data0 = CPU_TO_LE32(reg_val0);
5955 	cmd_resp->data1 = CPU_TO_LE32(reg_val1);
5956 
5957 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5958 
5959 	return status;
5960 }
5961 
5962 /**
5963  * i40e_aq_alternate_write_indirect
5964  * @hw: pointer to the hardware structure
5965  * @addr: address of a first register to be modified
5966  * @dw_count: number of alternate structure fields to write
5967  * @buffer: pointer to the command buffer
5968  *
5969  * Write 'dw_count' dwords from 'buffer' to alternate structure
5970  * starting at 'addr'.
5971  *
5972  **/
5973 enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
5974 				u32 addr, u32 dw_count, void *buffer)
5975 {
5976 	struct i40e_aq_desc desc;
5977 	struct i40e_aqc_alternate_ind_write *cmd_resp =
5978 		(struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5979 	enum i40e_status_code status;
5980 
5981 	if (buffer == NULL)
5982 		return I40E_ERR_PARAM;
5983 
5984 	/* Indirect command */
5985 	i40e_fill_default_direct_cmd_desc(&desc,
5986 					 i40e_aqc_opc_alternate_write_indirect);
5987 
5988 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5989 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5990 	if (dw_count > (I40E_AQ_LARGE_BUF/4))
5991 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5992 
5993 	cmd_resp->address = CPU_TO_LE32(addr);
5994 	cmd_resp->length = CPU_TO_LE32(dw_count);
5995 
5996 	status = i40e_asq_send_command(hw, &desc, buffer,
5997 				       I40E_LO_DWORD(4*dw_count), NULL);
5998 
5999 	return status;
6000 }
6001 
6002 /**
6003  * i40e_aq_alternate_read
6004  * @hw: pointer to the hardware structure
6005  * @reg_addr0: address of first dword to be read
6006  * @reg_val0: pointer for data read from 'reg_addr0'
6007  * @reg_addr1: address of second dword to be read
6008  * @reg_val1: pointer for data read from 'reg_addr1'
6009  *
6010  * Read one or two dwords from alternate structure. Fields are indicated
6011  * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
6012  * is not passed then only register at 'reg_addr0' is read.
6013  *
6014  **/
6015 enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
6016 				u32 reg_addr0, u32 *reg_val0,
6017 				u32 reg_addr1, u32 *reg_val1)
6018 {
6019 	struct i40e_aq_desc desc;
6020 	struct i40e_aqc_alternate_write *cmd_resp =
6021 		(struct i40e_aqc_alternate_write *)&desc.params.raw;
6022 	enum i40e_status_code status;
6023 
6024 	if (reg_val0 == NULL)
6025 		return I40E_ERR_PARAM;
6026 
6027 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
6028 	cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
6029 	cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
6030 
6031 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6032 
6033 	if (status == I40E_SUCCESS) {
6034 		*reg_val0 = LE32_TO_CPU(cmd_resp->data0);
6035 
6036 		if (reg_val1 != NULL)
6037 			*reg_val1 = LE32_TO_CPU(cmd_resp->data1);
6038 	}
6039 
6040 	return status;
6041 }
6042 
6043 /**
6044  * i40e_aq_alternate_read_indirect
6045  * @hw: pointer to the hardware structure
6046  * @addr: address of the alternate structure field
6047  * @dw_count: number of alternate structure fields to read
6048  * @buffer: pointer to the command buffer
6049  *
6050  * Read 'dw_count' dwords from alternate structure starting at 'addr' and
6051  * place them in 'buffer'. The buffer should be allocated by caller.
6052  *
6053  **/
6054 enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
6055 				u32 addr, u32 dw_count, void *buffer)
6056 {
6057 	struct i40e_aq_desc desc;
6058 	struct i40e_aqc_alternate_ind_write *cmd_resp =
6059 		(struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
6060 	enum i40e_status_code status;
6061 
6062 	if (buffer == NULL)
6063 		return I40E_ERR_PARAM;
6064 
6065 	/* Indirect command */
6066 	i40e_fill_default_direct_cmd_desc(&desc,
6067 		i40e_aqc_opc_alternate_read_indirect);
6068 
6069 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
6070 	desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
6071 	if (dw_count > (I40E_AQ_LARGE_BUF/4))
6072 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6073 
6074 	cmd_resp->address = CPU_TO_LE32(addr);
6075 	cmd_resp->length = CPU_TO_LE32(dw_count);
6076 
6077 	status = i40e_asq_send_command(hw, &desc, buffer,
6078 				       I40E_LO_DWORD(4*dw_count), NULL);
6079 
6080 	return status;
6081 }
6082 
6083 /**
6084  *  i40e_aq_alternate_clear
6085  *  @hw: pointer to the HW structure.
6086  *
6087  *  Clear the alternate structures of the port from which the function
6088  *  is called.
6089  *
6090  **/
6091 enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
6092 {
6093 	struct i40e_aq_desc desc;
6094 	enum i40e_status_code status;
6095 
6096 	i40e_fill_default_direct_cmd_desc(&desc,
6097 					  i40e_aqc_opc_alternate_clear_port);
6098 
6099 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6100 
6101 	return status;
6102 }
6103 
6104 /**
6105  *  i40e_aq_alternate_write_done
6106  *  @hw: pointer to the HW structure.
6107  *  @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
6108  *  @reset_needed: indicates the SW should trigger GLOBAL reset
6109  *
6110  *  Indicates to the FW that alternate structures have been changed.
6111  *
6112  **/
6113 enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
6114 		u8 bios_mode, bool *reset_needed)
6115 {
6116 	struct i40e_aq_desc desc;
6117 	struct i40e_aqc_alternate_write_done *cmd =
6118 		(struct i40e_aqc_alternate_write_done *)&desc.params.raw;
6119 	enum i40e_status_code status;
6120 
6121 	if (reset_needed == NULL)
6122 		return I40E_ERR_PARAM;
6123 
6124 	i40e_fill_default_direct_cmd_desc(&desc,
6125 					  i40e_aqc_opc_alternate_write_done);
6126 
6127 	cmd->cmd_flags = CPU_TO_LE16(bios_mode);
6128 
6129 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6130 	if (!status && reset_needed)
6131 		*reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
6132 				 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
6133 
6134 	return status;
6135 }
6136 
6137 /**
6138  *  i40e_aq_set_oem_mode
6139  *  @hw: pointer to the HW structure.
6140  *  @oem_mode: the OEM mode to be used
6141  *
6142  *  Sets the device to a specific operating mode. Currently the only supported
6143  *  mode is no_clp, which causes FW to refrain from using Alternate RAM.
6144  *
6145  **/
6146 enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
6147 		u8 oem_mode)
6148 {
6149 	struct i40e_aq_desc desc;
6150 	struct i40e_aqc_alternate_write_done *cmd =
6151 		(struct i40e_aqc_alternate_write_done *)&desc.params.raw;
6152 	enum i40e_status_code status;
6153 
6154 	i40e_fill_default_direct_cmd_desc(&desc,
6155 					  i40e_aqc_opc_alternate_set_mode);
6156 
6157 	cmd->cmd_flags = CPU_TO_LE16(oem_mode);
6158 
6159 	status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
6160 
6161 	return status;
6162 }
6163 
6164 /**
6165  * i40e_aq_resume_port_tx
6166  * @hw: pointer to the hardware structure
6167  * @cmd_details: pointer to command details structure or NULL
6168  *
6169  * Resume port's Tx traffic
6170  **/
6171 enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
6172 				struct i40e_asq_cmd_details *cmd_details)
6173 {
6174 	struct i40e_aq_desc desc;
6175 	enum i40e_status_code status;
6176 
6177 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
6178 
6179 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6180 
6181 	return status;
6182 }
6183 
6184 /**
6185  * i40e_set_pci_config_data - store PCI bus info
6186  * @hw: pointer to hardware structure
6187  * @link_status: the link status word from PCI config space
6188  *
6189  * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
6190  **/
6191 void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
6192 {
6193 	hw->bus.type = i40e_bus_type_pci_express;
6194 
6195 	switch (link_status & I40E_PCI_LINK_WIDTH) {
6196 	case I40E_PCI_LINK_WIDTH_1:
6197 		hw->bus.width = i40e_bus_width_pcie_x1;
6198 		break;
6199 	case I40E_PCI_LINK_WIDTH_2:
6200 		hw->bus.width = i40e_bus_width_pcie_x2;
6201 		break;
6202 	case I40E_PCI_LINK_WIDTH_4:
6203 		hw->bus.width = i40e_bus_width_pcie_x4;
6204 		break;
6205 	case I40E_PCI_LINK_WIDTH_8:
6206 		hw->bus.width = i40e_bus_width_pcie_x8;
6207 		break;
6208 	default:
6209 		hw->bus.width = i40e_bus_width_unknown;
6210 		break;
6211 	}
6212 
6213 	switch (link_status & I40E_PCI_LINK_SPEED) {
6214 	case I40E_PCI_LINK_SPEED_2500:
6215 		hw->bus.speed = i40e_bus_speed_2500;
6216 		break;
6217 	case I40E_PCI_LINK_SPEED_5000:
6218 		hw->bus.speed = i40e_bus_speed_5000;
6219 		break;
6220 	case I40E_PCI_LINK_SPEED_8000:
6221 		hw->bus.speed = i40e_bus_speed_8000;
6222 		break;
6223 	default:
6224 		hw->bus.speed = i40e_bus_speed_unknown;
6225 		break;
6226 	}
6227 }
6228 
6229 /**
6230  * i40e_aq_debug_dump
6231  * @hw: pointer to the hardware structure
6232  * @cluster_id: specific cluster to dump
6233  * @table_id: table id within cluster
6234  * @start_index: index of line in the block to read
6235  * @buff_size: dump buffer size
6236  * @buff: dump buffer
6237  * @ret_buff_size: actual buffer size returned
6238  * @ret_next_table: next block to read
6239  * @ret_next_index: next index to read
6240  * @cmd_details: pointer to command details structure or NULL
6241  *
6242  * Dump internal FW/HW data for debug purposes.
6243  *
6244  **/
6245 enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
6246 				u8 table_id, u32 start_index, u16 buff_size,
6247 				void *buff, u16 *ret_buff_size,
6248 				u8 *ret_next_table, u32 *ret_next_index,
6249 				struct i40e_asq_cmd_details *cmd_details)
6250 {
6251 	struct i40e_aq_desc desc;
6252 	struct i40e_aqc_debug_dump_internals *cmd =
6253 		(struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
6254 	struct i40e_aqc_debug_dump_internals *resp =
6255 		(struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
6256 	enum i40e_status_code status;
6257 
6258 	if (buff_size == 0 || !buff)
6259 		return I40E_ERR_PARAM;
6260 
6261 	i40e_fill_default_direct_cmd_desc(&desc,
6262 					  i40e_aqc_opc_debug_dump_internals);
6263 	/* Indirect Command */
6264 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
6265 	if (buff_size > I40E_AQ_LARGE_BUF)
6266 		desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
6267 
6268 	cmd->cluster_id = cluster_id;
6269 	cmd->table_id = table_id;
6270 	cmd->idx = CPU_TO_LE32(start_index);
6271 
6272 	desc.datalen = CPU_TO_LE16(buff_size);
6273 
6274 	status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
6275 	if (!status) {
6276 		if (ret_buff_size != NULL)
6277 			*ret_buff_size = LE16_TO_CPU(desc.datalen);
6278 		if (ret_next_table != NULL)
6279 			*ret_next_table = resp->table_id;
6280 		if (ret_next_index != NULL)
6281 			*ret_next_index = LE32_TO_CPU(resp->idx);
6282 	}
6283 
6284 	return status;
6285 }
6286 
6287 
6288 /**
6289  * i40e_enable_eee
6290  * @hw: pointer to the hardware structure
6291  * @enable: state of Energy Efficient Ethernet mode to be set
6292  *
6293  * Enables or disables Energy Efficient Ethernet (EEE) mode
6294  * accordingly to @enable parameter.
6295  **/
6296 enum i40e_status_code i40e_enable_eee(struct i40e_hw *hw, bool enable)
6297 {
6298 	struct i40e_aq_get_phy_abilities_resp abilities;
6299 	struct i40e_aq_set_phy_config config;
6300 	enum i40e_status_code status;
6301 	__le16 eee_capability;
6302 
6303 	/* Get initial PHY capabilities */
6304 	status = i40e_aq_get_phy_capabilities(hw, FALSE, TRUE, &abilities,
6305 					      NULL);
6306 	if (status)
6307 		goto err;
6308 
6309 	/* Check whether NIC configuration is compatible with Energy Efficient
6310 	 * Ethernet (EEE) mode.
6311 	 */
6312 	if (abilities.eee_capability == 0) {
6313 		status = I40E_ERR_CONFIG;
6314 		goto err;
6315 	}
6316 
6317 	/* Cache initial EEE capability */
6318 	eee_capability = abilities.eee_capability;
6319 
6320 	/* Get current configuration */
6321 	status = i40e_aq_get_phy_capabilities(hw, FALSE, false, &abilities,
6322 					      NULL);
6323 	if (status)
6324 		goto err;
6325 
6326 	/* Cache current configuration */
6327 	config.phy_type = abilities.phy_type;
6328 	config.phy_type_ext = abilities.phy_type_ext;
6329 	config.link_speed = abilities.link_speed;
6330 	config.abilities = abilities.abilities |
6331 			   I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
6332 	config.eeer = abilities.eeer_val;
6333 	config.low_power_ctrl = abilities.d3_lpan;
6334 	config.fec_config = abilities.fec_cfg_curr_mod_ext_info &
6335 			    I40E_AQ_PHY_FEC_CONFIG_MASK;
6336 
6337 	/* Set desired EEE state */
6338 	if (enable) {
6339 		config.eee_capability = eee_capability;
6340 		config.eeer |= I40E_PRTPM_EEER_TX_LPI_EN_MASK;
6341 	} else {
6342 		config.eee_capability = 0;
6343 		config.eeer &= ~I40E_PRTPM_EEER_TX_LPI_EN_MASK;
6344 	}
6345 
6346 	/* Save modified config */
6347 	status = i40e_aq_set_phy_config(hw, &config, NULL);
6348 err:
6349 	return status;
6350 }
6351 
6352 /**
6353  * i40e_read_bw_from_alt_ram
6354  * @hw: pointer to the hardware structure
6355  * @max_bw: pointer for max_bw read
6356  * @min_bw: pointer for min_bw read
6357  * @min_valid: pointer for bool that is TRUE if min_bw is a valid value
6358  * @max_valid: pointer for bool that is TRUE if max_bw is a valid value
6359  *
6360  * Read bw from the alternate ram for the given pf
6361  **/
6362 enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
6363 					u32 *max_bw, u32 *min_bw,
6364 					bool *min_valid, bool *max_valid)
6365 {
6366 	enum i40e_status_code status;
6367 	u32 max_bw_addr, min_bw_addr;
6368 
6369 	/* Calculate the address of the min/max bw registers */
6370 	max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
6371 		      I40E_ALT_STRUCT_MAX_BW_OFFSET +
6372 		      (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
6373 	min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
6374 		      I40E_ALT_STRUCT_MIN_BW_OFFSET +
6375 		      (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
6376 
6377 	/* Read the bandwidths from alt ram */
6378 	status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
6379 					min_bw_addr, min_bw);
6380 
6381 	if (*min_bw & I40E_ALT_BW_VALID_MASK)
6382 		*min_valid = TRUE;
6383 	else
6384 		*min_valid = FALSE;
6385 
6386 	if (*max_bw & I40E_ALT_BW_VALID_MASK)
6387 		*max_valid = TRUE;
6388 	else
6389 		*max_valid = FALSE;
6390 
6391 	return status;
6392 }
6393 
6394 /**
6395  * i40e_aq_configure_partition_bw
6396  * @hw: pointer to the hardware structure
6397  * @bw_data: Buffer holding valid pfs and bw limits
6398  * @cmd_details: pointer to command details
6399  *
6400  * Configure partitions guaranteed/max bw
6401  **/
6402 enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
6403 			struct i40e_aqc_configure_partition_bw_data *bw_data,
6404 			struct i40e_asq_cmd_details *cmd_details)
6405 {
6406 	enum i40e_status_code status;
6407 	struct i40e_aq_desc desc;
6408 	u16 bwd_size = sizeof(*bw_data);
6409 
6410 	i40e_fill_default_direct_cmd_desc(&desc,
6411 				i40e_aqc_opc_configure_partition_bw);
6412 
6413 	/* Indirect command */
6414 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
6415 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
6416 
6417 	desc.datalen = CPU_TO_LE16(bwd_size);
6418 
6419 	status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
6420 
6421 	return status;
6422 }
6423 
6424 /**
6425  * i40e_read_phy_register_clause22
6426  * @hw: pointer to the HW structure
6427  * @reg: register address in the page
6428  * @phy_addr: PHY address on MDIO interface
6429  * @value: PHY register value
6430  *
6431  * Reads specified PHY register value
6432  **/
6433 enum i40e_status_code i40e_read_phy_register_clause22(struct i40e_hw *hw,
6434 					u16 reg, u8 phy_addr, u16 *value)
6435 {
6436 	enum i40e_status_code status = I40E_ERR_TIMEOUT;
6437 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
6438 	u32 command = 0;
6439 	u16 retry = 1000;
6440 
6441 	command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6442 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6443 		  (I40E_MDIO_CLAUSE22_OPCODE_READ_MASK) |
6444 		  (I40E_MDIO_CLAUSE22_STCODE_MASK) |
6445 		  (I40E_GLGEN_MSCA_MDICMD_MASK);
6446 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6447 	do {
6448 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6449 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6450 			status = I40E_SUCCESS;
6451 			break;
6452 		}
6453 		i40e_usec_delay(10);
6454 		retry--;
6455 	} while (retry);
6456 
6457 	if (status) {
6458 		i40e_debug(hw, I40E_DEBUG_PHY,
6459 			   "PHY: Can't write command to external PHY.\n");
6460 	} else {
6461 		command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6462 		*value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6463 			 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6464 	}
6465 
6466 	return status;
6467 }
6468 
6469 /**
6470  * i40e_write_phy_register_clause22
6471  * @hw: pointer to the HW structure
6472  * @reg: register address in the page
6473  * @phy_addr: PHY address on MDIO interface
6474  * @value: PHY register value
6475  *
6476  * Writes specified PHY register value
6477  **/
6478 enum i40e_status_code i40e_write_phy_register_clause22(struct i40e_hw *hw,
6479 					u16 reg, u8 phy_addr, u16 value)
6480 {
6481 	enum i40e_status_code status = I40E_ERR_TIMEOUT;
6482 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
6483 	u32 command  = 0;
6484 	u16 retry = 1000;
6485 
6486 	command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6487 	wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6488 
6489 	command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6490 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6491 		  (I40E_MDIO_CLAUSE22_OPCODE_WRITE_MASK) |
6492 		  (I40E_MDIO_CLAUSE22_STCODE_MASK) |
6493 		  (I40E_GLGEN_MSCA_MDICMD_MASK);
6494 
6495 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6496 	do {
6497 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6498 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6499 			status = I40E_SUCCESS;
6500 			break;
6501 		}
6502 		i40e_usec_delay(10);
6503 		retry--;
6504 	} while (retry);
6505 
6506 	return status;
6507 }
6508 
6509 /**
6510  * i40e_read_phy_register_clause45
6511  * @hw: pointer to the HW structure
6512  * @page: registers page number
6513  * @reg: register address in the page
6514  * @phy_addr: PHY address on MDIO interface
6515  * @value: PHY register value
6516  *
6517  * Reads specified PHY register value
6518  **/
6519 enum i40e_status_code i40e_read_phy_register_clause45(struct i40e_hw *hw,
6520 				u8 page, u16 reg, u8 phy_addr, u16 *value)
6521 {
6522 	enum i40e_status_code status = I40E_ERR_TIMEOUT;
6523 	u32 command  = 0;
6524 	u16 retry = 1000;
6525 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
6526 
6527 	command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6528 		  (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6529 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6530 		  (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6531 		  (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6532 		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
6533 		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6534 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6535 	do {
6536 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6537 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6538 			status = I40E_SUCCESS;
6539 			break;
6540 		}
6541 		i40e_usec_delay(10);
6542 		retry--;
6543 	} while (retry);
6544 
6545 	if (status) {
6546 		i40e_debug(hw, I40E_DEBUG_PHY,
6547 			   "PHY: Can't write command to external PHY.\n");
6548 		goto phy_read_end;
6549 	}
6550 
6551 	command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6552 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6553 		  (I40E_MDIO_CLAUSE45_OPCODE_READ_MASK) |
6554 		  (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6555 		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
6556 		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6557 	status = I40E_ERR_TIMEOUT;
6558 	retry = 1000;
6559 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6560 	do {
6561 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6562 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6563 			status = I40E_SUCCESS;
6564 			break;
6565 		}
6566 		i40e_usec_delay(10);
6567 		retry--;
6568 	} while (retry);
6569 
6570 	if (!status) {
6571 		command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6572 		*value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6573 			 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6574 	} else {
6575 		i40e_debug(hw, I40E_DEBUG_PHY,
6576 			   "PHY: Can't read register value from external PHY.\n");
6577 	}
6578 
6579 phy_read_end:
6580 	return status;
6581 }
6582 
6583 /**
6584  * i40e_write_phy_register_clause45
6585  * @hw: pointer to the HW structure
6586  * @page: registers page number
6587  * @reg: register address in the page
6588  * @phy_addr: PHY address on MDIO interface
6589  * @value: PHY register value
6590  *
6591  * Writes value to specified PHY register
6592  **/
6593 enum i40e_status_code i40e_write_phy_register_clause45(struct i40e_hw *hw,
6594 				u8 page, u16 reg, u8 phy_addr, u16 value)
6595 {
6596 	enum i40e_status_code status = I40E_ERR_TIMEOUT;
6597 	u32 command  = 0;
6598 	u16 retry = 1000;
6599 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
6600 
6601 	command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6602 		  (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6603 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6604 		  (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6605 		  (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6606 		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
6607 		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6608 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6609 	do {
6610 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6611 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6612 			status = I40E_SUCCESS;
6613 			break;
6614 		}
6615 		i40e_usec_delay(10);
6616 		retry--;
6617 	} while (retry);
6618 	if (status) {
6619 		i40e_debug(hw, I40E_DEBUG_PHY,
6620 			   "PHY: Can't write command to external PHY.\n");
6621 		goto phy_write_end;
6622 	}
6623 
6624 	command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6625 	wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6626 
6627 	command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6628 		  (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6629 		  (I40E_MDIO_CLAUSE45_OPCODE_WRITE_MASK) |
6630 		  (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6631 		  (I40E_GLGEN_MSCA_MDICMD_MASK) |
6632 		  (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6633 	status = I40E_ERR_TIMEOUT;
6634 	retry = 1000;
6635 	wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6636 	do {
6637 		command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6638 		if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6639 			status = I40E_SUCCESS;
6640 			break;
6641 		}
6642 		i40e_usec_delay(10);
6643 		retry--;
6644 	} while (retry);
6645 
6646 phy_write_end:
6647 	return status;
6648 }
6649 
6650 /**
6651  * i40e_write_phy_register
6652  * @hw: pointer to the HW structure
6653  * @page: registers page number
6654  * @reg: register address in the page
6655  * @phy_addr: PHY address on MDIO interface
6656  * @value: PHY register value
6657  *
6658  * Writes value to specified PHY register
6659  **/
6660 enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
6661 				u8 page, u16 reg, u8 phy_addr, u16 value)
6662 {
6663 	enum i40e_status_code status;
6664 
6665 	switch (hw->device_id) {
6666 	case I40E_DEV_ID_1G_BASE_T_X722:
6667 		status = i40e_write_phy_register_clause22(hw,
6668 			reg, phy_addr, value);
6669 		break;
6670 	case I40E_DEV_ID_10G_BASE_T:
6671 	case I40E_DEV_ID_10G_BASE_T4:
6672 	case I40E_DEV_ID_10G_BASE_T_BC:
6673 	case I40E_DEV_ID_5G_BASE_T_BC:
6674 	case I40E_DEV_ID_1G_BASE_T_BC:
6675 	case I40E_DEV_ID_10G_BASE_T_X722:
6676 	case I40E_DEV_ID_25G_B:
6677 	case I40E_DEV_ID_25G_SFP28:
6678 		status = i40e_write_phy_register_clause45(hw,
6679 			page, reg, phy_addr, value);
6680 		break;
6681 	default:
6682 		status = I40E_ERR_UNKNOWN_PHY;
6683 		break;
6684 	}
6685 
6686 	return status;
6687 }
6688 
6689 /**
6690  * i40e_read_phy_register
6691  * @hw: pointer to the HW structure
6692  * @page: registers page number
6693  * @reg: register address in the page
6694  * @phy_addr: PHY address on MDIO interface
6695  * @value: PHY register value
6696  *
6697  * Reads specified PHY register value
6698  **/
6699 enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
6700 				u8 page, u16 reg, u8 phy_addr, u16 *value)
6701 {
6702 	enum i40e_status_code status;
6703 
6704 	switch (hw->device_id) {
6705 	case I40E_DEV_ID_1G_BASE_T_X722:
6706 		status = i40e_read_phy_register_clause22(hw, reg, phy_addr,
6707 							 value);
6708 		break;
6709 	case I40E_DEV_ID_10G_BASE_T:
6710 	case I40E_DEV_ID_10G_BASE_T4:
6711 	case I40E_DEV_ID_10G_BASE_T_BC:
6712 	case I40E_DEV_ID_5G_BASE_T_BC:
6713 	case I40E_DEV_ID_1G_BASE_T_BC:
6714 	case I40E_DEV_ID_10G_BASE_T_X722:
6715 	case I40E_DEV_ID_25G_B:
6716 	case I40E_DEV_ID_25G_SFP28:
6717 		status = i40e_read_phy_register_clause45(hw, page, reg,
6718 							 phy_addr, value);
6719 		break;
6720 	default:
6721 		status = I40E_ERR_UNKNOWN_PHY;
6722 		break;
6723 	}
6724 
6725 	return status;
6726 }
6727 
6728 /**
6729  * i40e_get_phy_address
6730  * @hw: pointer to the HW structure
6731  * @dev_num: PHY port num that address we want
6732  *
6733  * Gets PHY address for current port
6734  **/
6735 u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num)
6736 {
6737 	u8 port_num = (u8)hw->func_caps.mdio_port_num;
6738 	u32 reg_val = rd32(hw, I40E_GLGEN_MDIO_I2C_SEL(port_num));
6739 
6740 	return (u8)(reg_val >> ((dev_num + 1) * 5)) & 0x1f;
6741 }
6742 
6743 /**
6744  * i40e_blink_phy_link_led
6745  * @hw: pointer to the HW structure
6746  * @time: time how long led will blinks in secs
6747  * @interval: gap between LED on and off in msecs
6748  *
6749  * Blinks PHY link LED
6750  **/
6751 enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
6752 					      u32 time, u32 interval)
6753 {
6754 	enum i40e_status_code status = I40E_SUCCESS;
6755 	u32 i;
6756 	u16 led_ctl = 0;
6757 	u16 gpio_led_port;
6758 	u16 led_reg;
6759 	u16 led_addr = I40E_PHY_LED_PROV_REG_1;
6760 	u8 phy_addr = 0;
6761 	u8 port_num;
6762 
6763 	i = rd32(hw, I40E_PFGEN_PORTNUM);
6764 	port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6765 	phy_addr = i40e_get_phy_address(hw, port_num);
6766 
6767 	for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6768 	     led_addr++) {
6769 		status = i40e_read_phy_register_clause45(hw,
6770 							 I40E_PHY_COM_REG_PAGE,
6771 							 led_addr, phy_addr,
6772 							 &led_reg);
6773 		if (status)
6774 			goto phy_blinking_end;
6775 		led_ctl = led_reg;
6776 		if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6777 			led_reg = 0;
6778 			status = i40e_write_phy_register_clause45(hw,
6779 							 I40E_PHY_COM_REG_PAGE,
6780 							 led_addr, phy_addr,
6781 							 led_reg);
6782 			if (status)
6783 				goto phy_blinking_end;
6784 			break;
6785 		}
6786 	}
6787 
6788 	if (time > 0 && interval > 0) {
6789 		for (i = 0; i < time * 1000; i += interval) {
6790 			status = i40e_read_phy_register_clause45(hw,
6791 						I40E_PHY_COM_REG_PAGE,
6792 						led_addr, phy_addr, &led_reg);
6793 			if (status)
6794 				goto restore_config;
6795 			if (led_reg & I40E_PHY_LED_MANUAL_ON)
6796 				led_reg = 0;
6797 			else
6798 				led_reg = I40E_PHY_LED_MANUAL_ON;
6799 			status = i40e_write_phy_register_clause45(hw,
6800 						I40E_PHY_COM_REG_PAGE,
6801 						led_addr, phy_addr, led_reg);
6802 			if (status)
6803 				goto restore_config;
6804 			i40e_msec_delay(interval);
6805 		}
6806 	}
6807 
6808 restore_config:
6809 	status = i40e_write_phy_register_clause45(hw,
6810 						  I40E_PHY_COM_REG_PAGE,
6811 						  led_addr, phy_addr, led_ctl);
6812 
6813 phy_blinking_end:
6814 	return status;
6815 }
6816 
6817 /**
6818  * i40e_led_get_reg - read LED register
6819  * @hw: pointer to the HW structure
6820  * @led_addr: LED register address
6821  * @reg_val: read register value
6822  **/
6823 enum i40e_status_code i40e_led_get_reg(struct i40e_hw *hw, u16 led_addr,
6824 				       u32 *reg_val)
6825 {
6826 	enum i40e_status_code status;
6827 	u8 phy_addr = 0;
6828 
6829 	*reg_val = 0;
6830 	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6831 		status = i40e_aq_get_phy_register(hw,
6832 						I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6833 						I40E_PHY_COM_REG_PAGE, TRUE,
6834 						I40E_PHY_LED_PROV_REG_1,
6835 						reg_val, NULL);
6836 	} else {
6837 		phy_addr = i40e_get_phy_address(hw, hw->port);
6838 		status = i40e_read_phy_register_clause45(hw,
6839 							 I40E_PHY_COM_REG_PAGE,
6840 							 led_addr, phy_addr,
6841 							 (u16 *)reg_val);
6842 	}
6843 	return status;
6844 }
6845 
6846 /**
6847  * i40e_led_set_reg - write LED register
6848  * @hw: pointer to the HW structure
6849  * @led_addr: LED register address
6850  * @reg_val: register value to write
6851  **/
6852 enum i40e_status_code i40e_led_set_reg(struct i40e_hw *hw, u16 led_addr,
6853 				       u32 reg_val)
6854 {
6855 	enum i40e_status_code status;
6856 	u8 phy_addr = 0;
6857 
6858 	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6859 		status = i40e_aq_set_phy_register(hw,
6860 						I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6861 						I40E_PHY_COM_REG_PAGE, TRUE,
6862 						I40E_PHY_LED_PROV_REG_1,
6863 						reg_val, NULL);
6864 	} else {
6865 		phy_addr = i40e_get_phy_address(hw, hw->port);
6866 		status = i40e_write_phy_register_clause45(hw,
6867 							  I40E_PHY_COM_REG_PAGE,
6868 							  led_addr, phy_addr,
6869 							  (u16)reg_val);
6870 	}
6871 
6872 	return status;
6873 }
6874 
6875 /**
6876  * i40e_led_get_phy - return current on/off mode
6877  * @hw: pointer to the hw struct
6878  * @led_addr: address of led register to use
6879  * @val: original value of register to use
6880  *
6881  **/
6882 enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
6883 				       u16 *val)
6884 {
6885 	enum i40e_status_code status = I40E_SUCCESS;
6886 	u16 gpio_led_port;
6887 	u32 reg_val_aq;
6888 	u16 temp_addr;
6889 	u8 phy_addr = 0;
6890 	u16 reg_val;
6891 
6892 	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
6893 		status = i40e_aq_get_phy_register(hw,
6894 						I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
6895 						I40E_PHY_COM_REG_PAGE, TRUE,
6896 						I40E_PHY_LED_PROV_REG_1,
6897 						&reg_val_aq, NULL);
6898 		if (status == I40E_SUCCESS)
6899 			*val = (u16)reg_val_aq;
6900 		return status;
6901 	}
6902 	temp_addr = I40E_PHY_LED_PROV_REG_1;
6903 	phy_addr = i40e_get_phy_address(hw, hw->port);
6904 	for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6905 	     temp_addr++) {
6906 		status = i40e_read_phy_register_clause45(hw,
6907 							 I40E_PHY_COM_REG_PAGE,
6908 							 temp_addr, phy_addr,
6909 							 &reg_val);
6910 		if (status)
6911 			return status;
6912 		*val = reg_val;
6913 		if (reg_val & I40E_PHY_LED_LINK_MODE_MASK) {
6914 			*led_addr = temp_addr;
6915 			break;
6916 		}
6917 	}
6918 	return status;
6919 }
6920 
6921 /**
6922  * i40e_led_set_phy
6923  * @hw: pointer to the HW structure
6924  * @on: TRUE or FALSE
6925  * @led_addr: address of led register to use
6926  * @mode: original val plus bit for set or ignore
6927  *
6928  * Set led's on or off when controlled by the PHY
6929  *
6930  **/
6931 enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
6932 				       u16 led_addr, u32 mode)
6933 {
6934 	enum i40e_status_code status = I40E_SUCCESS;
6935 	u32 led_ctl = 0;
6936 	u32 led_reg = 0;
6937 
6938 	status = i40e_led_get_reg(hw, led_addr, &led_reg);
6939 	if (status)
6940 		return status;
6941 	led_ctl = led_reg;
6942 	if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6943 		led_reg = 0;
6944 		status = i40e_led_set_reg(hw, led_addr, led_reg);
6945 		if (status)
6946 			return status;
6947 	}
6948 	status = i40e_led_get_reg(hw, led_addr, &led_reg);
6949 	if (status)
6950 		goto restore_config;
6951 	if (on)
6952 		led_reg = I40E_PHY_LED_MANUAL_ON;
6953 	else
6954 		led_reg = 0;
6955 	status = i40e_led_set_reg(hw, led_addr, led_reg);
6956 	if (status)
6957 		goto restore_config;
6958 	if (mode & I40E_PHY_LED_MODE_ORIG) {
6959 		led_ctl = (mode & I40E_PHY_LED_MODE_MASK);
6960 		status = i40e_led_set_reg(hw, led_addr, led_ctl);
6961 	}
6962 	return status;
6963 
6964 restore_config:
6965 	status = i40e_led_set_reg(hw, led_addr, led_ctl);
6966 	return status;
6967 }
6968 
6969 /**
6970  * i40e_get_phy_lpi_status - read LPI status from PHY or MAC register
6971  * @hw: pointer to the hw struct
6972  * @stat: pointer to structure with status of rx and tx lpi
6973  *
6974  * Read LPI state directly from external PHY register or from MAC
6975  * register, depending on device ID and current link speed.
6976  */
6977 enum i40e_status_code i40e_get_phy_lpi_status(struct i40e_hw *hw,
6978 					      struct i40e_hw_port_stats *stat)
6979 {
6980 	enum i40e_status_code ret = I40E_SUCCESS;
6981 	bool eee_mrvl_phy;
6982 	bool eee_bcm_phy;
6983 	u32 val;
6984 
6985 	stat->rx_lpi_status = 0;
6986 	stat->tx_lpi_status = 0;
6987 
6988 	eee_bcm_phy =
6989 		(hw->device_id == I40E_DEV_ID_10G_BASE_T_BC ||
6990 		 hw->device_id == I40E_DEV_ID_5G_BASE_T_BC) &&
6991 		(hw->phy.link_info.link_speed == I40E_LINK_SPEED_2_5GB ||
6992 		 hw->phy.link_info.link_speed == I40E_LINK_SPEED_5GB);
6993 	eee_mrvl_phy =
6994 		hw->device_id == I40E_DEV_ID_1G_BASE_T_X722;
6995 
6996 	if (eee_bcm_phy || eee_mrvl_phy) {
6997 		// read Clause 45 PCS Status 1 register
6998 		ret = i40e_aq_get_phy_register(hw,
6999 					       I40E_AQ_PHY_REG_ACCESS_EXTERNAL,
7000 					       I40E_BCM_PHY_PCS_STATUS1_PAGE,
7001 					       TRUE,
7002 					       I40E_BCM_PHY_PCS_STATUS1_REG,
7003 					       &val, NULL);
7004 
7005 		if (ret != I40E_SUCCESS)
7006 			return ret;
7007 
7008 		stat->rx_lpi_status = !!(val & I40E_BCM_PHY_PCS_STATUS1_RX_LPI);
7009 		stat->tx_lpi_status = !!(val & I40E_BCM_PHY_PCS_STATUS1_TX_LPI);
7010 
7011 		return ret;
7012 	}
7013 
7014 	val = rd32(hw, I40E_PRTPM_EEE_STAT);
7015 	stat->rx_lpi_status = (val & I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_MASK) >>
7016 			       I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT;
7017 	stat->tx_lpi_status = (val & I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK) >>
7018 			       I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT;
7019 
7020 	return ret;
7021 }
7022 
7023 /**
7024  * i40e_get_lpi_counters - read LPI counters from EEE statistics
7025  * @hw: pointer to the hw struct
7026  * @tx_counter: pointer to memory for TX LPI counter
7027  * @rx_counter: pointer to memory for RX LPI counter
7028  * @is_clear:   returns TRUE if counters are clear after read
7029  *
7030  * Read Low Power Idle (LPI) mode counters from Energy Efficient
7031  * Ethernet (EEE) statistics.
7032  **/
7033 enum i40e_status_code i40e_get_lpi_counters(struct i40e_hw *hw,
7034 					    u32 *tx_counter, u32 *rx_counter,
7035 					    bool *is_clear)
7036 {
7037 	/* only X710-T*L requires special handling of counters
7038 	 * for other devices we just read the MAC registers
7039 	 */
7040 	if ((hw->device_id == I40E_DEV_ID_10G_BASE_T_BC ||
7041 	     hw->device_id == I40E_DEV_ID_5G_BASE_T_BC) &&
7042 	     hw->phy.link_info.link_speed != I40E_LINK_SPEED_1GB) {
7043 		enum i40e_status_code retval;
7044 		u32 cmd_status;
7045 
7046 		*is_clear = FALSE;
7047 		retval = i40e_aq_run_phy_activity(hw,
7048 				I40E_AQ_RUN_PHY_ACT_ID_USR_DFND,
7049 				I40E_AQ_RUN_PHY_ACT_DNL_OPCODE_GET_EEE_STAT,
7050 				&cmd_status, tx_counter, rx_counter, NULL);
7051 
7052 		if (!retval && cmd_status != I40E_AQ_RUN_PHY_ACT_CMD_STAT_SUCC)
7053 			retval = I40E_ERR_ADMIN_QUEUE_ERROR;
7054 
7055 		return retval;
7056 	}
7057 
7058 	*is_clear = TRUE;
7059 	*tx_counter = rd32(hw, I40E_PRTPM_TLPIC);
7060 	*rx_counter = rd32(hw, I40E_PRTPM_RLPIC);
7061 
7062 	return I40E_SUCCESS;
7063 }
7064 
7065 /**
7066  * i40e_get_lpi_duration - read LPI time duration from EEE statistics
7067  * @hw: pointer to the hw struct
7068  * @stat: pointer to structure with status of rx and tx lpi
7069  * @tx_duration: pointer to memory for TX LPI time duration
7070  * @rx_duration: pointer to memory for RX LPI time duration
7071  *
7072  * Read Low Power Idle (LPI) mode time duration from Energy Efficient
7073  * Ethernet (EEE) statistics.
7074  */
7075 enum i40e_status_code i40e_get_lpi_duration(struct i40e_hw *hw,
7076 					    struct i40e_hw_port_stats *stat,
7077 					    u64 *tx_duration, u64 *rx_duration)
7078 {
7079 	u32 tx_time_dur, rx_time_dur;
7080 	enum i40e_status_code retval;
7081 	u32 cmd_status;
7082 
7083 	if (hw->device_id != I40E_DEV_ID_10G_BASE_T_BC &&
7084 	    hw->device_id != I40E_DEV_ID_5G_BASE_T_BC)
7085 		return I40E_ERR_NOT_IMPLEMENTED;
7086 
7087 	retval = i40e_aq_run_phy_activity
7088 		(hw, I40E_AQ_RUN_PHY_ACT_ID_USR_DFND,
7089 		I40E_AQ_RUN_PHY_ACT_DNL_OPCODE_GET_EEE_DUR,
7090 		&cmd_status, &tx_time_dur, &rx_time_dur, NULL);
7091 
7092 	if (retval)
7093 		return retval;
7094 	if ((cmd_status & I40E_AQ_RUN_PHY_ACT_CMD_STAT_MASK) !=
7095 	    I40E_AQ_RUN_PHY_ACT_CMD_STAT_SUCC)
7096 		return I40E_ERR_ADMIN_QUEUE_ERROR;
7097 
7098 	if (hw->phy.link_info.link_speed == I40E_LINK_SPEED_1GB &&
7099 	    !tx_time_dur && !rx_time_dur &&
7100 	    stat->tx_lpi_status && stat->rx_lpi_status) {
7101 		retval = i40e_aq_run_phy_activity
7102 			(hw, I40E_AQ_RUN_PHY_ACT_ID_USR_DFND,
7103 			I40E_AQ_RUN_PHY_ACT_DNL_OPCODE_GET_EEE_STAT_DUR,
7104 			&cmd_status,
7105 			&tx_time_dur, &rx_time_dur, NULL);
7106 
7107 		if (retval)
7108 			return retval;
7109 		if ((cmd_status & I40E_AQ_RUN_PHY_ACT_CMD_STAT_MASK) !=
7110 		    I40E_AQ_RUN_PHY_ACT_CMD_STAT_SUCC)
7111 			return I40E_ERR_ADMIN_QUEUE_ERROR;
7112 		tx_time_dur = 0;
7113 		rx_time_dur = 0;
7114 	}
7115 
7116 	*tx_duration = tx_time_dur;
7117 	*rx_duration = rx_time_dur;
7118 
7119 	return retval;
7120 }
7121 
7122 /**
7123  * i40e_lpi_stat_update - update LPI counters with values relative to offset
7124  * @hw: pointer to the hw struct
7125  * @offset_loaded: flag indicating need of writing current value to offset
7126  * @tx_offset: pointer to offset of TX LPI counter
7127  * @tx_stat: pointer to value of TX LPI counter
7128  * @rx_offset: pointer to offset of RX LPI counter
7129  * @rx_stat: pointer to value of RX LPI counter
7130  *
7131  * Update Low Power Idle (LPI) mode counters while having regard to passed
7132  * offsets.
7133  **/
7134 enum i40e_status_code i40e_lpi_stat_update(struct i40e_hw *hw,
7135 					   bool offset_loaded, u64 *tx_offset,
7136 					   u64 *tx_stat, u64 *rx_offset,
7137 					   u64 *rx_stat)
7138 {
7139 	enum i40e_status_code retval;
7140 	u32 tx_counter, rx_counter;
7141 	bool is_clear;
7142 
7143 	retval = i40e_get_lpi_counters(hw, &tx_counter, &rx_counter, &is_clear);
7144 	if (retval)
7145 		goto err;
7146 
7147 	if (is_clear) {
7148 		*tx_stat += tx_counter;
7149 		*rx_stat += rx_counter;
7150 	} else {
7151 		if (!offset_loaded) {
7152 			*tx_offset = tx_counter;
7153 			*rx_offset = rx_counter;
7154 		}
7155 
7156 		*tx_stat = (tx_counter >= *tx_offset) ?
7157 			(u32)(tx_counter - *tx_offset) :
7158 			(u32)((tx_counter + BIT_ULL(32)) - *tx_offset);
7159 		*rx_stat = (rx_counter >= *rx_offset) ?
7160 			(u32)(rx_counter - *rx_offset) :
7161 			(u32)((rx_counter + BIT_ULL(32)) - *rx_offset);
7162 	}
7163 err:
7164 	return retval;
7165 }
7166 
7167 /**
7168  * i40e_aq_rx_ctl_read_register - use FW to read from an Rx control register
7169  * @hw: pointer to the hw struct
7170  * @reg_addr: register address
7171  * @reg_val: ptr to register value
7172  * @cmd_details: pointer to command details structure or NULL
7173  *
7174  * Use the firmware to read the Rx control register,
7175  * especially useful if the Rx unit is under heavy pressure
7176  **/
7177 enum i40e_status_code i40e_aq_rx_ctl_read_register(struct i40e_hw *hw,
7178 				u32 reg_addr, u32 *reg_val,
7179 				struct i40e_asq_cmd_details *cmd_details)
7180 {
7181 	struct i40e_aq_desc desc;
7182 	struct i40e_aqc_rx_ctl_reg_read_write *cmd_resp =
7183 		(struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
7184 	enum i40e_status_code status;
7185 
7186 	if (reg_val == NULL)
7187 		return I40E_ERR_PARAM;
7188 
7189 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_read);
7190 
7191 	cmd_resp->address = CPU_TO_LE32(reg_addr);
7192 
7193 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7194 
7195 	if (status == I40E_SUCCESS)
7196 		*reg_val = LE32_TO_CPU(cmd_resp->value);
7197 
7198 	return status;
7199 }
7200 
7201 /**
7202  * i40e_read_rx_ctl - read from an Rx control register
7203  * @hw: pointer to the hw struct
7204  * @reg_addr: register address
7205  **/
7206 u32 i40e_read_rx_ctl(struct i40e_hw *hw, u32 reg_addr)
7207 {
7208 	enum i40e_status_code status = I40E_SUCCESS;
7209 	bool use_register;
7210 	int retry = 5;
7211 	u32 val = 0;
7212 
7213 	use_register = (((hw->aq.api_maj_ver == 1) &&
7214 			(hw->aq.api_min_ver < 5)) ||
7215 			(hw->mac.type == I40E_MAC_X722));
7216 	if (!use_register) {
7217 do_retry:
7218 		status = i40e_aq_rx_ctl_read_register(hw, reg_addr, &val, NULL);
7219 		if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
7220 			i40e_msec_delay(1);
7221 			retry--;
7222 			goto do_retry;
7223 		}
7224 	}
7225 
7226 	/* if the AQ access failed, try the old-fashioned way */
7227 	if (status || use_register)
7228 		val = rd32(hw, reg_addr);
7229 
7230 	return val;
7231 }
7232 
7233 /**
7234  * i40e_aq_rx_ctl_write_register
7235  * @hw: pointer to the hw struct
7236  * @reg_addr: register address
7237  * @reg_val: register value
7238  * @cmd_details: pointer to command details structure or NULL
7239  *
7240  * Use the firmware to write to an Rx control register,
7241  * especially useful if the Rx unit is under heavy pressure
7242  **/
7243 enum i40e_status_code i40e_aq_rx_ctl_write_register(struct i40e_hw *hw,
7244 				u32 reg_addr, u32 reg_val,
7245 				struct i40e_asq_cmd_details *cmd_details)
7246 {
7247 	struct i40e_aq_desc desc;
7248 	struct i40e_aqc_rx_ctl_reg_read_write *cmd =
7249 		(struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
7250 	enum i40e_status_code status;
7251 
7252 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_write);
7253 
7254 	cmd->address = CPU_TO_LE32(reg_addr);
7255 	cmd->value = CPU_TO_LE32(reg_val);
7256 
7257 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7258 
7259 	return status;
7260 }
7261 
7262 /**
7263  * i40e_write_rx_ctl - write to an Rx control register
7264  * @hw: pointer to the hw struct
7265  * @reg_addr: register address
7266  * @reg_val: register value
7267  **/
7268 void i40e_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val)
7269 {
7270 	enum i40e_status_code status = I40E_SUCCESS;
7271 	bool use_register;
7272 	int retry = 5;
7273 
7274 	use_register = (((hw->aq.api_maj_ver == 1) &&
7275 			(hw->aq.api_min_ver < 5)) ||
7276 			(hw->mac.type == I40E_MAC_X722));
7277 	if (!use_register) {
7278 do_retry:
7279 		status = i40e_aq_rx_ctl_write_register(hw, reg_addr,
7280 						       reg_val, NULL);
7281 		if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
7282 			i40e_msec_delay(1);
7283 			retry--;
7284 			goto do_retry;
7285 		}
7286 	}
7287 
7288 	/* if the AQ access failed, try the old-fashioned way */
7289 	if (status || use_register)
7290 		wr32(hw, reg_addr, reg_val);
7291 }
7292 
7293 /**
7294  * i40e_mdio_if_number_selection - MDIO I/F number selection
7295  * @hw: pointer to the hw struct
7296  * @set_mdio: use MDIO I/F number specified by mdio_num
7297  * @mdio_num: MDIO I/F number
7298  * @cmd: pointer to PHY Register command structure
7299  **/
7300 static void
7301 i40e_mdio_if_number_selection(struct i40e_hw *hw, bool set_mdio, u8 mdio_num,
7302 			      struct i40e_aqc_phy_register_access *cmd)
7303 {
7304 	if (set_mdio && cmd->phy_interface == I40E_AQ_PHY_REG_ACCESS_EXTERNAL) {
7305 		if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_EXTENDED)
7306 			cmd->cmd_flags |=
7307 				I40E_AQ_PHY_REG_ACCESS_SET_MDIO_IF_NUMBER |
7308 				((mdio_num <<
7309 				I40E_AQ_PHY_REG_ACCESS_MDIO_IF_NUMBER_SHIFT) &
7310 				I40E_AQ_PHY_REG_ACCESS_MDIO_IF_NUMBER_MASK);
7311 		else
7312 			i40e_debug(hw, I40E_DEBUG_PHY,
7313 				   "MDIO I/F number selection not supported by current FW version.\n");
7314 	}
7315 }
7316 
7317 /**
7318  * i40e_aq_set_phy_register_ext
7319  * @hw: pointer to the hw struct
7320  * @phy_select: select which phy should be accessed
7321  * @dev_addr: PHY device address
7322  * @page_change: enable auto page change
7323  * @set_mdio: use MDIO I/F number specified by mdio_num
7324  * @mdio_num: MDIO I/F number
7325  * @reg_addr: PHY register address
7326  * @reg_val: new register value
7327  * @cmd_details: pointer to command details structure or NULL
7328  *
7329  * Write the external PHY register.
7330  * NOTE: In common cases MDIO I/F number should not be changed, thats why you
7331  * may use simple wrapper i40e_aq_set_phy_register.
7332  **/
7333 enum i40e_status_code
7334 i40e_aq_set_phy_register_ext(struct i40e_hw *hw,
7335 			     u8 phy_select, u8 dev_addr, bool page_change,
7336 			     bool set_mdio, u8 mdio_num,
7337 			     u32 reg_addr, u32 reg_val,
7338 			     struct i40e_asq_cmd_details *cmd_details)
7339 {
7340 	struct i40e_aq_desc desc;
7341 	struct i40e_aqc_phy_register_access *cmd =
7342 		(struct i40e_aqc_phy_register_access *)&desc.params.raw;
7343 	enum i40e_status_code status;
7344 
7345 	i40e_fill_default_direct_cmd_desc(&desc,
7346 					  i40e_aqc_opc_set_phy_register);
7347 
7348 	cmd->phy_interface = phy_select;
7349 	cmd->dev_addres = dev_addr;
7350 	cmd->reg_address = CPU_TO_LE32(reg_addr);
7351 	cmd->reg_value = CPU_TO_LE32(reg_val);
7352 
7353 	if (!page_change)
7354 		cmd->cmd_flags = I40E_AQ_PHY_REG_ACCESS_DONT_CHANGE_QSFP_PAGE;
7355 
7356 	i40e_mdio_if_number_selection(hw, set_mdio, mdio_num, cmd);
7357 
7358 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7359 
7360 	return status;
7361 }
7362 
7363 /**
7364  * i40e_aq_get_phy_register_ext
7365  * @hw: pointer to the hw struct
7366  * @phy_select: select which phy should be accessed
7367  * @dev_addr: PHY device address
7368  * @page_change: enable auto page change
7369  * @set_mdio: use MDIO I/F number specified by mdio_num
7370  * @mdio_num: MDIO I/F number
7371  * @reg_addr: PHY register address
7372  * @reg_val: read register value
7373  * @cmd_details: pointer to command details structure or NULL
7374  *
7375  * Read the external PHY register.
7376  * NOTE: In common cases MDIO I/F number should not be changed, thats why you
7377  * may use simple wrapper i40e_aq_get_phy_register.
7378  **/
7379 enum i40e_status_code
7380 i40e_aq_get_phy_register_ext(struct i40e_hw *hw,
7381 			     u8 phy_select, u8 dev_addr, bool page_change,
7382 			     bool set_mdio, u8 mdio_num,
7383 			     u32 reg_addr, u32 *reg_val,
7384 			     struct i40e_asq_cmd_details *cmd_details)
7385 {
7386 	struct i40e_aq_desc desc;
7387 	struct i40e_aqc_phy_register_access *cmd =
7388 		(struct i40e_aqc_phy_register_access *)&desc.params.raw;
7389 	enum i40e_status_code status;
7390 
7391 	i40e_fill_default_direct_cmd_desc(&desc,
7392 					  i40e_aqc_opc_get_phy_register);
7393 
7394 	cmd->phy_interface = phy_select;
7395 	cmd->dev_addres = dev_addr;
7396 	cmd->reg_address = CPU_TO_LE32(reg_addr);
7397 
7398 	if (!page_change)
7399 		cmd->cmd_flags = I40E_AQ_PHY_REG_ACCESS_DONT_CHANGE_QSFP_PAGE;
7400 
7401 	i40e_mdio_if_number_selection(hw, set_mdio, mdio_num, cmd);
7402 
7403 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7404 	if (!status)
7405 		*reg_val = LE32_TO_CPU(cmd->reg_value);
7406 
7407 	return status;
7408 }
7409 
7410 /**
7411  * i40e_aq_run_phy_activity
7412  * @hw: pointer to the hw struct
7413  * @activity_id: ID of DNL activity to run
7414  * @dnl_opcode: opcode passed to DNL script
7415  * @cmd_status: pointer to memory to write return value of DNL script
7416  * @data0: pointer to memory for first 4 bytes of data returned by DNL script
7417  * @data1: pointer to memory for last 4 bytes of data returned by DNL script
7418  * @cmd_details: pointer to command details structure or NULL
7419  *
7420  * Run DNL admin command.
7421  **/
7422 enum i40e_status_code
7423 i40e_aq_run_phy_activity(struct i40e_hw *hw, u16 activity_id, u32 dnl_opcode,
7424 			 u32 *cmd_status, u32 *data0, u32 *data1,
7425 			 struct i40e_asq_cmd_details *cmd_details)
7426 {
7427 	struct i40e_aqc_run_phy_activity *cmd;
7428 	enum i40e_status_code retval;
7429 	struct i40e_aq_desc desc;
7430 
7431 	cmd = (struct i40e_aqc_run_phy_activity *)&desc.params.raw;
7432 
7433 	if (!cmd_status || !data0 || !data1) {
7434 		retval = I40E_ERR_PARAM;
7435 		goto err;
7436 	}
7437 
7438 	i40e_fill_default_direct_cmd_desc(&desc,
7439 					  i40e_aqc_opc_run_phy_activity);
7440 
7441 	cmd->activity_id = CPU_TO_LE16(activity_id);
7442 	cmd->params.cmd.dnl_opcode = CPU_TO_LE32(dnl_opcode);
7443 
7444 	retval = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7445 	if (retval)
7446 		goto err;
7447 
7448 	*cmd_status = LE32_TO_CPU(cmd->params.resp.cmd_status);
7449 	*data0 = LE32_TO_CPU(cmd->params.resp.data0);
7450 	*data1 = LE32_TO_CPU(cmd->params.resp.data1);
7451 err:
7452 	return retval;
7453 }
7454 
7455 
7456 /**
7457  * i40e_aq_send_msg_to_pf
7458  * @hw: pointer to the hardware structure
7459  * @v_opcode: opcodes for VF-PF communication
7460  * @v_retval: return error code
7461  * @msg: pointer to the msg buffer
7462  * @msglen: msg length
7463  * @cmd_details: pointer to command details
7464  *
7465  * Send message to PF driver using admin queue. By default, this message
7466  * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for
7467  * completion before returning.
7468  **/
7469 enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
7470 				enum virtchnl_ops v_opcode,
7471 				enum i40e_status_code v_retval,
7472 				u8 *msg, u16 msglen,
7473 				struct i40e_asq_cmd_details *cmd_details)
7474 {
7475 	struct i40e_aq_desc desc;
7476 	struct i40e_asq_cmd_details details;
7477 	enum i40e_status_code status;
7478 
7479 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf);
7480 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
7481 	desc.cookie_high = CPU_TO_LE32(v_opcode);
7482 	desc.cookie_low = CPU_TO_LE32(v_retval);
7483 	if (msglen) {
7484 		desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF
7485 						| I40E_AQ_FLAG_RD));
7486 		if (msglen > I40E_AQ_LARGE_BUF)
7487 			desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
7488 		desc.datalen = CPU_TO_LE16(msglen);
7489 	}
7490 	if (!cmd_details) {
7491 		i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM);
7492 		details.async = TRUE;
7493 		cmd_details = &details;
7494 	}
7495 	status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg,
7496 				       msglen, cmd_details);
7497 	return status;
7498 }
7499 
7500 /**
7501  * i40e_vf_parse_hw_config
7502  * @hw: pointer to the hardware structure
7503  * @msg: pointer to the virtual channel VF resource structure
7504  *
7505  * Given a VF resource message from the PF, populate the hw struct
7506  * with appropriate information.
7507  **/
7508 void i40e_vf_parse_hw_config(struct i40e_hw *hw,
7509 			     struct virtchnl_vf_resource *msg)
7510 {
7511 	struct virtchnl_vsi_resource *vsi_res;
7512 	int i;
7513 
7514 	vsi_res = &msg->vsi_res[0];
7515 
7516 	hw->dev_caps.num_vsis = msg->num_vsis;
7517 	hw->dev_caps.num_rx_qp = msg->num_queue_pairs;
7518 	hw->dev_caps.num_tx_qp = msg->num_queue_pairs;
7519 	hw->dev_caps.num_msix_vectors_vf = msg->max_vectors;
7520 	hw->dev_caps.dcb = msg->vf_cap_flags &
7521 			   VIRTCHNL_VF_OFFLOAD_L2;
7522 	hw->dev_caps.iwarp = (msg->vf_cap_flags &
7523 			      VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0;
7524 	for (i = 0; i < msg->num_vsis; i++) {
7525 		if (vsi_res->vsi_type == VIRTCHNL_VSI_SRIOV) {
7526 			i40e_memcpy(hw->mac.perm_addr,
7527 				    vsi_res->default_mac_addr,
7528 				    ETH_ALEN,
7529 				    I40E_NONDMA_TO_NONDMA);
7530 			i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr,
7531 				    ETH_ALEN,
7532 				    I40E_NONDMA_TO_NONDMA);
7533 		}
7534 		vsi_res++;
7535 	}
7536 }
7537 
7538 /**
7539  * i40e_vf_reset
7540  * @hw: pointer to the hardware structure
7541  *
7542  * Send a VF_RESET message to the PF. Does not wait for response from PF
7543  * as none will be forthcoming. Immediately after calling this function,
7544  * the admin queue should be shut down and (optionally) reinitialized.
7545  **/
7546 enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw)
7547 {
7548 	return i40e_aq_send_msg_to_pf(hw, VIRTCHNL_OP_RESET_VF,
7549 				      I40E_SUCCESS, NULL, 0, NULL);
7550 }
7551 
7552 /**
7553  * i40e_aq_set_arp_proxy_config
7554  * @hw: pointer to the HW structure
7555  * @proxy_config: pointer to proxy config command table struct
7556  * @cmd_details: pointer to command details
7557  *
7558  * Set ARP offload parameters from pre-populated
7559  * i40e_aqc_arp_proxy_data struct
7560  **/
7561 enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
7562 				struct i40e_aqc_arp_proxy_data *proxy_config,
7563 				struct i40e_asq_cmd_details *cmd_details)
7564 {
7565 	struct i40e_aq_desc desc;
7566 	enum i40e_status_code status;
7567 
7568 	if (!proxy_config)
7569 		return I40E_ERR_PARAM;
7570 
7571 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_proxy_config);
7572 
7573 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7574 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7575 	desc.params.external.addr_high =
7576 				  CPU_TO_LE32(I40E_HI_DWORD((u64)proxy_config));
7577 	desc.params.external.addr_low =
7578 				  CPU_TO_LE32(I40E_LO_DWORD((u64)proxy_config));
7579 	desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_arp_proxy_data));
7580 
7581 	status = i40e_asq_send_command(hw, &desc, proxy_config,
7582 				       sizeof(struct i40e_aqc_arp_proxy_data),
7583 				       cmd_details);
7584 
7585 	return status;
7586 }
7587 
7588 /**
7589  * i40e_aq_set_ns_proxy_table_entry
7590  * @hw: pointer to the HW structure
7591  * @ns_proxy_table_entry: pointer to NS table entry command struct
7592  * @cmd_details: pointer to command details
7593  *
7594  * Set IPv6 Neighbor Solicitation (NS) protocol offload parameters
7595  * from pre-populated i40e_aqc_ns_proxy_data struct
7596  **/
7597 enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
7598 			struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
7599 			struct i40e_asq_cmd_details *cmd_details)
7600 {
7601 	struct i40e_aq_desc desc;
7602 	enum i40e_status_code status;
7603 
7604 	if (!ns_proxy_table_entry)
7605 		return I40E_ERR_PARAM;
7606 
7607 	i40e_fill_default_direct_cmd_desc(&desc,
7608 				i40e_aqc_opc_set_ns_proxy_table_entry);
7609 
7610 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7611 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7612 	desc.params.external.addr_high =
7613 		CPU_TO_LE32(I40E_HI_DWORD((u64)ns_proxy_table_entry));
7614 	desc.params.external.addr_low =
7615 		CPU_TO_LE32(I40E_LO_DWORD((u64)ns_proxy_table_entry));
7616 	desc.datalen = CPU_TO_LE16(sizeof(struct i40e_aqc_ns_proxy_data));
7617 
7618 	status = i40e_asq_send_command(hw, &desc, ns_proxy_table_entry,
7619 				       sizeof(struct i40e_aqc_ns_proxy_data),
7620 				       cmd_details);
7621 
7622 	return status;
7623 }
7624 
7625 /**
7626  * i40e_aq_set_clear_wol_filter
7627  * @hw: pointer to the hw struct
7628  * @filter_index: index of filter to modify (0-7)
7629  * @filter: buffer containing filter to be set
7630  * @set_filter: TRUE to set filter, FALSE to clear filter
7631  * @no_wol_tco: if TRUE, pass through packets cannot cause wake-up
7632  *		if FALSE, pass through packets may cause wake-up
7633  * @filter_valid: TRUE if filter action is valid
7634  * @no_wol_tco_valid: TRUE if no WoL in TCO traffic action valid
7635  * @cmd_details: pointer to command details structure or NULL
7636  *
7637  * Set or clear WoL filter for port attached to the PF
7638  **/
7639 enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
7640 				u8 filter_index,
7641 				struct i40e_aqc_set_wol_filter_data *filter,
7642 				bool set_filter, bool no_wol_tco,
7643 				bool filter_valid, bool no_wol_tco_valid,
7644 				struct i40e_asq_cmd_details *cmd_details)
7645 {
7646 	struct i40e_aq_desc desc;
7647 	struct i40e_aqc_set_wol_filter *cmd =
7648 		(struct i40e_aqc_set_wol_filter *)&desc.params.raw;
7649 	enum i40e_status_code status;
7650 	u16 cmd_flags = 0;
7651 	u16 valid_flags = 0;
7652 	u16 buff_len = 0;
7653 
7654 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_wol_filter);
7655 
7656 	if (filter_index >= I40E_AQC_MAX_NUM_WOL_FILTERS)
7657 		return  I40E_ERR_PARAM;
7658 	cmd->filter_index = CPU_TO_LE16(filter_index);
7659 
7660 	if (set_filter) {
7661 		if (!filter)
7662 			return  I40E_ERR_PARAM;
7663 
7664 		cmd_flags |= I40E_AQC_SET_WOL_FILTER;
7665 		cmd_flags |= I40E_AQC_SET_WOL_FILTER_WOL_PRESERVE_ON_PFR;
7666 	}
7667 
7668 	if (no_wol_tco)
7669 		cmd_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL;
7670 	cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
7671 
7672 	if (filter_valid)
7673 		valid_flags |= I40E_AQC_SET_WOL_FILTER_ACTION_VALID;
7674 	if (no_wol_tco_valid)
7675 		valid_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID;
7676 	cmd->valid_flags = CPU_TO_LE16(valid_flags);
7677 
7678 	buff_len = sizeof(*filter);
7679 	desc.datalen = CPU_TO_LE16(buff_len);
7680 
7681 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
7682 	desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
7683 
7684 	cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((u64)filter));
7685 	cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((u64)filter));
7686 
7687 	status = i40e_asq_send_command(hw, &desc, filter,
7688 				       buff_len, cmd_details);
7689 
7690 	return status;
7691 }
7692 
7693 /**
7694  * i40e_aq_get_wake_event_reason
7695  * @hw: pointer to the hw struct
7696  * @wake_reason: return value, index of matching filter
7697  * @cmd_details: pointer to command details structure or NULL
7698  *
7699  * Get information for the reason of a Wake Up event
7700  **/
7701 enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
7702 				u16 *wake_reason,
7703 				struct i40e_asq_cmd_details *cmd_details)
7704 {
7705 	struct i40e_aq_desc desc;
7706 	struct i40e_aqc_get_wake_reason_completion *resp =
7707 		(struct i40e_aqc_get_wake_reason_completion *)&desc.params.raw;
7708 	enum i40e_status_code status;
7709 
7710 	i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_wake_reason);
7711 
7712 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7713 
7714 	if (status == I40E_SUCCESS)
7715 		*wake_reason = LE16_TO_CPU(resp->wake_reason);
7716 
7717 	return status;
7718 }
7719 
7720 /**
7721 * i40e_aq_clear_all_wol_filters
7722 * @hw: pointer to the hw struct
7723 * @cmd_details: pointer to command details structure or NULL
7724 *
7725 * Get information for the reason of a Wake Up event
7726 **/
7727 enum i40e_status_code i40e_aq_clear_all_wol_filters(struct i40e_hw *hw,
7728 	struct i40e_asq_cmd_details *cmd_details)
7729 {
7730 	struct i40e_aq_desc desc;
7731 	enum i40e_status_code status;
7732 
7733 	i40e_fill_default_direct_cmd_desc(&desc,
7734 					  i40e_aqc_opc_clear_all_wol_filters);
7735 
7736 	status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
7737 
7738 	return status;
7739 }
7740 
7741