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