Merge remote-tracking branch 'asoc/topic/doc' into asoc-next
[linux-drm-fsl-dcu.git] / drivers / net / ethernet / intel / i40e / i40e_common.c
1 /*******************************************************************************
2  *
3  * Intel Ethernet Controller XL710 Family Linux Driver
4  * Copyright(c) 2013 Intel Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms and conditions of the GNU General Public License,
8  * version 2, as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License along with
16  * this program; if not, write to the Free Software Foundation, Inc.,
17  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * The full GNU General Public License is included in this distribution in
20  * the file called "COPYING".
21  *
22  * Contact Information:
23  * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
24  * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25  *
26  ******************************************************************************/
27
28 #include "i40e_type.h"
29 #include "i40e_adminq.h"
30 #include "i40e_prototype.h"
31 #include "i40e_virtchnl.h"
32
33 /**
34  * i40e_set_mac_type - Sets MAC type
35  * @hw: pointer to the HW structure
36  *
37  * This function sets the mac type of the adapter based on the
38  * vendor ID and device ID stored in the hw structure.
39  **/
40 static i40e_status i40e_set_mac_type(struct i40e_hw *hw)
41 {
42         i40e_status status = 0;
43
44         if (hw->vendor_id == PCI_VENDOR_ID_INTEL) {
45                 switch (hw->device_id) {
46                 case I40E_SFP_XL710_DEVICE_ID:
47                 case I40E_SFP_X710_DEVICE_ID:
48                 case I40E_QEMU_DEVICE_ID:
49                 case I40E_KX_A_DEVICE_ID:
50                 case I40E_KX_B_DEVICE_ID:
51                 case I40E_KX_C_DEVICE_ID:
52                 case I40E_KX_D_DEVICE_ID:
53                 case I40E_QSFP_A_DEVICE_ID:
54                 case I40E_QSFP_B_DEVICE_ID:
55                 case I40E_QSFP_C_DEVICE_ID:
56                         hw->mac.type = I40E_MAC_XL710;
57                         break;
58                 case I40E_VF_DEVICE_ID:
59                 case I40E_VF_HV_DEVICE_ID:
60                         hw->mac.type = I40E_MAC_VF;
61                         break;
62                 default:
63                         hw->mac.type = I40E_MAC_GENERIC;
64                         break;
65                 }
66         } else {
67                 status = I40E_ERR_DEVICE_NOT_SUPPORTED;
68         }
69
70         hw_dbg(hw, "i40e_set_mac_type found mac: %d, returns: %d\n",
71                   hw->mac.type, status);
72         return status;
73 }
74
75 /**
76  * i40e_debug_aq
77  * @hw: debug mask related to admin queue
78  * @cap: pointer to adminq command descriptor
79  * @buffer: pointer to command buffer
80  *
81  * Dumps debug log about adminq command with descriptor contents.
82  **/
83 void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
84                    void *buffer)
85 {
86         struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
87         u8 *aq_buffer = (u8 *)buffer;
88         u32 data[4];
89         u32 i = 0;
90
91         if ((!(mask & hw->debug_mask)) || (desc == NULL))
92                 return;
93
94         i40e_debug(hw, mask,
95                    "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
96                    aq_desc->opcode, aq_desc->flags, aq_desc->datalen,
97                    aq_desc->retval);
98         i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
99                    aq_desc->cookie_high, aq_desc->cookie_low);
100         i40e_debug(hw, mask, "\tparam (0,1)  0x%08X 0x%08X\n",
101                    aq_desc->params.internal.param0,
102                    aq_desc->params.internal.param1);
103         i40e_debug(hw, mask, "\taddr (h,l)   0x%08X 0x%08X\n",
104                    aq_desc->params.external.addr_high,
105                    aq_desc->params.external.addr_low);
106
107         if ((buffer != NULL) && (aq_desc->datalen != 0)) {
108                 memset(data, 0, sizeof(data));
109                 i40e_debug(hw, mask, "AQ CMD Buffer:\n");
110                 for (i = 0; i < le16_to_cpu(aq_desc->datalen); i++) {
111                         data[((i % 16) / 4)] |=
112                                 ((u32)aq_buffer[i]) << (8 * (i % 4));
113                         if ((i % 16) == 15) {
114                                 i40e_debug(hw, mask,
115                                            "\t0x%04X  %08X %08X %08X %08X\n",
116                                            i - 15, data[0], data[1], data[2],
117                                            data[3]);
118                                 memset(data, 0, sizeof(data));
119                         }
120                 }
121                 if ((i % 16) != 0)
122                         i40e_debug(hw, mask, "\t0x%04X  %08X %08X %08X %08X\n",
123                                    i - (i % 16), data[0], data[1], data[2],
124                                    data[3]);
125         }
126 }
127
128 /**
129  * i40e_init_shared_code - Initialize the shared code
130  * @hw: pointer to hardware structure
131  *
132  * This assigns the MAC type and PHY code and inits the NVM.
133  * Does not touch the hardware. This function must be called prior to any
134  * other function in the shared code. The i40e_hw structure should be
135  * memset to 0 prior to calling this function.  The following fields in
136  * hw structure should be filled in prior to calling this function:
137  * hw_addr, back, device_id, vendor_id, subsystem_device_id,
138  * subsystem_vendor_id, and revision_id
139  **/
140 i40e_status i40e_init_shared_code(struct i40e_hw *hw)
141 {
142         i40e_status status = 0;
143         u32 reg;
144
145         hw->phy.get_link_info = true;
146
147         /* Determine port number */
148         reg = rd32(hw, I40E_PFGEN_PORTNUM);
149         reg = ((reg & I40E_PFGEN_PORTNUM_PORT_NUM_MASK) >>
150                I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT);
151         hw->port = (u8)reg;
152
153         i40e_set_mac_type(hw);
154
155         switch (hw->mac.type) {
156         case I40E_MAC_XL710:
157                 break;
158         default:
159                 return I40E_ERR_DEVICE_NOT_SUPPORTED;
160                 break;
161         }
162
163         status = i40e_init_nvm(hw);
164         return status;
165 }
166
167 /**
168  * i40e_aq_mac_address_read - Retrieve the MAC addresses
169  * @hw: pointer to the hw struct
170  * @flags: a return indicator of what addresses were added to the addr store
171  * @addrs: the requestor's mac addr store
172  * @cmd_details: pointer to command details structure or NULL
173  **/
174 static i40e_status i40e_aq_mac_address_read(struct i40e_hw *hw,
175                                    u16 *flags,
176                                    struct i40e_aqc_mac_address_read_data *addrs,
177                                    struct i40e_asq_cmd_details *cmd_details)
178 {
179         struct i40e_aq_desc desc;
180         struct i40e_aqc_mac_address_read *cmd_data =
181                 (struct i40e_aqc_mac_address_read *)&desc.params.raw;
182         i40e_status status;
183
184         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
185         desc.flags |= cpu_to_le16(I40E_AQ_FLAG_BUF);
186
187         status = i40e_asq_send_command(hw, &desc, addrs,
188                                        sizeof(*addrs), cmd_details);
189         *flags = le16_to_cpu(cmd_data->command_flags);
190
191         return status;
192 }
193
194 /**
195  * i40e_aq_mac_address_write - Change the MAC addresses
196  * @hw: pointer to the hw struct
197  * @flags: indicates which MAC to be written
198  * @mac_addr: address to write
199  * @cmd_details: pointer to command details structure or NULL
200  **/
201 i40e_status i40e_aq_mac_address_write(struct i40e_hw *hw,
202                                     u16 flags, u8 *mac_addr,
203                                     struct i40e_asq_cmd_details *cmd_details)
204 {
205         struct i40e_aq_desc desc;
206         struct i40e_aqc_mac_address_write *cmd_data =
207                 (struct i40e_aqc_mac_address_write *)&desc.params.raw;
208         i40e_status status;
209
210         i40e_fill_default_direct_cmd_desc(&desc,
211                                           i40e_aqc_opc_mac_address_write);
212         cmd_data->command_flags = cpu_to_le16(flags);
213         memcpy(&cmd_data->mac_sal, &mac_addr[0], 4);
214         memcpy(&cmd_data->mac_sah, &mac_addr[4], 2);
215
216         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
217
218         return status;
219 }
220
221 /**
222  * i40e_get_mac_addr - get MAC address
223  * @hw: pointer to the HW structure
224  * @mac_addr: pointer to MAC address
225  *
226  * Reads the adapter's MAC address from register
227  **/
228 i40e_status i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
229 {
230         struct i40e_aqc_mac_address_read_data addrs;
231         i40e_status status;
232         u16 flags = 0;
233
234         status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
235
236         if (flags & I40E_AQC_LAN_ADDR_VALID)
237                 memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac));
238
239         return status;
240 }
241
242 /**
243  * i40e_validate_mac_addr - Validate MAC address
244  * @mac_addr: pointer to MAC address
245  *
246  * Tests a MAC address to ensure it is a valid Individual Address
247  **/
248 i40e_status i40e_validate_mac_addr(u8 *mac_addr)
249 {
250         i40e_status status = 0;
251
252         /* Make sure it is not a multicast address */
253         if (I40E_IS_MULTICAST(mac_addr)) {
254                 hw_dbg(hw, "MAC address is multicast\n");
255                 status = I40E_ERR_INVALID_MAC_ADDR;
256         /* Not a broadcast address */
257         } else if (I40E_IS_BROADCAST(mac_addr)) {
258                 hw_dbg(hw, "MAC address is broadcast\n");
259                 status = I40E_ERR_INVALID_MAC_ADDR;
260         /* Reject the zero address */
261         } else if (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
262                    mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0) {
263                 hw_dbg(hw, "MAC address is all zeros\n");
264                 status = I40E_ERR_INVALID_MAC_ADDR;
265         }
266         return status;
267 }
268
269 /**
270  * i40e_pf_reset - Reset the PF
271  * @hw: pointer to the hardware structure
272  *
273  * Assuming someone else has triggered a global reset,
274  * assure the global reset is complete and then reset the PF
275  **/
276 i40e_status i40e_pf_reset(struct i40e_hw *hw)
277 {
278         u32 wait_cnt = 0;
279         u32 reg = 0;
280         u32 grst_del;
281
282         /* Poll for Global Reset steady state in case of recent GRST.
283          * The grst delay value is in 100ms units, and we'll wait a
284          * couple counts longer to be sure we don't just miss the end.
285          */
286         grst_del = rd32(hw, I40E_GLGEN_RSTCTL) & I40E_GLGEN_RSTCTL_GRSTDEL_MASK
287                         >> I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
288         for (wait_cnt = 0; wait_cnt < grst_del + 2; wait_cnt++) {
289                 reg = rd32(hw, I40E_GLGEN_RSTAT);
290                 if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
291                         break;
292                 msleep(100);
293         }
294         if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
295                 hw_dbg(hw, "Global reset polling failed to complete.\n");
296                 return I40E_ERR_RESET_FAILED;
297         }
298
299         /* Determine the PF number based on the PCI fn */
300         hw->pf_id = (u8)hw->bus.func;
301
302         /* If there was a Global Reset in progress when we got here,
303          * we don't need to do the PF Reset
304          */
305         if (!wait_cnt) {
306                 reg = rd32(hw, I40E_PFGEN_CTRL);
307                 wr32(hw, I40E_PFGEN_CTRL,
308                      (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
309                 for (wait_cnt = 0; wait_cnt < 10; wait_cnt++) {
310                         reg = rd32(hw, I40E_PFGEN_CTRL);
311                         if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
312                                 break;
313                         usleep_range(1000, 2000);
314                 }
315                 if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
316                         hw_dbg(hw, "PF reset polling failed to complete.\n");
317                         return I40E_ERR_RESET_FAILED;
318                 }
319         }
320
321         i40e_clear_pxe_mode(hw);
322         return 0;
323 }
324
325 /**
326  * i40e_clear_pxe_mode - clear pxe operations mode
327  * @hw: pointer to the hw struct
328  *
329  * Make sure all PXE mode settings are cleared, including things
330  * like descriptor fetch/write-back mode.
331  **/
332 void i40e_clear_pxe_mode(struct i40e_hw *hw)
333 {
334         u32 reg;
335
336         /* Clear single descriptor fetch/write-back mode */
337         reg = rd32(hw, I40E_GLLAN_RCTL_0);
338         wr32(hw, I40E_GLLAN_RCTL_0, (reg | I40E_GLLAN_RCTL_0_PXE_MODE_MASK));
339 }
340
341 /**
342  * i40e_led_get - return current on/off mode
343  * @hw: pointer to the hw struct
344  *
345  * The value returned is the 'mode' field as defined in the
346  * GPIO register definitions: 0x0 = off, 0xf = on, and other
347  * values are variations of possible behaviors relating to
348  * blink, link, and wire.
349  **/
350 u32 i40e_led_get(struct i40e_hw *hw)
351 {
352         u32 gpio_val = 0;
353         u32 mode = 0;
354         u32 port;
355         int i;
356
357         for (i = 0; i < I40E_HW_CAP_MAX_GPIO; i++) {
358                 if (!hw->func_caps.led[i])
359                         continue;
360
361                 gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(i));
362                 port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK)
363                         >> I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
364
365                 if (port != hw->port)
366                         continue;
367
368                 mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
369                                 >> I40E_GLGEN_GPIO_CTL_INT_MODE_SHIFT;
370                 break;
371         }
372
373         return mode;
374 }
375
376 /**
377  * i40e_led_set - set new on/off mode
378  * @hw: pointer to the hw struct
379  * @mode: 0=off, else on (see EAS for mode details)
380  **/
381 void i40e_led_set(struct i40e_hw *hw, u32 mode)
382 {
383         u32 gpio_val = 0;
384         u32 led_mode = 0;
385         u32 port;
386         int i;
387
388         for (i = 0; i < I40E_HW_CAP_MAX_GPIO; i++) {
389                 if (!hw->func_caps.led[i])
390                         continue;
391
392                 gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(i));
393                 port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK)
394                         >> I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
395
396                 if (port != hw->port)
397                         continue;
398
399                 led_mode = (mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
400                             I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
401                 gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
402                 gpio_val |= led_mode;
403                 wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
404         }
405 }
406
407 /* Admin command wrappers */
408 /**
409  * i40e_aq_queue_shutdown
410  * @hw: pointer to the hw struct
411  * @unloading: is the driver unloading itself
412  *
413  * Tell the Firmware that we're shutting down the AdminQ and whether
414  * or not the driver is unloading as well.
415  **/
416 i40e_status i40e_aq_queue_shutdown(struct i40e_hw *hw,
417                                              bool unloading)
418 {
419         struct i40e_aq_desc desc;
420         struct i40e_aqc_queue_shutdown *cmd =
421                 (struct i40e_aqc_queue_shutdown *)&desc.params.raw;
422         i40e_status status;
423
424         i40e_fill_default_direct_cmd_desc(&desc,
425                                           i40e_aqc_opc_queue_shutdown);
426
427         if (unloading)
428                 cmd->driver_unloading = cpu_to_le32(I40E_AQ_DRIVER_UNLOADING);
429         status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
430
431         return status;
432 }
433
434 /**
435  * i40e_aq_set_link_restart_an
436  * @hw: pointer to the hw struct
437  * @cmd_details: pointer to command details structure or NULL
438  *
439  * Sets up the link and restarts the Auto-Negotiation over the link.
440  **/
441 i40e_status i40e_aq_set_link_restart_an(struct i40e_hw *hw,
442                                 struct i40e_asq_cmd_details *cmd_details)
443 {
444         struct i40e_aq_desc desc;
445         struct i40e_aqc_set_link_restart_an *cmd =
446                 (struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
447         i40e_status status;
448
449         i40e_fill_default_direct_cmd_desc(&desc,
450                                           i40e_aqc_opc_set_link_restart_an);
451
452         cmd->command = I40E_AQ_PHY_RESTART_AN;
453
454         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
455
456         return status;
457 }
458
459 /**
460  * i40e_aq_get_link_info
461  * @hw: pointer to the hw struct
462  * @enable_lse: enable/disable LinkStatusEvent reporting
463  * @link: pointer to link status structure - optional
464  * @cmd_details: pointer to command details structure or NULL
465  *
466  * Returns the link status of the adapter.
467  **/
468 i40e_status i40e_aq_get_link_info(struct i40e_hw *hw,
469                                 bool enable_lse, struct i40e_link_status *link,
470                                 struct i40e_asq_cmd_details *cmd_details)
471 {
472         struct i40e_aq_desc desc;
473         struct i40e_aqc_get_link_status *resp =
474                 (struct i40e_aqc_get_link_status *)&desc.params.raw;
475         struct i40e_link_status *hw_link_info = &hw->phy.link_info;
476         i40e_status status;
477         u16 command_flags;
478
479         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
480
481         if (enable_lse)
482                 command_flags = I40E_AQ_LSE_ENABLE;
483         else
484                 command_flags = I40E_AQ_LSE_DISABLE;
485         resp->command_flags = cpu_to_le16(command_flags);
486
487         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
488
489         if (status)
490                 goto aq_get_link_info_exit;
491
492         /* save off old link status information */
493         memcpy(&hw->phy.link_info_old, hw_link_info,
494                sizeof(struct i40e_link_status));
495
496         /* update link status */
497         hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
498         hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
499         hw_link_info->link_info = resp->link_info;
500         hw_link_info->an_info = resp->an_info;
501         hw_link_info->ext_info = resp->ext_info;
502
503         if (resp->command_flags & cpu_to_le16(I40E_AQ_LSE_ENABLE))
504                 hw_link_info->lse_enable = true;
505         else
506                 hw_link_info->lse_enable = false;
507
508         /* save link status information */
509         if (link)
510                 *link = *hw_link_info;
511
512         /* flag cleared so helper functions don't call AQ again */
513         hw->phy.get_link_info = false;
514
515 aq_get_link_info_exit:
516         return status;
517 }
518
519 /**
520  * i40e_aq_add_vsi
521  * @hw: pointer to the hw struct
522  * @vsi: pointer to a vsi context struct
523  * @cmd_details: pointer to command details structure or NULL
524  *
525  * Add a VSI context to the hardware.
526 **/
527 i40e_status i40e_aq_add_vsi(struct i40e_hw *hw,
528                                 struct i40e_vsi_context *vsi_ctx,
529                                 struct i40e_asq_cmd_details *cmd_details)
530 {
531         struct i40e_aq_desc desc;
532         struct i40e_aqc_add_get_update_vsi *cmd =
533                 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
534         struct i40e_aqc_add_get_update_vsi_completion *resp =
535                 (struct i40e_aqc_add_get_update_vsi_completion *)
536                 &desc.params.raw;
537         i40e_status status;
538
539         i40e_fill_default_direct_cmd_desc(&desc,
540                                           i40e_aqc_opc_add_vsi);
541
542         cmd->uplink_seid = cpu_to_le16(vsi_ctx->uplink_seid);
543         cmd->connection_type = vsi_ctx->connection_type;
544         cmd->vf_id = vsi_ctx->vf_num;
545         cmd->vsi_flags = cpu_to_le16(vsi_ctx->flags);
546
547         desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
548         if (sizeof(vsi_ctx->info) > I40E_AQ_LARGE_BUF)
549                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
550
551         status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
552                                     sizeof(vsi_ctx->info), cmd_details);
553
554         if (status)
555                 goto aq_add_vsi_exit;
556
557         vsi_ctx->seid = le16_to_cpu(resp->seid);
558         vsi_ctx->vsi_number = le16_to_cpu(resp->vsi_number);
559         vsi_ctx->vsis_allocated = le16_to_cpu(resp->vsi_used);
560         vsi_ctx->vsis_unallocated = le16_to_cpu(resp->vsi_free);
561
562 aq_add_vsi_exit:
563         return status;
564 }
565
566 /**
567  * i40e_aq_set_vsi_unicast_promiscuous
568  * @hw: pointer to the hw struct
569  * @seid: vsi number
570  * @set: set unicast promiscuous enable/disable
571  * @cmd_details: pointer to command details structure or NULL
572  **/
573 i40e_status i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
574                                 u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
575 {
576         struct i40e_aq_desc desc;
577         struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
578                 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
579         i40e_status status;
580         u16 flags = 0;
581
582         i40e_fill_default_direct_cmd_desc(&desc,
583                                         i40e_aqc_opc_set_vsi_promiscuous_modes);
584
585         if (set)
586                 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
587
588         cmd->promiscuous_flags = cpu_to_le16(flags);
589
590         cmd->valid_flags = cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
591
592         cmd->seid = cpu_to_le16(seid);
593         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
594
595         return status;
596 }
597
598 /**
599  * i40e_aq_set_vsi_multicast_promiscuous
600  * @hw: pointer to the hw struct
601  * @seid: vsi number
602  * @set: set multicast promiscuous enable/disable
603  * @cmd_details: pointer to command details structure or NULL
604  **/
605 i40e_status i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
606                                 u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
607 {
608         struct i40e_aq_desc desc;
609         struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
610                 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
611         i40e_status status;
612         u16 flags = 0;
613
614         i40e_fill_default_direct_cmd_desc(&desc,
615                                         i40e_aqc_opc_set_vsi_promiscuous_modes);
616
617         if (set)
618                 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
619
620         cmd->promiscuous_flags = cpu_to_le16(flags);
621
622         cmd->valid_flags = cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
623
624         cmd->seid = cpu_to_le16(seid);
625         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
626
627         return status;
628 }
629
630 /**
631  * i40e_aq_set_vsi_broadcast
632  * @hw: pointer to the hw struct
633  * @seid: vsi number
634  * @set_filter: true to set filter, false to clear filter
635  * @cmd_details: pointer to command details structure or NULL
636  *
637  * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
638  **/
639 i40e_status i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
640                                 u16 seid, bool set_filter,
641                                 struct i40e_asq_cmd_details *cmd_details)
642 {
643         struct i40e_aq_desc desc;
644         struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
645                 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
646         i40e_status status;
647
648         i40e_fill_default_direct_cmd_desc(&desc,
649                                         i40e_aqc_opc_set_vsi_promiscuous_modes);
650
651         if (set_filter)
652                 cmd->promiscuous_flags
653                             |= cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
654         else
655                 cmd->promiscuous_flags
656                             &= cpu_to_le16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
657
658         cmd->valid_flags = cpu_to_le16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
659         cmd->seid = cpu_to_le16(seid);
660         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
661
662         return status;
663 }
664
665 /**
666  * i40e_get_vsi_params - get VSI configuration info
667  * @hw: pointer to the hw struct
668  * @vsi: pointer to a vsi context struct
669  * @cmd_details: pointer to command details structure or NULL
670  **/
671 i40e_status i40e_aq_get_vsi_params(struct i40e_hw *hw,
672                                 struct i40e_vsi_context *vsi_ctx,
673                                 struct i40e_asq_cmd_details *cmd_details)
674 {
675         struct i40e_aq_desc desc;
676         struct i40e_aqc_switch_seid *cmd =
677                 (struct i40e_aqc_switch_seid *)&desc.params.raw;
678         struct i40e_aqc_add_get_update_vsi_completion *resp =
679                 (struct i40e_aqc_add_get_update_vsi_completion *)
680                 &desc.params.raw;
681         i40e_status status;
682
683         i40e_fill_default_direct_cmd_desc(&desc,
684                                           i40e_aqc_opc_get_vsi_parameters);
685
686         cmd->seid = cpu_to_le16(vsi_ctx->seid);
687
688         desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
689         if (sizeof(vsi_ctx->info) > I40E_AQ_LARGE_BUF)
690                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
691
692         status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
693                                     sizeof(vsi_ctx->info), NULL);
694
695         if (status)
696                 goto aq_get_vsi_params_exit;
697
698         vsi_ctx->seid = le16_to_cpu(resp->seid);
699         vsi_ctx->vsi_number = le16_to_cpu(resp->vsi_number);
700         vsi_ctx->vsis_allocated = le16_to_cpu(resp->vsi_used);
701         vsi_ctx->vsis_unallocated = le16_to_cpu(resp->vsi_free);
702
703 aq_get_vsi_params_exit:
704         return status;
705 }
706
707 /**
708  * i40e_aq_update_vsi_params
709  * @hw: pointer to the hw struct
710  * @vsi: pointer to a vsi context struct
711  * @cmd_details: pointer to command details structure or NULL
712  *
713  * Update a VSI context.
714  **/
715 i40e_status i40e_aq_update_vsi_params(struct i40e_hw *hw,
716                                 struct i40e_vsi_context *vsi_ctx,
717                                 struct i40e_asq_cmd_details *cmd_details)
718 {
719         struct i40e_aq_desc desc;
720         struct i40e_aqc_switch_seid *cmd =
721                 (struct i40e_aqc_switch_seid *)&desc.params.raw;
722         i40e_status status;
723
724         i40e_fill_default_direct_cmd_desc(&desc,
725                                           i40e_aqc_opc_update_vsi_parameters);
726         cmd->seid = cpu_to_le16(vsi_ctx->seid);
727
728         desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
729         if (sizeof(vsi_ctx->info) > I40E_AQ_LARGE_BUF)
730                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
731
732         status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
733                                     sizeof(vsi_ctx->info), cmd_details);
734
735         return status;
736 }
737
738 /**
739  * i40e_aq_get_switch_config
740  * @hw: pointer to the hardware structure
741  * @buf: pointer to the result buffer
742  * @buf_size: length of input buffer
743  * @start_seid: seid to start for the report, 0 == beginning
744  * @cmd_details: pointer to command details structure or NULL
745  *
746  * Fill the buf with switch configuration returned from AdminQ command
747  **/
748 i40e_status i40e_aq_get_switch_config(struct i40e_hw *hw,
749                                 struct i40e_aqc_get_switch_config_resp *buf,
750                                 u16 buf_size, u16 *start_seid,
751                                 struct i40e_asq_cmd_details *cmd_details)
752 {
753         struct i40e_aq_desc desc;
754         struct i40e_aqc_switch_seid *scfg =
755                 (struct i40e_aqc_switch_seid *)&desc.params.raw;
756         i40e_status status;
757
758         i40e_fill_default_direct_cmd_desc(&desc,
759                                           i40e_aqc_opc_get_switch_config);
760         desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
761         if (buf_size > I40E_AQ_LARGE_BUF)
762                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
763         scfg->seid = cpu_to_le16(*start_seid);
764
765         status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
766         *start_seid = le16_to_cpu(scfg->seid);
767
768         return status;
769 }
770
771 /**
772  * i40e_aq_get_firmware_version
773  * @hw: pointer to the hw struct
774  * @fw_major_version: firmware major version
775  * @fw_minor_version: firmware minor version
776  * @api_major_version: major queue version
777  * @api_minor_version: minor queue version
778  * @cmd_details: pointer to command details structure or NULL
779  *
780  * Get the firmware version from the admin queue commands
781  **/
782 i40e_status i40e_aq_get_firmware_version(struct i40e_hw *hw,
783                                 u16 *fw_major_version, u16 *fw_minor_version,
784                                 u16 *api_major_version, u16 *api_minor_version,
785                                 struct i40e_asq_cmd_details *cmd_details)
786 {
787         struct i40e_aq_desc desc;
788         struct i40e_aqc_get_version *resp =
789                 (struct i40e_aqc_get_version *)&desc.params.raw;
790         i40e_status status;
791
792         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
793
794         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
795
796         if (!status) {
797                 if (fw_major_version != NULL)
798                         *fw_major_version = le16_to_cpu(resp->fw_major);
799                 if (fw_minor_version != NULL)
800                         *fw_minor_version = le16_to_cpu(resp->fw_minor);
801                 if (api_major_version != NULL)
802                         *api_major_version = le16_to_cpu(resp->api_major);
803                 if (api_minor_version != NULL)
804                         *api_minor_version = le16_to_cpu(resp->api_minor);
805         }
806
807         return status;
808 }
809
810 /**
811  * i40e_aq_send_driver_version
812  * @hw: pointer to the hw struct
813  * @event: driver event: driver ok, start or stop
814  * @dv: driver's major, minor version
815  * @cmd_details: pointer to command details structure or NULL
816  *
817  * Send the driver version to the firmware
818  **/
819 i40e_status i40e_aq_send_driver_version(struct i40e_hw *hw,
820                                 struct i40e_driver_version *dv,
821                                 struct i40e_asq_cmd_details *cmd_details)
822 {
823         struct i40e_aq_desc desc;
824         struct i40e_aqc_driver_version *cmd =
825                 (struct i40e_aqc_driver_version *)&desc.params.raw;
826         i40e_status status;
827
828         if (dv == NULL)
829                 return I40E_ERR_PARAM;
830
831         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
832
833         desc.flags |= cpu_to_le16(I40E_AQ_FLAG_SI);
834         cmd->driver_major_ver = dv->major_version;
835         cmd->driver_minor_ver = dv->minor_version;
836         cmd->driver_build_ver = dv->build_version;
837         cmd->driver_subbuild_ver = dv->subbuild_version;
838         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
839
840         return status;
841 }
842
843 /**
844  * i40e_get_link_status - get status of the HW network link
845  * @hw: pointer to the hw struct
846  *
847  * Returns true if link is up, false if link is down.
848  *
849  * Side effect: LinkStatusEvent reporting becomes enabled
850  **/
851 bool i40e_get_link_status(struct i40e_hw *hw)
852 {
853         i40e_status status = 0;
854         bool link_status = false;
855
856         if (hw->phy.get_link_info) {
857                 status = i40e_aq_get_link_info(hw, true, NULL, NULL);
858
859                 if (status)
860                         goto i40e_get_link_status_exit;
861         }
862
863         link_status = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
864
865 i40e_get_link_status_exit:
866         return link_status;
867 }
868
869 /**
870  * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
871  * @hw: pointer to the hw struct
872  * @uplink_seid: the MAC or other gizmo SEID
873  * @downlink_seid: the VSI SEID
874  * @enabled_tc: bitmap of TCs to be enabled
875  * @default_port: true for default port VSI, false for control port
876  * @veb_seid: pointer to where to put the resulting VEB SEID
877  * @cmd_details: pointer to command details structure or NULL
878  *
879  * This asks the FW to add a VEB between the uplink and downlink
880  * elements.  If the uplink SEID is 0, this will be a floating VEB.
881  **/
882 i40e_status i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
883                                 u16 downlink_seid, u8 enabled_tc,
884                                 bool default_port, u16 *veb_seid,
885                                 struct i40e_asq_cmd_details *cmd_details)
886 {
887         struct i40e_aq_desc desc;
888         struct i40e_aqc_add_veb *cmd =
889                 (struct i40e_aqc_add_veb *)&desc.params.raw;
890         struct i40e_aqc_add_veb_completion *resp =
891                 (struct i40e_aqc_add_veb_completion *)&desc.params.raw;
892         i40e_status status;
893         u16 veb_flags = 0;
894
895         /* SEIDs need to either both be set or both be 0 for floating VEB */
896         if (!!uplink_seid != !!downlink_seid)
897                 return I40E_ERR_PARAM;
898
899         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
900
901         cmd->uplink_seid = cpu_to_le16(uplink_seid);
902         cmd->downlink_seid = cpu_to_le16(downlink_seid);
903         cmd->enable_tcs = enabled_tc;
904         if (!uplink_seid)
905                 veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
906         if (default_port)
907                 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
908         else
909                 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
910         cmd->veb_flags = cpu_to_le16(veb_flags);
911
912         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
913
914         if (!status && veb_seid)
915                 *veb_seid = le16_to_cpu(resp->veb_seid);
916
917         return status;
918 }
919
920 /**
921  * i40e_aq_get_veb_parameters - Retrieve VEB parameters
922  * @hw: pointer to the hw struct
923  * @veb_seid: the SEID of the VEB to query
924  * @switch_id: the uplink switch id
925  * @floating_veb: set to true if the VEB is floating
926  * @statistic_index: index of the stats counter block for this VEB
927  * @vebs_used: number of VEB's used by function
928  * @vebs_unallocated: total VEB's not reserved by any function
929  * @cmd_details: pointer to command details structure or NULL
930  *
931  * This retrieves the parameters for a particular VEB, specified by
932  * uplink_seid, and returns them to the caller.
933  **/
934 i40e_status i40e_aq_get_veb_parameters(struct i40e_hw *hw,
935                                 u16 veb_seid, u16 *switch_id,
936                                 bool *floating, u16 *statistic_index,
937                                 u16 *vebs_used, u16 *vebs_free,
938                                 struct i40e_asq_cmd_details *cmd_details)
939 {
940         struct i40e_aq_desc desc;
941         struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
942                 (struct i40e_aqc_get_veb_parameters_completion *)
943                 &desc.params.raw;
944         i40e_status status;
945
946         if (veb_seid == 0)
947                 return I40E_ERR_PARAM;
948
949         i40e_fill_default_direct_cmd_desc(&desc,
950                                           i40e_aqc_opc_get_veb_parameters);
951         cmd_resp->seid = cpu_to_le16(veb_seid);
952
953         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
954         if (status)
955                 goto get_veb_exit;
956
957         if (switch_id)
958                 *switch_id = le16_to_cpu(cmd_resp->switch_id);
959         if (statistic_index)
960                 *statistic_index = le16_to_cpu(cmd_resp->statistic_index);
961         if (vebs_used)
962                 *vebs_used = le16_to_cpu(cmd_resp->vebs_used);
963         if (vebs_free)
964                 *vebs_free = le16_to_cpu(cmd_resp->vebs_free);
965         if (floating) {
966                 u16 flags = le16_to_cpu(cmd_resp->veb_flags);
967                 if (flags & I40E_AQC_ADD_VEB_FLOATING)
968                         *floating = true;
969                 else
970                         *floating = false;
971         }
972
973 get_veb_exit:
974         return status;
975 }
976
977 /**
978  * i40e_aq_add_macvlan
979  * @hw: pointer to the hw struct
980  * @seid: VSI for the mac address
981  * @mv_list: list of macvlans to be added
982  * @count: length of the list
983  * @cmd_details: pointer to command details structure or NULL
984  *
985  * Add MAC/VLAN addresses to the HW filtering
986  **/
987 i40e_status i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
988                         struct i40e_aqc_add_macvlan_element_data *mv_list,
989                         u16 count, struct i40e_asq_cmd_details *cmd_details)
990 {
991         struct i40e_aq_desc desc;
992         struct i40e_aqc_macvlan *cmd =
993                 (struct i40e_aqc_macvlan *)&desc.params.raw;
994         i40e_status status;
995         u16 buf_size;
996
997         if (count == 0 || !mv_list || !hw)
998                 return I40E_ERR_PARAM;
999
1000         buf_size = count * sizeof(struct i40e_aqc_add_macvlan_element_data);
1001
1002         /* prep the rest of the request */
1003         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
1004         cmd->num_addresses = cpu_to_le16(count);
1005         cmd->seid[0] = cpu_to_le16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
1006         cmd->seid[1] = 0;
1007         cmd->seid[2] = 0;
1008
1009         desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
1010         if (buf_size > I40E_AQ_LARGE_BUF)
1011                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1012
1013         status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
1014                                     cmd_details);
1015
1016         return status;
1017 }
1018
1019 /**
1020  * i40e_aq_remove_macvlan
1021  * @hw: pointer to the hw struct
1022  * @seid: VSI for the mac address
1023  * @mv_list: list of macvlans to be removed
1024  * @count: length of the list
1025  * @cmd_details: pointer to command details structure or NULL
1026  *
1027  * Remove MAC/VLAN addresses from the HW filtering
1028  **/
1029 i40e_status i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
1030                         struct i40e_aqc_remove_macvlan_element_data *mv_list,
1031                         u16 count, struct i40e_asq_cmd_details *cmd_details)
1032 {
1033         struct i40e_aq_desc desc;
1034         struct i40e_aqc_macvlan *cmd =
1035                 (struct i40e_aqc_macvlan *)&desc.params.raw;
1036         i40e_status status;
1037         u16 buf_size;
1038
1039         if (count == 0 || !mv_list || !hw)
1040                 return I40E_ERR_PARAM;
1041
1042         buf_size = count * sizeof(struct i40e_aqc_remove_macvlan_element_data);
1043
1044         /* prep the rest of the request */
1045         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
1046         cmd->num_addresses = cpu_to_le16(count);
1047         cmd->seid[0] = cpu_to_le16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
1048         cmd->seid[1] = 0;
1049         cmd->seid[2] = 0;
1050
1051         desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
1052         if (buf_size > I40E_AQ_LARGE_BUF)
1053                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1054
1055         status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
1056                                        cmd_details);
1057
1058         return status;
1059 }
1060
1061 /**
1062  * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
1063  * @hw: pointer to the hw struct
1064  * @seid: VSI for the vlan filters
1065  * @v_list: list of vlan filters to be added
1066  * @count: length of the list
1067  * @cmd_details: pointer to command details structure or NULL
1068  **/
1069 i40e_status i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
1070                         struct i40e_aqc_add_remove_vlan_element_data *v_list,
1071                         u8 count, struct i40e_asq_cmd_details *cmd_details)
1072 {
1073         struct i40e_aq_desc desc;
1074         struct i40e_aqc_macvlan *cmd =
1075                 (struct i40e_aqc_macvlan *)&desc.params.raw;
1076         i40e_status status;
1077         u16 buf_size;
1078
1079         if (count == 0 || !v_list || !hw)
1080                 return I40E_ERR_PARAM;
1081
1082         buf_size = count * sizeof(struct i40e_aqc_add_remove_vlan_element_data);
1083
1084         /* prep the rest of the request */
1085         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
1086         cmd->num_addresses = cpu_to_le16(count);
1087         cmd->seid[0] = cpu_to_le16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
1088         cmd->seid[1] = 0;
1089         cmd->seid[2] = 0;
1090
1091         desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
1092         if (buf_size > I40E_AQ_LARGE_BUF)
1093                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1094
1095         status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
1096                                        cmd_details);
1097
1098         return status;
1099 }
1100
1101 /**
1102  * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
1103  * @hw: pointer to the hw struct
1104  * @seid: VSI for the vlan filters
1105  * @v_list: list of macvlans to be removed
1106  * @count: length of the list
1107  * @cmd_details: pointer to command details structure or NULL
1108  **/
1109 i40e_status i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
1110                         struct i40e_aqc_add_remove_vlan_element_data *v_list,
1111                         u8 count, struct i40e_asq_cmd_details *cmd_details)
1112 {
1113         struct i40e_aq_desc desc;
1114         struct i40e_aqc_macvlan *cmd =
1115                 (struct i40e_aqc_macvlan *)&desc.params.raw;
1116         i40e_status status;
1117         u16 buf_size;
1118
1119         if (count == 0 || !v_list || !hw)
1120                 return I40E_ERR_PARAM;
1121
1122         buf_size = count * sizeof(struct i40e_aqc_add_remove_vlan_element_data);
1123
1124         /* prep the rest of the request */
1125         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
1126         cmd->num_addresses = cpu_to_le16(count);
1127         cmd->seid[0] = cpu_to_le16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
1128         cmd->seid[1] = 0;
1129         cmd->seid[2] = 0;
1130
1131         desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
1132         if (buf_size > I40E_AQ_LARGE_BUF)
1133                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1134
1135         status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
1136                                        cmd_details);
1137
1138         return status;
1139 }
1140
1141 /**
1142  * i40e_aq_send_msg_to_vf
1143  * @hw: pointer to the hardware structure
1144  * @vfid: vf id to send msg
1145  * @msg: pointer to the msg buffer
1146  * @msglen: msg length
1147  * @cmd_details: pointer to command details
1148  *
1149  * send msg to vf
1150  **/
1151 i40e_status i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
1152                                 u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
1153                                 struct i40e_asq_cmd_details *cmd_details)
1154 {
1155         struct i40e_aq_desc desc;
1156         struct i40e_aqc_pf_vf_message *cmd =
1157                 (struct i40e_aqc_pf_vf_message *)&desc.params.raw;
1158         i40e_status status;
1159
1160         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
1161         cmd->id = cpu_to_le32(vfid);
1162         desc.cookie_high = cpu_to_le32(v_opcode);
1163         desc.cookie_low = cpu_to_le32(v_retval);
1164         desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_SI);
1165         if (msglen) {
1166                 desc.flags |= cpu_to_le16((u16)(I40E_AQ_FLAG_BUF |
1167                                                 I40E_AQ_FLAG_RD));
1168                 if (msglen > I40E_AQ_LARGE_BUF)
1169                         desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1170                 desc.datalen = cpu_to_le16(msglen);
1171         }
1172         status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
1173
1174         return status;
1175 }
1176
1177 /**
1178  * i40e_aq_set_hmc_resource_profile
1179  * @hw: pointer to the hw struct
1180  * @profile: type of profile the HMC is to be set as
1181  * @pe_vf_enabled_count: the number of PE enabled VFs the system has
1182  * @cmd_details: pointer to command details structure or NULL
1183  *
1184  * set the HMC profile of the device.
1185  **/
1186 i40e_status i40e_aq_set_hmc_resource_profile(struct i40e_hw *hw,
1187                                 enum i40e_aq_hmc_profile profile,
1188                                 u8 pe_vf_enabled_count,
1189                                 struct i40e_asq_cmd_details *cmd_details)
1190 {
1191         struct i40e_aq_desc desc;
1192         struct i40e_aq_get_set_hmc_resource_profile *cmd =
1193                 (struct i40e_aq_get_set_hmc_resource_profile *)&desc.params.raw;
1194         i40e_status status;
1195
1196         i40e_fill_default_direct_cmd_desc(&desc,
1197                                         i40e_aqc_opc_set_hmc_resource_profile);
1198
1199         cmd->pm_profile = (u8)profile;
1200         cmd->pe_vf_enabled = pe_vf_enabled_count;
1201
1202         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1203
1204         return status;
1205 }
1206
1207 /**
1208  * i40e_aq_request_resource
1209  * @hw: pointer to the hw struct
1210  * @resource: resource id
1211  * @access: access type
1212  * @sdp_number: resource number
1213  * @timeout: the maximum time in ms that the driver may hold the resource
1214  * @cmd_details: pointer to command details structure or NULL
1215  *
1216  * requests common resource using the admin queue commands
1217  **/
1218 i40e_status i40e_aq_request_resource(struct i40e_hw *hw,
1219                                 enum i40e_aq_resources_ids resource,
1220                                 enum i40e_aq_resource_access_type access,
1221                                 u8 sdp_number, u64 *timeout,
1222                                 struct i40e_asq_cmd_details *cmd_details)
1223 {
1224         struct i40e_aq_desc desc;
1225         struct i40e_aqc_request_resource *cmd_resp =
1226                 (struct i40e_aqc_request_resource *)&desc.params.raw;
1227         i40e_status status;
1228
1229         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
1230
1231         cmd_resp->resource_id = cpu_to_le16(resource);
1232         cmd_resp->access_type = cpu_to_le16(access);
1233         cmd_resp->resource_number = cpu_to_le32(sdp_number);
1234
1235         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1236         /* The completion specifies the maximum time in ms that the driver
1237          * may hold the resource in the Timeout field.
1238          * If the resource is held by someone else, the command completes with
1239          * busy return value and the timeout field indicates the maximum time
1240          * the current owner of the resource has to free it.
1241          */
1242         if (!status || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
1243                 *timeout = le32_to_cpu(cmd_resp->timeout);
1244
1245         return status;
1246 }
1247
1248 /**
1249  * i40e_aq_release_resource
1250  * @hw: pointer to the hw struct
1251  * @resource: resource id
1252  * @sdp_number: resource number
1253  * @cmd_details: pointer to command details structure or NULL
1254  *
1255  * release common resource using the admin queue commands
1256  **/
1257 i40e_status i40e_aq_release_resource(struct i40e_hw *hw,
1258                                 enum i40e_aq_resources_ids resource,
1259                                 u8 sdp_number,
1260                                 struct i40e_asq_cmd_details *cmd_details)
1261 {
1262         struct i40e_aq_desc desc;
1263         struct i40e_aqc_request_resource *cmd =
1264                 (struct i40e_aqc_request_resource *)&desc.params.raw;
1265         i40e_status status;
1266
1267         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
1268
1269         cmd->resource_id = cpu_to_le16(resource);
1270         cmd->resource_number = cpu_to_le32(sdp_number);
1271
1272         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1273
1274         return status;
1275 }
1276
1277 /**
1278  * i40e_aq_read_nvm
1279  * @hw: pointer to the hw struct
1280  * @module_pointer: module pointer location in words from the NVM beginning
1281  * @offset: byte offset from the module beginning
1282  * @length: length of the section to be read (in bytes from the offset)
1283  * @data: command buffer (size [bytes] = length)
1284  * @last_command: tells if this is the last command in a series
1285  * @cmd_details: pointer to command details structure or NULL
1286  *
1287  * Read the NVM using the admin queue commands
1288  **/
1289 i40e_status i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
1290                                 u32 offset, u16 length, void *data,
1291                                 bool last_command,
1292                                 struct i40e_asq_cmd_details *cmd_details)
1293 {
1294         struct i40e_aq_desc desc;
1295         struct i40e_aqc_nvm_update *cmd =
1296                 (struct i40e_aqc_nvm_update *)&desc.params.raw;
1297         i40e_status status;
1298
1299         /* In offset the highest byte must be zeroed. */
1300         if (offset & 0xFF000000) {
1301                 status = I40E_ERR_PARAM;
1302                 goto i40e_aq_read_nvm_exit;
1303         }
1304
1305         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
1306
1307         /* If this is the last command in a series, set the proper flag. */
1308         if (last_command)
1309                 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
1310         cmd->module_pointer = module_pointer;
1311         cmd->offset = cpu_to_le32(offset);
1312         cmd->length = cpu_to_le16(length);
1313
1314         desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
1315         if (length > I40E_AQ_LARGE_BUF)
1316                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1317
1318         status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
1319
1320 i40e_aq_read_nvm_exit:
1321         return status;
1322 }
1323
1324 #define I40E_DEV_FUNC_CAP_SWITCH_MODE   0x01
1325 #define I40E_DEV_FUNC_CAP_MGMT_MODE     0x02
1326 #define I40E_DEV_FUNC_CAP_NPAR          0x03
1327 #define I40E_DEV_FUNC_CAP_OS2BMC        0x04
1328 #define I40E_DEV_FUNC_CAP_VALID_FUNC    0x05
1329 #define I40E_DEV_FUNC_CAP_SRIOV_1_1     0x12
1330 #define I40E_DEV_FUNC_CAP_VF            0x13
1331 #define I40E_DEV_FUNC_CAP_VMDQ          0x14
1332 #define I40E_DEV_FUNC_CAP_802_1_QBG     0x15
1333 #define I40E_DEV_FUNC_CAP_802_1_QBH     0x16
1334 #define I40E_DEV_FUNC_CAP_VSI           0x17
1335 #define I40E_DEV_FUNC_CAP_DCB           0x18
1336 #define I40E_DEV_FUNC_CAP_FCOE          0x21
1337 #define I40E_DEV_FUNC_CAP_RSS           0x40
1338 #define I40E_DEV_FUNC_CAP_RX_QUEUES     0x41
1339 #define I40E_DEV_FUNC_CAP_TX_QUEUES     0x42
1340 #define I40E_DEV_FUNC_CAP_MSIX          0x43
1341 #define I40E_DEV_FUNC_CAP_MSIX_VF       0x44
1342 #define I40E_DEV_FUNC_CAP_FLOW_DIRECTOR 0x45
1343 #define I40E_DEV_FUNC_CAP_IEEE_1588     0x46
1344 #define I40E_DEV_FUNC_CAP_MFP_MODE_1    0xF1
1345 #define I40E_DEV_FUNC_CAP_CEM           0xF2
1346 #define I40E_DEV_FUNC_CAP_IWARP         0x51
1347 #define I40E_DEV_FUNC_CAP_LED           0x61
1348 #define I40E_DEV_FUNC_CAP_SDP           0x62
1349 #define I40E_DEV_FUNC_CAP_MDIO          0x63
1350
1351 /**
1352  * i40e_parse_discover_capabilities
1353  * @hw: pointer to the hw struct
1354  * @buff: pointer to a buffer containing device/function capability records
1355  * @cap_count: number of capability records in the list
1356  * @list_type_opc: type of capabilities list to parse
1357  *
1358  * Parse the device/function capabilities list.
1359  **/
1360 static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
1361                                      u32 cap_count,
1362                                      enum i40e_admin_queue_opc list_type_opc)
1363 {
1364         struct i40e_aqc_list_capabilities_element_resp *cap;
1365         u32 number, logical_id, phys_id;
1366         struct i40e_hw_capabilities *p;
1367         u32 reg_val;
1368         u32 i = 0;
1369         u16 id;
1370
1371         cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
1372
1373         if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
1374                 p = (struct i40e_hw_capabilities *)&hw->dev_caps;
1375         else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
1376                 p = (struct i40e_hw_capabilities *)&hw->func_caps;
1377         else
1378                 return;
1379
1380         for (i = 0; i < cap_count; i++, cap++) {
1381                 id = le16_to_cpu(cap->id);
1382                 number = le32_to_cpu(cap->number);
1383                 logical_id = le32_to_cpu(cap->logical_id);
1384                 phys_id = le32_to_cpu(cap->phys_id);
1385
1386                 switch (id) {
1387                 case I40E_DEV_FUNC_CAP_SWITCH_MODE:
1388                         p->switch_mode = number;
1389                         break;
1390                 case I40E_DEV_FUNC_CAP_MGMT_MODE:
1391                         p->management_mode = number;
1392                         break;
1393                 case I40E_DEV_FUNC_CAP_NPAR:
1394                         p->npar_enable = number;
1395                         break;
1396                 case I40E_DEV_FUNC_CAP_OS2BMC:
1397                         p->os2bmc = number;
1398                         break;
1399                 case I40E_DEV_FUNC_CAP_VALID_FUNC:
1400                         p->valid_functions = number;
1401                         break;
1402                 case I40E_DEV_FUNC_CAP_SRIOV_1_1:
1403                         if (number == 1)
1404                                 p->sr_iov_1_1 = true;
1405                         break;
1406                 case I40E_DEV_FUNC_CAP_VF:
1407                         p->num_vfs = number;
1408                         p->vf_base_id = logical_id;
1409                         break;
1410                 case I40E_DEV_FUNC_CAP_VMDQ:
1411                         if (number == 1)
1412                                 p->vmdq = true;
1413                         break;
1414                 case I40E_DEV_FUNC_CAP_802_1_QBG:
1415                         if (number == 1)
1416                                 p->evb_802_1_qbg = true;
1417                         break;
1418                 case I40E_DEV_FUNC_CAP_802_1_QBH:
1419                         if (number == 1)
1420                                 p->evb_802_1_qbh = true;
1421                         break;
1422                 case I40E_DEV_FUNC_CAP_VSI:
1423                         p->num_vsis = number;
1424                         break;
1425                 case I40E_DEV_FUNC_CAP_DCB:
1426                         if (number == 1) {
1427                                 p->dcb = true;
1428                                 p->enabled_tcmap = logical_id;
1429                                 p->maxtc = phys_id;
1430                         }
1431                         break;
1432                 case I40E_DEV_FUNC_CAP_FCOE:
1433                         if (number == 1)
1434                                 p->fcoe = true;
1435                         break;
1436                 case I40E_DEV_FUNC_CAP_RSS:
1437                         p->rss = true;
1438                         reg_val = rd32(hw, I40E_PFQF_CTL_0);
1439                         if (reg_val & I40E_PFQF_CTL_0_HASHLUTSIZE_MASK)
1440                                 p->rss_table_size = number;
1441                         else
1442                                 p->rss_table_size = 128;
1443                         p->rss_table_entry_width = logical_id;
1444                         break;
1445                 case I40E_DEV_FUNC_CAP_RX_QUEUES:
1446                         p->num_rx_qp = number;
1447                         p->base_queue = phys_id;
1448                         break;
1449                 case I40E_DEV_FUNC_CAP_TX_QUEUES:
1450                         p->num_tx_qp = number;
1451                         p->base_queue = phys_id;
1452                         break;
1453                 case I40E_DEV_FUNC_CAP_MSIX:
1454                         p->num_msix_vectors = number;
1455                         break;
1456                 case I40E_DEV_FUNC_CAP_MSIX_VF:
1457                         p->num_msix_vectors_vf = number;
1458                         break;
1459                 case I40E_DEV_FUNC_CAP_MFP_MODE_1:
1460                         if (number == 1)
1461                                 p->mfp_mode_1 = true;
1462                         break;
1463                 case I40E_DEV_FUNC_CAP_CEM:
1464                         if (number == 1)
1465                                 p->mgmt_cem = true;
1466                         break;
1467                 case I40E_DEV_FUNC_CAP_IWARP:
1468                         if (number == 1)
1469                                 p->iwarp = true;
1470                         break;
1471                 case I40E_DEV_FUNC_CAP_LED:
1472                         if (phys_id < I40E_HW_CAP_MAX_GPIO)
1473                                 p->led[phys_id] = true;
1474                         break;
1475                 case I40E_DEV_FUNC_CAP_SDP:
1476                         if (phys_id < I40E_HW_CAP_MAX_GPIO)
1477                                 p->sdp[phys_id] = true;
1478                         break;
1479                 case I40E_DEV_FUNC_CAP_MDIO:
1480                         if (number == 1) {
1481                                 p->mdio_port_num = phys_id;
1482                                 p->mdio_port_mode = logical_id;
1483                         }
1484                         break;
1485                 case I40E_DEV_FUNC_CAP_IEEE_1588:
1486                         if (number == 1)
1487                                 p->ieee_1588 = true;
1488                         break;
1489                 case I40E_DEV_FUNC_CAP_FLOW_DIRECTOR:
1490                         p->fd = true;
1491                         p->fd_filters_guaranteed = number;
1492                         p->fd_filters_best_effort = logical_id;
1493                         break;
1494                 default:
1495                         break;
1496                 }
1497         }
1498
1499         /* additional HW specific goodies that might
1500          * someday be HW version specific
1501          */
1502         p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
1503 }
1504
1505 /**
1506  * i40e_aq_discover_capabilities
1507  * @hw: pointer to the hw struct
1508  * @buff: a virtual buffer to hold the capabilities
1509  * @buff_size: Size of the virtual buffer
1510  * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
1511  * @list_type_opc: capabilities type to discover - pass in the command opcode
1512  * @cmd_details: pointer to command details structure or NULL
1513  *
1514  * Get the device capabilities descriptions from the firmware
1515  **/
1516 i40e_status i40e_aq_discover_capabilities(struct i40e_hw *hw,
1517                                 void *buff, u16 buff_size, u16 *data_size,
1518                                 enum i40e_admin_queue_opc list_type_opc,
1519                                 struct i40e_asq_cmd_details *cmd_details)
1520 {
1521         struct i40e_aqc_list_capabilites *cmd;
1522         i40e_status status = 0;
1523         struct i40e_aq_desc desc;
1524
1525         cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
1526
1527         if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
1528                 list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
1529                 status = I40E_ERR_PARAM;
1530                 goto exit;
1531         }
1532
1533         i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
1534
1535         desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
1536         if (buff_size > I40E_AQ_LARGE_BUF)
1537                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1538
1539         status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
1540         *data_size = le16_to_cpu(desc.datalen);
1541
1542         if (status)
1543                 goto exit;
1544
1545         i40e_parse_discover_capabilities(hw, buff, le32_to_cpu(cmd->count),
1546                                          list_type_opc);
1547
1548 exit:
1549         return status;
1550 }
1551
1552 /**
1553  * i40e_aq_get_lldp_mib
1554  * @hw: pointer to the hw struct
1555  * @bridge_type: type of bridge requested
1556  * @mib_type: Local, Remote or both Local and Remote MIBs
1557  * @buff: pointer to a user supplied buffer to store the MIB block
1558  * @buff_size: size of the buffer (in bytes)
1559  * @local_len : length of the returned Local LLDP MIB
1560  * @remote_len: length of the returned Remote LLDP MIB
1561  * @cmd_details: pointer to command details structure or NULL
1562  *
1563  * Requests the complete LLDP MIB (entire packet).
1564  **/
1565 i40e_status i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
1566                                 u8 mib_type, void *buff, u16 buff_size,
1567                                 u16 *local_len, u16 *remote_len,
1568                                 struct i40e_asq_cmd_details *cmd_details)
1569 {
1570         struct i40e_aq_desc desc;
1571         struct i40e_aqc_lldp_get_mib *cmd =
1572                 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
1573         struct i40e_aqc_lldp_get_mib *resp =
1574                 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
1575         i40e_status status;
1576
1577         if (buff_size == 0 || !buff)
1578                 return I40E_ERR_PARAM;
1579
1580         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
1581         /* Indirect Command */
1582         desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
1583
1584         cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
1585         cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
1586                        I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
1587
1588         desc.datalen = cpu_to_le16(buff_size);
1589
1590         desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
1591         if (buff_size > I40E_AQ_LARGE_BUF)
1592                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1593
1594         status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
1595         if (!status) {
1596                 if (local_len != NULL)
1597                         *local_len = le16_to_cpu(resp->local_len);
1598                 if (remote_len != NULL)
1599                         *remote_len = le16_to_cpu(resp->remote_len);
1600         }
1601
1602         return status;
1603 }
1604
1605 /**
1606  * i40e_aq_cfg_lldp_mib_change_event
1607  * @hw: pointer to the hw struct
1608  * @enable_update: Enable or Disable event posting
1609  * @cmd_details: pointer to command details structure or NULL
1610  *
1611  * Enable or Disable posting of an event on ARQ when LLDP MIB
1612  * associated with the interface changes
1613  **/
1614 i40e_status i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
1615                                 bool enable_update,
1616                                 struct i40e_asq_cmd_details *cmd_details)
1617 {
1618         struct i40e_aq_desc desc;
1619         struct i40e_aqc_lldp_update_mib *cmd =
1620                 (struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
1621         i40e_status status;
1622
1623         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
1624
1625         if (!enable_update)
1626                 cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
1627
1628         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1629
1630         return status;
1631 }
1632
1633 /**
1634  * i40e_aq_stop_lldp
1635  * @hw: pointer to the hw struct
1636  * @shutdown_agent: True if LLDP Agent needs to be Shutdown
1637  * @cmd_details: pointer to command details structure or NULL
1638  *
1639  * Stop or Shutdown the embedded LLDP Agent
1640  **/
1641 i40e_status i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
1642                                 struct i40e_asq_cmd_details *cmd_details)
1643 {
1644         struct i40e_aq_desc desc;
1645         struct i40e_aqc_lldp_stop *cmd =
1646                 (struct i40e_aqc_lldp_stop *)&desc.params.raw;
1647         i40e_status status;
1648
1649         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
1650
1651         if (shutdown_agent)
1652                 cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
1653
1654         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1655
1656         return status;
1657 }
1658
1659 /**
1660  * i40e_aq_start_lldp
1661  * @hw: pointer to the hw struct
1662  * @cmd_details: pointer to command details structure or NULL
1663  *
1664  * Start the embedded LLDP Agent on all ports.
1665  **/
1666 i40e_status i40e_aq_start_lldp(struct i40e_hw *hw,
1667                                 struct i40e_asq_cmd_details *cmd_details)
1668 {
1669         struct i40e_aq_desc desc;
1670         struct i40e_aqc_lldp_start *cmd =
1671                 (struct i40e_aqc_lldp_start *)&desc.params.raw;
1672         i40e_status status;
1673
1674         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
1675
1676         cmd->command = I40E_AQ_LLDP_AGENT_START;
1677
1678         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1679
1680         return status;
1681 }
1682
1683 /**
1684  * i40e_aq_delete_element - Delete switch element
1685  * @hw: pointer to the hw struct
1686  * @seid: the SEID to delete from the switch
1687  * @cmd_details: pointer to command details structure or NULL
1688  *
1689  * This deletes a switch element from the switch.
1690  **/
1691 i40e_status i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
1692                                 struct i40e_asq_cmd_details *cmd_details)
1693 {
1694         struct i40e_aq_desc desc;
1695         struct i40e_aqc_switch_seid *cmd =
1696                 (struct i40e_aqc_switch_seid *)&desc.params.raw;
1697         i40e_status status;
1698
1699         if (seid == 0)
1700                 return I40E_ERR_PARAM;
1701
1702         i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
1703
1704         cmd->seid = cpu_to_le16(seid);
1705
1706         status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1707
1708         return status;
1709 }
1710
1711 /**
1712  * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
1713  * @hw: pointer to the hw struct
1714  * @seid: seid for the physical port/switching component/vsi
1715  * @buff: Indirect buffer to hold data parameters and response
1716  * @buff_size: Indirect buffer size
1717  * @opcode: Tx scheduler AQ command opcode
1718  * @cmd_details: pointer to command details structure or NULL
1719  *
1720  * Generic command handler for Tx scheduler AQ commands
1721  **/
1722 static i40e_status i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
1723                                 void *buff, u16 buff_size,
1724                                  enum i40e_admin_queue_opc opcode,
1725                                 struct i40e_asq_cmd_details *cmd_details)
1726 {
1727         struct i40e_aq_desc desc;
1728         struct i40e_aqc_tx_sched_ind *cmd =
1729                 (struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
1730         i40e_status status;
1731         bool cmd_param_flag = false;
1732
1733         switch (opcode) {
1734         case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
1735         case i40e_aqc_opc_configure_vsi_tc_bw:
1736         case i40e_aqc_opc_enable_switching_comp_ets:
1737         case i40e_aqc_opc_modify_switching_comp_ets:
1738         case i40e_aqc_opc_disable_switching_comp_ets:
1739         case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
1740         case i40e_aqc_opc_configure_switching_comp_bw_config:
1741                 cmd_param_flag = true;
1742                 break;
1743         case i40e_aqc_opc_query_vsi_bw_config:
1744         case i40e_aqc_opc_query_vsi_ets_sla_config:
1745         case i40e_aqc_opc_query_switching_comp_ets_config:
1746         case i40e_aqc_opc_query_port_ets_config:
1747         case i40e_aqc_opc_query_switching_comp_bw_config:
1748                 cmd_param_flag = false;
1749                 break;
1750         default:
1751                 return I40E_ERR_PARAM;
1752         }
1753
1754         i40e_fill_default_direct_cmd_desc(&desc, opcode);
1755
1756         /* Indirect command */
1757         desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_BUF);
1758         if (cmd_param_flag)
1759                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_RD);
1760         if (buff_size > I40E_AQ_LARGE_BUF)
1761                 desc.flags |= cpu_to_le16((u16)I40E_AQ_FLAG_LB);
1762
1763         desc.datalen = cpu_to_le16(buff_size);
1764
1765         cmd->vsi_seid = cpu_to_le16(seid);
1766
1767         status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
1768
1769         return status;
1770 }
1771
1772 /**
1773  * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
1774  * @hw: pointer to the hw struct
1775  * @seid: VSI seid
1776  * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
1777  * @cmd_details: pointer to command details structure or NULL
1778  **/
1779 i40e_status i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
1780                         u16 seid,
1781                         struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
1782                         struct i40e_asq_cmd_details *cmd_details)
1783 {
1784         return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
1785                                     i40e_aqc_opc_configure_vsi_tc_bw,
1786                                     cmd_details);
1787 }
1788
1789 /**
1790  * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
1791  * @hw: pointer to the hw struct
1792  * @seid: seid of the VSI
1793  * @bw_data: Buffer to hold VSI BW configuration
1794  * @cmd_details: pointer to command details structure or NULL
1795  **/
1796 i40e_status i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
1797                         u16 seid,
1798                         struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
1799                         struct i40e_asq_cmd_details *cmd_details)
1800 {
1801         return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
1802                                     i40e_aqc_opc_query_vsi_bw_config,
1803                                     cmd_details);
1804 }
1805
1806 /**
1807  * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
1808  * @hw: pointer to the hw struct
1809  * @seid: seid of the VSI
1810  * @bw_data: Buffer to hold VSI BW configuration per TC
1811  * @cmd_details: pointer to command details structure or NULL
1812  **/
1813 i40e_status i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
1814                         u16 seid,
1815                         struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
1816                         struct i40e_asq_cmd_details *cmd_details)
1817 {
1818         return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
1819                                     i40e_aqc_opc_query_vsi_ets_sla_config,
1820                                     cmd_details);
1821 }
1822
1823 /**
1824  * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
1825  * @hw: pointer to the hw struct
1826  * @seid: seid of the switching component
1827  * @bw_data: Buffer to hold switching component's per TC BW config
1828  * @cmd_details: pointer to command details structure or NULL
1829  **/
1830 i40e_status i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
1831                 u16 seid,
1832                 struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
1833                 struct i40e_asq_cmd_details *cmd_details)
1834 {
1835         return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
1836                                    i40e_aqc_opc_query_switching_comp_ets_config,
1837                                    cmd_details);
1838 }
1839
1840 /**
1841  * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
1842  * @hw: pointer to the hw struct
1843  * @seid: seid of the VSI or switching component connected to Physical Port
1844  * @bw_data: Buffer to hold current ETS configuration for the Physical Port
1845  * @cmd_details: pointer to command details structure or NULL
1846  **/
1847 i40e_status i40e_aq_query_port_ets_config(struct i40e_hw *hw,
1848                         u16 seid,
1849                         struct i40e_aqc_query_port_ets_config_resp *bw_data,
1850                         struct i40e_asq_cmd_details *cmd_details)
1851 {
1852         return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
1853                                     i40e_aqc_opc_query_port_ets_config,
1854                                     cmd_details);
1855 }
1856
1857 /**
1858  * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
1859  * @hw: pointer to the hw struct
1860  * @seid: seid of the switching component
1861  * @bw_data: Buffer to hold switching component's BW configuration
1862  * @cmd_details: pointer to command details structure or NULL
1863  **/
1864 i40e_status i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
1865                 u16 seid,
1866                 struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
1867                 struct i40e_asq_cmd_details *cmd_details)
1868 {
1869         return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
1870                                     i40e_aqc_opc_query_switching_comp_bw_config,
1871                                     cmd_details);
1872 }
1873
1874 /**
1875  * i40e_validate_filter_settings
1876  * @hw: pointer to the hardware structure
1877  * @settings: Filter control settings
1878  *
1879  * Check and validate the filter control settings passed.
1880  * The function checks for the valid filter/context sizes being
1881  * passed for FCoE and PE.
1882  *
1883  * Returns 0 if the values passed are valid and within
1884  * range else returns an error.
1885  **/
1886 static i40e_status i40e_validate_filter_settings(struct i40e_hw *hw,
1887                                 struct i40e_filter_control_settings *settings)
1888 {
1889         u32 fcoe_cntx_size, fcoe_filt_size;
1890         u32 pe_cntx_size, pe_filt_size;
1891         u32 fcoe_fmax, pe_fmax;
1892         u32 val;
1893
1894         /* Validate FCoE settings passed */
1895         switch (settings->fcoe_filt_num) {
1896         case I40E_HASH_FILTER_SIZE_1K:
1897         case I40E_HASH_FILTER_SIZE_2K:
1898         case I40E_HASH_FILTER_SIZE_4K:
1899         case I40E_HASH_FILTER_SIZE_8K:
1900         case I40E_HASH_FILTER_SIZE_16K:
1901         case I40E_HASH_FILTER_SIZE_32K:
1902                 fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
1903                 fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
1904                 break;
1905         default:
1906                 return I40E_ERR_PARAM;
1907         }
1908
1909         switch (settings->fcoe_cntx_num) {
1910         case I40E_DMA_CNTX_SIZE_512:
1911         case I40E_DMA_CNTX_SIZE_1K:
1912         case I40E_DMA_CNTX_SIZE_2K:
1913         case I40E_DMA_CNTX_SIZE_4K:
1914                 fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
1915                 fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
1916                 break;
1917         default:
1918                 return I40E_ERR_PARAM;
1919         }
1920
1921         /* Validate PE settings passed */
1922         switch (settings->pe_filt_num) {
1923         case I40E_HASH_FILTER_SIZE_1K:
1924         case I40E_HASH_FILTER_SIZE_2K:
1925         case I40E_HASH_FILTER_SIZE_4K:
1926         case I40E_HASH_FILTER_SIZE_8K:
1927         case I40E_HASH_FILTER_SIZE_16K:
1928         case I40E_HASH_FILTER_SIZE_32K:
1929         case I40E_HASH_FILTER_SIZE_64K:
1930         case I40E_HASH_FILTER_SIZE_128K:
1931         case I40E_HASH_FILTER_SIZE_256K:
1932         case I40E_HASH_FILTER_SIZE_512K:
1933         case I40E_HASH_FILTER_SIZE_1M:
1934                 pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
1935                 pe_filt_size <<= (u32)settings->pe_filt_num;
1936                 break;
1937         default:
1938                 return I40E_ERR_PARAM;
1939         }
1940
1941         switch (settings->pe_cntx_num) {
1942         case I40E_DMA_CNTX_SIZE_512:
1943         case I40E_DMA_CNTX_SIZE_1K:
1944         case I40E_DMA_CNTX_SIZE_2K:
1945         case I40E_DMA_CNTX_SIZE_4K:
1946         case I40E_DMA_CNTX_SIZE_8K:
1947         case I40E_DMA_CNTX_SIZE_16K:
1948         case I40E_DMA_CNTX_SIZE_32K:
1949         case I40E_DMA_CNTX_SIZE_64K:
1950         case I40E_DMA_CNTX_SIZE_128K:
1951         case I40E_DMA_CNTX_SIZE_256K:
1952                 pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
1953                 pe_cntx_size <<= (u32)settings->pe_cntx_num;
1954                 break;
1955         default:
1956                 return I40E_ERR_PARAM;
1957         }
1958
1959         /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
1960         val = rd32(hw, I40E_GLHMC_FCOEFMAX);
1961         fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
1962                      >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
1963         if (fcoe_filt_size + fcoe_cntx_size >  fcoe_fmax)
1964                 return I40E_ERR_INVALID_SIZE;
1965
1966         /* PEHSIZE + PEDSIZE should not be greater than PMPEXFMAX */
1967         val = rd32(hw, I40E_GLHMC_PEXFMAX);
1968         pe_fmax = (val & I40E_GLHMC_PEXFMAX_PMPEXFMAX_MASK)
1969                    >> I40E_GLHMC_PEXFMAX_PMPEXFMAX_SHIFT;
1970         if (pe_filt_size + pe_cntx_size >  pe_fmax)
1971                 return I40E_ERR_INVALID_SIZE;
1972
1973         return 0;
1974 }
1975
1976 /**
1977  * i40e_set_filter_control
1978  * @hw: pointer to the hardware structure
1979  * @settings: Filter control settings
1980  *
1981  * Set the Queue Filters for PE/FCoE and enable filters required
1982  * for a single PF. It is expected that these settings are programmed
1983  * at the driver initialization time.
1984  **/
1985 i40e_status i40e_set_filter_control(struct i40e_hw *hw,
1986                                 struct i40e_filter_control_settings *settings)
1987 {
1988         i40e_status ret = 0;
1989         u32 hash_lut_size = 0;
1990         u32 val;
1991
1992         if (!settings)
1993                 return I40E_ERR_PARAM;
1994
1995         /* Validate the input settings */
1996         ret = i40e_validate_filter_settings(hw, settings);
1997         if (ret)
1998                 return ret;
1999
2000         /* Read the PF Queue Filter control register */
2001         val = rd32(hw, I40E_PFQF_CTL_0);
2002
2003         /* Program required PE hash buckets for the PF */
2004         val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
2005         val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
2006                 I40E_PFQF_CTL_0_PEHSIZE_MASK;
2007         /* Program required PE contexts for the PF */
2008         val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
2009         val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
2010                 I40E_PFQF_CTL_0_PEDSIZE_MASK;
2011
2012         /* Program required FCoE hash buckets for the PF */
2013         val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
2014         val |= ((u32)settings->fcoe_filt_num <<
2015                         I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
2016                 I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
2017         /* Program required FCoE DDP contexts for the PF */
2018         val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
2019         val |= ((u32)settings->fcoe_cntx_num <<
2020                         I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
2021                 I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
2022
2023         /* Program Hash LUT size for the PF */
2024         val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
2025         if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
2026                 hash_lut_size = 1;
2027         val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
2028                 I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
2029
2030         /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
2031         if (settings->enable_fdir)
2032                 val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
2033         if (settings->enable_ethtype)
2034                 val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
2035         if (settings->enable_macvlan)
2036                 val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
2037
2038         wr32(hw, I40E_PFQF_CTL_0, val);
2039
2040         return 0;
2041 }