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