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