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