]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
qlcnic: Enable Tx queue changes using ethtool for 82xx Series adapter.
[karo-tx-linux.git] / drivers / net / ethernet / qlogic / qlcnic / qlcnic_main.c
1 /*
2  * QLogic qlcnic NIC Driver
3  * Copyright (c) 2009-2013 QLogic Corporation
4  *
5  * See LICENSE.qlcnic for copyright and licensing details.
6  */
7
8 #include <linux/vmalloc.h>
9 #include <linux/interrupt.h>
10
11 #include "qlcnic.h"
12 #include "qlcnic_sriov.h"
13 #include "qlcnic_hw.h"
14
15 #include <linux/swab.h>
16 #include <linux/dma-mapping.h>
17 #include <linux/if_vlan.h>
18 #include <net/ip.h>
19 #include <linux/ipv6.h>
20 #include <linux/inetdevice.h>
21 #include <linux/aer.h>
22 #include <linux/log2.h>
23 #include <linux/pci.h>
24
25 MODULE_DESCRIPTION("QLogic 1/10 GbE Converged/Intelligent Ethernet Driver");
26 MODULE_LICENSE("GPL");
27 MODULE_VERSION(QLCNIC_LINUX_VERSIONID);
28 MODULE_FIRMWARE(QLCNIC_UNIFIED_ROMIMAGE_NAME);
29
30 char qlcnic_driver_name[] = "qlcnic";
31 static const char qlcnic_driver_string[] = "QLogic 1/10 GbE "
32         "Converged/Intelligent Ethernet Driver v" QLCNIC_LINUX_VERSIONID;
33
34 static int qlcnic_mac_learn;
35 module_param(qlcnic_mac_learn, int, 0444);
36 MODULE_PARM_DESC(qlcnic_mac_learn,
37                  "Mac Filter (0=learning is disabled, 1=Driver learning is enabled, 2=FDB learning is enabled)");
38
39 int qlcnic_use_msi = 1;
40 MODULE_PARM_DESC(use_msi, "MSI interrupt (0=disabled, 1=enabled)");
41 module_param_named(use_msi, qlcnic_use_msi, int, 0444);
42
43 int qlcnic_use_msi_x = 1;
44 MODULE_PARM_DESC(use_msi_x, "MSI-X interrupt (0=disabled, 1=enabled)");
45 module_param_named(use_msi_x, qlcnic_use_msi_x, int, 0444);
46
47 int qlcnic_auto_fw_reset = 1;
48 MODULE_PARM_DESC(auto_fw_reset, "Auto firmware reset (0=disabled, 1=enabled)");
49 module_param_named(auto_fw_reset, qlcnic_auto_fw_reset, int, 0644);
50
51 int qlcnic_load_fw_file;
52 MODULE_PARM_DESC(load_fw_file, "Load firmware from (0=flash, 1=file)");
53 module_param_named(load_fw_file, qlcnic_load_fw_file, int, 0444);
54
55 static int qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
56 static void qlcnic_remove(struct pci_dev *pdev);
57 static int qlcnic_open(struct net_device *netdev);
58 static int qlcnic_close(struct net_device *netdev);
59 static void qlcnic_tx_timeout(struct net_device *netdev);
60 static void qlcnic_attach_work(struct work_struct *work);
61 static void qlcnic_fwinit_work(struct work_struct *work);
62 #ifdef CONFIG_NET_POLL_CONTROLLER
63 static void qlcnic_poll_controller(struct net_device *netdev);
64 #endif
65
66 static void qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding);
67 static int qlcnic_can_start_firmware(struct qlcnic_adapter *adapter);
68
69 static irqreturn_t qlcnic_tmp_intr(int irq, void *data);
70 static irqreturn_t qlcnic_intr(int irq, void *data);
71 static irqreturn_t qlcnic_msi_intr(int irq, void *data);
72 static irqreturn_t qlcnic_msix_intr(int irq, void *data);
73 static irqreturn_t qlcnic_msix_tx_intr(int irq, void *data);
74
75 static struct net_device_stats *qlcnic_get_stats(struct net_device *netdev);
76 static int qlcnic_start_firmware(struct qlcnic_adapter *);
77
78 static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter);
79 static void qlcnic_dev_set_npar_ready(struct qlcnic_adapter *);
80 static int qlcnicvf_start_firmware(struct qlcnic_adapter *);
81 static int qlcnic_vlan_rx_add(struct net_device *, __be16, u16);
82 static int qlcnic_vlan_rx_del(struct net_device *, __be16, u16);
83
84 static u32 qlcnic_vlan_tx_check(struct qlcnic_adapter *adapter)
85 {
86         struct qlcnic_hardware_context *ahw = adapter->ahw;
87
88         if (adapter->pdev->device == PCI_DEVICE_ID_QLOGIC_QLE824X)
89                 return ahw->capabilities & QLCNIC_FW_CAPABILITY_FVLANTX;
90         else
91                 return 1;
92 }
93
94 /*  PCI Device ID Table  */
95 #define ENTRY(device) \
96         {PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, (device)), \
97         .class = PCI_CLASS_NETWORK_ETHERNET << 8, .class_mask = ~0}
98
99 static DEFINE_PCI_DEVICE_TABLE(qlcnic_pci_tbl) = {
100         ENTRY(PCI_DEVICE_ID_QLOGIC_QLE824X),
101         ENTRY(PCI_DEVICE_ID_QLOGIC_QLE834X),
102         ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE834X),
103         ENTRY(PCI_DEVICE_ID_QLOGIC_QLE844X),
104         ENTRY(PCI_DEVICE_ID_QLOGIC_VF_QLE844X),
105         {0,}
106 };
107
108 MODULE_DEVICE_TABLE(pci, qlcnic_pci_tbl);
109
110
111 inline void qlcnic_update_cmd_producer(struct qlcnic_host_tx_ring *tx_ring)
112 {
113         writel(tx_ring->producer, tx_ring->crb_cmd_producer);
114 }
115
116 static const u32 msi_tgt_status[8] = {
117         ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1,
118         ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3,
119         ISR_INT_TARGET_STATUS_F4, ISR_INT_TARGET_STATUS_F5,
120         ISR_INT_TARGET_STATUS_F6, ISR_INT_TARGET_STATUS_F7
121 };
122
123 static const u32 qlcnic_reg_tbl[] = {
124         0x1B20A8,       /* PEG_HALT_STAT1 */
125         0x1B20AC,       /* PEG_HALT_STAT2 */
126         0x1B20B0,       /* FW_HEARTBEAT */
127         0x1B2100,       /* LOCK ID */
128         0x1B2128,       /* FW_CAPABILITIES */
129         0x1B2138,       /* drv active */
130         0x1B2140,       /* dev state */
131         0x1B2144,       /* drv state */
132         0x1B2148,       /* drv scratch */
133         0x1B214C,       /* dev partition info */
134         0x1B2174,       /* drv idc ver */
135         0x1B2150,       /* fw version major */
136         0x1B2154,       /* fw version minor */
137         0x1B2158,       /* fw version sub */
138         0x1B219C,       /* npar state */
139         0x1B21FC,       /* FW_IMG_VALID */
140         0x1B2250,       /* CMD_PEG_STATE */
141         0x1B233C,       /* RCV_PEG_STATE */
142         0x1B23B4,       /* ASIC TEMP */
143         0x1B216C,       /* FW api */
144         0x1B2170,       /* drv op mode */
145         0x13C010,       /* flash lock */
146         0x13C014,       /* flash unlock */
147 };
148
149 static const struct qlcnic_board_info qlcnic_boards[] = {
150         { PCI_VENDOR_ID_QLOGIC,
151           PCI_DEVICE_ID_QLOGIC_QLE844X,
152           0x0,
153           0x0,
154           "8400 series 10GbE Converged Network Adapter (TCP/IP Networking)" },
155         { PCI_VENDOR_ID_QLOGIC,
156           PCI_DEVICE_ID_QLOGIC_QLE834X,
157           PCI_VENDOR_ID_QLOGIC,
158           0x24e,
159           "8300 Series Dual Port 10GbE Converged Network Adapter "
160           "(TCP/IP Networking)" },
161         { PCI_VENDOR_ID_QLOGIC,
162           PCI_DEVICE_ID_QLOGIC_QLE834X,
163           PCI_VENDOR_ID_QLOGIC,
164           0x243,
165           "8300 Series Single Port 10GbE Converged Network Adapter "
166           "(TCP/IP Networking)" },
167         { PCI_VENDOR_ID_QLOGIC,
168           PCI_DEVICE_ID_QLOGIC_QLE834X,
169           PCI_VENDOR_ID_QLOGIC,
170           0x24a,
171           "8300 Series Dual Port 10GbE Converged Network Adapter "
172           "(TCP/IP Networking)" },
173         { PCI_VENDOR_ID_QLOGIC,
174           PCI_DEVICE_ID_QLOGIC_QLE834X,
175           PCI_VENDOR_ID_QLOGIC,
176           0x246,
177           "8300 Series Dual Port 10GbE Converged Network Adapter "
178           "(TCP/IP Networking)" },
179         { PCI_VENDOR_ID_QLOGIC,
180           PCI_DEVICE_ID_QLOGIC_QLE834X,
181           PCI_VENDOR_ID_QLOGIC,
182           0x252,
183           "8300 Series Dual Port 10GbE Converged Network Adapter "
184           "(TCP/IP Networking)" },
185         { PCI_VENDOR_ID_QLOGIC,
186           PCI_DEVICE_ID_QLOGIC_QLE834X,
187           PCI_VENDOR_ID_QLOGIC,
188           0x26e,
189           "8300 Series Dual Port 10GbE Converged Network Adapter "
190           "(TCP/IP Networking)" },
191         { PCI_VENDOR_ID_QLOGIC,
192           PCI_DEVICE_ID_QLOGIC_QLE834X,
193           PCI_VENDOR_ID_QLOGIC,
194           0x260,
195           "8300 Series Dual Port 10GbE Converged Network Adapter "
196           "(TCP/IP Networking)" },
197         { PCI_VENDOR_ID_QLOGIC,
198           PCI_DEVICE_ID_QLOGIC_QLE834X,
199           PCI_VENDOR_ID_QLOGIC,
200           0x266,
201           "8300 Series Single Port 10GbE Converged Network Adapter "
202           "(TCP/IP Networking)" },
203         { PCI_VENDOR_ID_QLOGIC,
204           PCI_DEVICE_ID_QLOGIC_QLE834X,
205           PCI_VENDOR_ID_QLOGIC,
206           0x269,
207           "8300 Series Dual Port 10GbE Converged Network Adapter "
208           "(TCP/IP Networking)" },
209         { PCI_VENDOR_ID_QLOGIC,
210           PCI_DEVICE_ID_QLOGIC_QLE834X,
211           PCI_VENDOR_ID_QLOGIC,
212           0x271,
213           "8300 Series Dual Port 10GbE Converged Network Adapter "
214           "(TCP/IP Networking)" },
215         { PCI_VENDOR_ID_QLOGIC,
216           PCI_DEVICE_ID_QLOGIC_QLE834X,
217           0x0, 0x0, "8300 Series 1/10GbE Controller" },
218         { PCI_VENDOR_ID_QLOGIC,
219           PCI_DEVICE_ID_QLOGIC_QLE824X,
220           PCI_VENDOR_ID_QLOGIC,
221           0x203,
222           "8200 Series Single Port 10GbE Converged Network Adapter"
223           "(TCP/IP Networking)" },
224         { PCI_VENDOR_ID_QLOGIC,
225           PCI_DEVICE_ID_QLOGIC_QLE824X,
226           PCI_VENDOR_ID_QLOGIC,
227           0x207,
228           "8200 Series Dual Port 10GbE Converged Network Adapter"
229           "(TCP/IP Networking)" },
230         { PCI_VENDOR_ID_QLOGIC,
231           PCI_DEVICE_ID_QLOGIC_QLE824X,
232           PCI_VENDOR_ID_QLOGIC,
233           0x20b,
234           "3200 Series Dual Port 10Gb Intelligent Ethernet Adapter" },
235         { PCI_VENDOR_ID_QLOGIC,
236           PCI_DEVICE_ID_QLOGIC_QLE824X,
237           PCI_VENDOR_ID_QLOGIC,
238           0x20c,
239           "3200 Series Quad Port 1Gb Intelligent Ethernet Adapter" },
240         { PCI_VENDOR_ID_QLOGIC,
241           PCI_DEVICE_ID_QLOGIC_QLE824X,
242           PCI_VENDOR_ID_QLOGIC,
243           0x20f,
244           "3200 Series Single Port 10Gb Intelligent Ethernet Adapter" },
245         { PCI_VENDOR_ID_QLOGIC,
246           PCI_DEVICE_ID_QLOGIC_QLE824X,
247           0x103c, 0x3733,
248           "NC523SFP 10Gb 2-port Server Adapter" },
249         { PCI_VENDOR_ID_QLOGIC,
250           PCI_DEVICE_ID_QLOGIC_QLE824X,
251           0x103c, 0x3346,
252           "CN1000Q Dual Port Converged Network Adapter" },
253         { PCI_VENDOR_ID_QLOGIC,
254           PCI_DEVICE_ID_QLOGIC_QLE824X,
255           PCI_VENDOR_ID_QLOGIC,
256           0x210,
257           "QME8242-k 10GbE Dual Port Mezzanine Card" },
258         { PCI_VENDOR_ID_QLOGIC,
259           PCI_DEVICE_ID_QLOGIC_QLE824X,
260           0x0, 0x0, "cLOM8214 1/10GbE Controller" },
261 };
262
263 #define NUM_SUPPORTED_BOARDS ARRAY_SIZE(qlcnic_boards)
264
265 static const
266 struct qlcnic_legacy_intr_set legacy_intr[] = QLCNIC_LEGACY_INTR_CONFIG;
267
268 int qlcnic_alloc_sds_rings(struct qlcnic_recv_context *recv_ctx, int count)
269 {
270         int size = sizeof(struct qlcnic_host_sds_ring) * count;
271
272         recv_ctx->sds_rings = kzalloc(size, GFP_KERNEL);
273
274         return recv_ctx->sds_rings == NULL;
275 }
276
277 void qlcnic_free_sds_rings(struct qlcnic_recv_context *recv_ctx)
278 {
279         if (recv_ctx->sds_rings != NULL)
280                 kfree(recv_ctx->sds_rings);
281
282         recv_ctx->sds_rings = NULL;
283 }
284
285 int qlcnic_read_mac_addr(struct qlcnic_adapter *adapter)
286 {
287         u8 mac_addr[ETH_ALEN];
288         struct net_device *netdev = adapter->netdev;
289         struct pci_dev *pdev = adapter->pdev;
290
291         if (qlcnic_get_mac_address(adapter, mac_addr) != 0)
292                 return -EIO;
293
294         memcpy(netdev->dev_addr, mac_addr, ETH_ALEN);
295         memcpy(adapter->mac_addr, netdev->dev_addr, netdev->addr_len);
296
297         /* set station address */
298
299         if (!is_valid_ether_addr(netdev->dev_addr))
300                 dev_warn(&pdev->dev, "Bad MAC address %pM.\n",
301                                         netdev->dev_addr);
302
303         return 0;
304 }
305
306 static void qlcnic_delete_adapter_mac(struct qlcnic_adapter *adapter)
307 {
308         struct qlcnic_mac_list_s *cur;
309         struct list_head *head;
310
311         list_for_each(head, &adapter->mac_list) {
312                 cur = list_entry(head, struct qlcnic_mac_list_s, list);
313                 if (!memcmp(adapter->mac_addr, cur->mac_addr, ETH_ALEN)) {
314                         qlcnic_sre_macaddr_change(adapter, cur->mac_addr,
315                                                   0, QLCNIC_MAC_DEL);
316                         list_del(&cur->list);
317                         kfree(cur);
318                         return;
319                 }
320         }
321 }
322
323 static int qlcnic_set_mac(struct net_device *netdev, void *p)
324 {
325         struct qlcnic_adapter *adapter = netdev_priv(netdev);
326         struct sockaddr *addr = p;
327
328         if (qlcnic_sriov_vf_check(adapter))
329                 return -EINVAL;
330
331         if ((adapter->flags & QLCNIC_MAC_OVERRIDE_DISABLED))
332                 return -EOPNOTSUPP;
333
334         if (!is_valid_ether_addr(addr->sa_data))
335                 return -EINVAL;
336
337         if (!memcmp(adapter->mac_addr, addr->sa_data, ETH_ALEN))
338                 return 0;
339
340         if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
341                 netif_device_detach(netdev);
342                 qlcnic_napi_disable(adapter);
343         }
344
345         qlcnic_delete_adapter_mac(adapter);
346         memcpy(adapter->mac_addr, addr->sa_data, netdev->addr_len);
347         memcpy(netdev->dev_addr, addr->sa_data, netdev->addr_len);
348         qlcnic_set_multi(adapter->netdev);
349
350         if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) {
351                 netif_device_attach(netdev);
352                 qlcnic_napi_enable(adapter);
353         }
354         return 0;
355 }
356
357 static int qlcnic_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
358                         struct net_device *netdev, const unsigned char *addr)
359 {
360         struct qlcnic_adapter *adapter = netdev_priv(netdev);
361         int err = -EOPNOTSUPP;
362
363         if (!adapter->fdb_mac_learn)
364                 return ndo_dflt_fdb_del(ndm, tb, netdev, addr);
365
366         if (adapter->flags & QLCNIC_ESWITCH_ENABLED) {
367                 if (is_unicast_ether_addr(addr)) {
368                         err = dev_uc_del(netdev, addr);
369                         if (!err)
370                                 err = qlcnic_nic_del_mac(adapter, addr);
371                 } else if (is_multicast_ether_addr(addr)) {
372                         err = dev_mc_del(netdev, addr);
373                 } else {
374                         err =  -EINVAL;
375                 }
376         }
377         return err;
378 }
379
380 static int qlcnic_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
381                         struct net_device *netdev,
382                         const unsigned char *addr, u16 flags)
383 {
384         struct qlcnic_adapter *adapter = netdev_priv(netdev);
385         int err = 0;
386
387         if (!adapter->fdb_mac_learn)
388                 return ndo_dflt_fdb_add(ndm, tb, netdev, addr, flags);
389
390         if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
391                 pr_info("%s: FDB e-switch is not enabled\n", __func__);
392                 return -EOPNOTSUPP;
393         }
394
395         if (ether_addr_equal(addr, adapter->mac_addr))
396                 return err;
397
398         if (is_unicast_ether_addr(addr)) {
399                 if (netdev_uc_count(netdev) < adapter->ahw->max_uc_count)
400                         err = dev_uc_add_excl(netdev, addr);
401                 else
402                         err = -ENOMEM;
403         } else if (is_multicast_ether_addr(addr)) {
404                 err = dev_mc_add_excl(netdev, addr);
405         } else {
406                 err = -EINVAL;
407         }
408
409         return err;
410 }
411
412 static int qlcnic_fdb_dump(struct sk_buff *skb, struct netlink_callback *ncb,
413                         struct net_device *netdev, int idx)
414 {
415         struct qlcnic_adapter *adapter = netdev_priv(netdev);
416
417         if (!adapter->fdb_mac_learn)
418                 return ndo_dflt_fdb_dump(skb, ncb, netdev, idx);
419
420         if (adapter->flags & QLCNIC_ESWITCH_ENABLED)
421                 idx = ndo_dflt_fdb_dump(skb, ncb, netdev, idx);
422
423         return idx;
424 }
425
426 static void qlcnic_82xx_cancel_idc_work(struct qlcnic_adapter *adapter)
427 {
428         while (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
429                 usleep_range(10000, 11000);
430
431         cancel_delayed_work_sync(&adapter->fw_work);
432 }
433
434 static const struct net_device_ops qlcnic_netdev_ops = {
435         .ndo_open          = qlcnic_open,
436         .ndo_stop          = qlcnic_close,
437         .ndo_start_xmit    = qlcnic_xmit_frame,
438         .ndo_get_stats     = qlcnic_get_stats,
439         .ndo_validate_addr = eth_validate_addr,
440         .ndo_set_rx_mode   = qlcnic_set_multi,
441         .ndo_set_mac_address    = qlcnic_set_mac,
442         .ndo_change_mtu    = qlcnic_change_mtu,
443         .ndo_fix_features  = qlcnic_fix_features,
444         .ndo_set_features  = qlcnic_set_features,
445         .ndo_tx_timeout    = qlcnic_tx_timeout,
446         .ndo_vlan_rx_add_vid    = qlcnic_vlan_rx_add,
447         .ndo_vlan_rx_kill_vid   = qlcnic_vlan_rx_del,
448         .ndo_fdb_add            = qlcnic_fdb_add,
449         .ndo_fdb_del            = qlcnic_fdb_del,
450         .ndo_fdb_dump           = qlcnic_fdb_dump,
451 #ifdef CONFIG_NET_POLL_CONTROLLER
452         .ndo_poll_controller = qlcnic_poll_controller,
453 #endif
454 #ifdef CONFIG_QLCNIC_SRIOV
455         .ndo_set_vf_mac         = qlcnic_sriov_set_vf_mac,
456         .ndo_set_vf_tx_rate     = qlcnic_sriov_set_vf_tx_rate,
457         .ndo_get_vf_config      = qlcnic_sriov_get_vf_config,
458         .ndo_set_vf_vlan        = qlcnic_sriov_set_vf_vlan,
459         .ndo_set_vf_spoofchk    = qlcnic_sriov_set_vf_spoofchk,
460 #endif
461 };
462
463 static const struct net_device_ops qlcnic_netdev_failed_ops = {
464         .ndo_open          = qlcnic_open,
465 };
466
467 static struct qlcnic_nic_template qlcnic_ops = {
468         .config_bridged_mode    = qlcnic_config_bridged_mode,
469         .config_led             = qlcnic_82xx_config_led,
470         .start_firmware         = qlcnic_82xx_start_firmware,
471         .request_reset          = qlcnic_82xx_dev_request_reset,
472         .cancel_idc_work        = qlcnic_82xx_cancel_idc_work,
473         .napi_add               = qlcnic_82xx_napi_add,
474         .napi_del               = qlcnic_82xx_napi_del,
475         .config_ipaddr          = qlcnic_82xx_config_ipaddr,
476         .shutdown               = qlcnic_82xx_shutdown,
477         .resume                 = qlcnic_82xx_resume,
478         .clear_legacy_intr      = qlcnic_82xx_clear_legacy_intr,
479 };
480
481 struct qlcnic_nic_template qlcnic_vf_ops = {
482         .config_bridged_mode    = qlcnicvf_config_bridged_mode,
483         .config_led             = qlcnicvf_config_led,
484         .start_firmware         = qlcnicvf_start_firmware
485 };
486
487 static struct qlcnic_hardware_ops qlcnic_hw_ops = {
488         .read_crb                       = qlcnic_82xx_read_crb,
489         .write_crb                      = qlcnic_82xx_write_crb,
490         .read_reg                       = qlcnic_82xx_hw_read_wx_2M,
491         .write_reg                      = qlcnic_82xx_hw_write_wx_2M,
492         .get_mac_address                = qlcnic_82xx_get_mac_address,
493         .setup_intr                     = qlcnic_82xx_setup_intr,
494         .alloc_mbx_args                 = qlcnic_82xx_alloc_mbx_args,
495         .mbx_cmd                        = qlcnic_82xx_issue_cmd,
496         .get_func_no                    = qlcnic_82xx_get_func_no,
497         .api_lock                       = qlcnic_82xx_api_lock,
498         .api_unlock                     = qlcnic_82xx_api_unlock,
499         .add_sysfs                      = qlcnic_82xx_add_sysfs,
500         .remove_sysfs                   = qlcnic_82xx_remove_sysfs,
501         .process_lb_rcv_ring_diag       = qlcnic_82xx_process_rcv_ring_diag,
502         .create_rx_ctx                  = qlcnic_82xx_fw_cmd_create_rx_ctx,
503         .create_tx_ctx                  = qlcnic_82xx_fw_cmd_create_tx_ctx,
504         .del_rx_ctx                     = qlcnic_82xx_fw_cmd_del_rx_ctx,
505         .del_tx_ctx                     = qlcnic_82xx_fw_cmd_del_tx_ctx,
506         .setup_link_event               = qlcnic_82xx_linkevent_request,
507         .get_nic_info                   = qlcnic_82xx_get_nic_info,
508         .get_pci_info                   = qlcnic_82xx_get_pci_info,
509         .set_nic_info                   = qlcnic_82xx_set_nic_info,
510         .change_macvlan                 = qlcnic_82xx_sre_macaddr_change,
511         .napi_enable                    = qlcnic_82xx_napi_enable,
512         .napi_disable                   = qlcnic_82xx_napi_disable,
513         .config_intr_coal               = qlcnic_82xx_config_intr_coalesce,
514         .config_rss                     = qlcnic_82xx_config_rss,
515         .config_hw_lro                  = qlcnic_82xx_config_hw_lro,
516         .config_loopback                = qlcnic_82xx_set_lb_mode,
517         .clear_loopback                 = qlcnic_82xx_clear_lb_mode,
518         .config_promisc_mode            = qlcnic_82xx_nic_set_promisc,
519         .change_l2_filter               = qlcnic_82xx_change_filter,
520         .get_board_info                 = qlcnic_82xx_get_board_info,
521         .set_mac_filter_count           = qlcnic_82xx_set_mac_filter_count,
522         .free_mac_list                  = qlcnic_82xx_free_mac_list,
523 };
524
525 static void qlcnic_get_multiq_capability(struct qlcnic_adapter *adapter)
526 {
527         struct qlcnic_hardware_context *ahw = adapter->ahw;
528         int num_tx_q;
529
530         if (ahw->msix_supported &&
531             (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_2_MULTI_TX)) {
532                 num_tx_q = min_t(int, QLCNIC_DEF_NUM_TX_RINGS,
533                                  num_online_cpus());
534                 if (num_tx_q > 1) {
535                         test_and_set_bit(__QLCNIC_MULTI_TX_UNIQUE,
536                                          &adapter->state);
537                         adapter->max_drv_tx_rings = num_tx_q;
538                 }
539         } else {
540                 adapter->max_drv_tx_rings = 1;
541         }
542 }
543
544 int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix)
545 {
546         struct pci_dev *pdev = adapter->pdev;
547         int max_tx_rings, max_sds_rings, tx_vector;
548         int err = -1, i;
549
550         if (adapter->flags & QLCNIC_TX_INTR_SHARED) {
551                 max_tx_rings = 0;
552                 tx_vector = 0;
553         } else {
554                 max_tx_rings = adapter->max_drv_tx_rings;
555                 tx_vector = 1;
556         }
557
558         if (!adapter->msix_entries) {
559                 adapter->msix_entries = kcalloc(num_msix,
560                                                 sizeof(struct msix_entry),
561                                                 GFP_KERNEL);
562                 if (!adapter->msix_entries)
563                         return -ENOMEM;
564         }
565
566         adapter->max_sds_rings = 1;
567         adapter->flags &= ~(QLCNIC_MSI_ENABLED | QLCNIC_MSIX_ENABLED);
568
569         if (adapter->ahw->msix_supported) {
570  enable_msix:
571                 for (i = 0; i < num_msix; i++)
572                         adapter->msix_entries[i].entry = i;
573                 err = pci_enable_msix(pdev, adapter->msix_entries, num_msix);
574                 if (err == 0) {
575                         adapter->flags |= QLCNIC_MSIX_ENABLED;
576                         if (qlcnic_83xx_check(adapter)) {
577                                 adapter->ahw->num_msix = num_msix;
578                                 /* subtract mail box and tx ring vectors */
579                                 adapter->max_sds_rings = num_msix -
580                                                          max_tx_rings - 1;
581                         } else {
582                                 adapter->ahw->num_msix = num_msix;
583                                 if (qlcnic_check_multi_tx(adapter) &&
584                                     (adapter->max_drv_tx_rings > 1))
585                                         max_sds_rings = num_msix - max_tx_rings;
586                                 else
587                                         max_sds_rings = num_msix;
588
589                                 adapter->max_sds_rings = max_sds_rings;
590                         }
591                         dev_info(&pdev->dev, "using msi-x interrupts\n");
592                         return err;
593                 } else if (err > 0) {
594                         dev_info(&pdev->dev,
595                                  "Unable to allocate %d MSI-X interrupt vectors\n",
596                                  num_msix);
597                         if (qlcnic_83xx_check(adapter)) {
598                                 if (err < (QLC_83XX_MINIMUM_VECTOR - tx_vector))
599                                         return err;
600                                 err -= (max_tx_rings + 1);
601                                 num_msix = rounddown_pow_of_two(err);
602                                 num_msix += (max_tx_rings + 1);
603                         } else {
604                                 num_msix = rounddown_pow_of_two(err);
605                                 if (qlcnic_check_multi_tx(adapter))
606                                         num_msix += max_tx_rings;
607                         }
608
609                         if (num_msix) {
610                                 dev_info(&pdev->dev,
611                                          "Trying to allocate %d MSI-X interrupt vectors\n",
612                                          num_msix);
613                                 goto enable_msix;
614                         }
615                 } else {
616                         dev_info(&pdev->dev,
617                                  "Unable to allocate %d MSI-X interrupt vectors\n",
618                                  num_msix);
619                 }
620         }
621
622         return err;
623 }
624
625 static int qlcnic_enable_msi_legacy(struct qlcnic_adapter *adapter)
626 {
627         int err = 0;
628         u32 offset, mask_reg;
629         const struct qlcnic_legacy_intr_set *legacy_intrp;
630         struct qlcnic_hardware_context *ahw = adapter->ahw;
631         struct pci_dev *pdev = adapter->pdev;
632
633         if (qlcnic_use_msi && !pci_enable_msi(pdev)) {
634                 adapter->flags |= QLCNIC_MSI_ENABLED;
635                 offset = msi_tgt_status[adapter->ahw->pci_func];
636                 adapter->tgt_status_reg = qlcnic_get_ioaddr(adapter->ahw,
637                                                             offset);
638                 dev_info(&pdev->dev, "using msi interrupts\n");
639                 adapter->msix_entries[0].vector = pdev->irq;
640                 return err;
641         }
642
643         if (qlcnic_use_msi || qlcnic_use_msi_x)
644                 return -EOPNOTSUPP;
645
646         legacy_intrp = &legacy_intr[adapter->ahw->pci_func];
647         adapter->ahw->int_vec_bit = legacy_intrp->int_vec_bit;
648         offset = legacy_intrp->tgt_status_reg;
649         adapter->tgt_status_reg = qlcnic_get_ioaddr(ahw, offset);
650         mask_reg = legacy_intrp->tgt_mask_reg;
651         adapter->tgt_mask_reg = qlcnic_get_ioaddr(ahw, mask_reg);
652         adapter->isr_int_vec = qlcnic_get_ioaddr(ahw, ISR_INT_VECTOR);
653         adapter->crb_int_state_reg = qlcnic_get_ioaddr(ahw, ISR_INT_STATE_REG);
654         dev_info(&pdev->dev, "using legacy interrupts\n");
655         adapter->msix_entries[0].vector = pdev->irq;
656         return err;
657 }
658
659 int qlcnic_82xx_setup_intr(struct qlcnic_adapter *adapter, u8 num_intr, int txq)
660 {
661         struct qlcnic_hardware_context *ahw = adapter->ahw;
662         int num_msix, err = 0;
663
664         if (!num_intr)
665                 num_intr = QLCNIC_DEF_NUM_STS_DESC_RINGS;
666
667         if (ahw->msix_supported) {
668                 num_msix = rounddown_pow_of_two(min_t(int, num_online_cpus(),
669                                                 num_intr));
670                 if (qlcnic_check_multi_tx(adapter)) {
671                         if (txq)
672                                 adapter->max_drv_tx_rings = txq;
673                         num_msix += adapter->max_drv_tx_rings;
674                 }
675         } else {
676                 num_msix = 1;
677         }
678
679         err = qlcnic_enable_msix(adapter, num_msix);
680         if (err == -ENOMEM)
681                 return err;
682
683         if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) {
684                 qlcnic_disable_multi_tx(adapter);
685
686                 err = qlcnic_enable_msi_legacy(adapter);
687                 if (!err)
688                         return err;
689         }
690
691         return 0;
692 }
693
694 int qlcnic_82xx_mq_intrpt(struct qlcnic_adapter *adapter, int op_type)
695 {
696         struct qlcnic_hardware_context *ahw = adapter->ahw;
697         int err, i;
698
699         if (qlcnic_check_multi_tx(adapter) &&
700             (adapter->flags & QLCNIC_MSIX_ENABLED)) {
701                 ahw->intr_tbl = vzalloc(ahw->num_msix *
702                                         sizeof(struct qlcnic_intrpt_config));
703                 if (!ahw->intr_tbl)
704                         return -ENOMEM;
705
706                 for (i = 0; i < ahw->num_msix; i++) {
707                         ahw->intr_tbl[i].type = QLCNIC_INTRPT_MSIX;
708                         ahw->intr_tbl[i].id = i;
709                         ahw->intr_tbl[i].src = 0;
710                 }
711
712                 err = qlcnic_82xx_config_intrpt(adapter, 1);
713                 if (err)
714                         dev_err(&adapter->pdev->dev,
715                                 "Failed to configure Interrupt for %d vector\n",
716                                 ahw->num_msix);
717                 return err;
718         }
719
720         return 0;
721 }
722
723 void qlcnic_teardown_intr(struct qlcnic_adapter *adapter)
724 {
725         if (adapter->flags & QLCNIC_MSIX_ENABLED)
726                 pci_disable_msix(adapter->pdev);
727         if (adapter->flags & QLCNIC_MSI_ENABLED)
728                 pci_disable_msi(adapter->pdev);
729
730         kfree(adapter->msix_entries);
731         adapter->msix_entries = NULL;
732
733         if (adapter->ahw->intr_tbl) {
734                 vfree(adapter->ahw->intr_tbl);
735                 adapter->ahw->intr_tbl = NULL;
736         }
737 }
738
739 static void qlcnic_cleanup_pci_map(struct qlcnic_hardware_context *ahw)
740 {
741         if (ahw->pci_base0 != NULL)
742                 iounmap(ahw->pci_base0);
743 }
744
745 static int qlcnic_get_act_pci_func(struct qlcnic_adapter *adapter)
746 {
747         struct qlcnic_pci_info *pci_info;
748         int ret;
749
750         if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
751                 switch (adapter->ahw->port_type) {
752                 case QLCNIC_GBE:
753                         adapter->ahw->act_pci_func = QLCNIC_NIU_MAX_GBE_PORTS;
754                         break;
755                 case QLCNIC_XGBE:
756                         adapter->ahw->act_pci_func = QLCNIC_NIU_MAX_XG_PORTS;
757                         break;
758                 }
759                 return 0;
760         }
761
762         if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC)
763                 return 0;
764
765         pci_info = kcalloc(QLCNIC_MAX_PCI_FUNC, sizeof(*pci_info), GFP_KERNEL);
766         if (!pci_info)
767                 return -ENOMEM;
768
769         ret = qlcnic_get_pci_info(adapter, pci_info);
770         kfree(pci_info);
771         return ret;
772 }
773
774 int qlcnic_init_pci_info(struct qlcnic_adapter *adapter)
775 {
776         struct qlcnic_pci_info *pci_info;
777         int i, ret = 0, j = 0;
778         u16 act_pci_func;
779         u8 pfn;
780
781         pci_info = kcalloc(QLCNIC_MAX_PCI_FUNC, sizeof(*pci_info), GFP_KERNEL);
782         if (!pci_info)
783                 return -ENOMEM;
784
785         ret = qlcnic_get_pci_info(adapter, pci_info);
786         if (ret)
787                 goto err_pci_info;
788
789         act_pci_func = adapter->ahw->act_pci_func;
790
791         adapter->npars = kzalloc(sizeof(struct qlcnic_npar_info) *
792                                  act_pci_func, GFP_KERNEL);
793         if (!adapter->npars) {
794                 ret = -ENOMEM;
795                 goto err_pci_info;
796         }
797
798         adapter->eswitch = kzalloc(sizeof(struct qlcnic_eswitch) *
799                                 QLCNIC_NIU_MAX_XG_PORTS, GFP_KERNEL);
800         if (!adapter->eswitch) {
801                 ret = -ENOMEM;
802                 goto err_npars;
803         }
804
805         for (i = 0; i < QLCNIC_MAX_PCI_FUNC; i++) {
806                 pfn = pci_info[i].id;
807
808                 if (pfn >= QLCNIC_MAX_PCI_FUNC) {
809                         ret = QL_STATUS_INVALID_PARAM;
810                         goto err_eswitch;
811                 }
812
813                 if (!pci_info[i].active ||
814                     (pci_info[i].type != QLCNIC_TYPE_NIC))
815                         continue;
816
817                 adapter->npars[j].pci_func = pfn;
818                 adapter->npars[j].active = (u8)pci_info[i].active;
819                 adapter->npars[j].type = (u8)pci_info[i].type;
820                 adapter->npars[j].phy_port = (u8)pci_info[i].default_port;
821                 adapter->npars[j].min_bw = pci_info[i].tx_min_bw;
822                 adapter->npars[j].max_bw = pci_info[i].tx_max_bw;
823                 j++;
824         }
825
826         for (i = 0; i < QLCNIC_NIU_MAX_XG_PORTS; i++) {
827                 adapter->eswitch[i].flags |= QLCNIC_SWITCH_ENABLE;
828                 if (qlcnic_83xx_check(adapter))
829                         qlcnic_enable_eswitch(adapter, i, 1);
830         }
831
832         kfree(pci_info);
833         return 0;
834
835 err_eswitch:
836         kfree(adapter->eswitch);
837         adapter->eswitch = NULL;
838 err_npars:
839         kfree(adapter->npars);
840         adapter->npars = NULL;
841 err_pci_info:
842         kfree(pci_info);
843
844         return ret;
845 }
846
847 static int
848 qlcnic_set_function_modes(struct qlcnic_adapter *adapter)
849 {
850         u8 id;
851         int ret;
852         u32 data = QLCNIC_MGMT_FUNC;
853         struct qlcnic_hardware_context *ahw = adapter->ahw;
854
855         ret = qlcnic_api_lock(adapter);
856         if (ret)
857                 goto err_lock;
858
859         id = ahw->pci_func;
860         data = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE);
861         data = (data & ~QLC_DEV_SET_DRV(0xf, id)) |
862                QLC_DEV_SET_DRV(QLCNIC_MGMT_FUNC, id);
863         QLC_SHARED_REG_WR32(adapter, QLCNIC_DRV_OP_MODE, data);
864         qlcnic_api_unlock(adapter);
865 err_lock:
866         return ret;
867 }
868
869 static void qlcnic_check_vf(struct qlcnic_adapter *adapter,
870                             const struct pci_device_id *ent)
871 {
872         u32 op_mode, priv_level;
873
874         /* Determine FW API version */
875         adapter->ahw->fw_hal_version = QLC_SHARED_REG_RD32(adapter,
876                                                            QLCNIC_FW_API);
877
878         /* Find PCI function number */
879         qlcnic_get_func_no(adapter);
880
881         /* Determine function privilege level */
882         op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE);
883         if (op_mode == QLC_DEV_DRV_DEFAULT)
884                 priv_level = QLCNIC_MGMT_FUNC;
885         else
886                 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func);
887
888         if (priv_level == QLCNIC_NON_PRIV_FUNC) {
889                 adapter->ahw->op_mode = QLCNIC_NON_PRIV_FUNC;
890                 dev_info(&adapter->pdev->dev,
891                         "HAL Version: %d Non Privileged function\n",
892                          adapter->ahw->fw_hal_version);
893                 adapter->nic_ops = &qlcnic_vf_ops;
894         } else
895                 adapter->nic_ops = &qlcnic_ops;
896 }
897
898 #define QLCNIC_82XX_BAR0_LENGTH 0x00200000UL
899 #define QLCNIC_83XX_BAR0_LENGTH 0x4000
900 static void qlcnic_get_bar_length(u32 dev_id, ulong *bar)
901 {
902         switch (dev_id) {
903         case PCI_DEVICE_ID_QLOGIC_QLE824X:
904                 *bar = QLCNIC_82XX_BAR0_LENGTH;
905                 break;
906         case PCI_DEVICE_ID_QLOGIC_QLE834X:
907         case PCI_DEVICE_ID_QLOGIC_QLE844X:
908         case PCI_DEVICE_ID_QLOGIC_VF_QLE834X:
909         case PCI_DEVICE_ID_QLOGIC_VF_QLE844X:
910                 *bar = QLCNIC_83XX_BAR0_LENGTH;
911                 break;
912         default:
913                 *bar = 0;
914         }
915 }
916
917 static int qlcnic_setup_pci_map(struct pci_dev *pdev,
918                                 struct qlcnic_hardware_context *ahw)
919 {
920         u32 offset;
921         void __iomem *mem_ptr0 = NULL;
922         unsigned long mem_len, pci_len0 = 0, bar0_len;
923
924         /* remap phys address */
925         mem_len = pci_resource_len(pdev, 0);
926
927         qlcnic_get_bar_length(pdev->device, &bar0_len);
928         if (mem_len >= bar0_len) {
929
930                 mem_ptr0 = pci_ioremap_bar(pdev, 0);
931                 if (mem_ptr0 == NULL) {
932                         dev_err(&pdev->dev, "failed to map PCI bar 0\n");
933                         return -EIO;
934                 }
935                 pci_len0 = mem_len;
936         } else {
937                 return -EIO;
938         }
939
940         dev_info(&pdev->dev, "%dKB memory map\n", (int)(mem_len >> 10));
941
942         ahw->pci_base0 = mem_ptr0;
943         ahw->pci_len0 = pci_len0;
944         offset = QLCNIC_PCIX_PS_REG(PCIX_OCM_WINDOW_REG(ahw->pci_func));
945         qlcnic_get_ioaddr(ahw, offset);
946
947         return 0;
948 }
949
950 static inline bool qlcnic_validate_subsystem_id(struct qlcnic_adapter *adapter,
951                                                 int index)
952 {
953         struct pci_dev *pdev = adapter->pdev;
954         unsigned short subsystem_vendor;
955         bool ret = true;
956
957         subsystem_vendor = pdev->subsystem_vendor;
958
959         if (pdev->device == PCI_DEVICE_ID_QLOGIC_QLE824X ||
960             pdev->device == PCI_DEVICE_ID_QLOGIC_QLE834X) {
961                 if (qlcnic_boards[index].sub_vendor == subsystem_vendor &&
962                     qlcnic_boards[index].sub_device == pdev->subsystem_device)
963                         ret = true;
964                 else
965                         ret = false;
966         }
967
968         return ret;
969 }
970
971 static void qlcnic_get_board_name(struct qlcnic_adapter *adapter, char *name)
972 {
973         struct pci_dev *pdev = adapter->pdev;
974         int i, found = 0;
975
976         for (i = 0; i < NUM_SUPPORTED_BOARDS; ++i) {
977                 if (qlcnic_boards[i].vendor == pdev->vendor &&
978                     qlcnic_boards[i].device == pdev->device &&
979                     qlcnic_validate_subsystem_id(adapter, i)) {
980                         found = 1;
981                         break;
982                 }
983         }
984
985         if (!found)
986                 sprintf(name, "%pM Gigabit Ethernet", adapter->mac_addr);
987         else
988                 sprintf(name, "%pM: %s" , adapter->mac_addr,
989                         qlcnic_boards[i].short_name);
990 }
991
992 static void
993 qlcnic_check_options(struct qlcnic_adapter *adapter)
994 {
995         int err;
996         u32 fw_major, fw_minor, fw_build, prev_fw_version;
997         struct pci_dev *pdev = adapter->pdev;
998         struct qlcnic_hardware_context *ahw = adapter->ahw;
999         struct qlcnic_fw_dump *fw_dump = &ahw->fw_dump;
1000
1001         prev_fw_version = adapter->fw_version;
1002
1003         fw_major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR);
1004         fw_minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR);
1005         fw_build = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB);
1006
1007         adapter->fw_version = QLCNIC_VERSION_CODE(fw_major, fw_minor, fw_build);
1008
1009         err = qlcnic_get_board_info(adapter);
1010         if (err) {
1011                 dev_err(&pdev->dev, "Error getting board config info.\n");
1012                 return;
1013         }
1014         if (ahw->op_mode != QLCNIC_NON_PRIV_FUNC) {
1015                 if (fw_dump->tmpl_hdr == NULL ||
1016                                 adapter->fw_version > prev_fw_version) {
1017                         if (fw_dump->tmpl_hdr)
1018                                 vfree(fw_dump->tmpl_hdr);
1019                         if (!qlcnic_fw_cmd_get_minidump_temp(adapter))
1020                                 dev_info(&pdev->dev,
1021                                         "Supports FW dump capability\n");
1022                 }
1023         }
1024
1025         dev_info(&pdev->dev, "Driver v%s, firmware v%d.%d.%d\n",
1026                  QLCNIC_LINUX_VERSIONID, fw_major, fw_minor, fw_build);
1027
1028         if (adapter->ahw->port_type == QLCNIC_XGBE) {
1029                 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) {
1030                         adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_VF;
1031                         adapter->max_rxd = MAX_RCV_DESCRIPTORS_VF;
1032                 } else {
1033                         adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_10G;
1034                         adapter->max_rxd = MAX_RCV_DESCRIPTORS_10G;
1035                 }
1036
1037                 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
1038                 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_10G;
1039
1040         } else if (adapter->ahw->port_type == QLCNIC_GBE) {
1041                 adapter->num_rxd = DEFAULT_RCV_DESCRIPTORS_1G;
1042                 adapter->num_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
1043                 adapter->max_jumbo_rxd = MAX_JUMBO_RCV_DESCRIPTORS_1G;
1044                 adapter->max_rxd = MAX_RCV_DESCRIPTORS_1G;
1045         }
1046
1047         adapter->ahw->msix_supported = !!qlcnic_use_msi_x;
1048
1049         adapter->num_txd = MAX_CMD_DESCRIPTORS;
1050
1051         adapter->max_rds_rings = MAX_RDS_RINGS;
1052 }
1053
1054 static int
1055 qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
1056 {
1057         struct qlcnic_info nic_info;
1058         int err = 0;
1059
1060         memset(&nic_info, 0, sizeof(struct qlcnic_info));
1061         err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func);
1062         if (err)
1063                 return err;
1064
1065         adapter->ahw->physical_port = (u8)nic_info.phys_port;
1066         adapter->ahw->switch_mode = nic_info.switch_mode;
1067         adapter->ahw->max_tx_ques = nic_info.max_tx_ques;
1068         adapter->ahw->max_rx_ques = nic_info.max_rx_ques;
1069         adapter->ahw->capabilities = nic_info.capabilities;
1070
1071         if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
1072                 u32 temp;
1073                 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err);
1074                 if (err == -EIO)
1075                         return err;
1076                 adapter->ahw->extra_capability[0] = temp;
1077         }
1078         adapter->ahw->max_mac_filters = nic_info.max_mac_filters;
1079         adapter->ahw->max_mtu = nic_info.max_mtu;
1080
1081         /* Disable NPAR for 83XX */
1082         if (qlcnic_83xx_check(adapter))
1083                 return err;
1084
1085         if (adapter->ahw->capabilities & BIT_6)
1086                 adapter->flags |= QLCNIC_ESWITCH_ENABLED;
1087         else
1088                 adapter->flags &= ~QLCNIC_ESWITCH_ENABLED;
1089
1090         return err;
1091 }
1092
1093 void qlcnic_set_vlan_config(struct qlcnic_adapter *adapter,
1094                             struct qlcnic_esw_func_cfg *esw_cfg)
1095 {
1096         if (esw_cfg->discard_tagged)
1097                 adapter->flags &= ~QLCNIC_TAGGING_ENABLED;
1098         else
1099                 adapter->flags |= QLCNIC_TAGGING_ENABLED;
1100
1101         if (esw_cfg->vlan_id) {
1102                 adapter->rx_pvid = esw_cfg->vlan_id;
1103                 adapter->tx_pvid = esw_cfg->vlan_id;
1104         } else {
1105                 adapter->rx_pvid = 0;
1106                 adapter->tx_pvid = 0;
1107         }
1108 }
1109
1110 static int
1111 qlcnic_vlan_rx_add(struct net_device *netdev, __be16 proto, u16 vid)
1112 {
1113         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1114         int err;
1115
1116         if (qlcnic_sriov_vf_check(adapter)) {
1117                 err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 1);
1118                 if (err) {
1119                         netdev_err(netdev,
1120                                    "Cannot add VLAN filter for VLAN id %d, err=%d",
1121                                    vid, err);
1122                         return err;
1123                 }
1124         }
1125
1126         set_bit(vid, adapter->vlans);
1127         return 0;
1128 }
1129
1130 static int
1131 qlcnic_vlan_rx_del(struct net_device *netdev, __be16 proto, u16 vid)
1132 {
1133         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1134         int err;
1135
1136         if (qlcnic_sriov_vf_check(adapter)) {
1137                 err = qlcnic_sriov_cfg_vf_guest_vlan(adapter, vid, 0);
1138                 if (err) {
1139                         netdev_err(netdev,
1140                                    "Cannot delete VLAN filter for VLAN id %d, err=%d",
1141                                    vid, err);
1142                         return err;
1143                 }
1144         }
1145
1146         qlcnic_restore_indev_addr(netdev, NETDEV_DOWN);
1147         clear_bit(vid, adapter->vlans);
1148         return 0;
1149 }
1150
1151 void qlcnic_set_eswitch_port_features(struct qlcnic_adapter *adapter,
1152                                       struct qlcnic_esw_func_cfg *esw_cfg)
1153 {
1154         adapter->flags &= ~(QLCNIC_MACSPOOF | QLCNIC_MAC_OVERRIDE_DISABLED |
1155                                 QLCNIC_PROMISC_DISABLED);
1156
1157         if (esw_cfg->mac_anti_spoof)
1158                 adapter->flags |= QLCNIC_MACSPOOF;
1159
1160         if (!esw_cfg->mac_override)
1161                 adapter->flags |= QLCNIC_MAC_OVERRIDE_DISABLED;
1162
1163         if (!esw_cfg->promisc_mode)
1164                 adapter->flags |= QLCNIC_PROMISC_DISABLED;
1165 }
1166
1167 int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *adapter)
1168 {
1169         struct qlcnic_esw_func_cfg esw_cfg;
1170
1171         if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED))
1172                 return 0;
1173
1174         esw_cfg.pci_func = adapter->ahw->pci_func;
1175         if (qlcnic_get_eswitch_port_config(adapter, &esw_cfg))
1176                         return -EIO;
1177         qlcnic_set_vlan_config(adapter, &esw_cfg);
1178         qlcnic_set_eswitch_port_features(adapter, &esw_cfg);
1179         qlcnic_set_netdev_features(adapter, &esw_cfg);
1180
1181         return 0;
1182 }
1183
1184 void qlcnic_set_netdev_features(struct qlcnic_adapter *adapter,
1185                                 struct qlcnic_esw_func_cfg *esw_cfg)
1186 {
1187         struct net_device *netdev = adapter->netdev;
1188
1189         if (qlcnic_83xx_check(adapter))
1190                 return;
1191
1192         adapter->offload_flags = esw_cfg->offload_flags;
1193         adapter->flags |= QLCNIC_APP_CHANGED_FLAGS;
1194         netdev_update_features(netdev);
1195         adapter->flags &= ~QLCNIC_APP_CHANGED_FLAGS;
1196 }
1197
1198 static int
1199 qlcnic_check_eswitch_mode(struct qlcnic_adapter *adapter)
1200 {
1201         u32 op_mode, priv_level;
1202         int err = 0;
1203
1204         err = qlcnic_initialize_nic(adapter);
1205         if (err)
1206                 return err;
1207
1208         if (adapter->flags & QLCNIC_ADAPTER_INITIALIZED)
1209                 return 0;
1210
1211         op_mode = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE);
1212         priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func);
1213
1214         if (op_mode == QLC_DEV_DRV_DEFAULT)
1215                 priv_level = QLCNIC_MGMT_FUNC;
1216         else
1217                 priv_level = QLC_DEV_GET_DRV(op_mode, adapter->ahw->pci_func);
1218
1219         if (adapter->flags & QLCNIC_ESWITCH_ENABLED) {
1220                 if (priv_level == QLCNIC_MGMT_FUNC) {
1221                         adapter->ahw->op_mode = QLCNIC_MGMT_FUNC;
1222                         err = qlcnic_init_pci_info(adapter);
1223                         if (err)
1224                                 return err;
1225                         /* Set privilege level for other functions */
1226                         qlcnic_set_function_modes(adapter);
1227                         dev_info(&adapter->pdev->dev,
1228                                 "HAL Version: %d, Management function\n",
1229                                  adapter->ahw->fw_hal_version);
1230                 } else if (priv_level == QLCNIC_PRIV_FUNC) {
1231                         adapter->ahw->op_mode = QLCNIC_PRIV_FUNC;
1232                         dev_info(&adapter->pdev->dev,
1233                                 "HAL Version: %d, Privileged function\n",
1234                                  adapter->ahw->fw_hal_version);
1235                 }
1236         }
1237
1238         adapter->flags |= QLCNIC_ADAPTER_INITIALIZED;
1239
1240         return err;
1241 }
1242
1243 int qlcnic_set_default_offload_settings(struct qlcnic_adapter *adapter)
1244 {
1245         struct qlcnic_esw_func_cfg esw_cfg;
1246         struct qlcnic_npar_info *npar;
1247         u8 i;
1248
1249         if (adapter->need_fw_reset)
1250                 return 0;
1251
1252         for (i = 0; i < adapter->ahw->act_pci_func; i++) {
1253                 memset(&esw_cfg, 0, sizeof(struct qlcnic_esw_func_cfg));
1254                 esw_cfg.pci_func = adapter->npars[i].pci_func;
1255                 esw_cfg.mac_override = BIT_0;
1256                 esw_cfg.promisc_mode = BIT_0;
1257                 if (qlcnic_82xx_check(adapter)) {
1258                         esw_cfg.offload_flags = BIT_0;
1259                         if (QLCNIC_IS_TSO_CAPABLE(adapter))
1260                                 esw_cfg.offload_flags |= (BIT_1 | BIT_2);
1261                 }
1262                 if (qlcnic_config_switch_port(adapter, &esw_cfg))
1263                         return -EIO;
1264                 npar = &adapter->npars[i];
1265                 npar->pvid = esw_cfg.vlan_id;
1266                 npar->mac_override = esw_cfg.mac_override;
1267                 npar->mac_anti_spoof = esw_cfg.mac_anti_spoof;
1268                 npar->discard_tagged = esw_cfg.discard_tagged;
1269                 npar->promisc_mode = esw_cfg.promisc_mode;
1270                 npar->offload_flags = esw_cfg.offload_flags;
1271         }
1272
1273         return 0;
1274 }
1275
1276
1277 static int
1278 qlcnic_reset_eswitch_config(struct qlcnic_adapter *adapter,
1279                         struct qlcnic_npar_info *npar, int pci_func)
1280 {
1281         struct qlcnic_esw_func_cfg esw_cfg;
1282         esw_cfg.op_mode = QLCNIC_PORT_DEFAULTS;
1283         esw_cfg.pci_func = pci_func;
1284         esw_cfg.vlan_id = npar->pvid;
1285         esw_cfg.mac_override = npar->mac_override;
1286         esw_cfg.discard_tagged = npar->discard_tagged;
1287         esw_cfg.mac_anti_spoof = npar->mac_anti_spoof;
1288         esw_cfg.offload_flags = npar->offload_flags;
1289         esw_cfg.promisc_mode = npar->promisc_mode;
1290         if (qlcnic_config_switch_port(adapter, &esw_cfg))
1291                 return -EIO;
1292
1293         esw_cfg.op_mode = QLCNIC_ADD_VLAN;
1294         if (qlcnic_config_switch_port(adapter, &esw_cfg))
1295                 return -EIO;
1296
1297         return 0;
1298 }
1299
1300 int qlcnic_reset_npar_config(struct qlcnic_adapter *adapter)
1301 {
1302         int i, err;
1303         struct qlcnic_npar_info *npar;
1304         struct qlcnic_info nic_info;
1305         u8 pci_func;
1306
1307         if (qlcnic_82xx_check(adapter))
1308                 if (!adapter->need_fw_reset)
1309                         return 0;
1310
1311         /* Set the NPAR config data after FW reset */
1312         for (i = 0; i < adapter->ahw->act_pci_func; i++) {
1313                 npar = &adapter->npars[i];
1314                 pci_func = npar->pci_func;
1315                 memset(&nic_info, 0, sizeof(struct qlcnic_info));
1316                 err = qlcnic_get_nic_info(adapter, &nic_info, pci_func);
1317                 if (err)
1318                         return err;
1319                 nic_info.min_tx_bw = npar->min_bw;
1320                 nic_info.max_tx_bw = npar->max_bw;
1321                 err = qlcnic_set_nic_info(adapter, &nic_info);
1322                 if (err)
1323                         return err;
1324
1325                 if (npar->enable_pm) {
1326                         err = qlcnic_config_port_mirroring(adapter,
1327                                                            npar->dest_npar, 1,
1328                                                            pci_func);
1329                         if (err)
1330                                 return err;
1331                 }
1332                 err = qlcnic_reset_eswitch_config(adapter, npar, pci_func);
1333                 if (err)
1334                         return err;
1335         }
1336         return 0;
1337 }
1338
1339 static int qlcnic_check_npar_opertional(struct qlcnic_adapter *adapter)
1340 {
1341         u8 npar_opt_timeo = QLCNIC_DEV_NPAR_OPER_TIMEO;
1342         u32 npar_state;
1343
1344         if (adapter->ahw->op_mode == QLCNIC_MGMT_FUNC)
1345                 return 0;
1346
1347         npar_state = QLC_SHARED_REG_RD32(adapter,
1348                                          QLCNIC_CRB_DEV_NPAR_STATE);
1349         while (npar_state != QLCNIC_DEV_NPAR_OPER && --npar_opt_timeo) {
1350                 msleep(1000);
1351                 npar_state = QLC_SHARED_REG_RD32(adapter,
1352                                                  QLCNIC_CRB_DEV_NPAR_STATE);
1353         }
1354         if (!npar_opt_timeo) {
1355                 dev_err(&adapter->pdev->dev,
1356                         "Waiting for NPAR state to operational timeout\n");
1357                 return -EIO;
1358         }
1359         return 0;
1360 }
1361
1362 static int
1363 qlcnic_set_mgmt_operations(struct qlcnic_adapter *adapter)
1364 {
1365         int err;
1366
1367         if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED) ||
1368             adapter->ahw->op_mode != QLCNIC_MGMT_FUNC)
1369                 return 0;
1370
1371         err = qlcnic_set_default_offload_settings(adapter);
1372         if (err)
1373                 return err;
1374
1375         err = qlcnic_reset_npar_config(adapter);
1376         if (err)
1377                 return err;
1378
1379         qlcnic_dev_set_npar_ready(adapter);
1380
1381         return err;
1382 }
1383
1384 int qlcnic_82xx_start_firmware(struct qlcnic_adapter *adapter)
1385 {
1386         int err;
1387
1388         err = qlcnic_can_start_firmware(adapter);
1389         if (err < 0)
1390                 return err;
1391         else if (!err)
1392                 goto check_fw_status;
1393
1394         if (qlcnic_load_fw_file)
1395                 qlcnic_request_firmware(adapter);
1396         else {
1397                 err = qlcnic_check_flash_fw_ver(adapter);
1398                 if (err)
1399                         goto err_out;
1400
1401                 adapter->ahw->fw_type = QLCNIC_FLASH_ROMIMAGE;
1402         }
1403
1404         err = qlcnic_need_fw_reset(adapter);
1405         if (err == 0)
1406                 goto check_fw_status;
1407
1408         err = qlcnic_pinit_from_rom(adapter);
1409         if (err)
1410                 goto err_out;
1411
1412         err = qlcnic_load_firmware(adapter);
1413         if (err)
1414                 goto err_out;
1415
1416         qlcnic_release_firmware(adapter);
1417         QLCWR32(adapter, CRB_DRIVER_VERSION, QLCNIC_DRIVER_VERSION);
1418
1419 check_fw_status:
1420         err = qlcnic_check_fw_status(adapter);
1421         if (err)
1422                 goto err_out;
1423
1424         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_READY);
1425         qlcnic_idc_debug_info(adapter, 1);
1426         err = qlcnic_check_eswitch_mode(adapter);
1427         if (err) {
1428                 dev_err(&adapter->pdev->dev,
1429                         "Memory allocation failed for eswitch\n");
1430                 goto err_out;
1431         }
1432         err = qlcnic_set_mgmt_operations(adapter);
1433         if (err)
1434                 goto err_out;
1435
1436         qlcnic_check_options(adapter);
1437         adapter->need_fw_reset = 0;
1438
1439         qlcnic_release_firmware(adapter);
1440         return 0;
1441
1442 err_out:
1443         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE, QLCNIC_DEV_FAILED);
1444         dev_err(&adapter->pdev->dev, "Device state set to failed\n");
1445
1446         qlcnic_release_firmware(adapter);
1447         return err;
1448 }
1449
1450 static int
1451 qlcnic_request_irq(struct qlcnic_adapter *adapter)
1452 {
1453         irq_handler_t handler;
1454         struct qlcnic_host_sds_ring *sds_ring;
1455         struct qlcnic_host_tx_ring *tx_ring;
1456         int err, ring, num_sds_rings;
1457
1458         unsigned long flags = 0;
1459         struct net_device *netdev = adapter->netdev;
1460         struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
1461
1462         if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1463                 if (qlcnic_82xx_check(adapter))
1464                         handler = qlcnic_tmp_intr;
1465                 else
1466                         handler = qlcnic_83xx_tmp_intr;
1467                 if (!QLCNIC_IS_MSI_FAMILY(adapter))
1468                         flags |= IRQF_SHARED;
1469
1470         } else {
1471                 if (adapter->flags & QLCNIC_MSIX_ENABLED)
1472                         handler = qlcnic_msix_intr;
1473                 else if (adapter->flags & QLCNIC_MSI_ENABLED)
1474                         handler = qlcnic_msi_intr;
1475                 else {
1476                         flags |= IRQF_SHARED;
1477                         if (qlcnic_82xx_check(adapter))
1478                                 handler = qlcnic_intr;
1479                         else
1480                                 handler = qlcnic_83xx_intr;
1481                 }
1482         }
1483         adapter->irq = netdev->irq;
1484
1485         if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
1486                 if (qlcnic_82xx_check(adapter) ||
1487                     (qlcnic_83xx_check(adapter) &&
1488                      (adapter->flags & QLCNIC_MSIX_ENABLED))) {
1489                         num_sds_rings = adapter->max_sds_rings;
1490                         for (ring = 0; ring < num_sds_rings; ring++) {
1491                                 sds_ring = &recv_ctx->sds_rings[ring];
1492                                 if (qlcnic_82xx_check(adapter) &&
1493                                     !qlcnic_check_multi_tx(adapter) &&
1494                                     (ring == (num_sds_rings - 1))) {
1495                                         if (!(adapter->flags &
1496                                               QLCNIC_MSIX_ENABLED))
1497                                                 snprintf(sds_ring->name,
1498                                                          sizeof(sds_ring->name),
1499                                                          "qlcnic");
1500                                         else
1501                                                 snprintf(sds_ring->name,
1502                                                          sizeof(sds_ring->name),
1503                                                          "%s-tx-0-rx-%d",
1504                                                          netdev->name, ring);
1505                                 } else {
1506                                         snprintf(sds_ring->name,
1507                                                  sizeof(sds_ring->name),
1508                                                  "%s-rx-%d",
1509                                                  netdev->name, ring);
1510                                 }
1511                                 err = request_irq(sds_ring->irq, handler, flags,
1512                                                   sds_ring->name, sds_ring);
1513                                 if (err)
1514                                         return err;
1515                         }
1516                 }
1517                 if ((qlcnic_82xx_check(adapter) &&
1518                      qlcnic_check_multi_tx(adapter)) ||
1519                     (qlcnic_83xx_check(adapter) &&
1520                      (adapter->flags & QLCNIC_MSIX_ENABLED) &&
1521                      !(adapter->flags & QLCNIC_TX_INTR_SHARED))) {
1522                         handler = qlcnic_msix_tx_intr;
1523                         for (ring = 0; ring < adapter->max_drv_tx_rings;
1524                              ring++) {
1525                                 tx_ring = &adapter->tx_ring[ring];
1526                                 snprintf(tx_ring->name, sizeof(tx_ring->name),
1527                                          "%s-tx-%d", netdev->name, ring);
1528                                 err = request_irq(tx_ring->irq, handler, flags,
1529                                                   tx_ring->name, tx_ring);
1530                                 if (err)
1531                                         return err;
1532                         }
1533                 }
1534         }
1535         return 0;
1536 }
1537
1538 static void
1539 qlcnic_free_irq(struct qlcnic_adapter *adapter)
1540 {
1541         int ring;
1542         struct qlcnic_host_sds_ring *sds_ring;
1543         struct qlcnic_host_tx_ring *tx_ring;
1544
1545         struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
1546
1547         if (adapter->ahw->diag_test != QLCNIC_LOOPBACK_TEST) {
1548                 if (qlcnic_82xx_check(adapter) ||
1549                     (qlcnic_83xx_check(adapter) &&
1550                      (adapter->flags & QLCNIC_MSIX_ENABLED))) {
1551                         for (ring = 0; ring < adapter->max_sds_rings; ring++) {
1552                                 sds_ring = &recv_ctx->sds_rings[ring];
1553                                 free_irq(sds_ring->irq, sds_ring);
1554                         }
1555                 }
1556                 if ((qlcnic_83xx_check(adapter) &&
1557                      !(adapter->flags & QLCNIC_TX_INTR_SHARED)) ||
1558                     (qlcnic_82xx_check(adapter) &&
1559                      qlcnic_check_multi_tx(adapter))) {
1560                         for (ring = 0; ring < adapter->max_drv_tx_rings;
1561                              ring++) {
1562                                 tx_ring = &adapter->tx_ring[ring];
1563                                 if (tx_ring->irq)
1564                                         free_irq(tx_ring->irq, tx_ring);
1565                         }
1566                 }
1567         }
1568 }
1569
1570 static void qlcnic_get_lro_mss_capability(struct qlcnic_adapter *adapter)
1571 {
1572         u32 capab = 0;
1573
1574         if (qlcnic_82xx_check(adapter)) {
1575                 if (adapter->ahw->extra_capability[0] &
1576                     QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG)
1577                         adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
1578         } else {
1579                 capab = adapter->ahw->capabilities;
1580                 if (QLC_83XX_GET_FW_LRO_MSS_CAPABILITY(capab))
1581                         adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
1582         }
1583 }
1584
1585 int __qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
1586 {
1587         int ring;
1588         struct qlcnic_host_rds_ring *rds_ring;
1589
1590         if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
1591                 return -EIO;
1592
1593         if (test_bit(__QLCNIC_DEV_UP, &adapter->state))
1594                 return 0;
1595
1596         if (qlcnic_set_eswitch_port_config(adapter))
1597                 return -EIO;
1598
1599         qlcnic_get_lro_mss_capability(adapter);
1600
1601         if (qlcnic_fw_create_ctx(adapter))
1602                 return -EIO;
1603
1604         for (ring = 0; ring < adapter->max_rds_rings; ring++) {
1605                 rds_ring = &adapter->recv_ctx->rds_rings[ring];
1606                 qlcnic_post_rx_buffers(adapter, rds_ring, ring);
1607         }
1608
1609         qlcnic_set_multi(netdev);
1610         qlcnic_fw_cmd_set_mtu(adapter, netdev->mtu);
1611
1612         adapter->ahw->linkup = 0;
1613
1614         if (adapter->max_sds_rings > 1)
1615                 qlcnic_config_rss(adapter, 1);
1616
1617         qlcnic_config_intr_coalesce(adapter);
1618
1619         if (netdev->features & NETIF_F_LRO)
1620                 qlcnic_config_hw_lro(adapter, QLCNIC_LRO_ENABLED);
1621
1622         set_bit(__QLCNIC_DEV_UP, &adapter->state);
1623         qlcnic_napi_enable(adapter);
1624
1625         qlcnic_linkevent_request(adapter, 1);
1626
1627         adapter->ahw->reset_context = 0;
1628         return 0;
1629 }
1630
1631 int qlcnic_up(struct qlcnic_adapter *adapter, struct net_device *netdev)
1632 {
1633         int err = 0;
1634
1635         rtnl_lock();
1636         if (netif_running(netdev))
1637                 err = __qlcnic_up(adapter, netdev);
1638         rtnl_unlock();
1639
1640         return err;
1641 }
1642
1643 void __qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev)
1644 {
1645         int ring;
1646
1647         if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
1648                 return;
1649
1650         if (!test_and_clear_bit(__QLCNIC_DEV_UP, &adapter->state))
1651                 return;
1652
1653         if (qlcnic_sriov_vf_check(adapter))
1654                 qlcnic_sriov_cleanup_async_list(&adapter->ahw->sriov->bc);
1655         smp_mb();
1656         netif_carrier_off(netdev);
1657         adapter->ahw->linkup = 0;
1658         netif_tx_disable(netdev);
1659
1660         qlcnic_free_mac_list(adapter);
1661
1662         if (adapter->fhash.fnum)
1663                 qlcnic_delete_lb_filters(adapter);
1664
1665         qlcnic_nic_set_promisc(adapter, QLCNIC_NIU_NON_PROMISC_MODE);
1666
1667         qlcnic_napi_disable(adapter);
1668
1669         qlcnic_fw_destroy_ctx(adapter);
1670         adapter->flags &= ~QLCNIC_FW_LRO_MSS_CAP;
1671
1672         qlcnic_reset_rx_buffers_list(adapter);
1673
1674         for (ring = 0; ring < adapter->max_drv_tx_rings; ring++)
1675                 qlcnic_release_tx_buffers(adapter, &adapter->tx_ring[ring]);
1676 }
1677
1678 /* Usage: During suspend and firmware recovery module */
1679
1680 void qlcnic_down(struct qlcnic_adapter *adapter, struct net_device *netdev)
1681 {
1682         rtnl_lock();
1683         if (netif_running(netdev))
1684                 __qlcnic_down(adapter, netdev);
1685         rtnl_unlock();
1686
1687 }
1688
1689 int
1690 qlcnic_attach(struct qlcnic_adapter *adapter)
1691 {
1692         struct net_device *netdev = adapter->netdev;
1693         struct pci_dev *pdev = adapter->pdev;
1694         int err;
1695
1696         if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC)
1697                 return 0;
1698
1699         err = qlcnic_napi_add(adapter, netdev);
1700         if (err)
1701                 return err;
1702
1703         err = qlcnic_alloc_sw_resources(adapter);
1704         if (err) {
1705                 dev_err(&pdev->dev, "Error in setting sw resources\n");
1706                 goto err_out_napi_del;
1707         }
1708
1709         err = qlcnic_alloc_hw_resources(adapter);
1710         if (err) {
1711                 dev_err(&pdev->dev, "Error in setting hw resources\n");
1712                 goto err_out_free_sw;
1713         }
1714
1715         err = qlcnic_request_irq(adapter);
1716         if (err) {
1717                 dev_err(&pdev->dev, "failed to setup interrupt\n");
1718                 goto err_out_free_hw;
1719         }
1720
1721         qlcnic_create_sysfs_entries(adapter);
1722
1723         adapter->is_up = QLCNIC_ADAPTER_UP_MAGIC;
1724         return 0;
1725
1726 err_out_free_hw:
1727         qlcnic_free_hw_resources(adapter);
1728 err_out_free_sw:
1729         qlcnic_free_sw_resources(adapter);
1730 err_out_napi_del:
1731         qlcnic_napi_del(adapter);
1732         return err;
1733 }
1734
1735 void qlcnic_detach(struct qlcnic_adapter *adapter)
1736 {
1737         if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC)
1738                 return;
1739
1740         qlcnic_remove_sysfs_entries(adapter);
1741
1742         qlcnic_free_hw_resources(adapter);
1743         qlcnic_release_rx_buffers(adapter);
1744         qlcnic_free_irq(adapter);
1745         qlcnic_napi_del(adapter);
1746         qlcnic_free_sw_resources(adapter);
1747
1748         adapter->is_up = 0;
1749 }
1750
1751 void qlcnic_diag_free_res(struct net_device *netdev, int max_sds_rings)
1752 {
1753         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1754         struct qlcnic_host_sds_ring *sds_ring;
1755         int ring;
1756
1757         clear_bit(__QLCNIC_DEV_UP, &adapter->state);
1758         if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1759                 for (ring = 0; ring < adapter->max_sds_rings; ring++) {
1760                         sds_ring = &adapter->recv_ctx->sds_rings[ring];
1761                         qlcnic_disable_int(sds_ring);
1762                 }
1763         }
1764
1765         qlcnic_fw_destroy_ctx(adapter);
1766
1767         qlcnic_detach(adapter);
1768
1769         adapter->ahw->diag_test = 0;
1770         adapter->max_sds_rings = max_sds_rings;
1771
1772         if (qlcnic_attach(adapter))
1773                 goto out;
1774
1775         if (netif_running(netdev))
1776                 __qlcnic_up(adapter, netdev);
1777 out:
1778         netif_device_attach(netdev);
1779 }
1780
1781 static int qlcnic_alloc_adapter_resources(struct qlcnic_adapter *adapter)
1782 {
1783         struct qlcnic_hardware_context *ahw = adapter->ahw;
1784         int err = 0;
1785
1786         adapter->recv_ctx = kzalloc(sizeof(struct qlcnic_recv_context),
1787                                 GFP_KERNEL);
1788         if (!adapter->recv_ctx) {
1789                 err = -ENOMEM;
1790                 goto err_out;
1791         }
1792         /* Initialize interrupt coalesce parameters */
1793         ahw->coal.flag = QLCNIC_INTR_DEFAULT;
1794         ahw->coal.type = QLCNIC_INTR_COAL_TYPE_RX;
1795         ahw->coal.rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US;
1796         ahw->coal.rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS;
1797         if (qlcnic_83xx_check(adapter)) {
1798                 ahw->coal.tx_time_us = QLCNIC_DEF_INTR_COALESCE_TX_TIME_US;
1799                 ahw->coal.tx_packets = QLCNIC_DEF_INTR_COALESCE_TX_PACKETS;
1800         }
1801         /* clear stats */
1802         memset(&adapter->stats, 0, sizeof(adapter->stats));
1803 err_out:
1804         return err;
1805 }
1806
1807 static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter)
1808 {
1809         kfree(adapter->recv_ctx);
1810         adapter->recv_ctx = NULL;
1811
1812         if (adapter->ahw->fw_dump.tmpl_hdr) {
1813                 vfree(adapter->ahw->fw_dump.tmpl_hdr);
1814                 adapter->ahw->fw_dump.tmpl_hdr = NULL;
1815         }
1816
1817         kfree(adapter->ahw->reset.buff);
1818         adapter->ahw->fw_dump.tmpl_hdr = NULL;
1819 }
1820
1821 int qlcnic_diag_alloc_res(struct net_device *netdev, int test)
1822 {
1823         struct qlcnic_adapter *adapter = netdev_priv(netdev);
1824         struct qlcnic_host_sds_ring *sds_ring;
1825         struct qlcnic_host_rds_ring *rds_ring;
1826         int ring;
1827         int ret;
1828
1829         netif_device_detach(netdev);
1830
1831         if (netif_running(netdev))
1832                 __qlcnic_down(adapter, netdev);
1833
1834         qlcnic_detach(adapter);
1835
1836         adapter->max_sds_rings = 1;
1837         adapter->ahw->diag_test = test;
1838         adapter->ahw->linkup = 0;
1839
1840         ret = qlcnic_attach(adapter);
1841         if (ret) {
1842                 netif_device_attach(netdev);
1843                 return ret;
1844         }
1845
1846         ret = qlcnic_fw_create_ctx(adapter);
1847         if (ret) {
1848                 qlcnic_detach(adapter);
1849                 netif_device_attach(netdev);
1850                 return ret;
1851         }
1852
1853         for (ring = 0; ring < adapter->max_rds_rings; ring++) {
1854                 rds_ring = &adapter->recv_ctx->rds_rings[ring];
1855                 qlcnic_post_rx_buffers(adapter, rds_ring, ring);
1856         }
1857
1858         if (adapter->ahw->diag_test == QLCNIC_INTERRUPT_TEST) {
1859                 for (ring = 0; ring < adapter->max_sds_rings; ring++) {
1860                         sds_ring = &adapter->recv_ctx->sds_rings[ring];
1861                         qlcnic_enable_int(sds_ring);
1862                 }
1863         }
1864
1865         if (adapter->ahw->diag_test == QLCNIC_LOOPBACK_TEST) {
1866                 adapter->ahw->loopback_state = 0;
1867                 qlcnic_linkevent_request(adapter, 1);
1868         }
1869
1870         set_bit(__QLCNIC_DEV_UP, &adapter->state);
1871
1872         return 0;
1873 }
1874
1875 /* Reset context in hardware only */
1876 static int
1877 qlcnic_reset_hw_context(struct qlcnic_adapter *adapter)
1878 {
1879         struct net_device *netdev = adapter->netdev;
1880
1881         if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
1882                 return -EBUSY;
1883
1884         netif_device_detach(netdev);
1885
1886         qlcnic_down(adapter, netdev);
1887
1888         qlcnic_up(adapter, netdev);
1889
1890         netif_device_attach(netdev);
1891
1892         clear_bit(__QLCNIC_RESETTING, &adapter->state);
1893         dev_err(&adapter->pdev->dev, "%s:\n", __func__);
1894         return 0;
1895 }
1896
1897 int
1898 qlcnic_reset_context(struct qlcnic_adapter *adapter)
1899 {
1900         int err = 0;
1901         struct net_device *netdev = adapter->netdev;
1902
1903         if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state))
1904                 return -EBUSY;
1905
1906         if (adapter->is_up == QLCNIC_ADAPTER_UP_MAGIC) {
1907
1908                 netif_device_detach(netdev);
1909
1910                 if (netif_running(netdev))
1911                         __qlcnic_down(adapter, netdev);
1912
1913                 qlcnic_detach(adapter);
1914
1915                 if (netif_running(netdev)) {
1916                         err = qlcnic_attach(adapter);
1917                         if (!err) {
1918                                 __qlcnic_up(adapter, netdev);
1919                                 qlcnic_restore_indev_addr(netdev, NETDEV_UP);
1920                         }
1921                 }
1922
1923                 netif_device_attach(netdev);
1924         }
1925
1926         clear_bit(__QLCNIC_RESETTING, &adapter->state);
1927         return err;
1928 }
1929
1930 void qlcnic_82xx_set_mac_filter_count(struct qlcnic_adapter *adapter)
1931 {
1932         struct qlcnic_hardware_context *ahw = adapter->ahw;
1933         u16 act_pci_fn = ahw->act_pci_func;
1934         u16 count;
1935
1936         ahw->max_mc_count = QLCNIC_MAX_MC_COUNT;
1937         if (act_pci_fn <= 2)
1938                 count = (QLCNIC_MAX_UC_COUNT - QLCNIC_MAX_MC_COUNT) /
1939                          act_pci_fn;
1940         else
1941                 count = (QLCNIC_LB_MAX_FILTERS - QLCNIC_MAX_MC_COUNT) /
1942                          act_pci_fn;
1943         ahw->max_uc_count = count;
1944 }
1945
1946 int
1947 qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev,
1948                     int pci_using_dac)
1949 {
1950         int err;
1951         struct pci_dev *pdev = adapter->pdev;
1952
1953         adapter->rx_csum = 1;
1954         adapter->ahw->mc_enabled = 0;
1955         qlcnic_set_mac_filter_count(adapter);
1956
1957         netdev->netdev_ops         = &qlcnic_netdev_ops;
1958         netdev->watchdog_timeo     = QLCNIC_WATCHDOG_TIMEOUTVALUE * HZ;
1959
1960         qlcnic_change_mtu(netdev, netdev->mtu);
1961
1962         if (qlcnic_sriov_vf_check(adapter))
1963                 SET_ETHTOOL_OPS(netdev, &qlcnic_sriov_vf_ethtool_ops);
1964         else
1965                 SET_ETHTOOL_OPS(netdev, &qlcnic_ethtool_ops);
1966
1967         netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
1968                              NETIF_F_IPV6_CSUM | NETIF_F_GRO |
1969                              NETIF_F_HW_VLAN_CTAG_RX);
1970         netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM |
1971                                   NETIF_F_IPV6_CSUM);
1972
1973         if (QLCNIC_IS_TSO_CAPABLE(adapter)) {
1974                 netdev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
1975                 netdev->vlan_features |= (NETIF_F_TSO | NETIF_F_TSO6);
1976         }
1977
1978         if (pci_using_dac) {
1979                 netdev->features |= NETIF_F_HIGHDMA;
1980                 netdev->vlan_features |= NETIF_F_HIGHDMA;
1981         }
1982
1983         if (qlcnic_vlan_tx_check(adapter))
1984                 netdev->features |= (NETIF_F_HW_VLAN_CTAG_TX);
1985
1986         if (qlcnic_sriov_vf_check(adapter))
1987                 netdev->features |= NETIF_F_HW_VLAN_CTAG_FILTER;
1988
1989         if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO)
1990                 netdev->features |= NETIF_F_LRO;
1991
1992         netdev->hw_features = netdev->features;
1993         netdev->priv_flags |= IFF_UNICAST_FLT;
1994         netdev->irq = adapter->msix_entries[0].vector;
1995
1996         err = qlcnic_set_real_num_queues(adapter, netdev);
1997         if (err)
1998                 return err;
1999
2000         err = register_netdev(netdev);
2001         if (err) {
2002                 dev_err(&pdev->dev, "failed to register net device\n");
2003                 return err;
2004         }
2005
2006         return 0;
2007 }
2008
2009 static int qlcnic_set_dma_mask(struct pci_dev *pdev, int *pci_using_dac)
2010 {
2011         if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) &&
2012                         !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)))
2013                 *pci_using_dac = 1;
2014         else if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32)) &&
2015                         !pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32)))
2016                 *pci_using_dac = 0;
2017         else {
2018                 dev_err(&pdev->dev, "Unable to set DMA mask, aborting\n");
2019                 return -EIO;
2020         }
2021
2022         return 0;
2023 }
2024
2025 void qlcnic_free_tx_rings(struct qlcnic_adapter *adapter)
2026 {
2027         int ring;
2028         struct qlcnic_host_tx_ring *tx_ring;
2029
2030         for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) {
2031                 tx_ring = &adapter->tx_ring[ring];
2032                 if (tx_ring && tx_ring->cmd_buf_arr != NULL) {
2033                         vfree(tx_ring->cmd_buf_arr);
2034                         tx_ring->cmd_buf_arr = NULL;
2035                 }
2036         }
2037         if (adapter->tx_ring != NULL)
2038                 kfree(adapter->tx_ring);
2039 }
2040
2041 int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter,
2042                           struct net_device *netdev)
2043 {
2044         int ring, vector, index;
2045         struct qlcnic_host_tx_ring *tx_ring;
2046         struct qlcnic_cmd_buffer *cmd_buf_arr;
2047
2048         tx_ring = kcalloc(adapter->max_drv_tx_rings,
2049                           sizeof(struct qlcnic_host_tx_ring), GFP_KERNEL);
2050         if (tx_ring == NULL)
2051                 return -ENOMEM;
2052
2053         adapter->tx_ring = tx_ring;
2054
2055         for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) {
2056                 tx_ring = &adapter->tx_ring[ring];
2057                 tx_ring->num_desc = adapter->num_txd;
2058                 tx_ring->txq = netdev_get_tx_queue(netdev, ring);
2059                 cmd_buf_arr = vzalloc(TX_BUFF_RINGSIZE(tx_ring));
2060                 if (cmd_buf_arr == NULL) {
2061                         qlcnic_free_tx_rings(adapter);
2062                         return -ENOMEM;
2063                 }
2064                 memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring));
2065                 tx_ring->cmd_buf_arr = cmd_buf_arr;
2066         }
2067
2068         if (qlcnic_83xx_check(adapter) ||
2069             (qlcnic_82xx_check(adapter) && qlcnic_check_multi_tx(adapter))) {
2070                 for (ring = 0; ring < adapter->max_drv_tx_rings; ring++) {
2071                         tx_ring = &adapter->tx_ring[ring];
2072                         tx_ring->adapter = adapter;
2073                         if (adapter->flags & QLCNIC_MSIX_ENABLED) {
2074                                 index = adapter->max_sds_rings + ring;
2075                                 vector = adapter->msix_entries[index].vector;
2076                                 tx_ring->irq = vector;
2077                         }
2078                 }
2079         }
2080
2081         return 0;
2082 }
2083
2084 void qlcnic_set_drv_version(struct qlcnic_adapter *adapter)
2085 {
2086         struct qlcnic_hardware_context *ahw = adapter->ahw;
2087         u32 fw_cmd = 0;
2088
2089         if (qlcnic_82xx_check(adapter))
2090                 fw_cmd = QLCNIC_CMD_82XX_SET_DRV_VER;
2091         else if (qlcnic_83xx_check(adapter))
2092                 fw_cmd = QLCNIC_CMD_83XX_SET_DRV_VER;
2093
2094         if ((ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) &&
2095             (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_SET_DRV_VER))
2096                 qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd);
2097 }
2098
2099 static int
2100 qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2101 {
2102         struct net_device *netdev = NULL;
2103         struct qlcnic_adapter *adapter = NULL;
2104         struct qlcnic_hardware_context *ahw;
2105         int err, pci_using_dac = -1;
2106         char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */
2107
2108         if (pdev->is_virtfn)
2109                 return -ENODEV;
2110
2111         err = pci_enable_device(pdev);
2112         if (err)
2113                 return err;
2114
2115         if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
2116                 err = -ENODEV;
2117                 goto err_out_disable_pdev;
2118         }
2119
2120         err = qlcnic_set_dma_mask(pdev, &pci_using_dac);
2121         if (err)
2122                 goto err_out_disable_pdev;
2123
2124         err = pci_request_regions(pdev, qlcnic_driver_name);
2125         if (err)
2126                 goto err_out_disable_pdev;
2127
2128         pci_set_master(pdev);
2129         pci_enable_pcie_error_reporting(pdev);
2130
2131         ahw = kzalloc(sizeof(struct qlcnic_hardware_context), GFP_KERNEL);
2132         if (!ahw) {
2133                 err = -ENOMEM;
2134                 goto err_out_free_res;
2135         }
2136
2137         switch (ent->device) {
2138         case PCI_DEVICE_ID_QLOGIC_QLE824X:
2139                 ahw->hw_ops = &qlcnic_hw_ops;
2140                 ahw->reg_tbl = (u32 *) qlcnic_reg_tbl;
2141                 break;
2142         case PCI_DEVICE_ID_QLOGIC_QLE834X:
2143         case PCI_DEVICE_ID_QLOGIC_QLE844X:
2144                 qlcnic_83xx_register_map(ahw);
2145                 break;
2146         case PCI_DEVICE_ID_QLOGIC_VF_QLE834X:
2147         case PCI_DEVICE_ID_QLOGIC_VF_QLE844X:
2148                 qlcnic_sriov_vf_register_map(ahw);
2149                 break;
2150         default:
2151                 goto err_out_free_hw_res;
2152         }
2153
2154         err = qlcnic_setup_pci_map(pdev, ahw);
2155         if (err)
2156                 goto err_out_free_hw_res;
2157
2158         netdev = alloc_etherdev_mq(sizeof(struct qlcnic_adapter),
2159                                    QLCNIC_MAX_TX_RINGS);
2160         if (!netdev) {
2161                 err = -ENOMEM;
2162                 goto err_out_iounmap;
2163         }
2164
2165         SET_NETDEV_DEV(netdev, &pdev->dev);
2166
2167         adapter = netdev_priv(netdev);
2168         adapter->netdev  = netdev;
2169         adapter->pdev    = pdev;
2170         adapter->ahw = ahw;
2171
2172         adapter->qlcnic_wq = create_singlethread_workqueue("qlcnic");
2173         if (adapter->qlcnic_wq == NULL) {
2174                 err = -ENOMEM;
2175                 dev_err(&pdev->dev, "Failed to create workqueue\n");
2176                 goto err_out_free_netdev;
2177         }
2178
2179         err = qlcnic_alloc_adapter_resources(adapter);
2180         if (err)
2181                 goto err_out_free_netdev;
2182
2183         adapter->dev_rst_time = jiffies;
2184         adapter->ahw->revision_id = pdev->revision;
2185         if (qlcnic_mac_learn == FDB_MAC_LEARN)
2186                 adapter->fdb_mac_learn = true;
2187         else if (qlcnic_mac_learn == DRV_MAC_LEARN)
2188                 adapter->drv_mac_learn = true;
2189
2190         rwlock_init(&adapter->ahw->crb_lock);
2191         mutex_init(&adapter->ahw->mem_lock);
2192
2193         INIT_LIST_HEAD(&adapter->mac_list);
2194
2195         if (qlcnic_82xx_check(adapter)) {
2196                 qlcnic_check_vf(adapter, ent);
2197                 adapter->portnum = adapter->ahw->pci_func;
2198                 err = qlcnic_start_firmware(adapter);
2199                 if (err) {
2200                         dev_err(&pdev->dev, "Loading fw failed.Please Reboot\n");
2201                         goto err_out_free_hw;
2202                 }
2203
2204                 qlcnic_get_multiq_capability(adapter);
2205
2206                 if ((adapter->ahw->act_pci_func > 2) &&
2207                     qlcnic_check_multi_tx(adapter)) {
2208                         adapter->max_drv_tx_rings = QLCNIC_DEF_NUM_TX_RINGS;
2209                         dev_info(&adapter->pdev->dev,
2210                                  "vNIC mode enabled, Set max TX rings = %d\n",
2211                                  adapter->max_drv_tx_rings);
2212                 }
2213
2214                 if (!qlcnic_check_multi_tx(adapter)) {
2215                         clear_bit(__QLCNIC_MULTI_TX_UNIQUE, &adapter->state);
2216                         adapter->max_drv_tx_rings = 1;
2217                 }
2218                 err = qlcnic_setup_idc_param(adapter);
2219                 if (err)
2220                         goto err_out_free_hw;
2221
2222                 adapter->flags |= QLCNIC_NEED_FLR;
2223         } else if (qlcnic_83xx_check(adapter)) {
2224                 adapter->max_drv_tx_rings = 1;
2225                 qlcnic_83xx_check_vf(adapter, ent);
2226                 adapter->portnum = adapter->ahw->pci_func;
2227                 err = qlcnic_83xx_init(adapter, pci_using_dac);
2228                 if (err) {
2229                         dev_err(&pdev->dev, "%s: failed\n", __func__);
2230                         goto err_out_free_hw;
2231                 }
2232                 if (qlcnic_sriov_vf_check(adapter))
2233                         return 0;
2234         } else {
2235                 dev_err(&pdev->dev,
2236                         "%s: failed. Please Reboot\n", __func__);
2237                 goto err_out_free_hw;
2238         }
2239
2240         if (qlcnic_read_mac_addr(adapter))
2241                 dev_warn(&pdev->dev, "failed to read mac addr\n");
2242
2243         if (adapter->portnum == 0) {
2244                 qlcnic_get_board_name(adapter, board_name);
2245
2246                 pr_info("%s: %s Board Chip rev 0x%x\n",
2247                         module_name(THIS_MODULE),
2248                         board_name, adapter->ahw->revision_id);
2249         }
2250
2251         if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x &&
2252             !!qlcnic_use_msi)
2253                 dev_warn(&pdev->dev,
2254                          "Device does not support MSI interrupts\n");
2255
2256         if (qlcnic_82xx_check(adapter)) {
2257                 err = qlcnic_setup_intr(adapter, 0, 0);
2258                 if (err) {
2259                         dev_err(&pdev->dev, "Failed to setup interrupt\n");
2260                         goto err_out_disable_msi;
2261                 }
2262         }
2263
2264         err = qlcnic_get_act_pci_func(adapter);
2265         if (err)
2266                 goto err_out_disable_mbx_intr;
2267
2268         err = qlcnic_setup_netdev(adapter, netdev, pci_using_dac);
2269         if (err)
2270                 goto err_out_disable_mbx_intr;
2271
2272         if (adapter->portnum == 0)
2273                 qlcnic_set_drv_version(adapter);
2274
2275         pci_set_drvdata(pdev, adapter);
2276
2277         if (qlcnic_82xx_check(adapter))
2278                 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work,
2279                                      FW_POLL_DELAY);
2280
2281         switch (adapter->ahw->port_type) {
2282         case QLCNIC_GBE:
2283                 dev_info(&adapter->pdev->dev, "%s: GbE port initialized\n",
2284                                 adapter->netdev->name);
2285                 break;
2286         case QLCNIC_XGBE:
2287                 dev_info(&adapter->pdev->dev, "%s: XGbE port initialized\n",
2288                                 adapter->netdev->name);
2289                 break;
2290         }
2291
2292         if (adapter->drv_mac_learn)
2293                 qlcnic_alloc_lb_filters_mem(adapter);
2294
2295         qlcnic_add_sysfs(adapter);
2296
2297         return 0;
2298
2299 err_out_disable_mbx_intr:
2300         if (qlcnic_83xx_check(adapter))
2301                 qlcnic_83xx_free_mbx_intr(adapter);
2302
2303 err_out_disable_msi:
2304         qlcnic_teardown_intr(adapter);
2305         qlcnic_cancel_idc_work(adapter);
2306         qlcnic_clr_all_drv_state(adapter, 0);
2307
2308 err_out_free_hw:
2309         qlcnic_free_adapter_resources(adapter);
2310
2311 err_out_free_netdev:
2312         free_netdev(netdev);
2313
2314 err_out_iounmap:
2315         qlcnic_cleanup_pci_map(ahw);
2316
2317 err_out_free_hw_res:
2318         kfree(ahw);
2319
2320 err_out_free_res:
2321         pci_release_regions(pdev);
2322
2323 err_out_disable_pdev:
2324         pci_set_drvdata(pdev, NULL);
2325         pci_disable_device(pdev);
2326         return err;
2327 }
2328
2329 static void qlcnic_remove(struct pci_dev *pdev)
2330 {
2331         struct qlcnic_adapter *adapter;
2332         struct net_device *netdev;
2333         struct qlcnic_hardware_context *ahw;
2334
2335         adapter = pci_get_drvdata(pdev);
2336         if (adapter == NULL)
2337                 return;
2338
2339         netdev = adapter->netdev;
2340         qlcnic_sriov_pf_disable(adapter);
2341
2342         qlcnic_cancel_idc_work(adapter);
2343         ahw = adapter->ahw;
2344
2345         unregister_netdev(netdev);
2346         qlcnic_sriov_cleanup(adapter);
2347
2348         if (qlcnic_83xx_check(adapter)) {
2349                 qlcnic_83xx_register_nic_idc_func(adapter, 0);
2350                 cancel_delayed_work_sync(&adapter->idc_aen_work);
2351                 qlcnic_83xx_free_mbx_intr(adapter);
2352                 qlcnic_83xx_detach_mailbox_work(adapter);
2353                 qlcnic_83xx_free_mailbox(ahw->mailbox);
2354         }
2355
2356         qlcnic_detach(adapter);
2357
2358         if (adapter->npars != NULL)
2359                 kfree(adapter->npars);
2360         if (adapter->eswitch != NULL)
2361                 kfree(adapter->eswitch);
2362
2363         if (qlcnic_82xx_check(adapter))
2364                 qlcnic_clr_all_drv_state(adapter, 0);
2365
2366         clear_bit(__QLCNIC_RESETTING, &adapter->state);
2367
2368         qlcnic_free_lb_filters_mem(adapter);
2369
2370         qlcnic_teardown_intr(adapter);
2371
2372         qlcnic_remove_sysfs(adapter);
2373
2374         qlcnic_cleanup_pci_map(adapter->ahw);
2375
2376         qlcnic_release_firmware(adapter);
2377
2378         pci_disable_pcie_error_reporting(pdev);
2379         pci_release_regions(pdev);
2380         pci_disable_device(pdev);
2381         pci_set_drvdata(pdev, NULL);
2382
2383         if (adapter->qlcnic_wq) {
2384                 destroy_workqueue(adapter->qlcnic_wq);
2385                 adapter->qlcnic_wq = NULL;
2386         }
2387         qlcnic_free_adapter_resources(adapter);
2388         kfree(ahw);
2389         free_netdev(netdev);
2390 }
2391
2392 static void qlcnic_shutdown(struct pci_dev *pdev)
2393 {
2394         if (__qlcnic_shutdown(pdev))
2395                 return;
2396
2397         pci_disable_device(pdev);
2398 }
2399
2400 #ifdef CONFIG_PM
2401 static int qlcnic_suspend(struct pci_dev *pdev, pm_message_t state)
2402 {
2403         int retval;
2404
2405         retval = __qlcnic_shutdown(pdev);
2406         if (retval)
2407                 return retval;
2408
2409         pci_set_power_state(pdev, pci_choose_state(pdev, state));
2410         return 0;
2411 }
2412
2413 static int qlcnic_resume(struct pci_dev *pdev)
2414 {
2415         struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
2416         int err;
2417
2418         err = pci_enable_device(pdev);
2419         if (err)
2420                 return err;
2421
2422         pci_set_power_state(pdev, PCI_D0);
2423         pci_set_master(pdev);
2424         pci_restore_state(pdev);
2425
2426         return  __qlcnic_resume(adapter);
2427 }
2428 #endif
2429
2430 static int qlcnic_open(struct net_device *netdev)
2431 {
2432         struct qlcnic_adapter *adapter = netdev_priv(netdev);
2433         int err;
2434
2435         netif_carrier_off(netdev);
2436
2437         err = qlcnic_attach(adapter);
2438         if (err)
2439                 return err;
2440
2441         err = __qlcnic_up(adapter, netdev);
2442         if (err)
2443                 goto err_out;
2444
2445         netif_tx_start_all_queues(netdev);
2446
2447         return 0;
2448
2449 err_out:
2450         qlcnic_detach(adapter);
2451         return err;
2452 }
2453
2454 /*
2455  * qlcnic_close - Disables a network interface entry point
2456  */
2457 static int qlcnic_close(struct net_device *netdev)
2458 {
2459         struct qlcnic_adapter *adapter = netdev_priv(netdev);
2460
2461         __qlcnic_down(adapter, netdev);
2462
2463         return 0;
2464 }
2465
2466 void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter)
2467 {
2468         void *head;
2469         int i;
2470         struct net_device *netdev = adapter->netdev;
2471         u32 filter_size = 0;
2472         u16 act_pci_func = 0;
2473
2474         if (adapter->fhash.fmax && adapter->fhash.fhead)
2475                 return;
2476
2477         act_pci_func = adapter->ahw->act_pci_func;
2478         spin_lock_init(&adapter->mac_learn_lock);
2479         spin_lock_init(&adapter->rx_mac_learn_lock);
2480
2481         if (qlcnic_82xx_check(adapter)) {
2482                 filter_size = QLCNIC_LB_MAX_FILTERS;
2483                 adapter->fhash.fbucket_size = QLCNIC_LB_BUCKET_SIZE;
2484         } else {
2485                 filter_size = QLC_83XX_LB_MAX_FILTERS;
2486                 adapter->fhash.fbucket_size = QLC_83XX_LB_BUCKET_SIZE;
2487         }
2488
2489         head = kcalloc(adapter->fhash.fbucket_size,
2490                        sizeof(struct hlist_head), GFP_ATOMIC);
2491
2492         if (!head)
2493                 return;
2494
2495         adapter->fhash.fmax = (filter_size / act_pci_func);
2496         adapter->fhash.fhead = head;
2497
2498         netdev_info(netdev, "active nic func = %d, mac filter size=%d\n",
2499                     act_pci_func, adapter->fhash.fmax);
2500
2501         for (i = 0; i < adapter->fhash.fbucket_size; i++)
2502                 INIT_HLIST_HEAD(&adapter->fhash.fhead[i]);
2503
2504         adapter->rx_fhash.fbucket_size = adapter->fhash.fbucket_size;
2505
2506         head = kcalloc(adapter->rx_fhash.fbucket_size,
2507                        sizeof(struct hlist_head), GFP_ATOMIC);
2508
2509         if (!head)
2510                 return;
2511
2512         adapter->rx_fhash.fmax = (filter_size / act_pci_func);
2513         adapter->rx_fhash.fhead = head;
2514
2515         for (i = 0; i < adapter->rx_fhash.fbucket_size; i++)
2516                 INIT_HLIST_HEAD(&adapter->rx_fhash.fhead[i]);
2517 }
2518
2519 static void qlcnic_free_lb_filters_mem(struct qlcnic_adapter *adapter)
2520 {
2521         if (adapter->fhash.fmax && adapter->fhash.fhead)
2522                 kfree(adapter->fhash.fhead);
2523
2524         adapter->fhash.fhead = NULL;
2525         adapter->fhash.fmax = 0;
2526
2527         if (adapter->rx_fhash.fmax && adapter->rx_fhash.fhead)
2528                 kfree(adapter->rx_fhash.fhead);
2529
2530         adapter->rx_fhash.fmax = 0;
2531         adapter->rx_fhash.fhead = NULL;
2532 }
2533
2534 int qlcnic_check_temp(struct qlcnic_adapter *adapter)
2535 {
2536         struct net_device *netdev = adapter->netdev;
2537         u32 temp_state, temp_val, temp = 0;
2538         int rv = 0;
2539
2540         if (qlcnic_83xx_check(adapter))
2541                 temp = QLCRDX(adapter->ahw, QLC_83XX_ASIC_TEMP);
2542
2543         if (qlcnic_82xx_check(adapter))
2544                 temp = QLC_SHARED_REG_RD32(adapter, QLCNIC_ASIC_TEMP);
2545
2546         temp_state = qlcnic_get_temp_state(temp);
2547         temp_val = qlcnic_get_temp_val(temp);
2548
2549         if (temp_state == QLCNIC_TEMP_PANIC) {
2550                 dev_err(&netdev->dev,
2551                        "Device temperature %d degrees C exceeds"
2552                        " maximum allowed. Hardware has been shut down.\n",
2553                        temp_val);
2554                 rv = 1;
2555         } else if (temp_state == QLCNIC_TEMP_WARN) {
2556                 if (adapter->ahw->temp == QLCNIC_TEMP_NORMAL) {
2557                         dev_err(&netdev->dev,
2558                                "Device temperature %d degrees C "
2559                                "exceeds operating range."
2560                                " Immediate action needed.\n",
2561                                temp_val);
2562                 }
2563         } else {
2564                 if (adapter->ahw->temp == QLCNIC_TEMP_WARN) {
2565                         dev_info(&netdev->dev,
2566                                "Device temperature is now %d degrees C"
2567                                " in normal range.\n", temp_val);
2568                 }
2569         }
2570         adapter->ahw->temp = temp_state;
2571         return rv;
2572 }
2573
2574 static void qlcnic_tx_timeout(struct net_device *netdev)
2575 {
2576         struct qlcnic_adapter *adapter = netdev_priv(netdev);
2577         struct qlcnic_host_tx_ring *tx_ring;
2578         int ring;
2579
2580         if (test_bit(__QLCNIC_RESETTING, &adapter->state))
2581                 return;
2582
2583         if (++adapter->tx_timeo_cnt >= QLCNIC_MAX_TX_TIMEOUTS) {
2584                 netdev_info(netdev, "Tx timeout, reset the adapter.\n");
2585                 if (qlcnic_82xx_check(adapter))
2586                         adapter->need_fw_reset = 1;
2587                 else if (qlcnic_83xx_check(adapter))
2588                         qlcnic_83xx_idc_request_reset(adapter,
2589                                                       QLCNIC_FORCE_FW_DUMP_KEY);
2590         } else {
2591                 netdev_info(netdev, "Tx timeout, reset adapter context.\n");
2592                 if (qlcnic_82xx_check(adapter)) {
2593                         for (ring = 0; ring < adapter->max_drv_tx_rings;
2594                              ring++) {
2595                                 tx_ring = &adapter->tx_ring[ring];
2596                                 dev_info(&netdev->dev, "ring=%d\n", ring);
2597                                 dev_info(&netdev->dev, "crb_intr_mask=%d\n",
2598                                          readl(tx_ring->crb_intr_mask));
2599                                 dev_info(&netdev->dev, "producer=%d\n",
2600                                          readl(tx_ring->crb_cmd_producer));
2601                                 dev_info(&netdev->dev, "sw_consumer = %d\n",
2602                                          tx_ring->sw_consumer);
2603                                 dev_info(&netdev->dev, "hw_consumer = %d\n",
2604                                          le32_to_cpu(*(tx_ring->hw_consumer)));
2605                                 dev_info(&netdev->dev, "xmit-on=%llu\n",
2606                                          tx_ring->xmit_on);
2607                                 dev_info(&netdev->dev, "xmit-off=%llu\n",
2608                                          tx_ring->xmit_off);
2609                         }
2610                 }
2611                 adapter->ahw->reset_context = 1;
2612         }
2613 }
2614
2615 static struct net_device_stats *qlcnic_get_stats(struct net_device *netdev)
2616 {
2617         struct qlcnic_adapter *adapter = netdev_priv(netdev);
2618         struct net_device_stats *stats = &netdev->stats;
2619
2620         stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts;
2621         stats->tx_packets = adapter->stats.xmitfinished;
2622         stats->rx_bytes = adapter->stats.rxbytes + adapter->stats.lrobytes;
2623         stats->tx_bytes = adapter->stats.txbytes;
2624         stats->rx_dropped = adapter->stats.rxdropped;
2625         stats->tx_dropped = adapter->stats.txdropped;
2626
2627         return stats;
2628 }
2629
2630 irqreturn_t qlcnic_82xx_clear_legacy_intr(struct qlcnic_adapter *adapter)
2631 {
2632         u32 status;
2633
2634         status = readl(adapter->isr_int_vec);
2635
2636         if (!(status & adapter->ahw->int_vec_bit))
2637                 return IRQ_NONE;
2638
2639         /* check interrupt state machine, to be sure */
2640         status = readl(adapter->crb_int_state_reg);
2641         if (!ISR_LEGACY_INT_TRIGGERED(status))
2642                 return IRQ_NONE;
2643
2644         writel(0xffffffff, adapter->tgt_status_reg);
2645         /* read twice to ensure write is flushed */
2646         readl(adapter->isr_int_vec);
2647         readl(adapter->isr_int_vec);
2648
2649         return IRQ_HANDLED;
2650 }
2651
2652 static irqreturn_t qlcnic_tmp_intr(int irq, void *data)
2653 {
2654         struct qlcnic_host_sds_ring *sds_ring = data;
2655         struct qlcnic_adapter *adapter = sds_ring->adapter;
2656
2657         if (adapter->flags & QLCNIC_MSIX_ENABLED)
2658                 goto done;
2659         else if (adapter->flags & QLCNIC_MSI_ENABLED) {
2660                 writel(0xffffffff, adapter->tgt_status_reg);
2661                 goto done;
2662         }
2663
2664         if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE)
2665                 return IRQ_NONE;
2666
2667 done:
2668         adapter->ahw->diag_cnt++;
2669         qlcnic_enable_int(sds_ring);
2670         return IRQ_HANDLED;
2671 }
2672
2673 static irqreturn_t qlcnic_intr(int irq, void *data)
2674 {
2675         struct qlcnic_host_sds_ring *sds_ring = data;
2676         struct qlcnic_adapter *adapter = sds_ring->adapter;
2677
2678         if (qlcnic_clear_legacy_intr(adapter) == IRQ_NONE)
2679                 return IRQ_NONE;
2680
2681         napi_schedule(&sds_ring->napi);
2682
2683         return IRQ_HANDLED;
2684 }
2685
2686 static irqreturn_t qlcnic_msi_intr(int irq, void *data)
2687 {
2688         struct qlcnic_host_sds_ring *sds_ring = data;
2689         struct qlcnic_adapter *adapter = sds_ring->adapter;
2690
2691         /* clear interrupt */
2692         writel(0xffffffff, adapter->tgt_status_reg);
2693
2694         napi_schedule(&sds_ring->napi);
2695         return IRQ_HANDLED;
2696 }
2697
2698 static irqreturn_t qlcnic_msix_intr(int irq, void *data)
2699 {
2700         struct qlcnic_host_sds_ring *sds_ring = data;
2701
2702         napi_schedule(&sds_ring->napi);
2703         return IRQ_HANDLED;
2704 }
2705
2706 static irqreturn_t qlcnic_msix_tx_intr(int irq, void *data)
2707 {
2708         struct qlcnic_host_tx_ring *tx_ring = data;
2709
2710         napi_schedule(&tx_ring->napi);
2711         return IRQ_HANDLED;
2712 }
2713
2714 #ifdef CONFIG_NET_POLL_CONTROLLER
2715 static void qlcnic_poll_controller(struct net_device *netdev)
2716 {
2717         int ring;
2718         struct qlcnic_host_sds_ring *sds_ring;
2719         struct qlcnic_adapter *adapter = netdev_priv(netdev);
2720         struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
2721
2722         disable_irq(adapter->irq);
2723         for (ring = 0; ring < adapter->max_sds_rings; ring++) {
2724                 sds_ring = &recv_ctx->sds_rings[ring];
2725                 qlcnic_intr(adapter->irq, sds_ring);
2726         }
2727         enable_irq(adapter->irq);
2728 }
2729 #endif
2730
2731 static void
2732 qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding)
2733 {
2734         u32 val;
2735
2736         val = adapter->portnum & 0xf;
2737         val |= encoding << 7;
2738         val |= (jiffies - adapter->dev_rst_time) << 8;
2739
2740         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_SCRATCH, val);
2741         adapter->dev_rst_time = jiffies;
2742 }
2743
2744 static int
2745 qlcnic_set_drv_state(struct qlcnic_adapter *adapter, u8 state)
2746 {
2747         u32  val;
2748
2749         WARN_ON(state != QLCNIC_DEV_NEED_RESET &&
2750                         state != QLCNIC_DEV_NEED_QUISCENT);
2751
2752         if (qlcnic_api_lock(adapter))
2753                 return -EIO;
2754
2755         val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2756
2757         if (state == QLCNIC_DEV_NEED_RESET)
2758                 QLC_DEV_SET_RST_RDY(val, adapter->portnum);
2759         else if (state == QLCNIC_DEV_NEED_QUISCENT)
2760                 QLC_DEV_SET_QSCNT_RDY(val, adapter->portnum);
2761
2762         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
2763
2764         qlcnic_api_unlock(adapter);
2765
2766         return 0;
2767 }
2768
2769 static int
2770 qlcnic_clr_drv_state(struct qlcnic_adapter *adapter)
2771 {
2772         u32  val;
2773
2774         if (qlcnic_api_lock(adapter))
2775                 return -EBUSY;
2776
2777         val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2778         QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum);
2779         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
2780
2781         qlcnic_api_unlock(adapter);
2782
2783         return 0;
2784 }
2785
2786 void qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8 failed)
2787 {
2788         u32  val;
2789
2790         if (qlcnic_api_lock(adapter))
2791                 goto err;
2792
2793         val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE);
2794         QLC_DEV_CLR_REF_CNT(val, adapter->portnum);
2795         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val);
2796
2797         if (failed) {
2798                 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
2799                                     QLCNIC_DEV_FAILED);
2800                 dev_info(&adapter->pdev->dev,
2801                                 "Device state set to Failed. Please Reboot\n");
2802         } else if (!(val & 0x11111111))
2803                 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
2804                                     QLCNIC_DEV_COLD);
2805
2806         val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2807         QLC_DEV_CLR_RST_QSCNT(val, adapter->portnum);
2808         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
2809
2810         qlcnic_api_unlock(adapter);
2811 err:
2812         adapter->fw_fail_cnt = 0;
2813         adapter->flags &= ~QLCNIC_FW_HANG;
2814         clear_bit(__QLCNIC_START_FW, &adapter->state);
2815         clear_bit(__QLCNIC_RESETTING, &adapter->state);
2816 }
2817
2818 /* Grab api lock, before checking state */
2819 static int
2820 qlcnic_check_drv_state(struct qlcnic_adapter *adapter)
2821 {
2822         int act, state, active_mask;
2823         struct qlcnic_hardware_context *ahw = adapter->ahw;
2824
2825         state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2826         act = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE);
2827
2828         if (adapter->flags & QLCNIC_FW_RESET_OWNER) {
2829                 active_mask = (~(1 << (ahw->pci_func * 4)));
2830                 act = act & active_mask;
2831         }
2832
2833         if (((state & 0x11111111) == (act & 0x11111111)) ||
2834                         ((act & 0x11111111) == ((state >> 1) & 0x11111111)))
2835                 return 0;
2836         else
2837                 return 1;
2838 }
2839
2840 static int qlcnic_check_idc_ver(struct qlcnic_adapter *adapter)
2841 {
2842         u32 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_IDC_VER);
2843
2844         if (val != QLCNIC_DRV_IDC_VER) {
2845                 dev_warn(&adapter->pdev->dev, "IDC Version mismatch, driver's"
2846                         " idc ver = %x; reqd = %x\n", QLCNIC_DRV_IDC_VER, val);
2847         }
2848
2849         return 0;
2850 }
2851
2852 static int
2853 qlcnic_can_start_firmware(struct qlcnic_adapter *adapter)
2854 {
2855         u32 val, prev_state;
2856         u8 dev_init_timeo = adapter->dev_init_timeo;
2857         u8 portnum = adapter->portnum;
2858         u8 ret;
2859
2860         if (test_and_clear_bit(__QLCNIC_START_FW, &adapter->state))
2861                 return 1;
2862
2863         if (qlcnic_api_lock(adapter))
2864                 return -1;
2865
2866         val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_ACTIVE);
2867         if (!(val & (1 << (portnum * 4)))) {
2868                 QLC_DEV_SET_REF_CNT(val, portnum);
2869                 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_ACTIVE, val);
2870         }
2871
2872         prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
2873         QLCDB(adapter, HW, "Device state = %u\n", prev_state);
2874
2875         switch (prev_state) {
2876         case QLCNIC_DEV_COLD:
2877                 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
2878                                     QLCNIC_DEV_INITIALIZING);
2879                 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_IDC_VER,
2880                                     QLCNIC_DRV_IDC_VER);
2881                 qlcnic_idc_debug_info(adapter, 0);
2882                 qlcnic_api_unlock(adapter);
2883                 return 1;
2884
2885         case QLCNIC_DEV_READY:
2886                 ret = qlcnic_check_idc_ver(adapter);
2887                 qlcnic_api_unlock(adapter);
2888                 return ret;
2889
2890         case QLCNIC_DEV_NEED_RESET:
2891                 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2892                 QLC_DEV_SET_RST_RDY(val, portnum);
2893                 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
2894                 break;
2895
2896         case QLCNIC_DEV_NEED_QUISCENT:
2897                 val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2898                 QLC_DEV_SET_QSCNT_RDY(val, portnum);
2899                 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
2900                 break;
2901
2902         case QLCNIC_DEV_FAILED:
2903                 dev_err(&adapter->pdev->dev, "Device in failed state.\n");
2904                 qlcnic_api_unlock(adapter);
2905                 return -1;
2906
2907         case QLCNIC_DEV_INITIALIZING:
2908         case QLCNIC_DEV_QUISCENT:
2909                 break;
2910         }
2911
2912         qlcnic_api_unlock(adapter);
2913
2914         do {
2915                 msleep(1000);
2916                 prev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
2917
2918                 if (prev_state == QLCNIC_DEV_QUISCENT)
2919                         continue;
2920         } while ((prev_state != QLCNIC_DEV_READY) && --dev_init_timeo);
2921
2922         if (!dev_init_timeo) {
2923                 dev_err(&adapter->pdev->dev,
2924                         "Waiting for device to initialize timeout\n");
2925                 return -1;
2926         }
2927
2928         if (qlcnic_api_lock(adapter))
2929                 return -1;
2930
2931         val = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DRV_STATE);
2932         QLC_DEV_CLR_RST_QSCNT(val, portnum);
2933         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DRV_STATE, val);
2934
2935         ret = qlcnic_check_idc_ver(adapter);
2936         qlcnic_api_unlock(adapter);
2937
2938         return ret;
2939 }
2940
2941 static void
2942 qlcnic_fwinit_work(struct work_struct *work)
2943 {
2944         struct qlcnic_adapter *adapter = container_of(work,
2945                         struct qlcnic_adapter, fw_work.work);
2946         u32 dev_state = 0xf;
2947         u32 val;
2948
2949         if (qlcnic_api_lock(adapter))
2950                 goto err_ret;
2951
2952         dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
2953         if (dev_state == QLCNIC_DEV_QUISCENT ||
2954             dev_state == QLCNIC_DEV_NEED_QUISCENT) {
2955                 qlcnic_api_unlock(adapter);
2956                 qlcnic_schedule_work(adapter, qlcnic_fwinit_work,
2957                                                 FW_POLL_DELAY * 2);
2958                 return;
2959         }
2960
2961         if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
2962                 qlcnic_api_unlock(adapter);
2963                 goto wait_npar;
2964         }
2965
2966         if (dev_state == QLCNIC_DEV_INITIALIZING ||
2967             dev_state == QLCNIC_DEV_READY) {
2968                 dev_info(&adapter->pdev->dev, "Detected state change from "
2969                                 "DEV_NEED_RESET, skipping ack check\n");
2970                 goto skip_ack_check;
2971         }
2972
2973         if (adapter->fw_wait_cnt++ > adapter->reset_ack_timeo) {
2974                 dev_info(&adapter->pdev->dev, "Reset:Failed to get ack %d sec\n",
2975                                         adapter->reset_ack_timeo);
2976                 goto skip_ack_check;
2977         }
2978
2979         if (!qlcnic_check_drv_state(adapter)) {
2980 skip_ack_check:
2981                 dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
2982
2983                 if (dev_state == QLCNIC_DEV_NEED_RESET) {
2984                         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
2985                                             QLCNIC_DEV_INITIALIZING);
2986                         set_bit(__QLCNIC_START_FW, &adapter->state);
2987                         QLCDB(adapter, DRV, "Restarting fw\n");
2988                         qlcnic_idc_debug_info(adapter, 0);
2989                         val = QLC_SHARED_REG_RD32(adapter,
2990                                                   QLCNIC_CRB_DRV_STATE);
2991                         QLC_DEV_SET_RST_RDY(val, adapter->portnum);
2992                         QLC_SHARED_REG_WR32(adapter,
2993                                             QLCNIC_CRB_DRV_STATE, val);
2994                 }
2995
2996                 qlcnic_api_unlock(adapter);
2997
2998                 rtnl_lock();
2999                 if (adapter->ahw->fw_dump.enable &&
3000                     (adapter->flags & QLCNIC_FW_RESET_OWNER)) {
3001                         QLCDB(adapter, DRV, "Take FW dump\n");
3002                         qlcnic_dump_fw(adapter);
3003                         adapter->flags |= QLCNIC_FW_HANG;
3004                 }
3005                 rtnl_unlock();
3006
3007                 adapter->flags &= ~QLCNIC_FW_RESET_OWNER;
3008                 if (!adapter->nic_ops->start_firmware(adapter)) {
3009                         qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
3010                         adapter->fw_wait_cnt = 0;
3011                         return;
3012                 }
3013                 goto err_ret;
3014         }
3015
3016         qlcnic_api_unlock(adapter);
3017
3018 wait_npar:
3019         dev_state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3020         QLCDB(adapter, HW, "Func waiting: Device state=%u\n", dev_state);
3021
3022         switch (dev_state) {
3023         case QLCNIC_DEV_READY:
3024                 if (!qlcnic_start_firmware(adapter)) {
3025                         qlcnic_schedule_work(adapter, qlcnic_attach_work, 0);
3026                         adapter->fw_wait_cnt = 0;
3027                         return;
3028                 }
3029         case QLCNIC_DEV_FAILED:
3030                 break;
3031         default:
3032                 qlcnic_schedule_work(adapter,
3033                         qlcnic_fwinit_work, FW_POLL_DELAY);
3034                 return;
3035         }
3036
3037 err_ret:
3038         dev_err(&adapter->pdev->dev, "Fwinit work failed state=%u "
3039                 "fw_wait_cnt=%u\n", dev_state, adapter->fw_wait_cnt);
3040         netif_device_attach(adapter->netdev);
3041         qlcnic_clr_all_drv_state(adapter, 0);
3042 }
3043
3044 static void
3045 qlcnic_detach_work(struct work_struct *work)
3046 {
3047         struct qlcnic_adapter *adapter = container_of(work,
3048                         struct qlcnic_adapter, fw_work.work);
3049         struct net_device *netdev = adapter->netdev;
3050         u32 status;
3051
3052         netif_device_detach(netdev);
3053
3054         /* Dont grab rtnl lock during Quiscent mode */
3055         if (adapter->dev_state == QLCNIC_DEV_NEED_QUISCENT) {
3056                 if (netif_running(netdev))
3057                         __qlcnic_down(adapter, netdev);
3058         } else
3059                 qlcnic_down(adapter, netdev);
3060
3061         status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1);
3062
3063         if (status & QLCNIC_RCODE_FATAL_ERROR) {
3064                 dev_err(&adapter->pdev->dev,
3065                         "Detaching the device: peg halt status1=0x%x\n",
3066                                         status);
3067
3068                 if (QLCNIC_FWERROR_CODE(status) == QLCNIC_FWERROR_FAN_FAILURE) {
3069                         dev_err(&adapter->pdev->dev,
3070                         "On board active cooling fan failed. "
3071                                 "Device has been halted.\n");
3072                         dev_err(&adapter->pdev->dev,
3073                                 "Replace the adapter.\n");
3074                 }
3075
3076                 goto err_ret;
3077         }
3078
3079         if (adapter->ahw->temp == QLCNIC_TEMP_PANIC) {
3080                 dev_err(&adapter->pdev->dev, "Detaching the device: temp=%d\n",
3081                         adapter->ahw->temp);
3082                 goto err_ret;
3083         }
3084
3085         /* Dont ack if this instance is the reset owner */
3086         if (!(adapter->flags & QLCNIC_FW_RESET_OWNER)) {
3087                 if (qlcnic_set_drv_state(adapter, adapter->dev_state)) {
3088                         dev_err(&adapter->pdev->dev,
3089                                 "Failed to set driver state,"
3090                                         "detaching the device.\n");
3091                         goto err_ret;
3092                 }
3093         }
3094
3095         adapter->fw_wait_cnt = 0;
3096
3097         qlcnic_schedule_work(adapter, qlcnic_fwinit_work, FW_POLL_DELAY);
3098
3099         return;
3100
3101 err_ret:
3102         netif_device_attach(netdev);
3103         qlcnic_clr_all_drv_state(adapter, 1);
3104 }
3105
3106 /*Transit NPAR state to NON Operational */
3107 static void
3108 qlcnic_set_npar_non_operational(struct qlcnic_adapter *adapter)
3109 {
3110         u32 state;
3111
3112         state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_NPAR_STATE);
3113         if (state == QLCNIC_DEV_NPAR_NON_OPER)
3114                 return;
3115
3116         if (qlcnic_api_lock(adapter))
3117                 return;
3118         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE,
3119                             QLCNIC_DEV_NPAR_NON_OPER);
3120         qlcnic_api_unlock(adapter);
3121 }
3122
3123 void qlcnic_82xx_dev_request_reset(struct qlcnic_adapter *adapter, u32 key)
3124 {
3125         u32 state, xg_val = 0, gb_val = 0;
3126
3127         qlcnic_xg_set_xg0_mask(xg_val);
3128         qlcnic_xg_set_xg1_mask(xg_val);
3129         QLCWR32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, xg_val);
3130         qlcnic_gb_set_gb0_mask(gb_val);
3131         qlcnic_gb_set_gb1_mask(gb_val);
3132         qlcnic_gb_set_gb2_mask(gb_val);
3133         qlcnic_gb_set_gb3_mask(gb_val);
3134         QLCWR32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, gb_val);
3135         dev_info(&adapter->pdev->dev, "Pause control frames disabled"
3136                                 " on all ports\n");
3137         adapter->need_fw_reset = 1;
3138
3139         if (qlcnic_api_lock(adapter))
3140                 return;
3141
3142         state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3143
3144         if (state == QLCNIC_DEV_READY) {
3145                 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
3146                                     QLCNIC_DEV_NEED_RESET);
3147                 adapter->flags |= QLCNIC_FW_RESET_OWNER;
3148                 QLCDB(adapter, DRV, "NEED_RESET state set\n");
3149                 qlcnic_idc_debug_info(adapter, 0);
3150         }
3151
3152         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE,
3153                             QLCNIC_DEV_NPAR_NON_OPER);
3154         qlcnic_api_unlock(adapter);
3155 }
3156
3157 /* Transit to NPAR READY state from NPAR NOT READY state */
3158 static void
3159 qlcnic_dev_set_npar_ready(struct qlcnic_adapter *adapter)
3160 {
3161         if (qlcnic_api_lock(adapter))
3162                 return;
3163
3164         QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_NPAR_STATE,
3165                             QLCNIC_DEV_NPAR_OPER);
3166         QLCDB(adapter, DRV, "NPAR operational state set\n");
3167
3168         qlcnic_api_unlock(adapter);
3169 }
3170
3171 void qlcnic_schedule_work(struct qlcnic_adapter *adapter,
3172                           work_func_t func, int delay)
3173 {
3174         if (test_bit(__QLCNIC_AER, &adapter->state))
3175                 return;
3176
3177         INIT_DELAYED_WORK(&adapter->fw_work, func);
3178         queue_delayed_work(adapter->qlcnic_wq, &adapter->fw_work,
3179                            round_jiffies_relative(delay));
3180 }
3181
3182 static void
3183 qlcnic_attach_work(struct work_struct *work)
3184 {
3185         struct qlcnic_adapter *adapter = container_of(work,
3186                                 struct qlcnic_adapter, fw_work.work);
3187         struct net_device *netdev = adapter->netdev;
3188         u32 npar_state;
3189
3190         if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) {
3191                 npar_state = QLC_SHARED_REG_RD32(adapter,
3192                                                  QLCNIC_CRB_DEV_NPAR_STATE);
3193                 if (adapter->fw_wait_cnt++ > QLCNIC_DEV_NPAR_OPER_TIMEO)
3194                         qlcnic_clr_all_drv_state(adapter, 0);
3195                 else if (npar_state != QLCNIC_DEV_NPAR_OPER)
3196                         qlcnic_schedule_work(adapter, qlcnic_attach_work,
3197                                                         FW_POLL_DELAY);
3198                 else
3199                         goto attach;
3200                 QLCDB(adapter, DRV, "Waiting for NPAR state to operational\n");
3201                 return;
3202         }
3203 attach:
3204         if (netif_running(netdev)) {
3205                 if (qlcnic_up(adapter, netdev))
3206                         goto done;
3207
3208                 qlcnic_restore_indev_addr(netdev, NETDEV_UP);
3209         }
3210
3211 done:
3212         netif_device_attach(netdev);
3213         adapter->fw_fail_cnt = 0;
3214         adapter->flags &= ~QLCNIC_FW_HANG;
3215         clear_bit(__QLCNIC_RESETTING, &adapter->state);
3216         if (adapter->portnum == 0)
3217                 qlcnic_set_drv_version(adapter);
3218
3219         if (!qlcnic_clr_drv_state(adapter))
3220                 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work,
3221                                                         FW_POLL_DELAY);
3222 }
3223
3224 static int
3225 qlcnic_check_health(struct qlcnic_adapter *adapter)
3226 {
3227         u32 state = 0, heartbeat;
3228         u32 peg_status;
3229         int err = 0;
3230
3231         if (qlcnic_check_temp(adapter))
3232                 goto detach;
3233
3234         if (adapter->need_fw_reset)
3235                 qlcnic_dev_request_reset(adapter, 0);
3236
3237         state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3238         if (state == QLCNIC_DEV_NEED_RESET) {
3239                 qlcnic_set_npar_non_operational(adapter);
3240                 adapter->need_fw_reset = 1;
3241         } else if (state == QLCNIC_DEV_NEED_QUISCENT)
3242                 goto detach;
3243
3244         heartbeat = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_ALIVE_COUNTER);
3245         if (heartbeat != adapter->heartbeat) {
3246                 adapter->heartbeat = heartbeat;
3247                 adapter->fw_fail_cnt = 0;
3248                 if (adapter->need_fw_reset)
3249                         goto detach;
3250
3251                 if (adapter->ahw->reset_context && qlcnic_auto_fw_reset)
3252                         qlcnic_reset_hw_context(adapter);
3253
3254                 return 0;
3255         }
3256
3257         if (++adapter->fw_fail_cnt < FW_FAIL_THRESH)
3258                 return 0;
3259
3260         adapter->flags |= QLCNIC_FW_HANG;
3261
3262         qlcnic_dev_request_reset(adapter, 0);
3263
3264         if (qlcnic_auto_fw_reset)
3265                 clear_bit(__QLCNIC_FW_ATTACHED, &adapter->state);
3266
3267         dev_err(&adapter->pdev->dev, "firmware hang detected\n");
3268         peg_status = QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS1);
3269         dev_err(&adapter->pdev->dev, "Dumping hw/fw registers\n"
3270                         "PEG_HALT_STATUS1: 0x%x, PEG_HALT_STATUS2: 0x%x,\n"
3271                         "PEG_NET_0_PC: 0x%x, PEG_NET_1_PC: 0x%x,\n"
3272                         "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
3273                         "PEG_NET_4_PC: 0x%x\n",
3274                         peg_status,
3275                         QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2),
3276                         QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err),
3277                         QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err),
3278                         QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err),
3279                         QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err),
3280                         QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err));
3281         if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
3282                 dev_err(&adapter->pdev->dev,
3283                         "Firmware aborted with error code 0x00006700. "
3284                                 "Device is being reset.\n");
3285 detach:
3286         adapter->dev_state = (state == QLCNIC_DEV_NEED_QUISCENT) ? state :
3287                 QLCNIC_DEV_NEED_RESET;
3288
3289         if (qlcnic_auto_fw_reset && !test_and_set_bit(__QLCNIC_RESETTING,
3290                                                       &adapter->state)) {
3291
3292                 qlcnic_schedule_work(adapter, qlcnic_detach_work, 0);
3293                 QLCDB(adapter, DRV, "fw recovery scheduled.\n");
3294         }
3295
3296         return 1;
3297 }
3298
3299 void qlcnic_fw_poll_work(struct work_struct *work)
3300 {
3301         struct qlcnic_adapter *adapter = container_of(work,
3302                                 struct qlcnic_adapter, fw_work.work);
3303
3304         if (test_bit(__QLCNIC_RESETTING, &adapter->state))
3305                 goto reschedule;
3306
3307
3308         if (qlcnic_check_health(adapter))
3309                 return;
3310
3311         if (adapter->fhash.fnum)
3312                 qlcnic_prune_lb_filters(adapter);
3313
3314 reschedule:
3315         qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY);
3316 }
3317
3318 static int qlcnic_is_first_func(struct pci_dev *pdev)
3319 {
3320         struct pci_dev *oth_pdev;
3321         int val = pdev->devfn;
3322
3323         while (val-- > 0) {
3324                 oth_pdev = pci_get_domain_bus_and_slot(pci_domain_nr
3325                         (pdev->bus), pdev->bus->number,
3326                         PCI_DEVFN(PCI_SLOT(pdev->devfn), val));
3327                 if (!oth_pdev)
3328                         continue;
3329
3330                 if (oth_pdev->current_state != PCI_D3cold) {
3331                         pci_dev_put(oth_pdev);
3332                         return 0;
3333                 }
3334                 pci_dev_put(oth_pdev);
3335         }
3336         return 1;
3337 }
3338
3339 static int qlcnic_attach_func(struct pci_dev *pdev)
3340 {
3341         int err, first_func;
3342         struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3343         struct net_device *netdev = adapter->netdev;
3344
3345         pdev->error_state = pci_channel_io_normal;
3346
3347         err = pci_enable_device(pdev);
3348         if (err)
3349                 return err;
3350
3351         pci_set_master(pdev);
3352         pci_restore_state(pdev);
3353
3354         first_func = qlcnic_is_first_func(pdev);
3355
3356         if (qlcnic_api_lock(adapter))
3357                 return -EINVAL;
3358
3359         if (adapter->ahw->op_mode != QLCNIC_NON_PRIV_FUNC && first_func) {
3360                 adapter->need_fw_reset = 1;
3361                 set_bit(__QLCNIC_START_FW, &adapter->state);
3362                 QLC_SHARED_REG_WR32(adapter, QLCNIC_CRB_DEV_STATE,
3363                                     QLCNIC_DEV_INITIALIZING);
3364                 QLCDB(adapter, DRV, "Restarting fw\n");
3365         }
3366         qlcnic_api_unlock(adapter);
3367
3368         err = qlcnic_start_firmware(adapter);
3369         if (err)
3370                 return err;
3371
3372         qlcnic_clr_drv_state(adapter);
3373         kfree(adapter->msix_entries);
3374         adapter->msix_entries = NULL;
3375         err = qlcnic_setup_intr(adapter, 0, 0);
3376
3377         if (err) {
3378                 kfree(adapter->msix_entries);
3379                 netdev_err(netdev, "failed to setup interrupt\n");
3380                 return err;
3381         }
3382
3383         if (qlcnic_83xx_check(adapter)) {
3384                 /* register for NIC IDC AEN Events */
3385                 qlcnic_83xx_register_nic_idc_func(adapter, 1);
3386                 err = qlcnic_83xx_setup_mbx_intr(adapter);
3387                 if (err) {
3388                         dev_err(&adapter->pdev->dev,
3389                                 "failed to setup mbx interrupt\n");
3390                         qlcnic_clr_all_drv_state(adapter, 1);
3391                         clear_bit(__QLCNIC_AER, &adapter->state);
3392                         goto done;
3393                 }
3394         }
3395
3396         if (netif_running(netdev)) {
3397                 err = qlcnic_attach(adapter);
3398                 if (err) {
3399                         qlcnic_clr_all_drv_state(adapter, 1);
3400                         clear_bit(__QLCNIC_AER, &adapter->state);
3401                         netif_device_attach(netdev);
3402                         return err;
3403                 }
3404
3405                 err = qlcnic_up(adapter, netdev);
3406                 if (err)
3407                         goto done;
3408
3409                 qlcnic_restore_indev_addr(netdev, NETDEV_UP);
3410         }
3411  done:
3412         netif_device_attach(netdev);
3413         return err;
3414 }
3415
3416 static pci_ers_result_t qlcnic_io_error_detected(struct pci_dev *pdev,
3417                                                 pci_channel_state_t state)
3418 {
3419         struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3420         struct net_device *netdev = adapter->netdev;
3421
3422         if (state == pci_channel_io_perm_failure)
3423                 return PCI_ERS_RESULT_DISCONNECT;
3424
3425         if (state == pci_channel_io_normal)
3426                 return PCI_ERS_RESULT_RECOVERED;
3427
3428         set_bit(__QLCNIC_AER, &adapter->state);
3429         netif_device_detach(netdev);
3430
3431         cancel_delayed_work_sync(&adapter->fw_work);
3432
3433         if (netif_running(netdev))
3434                 qlcnic_down(adapter, netdev);
3435
3436         if (qlcnic_83xx_check(adapter)) {
3437                 qlcnic_83xx_free_mbx_intr(adapter);
3438                 qlcnic_83xx_register_nic_idc_func(adapter, 0);
3439                 cancel_delayed_work_sync(&adapter->idc_aen_work);
3440         }
3441
3442         qlcnic_detach(adapter);
3443         qlcnic_teardown_intr(adapter);
3444
3445         clear_bit(__QLCNIC_RESETTING, &adapter->state);
3446
3447         pci_save_state(pdev);
3448         pci_disable_device(pdev);
3449
3450         return PCI_ERS_RESULT_NEED_RESET;
3451 }
3452
3453 static pci_ers_result_t qlcnic_io_slot_reset(struct pci_dev *pdev)
3454 {
3455         return qlcnic_attach_func(pdev) ? PCI_ERS_RESULT_DISCONNECT :
3456                                 PCI_ERS_RESULT_RECOVERED;
3457 }
3458
3459 static void qlcnic_io_resume(struct pci_dev *pdev)
3460 {
3461         u32 state;
3462         struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3463
3464         pci_cleanup_aer_uncorrect_error_status(pdev);
3465         state = QLC_SHARED_REG_RD32(adapter, QLCNIC_CRB_DEV_STATE);
3466         if (state == QLCNIC_DEV_READY && test_and_clear_bit(__QLCNIC_AER,
3467                                                             &adapter->state))
3468                 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work,
3469                                                 FW_POLL_DELAY);
3470 }
3471
3472 static int
3473 qlcnicvf_start_firmware(struct qlcnic_adapter *adapter)
3474 {
3475         int err;
3476
3477         err = qlcnic_can_start_firmware(adapter);
3478         if (err)
3479                 return err;
3480
3481         err = qlcnic_check_npar_opertional(adapter);
3482         if (err)
3483                 return err;
3484
3485         err = qlcnic_initialize_nic(adapter);
3486         if (err)
3487                 return err;
3488
3489         qlcnic_check_options(adapter);
3490
3491         err = qlcnic_set_eswitch_port_config(adapter);
3492         if (err)
3493                 return err;
3494
3495         adapter->need_fw_reset = 0;
3496
3497         return err;
3498 }
3499
3500 int qlcnic_validate_max_tx_rings(struct qlcnic_adapter *adapter, int txq)
3501 {
3502         struct net_device *netdev = adapter->netdev;
3503         u8 max_hw = QLCNIC_MAX_TX_RINGS;
3504         u32 max_allowed;
3505
3506         if (!qlcnic_82xx_check(adapter)) {
3507                 netdev_err(netdev, "No Multi TX-Q support\n");
3508                 return -EINVAL;
3509         }
3510
3511         if (!qlcnic_use_msi_x && !qlcnic_use_msi) {
3512                 netdev_err(netdev, "No Multi TX-Q support in INT-x mode\n");
3513                 return -EINVAL;
3514         }
3515
3516         if (!qlcnic_check_multi_tx(adapter)) {
3517                 netdev_err(netdev, "No Multi TX-Q support\n");
3518                 return -EINVAL;
3519         }
3520
3521         if (txq > QLCNIC_MAX_TX_RINGS) {
3522                 netdev_err(netdev, "Invalid ring count\n");
3523                 return -EINVAL;
3524         }
3525
3526         max_allowed = rounddown_pow_of_two(min_t(int, max_hw,
3527                                                  num_online_cpus()));
3528         if ((txq > max_allowed) || !is_power_of_2(txq)) {
3529                 if (!is_power_of_2(txq))
3530                         netdev_err(netdev,
3531                                    "TX queue should be a power of 2\n");
3532                 if (txq > num_online_cpus())
3533                         netdev_err(netdev,
3534                                    "Tx queue should not be higher than [%u], number of online CPUs in the system\n",
3535                                    num_online_cpus());
3536                 netdev_err(netdev, "Unable to configure %u Tx rings\n", txq);
3537                 return -EINVAL;
3538         }
3539
3540         return 0;
3541 }
3542
3543 int qlcnic_validate_max_rss(struct qlcnic_adapter *adapter,
3544                                 __u32 val)
3545 {
3546         struct net_device *netdev = adapter->netdev;
3547         u8 max_hw = adapter->ahw->max_rx_ques;
3548         u32 max_allowed;
3549
3550         if (qlcnic_82xx_check(adapter) && !qlcnic_use_msi_x &&
3551             !qlcnic_use_msi) {
3552                 netdev_err(netdev, "No RSS support in INT-x mode\n");
3553                 return -EINVAL;
3554         }
3555
3556         if (val > QLCNIC_MAX_SDS_RINGS) {
3557                 netdev_err(netdev, "RSS value should not be higher than %u\n",
3558                            QLCNIC_MAX_SDS_RINGS);
3559                 return -EINVAL;
3560         }
3561
3562         max_allowed = rounddown_pow_of_two(min_t(int, max_hw,
3563                                                  num_online_cpus()));
3564         if ((val > max_allowed) || (val < 2) || !is_power_of_2(val)) {
3565                 if (!is_power_of_2(val))
3566                         netdev_err(netdev, "RSS value should be a power of 2\n");
3567
3568                 if (val < 2)
3569                         netdev_err(netdev, "RSS value should not be lower than 2\n");
3570
3571                 if (val > max_hw)
3572                         netdev_err(netdev,
3573                                    "RSS value should not be higher than[%u], the max RSS rings supported by the adapter\n",
3574                                    max_hw);
3575
3576                 if (val > num_online_cpus())
3577                         netdev_err(netdev,
3578                                    "RSS value should not be higher than[%u], number of online CPUs in the system\n",
3579                                    num_online_cpus());
3580
3581                 netdev_err(netdev, "Unable to configure %u RSS rings\n", val);
3582
3583                 return -EINVAL;
3584         }
3585         return 0;
3586 }
3587
3588 int qlcnic_set_max_rss(struct qlcnic_adapter *adapter, u8 data, int txq)
3589 {
3590         int err;
3591         struct net_device *netdev = adapter->netdev;
3592         int num_msix;
3593
3594         if (test_bit(__QLCNIC_RESETTING, &adapter->state))
3595                 return -EBUSY;
3596
3597         if (qlcnic_82xx_check(adapter) && !qlcnic_use_msi_x &&
3598             !qlcnic_use_msi) {
3599                 netdev_err(netdev, "No RSS support in INT-x mode\n");
3600                 return -EINVAL;
3601         }
3602
3603         netif_device_detach(netdev);
3604         if (netif_running(netdev))
3605                 __qlcnic_down(adapter, netdev);
3606
3607         qlcnic_detach(adapter);
3608
3609         if (qlcnic_82xx_check(adapter)) {
3610                 if (txq != 0)
3611                         adapter->max_drv_tx_rings = txq;
3612
3613                 if (qlcnic_check_multi_tx(adapter) &&
3614                     (txq > adapter->max_drv_tx_rings))
3615                         num_msix = adapter->max_drv_tx_rings;
3616                 else
3617                         num_msix = data;
3618         }
3619
3620         if (qlcnic_83xx_check(adapter)) {
3621                 qlcnic_83xx_free_mbx_intr(adapter);
3622                 qlcnic_83xx_enable_mbx_poll(adapter);
3623         }
3624
3625         netif_set_real_num_tx_queues(netdev, adapter->max_drv_tx_rings);
3626
3627         qlcnic_teardown_intr(adapter);
3628
3629         err = qlcnic_setup_intr(adapter, data, txq);
3630         if (err) {
3631                 kfree(adapter->msix_entries);
3632                 netdev_err(netdev, "failed to setup interrupt\n");
3633                 return err;
3634         }
3635
3636         if (qlcnic_83xx_check(adapter)) {
3637                 /* register for NIC IDC AEN Events */
3638                 qlcnic_83xx_register_nic_idc_func(adapter, 1);
3639                 err = qlcnic_83xx_setup_mbx_intr(adapter);
3640                 qlcnic_83xx_disable_mbx_poll(adapter);
3641                 if (err) {
3642                         dev_err(&adapter->pdev->dev,
3643                                 "failed to setup mbx interrupt\n");
3644                         goto done;
3645                 }
3646         }
3647
3648         if (netif_running(netdev)) {
3649                 err = qlcnic_attach(adapter);
3650                 if (err)
3651                         goto done;
3652                 err = __qlcnic_up(adapter, netdev);
3653                 if (err)
3654                         goto done;
3655                 qlcnic_restore_indev_addr(netdev, NETDEV_UP);
3656         }
3657 done:
3658         netif_device_attach(netdev);
3659         clear_bit(__QLCNIC_RESETTING, &adapter->state);
3660         return err;
3661 }
3662
3663 #ifdef CONFIG_INET
3664
3665 #define is_qlcnic_netdev(dev) (dev->netdev_ops == &qlcnic_netdev_ops)
3666
3667 static void
3668 qlcnic_config_indev_addr(struct qlcnic_adapter *adapter,
3669                         struct net_device *dev, unsigned long event)
3670 {
3671         struct in_device *indev;
3672
3673         indev = in_dev_get(dev);
3674         if (!indev)
3675                 return;
3676
3677         for_ifa(indev) {
3678                 switch (event) {
3679                 case NETDEV_UP:
3680                         qlcnic_config_ipaddr(adapter,
3681                                         ifa->ifa_address, QLCNIC_IP_UP);
3682                         break;
3683                 case NETDEV_DOWN:
3684                         qlcnic_config_ipaddr(adapter,
3685                                         ifa->ifa_address, QLCNIC_IP_DOWN);
3686                         break;
3687                 default:
3688                         break;
3689                 }
3690         } endfor_ifa(indev);
3691
3692         in_dev_put(indev);
3693 }
3694
3695 void qlcnic_restore_indev_addr(struct net_device *netdev, unsigned long event)
3696 {
3697         struct qlcnic_adapter *adapter = netdev_priv(netdev);
3698         struct net_device *dev;
3699         u16 vid;
3700
3701         qlcnic_config_indev_addr(adapter, netdev, event);
3702
3703         rcu_read_lock();
3704         for_each_set_bit(vid, adapter->vlans, VLAN_N_VID) {
3705                 dev = __vlan_find_dev_deep(netdev, htons(ETH_P_8021Q), vid);
3706                 if (!dev)
3707                         continue;
3708                 qlcnic_config_indev_addr(adapter, dev, event);
3709         }
3710         rcu_read_unlock();
3711 }
3712
3713 static int qlcnic_netdev_event(struct notifier_block *this,
3714                                  unsigned long event, void *ptr)
3715 {
3716         struct qlcnic_adapter *adapter;
3717         struct net_device *dev = netdev_notifier_info_to_dev(ptr);
3718
3719 recheck:
3720         if (dev == NULL)
3721                 goto done;
3722
3723         if (dev->priv_flags & IFF_802_1Q_VLAN) {
3724                 dev = vlan_dev_real_dev(dev);
3725                 goto recheck;
3726         }
3727
3728         if (!is_qlcnic_netdev(dev))
3729                 goto done;
3730
3731         adapter = netdev_priv(dev);
3732
3733         if (!adapter)
3734                 goto done;
3735
3736         if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
3737                 goto done;
3738
3739         qlcnic_config_indev_addr(adapter, dev, event);
3740 done:
3741         return NOTIFY_DONE;
3742 }
3743
3744 static int
3745 qlcnic_inetaddr_event(struct notifier_block *this,
3746                 unsigned long event, void *ptr)
3747 {
3748         struct qlcnic_adapter *adapter;
3749         struct net_device *dev;
3750
3751         struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
3752
3753         dev = ifa->ifa_dev ? ifa->ifa_dev->dev : NULL;
3754
3755 recheck:
3756         if (dev == NULL)
3757                 goto done;
3758
3759         if (dev->priv_flags & IFF_802_1Q_VLAN) {
3760                 dev = vlan_dev_real_dev(dev);
3761                 goto recheck;
3762         }
3763
3764         if (!is_qlcnic_netdev(dev))
3765                 goto done;
3766
3767         adapter = netdev_priv(dev);
3768
3769         if (!adapter)
3770                 goto done;
3771
3772         if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
3773                 goto done;
3774
3775         switch (event) {
3776         case NETDEV_UP:
3777                 qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_UP);
3778
3779                 break;
3780         case NETDEV_DOWN:
3781                 qlcnic_config_ipaddr(adapter, ifa->ifa_address, QLCNIC_IP_DOWN);
3782
3783                 break;
3784         default:
3785                 break;
3786         }
3787
3788 done:
3789         return NOTIFY_DONE;
3790 }
3791
3792 static struct notifier_block    qlcnic_netdev_cb = {
3793         .notifier_call = qlcnic_netdev_event,
3794 };
3795
3796 static struct notifier_block qlcnic_inetaddr_cb = {
3797         .notifier_call = qlcnic_inetaddr_event,
3798 };
3799 #else
3800 void qlcnic_restore_indev_addr(struct net_device *dev, unsigned long event)
3801 { }
3802 #endif
3803 static const struct pci_error_handlers qlcnic_err_handler = {
3804         .error_detected = qlcnic_io_error_detected,
3805         .slot_reset = qlcnic_io_slot_reset,
3806         .resume = qlcnic_io_resume,
3807 };
3808
3809 static struct pci_driver qlcnic_driver = {
3810         .name = qlcnic_driver_name,
3811         .id_table = qlcnic_pci_tbl,
3812         .probe = qlcnic_probe,
3813         .remove = qlcnic_remove,
3814 #ifdef CONFIG_PM
3815         .suspend = qlcnic_suspend,
3816         .resume = qlcnic_resume,
3817 #endif
3818         .shutdown = qlcnic_shutdown,
3819         .err_handler = &qlcnic_err_handler,
3820 #ifdef CONFIG_QLCNIC_SRIOV
3821         .sriov_configure = qlcnic_pci_sriov_configure,
3822 #endif
3823
3824 };
3825
3826 static int __init qlcnic_init_module(void)
3827 {
3828         int ret;
3829
3830         printk(KERN_INFO "%s\n", qlcnic_driver_string);
3831
3832 #ifdef CONFIG_INET
3833         register_netdevice_notifier(&qlcnic_netdev_cb);
3834         register_inetaddr_notifier(&qlcnic_inetaddr_cb);
3835 #endif
3836
3837         ret = pci_register_driver(&qlcnic_driver);
3838         if (ret) {
3839 #ifdef CONFIG_INET
3840                 unregister_inetaddr_notifier(&qlcnic_inetaddr_cb);
3841                 unregister_netdevice_notifier(&qlcnic_netdev_cb);
3842 #endif
3843         }
3844
3845         return ret;
3846 }
3847
3848 module_init(qlcnic_init_module);
3849
3850 static void __exit qlcnic_exit_module(void)
3851 {
3852         pci_unregister_driver(&qlcnic_driver);
3853
3854 #ifdef CONFIG_INET
3855         unregister_inetaddr_notifier(&qlcnic_inetaddr_cb);
3856         unregister_netdevice_notifier(&qlcnic_netdev_cb);
3857 #endif
3858 }
3859
3860 module_exit(qlcnic_exit_module);