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