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