aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/qlcnic
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-07-09 21:24:39 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-07-09 21:24:39 -0400
commit496322bc91e35007ed754184dcd447a02b6dd685 (patch)
treef5298d0a74c0a6e65c0e98050b594b8d020904c1 /drivers/net/ethernet/qlogic/qlcnic
parent2e17c5a97e231f3cb426f4b7895eab5be5c5442e (diff)
parent56e0ef527b184b3de2d7f88c6190812b2b2ac6bf (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Miller: "This is a re-do of the net-next pull request for the current merge window. The only difference from the one I made the other day is that this has Eliezer's interface renames and the timeout handling changes made based upon your feedback, as well as a few bug fixes that have trickeled in. Highlights: 1) Low latency device polling, eliminating the cost of interrupt handling and context switches. Allows direct polling of a network device from socket operations, such as recvmsg() and poll(). Currently ixgbe, mlx4, and bnx2x support this feature. Full high level description, performance numbers, and design in commit 0a4db187a999 ("Merge branch 'll_poll'") From Eliezer Tamir. 2) With the routing cache removed, ip_check_mc_rcu() gets exercised more than ever before in the case where we have lots of multicast addresses. Use a hash table instead of a simple linked list, from Eric Dumazet. 3) Add driver for Atheros CQA98xx 802.11ac wireless devices, from Bartosz Markowski, Janusz Dziedzic, Kalle Valo, Marek Kwaczynski, Marek Puzyniak, Michal Kazior, and Sujith Manoharan. 4) Support reporting the TUN device persist flag to userspace, from Pavel Emelyanov. 5) Allow controlling network device VF link state using netlink, from Rony Efraim. 6) Support GRE tunneling in openvswitch, from Pravin B Shelar. 7) Adjust SOCK_MIN_RCVBUF and SOCK_MIN_SNDBUF for modern times, from Daniel Borkmann and Eric Dumazet. 8) Allow controlling of TCP quickack behavior on a per-route basis, from Cong Wang. 9) Several bug fixes and improvements to vxlan from Stephen Hemminger, Pravin B Shelar, and Mike Rapoport. In particular, support receiving on multiple UDP ports. 10) Major cleanups, particular in the area of debugging and cookie lifetime handline, to the SCTP protocol code. From Daniel Borkmann. 11) Allow packets to cross network namespaces when traversing tunnel devices. From Nicolas Dichtel. 12) Allow monitoring netlink traffic via AF_PACKET sockets, in a manner akin to how we monitor real network traffic via ptype_all. From Daniel Borkmann. 13) Several bug fixes and improvements for the new alx device driver, from Johannes Berg. 14) Fix scalability issues in the netem packet scheduler's time queue, by using an rbtree. From Eric Dumazet. 15) Several bug fixes in TCP loss recovery handling, from Yuchung Cheng. 16) Add support for GSO segmentation of MPLS packets, from Simon Horman. 17) Make network notifiers have a real data type for the opaque pointer that's passed into them. Use this to properly handle network device flag changes in arp_netdev_event(). From Jiri Pirko and Timo Teräs. 18) Convert several drivers over to module_pci_driver(), from Peter Huewe. 19) tcp_fixup_rcvbuf() can loop 500 times over loopback, just use a O(1) calculation instead. From Eric Dumazet. 20) Support setting of explicit tunnel peer addresses in ipv6, just like ipv4. From Nicolas Dichtel. 21) Protect x86 BPF JIT against spraying attacks, from Eric Dumazet. 22) Prevent a single high rate flow from overruning an individual cpu during RX packet processing via selective flow shedding. From Willem de Bruijn. 23) Don't use spinlocks in TCP md5 signing fast paths, from Eric Dumazet. 24) Don't just drop GSO packets which are above the TBF scheduler's burst limit, chop them up so they are in-bounds instead. Also from Eric Dumazet. 25) VLAN offloads are missed when configured on top of a bridge, fix from Vlad Yasevich. 26) Support IPV6 in ping sockets. From Lorenzo Colitti. 27) Receive flow steering targets should be updated at poll() time too, from David Majnemer. 28) Fix several corner case regressions in PMTU/redirect handling due to the routing cache removal, from Timo Teräs. 29) We have to be mindful of ipv4 mapped ipv6 sockets in upd_v6_push_pending_frames(). From Hannes Frederic Sowa. 30) Fix L2TP sequence number handling bugs, from James Chapman." * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1214 commits) drivers/net: caif: fix wrong rtnl_is_locked() usage drivers/net: enic: release rtnl_lock on error-path vhost-net: fix use-after-free in vhost_net_flush net: mv643xx_eth: do not use port number as platform device id net: sctp: confirm route during forward progress virtio_net: fix race in RX VQ processing virtio: support unlocked queue poll net/cadence/macb: fix bug/typo in extracting gem_irq_read_clear bit Documentation: Fix references to defunct linux-net@vger.kernel.org net/fs: change busy poll time accounting net: rename low latency sockets functions to busy poll bridge: fix some kernel warning in multicast timer sfc: Fix memory leak when discarding scattered packets sit: fix tunnel update via netlink dt:net:stmmac: Add dt specific phy reset callback support. dt:net:stmmac: Add support to dwmac version 3.610 and 3.710 dt:net:stmmac: Allocate platform data only if its NULL. net:stmmac: fix memleak in the open method ipv6: rt6_check_neigh should successfully verify neigh if no NUD information are available net: ipv6: fix wrong ping_v6_sendmsg return value ...
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlcnic')
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic.h59
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c346
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h13
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c59
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c62
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c172
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c6
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h1
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c103
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h8
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c226
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c225
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov.h4
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c60
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c36
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c126
16 files changed, 1139 insertions, 367 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index c1b693cb3df3..b00cf5665eab 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -38,8 +38,8 @@
38 38
39#define _QLCNIC_LINUX_MAJOR 5 39#define _QLCNIC_LINUX_MAJOR 5
40#define _QLCNIC_LINUX_MINOR 2 40#define _QLCNIC_LINUX_MINOR 2
41#define _QLCNIC_LINUX_SUBVERSION 42 41#define _QLCNIC_LINUX_SUBVERSION 44
42#define QLCNIC_LINUX_VERSIONID "5.2.42" 42#define QLCNIC_LINUX_VERSIONID "5.2.44"
43#define QLCNIC_DRV_IDC_VER 0x01 43#define QLCNIC_DRV_IDC_VER 0x01
44#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\ 44#define QLCNIC_DRIVER_VERSION ((_QLCNIC_LINUX_MAJOR << 16) |\
45 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION)) 45 (_QLCNIC_LINUX_MINOR << 8) | (_QLCNIC_LINUX_SUBVERSION))
@@ -303,7 +303,6 @@ extern int qlcnic_use_msi;
303extern int qlcnic_use_msi_x; 303extern int qlcnic_use_msi_x;
304extern int qlcnic_auto_fw_reset; 304extern int qlcnic_auto_fw_reset;
305extern int qlcnic_load_fw_file; 305extern int qlcnic_load_fw_file;
306extern int qlcnic_config_npars;
307 306
308/* Number of status descriptors to handle per interrupt */ 307/* Number of status descriptors to handle per interrupt */
309#define MAX_STATUS_HANDLE (64) 308#define MAX_STATUS_HANDLE (64)
@@ -394,6 +393,9 @@ struct qlcnic_fw_dump {
394 u32 size; /* total size of the dump */ 393 u32 size; /* total size of the dump */
395 void *data; /* dump data area */ 394 void *data; /* dump data area */
396 struct qlcnic_dump_template_hdr *tmpl_hdr; 395 struct qlcnic_dump_template_hdr *tmpl_hdr;
396 dma_addr_t phys_addr;
397 void *dma_buffer;
398 bool use_pex_dma;
397}; 399};
398 400
399/* 401/*
@@ -427,6 +429,7 @@ struct qlcnic_hardware_context {
427 u8 nic_mode; 429 u8 nic_mode;
428 char diag_cnt; 430 char diag_cnt;
429 431
432 u16 max_uc_count;
430 u16 port_type; 433 u16 port_type;
431 u16 board_type; 434 u16 board_type;
432 u16 supported_type; 435 u16 supported_type;
@@ -443,9 +446,10 @@ struct qlcnic_hardware_context {
443 u16 max_mtu; 446 u16 max_mtu;
444 u32 msg_enable; 447 u32 msg_enable;
445 u16 act_pci_func; 448 u16 act_pci_func;
449 u16 max_pci_func;
446 450
447 u32 capabilities; 451 u32 capabilities;
448 u32 capabilities2; 452 u32 extra_capability[3];
449 u32 temp; 453 u32 temp;
450 u32 int_vec_bit; 454 u32 int_vec_bit;
451 u32 fw_hal_version; 455 u32 fw_hal_version;
@@ -815,7 +819,8 @@ struct qlcnic_mac_list_s {
815 819
816#define QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG BIT_2 820#define QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG BIT_2
817#define QLCNIC_FW_CAP2_HW_LRO_IPV6 BIT_3 821#define QLCNIC_FW_CAP2_HW_LRO_IPV6 BIT_3
818#define QLCNIC_FW_CAPABILITY_2_OCBB BIT_5 822#define QLCNIC_FW_CAPABILITY_SET_DRV_VER BIT_5
823#define QLCNIC_FW_CAPABILITY_2_BEACON BIT_7
819 824
820/* module types */ 825/* module types */
821#define LINKEVENT_MODULE_NOT_PRESENT 1 826#define LINKEVENT_MODULE_NOT_PRESENT 1
@@ -913,6 +918,9 @@ struct qlcnic_ipaddr {
913#define QLCNIC_IS_TSO_CAPABLE(adapter) \ 918#define QLCNIC_IS_TSO_CAPABLE(adapter) \
914 ((adapter)->ahw->capabilities & QLCNIC_FW_CAPABILITY_TSO) 919 ((adapter)->ahw->capabilities & QLCNIC_FW_CAPABILITY_TSO)
915 920
921#define QLCNIC_BEACON_EANBLE 0xC
922#define QLCNIC_BEACON_DISABLE 0xD
923
916#define QLCNIC_DEF_NUM_STS_DESC_RINGS 4 924#define QLCNIC_DEF_NUM_STS_DESC_RINGS 4
917#define QLCNIC_MSIX_TBL_SPACE 8192 925#define QLCNIC_MSIX_TBL_SPACE 8192
918#define QLCNIC_PCI_REG_MSIX_TBL 0x44 926#define QLCNIC_PCI_REG_MSIX_TBL 0x44
@@ -932,6 +940,7 @@ struct qlcnic_ipaddr {
932#define __QLCNIC_SRIOV_ENABLE 10 940#define __QLCNIC_SRIOV_ENABLE 10
933#define __QLCNIC_SRIOV_CAPABLE 11 941#define __QLCNIC_SRIOV_CAPABLE 11
934#define __QLCNIC_MBX_POLL_ENABLE 12 942#define __QLCNIC_MBX_POLL_ENABLE 12
943#define __QLCNIC_DIAG_MODE 13
935 944
936#define QLCNIC_INTERRUPT_TEST 1 945#define QLCNIC_INTERRUPT_TEST 1
937#define QLCNIC_LOOPBACK_TEST 2 946#define QLCNIC_LOOPBACK_TEST 2
@@ -1467,7 +1476,7 @@ int qlcnic_nic_del_mac(struct qlcnic_adapter *, const u8 *);
1467void qlcnic_82xx_free_mac_list(struct qlcnic_adapter *adapter); 1476void qlcnic_82xx_free_mac_list(struct qlcnic_adapter *adapter);
1468 1477
1469int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu); 1478int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu);
1470int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *); 1479int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *, u32);
1471int qlcnic_change_mtu(struct net_device *netdev, int new_mtu); 1480int qlcnic_change_mtu(struct net_device *netdev, int new_mtu);
1472netdev_features_t qlcnic_fix_features(struct net_device *netdev, 1481netdev_features_t qlcnic_fix_features(struct net_device *netdev,
1473 netdev_features_t features); 1482 netdev_features_t features);
@@ -1489,7 +1498,9 @@ netdev_tx_t qlcnic_xmit_frame(struct sk_buff *skb, struct net_device *netdev);
1489int qlcnic_set_max_rss(struct qlcnic_adapter *, u8, size_t); 1498int qlcnic_set_max_rss(struct qlcnic_adapter *, u8, size_t);
1490int qlcnic_validate_max_rss(struct qlcnic_adapter *, __u32); 1499int qlcnic_validate_max_rss(struct qlcnic_adapter *, __u32);
1491void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter); 1500void qlcnic_alloc_lb_filters_mem(struct qlcnic_adapter *adapter);
1501void qlcnic_82xx_set_mac_filter_count(struct qlcnic_adapter *);
1492int qlcnic_enable_msix(struct qlcnic_adapter *, u32); 1502int qlcnic_enable_msix(struct qlcnic_adapter *, u32);
1503void qlcnic_set_drv_version(struct qlcnic_adapter *);
1493 1504
1494/* eSwitch management functions */ 1505/* eSwitch management functions */
1495int qlcnic_config_switch_port(struct qlcnic_adapter *, 1506int qlcnic_config_switch_port(struct qlcnic_adapter *,
@@ -1543,6 +1554,7 @@ int qlcnic_set_default_offload_settings(struct qlcnic_adapter *);
1543int qlcnic_reset_npar_config(struct qlcnic_adapter *); 1554int qlcnic_reset_npar_config(struct qlcnic_adapter *);
1544int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *); 1555int qlcnic_set_eswitch_port_config(struct qlcnic_adapter *);
1545void qlcnic_add_lb_filter(struct qlcnic_adapter *, struct sk_buff *, int, u16); 1556void qlcnic_add_lb_filter(struct qlcnic_adapter *, struct sk_buff *, int, u16);
1557int qlcnic_get_beacon_state(struct qlcnic_adapter *, u8 *);
1546int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter); 1558int qlcnic_83xx_configure_opmode(struct qlcnic_adapter *adapter);
1547int qlcnic_read_mac_addr(struct qlcnic_adapter *); 1559int qlcnic_read_mac_addr(struct qlcnic_adapter *);
1548int qlcnic_setup_netdev(struct qlcnic_adapter *, struct net_device *, int); 1560int qlcnic_setup_netdev(struct qlcnic_adapter *, struct net_device *, int);
@@ -1584,6 +1596,8 @@ struct qlcnic_nic_template {
1584 void (*napi_del)(struct qlcnic_adapter *); 1596 void (*napi_del)(struct qlcnic_adapter *);
1585 void (*config_ipaddr)(struct qlcnic_adapter *, __be32, int); 1597 void (*config_ipaddr)(struct qlcnic_adapter *, __be32, int);
1586 irqreturn_t (*clear_legacy_intr)(struct qlcnic_adapter *); 1598 irqreturn_t (*clear_legacy_intr)(struct qlcnic_adapter *);
1599 int (*shutdown)(struct pci_dev *);
1600 int (*resume)(struct qlcnic_adapter *);
1587}; 1601};
1588 1602
1589/* Adapter hardware abstraction */ 1603/* Adapter hardware abstraction */
@@ -1625,6 +1639,7 @@ struct qlcnic_hardware_ops {
1625 int (*config_promisc_mode) (struct qlcnic_adapter *, u32); 1639 int (*config_promisc_mode) (struct qlcnic_adapter *, u32);
1626 void (*change_l2_filter) (struct qlcnic_adapter *, u64 *, u16); 1640 void (*change_l2_filter) (struct qlcnic_adapter *, u64 *, u16);
1627 int (*get_board_info) (struct qlcnic_adapter *); 1641 int (*get_board_info) (struct qlcnic_adapter *);
1642 void (*set_mac_filter_count) (struct qlcnic_adapter *);
1628 void (*free_mac_list) (struct qlcnic_adapter *); 1643 void (*free_mac_list) (struct qlcnic_adapter *);
1629}; 1644};
1630 1645
@@ -1787,6 +1802,18 @@ static inline void qlcnic_napi_enable(struct qlcnic_adapter *adapter)
1787 adapter->ahw->hw_ops->napi_enable(adapter); 1802 adapter->ahw->hw_ops->napi_enable(adapter);
1788} 1803}
1789 1804
1805static inline int __qlcnic_shutdown(struct pci_dev *pdev)
1806{
1807 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
1808
1809 return adapter->nic_ops->shutdown(pdev);
1810}
1811
1812static inline int __qlcnic_resume(struct qlcnic_adapter *adapter)
1813{
1814 return adapter->nic_ops->resume(adapter);
1815}
1816
1790static inline void qlcnic_napi_disable(struct qlcnic_adapter *adapter) 1817static inline void qlcnic_napi_disable(struct qlcnic_adapter *adapter)
1791{ 1818{
1792 adapter->ahw->hw_ops->napi_disable(adapter); 1819 adapter->ahw->hw_ops->napi_disable(adapter);
@@ -1840,6 +1867,11 @@ static inline void qlcnic_free_mac_list(struct qlcnic_adapter *adapter)
1840 return adapter->ahw->hw_ops->free_mac_list(adapter); 1867 return adapter->ahw->hw_ops->free_mac_list(adapter);
1841} 1868}
1842 1869
1870static inline void qlcnic_set_mac_filter_count(struct qlcnic_adapter *adapter)
1871{
1872 adapter->ahw->hw_ops->set_mac_filter_count(adapter);
1873}
1874
1843static inline void qlcnic_dev_request_reset(struct qlcnic_adapter *adapter, 1875static inline void qlcnic_dev_request_reset(struct qlcnic_adapter *adapter,
1844 u32 key) 1876 u32 key)
1845{ 1877{
@@ -1886,6 +1918,21 @@ static inline void qlcnic_enable_int(struct qlcnic_host_sds_ring *sds_ring)
1886 writel(0xfbff, adapter->tgt_mask_reg); 1918 writel(0xfbff, adapter->tgt_mask_reg);
1887} 1919}
1888 1920
1921static inline int qlcnic_get_diag_lock(struct qlcnic_adapter *adapter)
1922{
1923 return test_and_set_bit(__QLCNIC_DIAG_MODE, &adapter->state);
1924}
1925
1926static inline void qlcnic_release_diag_lock(struct qlcnic_adapter *adapter)
1927{
1928 clear_bit(__QLCNIC_DIAG_MODE, &adapter->state);
1929}
1930
1931static inline int qlcnic_check_diag_status(struct qlcnic_adapter *adapter)
1932{
1933 return test_bit(__QLCNIC_DIAG_MODE, &adapter->state);
1934}
1935
1889extern const struct ethtool_ops qlcnic_sriov_vf_ethtool_ops; 1936extern const struct ethtool_ops qlcnic_sriov_vf_ethtool_ops;
1890extern const struct ethtool_ops qlcnic_ethtool_ops; 1937extern const struct ethtool_ops qlcnic_ethtool_ops;
1891extern const struct ethtool_ops qlcnic_ethtool_failed_ops; 1938extern const struct ethtool_ops qlcnic_ethtool_failed_ops;
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index b4ff1e35a11d..0913c623a67e 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -63,6 +63,7 @@ static const struct qlcnic_mailbox_metadata qlcnic_83xx_mbx_tbl[] = {
63 {QLCNIC_CMD_STOP_NIC_FUNC, 2, 1}, 63 {QLCNIC_CMD_STOP_NIC_FUNC, 2, 1},
64 {QLCNIC_CMD_SET_LED_CONFIG, 5, 1}, 64 {QLCNIC_CMD_SET_LED_CONFIG, 5, 1},
65 {QLCNIC_CMD_GET_LED_CONFIG, 1, 5}, 65 {QLCNIC_CMD_GET_LED_CONFIG, 1, 5},
66 {QLCNIC_CMD_83XX_SET_DRV_VER, 4, 1},
66 {QLCNIC_CMD_ADD_RCV_RINGS, 130, 26}, 67 {QLCNIC_CMD_ADD_RCV_RINGS, 130, 26},
67 {QLCNIC_CMD_CONFIG_VPORT, 4, 4}, 68 {QLCNIC_CMD_CONFIG_VPORT, 4, 4},
68 {QLCNIC_CMD_BC_EVENT_SETUP, 2, 1}, 69 {QLCNIC_CMD_BC_EVENT_SETUP, 2, 1},
@@ -172,6 +173,7 @@ static struct qlcnic_hardware_ops qlcnic_83xx_hw_ops = {
172 .config_promisc_mode = qlcnic_83xx_nic_set_promisc, 173 .config_promisc_mode = qlcnic_83xx_nic_set_promisc,
173 .change_l2_filter = qlcnic_83xx_change_l2_filter, 174 .change_l2_filter = qlcnic_83xx_change_l2_filter,
174 .get_board_info = qlcnic_83xx_get_port_info, 175 .get_board_info = qlcnic_83xx_get_port_info,
176 .set_mac_filter_count = qlcnic_83xx_set_mac_filter_count,
175 .free_mac_list = qlcnic_82xx_free_mac_list, 177 .free_mac_list = qlcnic_82xx_free_mac_list,
176}; 178};
177 179
@@ -184,6 +186,8 @@ static struct qlcnic_nic_template qlcnic_83xx_ops = {
184 .napi_del = qlcnic_83xx_napi_del, 186 .napi_del = qlcnic_83xx_napi_del,
185 .config_ipaddr = qlcnic_83xx_config_ipaddr, 187 .config_ipaddr = qlcnic_83xx_config_ipaddr,
186 .clear_legacy_intr = qlcnic_83xx_clear_legacy_intr, 188 .clear_legacy_intr = qlcnic_83xx_clear_legacy_intr,
189 .shutdown = qlcnic_83xx_shutdown,
190 .resume = qlcnic_83xx_resume,
187}; 191};
188 192
189void qlcnic_83xx_register_map(struct qlcnic_hardware_context *ahw) 193void qlcnic_83xx_register_map(struct qlcnic_hardware_context *ahw)
@@ -312,6 +316,11 @@ inline void qlcnic_83xx_clear_legacy_intr_mask(struct qlcnic_adapter *adapter)
312 writel(0, adapter->tgt_mask_reg); 316 writel(0, adapter->tgt_mask_reg);
313} 317}
314 318
319inline void qlcnic_83xx_set_legacy_intr_mask(struct qlcnic_adapter *adapter)
320{
321 writel(1, adapter->tgt_mask_reg);
322}
323
315/* Enable MSI-x and INT-x interrupts */ 324/* Enable MSI-x and INT-x interrupts */
316void qlcnic_83xx_enable_intr(struct qlcnic_adapter *adapter, 325void qlcnic_83xx_enable_intr(struct qlcnic_adapter *adapter,
317 struct qlcnic_host_sds_ring *sds_ring) 326 struct qlcnic_host_sds_ring *sds_ring)
@@ -458,6 +467,9 @@ void qlcnic_83xx_free_mbx_intr(struct qlcnic_adapter *adapter)
458{ 467{
459 u32 num_msix; 468 u32 num_msix;
460 469
470 if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
471 qlcnic_83xx_set_legacy_intr_mask(adapter);
472
461 qlcnic_83xx_disable_mbx_intr(adapter); 473 qlcnic_83xx_disable_mbx_intr(adapter);
462 474
463 if (adapter->flags & QLCNIC_MSIX_ENABLED) 475 if (adapter->flags & QLCNIC_MSIX_ENABLED)
@@ -474,7 +486,6 @@ int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
474{ 486{
475 irq_handler_t handler; 487 irq_handler_t handler;
476 u32 val; 488 u32 val;
477 char name[32];
478 int err = 0; 489 int err = 0;
479 unsigned long flags = 0; 490 unsigned long flags = 0;
480 491
@@ -485,9 +496,7 @@ int qlcnic_83xx_setup_mbx_intr(struct qlcnic_adapter *adapter)
485 if (adapter->flags & QLCNIC_MSIX_ENABLED) { 496 if (adapter->flags & QLCNIC_MSIX_ENABLED) {
486 handler = qlcnic_83xx_handle_aen; 497 handler = qlcnic_83xx_handle_aen;
487 val = adapter->msix_entries[adapter->ahw->num_msix - 1].vector; 498 val = adapter->msix_entries[adapter->ahw->num_msix - 1].vector;
488 snprintf(name, (IFNAMSIZ + 4), 499 err = request_irq(val, handler, flags, "qlcnic-MB", adapter);
489 "%s[%s]", "qlcnic", "aen");
490 err = request_irq(val, handler, flags, name, adapter);
491 if (err) { 500 if (err) {
492 dev_err(&adapter->pdev->dev, 501 dev_err(&adapter->pdev->dev,
493 "failed to register MBX interrupt\n"); 502 "failed to register MBX interrupt\n");
@@ -604,6 +613,22 @@ int qlcnic_83xx_get_port_info(struct qlcnic_adapter *adapter)
604 return status; 613 return status;
605} 614}
606 615
616void qlcnic_83xx_set_mac_filter_count(struct qlcnic_adapter *adapter)
617{
618 struct qlcnic_hardware_context *ahw = adapter->ahw;
619 u16 act_pci_fn = ahw->act_pci_func;
620 u16 count;
621
622 ahw->max_mc_count = QLC_83XX_MAX_MC_COUNT;
623 if (act_pci_fn <= 2)
624 count = (QLC_83XX_MAX_UC_COUNT - QLC_83XX_MAX_MC_COUNT) /
625 act_pci_fn;
626 else
627 count = (QLC_83XX_LB_MAX_FILTERS - QLC_83XX_MAX_MC_COUNT) /
628 act_pci_fn;
629 ahw->max_uc_count = count;
630}
631
607void qlcnic_83xx_enable_mbx_intrpt(struct qlcnic_adapter *adapter) 632void qlcnic_83xx_enable_mbx_intrpt(struct qlcnic_adapter *adapter)
608{ 633{
609 u32 val; 634 u32 val;
@@ -839,7 +864,9 @@ void qlcnic_83xx_idc_aen_work(struct work_struct *work)
839 int i, err = 0; 864 int i, err = 0;
840 865
841 adapter = container_of(work, struct qlcnic_adapter, idc_aen_work.work); 866 adapter = container_of(work, struct qlcnic_adapter, idc_aen_work.work);
842 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_IDC_ACK); 867 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_IDC_ACK);
868 if (err)
869 return;
843 870
844 for (i = 1; i < QLC_83XX_MBX_AEN_CNT; i++) 871 for (i = 1; i < QLC_83XX_MBX_AEN_CNT; i++)
845 cmd.req.arg[i] = adapter->ahw->mbox_aen[i]; 872 cmd.req.arg[i] = adapter->ahw->mbox_aen[i];
@@ -1080,8 +1107,10 @@ int qlcnic_83xx_create_rx_ctx(struct qlcnic_adapter *adapter)
1080 cap |= QLC_83XX_FW_CAP_LRO_MSS; 1107 cap |= QLC_83XX_FW_CAP_LRO_MSS;
1081 1108
1082 /* set mailbox hdr and capabilities */ 1109 /* set mailbox hdr and capabilities */
1083 qlcnic_alloc_mbx_args(&cmd, adapter, 1110 err = qlcnic_alloc_mbx_args(&cmd, adapter,
1084 QLCNIC_CMD_CREATE_RX_CTX); 1111 QLCNIC_CMD_CREATE_RX_CTX);
1112 if (err)
1113 return err;
1085 1114
1086 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter)) 1115 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter))
1087 cmd.req.arg[0] |= (0x3 << 29); 1116 cmd.req.arg[0] |= (0x3 << 29);
@@ -1239,7 +1268,9 @@ int qlcnic_83xx_create_tx_ctx(struct qlcnic_adapter *adapter,
1239 mbx.intr_id = 0xffff; 1268 mbx.intr_id = 0xffff;
1240 mbx.src = 0; 1269 mbx.src = 0;
1241 1270
1242 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX); 1271 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX);
1272 if (err)
1273 return err;
1243 1274
1244 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter)) 1275 if (qlcnic_sriov_pf_check(adapter) || qlcnic_sriov_vf_check(adapter))
1245 cmd.req.arg[0] |= (0x3 << 29); 1276 cmd.req.arg[0] |= (0x3 << 29);
@@ -1385,8 +1416,11 @@ int qlcnic_83xx_config_led(struct qlcnic_adapter *adapter, u32 state,
1385 1416
1386 if (state) { 1417 if (state) {
1387 /* Get LED configuration */ 1418 /* Get LED configuration */
1388 qlcnic_alloc_mbx_args(&cmd, adapter, 1419 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1389 QLCNIC_CMD_GET_LED_CONFIG); 1420 QLCNIC_CMD_GET_LED_CONFIG);
1421 if (status)
1422 return status;
1423
1390 status = qlcnic_issue_cmd(adapter, &cmd); 1424 status = qlcnic_issue_cmd(adapter, &cmd);
1391 if (status) { 1425 if (status) {
1392 dev_err(&adapter->pdev->dev, 1426 dev_err(&adapter->pdev->dev,
@@ -1400,8 +1434,11 @@ int qlcnic_83xx_config_led(struct qlcnic_adapter *adapter, u32 state,
1400 /* Set LED Configuration */ 1434 /* Set LED Configuration */
1401 mbx_in = (LSW(QLC_83XX_LED_CONFIG) << 16) | 1435 mbx_in = (LSW(QLC_83XX_LED_CONFIG) << 16) |
1402 LSW(QLC_83XX_LED_CONFIG); 1436 LSW(QLC_83XX_LED_CONFIG);
1403 qlcnic_alloc_mbx_args(&cmd, adapter, 1437 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1404 QLCNIC_CMD_SET_LED_CONFIG); 1438 QLCNIC_CMD_SET_LED_CONFIG);
1439 if (status)
1440 return status;
1441
1405 cmd.req.arg[1] = mbx_in; 1442 cmd.req.arg[1] = mbx_in;
1406 cmd.req.arg[2] = mbx_in; 1443 cmd.req.arg[2] = mbx_in;
1407 cmd.req.arg[3] = mbx_in; 1444 cmd.req.arg[3] = mbx_in;
@@ -1418,8 +1455,11 @@ mbx_err:
1418 1455
1419 } else { 1456 } else {
1420 /* Restoring default LED configuration */ 1457 /* Restoring default LED configuration */
1421 qlcnic_alloc_mbx_args(&cmd, adapter, 1458 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1422 QLCNIC_CMD_SET_LED_CONFIG); 1459 QLCNIC_CMD_SET_LED_CONFIG);
1460 if (status)
1461 return status;
1462
1423 cmd.req.arg[1] = adapter->ahw->mbox_reg[0]; 1463 cmd.req.arg[1] = adapter->ahw->mbox_reg[0];
1424 cmd.req.arg[2] = adapter->ahw->mbox_reg[1]; 1464 cmd.req.arg[2] = adapter->ahw->mbox_reg[1];
1425 cmd.req.arg[3] = adapter->ahw->mbox_reg[2]; 1465 cmd.req.arg[3] = adapter->ahw->mbox_reg[2];
@@ -1489,10 +1529,18 @@ void qlcnic_83xx_register_nic_idc_func(struct qlcnic_adapter *adapter,
1489 return; 1529 return;
1490 1530
1491 if (enable) { 1531 if (enable) {
1492 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INIT_NIC_FUNC); 1532 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1533 QLCNIC_CMD_INIT_NIC_FUNC);
1534 if (status)
1535 return;
1536
1493 cmd.req.arg[1] = BIT_0 | BIT_31; 1537 cmd.req.arg[1] = BIT_0 | BIT_31;
1494 } else { 1538 } else {
1495 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_STOP_NIC_FUNC); 1539 status = qlcnic_alloc_mbx_args(&cmd, adapter,
1540 QLCNIC_CMD_STOP_NIC_FUNC);
1541 if (status)
1542 return;
1543
1496 cmd.req.arg[1] = BIT_0 | BIT_31; 1544 cmd.req.arg[1] = BIT_0 | BIT_31;
1497 } 1545 }
1498 status = qlcnic_issue_cmd(adapter, &cmd); 1546 status = qlcnic_issue_cmd(adapter, &cmd);
@@ -1509,7 +1557,10 @@ int qlcnic_83xx_set_port_config(struct qlcnic_adapter *adapter)
1509 struct qlcnic_cmd_args cmd; 1557 struct qlcnic_cmd_args cmd;
1510 int err; 1558 int err;
1511 1559
1512 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_PORT_CONFIG); 1560 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_PORT_CONFIG);
1561 if (err)
1562 return err;
1563
1513 cmd.req.arg[1] = adapter->ahw->port_config; 1564 cmd.req.arg[1] = adapter->ahw->port_config;
1514 err = qlcnic_issue_cmd(adapter, &cmd); 1565 err = qlcnic_issue_cmd(adapter, &cmd);
1515 if (err) 1566 if (err)
@@ -1523,7 +1574,10 @@ int qlcnic_83xx_get_port_config(struct qlcnic_adapter *adapter)
1523 struct qlcnic_cmd_args cmd; 1574 struct qlcnic_cmd_args cmd;
1524 int err; 1575 int err;
1525 1576
1526 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PORT_CONFIG); 1577 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PORT_CONFIG);
1578 if (err)
1579 return err;
1580
1527 err = qlcnic_issue_cmd(adapter, &cmd); 1581 err = qlcnic_issue_cmd(adapter, &cmd);
1528 if (err) 1582 if (err)
1529 dev_info(&adapter->pdev->dev, "Get Port config failed\n"); 1583 dev_info(&adapter->pdev->dev, "Get Port config failed\n");
@@ -1539,7 +1593,10 @@ int qlcnic_83xx_setup_link_event(struct qlcnic_adapter *adapter, int enable)
1539 u32 temp; 1593 u32 temp;
1540 struct qlcnic_cmd_args cmd; 1594 struct qlcnic_cmd_args cmd;
1541 1595
1542 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_EVENT); 1596 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_EVENT);
1597 if (err)
1598 return err;
1599
1543 temp = adapter->recv_ctx->context_id << 16; 1600 temp = adapter->recv_ctx->context_id << 16;
1544 cmd.req.arg[1] = (enable ? 1 : 0) | BIT_8 | temp; 1601 cmd.req.arg[1] = (enable ? 1 : 0) | BIT_8 | temp;
1545 err = qlcnic_issue_cmd(adapter, &cmd); 1602 err = qlcnic_issue_cmd(adapter, &cmd);
@@ -1570,7 +1627,11 @@ int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32 mode)
1570 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) 1627 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
1571 return -EIO; 1628 return -EIO;
1572 1629
1573 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_MAC_RX_MODE); 1630 err = qlcnic_alloc_mbx_args(&cmd, adapter,
1631 QLCNIC_CMD_CONFIGURE_MAC_RX_MODE);
1632 if (err)
1633 return err;
1634
1574 qlcnic_83xx_set_interface_id_promisc(adapter, &temp); 1635 qlcnic_83xx_set_interface_id_promisc(adapter, &temp);
1575 cmd.req.arg[1] = (mode ? 1 : 0) | temp; 1636 cmd.req.arg[1] = (mode ? 1 : 0) | temp;
1576 err = qlcnic_issue_cmd(adapter, &cmd); 1637 err = qlcnic_issue_cmd(adapter, &cmd);
@@ -1588,16 +1649,24 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)
1588 struct qlcnic_hardware_context *ahw = adapter->ahw; 1649 struct qlcnic_hardware_context *ahw = adapter->ahw;
1589 int ret = 0, loop = 0, max_sds_rings = adapter->max_sds_rings; 1650 int ret = 0, loop = 0, max_sds_rings = adapter->max_sds_rings;
1590 1651
1591 QLCDB(adapter, DRV, "%s loopback test in progress\n",
1592 mode == QLCNIC_ILB_MODE ? "internal" : "external");
1593 if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { 1652 if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
1594 dev_warn(&adapter->pdev->dev, 1653 netdev_warn(netdev,
1595 "Loopback test not supported for non privilege function\n"); 1654 "Loopback test not supported in non privileged mode\n");
1596 return ret; 1655 return ret;
1597 } 1656 }
1598 1657
1599 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) 1658 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
1659 netdev_info(netdev, "Device is resetting\n");
1600 return -EBUSY; 1660 return -EBUSY;
1661 }
1662
1663 if (qlcnic_get_diag_lock(adapter)) {
1664 netdev_info(netdev, "Device is in diagnostics mode\n");
1665 return -EBUSY;
1666 }
1667
1668 netdev_info(netdev, "%s loopback test in progress\n",
1669 mode == QLCNIC_ILB_MODE ? "internal" : "external");
1601 1670
1602 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST, 1671 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST,
1603 max_sds_rings); 1672 max_sds_rings);
@@ -1610,13 +1679,19 @@ int qlcnic_83xx_loopback_test(struct net_device *netdev, u8 mode)
1610 1679
1611 /* Poll for link up event before running traffic */ 1680 /* Poll for link up event before running traffic */
1612 do { 1681 do {
1613 msleep(500); 1682 msleep(QLC_83XX_LB_MSLEEP_COUNT);
1614 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) 1683 if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
1615 qlcnic_83xx_process_aen(adapter); 1684 qlcnic_83xx_process_aen(adapter);
1616 1685
1617 if (loop++ > QLCNIC_ILB_MAX_RCV_LOOP) { 1686 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
1618 dev_info(&adapter->pdev->dev, 1687 netdev_info(netdev,
1619 "Firmware didn't sent link up event to loopback request\n"); 1688 "Device is resetting, free LB test resources\n");
1689 ret = -EIO;
1690 goto free_diag_res;
1691 }
1692 if (loop++ > QLC_83XX_LB_WAIT_COUNT) {
1693 netdev_info(netdev,
1694 "Firmware didn't sent link up event to loopback request\n");
1620 ret = -QLCNIC_FW_NOT_RESPOND; 1695 ret = -QLCNIC_FW_NOT_RESPOND;
1621 qlcnic_83xx_clear_lb_mode(adapter, mode); 1696 qlcnic_83xx_clear_lb_mode(adapter, mode);
1622 goto free_diag_res; 1697 goto free_diag_res;
@@ -1638,13 +1713,14 @@ free_diag_res:
1638 1713
1639fail_diag_alloc: 1714fail_diag_alloc:
1640 adapter->max_sds_rings = max_sds_rings; 1715 adapter->max_sds_rings = max_sds_rings;
1641 clear_bit(__QLCNIC_RESETTING, &adapter->state); 1716 qlcnic_release_diag_lock(adapter);
1642 return ret; 1717 return ret;
1643} 1718}
1644 1719
1645int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode) 1720int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
1646{ 1721{
1647 struct qlcnic_hardware_context *ahw = adapter->ahw; 1722 struct qlcnic_hardware_context *ahw = adapter->ahw;
1723 struct net_device *netdev = adapter->netdev;
1648 int status = 0, loop = 0; 1724 int status = 0, loop = 0;
1649 u32 config; 1725 u32 config;
1650 1726
@@ -1662,9 +1738,9 @@ int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
1662 1738
1663 status = qlcnic_83xx_set_port_config(adapter); 1739 status = qlcnic_83xx_set_port_config(adapter);
1664 if (status) { 1740 if (status) {
1665 dev_err(&adapter->pdev->dev, 1741 netdev_err(netdev,
1666 "Failed to Set Loopback Mode = 0x%x.\n", 1742 "Failed to Set Loopback Mode = 0x%x.\n",
1667 ahw->port_config); 1743 ahw->port_config);
1668 ahw->port_config = config; 1744 ahw->port_config = config;
1669 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1745 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status);
1670 return status; 1746 return status;
@@ -1672,13 +1748,19 @@ int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
1672 1748
1673 /* Wait for Link and IDC Completion AEN */ 1749 /* Wait for Link and IDC Completion AEN */
1674 do { 1750 do {
1675 msleep(300); 1751 msleep(QLC_83XX_LB_MSLEEP_COUNT);
1676 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) 1752 if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
1677 qlcnic_83xx_process_aen(adapter); 1753 qlcnic_83xx_process_aen(adapter);
1678 1754
1679 if (loop++ > QLCNIC_ILB_MAX_RCV_LOOP) { 1755 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
1680 dev_err(&adapter->pdev->dev, 1756 netdev_info(netdev,
1681 "FW did not generate IDC completion AEN\n"); 1757 "Device is resetting, free LB test resources\n");
1758 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status);
1759 return -EIO;
1760 }
1761 if (loop++ > QLC_83XX_LB_WAIT_COUNT) {
1762 netdev_err(netdev,
1763 "Did not receive IDC completion AEN\n");
1682 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1764 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status);
1683 qlcnic_83xx_clear_lb_mode(adapter, mode); 1765 qlcnic_83xx_clear_lb_mode(adapter, mode);
1684 return -EIO; 1766 return -EIO;
@@ -1693,6 +1775,7 @@ int qlcnic_83xx_set_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
1693int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode) 1775int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
1694{ 1776{
1695 struct qlcnic_hardware_context *ahw = adapter->ahw; 1777 struct qlcnic_hardware_context *ahw = adapter->ahw;
1778 struct net_device *netdev = adapter->netdev;
1696 int status = 0, loop = 0; 1779 int status = 0, loop = 0;
1697 u32 config = ahw->port_config; 1780 u32 config = ahw->port_config;
1698 1781
@@ -1704,9 +1787,9 @@ int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
1704 1787
1705 status = qlcnic_83xx_set_port_config(adapter); 1788 status = qlcnic_83xx_set_port_config(adapter);
1706 if (status) { 1789 if (status) {
1707 dev_err(&adapter->pdev->dev, 1790 netdev_err(netdev,
1708 "Failed to Clear Loopback Mode = 0x%x.\n", 1791 "Failed to Clear Loopback Mode = 0x%x.\n",
1709 ahw->port_config); 1792 ahw->port_config);
1710 ahw->port_config = config; 1793 ahw->port_config = config;
1711 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1794 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status);
1712 return status; 1795 return status;
@@ -1714,13 +1797,20 @@ int qlcnic_83xx_clear_lb_mode(struct qlcnic_adapter *adapter, u8 mode)
1714 1797
1715 /* Wait for Link and IDC Completion AEN */ 1798 /* Wait for Link and IDC Completion AEN */
1716 do { 1799 do {
1717 msleep(300); 1800 msleep(QLC_83XX_LB_MSLEEP_COUNT);
1718 if (!(adapter->flags & QLCNIC_MSIX_ENABLED)) 1801 if (!(adapter->flags & QLCNIC_MSIX_ENABLED))
1719 qlcnic_83xx_process_aen(adapter); 1802 qlcnic_83xx_process_aen(adapter);
1720 1803
1721 if (loop++ > QLCNIC_ILB_MAX_RCV_LOOP) { 1804 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
1722 dev_err(&adapter->pdev->dev, 1805 netdev_info(netdev,
1723 "Firmware didn't sent IDC completion AEN\n"); 1806 "Device is resetting, free LB test resources\n");
1807 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status);
1808 return -EIO;
1809 }
1810
1811 if (loop++ > QLC_83XX_LB_WAIT_COUNT) {
1812 netdev_err(netdev,
1813 "Did not receive IDC completion AEN\n");
1724 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status); 1814 clear_bit(QLC_83XX_IDC_COMP_AEN, &ahw->idc.status);
1725 return -EIO; 1815 return -EIO;
1726 } 1816 }
@@ -1749,7 +1839,11 @@ void qlcnic_83xx_config_ipaddr(struct qlcnic_adapter *adapter, __be32 ip,
1749 u32 temp = 0, temp_ip; 1839 u32 temp = 0, temp_ip;
1750 struct qlcnic_cmd_args cmd; 1840 struct qlcnic_cmd_args cmd;
1751 1841
1752 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_IP_ADDR); 1842 err = qlcnic_alloc_mbx_args(&cmd, adapter,
1843 QLCNIC_CMD_CONFIGURE_IP_ADDR);
1844 if (err)
1845 return;
1846
1753 qlcnic_83xx_set_interface_id_ipaddr(adapter, &temp); 1847 qlcnic_83xx_set_interface_id_ipaddr(adapter, &temp);
1754 1848
1755 if (mode == QLCNIC_IP_UP) 1849 if (mode == QLCNIC_IP_UP)
@@ -1788,7 +1882,10 @@ int qlcnic_83xx_config_hw_lro(struct qlcnic_adapter *adapter, int mode)
1788 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) 1882 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
1789 return 0; 1883 return 0;
1790 1884
1791 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO); 1885 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_HW_LRO);
1886 if (err)
1887 return err;
1888
1792 temp = adapter->recv_ctx->context_id << 16; 1889 temp = adapter->recv_ctx->context_id << 16;
1793 arg1 = lro_bit_mask | temp; 1890 arg1 = lro_bit_mask | temp;
1794 cmd.req.arg[1] = arg1; 1891 cmd.req.arg[1] = arg1;
@@ -1810,8 +1907,9 @@ int qlcnic_83xx_config_rss(struct qlcnic_adapter *adapter, int enable)
1810 0xae7b30b4d0ca2bcbULL, 0x43a38fb04167253dULL, 1907 0xae7b30b4d0ca2bcbULL, 0x43a38fb04167253dULL,
1811 0x255b0ec26d5a56daULL }; 1908 0x255b0ec26d5a56daULL };
1812 1909
1813 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_RSS); 1910 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_RSS);
1814 1911 if (err)
1912 return err;
1815 /* 1913 /*
1816 * RSS request: 1914 * RSS request:
1817 * bits 3-0: Rsvd 1915 * bits 3-0: Rsvd
@@ -1917,7 +2015,10 @@ int qlcnic_83xx_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac)
1917 struct qlcnic_cmd_args cmd; 2015 struct qlcnic_cmd_args cmd;
1918 u32 mac_low, mac_high; 2016 u32 mac_low, mac_high;
1919 2017
1920 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS); 2018 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS);
2019 if (err)
2020 return err;
2021
1921 qlcnic_83xx_configure_mac(adapter, mac, QLCNIC_GET_CURRENT_MAC, &cmd); 2022 qlcnic_83xx_configure_mac(adapter, mac, QLCNIC_GET_CURRENT_MAC, &cmd);
1922 err = qlcnic_issue_cmd(adapter, &cmd); 2023 err = qlcnic_issue_cmd(adapter, &cmd);
1923 2024
@@ -1948,7 +2049,10 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter)
1948 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED) 2049 if (adapter->recv_ctx->state == QLCNIC_HOST_CTX_STATE_FREED)
1949 return; 2050 return;
1950 2051
1951 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL); 2052 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTR_COAL);
2053 if (err)
2054 return;
2055
1952 if (coal->type == QLCNIC_INTR_COAL_TYPE_RX) { 2056 if (coal->type == QLCNIC_INTR_COAL_TYPE_RX) {
1953 temp = adapter->recv_ctx->context_id; 2057 temp = adapter->recv_ctx->context_id;
1954 cmd.req.arg[1] = QLCNIC_INTR_COAL_TYPE_RX | temp << 16; 2058 cmd.req.arg[1] = QLCNIC_INTR_COAL_TYPE_RX | temp << 16;
@@ -2020,7 +2124,10 @@ int qlcnic_enable_eswitch(struct qlcnic_adapter *adapter, u8 port, u8 enable)
2020 return err; 2124 return err;
2021 } 2125 }
2022 2126
2023 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_TOGGLE_ESWITCH); 2127 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_TOGGLE_ESWITCH);
2128 if (err)
2129 return err;
2130
2024 cmd.req.arg[1] = (port & 0xf) | BIT_4; 2131 cmd.req.arg[1] = (port & 0xf) | BIT_4;
2025 err = qlcnic_issue_cmd(adapter, &cmd); 2132 err = qlcnic_issue_cmd(adapter, &cmd);
2026 2133
@@ -2048,7 +2155,10 @@ int qlcnic_83xx_set_nic_info(struct qlcnic_adapter *adapter,
2048 return err; 2155 return err;
2049 } 2156 }
2050 2157
2051 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO); 2158 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
2159 if (err)
2160 return err;
2161
2052 cmd.req.arg[1] = (nic->pci_func << 16); 2162 cmd.req.arg[1] = (nic->pci_func << 16);
2053 cmd.req.arg[2] = 0x1 << 16; 2163 cmd.req.arg[2] = 0x1 << 16;
2054 cmd.req.arg[3] = nic->phys_port | (nic->switch_mode << 16); 2164 cmd.req.arg[3] = nic->phys_port | (nic->switch_mode << 16);
@@ -2079,13 +2189,17 @@ int qlcnic_83xx_get_nic_info(struct qlcnic_adapter *adapter,
2079 u32 temp; 2189 u32 temp;
2080 u8 op = 0; 2190 u8 op = 0;
2081 struct qlcnic_cmd_args cmd; 2191 struct qlcnic_cmd_args cmd;
2192 struct qlcnic_hardware_context *ahw = adapter->ahw;
2082 2193
2083 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO); 2194 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO);
2084 if (func_id != adapter->ahw->pci_func) { 2195 if (err)
2196 return err;
2197
2198 if (func_id != ahw->pci_func) {
2085 temp = func_id << 16; 2199 temp = func_id << 16;
2086 cmd.req.arg[1] = op | BIT_31 | temp; 2200 cmd.req.arg[1] = op | BIT_31 | temp;
2087 } else { 2201 } else {
2088 cmd.req.arg[1] = adapter->ahw->pci_func << 16; 2202 cmd.req.arg[1] = ahw->pci_func << 16;
2089 } 2203 }
2090 err = qlcnic_issue_cmd(adapter, &cmd); 2204 err = qlcnic_issue_cmd(adapter, &cmd);
2091 if (err) { 2205 if (err) {
@@ -2112,6 +2226,9 @@ int qlcnic_83xx_get_nic_info(struct qlcnic_adapter *adapter,
2112 temp = (cmd.rsp.arg[8] & 0x7FFE0000) >> 17; 2226 temp = (cmd.rsp.arg[8] & 0x7FFE0000) >> 17;
2113 npar_info->max_linkspeed_reg_offset = temp; 2227 npar_info->max_linkspeed_reg_offset = temp;
2114 } 2228 }
2229 if (npar_info->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS)
2230 memcpy(ahw->extra_capability, &cmd.rsp.arg[16],
2231 sizeof(ahw->extra_capability));
2115 2232
2116out: 2233out:
2117 qlcnic_free_mbx_args(&cmd); 2234 qlcnic_free_mbx_args(&cmd);
@@ -2121,26 +2238,28 @@ out:
2121int qlcnic_83xx_get_pci_info(struct qlcnic_adapter *adapter, 2238int qlcnic_83xx_get_pci_info(struct qlcnic_adapter *adapter,
2122 struct qlcnic_pci_info *pci_info) 2239 struct qlcnic_pci_info *pci_info)
2123{ 2240{
2241 struct qlcnic_hardware_context *ahw = adapter->ahw;
2242 struct device *dev = &adapter->pdev->dev;
2243 struct qlcnic_cmd_args cmd;
2124 int i, err = 0, j = 0; 2244 int i, err = 0, j = 0;
2125 u32 temp; 2245 u32 temp;
2126 struct qlcnic_cmd_args cmd;
2127 2246
2128 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO); 2247 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO);
2248 if (err)
2249 return err;
2250
2129 err = qlcnic_issue_cmd(adapter, &cmd); 2251 err = qlcnic_issue_cmd(adapter, &cmd);
2130 2252
2131 adapter->ahw->act_pci_func = 0; 2253 ahw->act_pci_func = 0;
2132 if (err == QLCNIC_RCODE_SUCCESS) { 2254 if (err == QLCNIC_RCODE_SUCCESS) {
2133 pci_info->func_count = cmd.rsp.arg[1] & 0xFF; 2255 ahw->max_pci_func = cmd.rsp.arg[1] & 0xFF;
2134 dev_info(&adapter->pdev->dev,
2135 "%s: total functions = %d\n",
2136 __func__, pci_info->func_count);
2137 for (i = 2, j = 0; j < QLCNIC_MAX_PCI_FUNC; j++, pci_info++) { 2256 for (i = 2, j = 0; j < QLCNIC_MAX_PCI_FUNC; j++, pci_info++) {
2138 pci_info->id = cmd.rsp.arg[i] & 0xFFFF; 2257 pci_info->id = cmd.rsp.arg[i] & 0xFFFF;
2139 pci_info->active = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16; 2258 pci_info->active = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16;
2140 i++; 2259 i++;
2141 pci_info->type = cmd.rsp.arg[i] & 0xFFFF; 2260 pci_info->type = cmd.rsp.arg[i] & 0xFFFF;
2142 if (pci_info->type == QLCNIC_TYPE_NIC) 2261 if (pci_info->type == QLCNIC_TYPE_NIC)
2143 adapter->ahw->act_pci_func++; 2262 ahw->act_pci_func++;
2144 temp = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16; 2263 temp = (cmd.rsp.arg[i] & 0xFFFF0000) >> 16;
2145 pci_info->default_port = temp; 2264 pci_info->default_port = temp;
2146 i++; 2265 i++;
@@ -2152,18 +2271,21 @@ int qlcnic_83xx_get_pci_info(struct qlcnic_adapter *adapter,
2152 i++; 2271 i++;
2153 memcpy(pci_info->mac + sizeof(u32), &cmd.rsp.arg[i], 2); 2272 memcpy(pci_info->mac + sizeof(u32), &cmd.rsp.arg[i], 2);
2154 i = i + 3; 2273 i = i + 3;
2155 2274 if (ahw->op_mode == QLCNIC_MGMT_FUNC)
2156 dev_info(&adapter->pdev->dev, "%s:\n" 2275 dev_info(dev, "id = %d active = %d type = %d\n"
2157 "\tid = %d active = %d type = %d\n" 2276 "\tport = %d min bw = %d max bw = %d\n"
2158 "\tport = %d min bw = %d max bw = %d\n" 2277 "\tmac_addr = %pM\n", pci_info->id,
2159 "\tmac_addr = %pM\n", __func__, 2278 pci_info->active, pci_info->type,
2160 pci_info->id, pci_info->active, pci_info->type, 2279 pci_info->default_port,
2161 pci_info->default_port, pci_info->tx_min_bw, 2280 pci_info->tx_min_bw,
2162 pci_info->tx_max_bw, pci_info->mac); 2281 pci_info->tx_max_bw, pci_info->mac);
2163 } 2282 }
2283 if (ahw->op_mode == QLCNIC_MGMT_FUNC)
2284 dev_info(dev, "Max vNIC functions = %d, active vNIC functions = %d\n",
2285 ahw->max_pci_func, ahw->act_pci_func);
2286
2164 } else { 2287 } else {
2165 dev_err(&adapter->pdev->dev, "Failed to get PCI Info%d\n", 2288 dev_err(dev, "Failed to get PCI Info, error = %d\n", err);
2166 err);
2167 err = -EIO; 2289 err = -EIO;
2168 } 2290 }
2169 2291
@@ -2180,7 +2302,10 @@ int qlcnic_83xx_config_intrpt(struct qlcnic_adapter *adapter, bool op_type)
2180 struct qlcnic_cmd_args cmd; 2302 struct qlcnic_cmd_args cmd;
2181 2303
2182 max_ints = adapter->ahw->num_msix - 1; 2304 max_ints = adapter->ahw->num_msix - 1;
2183 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTRPT); 2305 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_INTRPT);
2306 if (err)
2307 return err;
2308
2184 cmd.req.arg[1] = max_ints; 2309 cmd.req.arg[1] = max_ints;
2185 2310
2186 if (qlcnic_sriov_vf_check(adapter)) 2311 if (qlcnic_sriov_vf_check(adapter))
@@ -2808,7 +2933,11 @@ int qlcnic_83xx_test_link(struct qlcnic_adapter *adapter)
2808 dev_info(&adapter->pdev->dev, "link state down\n"); 2933 dev_info(&adapter->pdev->dev, "link state down\n");
2809 return config; 2934 return config;
2810 } 2935 }
2811 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_STATUS); 2936
2937 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LINK_STATUS);
2938 if (err)
2939 return err;
2940
2812 err = qlcnic_issue_cmd(adapter, &cmd); 2941 err = qlcnic_issue_cmd(adapter, &cmd);
2813 if (err) { 2942 if (err) {
2814 dev_info(&adapter->pdev->dev, 2943 dev_info(&adapter->pdev->dev,
@@ -3034,7 +3163,9 @@ void qlcnic_83xx_get_stats(struct qlcnic_adapter *adapter, u64 *data)
3034 struct net_device *netdev = adapter->netdev; 3163 struct net_device *netdev = adapter->netdev;
3035 int ret = 0; 3164 int ret = 0;
3036 3165
3037 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_STATISTICS); 3166 ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_STATISTICS);
3167 if (ret)
3168 return;
3038 /* Get Tx stats */ 3169 /* Get Tx stats */
3039 cmd.req.arg[1] = BIT_1 | (adapter->tx_ring->ctx_id << 16); 3170 cmd.req.arg[1] = BIT_1 | (adapter->tx_ring->ctx_id << 16);
3040 cmd.rsp.num = QLC_83XX_TX_STAT_REGS; 3171 cmd.rsp.num = QLC_83XX_TX_STAT_REGS;
@@ -3113,8 +3244,10 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
3113 u8 val; 3244 u8 val;
3114 int ret, max_sds_rings = adapter->max_sds_rings; 3245 int ret, max_sds_rings = adapter->max_sds_rings;
3115 3246
3116 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) 3247 if (qlcnic_get_diag_lock(adapter)) {
3117 return -EIO; 3248 netdev_info(netdev, "Device in diagnostics mode\n");
3249 return -EBUSY;
3250 }
3118 3251
3119 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST, 3252 ret = qlcnic_83xx_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST,
3120 max_sds_rings); 3253 max_sds_rings);
@@ -3122,7 +3255,9 @@ int qlcnic_83xx_interrupt_test(struct net_device *netdev)
3122 goto fail_diag_irq; 3255 goto fail_diag_irq;
3123 3256
3124 ahw->diag_cnt = 0; 3257 ahw->diag_cnt = 0;
3125 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST); 3258 ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST);
3259 if (ret)
3260 goto fail_diag_irq;
3126 3261
3127 if (adapter->flags & QLCNIC_MSIX_ENABLED) 3262 if (adapter->flags & QLCNIC_MSIX_ENABLED)
3128 intrpt_id = ahw->intr_tbl[0].id; 3263 intrpt_id = ahw->intr_tbl[0].id;
@@ -3156,7 +3291,7 @@ done:
3156 3291
3157fail_diag_irq: 3292fail_diag_irq:
3158 adapter->max_sds_rings = max_sds_rings; 3293 adapter->max_sds_rings = max_sds_rings;
3159 clear_bit(__QLCNIC_RESETTING, &adapter->state); 3294 qlcnic_release_diag_lock(adapter);
3160 return ret; 3295 return ret;
3161} 3296}
3162 3297
@@ -3260,3 +3395,54 @@ int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter)
3260 } 3395 }
3261 return 0; 3396 return 0;
3262} 3397}
3398
3399int qlcnic_83xx_shutdown(struct pci_dev *pdev)
3400{
3401 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
3402 struct net_device *netdev = adapter->netdev;
3403 int retval;
3404
3405 netif_device_detach(netdev);
3406 qlcnic_cancel_idc_work(adapter);
3407
3408 if (netif_running(netdev))
3409 qlcnic_down(adapter, netdev);
3410
3411 qlcnic_83xx_disable_mbx_intr(adapter);
3412 cancel_delayed_work_sync(&adapter->idc_aen_work);
3413
3414 retval = pci_save_state(pdev);
3415 if (retval)
3416 return retval;
3417
3418 return 0;
3419}
3420
3421int qlcnic_83xx_resume(struct qlcnic_adapter *adapter)
3422{
3423 struct qlcnic_hardware_context *ahw = adapter->ahw;
3424 struct qlc_83xx_idc *idc = &ahw->idc;
3425 int err = 0;
3426
3427 err = qlcnic_83xx_idc_init(adapter);
3428 if (err)
3429 return err;
3430
3431 if (ahw->nic_mode == QLC_83XX_VIRTUAL_NIC_MODE) {
3432 if (ahw->op_mode == QLCNIC_MGMT_FUNC) {
3433 qlcnic_83xx_set_vnic_opmode(adapter);
3434 } else {
3435 err = qlcnic_83xx_check_vnic_state(adapter);
3436 if (err)
3437 return err;
3438 }
3439 }
3440
3441 err = qlcnic_83xx_idc_reattach_driver(adapter);
3442 if (err)
3443 return err;
3444
3445 qlcnic_schedule_work(adapter, qlcnic_83xx_idc_poll_dev_state,
3446 idc->delay);
3447 return err;
3448}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
index f5db67fc9f55..2548d1403d75 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
@@ -36,7 +36,8 @@
36#define QLC_83XX_MAX_DRV_LOCK_RECOVERY_ATTEMPT 3 36#define QLC_83XX_MAX_DRV_LOCK_RECOVERY_ATTEMPT 3
37#define QLC_83XX_DRV_LOCK_RECOVERY_DELAY 200 37#define QLC_83XX_DRV_LOCK_RECOVERY_DELAY 200
38#define QLC_83XX_DRV_LOCK_RECOVERY_STATUS_MASK 0x3 38#define QLC_83XX_DRV_LOCK_RECOVERY_STATUS_MASK 0x3
39 39#define QLC_83XX_LB_WAIT_COUNT 250
40#define QLC_83XX_LB_MSLEEP_COUNT 20
40#define QLC_83XX_NO_NIC_RESOURCE 0x5 41#define QLC_83XX_NO_NIC_RESOURCE 0x5
41#define QLC_83XX_MAC_PRESENT 0xC 42#define QLC_83XX_MAC_PRESENT 0xC
42#define QLC_83XX_MAC_ABSENT 0xD 43#define QLC_83XX_MAC_ABSENT 0xD
@@ -314,6 +315,7 @@ struct qlc_83xx_idc {
314 u8 vnic_state; 315 u8 vnic_state;
315 u8 vnic_wait_limit; 316 u8 vnic_wait_limit;
316 u8 quiesce_req; 317 u8 quiesce_req;
318 u8 delay_reset;
317 char **name; 319 char **name;
318}; 320};
319 321
@@ -392,6 +394,8 @@ enum qlcnic_83xx_states {
392#define QLC_83XX_LB_MAX_FILTERS 2048 394#define QLC_83XX_LB_MAX_FILTERS 2048
393#define QLC_83XX_LB_BUCKET_SIZE 256 395#define QLC_83XX_LB_BUCKET_SIZE 256
394#define QLC_83XX_MINIMUM_VECTOR 3 396#define QLC_83XX_MINIMUM_VECTOR 3
397#define QLC_83XX_MAX_MC_COUNT 38
398#define QLC_83XX_MAX_UC_COUNT 4096
395 399
396#define QLC_83XX_GET_FUNC_MODE_FROM_NPAR_INFO(val) (val & 0x80000000) 400#define QLC_83XX_GET_FUNC_MODE_FROM_NPAR_INFO(val) (val & 0x80000000)
397#define QLC_83XX_GET_LRO_CAPABILITY(val) (val & 0x20) 401#define QLC_83XX_GET_LRO_CAPABILITY(val) (val & 0x20)
@@ -623,4 +627,11 @@ u32 qlcnic_83xx_mac_rcode(struct qlcnic_adapter *);
623u32 qlcnic_83xx_mbx_poll(struct qlcnic_adapter *, u32 *); 627u32 qlcnic_83xx_mbx_poll(struct qlcnic_adapter *, u32 *);
624void qlcnic_83xx_enable_mbx_poll(struct qlcnic_adapter *); 628void qlcnic_83xx_enable_mbx_poll(struct qlcnic_adapter *);
625void qlcnic_83xx_disable_mbx_poll(struct qlcnic_adapter *); 629void qlcnic_83xx_disable_mbx_poll(struct qlcnic_adapter *);
630void qlcnic_83xx_set_mac_filter_count(struct qlcnic_adapter *);
631int qlcnic_83xx_shutdown(struct pci_dev *);
632int qlcnic_83xx_resume(struct qlcnic_adapter *);
633int qlcnic_83xx_idc_init(struct qlcnic_adapter *);
634int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *);
635int qlcnic_83xx_set_vnic_opmode(struct qlcnic_adapter *);
636int qlcnic_83xx_check_vnic_state(struct qlcnic_adapter *);
626#endif 637#endif
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
index 5e7fb1dfb97b..f41dfab1e9a3 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
@@ -606,7 +606,7 @@ static int qlcnic_83xx_idc_check_fan_failure(struct qlcnic_adapter *adapter)
606 return 0; 606 return 0;
607} 607}
608 608
609static int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter) 609int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)
610{ 610{
611 int err; 611 int err;
612 612
@@ -629,6 +629,7 @@ static int qlcnic_83xx_idc_reattach_driver(struct qlcnic_adapter *adapter)
629 return -EIO; 629 return -EIO;
630 } 630 }
631 631
632 qlcnic_set_drv_version(adapter);
632 qlcnic_83xx_idc_attach_driver(adapter); 633 qlcnic_83xx_idc_attach_driver(adapter);
633 634
634 return 0; 635 return 0;
@@ -649,6 +650,7 @@ static void qlcnic_83xx_idc_update_idc_params(struct qlcnic_adapter *adapter)
649 ahw->idc.collect_dump = 0; 650 ahw->idc.collect_dump = 0;
650 ahw->reset_context = 0; 651 ahw->reset_context = 0;
651 adapter->tx_timeo_cnt = 0; 652 adapter->tx_timeo_cnt = 0;
653 ahw->idc.delay_reset = 0;
652 654
653 clear_bit(__QLCNIC_RESETTING, &adapter->state); 655 clear_bit(__QLCNIC_RESETTING, &adapter->state);
654} 656}
@@ -883,21 +885,41 @@ static int qlcnic_83xx_idc_need_reset_state(struct qlcnic_adapter *adapter)
883 int ret = 0; 885 int ret = 0;
884 886
885 if (adapter->ahw->idc.prev_state != QLC_83XX_IDC_DEV_NEED_RESET) { 887 if (adapter->ahw->idc.prev_state != QLC_83XX_IDC_DEV_NEED_RESET) {
886 qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
887 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1); 888 qlcnic_83xx_idc_update_audit_reg(adapter, 0, 1);
888 set_bit(__QLCNIC_RESETTING, &adapter->state); 889 set_bit(__QLCNIC_RESETTING, &adapter->state);
889 clear_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status); 890 clear_bit(QLC_83XX_MBX_READY, &adapter->ahw->idc.status);
890 if (adapter->ahw->nic_mode == QLC_83XX_VIRTUAL_NIC_MODE) 891 if (adapter->ahw->nic_mode == QLC_83XX_VIRTUAL_NIC_MODE)
891 qlcnic_83xx_disable_vnic_mode(adapter, 1); 892 qlcnic_83xx_disable_vnic_mode(adapter, 1);
892 qlcnic_83xx_idc_detach_driver(adapter); 893
894 if (qlcnic_check_diag_status(adapter)) {
895 dev_info(&adapter->pdev->dev,
896 "%s: Wait for diag completion\n", __func__);
897 adapter->ahw->idc.delay_reset = 1;
898 return 0;
899 } else {
900 qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
901 qlcnic_83xx_idc_detach_driver(adapter);
902 }
893 } 903 }
894 904
895 /* Check ACK from other functions */ 905 if (qlcnic_check_diag_status(adapter)) {
896 ret = qlcnic_83xx_idc_check_reset_ack_reg(adapter);
897 if (ret) {
898 dev_info(&adapter->pdev->dev, 906 dev_info(&adapter->pdev->dev,
899 "%s: Waiting for reset ACK\n", __func__); 907 "%s: Wait for diag completion\n", __func__);
900 return 0; 908 return -1;
909 } else {
910 if (adapter->ahw->idc.delay_reset) {
911 qlcnic_83xx_idc_update_drv_ack_reg(adapter, 1, 1);
912 qlcnic_83xx_idc_detach_driver(adapter);
913 adapter->ahw->idc.delay_reset = 0;
914 }
915
916 /* Check for ACK from other functions */
917 ret = qlcnic_83xx_idc_check_reset_ack_reg(adapter);
918 if (ret) {
919 dev_info(&adapter->pdev->dev,
920 "%s: Waiting for reset ACK\n", __func__);
921 return -1;
922 }
901 } 923 }
902 924
903 /* Transit to INIT state and restart the HW */ 925 /* Transit to INIT state and restart the HW */
@@ -1113,7 +1135,7 @@ qlcnic_83xx_idc_first_to_load_function_handler(struct qlcnic_adapter *adapter)
1113 return 0; 1135 return 0;
1114} 1136}
1115 1137
1116static int qlcnic_83xx_idc_init(struct qlcnic_adapter *adapter) 1138int qlcnic_83xx_idc_init(struct qlcnic_adapter *adapter)
1117{ 1139{
1118 int ret = -EIO; 1140 int ret = -EIO;
1119 1141
@@ -1532,9 +1554,18 @@ static int qlcnic_83xx_reset_template_checksum(struct qlcnic_adapter *p_dev)
1532 1554
1533int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev) 1555int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev)
1534{ 1556{
1535 u8 *p_buff;
1536 u32 addr, count;
1537 struct qlcnic_hardware_context *ahw = p_dev->ahw; 1557 struct qlcnic_hardware_context *ahw = p_dev->ahw;
1558 u32 addr, count, prev_ver, curr_ver;
1559 u8 *p_buff;
1560
1561 if (ahw->reset.buff != NULL) {
1562 prev_ver = p_dev->fw_version;
1563 curr_ver = qlcnic_83xx_get_fw_version(p_dev);
1564 if (curr_ver > prev_ver)
1565 kfree(ahw->reset.buff);
1566 else
1567 return 0;
1568 }
1538 1569
1539 ahw->reset.seq_error = 0; 1570 ahw->reset.seq_error = 0;
1540 ahw->reset.buff = kzalloc(QLC_83XX_RESTART_TEMPLATE_SIZE, GFP_KERNEL); 1571 ahw->reset.buff = kzalloc(QLC_83XX_RESTART_TEMPLATE_SIZE, GFP_KERNEL);
@@ -2062,7 +2093,11 @@ static void qlcnic_83xx_clear_function_resources(struct qlcnic_adapter *adapter)
2062 audit_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT); 2093 audit_mask = QLCRDX(adapter->ahw, QLC_83XX_IDC_DRV_AUDIT);
2063 2094
2064 if (IS_QLC_83XX_USED(adapter, presence_mask, audit_mask)) { 2095 if (IS_QLC_83XX_USED(adapter, presence_mask, audit_mask)) {
2065 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_STOP_NIC_FUNC); 2096 status = qlcnic_alloc_mbx_args(&cmd, adapter,
2097 QLCNIC_CMD_STOP_NIC_FUNC);
2098 if (status)
2099 return;
2100
2066 cmd.req.arg[1] = BIT_31; 2101 cmd.req.arg[1] = BIT_31;
2067 status = qlcnic_issue_cmd(adapter, &cmd); 2102 status = qlcnic_issue_cmd(adapter, &cmd);
2068 if (status) 2103 if (status)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c
index b0c3de9ede03..599d1fda52f2 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_vnic.c
@@ -39,30 +39,21 @@ int qlcnic_83xx_disable_vnic_mode(struct qlcnic_adapter *adapter, int lock)
39 return 0; 39 return 0;
40} 40}
41 41
42static int qlcnic_83xx_set_vnic_opmode(struct qlcnic_adapter *adapter) 42int qlcnic_83xx_set_vnic_opmode(struct qlcnic_adapter *adapter)
43{ 43{
44 u8 id; 44 u8 id;
45 int i, ret = -EBUSY; 45 int ret = -EBUSY;
46 u32 data = QLCNIC_MGMT_FUNC; 46 u32 data = QLCNIC_MGMT_FUNC;
47 struct qlcnic_hardware_context *ahw = adapter->ahw; 47 struct qlcnic_hardware_context *ahw = adapter->ahw;
48 48
49 if (qlcnic_83xx_lock_driver(adapter)) 49 if (qlcnic_83xx_lock_driver(adapter))
50 return ret; 50 return ret;
51 51
52 if (qlcnic_config_npars) { 52 id = ahw->pci_func;
53 for (i = 0; i < ahw->act_pci_func; i++) { 53 data = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE);
54 id = adapter->npars[i].pci_func; 54 data = (data & ~QLC_83XX_SET_FUNC_OPMODE(0x3, id)) |
55 if (id == ahw->pci_func) 55 QLC_83XX_SET_FUNC_OPMODE(QLCNIC_MGMT_FUNC, id);
56 continue; 56
57 data |= qlcnic_config_npars &
58 QLC_83XX_SET_FUNC_OPMODE(0x3, id);
59 }
60 } else {
61 data = QLCRDX(adapter->ahw, QLC_83XX_DRV_OP_MODE);
62 data = (data & ~QLC_83XX_SET_FUNC_OPMODE(0x3, ahw->pci_func)) |
63 QLC_83XX_SET_FUNC_OPMODE(QLCNIC_MGMT_FUNC,
64 ahw->pci_func);
65 }
66 QLCWRX(adapter->ahw, QLC_83XX_DRV_OP_MODE, data); 57 QLCWRX(adapter->ahw, QLC_83XX_DRV_OP_MODE, data);
67 58
68 qlcnic_83xx_unlock_driver(adapter); 59 qlcnic_83xx_unlock_driver(adapter);
@@ -196,20 +187,24 @@ int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *adapter)
196 else 187 else
197 priv_level = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode, 188 priv_level = QLC_83XX_GET_FUNC_PRIVILEGE(op_mode,
198 ahw->pci_func); 189 ahw->pci_func);
199 190 switch (priv_level) {
200 if (priv_level == QLCNIC_NON_PRIV_FUNC) { 191 case QLCNIC_NON_PRIV_FUNC:
201 ahw->op_mode = QLCNIC_NON_PRIV_FUNC; 192 ahw->op_mode = QLCNIC_NON_PRIV_FUNC;
202 ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; 193 ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
203 nic_ops->init_driver = qlcnic_83xx_init_non_privileged_vnic; 194 nic_ops->init_driver = qlcnic_83xx_init_non_privileged_vnic;
204 } else if (priv_level == QLCNIC_PRIV_FUNC) { 195 break;
196 case QLCNIC_PRIV_FUNC:
205 ahw->op_mode = QLCNIC_PRIV_FUNC; 197 ahw->op_mode = QLCNIC_PRIV_FUNC;
206 ahw->idc.state_entry = qlcnic_83xx_idc_vnic_pf_entry; 198 ahw->idc.state_entry = qlcnic_83xx_idc_vnic_pf_entry;
207 nic_ops->init_driver = qlcnic_83xx_init_privileged_vnic; 199 nic_ops->init_driver = qlcnic_83xx_init_privileged_vnic;
208 } else if (priv_level == QLCNIC_MGMT_FUNC) { 200 break;
201 case QLCNIC_MGMT_FUNC:
209 ahw->op_mode = QLCNIC_MGMT_FUNC; 202 ahw->op_mode = QLCNIC_MGMT_FUNC;
210 ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry; 203 ahw->idc.state_entry = qlcnic_83xx_idc_ready_state_entry;
211 nic_ops->init_driver = qlcnic_83xx_init_mgmt_vnic; 204 nic_ops->init_driver = qlcnic_83xx_init_mgmt_vnic;
212 } else { 205 break;
206 default:
207 dev_err(&adapter->pdev->dev, "Invalid Virtual NIC opmode\n");
213 return -EIO; 208 return -EIO;
214 } 209 }
215 210
@@ -218,8 +213,29 @@ int qlcnic_83xx_config_vnic_opmode(struct qlcnic_adapter *adapter)
218 else 213 else
219 adapter->flags &= ~QLCNIC_ESWITCH_ENABLED; 214 adapter->flags &= ~QLCNIC_ESWITCH_ENABLED;
220 215
221 adapter->ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER; 216 ahw->idc.vnic_state = QLCNIC_DEV_NPAR_NON_OPER;
222 adapter->ahw->idc.vnic_wait_limit = QLCNIC_DEV_NPAR_OPER_TIMEO; 217 ahw->idc.vnic_wait_limit = QLCNIC_DEV_NPAR_OPER_TIMEO;
218
219 return 0;
220}
221
222int qlcnic_83xx_check_vnic_state(struct qlcnic_adapter *adapter)
223{
224 struct qlcnic_hardware_context *ahw = adapter->ahw;
225 struct qlc_83xx_idc *idc = &ahw->idc;
226 u32 state;
227
228 state = QLCRDX(ahw, QLC_83XX_VNIC_STATE);
229 while (state != QLCNIC_DEV_NPAR_OPER && idc->vnic_wait_limit--) {
230 msleep(1000);
231 state = QLCRDX(ahw, QLC_83XX_VNIC_STATE);
232 }
233
234 if (!idc->vnic_wait_limit) {
235 dev_err(&adapter->pdev->dev,
236 "vNIC mode not operational, state check timed out.\n");
237 return -EIO;
238 }
223 239
224 return 0; 240 return 0;
225} 241}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
index 6acf82b9f018..0581a484ceb5 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
@@ -36,7 +36,8 @@ static const struct qlcnic_mailbox_metadata qlcnic_mbx_tbl[] = {
36 {QLCNIC_CMD_CONFIG_PORT, 4, 1}, 36 {QLCNIC_CMD_CONFIG_PORT, 4, 1},
37 {QLCNIC_CMD_TEMP_SIZE, 4, 4}, 37 {QLCNIC_CMD_TEMP_SIZE, 4, 4},
38 {QLCNIC_CMD_GET_TEMP_HDR, 4, 1}, 38 {QLCNIC_CMD_GET_TEMP_HDR, 4, 1},
39 {QLCNIC_CMD_SET_DRV_VER, 4, 1}, 39 {QLCNIC_CMD_82XX_SET_DRV_VER, 4, 1},
40 {QLCNIC_CMD_GET_LED_STATUS, 4, 2},
40}; 41};
41 42
42static inline u32 qlcnic_get_cmd_signature(struct qlcnic_hardware_context *ahw) 43static inline u32 qlcnic_get_cmd_signature(struct qlcnic_hardware_context *ahw)
@@ -181,7 +182,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
181 return cmd->rsp.arg[0]; 182 return cmd->rsp.arg[0];
182} 183}
183 184
184int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter) 185int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter, u32 fw_cmd)
185{ 186{
186 struct qlcnic_cmd_args cmd; 187 struct qlcnic_cmd_args cmd;
187 u32 arg1, arg2, arg3; 188 u32 arg1, arg2, arg3;
@@ -193,7 +194,10 @@ int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter)
193 _QLCNIC_LINUX_MAJOR, _QLCNIC_LINUX_MINOR, 194 _QLCNIC_LINUX_MAJOR, _QLCNIC_LINUX_MINOR,
194 _QLCNIC_LINUX_SUBVERSION); 195 _QLCNIC_LINUX_SUBVERSION);
195 196
196 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_DRV_VER); 197 err = qlcnic_alloc_mbx_args(&cmd, adapter, fw_cmd);
198 if (err)
199 return err;
200
197 memcpy(&arg1, drv_string, sizeof(u32)); 201 memcpy(&arg1, drv_string, sizeof(u32));
198 memcpy(&arg2, drv_string + 4, sizeof(u32)); 202 memcpy(&arg2, drv_string + 4, sizeof(u32));
199 memcpy(&arg3, drv_string + 8, sizeof(u32)); 203 memcpy(&arg3, drv_string + 8, sizeof(u32));
@@ -221,7 +225,10 @@ qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu)
221 225
222 if (recv_ctx->state != QLCNIC_HOST_CTX_STATE_ACTIVE) 226 if (recv_ctx->state != QLCNIC_HOST_CTX_STATE_ACTIVE)
223 return err; 227 return err;
224 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_MTU); 228 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_MTU);
229 if (err)
230 return err;
231
225 cmd.req.arg[1] = recv_ctx->context_id; 232 cmd.req.arg[1] = recv_ctx->context_id;
226 cmd.req.arg[2] = mtu; 233 cmd.req.arg[2] = mtu;
227 234
@@ -335,7 +342,10 @@ int qlcnic_82xx_fw_cmd_create_rx_ctx(struct qlcnic_adapter *adapter)
335 } 342 }
336 343
337 phys_addr = hostrq_phys_addr; 344 phys_addr = hostrq_phys_addr;
338 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_RX_CTX); 345 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_RX_CTX);
346 if (err)
347 goto out_free_rsp;
348
339 cmd.req.arg[1] = MSD(phys_addr); 349 cmd.req.arg[1] = MSD(phys_addr);
340 cmd.req.arg[2] = LSD(phys_addr); 350 cmd.req.arg[2] = LSD(phys_addr);
341 cmd.req.arg[3] = rq_size; 351 cmd.req.arg[3] = rq_size;
@@ -373,10 +383,10 @@ int qlcnic_82xx_fw_cmd_create_rx_ctx(struct qlcnic_adapter *adapter)
373 recv_ctx->context_id = le16_to_cpu(prsp->context_id); 383 recv_ctx->context_id = le16_to_cpu(prsp->context_id);
374 recv_ctx->virt_port = prsp->virt_port; 384 recv_ctx->virt_port = prsp->virt_port;
375 385
386 qlcnic_free_mbx_args(&cmd);
376out_free_rsp: 387out_free_rsp:
377 dma_free_coherent(&adapter->pdev->dev, rsp_size, prsp, 388 dma_free_coherent(&adapter->pdev->dev, rsp_size, prsp,
378 cardrsp_phys_addr); 389 cardrsp_phys_addr);
379 qlcnic_free_mbx_args(&cmd);
380out_free_rq: 390out_free_rq:
381 dma_free_coherent(&adapter->pdev->dev, rq_size, prq, hostrq_phys_addr); 391 dma_free_coherent(&adapter->pdev->dev, rq_size, prq, hostrq_phys_addr);
382 return err; 392 return err;
@@ -388,7 +398,10 @@ void qlcnic_82xx_fw_cmd_del_rx_ctx(struct qlcnic_adapter *adapter)
388 struct qlcnic_cmd_args cmd; 398 struct qlcnic_cmd_args cmd;
389 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 399 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx;
390 400
391 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX); 401 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_RX_CTX);
402 if (err)
403 return;
404
392 cmd.req.arg[1] = recv_ctx->context_id; 405 cmd.req.arg[1] = recv_ctx->context_id;
393 err = qlcnic_issue_cmd(adapter, &cmd); 406 err = qlcnic_issue_cmd(adapter, &cmd);
394 if (err) 407 if (err)
@@ -457,7 +470,10 @@ int qlcnic_82xx_fw_cmd_create_tx_ctx(struct qlcnic_adapter *adapter,
457 470
458 phys_addr = rq_phys_addr; 471 phys_addr = rq_phys_addr;
459 472
460 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX); 473 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CREATE_TX_CTX);
474 if (err)
475 goto out_free_rsp;
476
461 cmd.req.arg[1] = MSD(phys_addr); 477 cmd.req.arg[1] = MSD(phys_addr);
462 cmd.req.arg[2] = LSD(phys_addr); 478 cmd.req.arg[2] = LSD(phys_addr);
463 cmd.req.arg[3] = rq_size; 479 cmd.req.arg[3] = rq_size;
@@ -473,12 +489,13 @@ int qlcnic_82xx_fw_cmd_create_tx_ctx(struct qlcnic_adapter *adapter,
473 err = -EIO; 489 err = -EIO;
474 } 490 }
475 491
492 qlcnic_free_mbx_args(&cmd);
493
494out_free_rsp:
476 dma_free_coherent(&adapter->pdev->dev, rsp_size, rsp_addr, 495 dma_free_coherent(&adapter->pdev->dev, rsp_size, rsp_addr,
477 rsp_phys_addr); 496 rsp_phys_addr);
478
479out_free_rq: 497out_free_rq:
480 dma_free_coherent(&adapter->pdev->dev, rq_size, rq_addr, rq_phys_addr); 498 dma_free_coherent(&adapter->pdev->dev, rq_size, rq_addr, rq_phys_addr);
481 qlcnic_free_mbx_args(&cmd);
482 499
483 return err; 500 return err;
484} 501}
@@ -487,8 +504,11 @@ void qlcnic_82xx_fw_cmd_del_tx_ctx(struct qlcnic_adapter *adapter,
487 struct qlcnic_host_tx_ring *tx_ring) 504 struct qlcnic_host_tx_ring *tx_ring)
488{ 505{
489 struct qlcnic_cmd_args cmd; 506 struct qlcnic_cmd_args cmd;
507 int ret;
490 508
491 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX); 509 ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_DESTROY_TX_CTX);
510 if (ret)
511 return;
492 512
493 cmd.req.arg[1] = tx_ring->ctx_id; 513 cmd.req.arg[1] = tx_ring->ctx_id;
494 if (qlcnic_issue_cmd(adapter, &cmd)) 514 if (qlcnic_issue_cmd(adapter, &cmd))
@@ -503,7 +523,10 @@ qlcnic_fw_cmd_set_port(struct qlcnic_adapter *adapter, u32 config)
503 int err; 523 int err;
504 struct qlcnic_cmd_args cmd; 524 struct qlcnic_cmd_args cmd;
505 525
506 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_PORT); 526 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIG_PORT);
527 if (err)
528 return err;
529
507 cmd.req.arg[1] = config; 530 cmd.req.arg[1] = config;
508 err = qlcnic_issue_cmd(adapter, &cmd); 531 err = qlcnic_issue_cmd(adapter, &cmd);
509 qlcnic_free_mbx_args(&cmd); 532 qlcnic_free_mbx_args(&cmd);
@@ -707,7 +730,10 @@ int qlcnic_82xx_get_mac_address(struct qlcnic_adapter *adapter, u8 *mac)
707 struct qlcnic_cmd_args cmd; 730 struct qlcnic_cmd_args cmd;
708 u32 mac_low, mac_high; 731 u32 mac_low, mac_high;
709 732
710 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS); 733 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_MAC_ADDRESS);
734 if (err)
735 return err;
736
711 cmd.req.arg[1] = adapter->ahw->pci_func | BIT_8; 737 cmd.req.arg[1] = adapter->ahw->pci_func | BIT_8;
712 err = qlcnic_issue_cmd(adapter, &cmd); 738 err = qlcnic_issue_cmd(adapter, &cmd);
713 739
@@ -746,7 +772,10 @@ int qlcnic_82xx_get_nic_info(struct qlcnic_adapter *adapter,
746 772
747 nic_info = nic_info_addr; 773 nic_info = nic_info_addr;
748 774
749 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO); 775 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_NIC_INFO);
776 if (err)
777 goto out_free_dma;
778
750 cmd.req.arg[1] = MSD(nic_dma_t); 779 cmd.req.arg[1] = MSD(nic_dma_t);
751 cmd.req.arg[2] = LSD(nic_dma_t); 780 cmd.req.arg[2] = LSD(nic_dma_t);
752 cmd.req.arg[3] = (func_id << 16 | nic_size); 781 cmd.req.arg[3] = (func_id << 16 | nic_size);
@@ -768,9 +797,10 @@ int qlcnic_82xx_get_nic_info(struct qlcnic_adapter *adapter,
768 npar_info->max_mtu = le16_to_cpu(nic_info->max_mtu); 797 npar_info->max_mtu = le16_to_cpu(nic_info->max_mtu);
769 } 798 }
770 799
800 qlcnic_free_mbx_args(&cmd);
801out_free_dma:
771 dma_free_coherent(&adapter->pdev->dev, nic_size, nic_info_addr, 802 dma_free_coherent(&adapter->pdev->dev, nic_size, nic_info_addr,
772 nic_dma_t); 803 nic_dma_t);
773 qlcnic_free_mbx_args(&cmd);
774 804
775 return err; 805 return err;
776} 806}
@@ -807,7 +837,10 @@ int qlcnic_82xx_set_nic_info(struct qlcnic_adapter *adapter,
807 nic_info->min_tx_bw = cpu_to_le16(nic->min_tx_bw); 837 nic_info->min_tx_bw = cpu_to_le16(nic->min_tx_bw);
808 nic_info->max_tx_bw = cpu_to_le16(nic->max_tx_bw); 838 nic_info->max_tx_bw = cpu_to_le16(nic->max_tx_bw);
809 839
810 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO); 840 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_NIC_INFO);
841 if (err)
842 goto out_free_dma;
843
811 cmd.req.arg[1] = MSD(nic_dma_t); 844 cmd.req.arg[1] = MSD(nic_dma_t);
812 cmd.req.arg[2] = LSD(nic_dma_t); 845 cmd.req.arg[2] = LSD(nic_dma_t);
813 cmd.req.arg[3] = ((nic->pci_func << 16) | nic_size); 846 cmd.req.arg[3] = ((nic->pci_func << 16) | nic_size);
@@ -819,9 +852,10 @@ int qlcnic_82xx_set_nic_info(struct qlcnic_adapter *adapter,
819 err = -EIO; 852 err = -EIO;
820 } 853 }
821 854
822 dma_free_coherent(&adapter->pdev->dev, nic_size, nic_info_addr,
823 nic_dma_t);
824 qlcnic_free_mbx_args(&cmd); 855 qlcnic_free_mbx_args(&cmd);
856out_free_dma:
857 dma_free_coherent(&adapter->pdev->dev, nic_size, nic_info_addr,
858 nic_dma_t);
825 859
826 return err; 860 return err;
827} 861}
@@ -845,7 +879,10 @@ int qlcnic_82xx_get_pci_info(struct qlcnic_adapter *adapter,
845 return -ENOMEM; 879 return -ENOMEM;
846 880
847 npar = pci_info_addr; 881 npar = pci_info_addr;
848 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO); 882 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_PCI_INFO);
883 if (err)
884 goto out_free_dma;
885
849 cmd.req.arg[1] = MSD(pci_info_dma_t); 886 cmd.req.arg[1] = MSD(pci_info_dma_t);
850 cmd.req.arg[2] = LSD(pci_info_dma_t); 887 cmd.req.arg[2] = LSD(pci_info_dma_t);
851 cmd.req.arg[3] = pci_size; 888 cmd.req.arg[3] = pci_size;
@@ -873,20 +910,22 @@ int qlcnic_82xx_get_pci_info(struct qlcnic_adapter *adapter,
873 err = -EIO; 910 err = -EIO;
874 } 911 }
875 912
913 qlcnic_free_mbx_args(&cmd);
914out_free_dma:
876 dma_free_coherent(&adapter->pdev->dev, pci_size, pci_info_addr, 915 dma_free_coherent(&adapter->pdev->dev, pci_size, pci_info_addr,
877 pci_info_dma_t); 916 pci_info_dma_t);
878 qlcnic_free_mbx_args(&cmd);
879 917
880 return err; 918 return err;
881} 919}
882 920
883/* Configure eSwitch for port mirroring */ 921/* Configure eSwitch for port mirroring */
884int qlcnic_config_port_mirroring(struct qlcnic_adapter *adapter, u8 id, 922int qlcnic_config_port_mirroring(struct qlcnic_adapter *adapter, u8 id,
885 u8 enable_mirroring, u8 pci_func) 923 u8 enable_mirroring, u8 pci_func)
886{ 924{
925 struct device *dev = &adapter->pdev->dev;
926 struct qlcnic_cmd_args cmd;
887 int err = -EIO; 927 int err = -EIO;
888 u32 arg1; 928 u32 arg1;
889 struct qlcnic_cmd_args cmd;
890 929
891 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC || 930 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC ||
892 !(adapter->eswitch[id].flags & QLCNIC_SWITCH_ENABLE)) 931 !(adapter->eswitch[id].flags & QLCNIC_SWITCH_ENABLE))
@@ -895,18 +934,20 @@ int qlcnic_config_port_mirroring(struct qlcnic_adapter *adapter, u8 id,
895 arg1 = id | (enable_mirroring ? BIT_4 : 0); 934 arg1 = id | (enable_mirroring ? BIT_4 : 0);
896 arg1 |= pci_func << 8; 935 arg1 |= pci_func << 8;
897 936
898 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_SET_PORTMIRRORING); 937 err = qlcnic_alloc_mbx_args(&cmd, adapter,
938 QLCNIC_CMD_SET_PORTMIRRORING);
939 if (err)
940 return err;
941
899 cmd.req.arg[1] = arg1; 942 cmd.req.arg[1] = arg1;
900 err = qlcnic_issue_cmd(adapter, &cmd); 943 err = qlcnic_issue_cmd(adapter, &cmd);
901 944
902 if (err != QLCNIC_RCODE_SUCCESS) 945 if (err != QLCNIC_RCODE_SUCCESS)
903 dev_err(&adapter->pdev->dev, 946 dev_err(dev, "Failed to configure port mirroring for vNIC function %d on eSwitch %d\n",
904 "Failed to configure port mirroring%d on eswitch:%d\n",
905 pci_func, id); 947 pci_func, id);
906 else 948 else
907 dev_info(&adapter->pdev->dev, 949 dev_info(dev, "Configured port mirroring for vNIC function %d on eSwitch %d\n",
908 "Configured eSwitch %d for port mirroring:%d\n", 950 pci_func, id);
909 id, pci_func);
910 qlcnic_free_mbx_args(&cmd); 951 qlcnic_free_mbx_args(&cmd);
911 952
912 return err; 953 return err;
@@ -941,7 +982,11 @@ int qlcnic_get_port_stats(struct qlcnic_adapter *adapter, const u8 func,
941 arg1 = func | QLCNIC_STATS_VERSION << 8 | QLCNIC_STATS_PORT << 12; 982 arg1 = func | QLCNIC_STATS_VERSION << 8 | QLCNIC_STATS_PORT << 12;
942 arg1 |= rx_tx << 15 | stats_size << 16; 983 arg1 |= rx_tx << 15 | stats_size << 16;
943 984
944 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_ESWITCH_STATS); 985 err = qlcnic_alloc_mbx_args(&cmd, adapter,
986 QLCNIC_CMD_GET_ESWITCH_STATS);
987 if (err)
988 goto out_free_dma;
989
945 cmd.req.arg[1] = arg1; 990 cmd.req.arg[1] = arg1;
946 cmd.req.arg[2] = MSD(stats_dma_t); 991 cmd.req.arg[2] = MSD(stats_dma_t);
947 cmd.req.arg[3] = LSD(stats_dma_t); 992 cmd.req.arg[3] = LSD(stats_dma_t);
@@ -963,9 +1008,10 @@ int qlcnic_get_port_stats(struct qlcnic_adapter *adapter, const u8 func,
963 esw_stats->numbytes = le64_to_cpu(stats->numbytes); 1008 esw_stats->numbytes = le64_to_cpu(stats->numbytes);
964 } 1009 }
965 1010
966 dma_free_coherent(&adapter->pdev->dev, stats_size, stats_addr,
967 stats_dma_t);
968 qlcnic_free_mbx_args(&cmd); 1011 qlcnic_free_mbx_args(&cmd);
1012out_free_dma:
1013 dma_free_coherent(&adapter->pdev->dev, stats_size, stats_addr,
1014 stats_dma_t);
969 1015
970 return err; 1016 return err;
971} 1017}
@@ -989,7 +1035,10 @@ int qlcnic_get_mac_stats(struct qlcnic_adapter *adapter,
989 if (!stats_addr) 1035 if (!stats_addr)
990 return -ENOMEM; 1036 return -ENOMEM;
991 1037
992 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_MAC_STATS); 1038 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_MAC_STATS);
1039 if (err)
1040 goto out_free_dma;
1041
993 cmd.req.arg[1] = stats_size << 16; 1042 cmd.req.arg[1] = stats_size << 16;
994 cmd.req.arg[2] = MSD(stats_dma_t); 1043 cmd.req.arg[2] = MSD(stats_dma_t);
995 cmd.req.arg[3] = LSD(stats_dma_t); 1044 cmd.req.arg[3] = LSD(stats_dma_t);
@@ -1020,11 +1069,12 @@ int qlcnic_get_mac_stats(struct qlcnic_adapter *adapter,
1020 "%s: Get mac stats failed, err=%d.\n", __func__, err); 1069 "%s: Get mac stats failed, err=%d.\n", __func__, err);
1021 } 1070 }
1022 1071
1023 dma_free_coherent(&adapter->pdev->dev, stats_size, stats_addr,
1024 stats_dma_t);
1025
1026 qlcnic_free_mbx_args(&cmd); 1072 qlcnic_free_mbx_args(&cmd);
1027 1073
1074out_free_dma:
1075 dma_free_coherent(&adapter->pdev->dev, stats_size, stats_addr,
1076 stats_dma_t);
1077
1028 return err; 1078 return err;
1029} 1079}
1030 1080
@@ -1108,7 +1158,11 @@ int qlcnic_clear_esw_stats(struct qlcnic_adapter *adapter, const u8 func_esw,
1108 arg1 = port | QLCNIC_STATS_VERSION << 8 | func_esw << 12; 1158 arg1 = port | QLCNIC_STATS_VERSION << 8 | func_esw << 12;
1109 arg1 |= BIT_14 | rx_tx << 15; 1159 arg1 |= BIT_14 | rx_tx << 15;
1110 1160
1111 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_ESWITCH_STATS); 1161 err = qlcnic_alloc_mbx_args(&cmd, adapter,
1162 QLCNIC_CMD_GET_ESWITCH_STATS);
1163 if (err)
1164 return err;
1165
1112 cmd.req.arg[1] = arg1; 1166 cmd.req.arg[1] = arg1;
1113 err = qlcnic_issue_cmd(adapter, &cmd); 1167 err = qlcnic_issue_cmd(adapter, &cmd);
1114 qlcnic_free_mbx_args(&cmd); 1168 qlcnic_free_mbx_args(&cmd);
@@ -1121,17 +1175,19 @@ err_ret:
1121 return -EIO; 1175 return -EIO;
1122} 1176}
1123 1177
1124static int 1178static int __qlcnic_get_eswitch_port_config(struct qlcnic_adapter *adapter,
1125__qlcnic_get_eswitch_port_config(struct qlcnic_adapter *adapter, 1179 u32 *arg1, u32 *arg2)
1126 u32 *arg1, u32 *arg2)
1127{ 1180{
1128 int err = -EIO; 1181 struct device *dev = &adapter->pdev->dev;
1129 struct qlcnic_cmd_args cmd; 1182 struct qlcnic_cmd_args cmd;
1130 u8 pci_func; 1183 u8 pci_func = *arg1 >> 8;
1131 pci_func = (*arg1 >> 8); 1184 int err;
1185
1186 err = qlcnic_alloc_mbx_args(&cmd, adapter,
1187 QLCNIC_CMD_GET_ESWITCH_PORT_CONFIG);
1188 if (err)
1189 return err;
1132 1190
1133 qlcnic_alloc_mbx_args(&cmd, adapter,
1134 QLCNIC_CMD_GET_ESWITCH_PORT_CONFIG);
1135 cmd.req.arg[1] = *arg1; 1191 cmd.req.arg[1] = *arg1;
1136 err = qlcnic_issue_cmd(adapter, &cmd); 1192 err = qlcnic_issue_cmd(adapter, &cmd);
1137 *arg1 = cmd.rsp.arg[1]; 1193 *arg1 = cmd.rsp.arg[1];
@@ -1139,12 +1195,11 @@ __qlcnic_get_eswitch_port_config(struct qlcnic_adapter *adapter,
1139 qlcnic_free_mbx_args(&cmd); 1195 qlcnic_free_mbx_args(&cmd);
1140 1196
1141 if (err == QLCNIC_RCODE_SUCCESS) 1197 if (err == QLCNIC_RCODE_SUCCESS)
1142 dev_info(&adapter->pdev->dev, 1198 dev_info(dev, "Get eSwitch port config for vNIC function %d\n",
1143 "eSwitch port config for pci func %d\n", pci_func); 1199 pci_func);
1144 else 1200 else
1145 dev_err(&adapter->pdev->dev, 1201 dev_err(dev, "Failed to get eswitch port config for vNIC function %d\n",
1146 "Failed to get eswitch port config for pci func %d\n", 1202 pci_func);
1147 pci_func);
1148 return err; 1203 return err;
1149} 1204}
1150/* Configure eSwitch port 1205/* Configure eSwitch port
@@ -1157,9 +1212,10 @@ op_type = 1 for port vlan_id
1157int qlcnic_config_switch_port(struct qlcnic_adapter *adapter, 1212int qlcnic_config_switch_port(struct qlcnic_adapter *adapter,
1158 struct qlcnic_esw_func_cfg *esw_cfg) 1213 struct qlcnic_esw_func_cfg *esw_cfg)
1159{ 1214{
1215 struct device *dev = &adapter->pdev->dev;
1216 struct qlcnic_cmd_args cmd;
1160 int err = -EIO, index; 1217 int err = -EIO, index;
1161 u32 arg1, arg2 = 0; 1218 u32 arg1, arg2 = 0;
1162 struct qlcnic_cmd_args cmd;
1163 u8 pci_func; 1219 u8 pci_func;
1164 1220
1165 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC) 1221 if (adapter->ahw->op_mode != QLCNIC_MGMT_FUNC)
@@ -1209,18 +1265,22 @@ int qlcnic_config_switch_port(struct qlcnic_adapter *adapter,
1209 return err; 1265 return err;
1210 } 1266 }
1211 1267
1212 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_CONFIGURE_ESWITCH); 1268 err = qlcnic_alloc_mbx_args(&cmd, adapter,
1269 QLCNIC_CMD_CONFIGURE_ESWITCH);
1270 if (err)
1271 return err;
1272
1213 cmd.req.arg[1] = arg1; 1273 cmd.req.arg[1] = arg1;
1214 cmd.req.arg[2] = arg2; 1274 cmd.req.arg[2] = arg2;
1215 err = qlcnic_issue_cmd(adapter, &cmd); 1275 err = qlcnic_issue_cmd(adapter, &cmd);
1216 qlcnic_free_mbx_args(&cmd); 1276 qlcnic_free_mbx_args(&cmd);
1217 1277
1218 if (err != QLCNIC_RCODE_SUCCESS) 1278 if (err != QLCNIC_RCODE_SUCCESS)
1219 dev_err(&adapter->pdev->dev, 1279 dev_err(dev, "Failed to configure eswitch for vNIC function %d\n",
1220 "Failed to configure eswitch pci func %d\n", pci_func); 1280 pci_func);
1221 else 1281 else
1222 dev_info(&adapter->pdev->dev, 1282 dev_info(dev, "Configured eSwitch for vNIC function %d\n",
1223 "Configured eSwitch for pci func %d\n", pci_func); 1283 pci_func);
1224 1284
1225 return err; 1285 return err;
1226} 1286}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index f67652de5a63..700a46324d09 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -846,7 +846,9 @@ static int qlcnic_irq_test(struct net_device *netdev)
846 goto clear_diag_irq; 846 goto clear_diag_irq;
847 847
848 ahw->diag_cnt = 0; 848 ahw->diag_cnt = 0;
849 qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST); 849 ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST);
850 if (ret)
851 goto free_diag_res;
850 852
851 cmd.req.arg[1] = ahw->pci_func; 853 cmd.req.arg[1] = ahw->pci_func;
852 ret = qlcnic_issue_cmd(adapter, &cmd); 854 ret = qlcnic_issue_cmd(adapter, &cmd);
@@ -858,6 +860,8 @@ static int qlcnic_irq_test(struct net_device *netdev)
858 860
859done: 861done:
860 qlcnic_free_mbx_args(&cmd); 862 qlcnic_free_mbx_args(&cmd);
863
864free_diag_res:
861 qlcnic_diag_free_res(netdev, max_sds_rings); 865 qlcnic_diag_free_res(netdev, max_sds_rings);
862 866
863clear_diag_irq: 867clear_diag_irq:
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h
index c0f0c0d0a790..d262211b03b3 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hdr.h
@@ -672,6 +672,7 @@ enum {
672#define QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT 10 672#define QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT 10
673 673
674#define QLCNIC_MAX_MC_COUNT 38 674#define QLCNIC_MAX_MC_COUNT 38
675#define QLCNIC_MAX_UC_COUNT 512
675#define QLCNIC_WATCHDOG_TIMEOUTVALUE 5 676#define QLCNIC_WATCHDOG_TIMEOUTVALUE 5
676 677
677#define ISR_MSI_INT_TRIGGER(FUNC) (QLCNIC_PCIX_PS_REG(PCIX_MSI_F(FUNC))) 678#define ISR_MSI_INT_TRIGGER(FUNC) (QLCNIC_PCIX_PS_REG(PCIX_MSI_F(FUNC)))
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
index 106a12f2a02f..5b5d2edf125d 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
@@ -499,6 +499,7 @@ int qlcnic_nic_add_mac(struct qlcnic_adapter *adapter, const u8 *addr, u16 vlan)
499void __qlcnic_set_multi(struct net_device *netdev, u16 vlan) 499void __qlcnic_set_multi(struct net_device *netdev, u16 vlan)
500{ 500{
501 struct qlcnic_adapter *adapter = netdev_priv(netdev); 501 struct qlcnic_adapter *adapter = netdev_priv(netdev);
502 struct qlcnic_hardware_context *ahw = adapter->ahw;
502 struct netdev_hw_addr *ha; 503 struct netdev_hw_addr *ha;
503 static const u8 bcast_addr[ETH_ALEN] = { 504 static const u8 bcast_addr[ETH_ALEN] = {
504 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 505 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
@@ -515,25 +516,30 @@ void __qlcnic_set_multi(struct net_device *netdev, u16 vlan)
515 if (netdev->flags & IFF_PROMISC) { 516 if (netdev->flags & IFF_PROMISC) {
516 if (!(adapter->flags & QLCNIC_PROMISC_DISABLED)) 517 if (!(adapter->flags & QLCNIC_PROMISC_DISABLED))
517 mode = VPORT_MISS_MODE_ACCEPT_ALL; 518 mode = VPORT_MISS_MODE_ACCEPT_ALL;
518 goto send_fw_cmd; 519 } else if (netdev->flags & IFF_ALLMULTI) {
519 } 520 if (netdev_mc_count(netdev) > ahw->max_mc_count) {
520 521 mode = VPORT_MISS_MODE_ACCEPT_MULTI;
521 if ((netdev->flags & IFF_ALLMULTI) || 522 } else if (!netdev_mc_empty(netdev) &&
522 (netdev_mc_count(netdev) > adapter->ahw->max_mc_count)) { 523 !qlcnic_sriov_vf_check(adapter)) {
523 mode = VPORT_MISS_MODE_ACCEPT_MULTI; 524 netdev_for_each_mc_addr(ha, netdev)
524 goto send_fw_cmd; 525 qlcnic_nic_add_mac(adapter, ha->addr,
526 vlan);
527 }
528 if (mode != VPORT_MISS_MODE_ACCEPT_MULTI &&
529 qlcnic_sriov_vf_check(adapter))
530 qlcnic_vf_add_mc_list(netdev, vlan);
525 } 531 }
526 532
527 if (!netdev_mc_empty(netdev) && !qlcnic_sriov_vf_check(adapter)) { 533 /* configure unicast MAC address, if there is not sufficient space
528 netdev_for_each_mc_addr(ha, netdev) { 534 * to store all the unicast addresses then enable promiscuous mode
535 */
536 if (netdev_uc_count(netdev) > ahw->max_uc_count) {
537 mode = VPORT_MISS_MODE_ACCEPT_ALL;
538 } else if (!netdev_uc_empty(netdev)) {
539 netdev_for_each_uc_addr(ha, netdev)
529 qlcnic_nic_add_mac(adapter, ha->addr, vlan); 540 qlcnic_nic_add_mac(adapter, ha->addr, vlan);
530 }
531 } 541 }
532 542
533 if (qlcnic_sriov_vf_check(adapter))
534 qlcnic_vf_add_mc_list(netdev, vlan);
535
536send_fw_cmd:
537 if (!qlcnic_sriov_vf_check(adapter)) { 543 if (!qlcnic_sriov_vf_check(adapter)) {
538 if (mode == VPORT_MISS_MODE_ACCEPT_ALL && 544 if (mode == VPORT_MISS_MODE_ACCEPT_ALL &&
539 !adapter->fdb_mac_learn) { 545 !adapter->fdb_mac_learn) {
@@ -780,7 +786,8 @@ int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int enable)
780 word = 0; 786 word = 0;
781 if (enable) { 787 if (enable) {
782 word = QLCNIC_ENABLE_IPV4_LRO | QLCNIC_NO_DEST_IPV4_CHECK; 788 word = QLCNIC_ENABLE_IPV4_LRO | QLCNIC_NO_DEST_IPV4_CHECK;
783 if (adapter->ahw->capabilities2 & QLCNIC_FW_CAP2_HW_LRO_IPV6) 789 if (adapter->ahw->extra_capability[0] &
790 QLCNIC_FW_CAP2_HW_LRO_IPV6)
784 word |= QLCNIC_ENABLE_IPV6_LRO | 791 word |= QLCNIC_ENABLE_IPV6_LRO |
785 QLCNIC_NO_DEST_IPV6_CHECK; 792 QLCNIC_NO_DEST_IPV6_CHECK;
786 } 793 }
@@ -1503,6 +1510,21 @@ int qlcnic_82xx_config_led(struct qlcnic_adapter *adapter, u32 state, u32 rate)
1503 return rv; 1510 return rv;
1504} 1511}
1505 1512
1513int qlcnic_get_beacon_state(struct qlcnic_adapter *adapter, u8 *h_state)
1514{
1515 struct qlcnic_cmd_args cmd;
1516 int err;
1517
1518 err = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_GET_LED_STATUS);
1519 if (!err) {
1520 err = qlcnic_issue_cmd(adapter, &cmd);
1521 if (!err)
1522 *h_state = cmd.rsp.arg[1];
1523 }
1524 qlcnic_free_mbx_args(&cmd);
1525 return err;
1526}
1527
1506void qlcnic_82xx_get_func_no(struct qlcnic_adapter *adapter) 1528void qlcnic_82xx_get_func_no(struct qlcnic_adapter *adapter)
1507{ 1529{
1508 void __iomem *msix_base_addr; 1530 void __iomem *msix_base_addr;
@@ -1555,3 +1577,54 @@ void qlcnic_82xx_api_unlock(struct qlcnic_adapter *adapter)
1555{ 1577{
1556 qlcnic_pcie_sem_unlock(adapter, 5); 1578 qlcnic_pcie_sem_unlock(adapter, 5);
1557} 1579}
1580
1581int qlcnic_82xx_shutdown(struct pci_dev *pdev)
1582{
1583 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
1584 struct net_device *netdev = adapter->netdev;
1585 int retval;
1586
1587 netif_device_detach(netdev);
1588
1589 qlcnic_cancel_idc_work(adapter);
1590
1591 if (netif_running(netdev))
1592 qlcnic_down(adapter, netdev);
1593
1594 qlcnic_clr_all_drv_state(adapter, 0);
1595
1596 clear_bit(__QLCNIC_RESETTING, &adapter->state);
1597
1598 retval = pci_save_state(pdev);
1599 if (retval)
1600 return retval;
1601
1602 if (qlcnic_wol_supported(adapter)) {
1603 pci_enable_wake(pdev, PCI_D3cold, 1);
1604 pci_enable_wake(pdev, PCI_D3hot, 1);
1605 }
1606
1607 return 0;
1608}
1609
1610int qlcnic_82xx_resume(struct qlcnic_adapter *adapter)
1611{
1612 struct net_device *netdev = adapter->netdev;
1613 int err;
1614
1615 err = qlcnic_start_firmware(adapter);
1616 if (err) {
1617 dev_err(&adapter->pdev->dev, "failed to start firmware\n");
1618 return err;
1619 }
1620
1621 if (netif_running(netdev)) {
1622 err = qlcnic_up(adapter, netdev);
1623 if (!err)
1624 qlcnic_restore_indev_addr(netdev, NETDEV_UP);
1625 }
1626
1627 netif_device_attach(netdev);
1628 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY);
1629 return err;
1630}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
index b6818f4356b9..2c22504f57aa 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
@@ -86,7 +86,8 @@ enum qlcnic_regs {
86#define QLCNIC_CMD_BC_EVENT_SETUP 0x31 86#define QLCNIC_CMD_BC_EVENT_SETUP 0x31
87#define QLCNIC_CMD_CONFIG_VPORT 0x32 87#define QLCNIC_CMD_CONFIG_VPORT 0x32
88#define QLCNIC_CMD_GET_MAC_STATS 0x37 88#define QLCNIC_CMD_GET_MAC_STATS 0x37
89#define QLCNIC_CMD_SET_DRV_VER 0x38 89#define QLCNIC_CMD_82XX_SET_DRV_VER 0x38
90#define QLCNIC_CMD_GET_LED_STATUS 0x3C
90#define QLCNIC_CMD_CONFIGURE_RSS 0x41 91#define QLCNIC_CMD_CONFIGURE_RSS 0x41
91#define QLCNIC_CMD_CONFIG_INTR_COAL 0x43 92#define QLCNIC_CMD_CONFIG_INTR_COAL 0x43
92#define QLCNIC_CMD_CONFIGURE_LED 0x44 93#define QLCNIC_CMD_CONFIGURE_LED 0x44
@@ -102,6 +103,7 @@ enum qlcnic_regs {
102#define QLCNIC_CMD_GET_LINK_STATUS 0x68 103#define QLCNIC_CMD_GET_LINK_STATUS 0x68
103#define QLCNIC_CMD_SET_LED_CONFIG 0x69 104#define QLCNIC_CMD_SET_LED_CONFIG 0x69
104#define QLCNIC_CMD_GET_LED_CONFIG 0x6A 105#define QLCNIC_CMD_GET_LED_CONFIG 0x6A
106#define QLCNIC_CMD_83XX_SET_DRV_VER 0x6F
105#define QLCNIC_CMD_ADD_RCV_RINGS 0x0B 107#define QLCNIC_CMD_ADD_RCV_RINGS 0x0B
106 108
107#define QLCNIC_INTRPT_INTX 1 109#define QLCNIC_INTRPT_INTX 1
@@ -197,4 +199,8 @@ void qlcnic_82xx_api_unlock(struct qlcnic_adapter *);
197void qlcnic_82xx_napi_enable(struct qlcnic_adapter *); 199void qlcnic_82xx_napi_enable(struct qlcnic_adapter *);
198void qlcnic_82xx_napi_disable(struct qlcnic_adapter *); 200void qlcnic_82xx_napi_disable(struct qlcnic_adapter *);
199void qlcnic_82xx_napi_del(struct qlcnic_adapter *); 201void qlcnic_82xx_napi_del(struct qlcnic_adapter *);
202int qlcnic_82xx_shutdown(struct pci_dev *);
203int qlcnic_82xx_resume(struct qlcnic_adapter *);
204void qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8 failed);
205void qlcnic_fw_poll_work(struct work_struct *work);
200#endif /* __QLCNIC_HW_H_ */ 206#endif /* __QLCNIC_HW_H_ */
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index aeb26a850679..4528f8ec333b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -52,10 +52,6 @@ int qlcnic_load_fw_file;
52MODULE_PARM_DESC(load_fw_file, "Load firmware from (0=flash, 1=file)"); 52MODULE_PARM_DESC(load_fw_file, "Load firmware from (0=flash, 1=file)");
53module_param_named(load_fw_file, qlcnic_load_fw_file, int, 0444); 53module_param_named(load_fw_file, qlcnic_load_fw_file, int, 0444);
54 54
55int qlcnic_config_npars;
56module_param(qlcnic_config_npars, int, 0444);
57MODULE_PARM_DESC(qlcnic_config_npars, "Configure NPARs (0=disabled, 1=enabled)");
58
59static int qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent); 55static int qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
60static void qlcnic_remove(struct pci_dev *pdev); 56static void qlcnic_remove(struct pci_dev *pdev);
61static int qlcnic_open(struct net_device *netdev); 57static int qlcnic_open(struct net_device *netdev);
@@ -63,13 +59,11 @@ static int qlcnic_close(struct net_device *netdev);
63static void qlcnic_tx_timeout(struct net_device *netdev); 59static void qlcnic_tx_timeout(struct net_device *netdev);
64static void qlcnic_attach_work(struct work_struct *work); 60static void qlcnic_attach_work(struct work_struct *work);
65static void qlcnic_fwinit_work(struct work_struct *work); 61static void qlcnic_fwinit_work(struct work_struct *work);
66static void qlcnic_fw_poll_work(struct work_struct *work);
67#ifdef CONFIG_NET_POLL_CONTROLLER 62#ifdef CONFIG_NET_POLL_CONTROLLER
68static void qlcnic_poll_controller(struct net_device *netdev); 63static void qlcnic_poll_controller(struct net_device *netdev);
69#endif 64#endif
70 65
71static void qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding); 66static void qlcnic_idc_debug_info(struct qlcnic_adapter *adapter, u8 encoding);
72static void qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8);
73static int qlcnic_can_start_firmware(struct qlcnic_adapter *adapter); 67static int qlcnic_can_start_firmware(struct qlcnic_adapter *adapter);
74 68
75static irqreturn_t qlcnic_tmp_intr(int irq, void *data); 69static irqreturn_t qlcnic_tmp_intr(int irq, void *data);
@@ -364,12 +358,15 @@ static int qlcnic_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
364 return ndo_dflt_fdb_del(ndm, tb, netdev, addr); 358 return ndo_dflt_fdb_del(ndm, tb, netdev, addr);
365 359
366 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) { 360 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) {
367 if (is_unicast_ether_addr(addr)) 361 if (is_unicast_ether_addr(addr)) {
368 err = qlcnic_nic_del_mac(adapter, addr); 362 err = dev_uc_del(netdev, addr);
369 else if (is_multicast_ether_addr(addr)) 363 if (!err)
364 err = qlcnic_nic_del_mac(adapter, addr);
365 } else if (is_multicast_ether_addr(addr)) {
370 err = dev_mc_del(netdev, addr); 366 err = dev_mc_del(netdev, addr);
371 else 367 } else {
372 err = -EINVAL; 368 err = -EINVAL;
369 }
373 } 370 }
374 return err; 371 return err;
375} 372}
@@ -392,12 +389,16 @@ static int qlcnic_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
392 if (ether_addr_equal(addr, adapter->mac_addr)) 389 if (ether_addr_equal(addr, adapter->mac_addr))
393 return err; 390 return err;
394 391
395 if (is_unicast_ether_addr(addr)) 392 if (is_unicast_ether_addr(addr)) {
396 err = qlcnic_nic_add_mac(adapter, addr, 0); 393 if (netdev_uc_count(netdev) < adapter->ahw->max_uc_count)
397 else if (is_multicast_ether_addr(addr)) 394 err = dev_uc_add_excl(netdev, addr);
395 else
396 err = -ENOMEM;
397 } else if (is_multicast_ether_addr(addr)) {
398 err = dev_mc_add_excl(netdev, addr); 398 err = dev_mc_add_excl(netdev, addr);
399 else 399 } else {
400 err = -EINVAL; 400 err = -EINVAL;
401 }
401 402
402 return err; 403 return err;
403} 404}
@@ -449,6 +450,7 @@ static const struct net_device_ops qlcnic_netdev_ops = {
449 .ndo_set_vf_tx_rate = qlcnic_sriov_set_vf_tx_rate, 450 .ndo_set_vf_tx_rate = qlcnic_sriov_set_vf_tx_rate,
450 .ndo_get_vf_config = qlcnic_sriov_get_vf_config, 451 .ndo_get_vf_config = qlcnic_sriov_get_vf_config,
451 .ndo_set_vf_vlan = qlcnic_sriov_set_vf_vlan, 452 .ndo_set_vf_vlan = qlcnic_sriov_set_vf_vlan,
453 .ndo_set_vf_spoofchk = qlcnic_sriov_set_vf_spoofchk,
452#endif 454#endif
453}; 455};
454 456
@@ -465,6 +467,8 @@ static struct qlcnic_nic_template qlcnic_ops = {
465 .napi_add = qlcnic_82xx_napi_add, 467 .napi_add = qlcnic_82xx_napi_add,
466 .napi_del = qlcnic_82xx_napi_del, 468 .napi_del = qlcnic_82xx_napi_del,
467 .config_ipaddr = qlcnic_82xx_config_ipaddr, 469 .config_ipaddr = qlcnic_82xx_config_ipaddr,
470 .shutdown = qlcnic_82xx_shutdown,
471 .resume = qlcnic_82xx_resume,
468 .clear_legacy_intr = qlcnic_82xx_clear_legacy_intr, 472 .clear_legacy_intr = qlcnic_82xx_clear_legacy_intr,
469}; 473};
470 474
@@ -508,6 +512,7 @@ static struct qlcnic_hardware_ops qlcnic_hw_ops = {
508 .config_promisc_mode = qlcnic_82xx_nic_set_promisc, 512 .config_promisc_mode = qlcnic_82xx_nic_set_promisc,
509 .change_l2_filter = qlcnic_82xx_change_filter, 513 .change_l2_filter = qlcnic_82xx_change_filter,
510 .get_board_info = qlcnic_82xx_get_board_info, 514 .get_board_info = qlcnic_82xx_get_board_info,
515 .set_mac_filter_count = qlcnic_82xx_set_mac_filter_count,
511 .free_mac_list = qlcnic_82xx_free_mac_list, 516 .free_mac_list = qlcnic_82xx_free_mac_list,
512}; 517};
513 518
@@ -768,7 +773,7 @@ static int
768qlcnic_set_function_modes(struct qlcnic_adapter *adapter) 773qlcnic_set_function_modes(struct qlcnic_adapter *adapter)
769{ 774{
770 u8 id; 775 u8 id;
771 int i, ret = 1; 776 int ret;
772 u32 data = QLCNIC_MGMT_FUNC; 777 u32 data = QLCNIC_MGMT_FUNC;
773 struct qlcnic_hardware_context *ahw = adapter->ahw; 778 struct qlcnic_hardware_context *ahw = adapter->ahw;
774 779
@@ -776,20 +781,10 @@ qlcnic_set_function_modes(struct qlcnic_adapter *adapter)
776 if (ret) 781 if (ret)
777 goto err_lock; 782 goto err_lock;
778 783
779 if (qlcnic_config_npars) { 784 id = ahw->pci_func;
780 for (i = 0; i < ahw->act_pci_func; i++) { 785 data = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE);
781 id = adapter->npars[i].pci_func; 786 data = (data & ~QLC_DEV_SET_DRV(0xf, id)) |
782 if (id == ahw->pci_func) 787 QLC_DEV_SET_DRV(QLCNIC_MGMT_FUNC, id);
783 continue;
784 data |= (qlcnic_config_npars &
785 QLC_DEV_SET_DRV(0xf, id));
786 }
787 } else {
788 data = QLC_SHARED_REG_RD32(adapter, QLCNIC_DRV_OP_MODE);
789 data = (data & ~QLC_DEV_SET_DRV(0xf, ahw->pci_func)) |
790 (QLC_DEV_SET_DRV(QLCNIC_MGMT_FUNC,
791 ahw->pci_func));
792 }
793 QLC_SHARED_REG_WR32(adapter, QLCNIC_DRV_OP_MODE, data); 788 QLC_SHARED_REG_WR32(adapter, QLCNIC_DRV_OP_MODE, data);
794 qlcnic_api_unlock(adapter); 789 qlcnic_api_unlock(adapter);
795err_lock: 790err_lock:
@@ -875,6 +870,27 @@ static int qlcnic_setup_pci_map(struct pci_dev *pdev,
875 return 0; 870 return 0;
876} 871}
877 872
873static inline bool qlcnic_validate_subsystem_id(struct qlcnic_adapter *adapter,
874 int index)
875{
876 struct pci_dev *pdev = adapter->pdev;
877 unsigned short subsystem_vendor;
878 bool ret = true;
879
880 subsystem_vendor = pdev->subsystem_vendor;
881
882 if (pdev->device == PCI_DEVICE_ID_QLOGIC_QLE824X ||
883 pdev->device == PCI_DEVICE_ID_QLOGIC_QLE834X) {
884 if (qlcnic_boards[index].sub_vendor == subsystem_vendor &&
885 qlcnic_boards[index].sub_device == pdev->subsystem_device)
886 ret = true;
887 else
888 ret = false;
889 }
890
891 return ret;
892}
893
878static void qlcnic_get_board_name(struct qlcnic_adapter *adapter, char *name) 894static void qlcnic_get_board_name(struct qlcnic_adapter *adapter, char *name)
879{ 895{
880 struct pci_dev *pdev = adapter->pdev; 896 struct pci_dev *pdev = adapter->pdev;
@@ -882,20 +898,18 @@ static void qlcnic_get_board_name(struct qlcnic_adapter *adapter, char *name)
882 898
883 for (i = 0; i < NUM_SUPPORTED_BOARDS; ++i) { 899 for (i = 0; i < NUM_SUPPORTED_BOARDS; ++i) {
884 if (qlcnic_boards[i].vendor == pdev->vendor && 900 if (qlcnic_boards[i].vendor == pdev->vendor &&
885 qlcnic_boards[i].device == pdev->device && 901 qlcnic_boards[i].device == pdev->device &&
886 qlcnic_boards[i].sub_vendor == pdev->subsystem_vendor && 902 qlcnic_validate_subsystem_id(adapter, i)) {
887 qlcnic_boards[i].sub_device == pdev->subsystem_device) { 903 found = 1;
888 sprintf(name, "%pM: %s" , 904 break;
889 adapter->mac_addr,
890 qlcnic_boards[i].short_name);
891 found = 1;
892 break;
893 } 905 }
894
895 } 906 }
896 907
897 if (!found) 908 if (!found)
898 sprintf(name, "%pM Gigabit Ethernet", adapter->mac_addr); 909 sprintf(name, "%pM Gigabit Ethernet", adapter->mac_addr);
910 else
911 sprintf(name, "%pM: %s" , adapter->mac_addr,
912 qlcnic_boards[i].short_name);
899} 913}
900 914
901static void 915static void
@@ -980,7 +994,7 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
980 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { 994 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
981 u32 temp; 995 u32 temp;
982 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2); 996 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2);
983 adapter->ahw->capabilities2 = temp; 997 adapter->ahw->extra_capability[0] = temp;
984 } 998 }
985 adapter->ahw->max_mac_filters = nic_info.max_mac_filters; 999 adapter->ahw->max_mac_filters = nic_info.max_mac_filters;
986 adapter->ahw->max_mtu = nic_info.max_mtu; 1000 adapter->ahw->max_mtu = nic_info.max_mtu;
@@ -1395,16 +1409,23 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
1395 for (ring = 0; ring < num_sds_rings; ring++) { 1409 for (ring = 0; ring < num_sds_rings; ring++) {
1396 sds_ring = &recv_ctx->sds_rings[ring]; 1410 sds_ring = &recv_ctx->sds_rings[ring];
1397 if (qlcnic_82xx_check(adapter) && 1411 if (qlcnic_82xx_check(adapter) &&
1398 (ring == (num_sds_rings - 1))) 1412 (ring == (num_sds_rings - 1))) {
1399 snprintf(sds_ring->name, 1413 if (!(adapter->flags &
1400 sizeof(sds_ring->name), 1414 QLCNIC_MSIX_ENABLED))
1401 "qlcnic-%s[Tx0+Rx%d]", 1415 snprintf(sds_ring->name,
1402 netdev->name, ring); 1416 sizeof(sds_ring->name),
1403 else 1417 "qlcnic");
1418 else
1419 snprintf(sds_ring->name,
1420 sizeof(sds_ring->name),
1421 "%s-tx-0-rx-%d",
1422 netdev->name, ring);
1423 } else {
1404 snprintf(sds_ring->name, 1424 snprintf(sds_ring->name,
1405 sizeof(sds_ring->name), 1425 sizeof(sds_ring->name),
1406 "qlcnic-%s[Rx%d]", 1426 "%s-rx-%d",
1407 netdev->name, ring); 1427 netdev->name, ring);
1428 }
1408 err = request_irq(sds_ring->irq, handler, flags, 1429 err = request_irq(sds_ring->irq, handler, flags,
1409 sds_ring->name, sds_ring); 1430 sds_ring->name, sds_ring);
1410 if (err) 1431 if (err)
@@ -1419,7 +1440,7 @@ qlcnic_request_irq(struct qlcnic_adapter *adapter)
1419 ring++) { 1440 ring++) {
1420 tx_ring = &adapter->tx_ring[ring]; 1441 tx_ring = &adapter->tx_ring[ring];
1421 snprintf(tx_ring->name, sizeof(tx_ring->name), 1442 snprintf(tx_ring->name, sizeof(tx_ring->name),
1422 "qlcnic-%s[Tx%d]", netdev->name, ring); 1443 "%s-tx-%d", netdev->name, ring);
1423 err = request_irq(tx_ring->irq, handler, flags, 1444 err = request_irq(tx_ring->irq, handler, flags,
1424 tx_ring->name, tx_ring); 1445 tx_ring->name, tx_ring);
1425 if (err) 1446 if (err)
@@ -1465,7 +1486,7 @@ static void qlcnic_get_lro_mss_capability(struct qlcnic_adapter *adapter)
1465 u32 capab = 0; 1486 u32 capab = 0;
1466 1487
1467 if (qlcnic_82xx_check(adapter)) { 1488 if (qlcnic_82xx_check(adapter)) {
1468 if (adapter->ahw->capabilities2 & 1489 if (adapter->ahw->extra_capability[0] &
1469 QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG) 1490 QLCNIC_FW_CAPABILITY_2_LRO_MAX_TCP_SEG)
1470 adapter->flags |= QLCNIC_FW_LRO_MSS_CAP; 1491 adapter->flags |= QLCNIC_FW_LRO_MSS_CAP;
1471 } else { 1492 } else {
@@ -1816,6 +1837,22 @@ qlcnic_reset_context(struct qlcnic_adapter *adapter)
1816 return err; 1837 return err;
1817} 1838}
1818 1839
1840void qlcnic_82xx_set_mac_filter_count(struct qlcnic_adapter *adapter)
1841{
1842 struct qlcnic_hardware_context *ahw = adapter->ahw;
1843 u16 act_pci_fn = ahw->act_pci_func;
1844 u16 count;
1845
1846 ahw->max_mc_count = QLCNIC_MAX_MC_COUNT;
1847 if (act_pci_fn <= 2)
1848 count = (QLCNIC_MAX_UC_COUNT - QLCNIC_MAX_MC_COUNT) /
1849 act_pci_fn;
1850 else
1851 count = (QLCNIC_LB_MAX_FILTERS - QLCNIC_MAX_MC_COUNT) /
1852 act_pci_fn;
1853 ahw->max_uc_count = count;
1854}
1855
1819int 1856int
1820qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev, 1857qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev,
1821 int pci_using_dac) 1858 int pci_using_dac)
@@ -1825,7 +1862,7 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev,
1825 1862
1826 adapter->rx_csum = 1; 1863 adapter->rx_csum = 1;
1827 adapter->ahw->mc_enabled = 0; 1864 adapter->ahw->mc_enabled = 0;
1828 adapter->ahw->max_mc_count = QLCNIC_MAX_MC_COUNT; 1865 qlcnic_set_mac_filter_count(adapter);
1829 1866
1830 netdev->netdev_ops = &qlcnic_netdev_ops; 1867 netdev->netdev_ops = &qlcnic_netdev_ops;
1831 netdev->watchdog_timeo = QLCNIC_WATCHDOG_TIMEOUTVALUE * HZ; 1868 netdev->watchdog_timeo = QLCNIC_WATCHDOG_TIMEOUTVALUE * HZ;
@@ -1863,6 +1900,7 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter, struct net_device *netdev,
1863 netdev->features |= NETIF_F_LRO; 1900 netdev->features |= NETIF_F_LRO;
1864 1901
1865 netdev->hw_features = netdev->features; 1902 netdev->hw_features = netdev->features;
1903 netdev->priv_flags |= IFF_UNICAST_FLT;
1866 netdev->irq = adapter->msix_entries[0].vector; 1904 netdev->irq = adapter->msix_entries[0].vector;
1867 1905
1868 err = register_netdev(netdev); 1906 err = register_netdev(netdev);
@@ -1947,6 +1985,21 @@ int qlcnic_alloc_tx_rings(struct qlcnic_adapter *adapter,
1947 return 0; 1985 return 0;
1948} 1986}
1949 1987
1988void qlcnic_set_drv_version(struct qlcnic_adapter *adapter)
1989{
1990 struct qlcnic_hardware_context *ahw = adapter->ahw;
1991 u32 fw_cmd = 0;
1992
1993 if (qlcnic_82xx_check(adapter))
1994 fw_cmd = QLCNIC_CMD_82XX_SET_DRV_VER;
1995 else if (qlcnic_83xx_check(adapter))
1996 fw_cmd = QLCNIC_CMD_83XX_SET_DRV_VER;
1997
1998 if ((ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) &&
1999 (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_SET_DRV_VER))
2000 qlcnic_fw_cmd_set_drv_version(adapter, fw_cmd);
2001}
2002
1950static int 2003static int
1951qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 2004qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1952{ 2005{
@@ -1954,7 +2007,6 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1954 struct qlcnic_adapter *adapter = NULL; 2007 struct qlcnic_adapter *adapter = NULL;
1955 struct qlcnic_hardware_context *ahw; 2008 struct qlcnic_hardware_context *ahw;
1956 int err, pci_using_dac = -1; 2009 int err, pci_using_dac = -1;
1957 u32 capab2;
1958 char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */ 2010 char board_name[QLCNIC_MAX_BOARD_NAME_LEN + 19]; /* MAC + ": " + name */
1959 2011
1960 if (pdev->is_virtfn) 2012 if (pdev->is_virtfn)
@@ -2109,13 +2161,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2109 if (err) 2161 if (err)
2110 goto err_out_disable_mbx_intr; 2162 goto err_out_disable_mbx_intr;
2111 2163
2112 if (qlcnic_82xx_check(adapter)) { 2164 qlcnic_set_drv_version(adapter);
2113 if (ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
2114 capab2 = QLCRD32(adapter, CRB_FW_CAPABILITIES_2);
2115 if (capab2 & QLCNIC_FW_CAPABILITY_2_OCBB)
2116 qlcnic_fw_cmd_set_drv_version(adapter);
2117 }
2118 }
2119 2165
2120 pci_set_drvdata(pdev, adapter); 2166 pci_set_drvdata(pdev, adapter);
2121 2167
@@ -2231,37 +2277,6 @@ static void qlcnic_remove(struct pci_dev *pdev)
2231 kfree(ahw); 2277 kfree(ahw);
2232 free_netdev(netdev); 2278 free_netdev(netdev);
2233} 2279}
2234static int __qlcnic_shutdown(struct pci_dev *pdev)
2235{
2236 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
2237 struct net_device *netdev = adapter->netdev;
2238 int retval;
2239
2240 netif_device_detach(netdev);
2241
2242 qlcnic_cancel_idc_work(adapter);
2243
2244 if (netif_running(netdev))
2245 qlcnic_down(adapter, netdev);
2246
2247 qlcnic_sriov_cleanup(adapter);
2248 if (qlcnic_82xx_check(adapter))
2249 qlcnic_clr_all_drv_state(adapter, 0);
2250
2251 clear_bit(__QLCNIC_RESETTING, &adapter->state);
2252
2253 retval = pci_save_state(pdev);
2254 if (retval)
2255 return retval;
2256 if (qlcnic_82xx_check(adapter)) {
2257 if (qlcnic_wol_supported(adapter)) {
2258 pci_enable_wake(pdev, PCI_D3cold, 1);
2259 pci_enable_wake(pdev, PCI_D3hot, 1);
2260 }
2261 }
2262
2263 return 0;
2264}
2265 2280
2266static void qlcnic_shutdown(struct pci_dev *pdev) 2281static void qlcnic_shutdown(struct pci_dev *pdev)
2267{ 2282{
@@ -2272,8 +2287,7 @@ static void qlcnic_shutdown(struct pci_dev *pdev)
2272} 2287}
2273 2288
2274#ifdef CONFIG_PM 2289#ifdef CONFIG_PM
2275static int 2290static int qlcnic_suspend(struct pci_dev *pdev, pm_message_t state)
2276qlcnic_suspend(struct pci_dev *pdev, pm_message_t state)
2277{ 2291{
2278 int retval; 2292 int retval;
2279 2293
@@ -2285,11 +2299,9 @@ qlcnic_suspend(struct pci_dev *pdev, pm_message_t state)
2285 return 0; 2299 return 0;
2286} 2300}
2287 2301
2288static int 2302static int qlcnic_resume(struct pci_dev *pdev)
2289qlcnic_resume(struct pci_dev *pdev)
2290{ 2303{
2291 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev); 2304 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
2292 struct net_device *netdev = adapter->netdev;
2293 int err; 2305 int err;
2294 2306
2295 err = pci_enable_device(pdev); 2307 err = pci_enable_device(pdev);
@@ -2300,23 +2312,7 @@ qlcnic_resume(struct pci_dev *pdev)
2300 pci_set_master(pdev); 2312 pci_set_master(pdev);
2301 pci_restore_state(pdev); 2313 pci_restore_state(pdev);
2302 2314
2303 err = qlcnic_start_firmware(adapter); 2315 return __qlcnic_resume(adapter);
2304 if (err) {
2305 dev_err(&pdev->dev, "failed to start firmware\n");
2306 return err;
2307 }
2308
2309 if (netif_running(netdev)) {
2310 err = qlcnic_up(adapter, netdev);
2311 if (err)
2312 goto done;
2313
2314 qlcnic_restore_indev_addr(netdev, NETDEV_UP);
2315 }
2316done:
2317 netif_device_attach(netdev);
2318 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, FW_POLL_DELAY);
2319 return 0;
2320} 2316}
2321#endif 2317#endif
2322 2318
@@ -2655,8 +2651,7 @@ qlcnic_clr_drv_state(struct qlcnic_adapter *adapter)
2655 return 0; 2651 return 0;
2656} 2652}
2657 2653
2658static void 2654void qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8 failed)
2659qlcnic_clr_all_drv_state(struct qlcnic_adapter *adapter, u8 failed)
2660{ 2655{
2661 u32 val; 2656 u32 val;
2662 2657
@@ -3086,6 +3081,7 @@ done:
3086 adapter->fw_fail_cnt = 0; 3081 adapter->fw_fail_cnt = 0;
3087 adapter->flags &= ~QLCNIC_FW_HANG; 3082 adapter->flags &= ~QLCNIC_FW_HANG;
3088 clear_bit(__QLCNIC_RESETTING, &adapter->state); 3083 clear_bit(__QLCNIC_RESETTING, &adapter->state);
3084 qlcnic_set_drv_version(adapter);
3089 3085
3090 if (!qlcnic_clr_drv_state(adapter)) 3086 if (!qlcnic_clr_drv_state(adapter))
3091 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work, 3087 qlcnic_schedule_work(adapter, qlcnic_fw_poll_work,
@@ -3166,8 +3162,7 @@ detach:
3166 return 1; 3162 return 1;
3167} 3163}
3168 3164
3169static void 3165void qlcnic_fw_poll_work(struct work_struct *work)
3170qlcnic_fw_poll_work(struct work_struct *work)
3171{ 3166{
3172 struct qlcnic_adapter *adapter = container_of(work, 3167 struct qlcnic_adapter *adapter = container_of(work,
3173 struct qlcnic_adapter, fw_work.work); 3168 struct qlcnic_adapter, fw_work.work);
@@ -3219,7 +3214,6 @@ static int qlcnic_attach_func(struct pci_dev *pdev)
3219 if (err) 3214 if (err)
3220 return err; 3215 return err;
3221 3216
3222 pci_set_power_state(pdev, PCI_D0);
3223 pci_set_master(pdev); 3217 pci_set_master(pdev);
3224 pci_restore_state(pdev); 3218 pci_restore_state(pdev);
3225 3219
@@ -3517,7 +3511,7 @@ static int qlcnic_netdev_event(struct notifier_block *this,
3517 unsigned long event, void *ptr) 3511 unsigned long event, void *ptr)
3518{ 3512{
3519 struct qlcnic_adapter *adapter; 3513 struct qlcnic_adapter *adapter;
3520 struct net_device *dev = (struct net_device *)ptr; 3514 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
3521 3515
3522recheck: 3516recheck:
3523 if (dev == NULL) 3517 if (dev == NULL)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
index 4b9bab18ebd9..ab8a6744d402 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
@@ -15,6 +15,7 @@
15#define QLC_83XX_MINIDUMP_FLASH 0x520000 15#define QLC_83XX_MINIDUMP_FLASH 0x520000
16#define QLC_83XX_OCM_INDEX 3 16#define QLC_83XX_OCM_INDEX 3
17#define QLC_83XX_PCI_INDEX 0 17#define QLC_83XX_PCI_INDEX 0
18#define QLC_83XX_DMA_ENGINE_INDEX 8
18 19
19static const u32 qlcnic_ms_read_data[] = { 20static const u32 qlcnic_ms_read_data[] = {
20 0x410000A8, 0x410000AC, 0x410000B8, 0x410000BC 21 0x410000A8, 0x410000AC, 0x410000B8, 0x410000BC
@@ -32,6 +33,16 @@ static const u32 qlcnic_ms_read_data[] = {
32 33
33#define QLCNIC_DUMP_MASK_MAX 0xff 34#define QLCNIC_DUMP_MASK_MAX 0xff
34 35
36struct qlcnic_pex_dma_descriptor {
37 u32 read_data_size;
38 u32 dma_desc_cmd;
39 u32 src_addr_low;
40 u32 src_addr_high;
41 u32 dma_bus_addr_low;
42 u32 dma_bus_addr_high;
43 u32 rsvd[6];
44} __packed;
45
35struct qlcnic_common_entry_hdr { 46struct qlcnic_common_entry_hdr {
36 u32 type; 47 u32 type;
37 u32 offset; 48 u32 offset;
@@ -90,7 +101,10 @@ struct __ocm {
90} __packed; 101} __packed;
91 102
92struct __mem { 103struct __mem {
93 u8 rsvd[24]; 104 u32 desc_card_addr;
105 u32 dma_desc_cmd;
106 u32 start_dma_cmd;
107 u32 rsvd[3];
94 u32 addr; 108 u32 addr;
95 u32 size; 109 u32 size;
96} __packed; 110} __packed;
@@ -466,12 +480,12 @@ skip_poll:
466 return l2->no_ops * l2->read_addr_num * sizeof(u32); 480 return l2->no_ops * l2->read_addr_num * sizeof(u32);
467} 481}
468 482
469static u32 qlcnic_read_memory(struct qlcnic_adapter *adapter, 483static u32 qlcnic_read_memory_test_agent(struct qlcnic_adapter *adapter,
470 struct qlcnic_dump_entry *entry, __le32 *buffer) 484 struct __mem *mem, __le32 *buffer,
485 int *ret)
471{ 486{
472 u32 addr, data, test, ret = 0; 487 u32 addr, data, test;
473 int i, reg_read; 488 int i, reg_read;
474 struct __mem *mem = &entry->region.mem;
475 489
476 reg_read = mem->size; 490 reg_read = mem->size;
477 addr = mem->addr; 491 addr = mem->addr;
@@ -480,7 +494,8 @@ static u32 qlcnic_read_memory(struct qlcnic_adapter *adapter,
480 dev_info(&adapter->pdev->dev, 494 dev_info(&adapter->pdev->dev,
481 "Unaligned memory addr:0x%x size:0x%x\n", 495 "Unaligned memory addr:0x%x size:0x%x\n",
482 addr, reg_read); 496 addr, reg_read);
483 return -EINVAL; 497 *ret = -EINVAL;
498 return 0;
484 } 499 }
485 500
486 mutex_lock(&adapter->ahw->mem_lock); 501 mutex_lock(&adapter->ahw->mem_lock);
@@ -499,7 +514,7 @@ static u32 qlcnic_read_memory(struct qlcnic_adapter *adapter,
499 if (printk_ratelimit()) { 514 if (printk_ratelimit()) {
500 dev_err(&adapter->pdev->dev, 515 dev_err(&adapter->pdev->dev,
501 "failed to read through agent\n"); 516 "failed to read through agent\n");
502 ret = -EINVAL; 517 *ret = -EIO;
503 goto out; 518 goto out;
504 } 519 }
505 } 520 }
@@ -516,6 +531,181 @@ out:
516 return mem->size; 531 return mem->size;
517} 532}
518 533
534/* DMA register base address */
535#define QLC_DMA_REG_BASE_ADDR(dma_no) (0x77320000 + (dma_no * 0x10000))
536
537/* DMA register offsets w.r.t base address */
538#define QLC_DMA_CMD_BUFF_ADDR_LOW 0
539#define QLC_DMA_CMD_BUFF_ADDR_HI 4
540#define QLC_DMA_CMD_STATUS_CTRL 8
541
542#define QLC_PEX_DMA_READ_SIZE (PAGE_SIZE * 16)
543
544static int qlcnic_start_pex_dma(struct qlcnic_adapter *adapter,
545 struct __mem *mem)
546{
547 struct qlcnic_dump_template_hdr *tmpl_hdr;
548 struct device *dev = &adapter->pdev->dev;
549 u32 dma_no, dma_base_addr, temp_addr;
550 int i, ret, dma_sts;
551
552 tmpl_hdr = adapter->ahw->fw_dump.tmpl_hdr;
553 dma_no = tmpl_hdr->saved_state[QLC_83XX_DMA_ENGINE_INDEX];
554 dma_base_addr = QLC_DMA_REG_BASE_ADDR(dma_no);
555
556 temp_addr = dma_base_addr + QLC_DMA_CMD_BUFF_ADDR_LOW;
557 ret = qlcnic_83xx_wrt_reg_indirect(adapter, temp_addr,
558 mem->desc_card_addr);
559 if (ret)
560 return ret;
561
562 temp_addr = dma_base_addr + QLC_DMA_CMD_BUFF_ADDR_HI;
563 ret = qlcnic_83xx_wrt_reg_indirect(adapter, temp_addr, 0);
564 if (ret)
565 return ret;
566
567 temp_addr = dma_base_addr + QLC_DMA_CMD_STATUS_CTRL;
568 ret = qlcnic_83xx_wrt_reg_indirect(adapter, temp_addr,
569 mem->start_dma_cmd);
570 if (ret)
571 return ret;
572
573 /* Wait for DMA to complete */
574 temp_addr = dma_base_addr + QLC_DMA_CMD_STATUS_CTRL;
575 for (i = 0; i < 400; i++) {
576 dma_sts = qlcnic_ind_rd(adapter, temp_addr);
577
578 if (dma_sts & BIT_1)
579 usleep_range(250, 500);
580 else
581 break;
582 }
583
584 if (i >= 400) {
585 dev_info(dev, "PEX DMA operation timed out");
586 ret = -EIO;
587 }
588
589 return ret;
590}
591
592static u32 qlcnic_read_memory_pexdma(struct qlcnic_adapter *adapter,
593 struct __mem *mem,
594 __le32 *buffer, int *ret)
595{
596 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
597 u32 temp, dma_base_addr, size = 0, read_size = 0;
598 struct qlcnic_pex_dma_descriptor *dma_descr;
599 struct qlcnic_dump_template_hdr *tmpl_hdr;
600 struct device *dev = &adapter->pdev->dev;
601 dma_addr_t dma_phys_addr;
602 void *dma_buffer;
603
604 tmpl_hdr = fw_dump->tmpl_hdr;
605
606 /* Check if DMA engine is available */
607 temp = tmpl_hdr->saved_state[QLC_83XX_DMA_ENGINE_INDEX];
608 dma_base_addr = QLC_DMA_REG_BASE_ADDR(temp);
609 temp = qlcnic_ind_rd(adapter,
610 dma_base_addr + QLC_DMA_CMD_STATUS_CTRL);
611
612 if (!(temp & BIT_31)) {
613 dev_info(dev, "%s: DMA engine is not available\n", __func__);
614 *ret = -EIO;
615 return 0;
616 }
617
618 /* Create DMA descriptor */
619 dma_descr = kzalloc(sizeof(struct qlcnic_pex_dma_descriptor),
620 GFP_KERNEL);
621 if (!dma_descr) {
622 *ret = -ENOMEM;
623 return 0;
624 }
625
626 /* dma_desc_cmd 0:15 = 0
627 * dma_desc_cmd 16:19 = mem->dma_desc_cmd 0:3
628 * dma_desc_cmd 20:23 = pci function number
629 * dma_desc_cmd 24:31 = mem->dma_desc_cmd 8:15
630 */
631 dma_phys_addr = fw_dump->phys_addr;
632 dma_buffer = fw_dump->dma_buffer;
633 temp = 0;
634 temp = mem->dma_desc_cmd & 0xff0f;
635 temp |= (adapter->ahw->pci_func & 0xf) << 4;
636 dma_descr->dma_desc_cmd = (temp << 16) & 0xffff0000;
637 dma_descr->dma_bus_addr_low = LSD(dma_phys_addr);
638 dma_descr->dma_bus_addr_high = MSD(dma_phys_addr);
639 dma_descr->src_addr_high = 0;
640
641 /* Collect memory dump using multiple DMA operations if required */
642 while (read_size < mem->size) {
643 if (mem->size - read_size >= QLC_PEX_DMA_READ_SIZE)
644 size = QLC_PEX_DMA_READ_SIZE;
645 else
646 size = mem->size - read_size;
647
648 dma_descr->src_addr_low = mem->addr + read_size;
649 dma_descr->read_data_size = size;
650
651 /* Write DMA descriptor to MS memory*/
652 temp = sizeof(struct qlcnic_pex_dma_descriptor) / 16;
653 *ret = qlcnic_83xx_ms_mem_write128(adapter, mem->desc_card_addr,
654 (u32 *)dma_descr, temp);
655 if (*ret) {
656 dev_info(dev, "Failed to write DMA descriptor to MS memory at address 0x%x\n",
657 mem->desc_card_addr);
658 goto free_dma_descr;
659 }
660
661 *ret = qlcnic_start_pex_dma(adapter, mem);
662 if (*ret) {
663 dev_info(dev, "Failed to start PEX DMA operation\n");
664 goto free_dma_descr;
665 }
666
667 memcpy(buffer, dma_buffer, size);
668 buffer += size / 4;
669 read_size += size;
670 }
671
672free_dma_descr:
673 kfree(dma_descr);
674
675 return read_size;
676}
677
678static u32 qlcnic_read_memory(struct qlcnic_adapter *adapter,
679 struct qlcnic_dump_entry *entry, __le32 *buffer)
680{
681 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
682 struct device *dev = &adapter->pdev->dev;
683 struct __mem *mem = &entry->region.mem;
684 u32 data_size;
685 int ret = 0;
686
687 if (fw_dump->use_pex_dma) {
688 data_size = qlcnic_read_memory_pexdma(adapter, mem, buffer,
689 &ret);
690 if (ret)
691 dev_info(dev,
692 "Failed to read memory dump using PEX DMA: mask[0x%x]\n",
693 entry->hdr.mask);
694 else
695 return data_size;
696 }
697
698 data_size = qlcnic_read_memory_test_agent(adapter, mem, buffer, &ret);
699 if (ret) {
700 dev_info(dev,
701 "Failed to read memory dump using test agent method: mask[0x%x]\n",
702 entry->hdr.mask);
703 return 0;
704 } else {
705 return data_size;
706 }
707}
708
519static u32 qlcnic_dump_nop(struct qlcnic_adapter *adapter, 709static u32 qlcnic_dump_nop(struct qlcnic_adapter *adapter,
520 struct qlcnic_dump_entry *entry, __le32 *buffer) 710 struct qlcnic_dump_entry *entry, __le32 *buffer)
521{ 711{
@@ -893,6 +1083,12 @@ flash_temp:
893 1083
894 tmpl_hdr = ahw->fw_dump.tmpl_hdr; 1084 tmpl_hdr = ahw->fw_dump.tmpl_hdr;
895 tmpl_hdr->drv_cap_mask = QLCNIC_DUMP_MASK_DEF; 1085 tmpl_hdr->drv_cap_mask = QLCNIC_DUMP_MASK_DEF;
1086
1087 if ((tmpl_hdr->version & 0xffffff) >= 0x20001)
1088 ahw->fw_dump.use_pex_dma = true;
1089 else
1090 ahw->fw_dump.use_pex_dma = false;
1091
896 ahw->fw_dump.enable = 1; 1092 ahw->fw_dump.enable = 1;
897 1093
898 return 0; 1094 return 0;
@@ -910,7 +1106,9 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
910 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; 1106 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
911 struct qlcnic_dump_template_hdr *tmpl_hdr = fw_dump->tmpl_hdr; 1107 struct qlcnic_dump_template_hdr *tmpl_hdr = fw_dump->tmpl_hdr;
912 static const struct qlcnic_dump_operations *fw_dump_ops; 1108 static const struct qlcnic_dump_operations *fw_dump_ops;
1109 struct device *dev = &adapter->pdev->dev;
913 struct qlcnic_hardware_context *ahw; 1110 struct qlcnic_hardware_context *ahw;
1111 void *temp_buffer;
914 1112
915 ahw = adapter->ahw; 1113 ahw = adapter->ahw;
916 1114
@@ -944,6 +1142,16 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
944 tmpl_hdr->sys_info[0] = QLCNIC_DRIVER_VERSION; 1142 tmpl_hdr->sys_info[0] = QLCNIC_DRIVER_VERSION;
945 tmpl_hdr->sys_info[1] = adapter->fw_version; 1143 tmpl_hdr->sys_info[1] = adapter->fw_version;
946 1144
1145 if (fw_dump->use_pex_dma) {
1146 temp_buffer = dma_alloc_coherent(dev, QLC_PEX_DMA_READ_SIZE,
1147 &fw_dump->phys_addr,
1148 GFP_KERNEL);
1149 if (!temp_buffer)
1150 fw_dump->use_pex_dma = false;
1151 else
1152 fw_dump->dma_buffer = temp_buffer;
1153 }
1154
947 if (qlcnic_82xx_check(adapter)) { 1155 if (qlcnic_82xx_check(adapter)) {
948 ops_cnt = ARRAY_SIZE(qlcnic_fw_dump_ops); 1156 ops_cnt = ARRAY_SIZE(qlcnic_fw_dump_ops);
949 fw_dump_ops = qlcnic_fw_dump_ops; 1157 fw_dump_ops = qlcnic_fw_dump_ops;
@@ -1002,6 +1210,9 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
1002 return 0; 1210 return 0;
1003 } 1211 }
1004error: 1212error:
1213 if (fw_dump->use_pex_dma)
1214 dma_free_coherent(dev, QLC_PEX_DMA_READ_SIZE,
1215 fw_dump->dma_buffer, fw_dump->phys_addr);
1005 vfree(fw_dump->data); 1216 vfree(fw_dump->data);
1006 return -EINVAL; 1217 return -EINVAL;
1007} 1218}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov.h
index d85fbb57c25b..0daf660e12a1 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov.h
@@ -129,6 +129,7 @@ struct qlcnic_vport {
129 u8 vlan_mode; 129 u8 vlan_mode;
130 u16 vlan; 130 u16 vlan;
131 u8 qos; 131 u8 qos;
132 bool spoofchk;
132 u8 mac[6]; 133 u8 mac[6];
133}; 134};
134 135
@@ -194,6 +195,8 @@ int __qlcnic_sriov_add_act_list(struct qlcnic_sriov *, struct qlcnic_vf_info *,
194int qlcnic_sriov_get_vf_vport_info(struct qlcnic_adapter *, 195int qlcnic_sriov_get_vf_vport_info(struct qlcnic_adapter *,
195 struct qlcnic_info *, u16); 196 struct qlcnic_info *, u16);
196int qlcnic_sriov_cfg_vf_guest_vlan(struct qlcnic_adapter *, u16, u8); 197int qlcnic_sriov_cfg_vf_guest_vlan(struct qlcnic_adapter *, u16, u8);
198int qlcnic_sriov_vf_shutdown(struct pci_dev *);
199int qlcnic_sriov_vf_resume(struct qlcnic_adapter *);
197 200
198static inline bool qlcnic_sriov_enable_check(struct qlcnic_adapter *adapter) 201static inline bool qlcnic_sriov_enable_check(struct qlcnic_adapter *adapter)
199{ 202{
@@ -225,6 +228,7 @@ int qlcnic_sriov_set_vf_tx_rate(struct net_device *, int, int);
225int qlcnic_sriov_get_vf_config(struct net_device *, int , 228int qlcnic_sriov_get_vf_config(struct net_device *, int ,
226 struct ifla_vf_info *); 229 struct ifla_vf_info *);
227int qlcnic_sriov_set_vf_vlan(struct net_device *, int, u16, u8); 230int qlcnic_sriov_set_vf_vlan(struct net_device *, int, u16, u8);
231int qlcnic_sriov_set_vf_spoofchk(struct net_device *, int, bool);
228#else 232#else
229static inline void qlcnic_sriov_pf_disable(struct qlcnic_adapter *adapter) {} 233static inline void qlcnic_sriov_pf_disable(struct qlcnic_adapter *adapter) {}
230static inline void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter *adapter) {} 234static inline void qlcnic_sriov_pf_cleanup(struct qlcnic_adapter *adapter) {}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
index 8b59a710a4a5..62380ce89905 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
@@ -35,6 +35,7 @@ static void qlcnic_sriov_vf_cancel_fw_work(struct qlcnic_adapter *);
35static void qlcnic_sriov_cleanup_transaction(struct qlcnic_bc_trans *); 35static void qlcnic_sriov_cleanup_transaction(struct qlcnic_bc_trans *);
36static int qlcnic_sriov_vf_mbx_op(struct qlcnic_adapter *, 36static int qlcnic_sriov_vf_mbx_op(struct qlcnic_adapter *,
37 struct qlcnic_cmd_args *); 37 struct qlcnic_cmd_args *);
38static void qlcnic_sriov_process_bc_cmd(struct work_struct *);
38 39
39static struct qlcnic_hardware_ops qlcnic_sriov_vf_hw_ops = { 40static struct qlcnic_hardware_ops qlcnic_sriov_vf_hw_ops = {
40 .read_crb = qlcnic_83xx_read_crb, 41 .read_crb = qlcnic_83xx_read_crb,
@@ -75,6 +76,8 @@ static struct qlcnic_nic_template qlcnic_sriov_vf_ops = {
75 .cancel_idc_work = qlcnic_sriov_vf_cancel_fw_work, 76 .cancel_idc_work = qlcnic_sriov_vf_cancel_fw_work,
76 .napi_add = qlcnic_83xx_napi_add, 77 .napi_add = qlcnic_83xx_napi_add,
77 .napi_del = qlcnic_83xx_napi_del, 78 .napi_del = qlcnic_83xx_napi_del,
79 .shutdown = qlcnic_sriov_vf_shutdown,
80 .resume = qlcnic_sriov_vf_resume,
78 .config_ipaddr = qlcnic_83xx_config_ipaddr, 81 .config_ipaddr = qlcnic_83xx_config_ipaddr,
79 .clear_legacy_intr = qlcnic_83xx_clear_legacy_intr, 82 .clear_legacy_intr = qlcnic_83xx_clear_legacy_intr,
80}; 83};
@@ -179,6 +182,8 @@ int qlcnic_sriov_init(struct qlcnic_adapter *adapter, int num_vfs)
179 spin_lock_init(&vf->rcv_pend.lock); 182 spin_lock_init(&vf->rcv_pend.lock);
180 init_completion(&vf->ch_free_cmpl); 183 init_completion(&vf->ch_free_cmpl);
181 184
185 INIT_WORK(&vf->trans_work, qlcnic_sriov_process_bc_cmd);
186
182 if (qlcnic_sriov_pf_check(adapter)) { 187 if (qlcnic_sriov_pf_check(adapter)) {
183 vp = kzalloc(sizeof(struct qlcnic_vport), GFP_KERNEL); 188 vp = kzalloc(sizeof(struct qlcnic_vport), GFP_KERNEL);
184 if (!vp) { 189 if (!vp) {
@@ -187,6 +192,7 @@ int qlcnic_sriov_init(struct qlcnic_adapter *adapter, int num_vfs)
187 } 192 }
188 sriov->vf_info[i].vp = vp; 193 sriov->vf_info[i].vp = vp;
189 vp->max_tx_bw = MAX_BW; 194 vp->max_tx_bw = MAX_BW;
195 vp->spoofchk = true;
190 random_ether_addr(vp->mac); 196 random_ether_addr(vp->mac);
191 dev_info(&adapter->pdev->dev, 197 dev_info(&adapter->pdev->dev,
192 "MAC Address %pM is configured for VF %d\n", 198 "MAC Address %pM is configured for VF %d\n",
@@ -652,6 +658,8 @@ int qlcnic_sriov_vf_init(struct qlcnic_adapter *adapter, int pci_using_dac)
652 if (qlcnic_read_mac_addr(adapter)) 658 if (qlcnic_read_mac_addr(adapter))
653 dev_warn(&adapter->pdev->dev, "failed to read mac addr\n"); 659 dev_warn(&adapter->pdev->dev, "failed to read mac addr\n");
654 660
661 INIT_DELAYED_WORK(&adapter->idc_aen_work, qlcnic_83xx_idc_aen_work);
662
655 clear_bit(__QLCNIC_RESETTING, &adapter->state); 663 clear_bit(__QLCNIC_RESETTING, &adapter->state);
656 return 0; 664 return 0;
657} 665}
@@ -864,7 +872,6 @@ static void qlcnic_sriov_schedule_bc_cmd(struct qlcnic_sriov *sriov,
864 vf->adapter->need_fw_reset) 872 vf->adapter->need_fw_reset)
865 return; 873 return;
866 874
867 INIT_WORK(&vf->trans_work, func);
868 queue_work(sriov->bc.bc_trans_wq, &vf->trans_work); 875 queue_work(sriov->bc.bc_trans_wq, &vf->trans_work);
869} 876}
870 877
@@ -1949,3 +1956,54 @@ static void qlcnic_sriov_vf_free_mac_list(struct qlcnic_adapter *adapter)
1949 kfree(cur); 1956 kfree(cur);
1950 } 1957 }
1951} 1958}
1959
1960int qlcnic_sriov_vf_shutdown(struct pci_dev *pdev)
1961{
1962 struct qlcnic_adapter *adapter = pci_get_drvdata(pdev);
1963 struct net_device *netdev = adapter->netdev;
1964 int retval;
1965
1966 netif_device_detach(netdev);
1967 qlcnic_cancel_idc_work(adapter);
1968
1969 if (netif_running(netdev))
1970 qlcnic_down(adapter, netdev);
1971
1972 qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_TERM);
1973 qlcnic_sriov_cfg_bc_intr(adapter, 0);
1974 qlcnic_83xx_disable_mbx_intr(adapter);
1975 cancel_delayed_work_sync(&adapter->idc_aen_work);
1976
1977 retval = pci_save_state(pdev);
1978 if (retval)
1979 return retval;
1980
1981 return 0;
1982}
1983
1984int qlcnic_sriov_vf_resume(struct qlcnic_adapter *adapter)
1985{
1986 struct qlc_83xx_idc *idc = &adapter->ahw->idc;
1987 struct net_device *netdev = adapter->netdev;
1988 int err;
1989
1990 set_bit(QLC_83XX_MODULE_LOADED, &idc->status);
1991 qlcnic_83xx_enable_mbx_intrpt(adapter);
1992 err = qlcnic_sriov_cfg_bc_intr(adapter, 1);
1993 if (err)
1994 return err;
1995
1996 err = qlcnic_sriov_channel_cfg_cmd(adapter, QLCNIC_BC_CMD_CHANNEL_INIT);
1997 if (!err) {
1998 if (netif_running(netdev)) {
1999 err = qlcnic_up(adapter, netdev);
2000 if (!err)
2001 qlcnic_restore_indev_addr(netdev, NETDEV_UP);
2002 }
2003 }
2004
2005 netif_device_attach(netdev);
2006 qlcnic_schedule_work(adapter, qlcnic_sriov_vf_poll_dev_state,
2007 idc->delay);
2008 return err;
2009}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
index 1a66ccded235..ee0c1d307966 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
@@ -580,6 +580,7 @@ static int qlcnic_sriov_set_vf_acl(struct qlcnic_adapter *adapter, u8 func)
580 struct qlcnic_cmd_args cmd; 580 struct qlcnic_cmd_args cmd;
581 struct qlcnic_vport *vp; 581 struct qlcnic_vport *vp;
582 int err, id; 582 int err, id;
583 u8 *mac;
583 584
584 id = qlcnic_sriov_func_to_index(adapter, func); 585 id = qlcnic_sriov_func_to_index(adapter, func);
585 if (id < 0) 586 if (id < 0)
@@ -591,6 +592,14 @@ static int qlcnic_sriov_set_vf_acl(struct qlcnic_adapter *adapter, u8 func)
591 return err; 592 return err;
592 593
593 cmd.req.arg[1] = 0x3 | func << 16; 594 cmd.req.arg[1] = 0x3 | func << 16;
595 if (vp->spoofchk == true) {
596 mac = vp->mac;
597 cmd.req.arg[2] |= BIT_1 | BIT_3 | BIT_8;
598 cmd.req.arg[4] = mac[5] | mac[4] << 8 | mac[3] << 16 |
599 mac[2] << 24;
600 cmd.req.arg[5] = mac[1] | mac[0] << 8;
601 }
602
594 if (vp->vlan_mode == QLC_PVID_MODE) { 603 if (vp->vlan_mode == QLC_PVID_MODE) {
595 cmd.req.arg[2] |= BIT_6; 604 cmd.req.arg[2] |= BIT_6;
596 cmd.req.arg[3] |= vp->vlan << 8; 605 cmd.req.arg[3] |= vp->vlan << 8;
@@ -1767,6 +1776,7 @@ int qlcnic_sriov_get_vf_config(struct net_device *netdev,
1767 memcpy(&ivi->mac, vp->mac, ETH_ALEN); 1776 memcpy(&ivi->mac, vp->mac, ETH_ALEN);
1768 ivi->vlan = vp->vlan; 1777 ivi->vlan = vp->vlan;
1769 ivi->qos = vp->qos; 1778 ivi->qos = vp->qos;
1779 ivi->spoofchk = vp->spoofchk;
1770 if (vp->max_tx_bw == MAX_BW) 1780 if (vp->max_tx_bw == MAX_BW)
1771 ivi->tx_rate = 0; 1781 ivi->tx_rate = 0;
1772 else 1782 else
@@ -1775,3 +1785,29 @@ int qlcnic_sriov_get_vf_config(struct net_device *netdev,
1775 ivi->vf = vf; 1785 ivi->vf = vf;
1776 return 0; 1786 return 0;
1777} 1787}
1788
1789int qlcnic_sriov_set_vf_spoofchk(struct net_device *netdev, int vf, bool chk)
1790{
1791 struct qlcnic_adapter *adapter = netdev_priv(netdev);
1792 struct qlcnic_sriov *sriov = adapter->ahw->sriov;
1793 struct qlcnic_vf_info *vf_info;
1794 struct qlcnic_vport *vp;
1795
1796 if (!qlcnic_sriov_pf_check(adapter))
1797 return -EOPNOTSUPP;
1798
1799 if (vf >= sriov->num_vfs)
1800 return -EINVAL;
1801
1802 vf_info = &sriov->vf_info[vf];
1803 vp = vf_info->vp;
1804 if (test_bit(QLC_BC_VF_STATE, &vf_info->state)) {
1805 netdev_err(netdev,
1806 "Spoof check change failed for VF %d, as VF driver is loaded. Please unload VF driver and retry the operation\n",
1807 vf);
1808 return -EOPNOTSUPP;
1809 }
1810
1811 vp->spoofchk = chk;
1812 return 0;
1813}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
index e7a2fe21b649..10ed82b3baca 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sysfs.c
@@ -47,7 +47,7 @@ static ssize_t qlcnic_store_bridged_mode(struct device *dev,
47 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) 47 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state))
48 goto err_out; 48 goto err_out;
49 49
50 if (strict_strtoul(buf, 2, &new)) 50 if (kstrtoul(buf, 2, &new))
51 goto err_out; 51 goto err_out;
52 52
53 if (!qlcnic_config_bridged_mode(adapter, !!new)) 53 if (!qlcnic_config_bridged_mode(adapter, !!new))
@@ -77,7 +77,7 @@ static ssize_t qlcnic_store_diag_mode(struct device *dev,
77 struct qlcnic_adapter *adapter = dev_get_drvdata(dev); 77 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
78 unsigned long new; 78 unsigned long new;
79 79
80 if (strict_strtoul(buf, 2, &new)) 80 if (kstrtoul(buf, 2, &new))
81 return -EINVAL; 81 return -EINVAL;
82 82
83 if (!!new != !!(adapter->flags & QLCNIC_DIAG_ENABLED)) 83 if (!!new != !!(adapter->flags & QLCNIC_DIAG_ENABLED))
@@ -114,57 +114,51 @@ static int qlcnic_validate_beacon(struct qlcnic_adapter *adapter, u16 beacon,
114 return 0; 114 return 0;
115} 115}
116 116
117static ssize_t qlcnic_store_beacon(struct device *dev, 117static int qlcnic_83xx_store_beacon(struct qlcnic_adapter *adapter,
118 struct device_attribute *attr, 118 const char *buf, size_t len)
119 const char *buf, size_t len)
120{ 119{
121 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
122 struct qlcnic_hardware_context *ahw = adapter->ahw; 120 struct qlcnic_hardware_context *ahw = adapter->ahw;
123 int err, max_sds_rings = adapter->max_sds_rings;
124 u16 beacon;
125 u8 b_state, b_rate;
126 unsigned long h_beacon; 121 unsigned long h_beacon;
122 int err;
127 123
128 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { 124 if (test_bit(__QLCNIC_RESETTING, &adapter->state))
129 dev_warn(dev, 125 return -EIO;
130 "LED test not supported in non privileged mode\n");
131 return -EOPNOTSUPP;
132 }
133 126
134 if (qlcnic_83xx_check(adapter) && 127 if (kstrtoul(buf, 2, &h_beacon))
135 !test_bit(__QLCNIC_RESETTING, &adapter->state)) { 128 return -EINVAL;
136 if (kstrtoul(buf, 2, &h_beacon))
137 return -EINVAL;
138 129
139 if (ahw->beacon_state == h_beacon) 130 if (ahw->beacon_state == h_beacon)
140 return len; 131 return len;
141 132
142 rtnl_lock(); 133 rtnl_lock();
143 if (!ahw->beacon_state) { 134 if (!ahw->beacon_state) {
144 if (test_and_set_bit(__QLCNIC_LED_ENABLE, 135 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) {
145 &adapter->state)) { 136 rtnl_unlock();
146 rtnl_unlock(); 137 return -EBUSY;
147 return -EBUSY;
148 }
149 }
150 if (h_beacon) {
151 err = qlcnic_83xx_config_led(adapter, 1, h_beacon);
152 if (err)
153 goto beacon_err;
154 } else {
155 err = qlcnic_83xx_config_led(adapter, 0, !h_beacon);
156 if (err)
157 goto beacon_err;
158 } 138 }
159 /* set the current beacon state */ 139 }
140
141 if (h_beacon)
142 err = qlcnic_83xx_config_led(adapter, 1, h_beacon);
143 else
144 err = qlcnic_83xx_config_led(adapter, 0, !h_beacon);
145 if (!err)
160 ahw->beacon_state = h_beacon; 146 ahw->beacon_state = h_beacon;
161beacon_err:
162 if (!ahw->beacon_state)
163 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
164 147
165 rtnl_unlock(); 148 if (!ahw->beacon_state)
166 return len; 149 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
167 } 150
151 rtnl_unlock();
152 return len;
153}
154
155static int qlcnic_82xx_store_beacon(struct qlcnic_adapter *adapter,
156 const char *buf, size_t len)
157{
158 struct qlcnic_hardware_context *ahw = adapter->ahw;
159 int err, max_sds_rings = adapter->max_sds_rings;
160 u16 beacon;
161 u8 h_beacon_state, b_state, b_rate;
168 162
169 if (len != sizeof(u16)) 163 if (len != sizeof(u16))
170 return QL_STATUS_INVALID_PARAM; 164 return QL_STATUS_INVALID_PARAM;
@@ -174,16 +168,29 @@ beacon_err:
174 if (err) 168 if (err)
175 return err; 169 return err;
176 170
177 if (adapter->ahw->beacon_state == b_state) 171 if (ahw->extra_capability[0] & QLCNIC_FW_CAPABILITY_2_BEACON) {
172 err = qlcnic_get_beacon_state(adapter, &h_beacon_state);
173 if (!err) {
174 dev_info(&adapter->pdev->dev,
175 "Failed to get current beacon state\n");
176 } else {
177 if (h_beacon_state == QLCNIC_BEACON_DISABLE)
178 ahw->beacon_state = 0;
179 else if (h_beacon_state == QLCNIC_BEACON_EANBLE)
180 ahw->beacon_state = 2;
181 }
182 }
183
184 if (ahw->beacon_state == b_state)
178 return len; 185 return len;
179 186
180 rtnl_lock(); 187 rtnl_lock();
181 188 if (!ahw->beacon_state) {
182 if (!adapter->ahw->beacon_state)
183 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) { 189 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) {
184 rtnl_unlock(); 190 rtnl_unlock();
185 return -EBUSY; 191 return -EBUSY;
186 } 192 }
193 }
187 194
188 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) { 195 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) {
189 err = -EIO; 196 err = -EIO;
@@ -206,14 +213,37 @@ beacon_err:
206 if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state)) 213 if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state))
207 qlcnic_diag_free_res(adapter->netdev, max_sds_rings); 214 qlcnic_diag_free_res(adapter->netdev, max_sds_rings);
208 215
209 out: 216out:
210 if (!adapter->ahw->beacon_state) 217 if (!ahw->beacon_state)
211 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state); 218 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state);
212 rtnl_unlock(); 219 rtnl_unlock();
213 220
214 return err; 221 return err;
215} 222}
216 223
224static ssize_t qlcnic_store_beacon(struct device *dev,
225 struct device_attribute *attr,
226 const char *buf, size_t len)
227{
228 struct qlcnic_adapter *adapter = dev_get_drvdata(dev);
229 int err = 0;
230
231 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) {
232 dev_warn(dev,
233 "LED test not supported in non privileged mode\n");
234 return -EOPNOTSUPP;
235 }
236
237 if (qlcnic_82xx_check(adapter))
238 err = qlcnic_82xx_store_beacon(adapter, buf, len);
239 else if (qlcnic_83xx_check(adapter))
240 err = qlcnic_83xx_store_beacon(adapter, buf, len);
241 else
242 return -EIO;
243
244 return err;
245}
246
217static ssize_t qlcnic_show_beacon(struct device *dev, 247static ssize_t qlcnic_show_beacon(struct device *dev,
218 struct device_attribute *attr, char *buf) 248 struct device_attribute *attr, char *buf)
219{ 249{