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