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