aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-08-03 18:00:23 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-08-03 18:00:23 -0400
commit72a67a94bcba71a5fddd6b3596a20604d2b5dcd6 (patch)
treec16021b2e216d126cbf62301362fd1115a628438 /drivers/net
parent83aaf3b39c4f26d71a58f84924b6c6f9b1070d54 (diff)
parent4bd8e7385961932d863ea976a67f384c3a8302cb (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: 1) Don't ignore user initiated wireless regulatory settings on cards with custom regulatory domains, from Arik Nemtsov. 2) Fix length check of bluetooth information responses, from Jaganath Kanakkassery. 3) Fix misuse of PTR_ERR in btusb, from Adam Lee. 4) Handle rfkill properly while iwlwifi devices are offline, from Emmanuel Grumbach. 5) Fix r815x devices DMA'ing to stack buffers, from Hayes Wang. 6) Kernel info leak in ATM packet scheduler, from Dan Carpenter. 7) 8139cp doesn't check for DMA mapping errors, from Neil Horman. 8) Fix bridge multicast code to not snoop when no querier exists, otherwise mutlicast traffic is lost. From Linus Lüssing. 9) Avoid soft lockups in fib6_run_gc(), from Michal Kubecek. 10) Fix races in automatic address asignment on ipv6, which can result in incorrect lifetime assignments. From Jiri Benc. 11) Cure build bustage when CONFIG_NET_LL_RX_POLL is not set and rename it CONFIG_NET_RX_BUSY_POLL to eliminate the last reference to the original naming of this feature. From Cong Wang. 12) Fix crash in TIPC when server socket creation fails, from Ying Xue. 13) macvlan_changelink() silently succeeds when it shouldn't, from Michael S Tsirkin. 14) HTB packet scheduler can crash due to sign extension, fix from Stephen Hemminger. 15) With the cable unplugged, r8169 prints out a message every 10 seconds, make it netif_dbg() instead of netif_warn(). From Peter Wu. 16) Fix memory leak in rtm_to_ifaddr(), from Daniel Borkmann. 17) sis900 gets spurious TX queue timeouts due to mismanagement of link carrier state, from Denis Kirjanov. 18) Validate somaxconn sysctl to make sure it fits inside of a u16. From Roman Gushchin. 19) Fix MAC address filtering on qlcnic, from Shahed Shaikh. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (68 commits) qlcnic: Fix for flash update failure on 83xx adapter qlcnic: Fix link speed and duplex display for 83xx adapter qlcnic: Fix link speed display for 82xx adapter qlcnic: Fix external loopback test. qlcnic: Removed adapter series name from warning messages. qlcnic: Free up memory in error path. qlcnic: Fix ingress MAC learning qlcnic: Fix MAC address filter issue on 82xx adapter net: ethernet: davinci_emac: drop IRQF_DISABLED netlabel: use domain based selectors when address based selectors are not available net: check net.core.somaxconn sysctl values sis900: Fix the tx queue timeout issue net: rtm_to_ifaddr: free ifa if ifa_cacheinfo processing fails r8169: remove "PHY reset until link up" log spam net: ethernet: cpsw: drop IRQF_DISABLED htb: fix sign extension bug macvlan: handle set_promiscuity failures macvlan: better mode validation tipc: fix oops when creating server socket fails net: rename CONFIG_NET_LL_RX_POLL to CONFIG_NET_RX_BUSY_POLL ...
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x.h8
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c2
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c2
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe.h12
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_ethtool.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c6
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/fw.c11
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mlx4_en.h10
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic.h12
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c126
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c91
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c16
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c83
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c40
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c25
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c101
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c19
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c2
-rw-r--r--drivers/net/ethernet/realtek/8139cp.c48
-rw-r--r--drivers/net/ethernet/realtek/r8169.c2
-rw-r--r--drivers/net/ethernet/sis/sis900.c12
-rw-r--r--drivers/net/ethernet/ti/cpsw.c2
-rw-r--r--drivers/net/ethernet/ti/davinci_emac.c3
-rw-r--r--drivers/net/macvlan.c23
-rw-r--r--drivers/net/usb/r8152.c126
-rw-r--r--drivers/net/usb/r815x.c62
-rw-r--r--drivers/net/wireless/ath/ath10k/Kconfig2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-prph.h2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/d3.c15
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h1
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c42
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/scan.c11
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/sta.c11
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/drv.c1
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/rx.c8
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c5
-rw-r--r--drivers/net/wireless/mwifiex/cfg80211.c4
-rw-r--r--drivers/net/wireless/mwifiex/cfp.c3
-rw-r--r--drivers/net/wireless/mwifiex/join.c6
-rw-r--r--drivers/net/wireless/mwifiex/sdio.c4
-rw-r--r--drivers/net/wireless/mwifiex/sta_ioctl.c4
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.c18
47 files changed, 617 insertions, 387 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
index dedbd76c033e..d80e34b8285f 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
@@ -486,7 +486,7 @@ struct bnx2x_fastpath {
486 486
487 struct napi_struct napi; 487 struct napi_struct napi;
488 488
489#ifdef CONFIG_NET_LL_RX_POLL 489#ifdef CONFIG_NET_RX_BUSY_POLL
490 unsigned int state; 490 unsigned int state;
491#define BNX2X_FP_STATE_IDLE 0 491#define BNX2X_FP_STATE_IDLE 0
492#define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */ 492#define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */
@@ -498,7 +498,7 @@ struct bnx2x_fastpath {
498#define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD) 498#define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD)
499 /* protect state */ 499 /* protect state */
500 spinlock_t lock; 500 spinlock_t lock;
501#endif /* CONFIG_NET_LL_RX_POLL */ 501#endif /* CONFIG_NET_RX_BUSY_POLL */
502 502
503 union host_hc_status_block status_blk; 503 union host_hc_status_block status_blk;
504 /* chip independent shortcuts into sb structure */ 504 /* chip independent shortcuts into sb structure */
@@ -572,7 +572,7 @@ struct bnx2x_fastpath {
572#define bnx2x_fp_stats(bp, fp) (&((bp)->fp_stats[(fp)->index])) 572#define bnx2x_fp_stats(bp, fp) (&((bp)->fp_stats[(fp)->index]))
573#define bnx2x_fp_qstats(bp, fp) (&((bp)->fp_stats[(fp)->index].eth_q_stats)) 573#define bnx2x_fp_qstats(bp, fp) (&((bp)->fp_stats[(fp)->index].eth_q_stats))
574 574
575#ifdef CONFIG_NET_LL_RX_POLL 575#ifdef CONFIG_NET_RX_BUSY_POLL
576static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp) 576static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp)
577{ 577{
578 spin_lock_init(&fp->lock); 578 spin_lock_init(&fp->lock);
@@ -680,7 +680,7 @@ static inline bool bnx2x_fp_ll_polling(struct bnx2x_fastpath *fp)
680{ 680{
681 return false; 681 return false;
682} 682}
683#endif /* CONFIG_NET_LL_RX_POLL */ 683#endif /* CONFIG_NET_RX_BUSY_POLL */
684 684
685/* Use 2500 as a mini-jumbo MTU for FCoE */ 685/* Use 2500 as a mini-jumbo MTU for FCoE */
686#define BNX2X_FCOE_MINI_JUMBO_MTU 2500 686#define BNX2X_FCOE_MINI_JUMBO_MTU 2500
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index ee350bde1818..f2d1ff10054b 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -3117,7 +3117,7 @@ int bnx2x_poll(struct napi_struct *napi, int budget)
3117 return work_done; 3117 return work_done;
3118} 3118}
3119 3119
3120#ifdef CONFIG_NET_LL_RX_POLL 3120#ifdef CONFIG_NET_RX_BUSY_POLL
3121/* must be called with local_bh_disable()d */ 3121/* must be called with local_bh_disable()d */
3122int bnx2x_low_latency_recv(struct napi_struct *napi) 3122int bnx2x_low_latency_recv(struct napi_struct *napi)
3123{ 3123{
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index e5da07858a2f..e06186c305d8 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -12026,7 +12026,7 @@ static const struct net_device_ops bnx2x_netdev_ops = {
12026 .ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn, 12026 .ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn,
12027#endif 12027#endif
12028 12028
12029#ifdef CONFIG_NET_LL_RX_POLL 12029#ifdef CONFIG_NET_RX_BUSY_POLL
12030 .ndo_busy_poll = bnx2x_low_latency_recv, 12030 .ndo_busy_poll = bnx2x_low_latency_recv,
12031#endif 12031#endif
12032}; 12032};
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index 7be725cdfea8..a6494e5daffe 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -54,7 +54,7 @@
54 54
55#include <net/busy_poll.h> 55#include <net/busy_poll.h>
56 56
57#ifdef CONFIG_NET_LL_RX_POLL 57#ifdef CONFIG_NET_RX_BUSY_POLL
58#define LL_EXTENDED_STATS 58#define LL_EXTENDED_STATS
59#endif 59#endif
60/* common prefix used by pr_<> macros */ 60/* common prefix used by pr_<> macros */
@@ -366,7 +366,7 @@ struct ixgbe_q_vector {
366 struct rcu_head rcu; /* to avoid race with update stats on free */ 366 struct rcu_head rcu; /* to avoid race with update stats on free */
367 char name[IFNAMSIZ + 9]; 367 char name[IFNAMSIZ + 9];
368 368
369#ifdef CONFIG_NET_LL_RX_POLL 369#ifdef CONFIG_NET_RX_BUSY_POLL
370 unsigned int state; 370 unsigned int state;
371#define IXGBE_QV_STATE_IDLE 0 371#define IXGBE_QV_STATE_IDLE 0
372#define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */ 372#define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */
@@ -377,12 +377,12 @@ struct ixgbe_q_vector {
377#define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD) 377#define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD)
378#define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD) 378#define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD)
379 spinlock_t lock; 379 spinlock_t lock;
380#endif /* CONFIG_NET_LL_RX_POLL */ 380#endif /* CONFIG_NET_RX_BUSY_POLL */
381 381
382 /* for dynamic allocation of rings associated with this q_vector */ 382 /* for dynamic allocation of rings associated with this q_vector */
383 struct ixgbe_ring ring[0] ____cacheline_internodealigned_in_smp; 383 struct ixgbe_ring ring[0] ____cacheline_internodealigned_in_smp;
384}; 384};
385#ifdef CONFIG_NET_LL_RX_POLL 385#ifdef CONFIG_NET_RX_BUSY_POLL
386static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) 386static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector)
387{ 387{
388 388
@@ -462,7 +462,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector)
462 WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED)); 462 WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED));
463 return q_vector->state & IXGBE_QV_USER_PEND; 463 return q_vector->state & IXGBE_QV_USER_PEND;
464} 464}
465#else /* CONFIG_NET_LL_RX_POLL */ 465#else /* CONFIG_NET_RX_BUSY_POLL */
466static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector) 466static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector)
467{ 467{
468} 468}
@@ -491,7 +491,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector)
491{ 491{
492 return false; 492 return false;
493} 493}
494#endif /* CONFIG_NET_LL_RX_POLL */ 494#endif /* CONFIG_NET_RX_BUSY_POLL */
495 495
496#ifdef CONFIG_IXGBE_HWMON 496#ifdef CONFIG_IXGBE_HWMON
497 497
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index bad8f14b1941..be4b1fb3d0d2 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -1998,7 +1998,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
1998 return total_rx_packets; 1998 return total_rx_packets;
1999} 1999}
2000 2000
2001#ifdef CONFIG_NET_LL_RX_POLL 2001#ifdef CONFIG_NET_RX_BUSY_POLL
2002/* must be called with local_bh_disable()d */ 2002/* must be called with local_bh_disable()d */
2003static int ixgbe_low_latency_recv(struct napi_struct *napi) 2003static int ixgbe_low_latency_recv(struct napi_struct *napi)
2004{ 2004{
@@ -2030,7 +2030,7 @@ static int ixgbe_low_latency_recv(struct napi_struct *napi)
2030 2030
2031 return found; 2031 return found;
2032} 2032}
2033#endif /* CONFIG_NET_LL_RX_POLL */ 2033#endif /* CONFIG_NET_RX_BUSY_POLL */
2034 2034
2035/** 2035/**
2036 * ixgbe_configure_msix - Configure MSI-X hardware 2036 * ixgbe_configure_msix - Configure MSI-X hardware
@@ -7227,7 +7227,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
7227#ifdef CONFIG_NET_POLL_CONTROLLER 7227#ifdef CONFIG_NET_POLL_CONTROLLER
7228 .ndo_poll_controller = ixgbe_netpoll, 7228 .ndo_poll_controller = ixgbe_netpoll,
7229#endif 7229#endif
7230#ifdef CONFIG_NET_LL_RX_POLL 7230#ifdef CONFIG_NET_RX_BUSY_POLL
7231 .ndo_busy_poll = ixgbe_low_latency_recv, 7231 .ndo_busy_poll = ixgbe_low_latency_recv,
7232#endif 7232#endif
7233#ifdef IXGBE_FCOE 7233#ifdef IXGBE_FCOE
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index 727874f575ce..a28cd801a236 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -223,7 +223,7 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
223 case ETH_SS_STATS: 223 case ETH_SS_STATS:
224 return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) + 224 return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) +
225 (priv->tx_ring_num * 2) + 225 (priv->tx_ring_num * 2) +
226#ifdef CONFIG_NET_LL_RX_POLL 226#ifdef CONFIG_NET_RX_BUSY_POLL
227 (priv->rx_ring_num * 5); 227 (priv->rx_ring_num * 5);
228#else 228#else
229 (priv->rx_ring_num * 2); 229 (priv->rx_ring_num * 2);
@@ -276,7 +276,7 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
276 for (i = 0; i < priv->rx_ring_num; i++) { 276 for (i = 0; i < priv->rx_ring_num; i++) {
277 data[index++] = priv->rx_ring[i].packets; 277 data[index++] = priv->rx_ring[i].packets;
278 data[index++] = priv->rx_ring[i].bytes; 278 data[index++] = priv->rx_ring[i].bytes;
279#ifdef CONFIG_NET_LL_RX_POLL 279#ifdef CONFIG_NET_RX_BUSY_POLL
280 data[index++] = priv->rx_ring[i].yields; 280 data[index++] = priv->rx_ring[i].yields;
281 data[index++] = priv->rx_ring[i].misses; 281 data[index++] = priv->rx_ring[i].misses;
282 data[index++] = priv->rx_ring[i].cleaned; 282 data[index++] = priv->rx_ring[i].cleaned;
@@ -344,7 +344,7 @@ static void mlx4_en_get_strings(struct net_device *dev,
344 "rx%d_packets", i); 344 "rx%d_packets", i);
345 sprintf(data + (index++) * ETH_GSTRING_LEN, 345 sprintf(data + (index++) * ETH_GSTRING_LEN,
346 "rx%d_bytes", i); 346 "rx%d_bytes", i);
347#ifdef CONFIG_NET_LL_RX_POLL 347#ifdef CONFIG_NET_RX_BUSY_POLL
348 sprintf(data + (index++) * ETH_GSTRING_LEN, 348 sprintf(data + (index++) * ETH_GSTRING_LEN,
349 "rx%d_napi_yield", i); 349 "rx%d_napi_yield", i);
350 sprintf(data + (index++) * ETH_GSTRING_LEN, 350 sprintf(data + (index++) * ETH_GSTRING_LEN,
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 5eac871399d8..fa37b7a61213 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -68,7 +68,7 @@ int mlx4_en_setup_tc(struct net_device *dev, u8 up)
68 return 0; 68 return 0;
69} 69}
70 70
71#ifdef CONFIG_NET_LL_RX_POLL 71#ifdef CONFIG_NET_RX_BUSY_POLL
72/* must be called with local_bh_disable()d */ 72/* must be called with local_bh_disable()d */
73static int mlx4_en_low_latency_recv(struct napi_struct *napi) 73static int mlx4_en_low_latency_recv(struct napi_struct *napi)
74{ 74{
@@ -94,7 +94,7 @@ static int mlx4_en_low_latency_recv(struct napi_struct *napi)
94 94
95 return done; 95 return done;
96} 96}
97#endif /* CONFIG_NET_LL_RX_POLL */ 97#endif /* CONFIG_NET_RX_BUSY_POLL */
98 98
99#ifdef CONFIG_RFS_ACCEL 99#ifdef CONFIG_RFS_ACCEL
100 100
@@ -2140,7 +2140,7 @@ static const struct net_device_ops mlx4_netdev_ops = {
2140#ifdef CONFIG_RFS_ACCEL 2140#ifdef CONFIG_RFS_ACCEL
2141 .ndo_rx_flow_steer = mlx4_en_filter_rfs, 2141 .ndo_rx_flow_steer = mlx4_en_filter_rfs,
2142#endif 2142#endif
2143#ifdef CONFIG_NET_LL_RX_POLL 2143#ifdef CONFIG_NET_RX_BUSY_POLL
2144 .ndo_busy_poll = mlx4_en_low_latency_recv, 2144 .ndo_busy_poll = mlx4_en_low_latency_recv,
2145#endif 2145#endif
2146}; 2146};
diff --git a/drivers/net/ethernet/mellanox/mlx4/fw.c b/drivers/net/ethernet/mellanox/mlx4/fw.c
index 8873d6802c80..6fc6dabc78d5 100644
--- a/drivers/net/ethernet/mellanox/mlx4/fw.c
+++ b/drivers/net/ethernet/mellanox/mlx4/fw.c
@@ -845,16 +845,7 @@ int mlx4_QUERY_PORT_wrapper(struct mlx4_dev *dev, int slave,
845 MLX4_CMD_NATIVE); 845 MLX4_CMD_NATIVE);
846 846
847 if (!err && dev->caps.function != slave) { 847 if (!err && dev->caps.function != slave) {
848 /* if config MAC in DB use it */ 848 def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac;
849 if (priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac)
850 def_mac = priv->mfunc.master.vf_oper[slave].vport[vhcr->in_modifier].state.mac;
851 else {
852 /* set slave default_mac address */
853 MLX4_GET(def_mac, outbox->buf, QUERY_PORT_MAC_OFFSET);
854 def_mac += slave << 8;
855 priv->mfunc.master.vf_admin[slave].vport[vhcr->in_modifier].mac = def_mac;
856 }
857
858 MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET); 849 MLX4_PUT(outbox->buf, def_mac, QUERY_PORT_MAC_OFFSET);
859 850
860 /* get port type - currently only eth is enabled */ 851 /* get port type - currently only eth is enabled */
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index e85af922dcdc..36be3208786a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -371,7 +371,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
371 371
372 dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0; 372 dev->caps.sqp_demux = (mlx4_is_master(dev)) ? MLX4_MAX_NUM_SLAVES : 0;
373 373
374 if (!enable_64b_cqe_eqe) { 374 if (!enable_64b_cqe_eqe && !mlx4_is_slave(dev)) {
375 if (dev_cap->flags & 375 if (dev_cap->flags &
376 (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) { 376 (MLX4_DEV_CAP_FLAG_64B_CQE | MLX4_DEV_CAP_FLAG_64B_EQE)) {
377 mlx4_warn(dev, "64B EQEs/CQEs supported by the device but not enabled\n"); 377 mlx4_warn(dev, "64B EQEs/CQEs supported by the device but not enabled\n");
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 35fb60e2320c..5e0aa569306a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -292,7 +292,7 @@ struct mlx4_en_rx_ring {
292 void *rx_info; 292 void *rx_info;
293 unsigned long bytes; 293 unsigned long bytes;
294 unsigned long packets; 294 unsigned long packets;
295#ifdef CONFIG_NET_LL_RX_POLL 295#ifdef CONFIG_NET_RX_BUSY_POLL
296 unsigned long yields; 296 unsigned long yields;
297 unsigned long misses; 297 unsigned long misses;
298 unsigned long cleaned; 298 unsigned long cleaned;
@@ -318,7 +318,7 @@ struct mlx4_en_cq {
318 struct mlx4_cqe *buf; 318 struct mlx4_cqe *buf;
319#define MLX4_EN_OPCODE_ERROR 0x1e 319#define MLX4_EN_OPCODE_ERROR 0x1e
320 320
321#ifdef CONFIG_NET_LL_RX_POLL 321#ifdef CONFIG_NET_RX_BUSY_POLL
322 unsigned int state; 322 unsigned int state;
323#define MLX4_EN_CQ_STATE_IDLE 0 323#define MLX4_EN_CQ_STATE_IDLE 0
324#define MLX4_EN_CQ_STATE_NAPI 1 /* NAPI owns this CQ */ 324#define MLX4_EN_CQ_STATE_NAPI 1 /* NAPI owns this CQ */
@@ -329,7 +329,7 @@ struct mlx4_en_cq {
329#define CQ_YIELD (MLX4_EN_CQ_STATE_NAPI_YIELD | MLX4_EN_CQ_STATE_POLL_YIELD) 329#define CQ_YIELD (MLX4_EN_CQ_STATE_NAPI_YIELD | MLX4_EN_CQ_STATE_POLL_YIELD)
330#define CQ_USER_PEND (MLX4_EN_CQ_STATE_POLL | MLX4_EN_CQ_STATE_POLL_YIELD) 330#define CQ_USER_PEND (MLX4_EN_CQ_STATE_POLL | MLX4_EN_CQ_STATE_POLL_YIELD)
331 spinlock_t poll_lock; /* protects from LLS/napi conflicts */ 331 spinlock_t poll_lock; /* protects from LLS/napi conflicts */
332#endif /* CONFIG_NET_LL_RX_POLL */ 332#endif /* CONFIG_NET_RX_BUSY_POLL */
333}; 333};
334 334
335struct mlx4_en_port_profile { 335struct mlx4_en_port_profile {
@@ -580,7 +580,7 @@ struct mlx4_mac_entry {
580 struct rcu_head rcu; 580 struct rcu_head rcu;
581}; 581};
582 582
583#ifdef CONFIG_NET_LL_RX_POLL 583#ifdef CONFIG_NET_RX_BUSY_POLL
584static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq) 584static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq)
585{ 585{
586 spin_lock_init(&cq->poll_lock); 586 spin_lock_init(&cq->poll_lock);
@@ -687,7 +687,7 @@ static inline bool mlx4_en_cq_ll_polling(struct mlx4_en_cq *cq)
687{ 687{
688 return false; 688 return false;
689} 689}
690#endif /* CONFIG_NET_LL_RX_POLL */ 690#endif /* CONFIG_NET_RX_BUSY_POLL */
691 691
692#define MLX4_EN_WOL_DO_MODIFY (1ULL << 63) 692#define MLX4_EN_WOL_DO_MODIFY (1ULL << 63)
693 693
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
index f4bb8f5d7453..221645e9f182 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h
@@ -1400,8 +1400,8 @@ void qlcnic_pci_camqm_write_2M(struct qlcnic_adapter *, u64, u64);
1400#define ADDR_IN_RANGE(addr, low, high) \ 1400#define ADDR_IN_RANGE(addr, low, high) \
1401 (((addr) < (high)) && ((addr) >= (low))) 1401 (((addr) < (high)) && ((addr) >= (low)))
1402 1402
1403#define QLCRD32(adapter, off) \ 1403#define QLCRD32(adapter, off, err) \
1404 (adapter->ahw->hw_ops->read_reg)(adapter, off) 1404 (adapter->ahw->hw_ops->read_reg)(adapter, off, err)
1405 1405
1406#define QLCWR32(adapter, off, val) \ 1406#define QLCWR32(adapter, off, val) \
1407 adapter->ahw->hw_ops->write_reg(adapter, off, val) 1407 adapter->ahw->hw_ops->write_reg(adapter, off, val)
@@ -1604,7 +1604,7 @@ struct qlcnic_nic_template {
1604struct qlcnic_hardware_ops { 1604struct qlcnic_hardware_ops {
1605 void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); 1605 void (*read_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
1606 void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t); 1606 void (*write_crb) (struct qlcnic_adapter *, char *, loff_t, size_t);
1607 int (*read_reg) (struct qlcnic_adapter *, ulong); 1607 int (*read_reg) (struct qlcnic_adapter *, ulong, int *);
1608 int (*write_reg) (struct qlcnic_adapter *, ulong, u32); 1608 int (*write_reg) (struct qlcnic_adapter *, ulong, u32);
1609 void (*get_ocm_win) (struct qlcnic_hardware_context *); 1609 void (*get_ocm_win) (struct qlcnic_hardware_context *);
1610 int (*get_mac_address) (struct qlcnic_adapter *, u8 *); 1610 int (*get_mac_address) (struct qlcnic_adapter *, u8 *);
@@ -1662,12 +1662,6 @@ static inline void qlcnic_write_crb(struct qlcnic_adapter *adapter, char *buf,
1662 adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size); 1662 adapter->ahw->hw_ops->write_crb(adapter, buf, offset, size);
1663} 1663}
1664 1664
1665static inline int qlcnic_hw_read_wx_2M(struct qlcnic_adapter *adapter,
1666 ulong off)
1667{
1668 return adapter->ahw->hw_ops->read_reg(adapter, off);
1669}
1670
1671static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter, 1665static inline int qlcnic_hw_write_wx_2M(struct qlcnic_adapter *adapter,
1672 ulong off, u32 data) 1666 ulong off, u32 data)
1673{ 1667{
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
index bc483e1881a3..92da9980a0a0 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c
@@ -228,17 +228,17 @@ static int __qlcnic_set_win_base(struct qlcnic_adapter *adapter, u32 addr)
228 return 0; 228 return 0;
229} 229}
230 230
231int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr) 231int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *adapter, ulong addr,
232 int *err)
232{ 233{
233 int ret;
234 struct qlcnic_hardware_context *ahw = adapter->ahw; 234 struct qlcnic_hardware_context *ahw = adapter->ahw;
235 235
236 ret = __qlcnic_set_win_base(adapter, (u32) addr); 236 *err = __qlcnic_set_win_base(adapter, (u32) addr);
237 if (!ret) { 237 if (!*err) {
238 return QLCRDX(ahw, QLCNIC_WILDCARD); 238 return QLCRDX(ahw, QLCNIC_WILDCARD);
239 } else { 239 } else {
240 dev_err(&adapter->pdev->dev, 240 dev_err(&adapter->pdev->dev,
241 "%s failed, addr = 0x%x\n", __func__, (int)addr); 241 "%s failed, addr = 0x%lx\n", __func__, addr);
242 return -EIO; 242 return -EIO;
243 } 243 }
244} 244}
@@ -561,7 +561,7 @@ void qlcnic_83xx_cam_unlock(struct qlcnic_adapter *adapter)
561void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf, 561void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
562 loff_t offset, size_t size) 562 loff_t offset, size_t size)
563{ 563{
564 int ret; 564 int ret = 0;
565 u32 data; 565 u32 data;
566 566
567 if (qlcnic_api_lock(adapter)) { 567 if (qlcnic_api_lock(adapter)) {
@@ -571,7 +571,7 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
571 return; 571 return;
572 } 572 }
573 573
574 ret = qlcnic_83xx_rd_reg_indirect(adapter, (u32) offset); 574 data = QLCRD32(adapter, (u32) offset, &ret);
575 qlcnic_api_unlock(adapter); 575 qlcnic_api_unlock(adapter);
576 576
577 if (ret == -EIO) { 577 if (ret == -EIO) {
@@ -580,7 +580,6 @@ void qlcnic_83xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
580 __func__, (u32)offset); 580 __func__, (u32)offset);
581 return; 581 return;
582 } 582 }
583 data = ret;
584 memcpy(buf, &data, size); 583 memcpy(buf, &data, size);
585} 584}
586 585
@@ -2075,18 +2074,25 @@ void qlcnic_83xx_config_intr_coal(struct qlcnic_adapter *adapter)
2075static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, 2074static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter,
2076 u32 data[]) 2075 u32 data[])
2077{ 2076{
2077 struct qlcnic_hardware_context *ahw = adapter->ahw;
2078 u8 link_status, duplex; 2078 u8 link_status, duplex;
2079 /* link speed */ 2079 /* link speed */
2080 link_status = LSB(data[3]) & 1; 2080 link_status = LSB(data[3]) & 1;
2081 adapter->ahw->link_speed = MSW(data[2]); 2081 if (link_status) {
2082 adapter->ahw->link_autoneg = MSB(MSW(data[3])); 2082 ahw->link_speed = MSW(data[2]);
2083 adapter->ahw->module_type = MSB(LSW(data[3])); 2083 duplex = LSB(MSW(data[3]));
2084 duplex = LSB(MSW(data[3])); 2084 if (duplex)
2085 if (duplex) 2085 ahw->link_duplex = DUPLEX_FULL;
2086 adapter->ahw->link_duplex = DUPLEX_FULL; 2086 else
2087 else 2087 ahw->link_duplex = DUPLEX_HALF;
2088 adapter->ahw->link_duplex = DUPLEX_HALF; 2088 } else {
2089 adapter->ahw->has_link_events = 1; 2089 ahw->link_speed = SPEED_UNKNOWN;
2090 ahw->link_duplex = DUPLEX_UNKNOWN;
2091 }
2092
2093 ahw->link_autoneg = MSB(MSW(data[3]));
2094 ahw->module_type = MSB(LSW(data[3]));
2095 ahw->has_link_events = 1;
2090 qlcnic_advert_link_change(adapter, link_status); 2096 qlcnic_advert_link_change(adapter, link_status);
2091} 2097}
2092 2098
@@ -2384,9 +2390,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
2384 u32 flash_addr, u8 *p_data, 2390 u32 flash_addr, u8 *p_data,
2385 int count) 2391 int count)
2386{ 2392{
2387 int i, ret; 2393 u32 word, range, flash_offset, addr = flash_addr, ret;
2388 u32 word, range, flash_offset, addr = flash_addr;
2389 ulong indirect_add, direct_window; 2394 ulong indirect_add, direct_window;
2395 int i, err = 0;
2390 2396
2391 flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1); 2397 flash_offset = addr & (QLCNIC_FLASH_SECTOR_SIZE - 1);
2392 if (addr & 0x3) { 2398 if (addr & 0x3) {
@@ -2404,10 +2410,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
2404 /* Multi sector read */ 2410 /* Multi sector read */
2405 for (i = 0; i < count; i++) { 2411 for (i = 0; i < count; i++) {
2406 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); 2412 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
2407 ret = qlcnic_83xx_rd_reg_indirect(adapter, 2413 ret = QLCRD32(adapter, indirect_add, &err);
2408 indirect_add); 2414 if (err == -EIO)
2409 if (ret == -EIO) 2415 return err;
2410 return -EIO;
2411 2416
2412 word = ret; 2417 word = ret;
2413 *(u32 *)p_data = word; 2418 *(u32 *)p_data = word;
@@ -2428,10 +2433,9 @@ int qlcnic_83xx_lockless_flash_read32(struct qlcnic_adapter *adapter,
2428 /* Single sector read */ 2433 /* Single sector read */
2429 for (i = 0; i < count; i++) { 2434 for (i = 0; i < count; i++) {
2430 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr); 2435 indirect_add = QLC_83XX_FLASH_DIRECT_DATA(addr);
2431 ret = qlcnic_83xx_rd_reg_indirect(adapter, 2436 ret = QLCRD32(adapter, indirect_add, &err);
2432 indirect_add); 2437 if (err == -EIO)
2433 if (ret == -EIO) 2438 return err;
2434 return -EIO;
2435 2439
2436 word = ret; 2440 word = ret;
2437 *(u32 *)p_data = word; 2441 *(u32 *)p_data = word;
@@ -2447,10 +2451,13 @@ static int qlcnic_83xx_poll_flash_status_reg(struct qlcnic_adapter *adapter)
2447{ 2451{
2448 u32 status; 2452 u32 status;
2449 int retries = QLC_83XX_FLASH_READ_RETRY_COUNT; 2453 int retries = QLC_83XX_FLASH_READ_RETRY_COUNT;
2454 int err = 0;
2450 2455
2451 do { 2456 do {
2452 status = qlcnic_83xx_rd_reg_indirect(adapter, 2457 status = QLCRD32(adapter, QLC_83XX_FLASH_STATUS, &err);
2453 QLC_83XX_FLASH_STATUS); 2458 if (err == -EIO)
2459 return err;
2460
2454 if ((status & QLC_83XX_FLASH_STATUS_READY) == 2461 if ((status & QLC_83XX_FLASH_STATUS_READY) ==
2455 QLC_83XX_FLASH_STATUS_READY) 2462 QLC_83XX_FLASH_STATUS_READY)
2456 break; 2463 break;
@@ -2502,7 +2509,8 @@ int qlcnic_83xx_disable_flash_write(struct qlcnic_adapter *adapter)
2502 2509
2503int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter) 2510int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
2504{ 2511{
2505 int ret, mfg_id; 2512 int ret, err = 0;
2513 u32 mfg_id;
2506 2514
2507 if (qlcnic_83xx_lock_flash(adapter)) 2515 if (qlcnic_83xx_lock_flash(adapter))
2508 return -EIO; 2516 return -EIO;
@@ -2517,9 +2525,11 @@ int qlcnic_83xx_read_flash_mfg_id(struct qlcnic_adapter *adapter)
2517 return -EIO; 2525 return -EIO;
2518 } 2526 }
2519 2527
2520 mfg_id = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA); 2528 mfg_id = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
2521 if (mfg_id == -EIO) 2529 if (err == -EIO) {
2522 return -EIO; 2530 qlcnic_83xx_unlock_flash(adapter);
2531 return err;
2532 }
2523 2533
2524 adapter->flash_mfg_id = (mfg_id & 0xFF); 2534 adapter->flash_mfg_id = (mfg_id & 0xFF);
2525 qlcnic_83xx_unlock_flash(adapter); 2535 qlcnic_83xx_unlock_flash(adapter);
@@ -2636,7 +2646,7 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
2636 u32 *p_data, int count) 2646 u32 *p_data, int count)
2637{ 2647{
2638 u32 temp; 2648 u32 temp;
2639 int ret = -EIO; 2649 int ret = -EIO, err = 0;
2640 2650
2641 if ((count < QLC_83XX_FLASH_WRITE_MIN) || 2651 if ((count < QLC_83XX_FLASH_WRITE_MIN) ||
2642 (count > QLC_83XX_FLASH_WRITE_MAX)) { 2652 (count > QLC_83XX_FLASH_WRITE_MAX)) {
@@ -2645,8 +2655,10 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
2645 return -EIO; 2655 return -EIO;
2646 } 2656 }
2647 2657
2648 temp = qlcnic_83xx_rd_reg_indirect(adapter, 2658 temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
2649 QLC_83XX_FLASH_SPI_CONTROL); 2659 if (err == -EIO)
2660 return err;
2661
2650 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL, 2662 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_SPI_CONTROL,
2651 (temp | QLC_83XX_FLASH_SPI_CTRL)); 2663 (temp | QLC_83XX_FLASH_SPI_CTRL));
2652 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 2664 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
@@ -2695,13 +2707,18 @@ int qlcnic_83xx_flash_bulk_write(struct qlcnic_adapter *adapter, u32 addr,
2695 return -EIO; 2707 return -EIO;
2696 } 2708 }
2697 2709
2698 ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_SPI_STATUS); 2710 ret = QLCRD32(adapter, QLC_83XX_FLASH_SPI_STATUS, &err);
2711 if (err == -EIO)
2712 return err;
2713
2699 if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) { 2714 if ((ret & QLC_83XX_FLASH_SPI_CTRL) == QLC_83XX_FLASH_SPI_CTRL) {
2700 dev_err(&adapter->pdev->dev, "%s: failed at %d\n", 2715 dev_err(&adapter->pdev->dev, "%s: failed at %d\n",
2701 __func__, __LINE__); 2716 __func__, __LINE__);
2702 /* Operation failed, clear error bit */ 2717 /* Operation failed, clear error bit */
2703 temp = qlcnic_83xx_rd_reg_indirect(adapter, 2718 temp = QLCRD32(adapter, QLC_83XX_FLASH_SPI_CONTROL, &err);
2704 QLC_83XX_FLASH_SPI_CONTROL); 2719 if (err == -EIO)
2720 return err;
2721
2705 qlcnic_83xx_wrt_reg_indirect(adapter, 2722 qlcnic_83xx_wrt_reg_indirect(adapter,
2706 QLC_83XX_FLASH_SPI_CONTROL, 2723 QLC_83XX_FLASH_SPI_CONTROL,
2707 (temp | QLC_83XX_FLASH_SPI_CTRL)); 2724 (temp | QLC_83XX_FLASH_SPI_CTRL));
@@ -2823,6 +2840,7 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
2823{ 2840{
2824 int i, j, ret = 0; 2841 int i, j, ret = 0;
2825 u32 temp; 2842 u32 temp;
2843 int err = 0;
2826 2844
2827 /* Check alignment */ 2845 /* Check alignment */
2828 if (addr & 0xF) 2846 if (addr & 0xF)
@@ -2855,8 +2873,12 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
2855 QLCNIC_TA_WRITE_START); 2873 QLCNIC_TA_WRITE_START);
2856 2874
2857 for (j = 0; j < MAX_CTL_CHECK; j++) { 2875 for (j = 0; j < MAX_CTL_CHECK; j++) {
2858 temp = qlcnic_83xx_rd_reg_indirect(adapter, 2876 temp = QLCRD32(adapter, QLCNIC_MS_CTRL, &err);
2859 QLCNIC_MS_CTRL); 2877 if (err == -EIO) {
2878 mutex_unlock(&adapter->ahw->mem_lock);
2879 return err;
2880 }
2881
2860 if ((temp & TA_CTL_BUSY) == 0) 2882 if ((temp & TA_CTL_BUSY) == 0)
2861 break; 2883 break;
2862 } 2884 }
@@ -2878,9 +2900,9 @@ int qlcnic_83xx_ms_mem_write128(struct qlcnic_adapter *adapter, u64 addr,
2878int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr, 2900int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
2879 u8 *p_data, int count) 2901 u8 *p_data, int count)
2880{ 2902{
2881 int i, ret; 2903 u32 word, addr = flash_addr, ret;
2882 u32 word, addr = flash_addr;
2883 ulong indirect_addr; 2904 ulong indirect_addr;
2905 int i, err = 0;
2884 2906
2885 if (qlcnic_83xx_lock_flash(adapter) != 0) 2907 if (qlcnic_83xx_lock_flash(adapter) != 0)
2886 return -EIO; 2908 return -EIO;
@@ -2900,10 +2922,10 @@ int qlcnic_83xx_flash_read32(struct qlcnic_adapter *adapter, u32 flash_addr,
2900 } 2922 }
2901 2923
2902 indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr); 2924 indirect_addr = QLC_83XX_FLASH_DIRECT_DATA(addr);
2903 ret = qlcnic_83xx_rd_reg_indirect(adapter, 2925 ret = QLCRD32(adapter, indirect_addr, &err);
2904 indirect_addr); 2926 if (err == -EIO)
2905 if (ret == -EIO) 2927 return err;
2906 return -EIO; 2928
2907 word = ret; 2929 word = ret;
2908 *(u32 *)p_data = word; 2930 *(u32 *)p_data = word;
2909 p_data = p_data + 4; 2931 p_data = p_data + 4;
@@ -3369,7 +3391,8 @@ int qlcnic_83xx_set_pauseparam(struct qlcnic_adapter *adapter,
3369 3391
3370static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter) 3392static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
3371{ 3393{
3372 int ret; 3394 int ret, err = 0;
3395 u32 temp;
3373 3396
3374 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR, 3397 qlcnic_83xx_wrt_reg_indirect(adapter, QLC_83XX_FLASH_ADDR,
3375 QLC_83XX_FLASH_OEM_READ_SIG); 3398 QLC_83XX_FLASH_OEM_READ_SIG);
@@ -3379,8 +3402,11 @@ static int qlcnic_83xx_read_flash_status_reg(struct qlcnic_adapter *adapter)
3379 if (ret) 3402 if (ret)
3380 return -EIO; 3403 return -EIO;
3381 3404
3382 ret = qlcnic_83xx_rd_reg_indirect(adapter, QLC_83XX_FLASH_RDDATA); 3405 temp = QLCRD32(adapter, QLC_83XX_FLASH_RDDATA, &err);
3383 return ret & 0xFF; 3406 if (err == -EIO)
3407 return err;
3408
3409 return temp & 0xFF;
3384} 3410}
3385 3411
3386int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter) 3412int qlcnic_83xx_flash_test(struct qlcnic_adapter *adapter)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
index 2548d1403d75..272f56a2e14b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h
@@ -508,7 +508,7 @@ void qlcnic_83xx_add_sysfs(struct qlcnic_adapter *);
508void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *); 508void qlcnic_83xx_remove_sysfs(struct qlcnic_adapter *);
509void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t); 509void qlcnic_83xx_write_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
510void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t); 510void qlcnic_83xx_read_crb(struct qlcnic_adapter *, char *, loff_t, size_t);
511int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong); 511int qlcnic_83xx_rd_reg_indirect(struct qlcnic_adapter *, ulong, int *);
512int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32); 512int qlcnic_83xx_wrt_reg_indirect(struct qlcnic_adapter *, ulong, u32);
513void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []); 513void qlcnic_83xx_process_rcv_diag(struct qlcnic_adapter *, int, u64 []);
514int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32); 514int qlcnic_83xx_nic_set_promisc(struct qlcnic_adapter *, u32);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
index 51ab4b56fc91..9f4b8d5f0865 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
@@ -1303,8 +1303,11 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
1303{ 1303{
1304 int i, j; 1304 int i, j;
1305 u32 val = 0, val1 = 0, reg = 0; 1305 u32 val = 0, val1 = 0, reg = 0;
1306 int err = 0;
1306 1307
1307 val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG); 1308 val = QLCRD32(adapter, QLC_83XX_SRE_SHIM_REG, &err);
1309 if (err == -EIO)
1310 return;
1308 dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val); 1311 dev_info(&adapter->pdev->dev, "SRE-Shim Ctrl:0x%x\n", val);
1309 1312
1310 for (j = 0; j < 2; j++) { 1313 for (j = 0; j < 2; j++) {
@@ -1318,7 +1321,9 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
1318 reg = QLC_83XX_PORT1_THRESHOLD; 1321 reg = QLC_83XX_PORT1_THRESHOLD;
1319 } 1322 }
1320 for (i = 0; i < 8; i++) { 1323 for (i = 0; i < 8; i++) {
1321 val = QLCRD32(adapter, reg + (i * 0x4)); 1324 val = QLCRD32(adapter, reg + (i * 0x4), &err);
1325 if (err == -EIO)
1326 return;
1322 dev_info(&adapter->pdev->dev, "0x%x ", val); 1327 dev_info(&adapter->pdev->dev, "0x%x ", val);
1323 } 1328 }
1324 dev_info(&adapter->pdev->dev, "\n"); 1329 dev_info(&adapter->pdev->dev, "\n");
@@ -1335,8 +1340,10 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
1335 reg = QLC_83XX_PORT1_TC_MC_REG; 1340 reg = QLC_83XX_PORT1_TC_MC_REG;
1336 } 1341 }
1337 for (i = 0; i < 4; i++) { 1342 for (i = 0; i < 4; i++) {
1338 val = QLCRD32(adapter, reg + (i * 0x4)); 1343 val = QLCRD32(adapter, reg + (i * 0x4), &err);
1339 dev_info(&adapter->pdev->dev, "0x%x ", val); 1344 if (err == -EIO)
1345 return;
1346 dev_info(&adapter->pdev->dev, "0x%x ", val);
1340 } 1347 }
1341 dev_info(&adapter->pdev->dev, "\n"); 1348 dev_info(&adapter->pdev->dev, "\n");
1342 } 1349 }
@@ -1352,17 +1359,25 @@ static void qlcnic_83xx_dump_pause_control_regs(struct qlcnic_adapter *adapter)
1352 reg = QLC_83XX_PORT1_TC_STATS; 1359 reg = QLC_83XX_PORT1_TC_STATS;
1353 } 1360 }
1354 for (i = 7; i >= 0; i--) { 1361 for (i = 7; i >= 0; i--) {
1355 val = QLCRD32(adapter, reg); 1362 val = QLCRD32(adapter, reg, &err);
1363 if (err == -EIO)
1364 return;
1356 val &= ~(0x7 << 29); /* Reset bits 29 to 31 */ 1365 val &= ~(0x7 << 29); /* Reset bits 29 to 31 */
1357 QLCWR32(adapter, reg, (val | (i << 29))); 1366 QLCWR32(adapter, reg, (val | (i << 29)));
1358 val = QLCRD32(adapter, reg); 1367 val = QLCRD32(adapter, reg, &err);
1368 if (err == -EIO)
1369 return;
1359 dev_info(&adapter->pdev->dev, "0x%x ", val); 1370 dev_info(&adapter->pdev->dev, "0x%x ", val);
1360 } 1371 }
1361 dev_info(&adapter->pdev->dev, "\n"); 1372 dev_info(&adapter->pdev->dev, "\n");
1362 } 1373 }
1363 1374
1364 val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD); 1375 val = QLCRD32(adapter, QLC_83XX_PORT2_IFB_THRESHOLD, &err);
1365 val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD); 1376 if (err == -EIO)
1377 return;
1378 val1 = QLCRD32(adapter, QLC_83XX_PORT3_IFB_THRESHOLD, &err);
1379 if (err == -EIO)
1380 return;
1366 dev_info(&adapter->pdev->dev, 1381 dev_info(&adapter->pdev->dev,
1367 "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n", 1382 "IFB-Pause Thresholds: Port 2:0x%x, Port 3:0x%x\n",
1368 val, val1); 1383 val, val1);
@@ -1425,7 +1440,7 @@ static void qlcnic_83xx_take_eport_out_of_reset(struct qlcnic_adapter *adapter)
1425static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev) 1440static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
1426{ 1441{
1427 u32 heartbeat, peg_status; 1442 u32 heartbeat, peg_status;
1428 int retries, ret = -EIO; 1443 int retries, ret = -EIO, err = 0;
1429 1444
1430 retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT; 1445 retries = QLCNIC_HEARTBEAT_CHECK_RETRY_COUNT;
1431 p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev, 1446 p_dev->heartbeat = QLC_SHARED_REG_RD32(p_dev,
@@ -1453,11 +1468,11 @@ static int qlcnic_83xx_check_heartbeat(struct qlcnic_adapter *p_dev)
1453 "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n" 1468 "PEG_NET_2_PC: 0x%x, PEG_NET_3_PC: 0x%x,\n"
1454 "PEG_NET_4_PC: 0x%x\n", peg_status, 1469 "PEG_NET_4_PC: 0x%x\n", peg_status,
1455 QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2), 1470 QLC_SHARED_REG_RD32(p_dev, QLCNIC_PEG_HALT_STATUS2),
1456 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0), 1471 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_0, &err),
1457 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1), 1472 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_1, &err),
1458 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2), 1473 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_2, &err),
1459 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3), 1474 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_3, &err),
1460 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4)); 1475 QLCRD32(p_dev, QLC_83XX_CRB_PEG_NET_4, &err));
1461 1476
1462 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) 1477 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
1463 dev_err(&p_dev->pdev->dev, 1478 dev_err(&p_dev->pdev->dev,
@@ -1501,18 +1516,22 @@ int qlcnic_83xx_check_hw_status(struct qlcnic_adapter *p_dev)
1501static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr, 1516static int qlcnic_83xx_poll_reg(struct qlcnic_adapter *p_dev, u32 addr,
1502 int duration, u32 mask, u32 status) 1517 int duration, u32 mask, u32 status)
1503{ 1518{
1519 int timeout_error, err = 0;
1504 u32 value; 1520 u32 value;
1505 int timeout_error;
1506 u8 retries; 1521 u8 retries;
1507 1522
1508 value = qlcnic_83xx_rd_reg_indirect(p_dev, addr); 1523 value = QLCRD32(p_dev, addr, &err);
1524 if (err == -EIO)
1525 return err;
1509 retries = duration / 10; 1526 retries = duration / 10;
1510 1527
1511 do { 1528 do {
1512 if ((value & mask) != status) { 1529 if ((value & mask) != status) {
1513 timeout_error = 1; 1530 timeout_error = 1;
1514 msleep(duration / 10); 1531 msleep(duration / 10);
1515 value = qlcnic_83xx_rd_reg_indirect(p_dev, addr); 1532 value = QLCRD32(p_dev, addr, &err);
1533 if (err == -EIO)
1534 return err;
1516 } else { 1535 } else {
1517 timeout_error = 0; 1536 timeout_error = 0;
1518 break; 1537 break;
@@ -1606,9 +1625,12 @@ int qlcnic_83xx_get_reset_instruction_template(struct qlcnic_adapter *p_dev)
1606static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev, 1625static void qlcnic_83xx_read_write_crb_reg(struct qlcnic_adapter *p_dev,
1607 u32 raddr, u32 waddr) 1626 u32 raddr, u32 waddr)
1608{ 1627{
1609 int value; 1628 int err = 0;
1629 u32 value;
1610 1630
1611 value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr); 1631 value = QLCRD32(p_dev, raddr, &err);
1632 if (err == -EIO)
1633 return;
1612 qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value); 1634 qlcnic_83xx_wrt_reg_indirect(p_dev, waddr, value);
1613} 1635}
1614 1636
@@ -1617,12 +1639,16 @@ static void qlcnic_83xx_rmw_crb_reg(struct qlcnic_adapter *p_dev,
1617 u32 raddr, u32 waddr, 1639 u32 raddr, u32 waddr,
1618 struct qlc_83xx_rmw *p_rmw_hdr) 1640 struct qlc_83xx_rmw *p_rmw_hdr)
1619{ 1641{
1620 int value; 1642 int err = 0;
1643 u32 value;
1621 1644
1622 if (p_rmw_hdr->index_a) 1645 if (p_rmw_hdr->index_a) {
1623 value = p_dev->ahw->reset.array[p_rmw_hdr->index_a]; 1646 value = p_dev->ahw->reset.array[p_rmw_hdr->index_a];
1624 else 1647 } else {
1625 value = qlcnic_83xx_rd_reg_indirect(p_dev, raddr); 1648 value = QLCRD32(p_dev, raddr, &err);
1649 if (err == -EIO)
1650 return;
1651 }
1626 1652
1627 value &= p_rmw_hdr->mask; 1653 value &= p_rmw_hdr->mask;
1628 value <<= p_rmw_hdr->shl; 1654 value <<= p_rmw_hdr->shl;
@@ -1675,7 +1701,7 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
1675 long delay; 1701 long delay;
1676 struct qlc_83xx_entry *entry; 1702 struct qlc_83xx_entry *entry;
1677 struct qlc_83xx_poll *poll; 1703 struct qlc_83xx_poll *poll;
1678 int i; 1704 int i, err = 0;
1679 unsigned long arg1, arg2; 1705 unsigned long arg1, arg2;
1680 1706
1681 poll = (struct qlc_83xx_poll *)((char *)p_hdr + 1707 poll = (struct qlc_83xx_poll *)((char *)p_hdr +
@@ -1699,10 +1725,12 @@ static void qlcnic_83xx_poll_list(struct qlcnic_adapter *p_dev,
1699 arg1, delay, 1725 arg1, delay,
1700 poll->mask, 1726 poll->mask,
1701 poll->status)){ 1727 poll->status)){
1702 qlcnic_83xx_rd_reg_indirect(p_dev, 1728 QLCRD32(p_dev, arg1, &err);
1703 arg1); 1729 if (err == -EIO)
1704 qlcnic_83xx_rd_reg_indirect(p_dev, 1730 return;
1705 arg2); 1731 QLCRD32(p_dev, arg2, &err);
1732 if (err == -EIO)
1733 return;
1706 } 1734 }
1707 } 1735 }
1708 } 1736 }
@@ -1768,7 +1796,7 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
1768 struct qlc_83xx_entry_hdr *p_hdr) 1796 struct qlc_83xx_entry_hdr *p_hdr)
1769{ 1797{
1770 long delay; 1798 long delay;
1771 int index, i, j; 1799 int index, i, j, err;
1772 struct qlc_83xx_quad_entry *entry; 1800 struct qlc_83xx_quad_entry *entry;
1773 struct qlc_83xx_poll *poll; 1801 struct qlc_83xx_poll *poll;
1774 unsigned long addr; 1802 unsigned long addr;
@@ -1788,7 +1816,10 @@ static void qlcnic_83xx_poll_read_list(struct qlcnic_adapter *p_dev,
1788 poll->mask, poll->status)){ 1816 poll->mask, poll->status)){
1789 index = p_dev->ahw->reset.array_index; 1817 index = p_dev->ahw->reset.array_index;
1790 addr = entry->dr_addr; 1818 addr = entry->dr_addr;
1791 j = qlcnic_83xx_rd_reg_indirect(p_dev, addr); 1819 j = QLCRD32(p_dev, addr, &err);
1820 if (err == -EIO)
1821 return;
1822
1792 p_dev->ahw->reset.array[index++] = j; 1823 p_dev->ahw->reset.array[index++] = j;
1793 1824
1794 if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES) 1825 if (index == QLC_83XX_MAX_RESET_SEQ_ENTRIES)
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
index 0581a484ceb5..d09389b33474 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ctx.c
@@ -104,7 +104,7 @@ static u32
104qlcnic_poll_rsp(struct qlcnic_adapter *adapter) 104qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
105{ 105{
106 u32 rsp; 106 u32 rsp;
107 int timeout = 0; 107 int timeout = 0, err = 0;
108 108
109 do { 109 do {
110 /* give atleast 1ms for firmware to respond */ 110 /* give atleast 1ms for firmware to respond */
@@ -113,7 +113,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
113 if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT) 113 if (++timeout > QLCNIC_OS_CRB_RETRY_COUNT)
114 return QLCNIC_CDRP_RSP_TIMEOUT; 114 return QLCNIC_CDRP_RSP_TIMEOUT;
115 115
116 rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET); 116 rsp = QLCRD32(adapter, QLCNIC_CDRP_CRB_OFFSET, &err);
117 } while (!QLCNIC_CDRP_IS_RSP(rsp)); 117 } while (!QLCNIC_CDRP_IS_RSP(rsp));
118 118
119 return rsp; 119 return rsp;
@@ -122,7 +122,7 @@ qlcnic_poll_rsp(struct qlcnic_adapter *adapter)
122int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter, 122int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
123 struct qlcnic_cmd_args *cmd) 123 struct qlcnic_cmd_args *cmd)
124{ 124{
125 int i; 125 int i, err = 0;
126 u32 rsp; 126 u32 rsp;
127 u32 signature; 127 u32 signature;
128 struct pci_dev *pdev = adapter->pdev; 128 struct pci_dev *pdev = adapter->pdev;
@@ -148,7 +148,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
148 dev_err(&pdev->dev, "card response timeout.\n"); 148 dev_err(&pdev->dev, "card response timeout.\n");
149 cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT; 149 cmd->rsp.arg[0] = QLCNIC_RCODE_TIMEOUT;
150 } else if (rsp == QLCNIC_CDRP_RSP_FAIL) { 150 } else if (rsp == QLCNIC_CDRP_RSP_FAIL) {
151 cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1)); 151 cmd->rsp.arg[0] = QLCRD32(adapter, QLCNIC_CDRP_ARG(1), &err);
152 switch (cmd->rsp.arg[0]) { 152 switch (cmd->rsp.arg[0]) {
153 case QLCNIC_RCODE_INVALID_ARGS: 153 case QLCNIC_RCODE_INVALID_ARGS:
154 fmt = "CDRP invalid args: [%d]\n"; 154 fmt = "CDRP invalid args: [%d]\n";
@@ -175,7 +175,7 @@ int qlcnic_82xx_issue_cmd(struct qlcnic_adapter *adapter,
175 cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS; 175 cmd->rsp.arg[0] = QLCNIC_RCODE_SUCCESS;
176 176
177 for (i = 1; i < cmd->rsp.num; i++) 177 for (i = 1; i < cmd->rsp.num; i++)
178 cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i)); 178 cmd->rsp.arg[i] = QLCRD32(adapter, QLCNIC_CDRP_ARG(i), &err);
179 179
180 /* Release semaphore */ 180 /* Release semaphore */
181 qlcnic_api_unlock(adapter); 181 qlcnic_api_unlock(adapter);
@@ -210,10 +210,10 @@ int qlcnic_fw_cmd_set_drv_version(struct qlcnic_adapter *adapter, u32 fw_cmd)
210 if (err) { 210 if (err) {
211 dev_info(&adapter->pdev->dev, 211 dev_info(&adapter->pdev->dev,
212 "Failed to set driver version in firmware\n"); 212 "Failed to set driver version in firmware\n");
213 return -EIO; 213 err = -EIO;
214 } 214 }
215 215 qlcnic_free_mbx_args(&cmd);
216 return 0; 216 return err;
217} 217}
218 218
219int 219int
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
index 05a847e599c6..7aac23ab31d1 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c
@@ -150,6 +150,7 @@ static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = {
150 "Link_Test_on_offline", 150 "Link_Test_on_offline",
151 "Interrupt_Test_offline", 151 "Interrupt_Test_offline",
152 "Internal_Loopback_offline", 152 "Internal_Loopback_offline",
153 "External_Loopback_offline",
153 "EEPROM_Test_offline" 154 "EEPROM_Test_offline"
154}; 155};
155 156
@@ -266,7 +267,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
266{ 267{
267 struct qlcnic_hardware_context *ahw = adapter->ahw; 268 struct qlcnic_hardware_context *ahw = adapter->ahw;
268 u32 speed, reg; 269 u32 speed, reg;
269 int check_sfp_module = 0; 270 int check_sfp_module = 0, err = 0;
270 u16 pcifn = ahw->pci_func; 271 u16 pcifn = ahw->pci_func;
271 272
272 /* read which mode */ 273 /* read which mode */
@@ -289,7 +290,7 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
289 290
290 } else if (adapter->ahw->port_type == QLCNIC_XGBE) { 291 } else if (adapter->ahw->port_type == QLCNIC_XGBE) {
291 u32 val = 0; 292 u32 val = 0;
292 val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR); 293 val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR, &err);
293 294
294 if (val == QLCNIC_PORT_MODE_802_3_AP) { 295 if (val == QLCNIC_PORT_MODE_802_3_AP) {
295 ecmd->supported = SUPPORTED_1000baseT_Full; 296 ecmd->supported = SUPPORTED_1000baseT_Full;
@@ -300,9 +301,13 @@ int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter,
300 } 301 }
301 302
302 if (netif_running(adapter->netdev) && ahw->has_link_events) { 303 if (netif_running(adapter->netdev) && ahw->has_link_events) {
303 reg = QLCRD32(adapter, P3P_LINK_SPEED_REG(pcifn)); 304 if (ahw->linkup) {
304 speed = P3P_LINK_SPEED_VAL(pcifn, reg); 305 reg = QLCRD32(adapter,
305 ahw->link_speed = speed * P3P_LINK_SPEED_MHZ; 306 P3P_LINK_SPEED_REG(pcifn), &err);
307 speed = P3P_LINK_SPEED_VAL(pcifn, reg);
308 ahw->link_speed = speed * P3P_LINK_SPEED_MHZ;
309 }
310
306 ethtool_cmd_speed_set(ecmd, ahw->link_speed); 311 ethtool_cmd_speed_set(ecmd, ahw->link_speed);
307 ecmd->autoneg = ahw->link_autoneg; 312 ecmd->autoneg = ahw->link_autoneg;
308 ecmd->duplex = ahw->link_duplex; 313 ecmd->duplex = ahw->link_duplex;
@@ -463,13 +468,14 @@ static int qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
463static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter, 468static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter,
464 u32 *regs_buff) 469 u32 *regs_buff)
465{ 470{
466 int i, j = 0; 471 int i, j = 0, err = 0;
467 472
468 for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++) 473 for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++)
469 regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]); 474 regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]);
470 j = 0; 475 j = 0;
471 while (ext_diag_registers[j] != -1) 476 while (ext_diag_registers[j] != -1)
472 regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++]); 477 regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++],
478 &err);
473 return i; 479 return i;
474} 480}
475 481
@@ -519,13 +525,16 @@ qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p)
519static u32 qlcnic_test_link(struct net_device *dev) 525static u32 qlcnic_test_link(struct net_device *dev)
520{ 526{
521 struct qlcnic_adapter *adapter = netdev_priv(dev); 527 struct qlcnic_adapter *adapter = netdev_priv(dev);
528 int err = 0;
522 u32 val; 529 u32 val;
523 530
524 if (qlcnic_83xx_check(adapter)) { 531 if (qlcnic_83xx_check(adapter)) {
525 val = qlcnic_83xx_test_link(adapter); 532 val = qlcnic_83xx_test_link(adapter);
526 return (val & 1) ? 0 : 1; 533 return (val & 1) ? 0 : 1;
527 } 534 }
528 val = QLCRD32(adapter, CRB_XG_STATE_P3P); 535 val = QLCRD32(adapter, CRB_XG_STATE_P3P, &err);
536 if (err == -EIO)
537 return err;
529 val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val); 538 val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val);
530 return (val == XG_LINK_UP_P3P) ? 0 : 1; 539 return (val == XG_LINK_UP_P3P) ? 0 : 1;
531} 540}
@@ -658,6 +667,7 @@ qlcnic_get_pauseparam(struct net_device *netdev,
658{ 667{
659 struct qlcnic_adapter *adapter = netdev_priv(netdev); 668 struct qlcnic_adapter *adapter = netdev_priv(netdev);
660 int port = adapter->ahw->physical_port; 669 int port = adapter->ahw->physical_port;
670 int err = 0;
661 __u32 val; 671 __u32 val;
662 672
663 if (qlcnic_83xx_check(adapter)) { 673 if (qlcnic_83xx_check(adapter)) {
@@ -668,9 +678,13 @@ qlcnic_get_pauseparam(struct net_device *netdev,
668 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) 678 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
669 return; 679 return;
670 /* get flow control settings */ 680 /* get flow control settings */
671 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port)); 681 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
682 if (err == -EIO)
683 return;
672 pause->rx_pause = qlcnic_gb_get_rx_flowctl(val); 684 pause->rx_pause = qlcnic_gb_get_rx_flowctl(val);
673 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL); 685 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
686 if (err == -EIO)
687 return;
674 switch (port) { 688 switch (port) {
675 case 0: 689 case 0:
676 pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val)); 690 pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val));
@@ -690,7 +704,9 @@ qlcnic_get_pauseparam(struct net_device *netdev,
690 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) 704 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
691 return; 705 return;
692 pause->rx_pause = 1; 706 pause->rx_pause = 1;
693 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL); 707 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
708 if (err == -EIO)
709 return;
694 if (port == 0) 710 if (port == 0)
695 pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val)); 711 pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val));
696 else 712 else
@@ -707,6 +723,7 @@ qlcnic_set_pauseparam(struct net_device *netdev,
707{ 723{
708 struct qlcnic_adapter *adapter = netdev_priv(netdev); 724 struct qlcnic_adapter *adapter = netdev_priv(netdev);
709 int port = adapter->ahw->physical_port; 725 int port = adapter->ahw->physical_port;
726 int err = 0;
710 __u32 val; 727 __u32 val;
711 728
712 if (qlcnic_83xx_check(adapter)) 729 if (qlcnic_83xx_check(adapter))
@@ -717,7 +734,9 @@ qlcnic_set_pauseparam(struct net_device *netdev,
717 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) 734 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS))
718 return -EIO; 735 return -EIO;
719 /* set flow control */ 736 /* set flow control */
720 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port)); 737 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err);
738 if (err == -EIO)
739 return err;
721 740
722 if (pause->rx_pause) 741 if (pause->rx_pause)
723 qlcnic_gb_rx_flowctl(val); 742 qlcnic_gb_rx_flowctl(val);
@@ -728,7 +747,9 @@ qlcnic_set_pauseparam(struct net_device *netdev,
728 val); 747 val);
729 QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val); 748 QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val);
730 /* set autoneg */ 749 /* set autoneg */
731 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL); 750 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err);
751 if (err == -EIO)
752 return err;
732 switch (port) { 753 switch (port) {
733 case 0: 754 case 0:
734 if (pause->tx_pause) 755 if (pause->tx_pause)
@@ -764,7 +785,9 @@ qlcnic_set_pauseparam(struct net_device *netdev,
764 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) 785 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS))
765 return -EIO; 786 return -EIO;
766 787
767 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL); 788 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err);
789 if (err == -EIO)
790 return err;
768 if (port == 0) { 791 if (port == 0) {
769 if (pause->tx_pause) 792 if (pause->tx_pause)
770 qlcnic_xg_unset_xg0_mask(val); 793 qlcnic_xg_unset_xg0_mask(val);
@@ -788,11 +811,14 @@ static int qlcnic_reg_test(struct net_device *dev)
788{ 811{
789 struct qlcnic_adapter *adapter = netdev_priv(dev); 812 struct qlcnic_adapter *adapter = netdev_priv(dev);
790 u32 data_read; 813 u32 data_read;
814 int err = 0;
791 815
792 if (qlcnic_83xx_check(adapter)) 816 if (qlcnic_83xx_check(adapter))
793 return qlcnic_83xx_reg_test(adapter); 817 return qlcnic_83xx_reg_test(adapter);
794 818
795 data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0)); 819 data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0), &err);
820 if (err == -EIO)
821 return err;
796 if ((data_read & 0xffff) != adapter->pdev->vendor) 822 if ((data_read & 0xffff) != adapter->pdev->vendor)
797 return 1; 823 return 1;
798 824
@@ -1026,8 +1052,15 @@ qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test,
1026 if (data[3]) 1052 if (data[3])
1027 eth_test->flags |= ETH_TEST_FL_FAILED; 1053 eth_test->flags |= ETH_TEST_FL_FAILED;
1028 1054
1029 data[4] = qlcnic_eeprom_test(dev); 1055 if (eth_test->flags & ETH_TEST_FL_EXTERNAL_LB) {
1030 if (data[4]) 1056 data[4] = qlcnic_loopback_test(dev, QLCNIC_ELB_MODE);
1057 if (data[4])
1058 eth_test->flags |= ETH_TEST_FL_FAILED;
1059 eth_test->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE;
1060 }
1061
1062 data[5] = qlcnic_eeprom_test(dev);
1063 if (data[5])
1031 eth_test->flags |= ETH_TEST_FL_FAILED; 1064 eth_test->flags |= ETH_TEST_FL_FAILED;
1032 } 1065 }
1033} 1066}
@@ -1257,17 +1290,20 @@ qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1257{ 1290{
1258 struct qlcnic_adapter *adapter = netdev_priv(dev); 1291 struct qlcnic_adapter *adapter = netdev_priv(dev);
1259 u32 wol_cfg; 1292 u32 wol_cfg;
1293 int err = 0;
1260 1294
1261 if (qlcnic_83xx_check(adapter)) 1295 if (qlcnic_83xx_check(adapter))
1262 return; 1296 return;
1263 wol->supported = 0; 1297 wol->supported = 0;
1264 wol->wolopts = 0; 1298 wol->wolopts = 0;
1265 1299
1266 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); 1300 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1301 if (err == -EIO)
1302 return;
1267 if (wol_cfg & (1UL << adapter->portnum)) 1303 if (wol_cfg & (1UL << adapter->portnum))
1268 wol->supported |= WAKE_MAGIC; 1304 wol->supported |= WAKE_MAGIC;
1269 1305
1270 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); 1306 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1271 if (wol_cfg & (1UL << adapter->portnum)) 1307 if (wol_cfg & (1UL << adapter->portnum))
1272 wol->wolopts |= WAKE_MAGIC; 1308 wol->wolopts |= WAKE_MAGIC;
1273} 1309}
@@ -1277,17 +1313,22 @@ qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
1277{ 1313{
1278 struct qlcnic_adapter *adapter = netdev_priv(dev); 1314 struct qlcnic_adapter *adapter = netdev_priv(dev);
1279 u32 wol_cfg; 1315 u32 wol_cfg;
1316 int err = 0;
1280 1317
1281 if (qlcnic_83xx_check(adapter)) 1318 if (qlcnic_83xx_check(adapter))
1282 return -EOPNOTSUPP; 1319 return -EOPNOTSUPP;
1283 if (wol->wolopts & ~WAKE_MAGIC) 1320 if (wol->wolopts & ~WAKE_MAGIC)
1284 return -EINVAL; 1321 return -EINVAL;
1285 1322
1286 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); 1323 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1324 if (err == -EIO)
1325 return err;
1287 if (!(wol_cfg & (1 << adapter->portnum))) 1326 if (!(wol_cfg & (1 << adapter->portnum)))
1288 return -EOPNOTSUPP; 1327 return -EOPNOTSUPP;
1289 1328
1290 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); 1329 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1330 if (err == -EIO)
1331 return err;
1291 if (wol->wolopts & WAKE_MAGIC) 1332 if (wol->wolopts & WAKE_MAGIC)
1292 wol_cfg |= 1UL << adapter->portnum; 1333 wol_cfg |= 1UL << adapter->portnum;
1293 else 1334 else
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
index 4ed7e73d88d3..4d5f59b2d153 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.c
@@ -317,16 +317,20 @@ static void qlcnic_write_window_reg(u32 addr, void __iomem *bar0, u32 data)
317int 317int
318qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg) 318qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
319{ 319{
320 int done = 0, timeout = 0; 320 int timeout = 0;
321 int err = 0;
322 u32 done = 0;
321 323
322 while (!done) { 324 while (!done) {
323 done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem))); 325 done = QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_LOCK(sem)),
326 &err);
324 if (done == 1) 327 if (done == 1)
325 break; 328 break;
326 if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) { 329 if (++timeout >= QLCNIC_PCIE_SEM_TIMEOUT) {
327 dev_err(&adapter->pdev->dev, 330 dev_err(&adapter->pdev->dev,
328 "Failed to acquire sem=%d lock; holdby=%d\n", 331 "Failed to acquire sem=%d lock; holdby=%d\n",
329 sem, id_reg ? QLCRD32(adapter, id_reg) : -1); 332 sem,
333 id_reg ? QLCRD32(adapter, id_reg, &err) : -1);
330 return -EIO; 334 return -EIO;
331 } 335 }
332 msleep(1); 336 msleep(1);
@@ -341,19 +345,22 @@ qlcnic_pcie_sem_lock(struct qlcnic_adapter *adapter, int sem, u32 id_reg)
341void 345void
342qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem) 346qlcnic_pcie_sem_unlock(struct qlcnic_adapter *adapter, int sem)
343{ 347{
344 QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem))); 348 int err = 0;
349
350 QLCRD32(adapter, QLCNIC_PCIE_REG(PCIE_SEM_UNLOCK(sem)), &err);
345} 351}
346 352
347int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr) 353int qlcnic_ind_rd(struct qlcnic_adapter *adapter, u32 addr)
348{ 354{
355 int err = 0;
349 u32 data; 356 u32 data;
350 357
351 if (qlcnic_82xx_check(adapter)) 358 if (qlcnic_82xx_check(adapter))
352 qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data); 359 qlcnic_read_window_reg(addr, adapter->ahw->pci_base0, &data);
353 else { 360 else {
354 data = qlcnic_83xx_rd_reg_indirect(adapter, addr); 361 data = QLCRD32(adapter, addr, &err);
355 if (data == -EIO) 362 if (err == -EIO)
356 return -EIO; 363 return err;
357 } 364 }
358 return data; 365 return data;
359} 366}
@@ -1159,7 +1166,8 @@ int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *adapter, ulong off,
1159 return -EIO; 1166 return -EIO;
1160} 1167}
1161 1168
1162int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off) 1169int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong off,
1170 int *err)
1163{ 1171{
1164 unsigned long flags; 1172 unsigned long flags;
1165 int rv; 1173 int rv;
@@ -1415,7 +1423,7 @@ int qlcnic_pci_mem_read_2M(struct qlcnic_adapter *adapter, u64 off, u64 *data)
1415 1423
1416int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter) 1424int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter)
1417{ 1425{
1418 int offset, board_type, magic; 1426 int offset, board_type, magic, err = 0;
1419 struct pci_dev *pdev = adapter->pdev; 1427 struct pci_dev *pdev = adapter->pdev;
1420 1428
1421 offset = QLCNIC_FW_MAGIC_OFFSET; 1429 offset = QLCNIC_FW_MAGIC_OFFSET;
@@ -1435,7 +1443,9 @@ int qlcnic_82xx_get_board_info(struct qlcnic_adapter *adapter)
1435 adapter->ahw->board_type = board_type; 1443 adapter->ahw->board_type = board_type;
1436 1444
1437 if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) { 1445 if (board_type == QLCNIC_BRDTYPE_P3P_4_GB_MM) {
1438 u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I); 1446 u32 gpio = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_PAD_GPIO_I, &err);
1447 if (err == -EIO)
1448 return err;
1439 if ((gpio & 0x8000) == 0) 1449 if ((gpio & 0x8000) == 0)
1440 board_type = QLCNIC_BRDTYPE_P3P_10G_TP; 1450 board_type = QLCNIC_BRDTYPE_P3P_10G_TP;
1441 } 1451 }
@@ -1475,10 +1485,13 @@ int
1475qlcnic_wol_supported(struct qlcnic_adapter *adapter) 1485qlcnic_wol_supported(struct qlcnic_adapter *adapter)
1476{ 1486{
1477 u32 wol_cfg; 1487 u32 wol_cfg;
1488 int err = 0;
1478 1489
1479 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV); 1490 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err);
1480 if (wol_cfg & (1UL << adapter->portnum)) { 1491 if (wol_cfg & (1UL << adapter->portnum)) {
1481 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG); 1492 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err);
1493 if (err == -EIO)
1494 return err;
1482 if (wol_cfg & (1 << adapter->portnum)) 1495 if (wol_cfg & (1 << adapter->portnum))
1483 return 1; 1496 return 1;
1484 } 1497 }
@@ -1539,6 +1552,7 @@ void qlcnic_82xx_get_func_no(struct qlcnic_adapter *adapter)
1539void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf, 1552void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
1540 loff_t offset, size_t size) 1553 loff_t offset, size_t size)
1541{ 1554{
1555 int err = 0;
1542 u32 data; 1556 u32 data;
1543 u64 qmdata; 1557 u64 qmdata;
1544 1558
@@ -1546,7 +1560,7 @@ void qlcnic_82xx_read_crb(struct qlcnic_adapter *adapter, char *buf,
1546 qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata); 1560 qlcnic_pci_camqm_read_2M(adapter, offset, &qmdata);
1547 memcpy(buf, &qmdata, size); 1561 memcpy(buf, &qmdata, size);
1548 } else { 1562 } else {
1549 data = QLCRD32(adapter, offset); 1563 data = QLCRD32(adapter, offset, &err);
1550 memcpy(buf, &data, size); 1564 memcpy(buf, &data, size);
1551 } 1565 }
1552} 1566}
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
index 2c22504f57aa..4a71b28effcb 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_hw.h
@@ -154,7 +154,7 @@ struct qlcnic_hardware_context;
154struct qlcnic_adapter; 154struct qlcnic_adapter;
155 155
156int qlcnic_82xx_start_firmware(struct qlcnic_adapter *); 156int qlcnic_82xx_start_firmware(struct qlcnic_adapter *);
157int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong); 157int qlcnic_82xx_hw_read_wx_2M(struct qlcnic_adapter *adapter, ulong, int *);
158int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32); 158int qlcnic_82xx_hw_write_wx_2M(struct qlcnic_adapter *, ulong, u32);
159int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int); 159int qlcnic_82xx_config_hw_lro(struct qlcnic_adapter *adapter, int);
160int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32); 160int qlcnic_82xx_nic_set_promisc(struct qlcnic_adapter *adapter, u32);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
index a2023090e866..974d62607e13 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_init.c
@@ -286,10 +286,11 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter)
286{ 286{
287 long timeout = 0; 287 long timeout = 0;
288 long done = 0; 288 long done = 0;
289 int err = 0;
289 290
290 cond_resched(); 291 cond_resched();
291 while (done == 0) { 292 while (done == 0) {
292 done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS); 293 done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS, &err);
293 done &= 2; 294 done &= 2;
294 if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) { 295 if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) {
295 dev_err(&adapter->pdev->dev, 296 dev_err(&adapter->pdev->dev,
@@ -304,6 +305,8 @@ static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter)
304static int do_rom_fast_read(struct qlcnic_adapter *adapter, 305static int do_rom_fast_read(struct qlcnic_adapter *adapter,
305 u32 addr, u32 *valp) 306 u32 addr, u32 *valp)
306{ 307{
308 int err = 0;
309
307 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr); 310 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr);
308 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 311 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
309 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3); 312 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3);
@@ -317,7 +320,9 @@ static int do_rom_fast_read(struct qlcnic_adapter *adapter,
317 udelay(10); 320 udelay(10);
318 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); 321 QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
319 322
320 *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA); 323 *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA, &err);
324 if (err == -EIO)
325 return err;
321 return 0; 326 return 0;
322} 327}
323 328
@@ -369,11 +374,11 @@ int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, u32 addr, u32 *valp)
369 374
370int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter) 375int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
371{ 376{
372 int addr, val; 377 int addr, err = 0;
373 int i, n, init_delay; 378 int i, n, init_delay;
374 struct crb_addr_pair *buf; 379 struct crb_addr_pair *buf;
375 unsigned offset; 380 unsigned offset;
376 u32 off; 381 u32 off, val;
377 struct pci_dev *pdev = adapter->pdev; 382 struct pci_dev *pdev = adapter->pdev;
378 383
379 QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0); 384 QLC_SHARED_REG_WR32(adapter, QLCNIC_CMDPEG_STATE, 0);
@@ -402,7 +407,9 @@ int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
402 QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00); 407 QLCWR32(adapter, QLCNIC_CRB_NIU + 0xb0000, 0x00);
403 408
404 /* halt sre */ 409 /* halt sre */
405 val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000); 410 val = QLCRD32(adapter, QLCNIC_CRB_SRE + 0x1000, &err);
411 if (err == -EIO)
412 return err;
406 QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1))); 413 QLCWR32(adapter, QLCNIC_CRB_SRE + 0x1000, val & (~(0x1)));
407 414
408 /* halt epg */ 415 /* halt epg */
@@ -719,10 +726,12 @@ qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter)
719static int 726static int
720qlcnic_has_mn(struct qlcnic_adapter *adapter) 727qlcnic_has_mn(struct qlcnic_adapter *adapter)
721{ 728{
722 u32 capability; 729 u32 capability = 0;
723 capability = 0; 730 int err = 0;
724 731
725 capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY); 732 capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY, &err);
733 if (err == -EIO)
734 return err;
726 if (capability & QLCNIC_PEG_TUNE_MN_PRESENT) 735 if (capability & QLCNIC_PEG_TUNE_MN_PRESENT)
727 return 1; 736 return 1;
728 737
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
index d3f8797efcc3..6946d354f44f 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_io.c
@@ -161,36 +161,68 @@ static inline int qlcnic_82xx_is_lb_pkt(u64 sts_data)
161 return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0; 161 return (qlcnic_get_sts_status(sts_data) == STATUS_CKSUM_LOOP) ? 1 : 0;
162} 162}
163 163
164static void qlcnic_delete_rx_list_mac(struct qlcnic_adapter *adapter,
165 struct qlcnic_filter *fil,
166 void *addr, u16 vlan_id)
167{
168 int ret;
169 u8 op;
170
171 op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD;
172 ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op);
173 if (ret)
174 return;
175
176 op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL;
177 ret = qlcnic_sre_macaddr_change(adapter, addr, vlan_id, op);
178 if (!ret) {
179 hlist_del(&fil->fnode);
180 adapter->rx_fhash.fnum--;
181 }
182}
183
184static struct qlcnic_filter *qlcnic_find_mac_filter(struct hlist_head *head,
185 void *addr, u16 vlan_id)
186{
187 struct qlcnic_filter *tmp_fil = NULL;
188 struct hlist_node *n;
189
190 hlist_for_each_entry_safe(tmp_fil, n, head, fnode) {
191 if (!memcmp(tmp_fil->faddr, addr, ETH_ALEN) &&
192 tmp_fil->vlan_id == vlan_id)
193 return tmp_fil;
194 }
195
196 return NULL;
197}
198
164void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb, 199void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb,
165 int loopback_pkt, u16 vlan_id) 200 int loopback_pkt, u16 vlan_id)
166{ 201{
167 struct ethhdr *phdr = (struct ethhdr *)(skb->data); 202 struct ethhdr *phdr = (struct ethhdr *)(skb->data);
168 struct qlcnic_filter *fil, *tmp_fil; 203 struct qlcnic_filter *fil, *tmp_fil;
169 struct hlist_node *n;
170 struct hlist_head *head; 204 struct hlist_head *head;
171 unsigned long time; 205 unsigned long time;
172 u64 src_addr = 0; 206 u64 src_addr = 0;
173 u8 hindex, found = 0, op; 207 u8 hindex, op;
174 int ret; 208 int ret;
175 209
176 memcpy(&src_addr, phdr->h_source, ETH_ALEN); 210 memcpy(&src_addr, phdr->h_source, ETH_ALEN);
211 hindex = qlcnic_mac_hash(src_addr) &
212 (adapter->fhash.fbucket_size - 1);
177 213
178 if (loopback_pkt) { 214 if (loopback_pkt) {
179 if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax) 215 if (adapter->rx_fhash.fnum >= adapter->rx_fhash.fmax)
180 return; 216 return;
181 217
182 hindex = qlcnic_mac_hash(src_addr) &
183 (adapter->fhash.fbucket_size - 1);
184 head = &(adapter->rx_fhash.fhead[hindex]); 218 head = &(adapter->rx_fhash.fhead[hindex]);
185 219
186 hlist_for_each_entry_safe(tmp_fil, n, head, fnode) { 220 tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id);
187 if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) && 221 if (tmp_fil) {
188 tmp_fil->vlan_id == vlan_id) { 222 time = tmp_fil->ftime;
189 time = tmp_fil->ftime; 223 if (time_after(jiffies, QLCNIC_READD_AGE * HZ + time))
190 if (jiffies > (QLCNIC_READD_AGE * HZ + time)) 224 tmp_fil->ftime = jiffies;
191 tmp_fil->ftime = jiffies; 225 return;
192 return;
193 }
194 } 226 }
195 227
196 fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC); 228 fil = kzalloc(sizeof(struct qlcnic_filter), GFP_ATOMIC);
@@ -205,36 +237,37 @@ void qlcnic_add_lb_filter(struct qlcnic_adapter *adapter, struct sk_buff *skb,
205 adapter->rx_fhash.fnum++; 237 adapter->rx_fhash.fnum++;
206 spin_unlock(&adapter->rx_mac_learn_lock); 238 spin_unlock(&adapter->rx_mac_learn_lock);
207 } else { 239 } else {
208 hindex = qlcnic_mac_hash(src_addr) & 240 head = &adapter->fhash.fhead[hindex];
209 (adapter->fhash.fbucket_size - 1);
210 head = &(adapter->rx_fhash.fhead[hindex]);
211 spin_lock(&adapter->rx_mac_learn_lock);
212 hlist_for_each_entry_safe(tmp_fil, n, head, fnode) {
213 if (!memcmp(tmp_fil->faddr, &src_addr, ETH_ALEN) &&
214 tmp_fil->vlan_id == vlan_id) {
215 found = 1;
216 break;
217 }
218 }
219 241
220 if (!found) { 242 spin_lock(&adapter->mac_learn_lock);
221 spin_unlock(&adapter->rx_mac_learn_lock);
222 return;
223 }
224 243
225 op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; 244 tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id);
226 ret = qlcnic_sre_macaddr_change(adapter, (u8 *)&src_addr, 245 if (tmp_fil) {
227 vlan_id, op);
228 if (!ret) {
229 op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL; 246 op = vlan_id ? QLCNIC_MAC_VLAN_DEL : QLCNIC_MAC_DEL;
230 ret = qlcnic_sre_macaddr_change(adapter, 247 ret = qlcnic_sre_macaddr_change(adapter,
231 (u8 *)&src_addr, 248 (u8 *)&src_addr,
232 vlan_id, op); 249 vlan_id, op);
233 if (!ret) { 250 if (!ret) {
234 hlist_del(&(tmp_fil->fnode)); 251 hlist_del(&tmp_fil->fnode);
235 adapter->rx_fhash.fnum--; 252 adapter->fhash.fnum--;
236 } 253 }
254
255 spin_unlock(&adapter->mac_learn_lock);
256
257 return;
237 } 258 }
259
260 spin_unlock(&adapter->mac_learn_lock);
261
262 head = &adapter->rx_fhash.fhead[hindex];
263
264 spin_lock(&adapter->rx_mac_learn_lock);
265
266 tmp_fil = qlcnic_find_mac_filter(head, &src_addr, vlan_id);
267 if (tmp_fil)
268 qlcnic_delete_rx_list_mac(adapter, tmp_fil, &src_addr,
269 vlan_id);
270
238 spin_unlock(&adapter->rx_mac_learn_lock); 271 spin_unlock(&adapter->rx_mac_learn_lock);
239 } 272 }
240} 273}
@@ -262,7 +295,7 @@ void qlcnic_82xx_change_filter(struct qlcnic_adapter *adapter, u64 *uaddr,
262 295
263 mac_req = (struct qlcnic_mac_req *)&(req->words[0]); 296 mac_req = (struct qlcnic_mac_req *)&(req->words[0]);
264 mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD; 297 mac_req->op = vlan_id ? QLCNIC_MAC_VLAN_ADD : QLCNIC_MAC_ADD;
265 memcpy(mac_req->mac_addr, &uaddr, ETH_ALEN); 298 memcpy(mac_req->mac_addr, uaddr, ETH_ALEN);
266 299
267 vlan_req = (struct qlcnic_vlan_req *)&req->words[1]; 300 vlan_req = (struct qlcnic_vlan_req *)&req->words[1];
268 vlan_req->vlan_id = cpu_to_le16(vlan_id); 301 vlan_req->vlan_id = cpu_to_le16(vlan_id);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
index cc78d3924c6a..ee013fcc3322 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
@@ -977,8 +977,8 @@ qlcnic_check_options(struct qlcnic_adapter *adapter)
977static int 977static int
978qlcnic_initialize_nic(struct qlcnic_adapter *adapter) 978qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
979{ 979{
980 int err;
981 struct qlcnic_info nic_info; 980 struct qlcnic_info nic_info;
981 int err = 0;
982 982
983 memset(&nic_info, 0, sizeof(struct qlcnic_info)); 983 memset(&nic_info, 0, sizeof(struct qlcnic_info));
984 err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func); 984 err = qlcnic_get_nic_info(adapter, &nic_info, adapter->ahw->pci_func);
@@ -993,7 +993,9 @@ qlcnic_initialize_nic(struct qlcnic_adapter *adapter)
993 993
994 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) { 994 if (adapter->ahw->capabilities & QLCNIC_FW_CAPABILITY_MORE_CAPS) {
995 u32 temp; 995 u32 temp;
996 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2); 996 temp = QLCRD32(adapter, CRB_FW_CAPABILITIES_2, &err);
997 if (err == -EIO)
998 return err;
997 adapter->ahw->extra_capability[0] = temp; 999 adapter->ahw->extra_capability[0] = temp;
998 } 1000 }
999 adapter->ahw->max_mac_filters = nic_info.max_mac_filters; 1001 adapter->ahw->max_mac_filters = nic_info.max_mac_filters;
@@ -2141,7 +2143,7 @@ qlcnic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
2141 if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x && 2143 if (qlcnic_83xx_check(adapter) && !qlcnic_use_msi_x &&
2142 !!qlcnic_use_msi) 2144 !!qlcnic_use_msi)
2143 dev_warn(&pdev->dev, 2145 dev_warn(&pdev->dev,
2144 "83xx adapter do not support MSI interrupts\n"); 2146 "Device does not support MSI interrupts\n");
2145 2147
2146 err = qlcnic_setup_intr(adapter, 0); 2148 err = qlcnic_setup_intr(adapter, 0);
2147 if (err) { 2149 if (err) {
@@ -3095,6 +3097,7 @@ qlcnic_check_health(struct qlcnic_adapter *adapter)
3095{ 3097{
3096 u32 state = 0, heartbeat; 3098 u32 state = 0, heartbeat;
3097 u32 peg_status; 3099 u32 peg_status;
3100 int err = 0;
3098 3101
3099 if (qlcnic_check_temp(adapter)) 3102 if (qlcnic_check_temp(adapter))
3100 goto detach; 3103 goto detach;
@@ -3141,11 +3144,11 @@ qlcnic_check_health(struct qlcnic_adapter *adapter)
3141 "PEG_NET_4_PC: 0x%x\n", 3144 "PEG_NET_4_PC: 0x%x\n",
3142 peg_status, 3145 peg_status,
3143 QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2), 3146 QLC_SHARED_REG_RD32(adapter, QLCNIC_PEG_HALT_STATUS2),
3144 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c), 3147 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x3c, &err),
3145 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c), 3148 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x3c, &err),
3146 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c), 3149 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x3c, &err),
3147 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c), 3150 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x3c, &err),
3148 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c)); 3151 QLCRD32(adapter, QLCNIC_CRB_PEG_NET_4 + 0x3c, &err));
3149 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67) 3152 if (QLCNIC_FWERROR_CODE(peg_status) == 0x67)
3150 dev_err(&adapter->pdev->dev, 3153 dev_err(&adapter->pdev->dev,
3151 "Firmware aborted with error code 0x00006700. " 3154 "Firmware aborted with error code 0x00006700. "
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
index 56e85f98117f..5d40045b3cea 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
@@ -562,7 +562,7 @@ static int qlcnic_sriov_setup_vf(struct qlcnic_adapter *adapter,
562 INIT_LIST_HEAD(&adapter->vf_mc_list); 562 INIT_LIST_HEAD(&adapter->vf_mc_list);
563 if (!qlcnic_use_msi_x && !!qlcnic_use_msi) 563 if (!qlcnic_use_msi_x && !!qlcnic_use_msi)
564 dev_warn(&adapter->pdev->dev, 564 dev_warn(&adapter->pdev->dev,
565 "83xx adapter do not support MSI interrupts\n"); 565 "Device does not support MSI interrupts\n");
566 566
567 err = qlcnic_setup_intr(adapter, 1); 567 err = qlcnic_setup_intr(adapter, 1);
568 if (err) { 568 if (err) {
diff --git a/drivers/net/ethernet/realtek/8139cp.c b/drivers/net/ethernet/realtek/8139cp.c
index e6acb9fa5767..6f35f8404d68 100644
--- a/drivers/net/ethernet/realtek/8139cp.c
+++ b/drivers/net/ethernet/realtek/8139cp.c
@@ -478,7 +478,7 @@ rx_status_loop:
478 478
479 while (1) { 479 while (1) {
480 u32 status, len; 480 u32 status, len;
481 dma_addr_t mapping; 481 dma_addr_t mapping, new_mapping;
482 struct sk_buff *skb, *new_skb; 482 struct sk_buff *skb, *new_skb;
483 struct cp_desc *desc; 483 struct cp_desc *desc;
484 const unsigned buflen = cp->rx_buf_sz; 484 const unsigned buflen = cp->rx_buf_sz;
@@ -520,6 +520,13 @@ rx_status_loop:
520 goto rx_next; 520 goto rx_next;
521 } 521 }
522 522
523 new_mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen,
524 PCI_DMA_FROMDEVICE);
525 if (dma_mapping_error(&cp->pdev->dev, new_mapping)) {
526 dev->stats.rx_dropped++;
527 goto rx_next;
528 }
529
523 dma_unmap_single(&cp->pdev->dev, mapping, 530 dma_unmap_single(&cp->pdev->dev, mapping,
524 buflen, PCI_DMA_FROMDEVICE); 531 buflen, PCI_DMA_FROMDEVICE);
525 532
@@ -531,12 +538,11 @@ rx_status_loop:
531 538
532 skb_put(skb, len); 539 skb_put(skb, len);
533 540
534 mapping = dma_map_single(&cp->pdev->dev, new_skb->data, buflen,
535 PCI_DMA_FROMDEVICE);
536 cp->rx_skb[rx_tail] = new_skb; 541 cp->rx_skb[rx_tail] = new_skb;
537 542
538 cp_rx_skb(cp, skb, desc); 543 cp_rx_skb(cp, skb, desc);
539 rx++; 544 rx++;
545 mapping = new_mapping;
540 546
541rx_next: 547rx_next:
542 cp->rx_ring[rx_tail].opts2 = 0; 548 cp->rx_ring[rx_tail].opts2 = 0;
@@ -716,6 +722,22 @@ static inline u32 cp_tx_vlan_tag(struct sk_buff *skb)
716 TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00; 722 TxVlanTag | swab16(vlan_tx_tag_get(skb)) : 0x00;
717} 723}
718 724
725static void unwind_tx_frag_mapping(struct cp_private *cp, struct sk_buff *skb,
726 int first, int entry_last)
727{
728 int frag, index;
729 struct cp_desc *txd;
730 skb_frag_t *this_frag;
731 for (frag = 0; frag+first < entry_last; frag++) {
732 index = first+frag;
733 cp->tx_skb[index] = NULL;
734 txd = &cp->tx_ring[index];
735 this_frag = &skb_shinfo(skb)->frags[frag];
736 dma_unmap_single(&cp->pdev->dev, le64_to_cpu(txd->addr),
737 skb_frag_size(this_frag), PCI_DMA_TODEVICE);
738 }
739}
740
719static netdev_tx_t cp_start_xmit (struct sk_buff *skb, 741static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
720 struct net_device *dev) 742 struct net_device *dev)
721{ 743{
@@ -749,6 +771,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
749 771
750 len = skb->len; 772 len = skb->len;
751 mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE); 773 mapping = dma_map_single(&cp->pdev->dev, skb->data, len, PCI_DMA_TODEVICE);
774 if (dma_mapping_error(&cp->pdev->dev, mapping))
775 goto out_dma_error;
776
752 txd->opts2 = opts2; 777 txd->opts2 = opts2;
753 txd->addr = cpu_to_le64(mapping); 778 txd->addr = cpu_to_le64(mapping);
754 wmb(); 779 wmb();
@@ -786,6 +811,9 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
786 first_len = skb_headlen(skb); 811 first_len = skb_headlen(skb);
787 first_mapping = dma_map_single(&cp->pdev->dev, skb->data, 812 first_mapping = dma_map_single(&cp->pdev->dev, skb->data,
788 first_len, PCI_DMA_TODEVICE); 813 first_len, PCI_DMA_TODEVICE);
814 if (dma_mapping_error(&cp->pdev->dev, first_mapping))
815 goto out_dma_error;
816
789 cp->tx_skb[entry] = skb; 817 cp->tx_skb[entry] = skb;
790 entry = NEXT_TX(entry); 818 entry = NEXT_TX(entry);
791 819
@@ -799,6 +827,11 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
799 mapping = dma_map_single(&cp->pdev->dev, 827 mapping = dma_map_single(&cp->pdev->dev,
800 skb_frag_address(this_frag), 828 skb_frag_address(this_frag),
801 len, PCI_DMA_TODEVICE); 829 len, PCI_DMA_TODEVICE);
830 if (dma_mapping_error(&cp->pdev->dev, mapping)) {
831 unwind_tx_frag_mapping(cp, skb, first_entry, entry);
832 goto out_dma_error;
833 }
834
802 eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; 835 eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0;
803 836
804 ctrl = eor | len | DescOwn; 837 ctrl = eor | len | DescOwn;
@@ -859,11 +892,16 @@ static netdev_tx_t cp_start_xmit (struct sk_buff *skb,
859 if (TX_BUFFS_AVAIL(cp) <= (MAX_SKB_FRAGS + 1)) 892 if (TX_BUFFS_AVAIL(cp) <= (MAX_SKB_FRAGS + 1))
860 netif_stop_queue(dev); 893 netif_stop_queue(dev);
861 894
895out_unlock:
862 spin_unlock_irqrestore(&cp->lock, intr_flags); 896 spin_unlock_irqrestore(&cp->lock, intr_flags);
863 897
864 cpw8(TxPoll, NormalTxPoll); 898 cpw8(TxPoll, NormalTxPoll);
865 899
866 return NETDEV_TX_OK; 900 return NETDEV_TX_OK;
901out_dma_error:
902 kfree_skb(skb);
903 cp->dev->stats.tx_dropped++;
904 goto out_unlock;
867} 905}
868 906
869/* Set or clear the multicast filter for this adaptor. 907/* Set or clear the multicast filter for this adaptor.
@@ -1054,6 +1092,10 @@ static int cp_refill_rx(struct cp_private *cp)
1054 1092
1055 mapping = dma_map_single(&cp->pdev->dev, skb->data, 1093 mapping = dma_map_single(&cp->pdev->dev, skb->data,
1056 cp->rx_buf_sz, PCI_DMA_FROMDEVICE); 1094 cp->rx_buf_sz, PCI_DMA_FROMDEVICE);
1095 if (dma_mapping_error(&cp->pdev->dev, mapping)) {
1096 kfree_skb(skb);
1097 goto err_out;
1098 }
1057 cp->rx_skb[i] = skb; 1099 cp->rx_skb[i] = skb;
1058 1100
1059 cp->rx_ring[i].opts2 = 0; 1101 cp->rx_ring[i].opts2 = 0;
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
index 880015cae6a3..b5eb4195fc99 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -3689,7 +3689,7 @@ static void rtl_phy_work(struct rtl8169_private *tp)
3689 if (tp->link_ok(ioaddr)) 3689 if (tp->link_ok(ioaddr))
3690 return; 3690 return;
3691 3691
3692 netif_warn(tp, link, tp->dev, "PHY reset until link up\n"); 3692 netif_dbg(tp, link, tp->dev, "PHY reset until link up\n");
3693 3693
3694 tp->phy_reset_enable(tp); 3694 tp->phy_reset_enable(tp);
3695 3695
diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c
index eb4aea3fe793..f5d7ad75e479 100644
--- a/drivers/net/ethernet/sis/sis900.c
+++ b/drivers/net/ethernet/sis/sis900.c
@@ -1318,7 +1318,7 @@ static void sis900_timer(unsigned long data)
1318 if (duplex){ 1318 if (duplex){
1319 sis900_set_mode(sis_priv, speed, duplex); 1319 sis900_set_mode(sis_priv, speed, duplex);
1320 sis630_set_eq(net_dev, sis_priv->chipset_rev); 1320 sis630_set_eq(net_dev, sis_priv->chipset_rev);
1321 netif_start_queue(net_dev); 1321 netif_carrier_on(net_dev);
1322 } 1322 }
1323 1323
1324 sis_priv->timer.expires = jiffies + HZ; 1324 sis_priv->timer.expires = jiffies + HZ;
@@ -1336,10 +1336,8 @@ static void sis900_timer(unsigned long data)
1336 status = sis900_default_phy(net_dev); 1336 status = sis900_default_phy(net_dev);
1337 mii_phy = sis_priv->mii; 1337 mii_phy = sis_priv->mii;
1338 1338
1339 if (status & MII_STAT_LINK){ 1339 if (status & MII_STAT_LINK)
1340 sis900_check_mode(net_dev, mii_phy); 1340 sis900_check_mode(net_dev, mii_phy);
1341 netif_carrier_on(net_dev);
1342 }
1343 } else { 1341 } else {
1344 /* Link ON -> OFF */ 1342 /* Link ON -> OFF */
1345 if (!(status & MII_STAT_LINK)){ 1343 if (!(status & MII_STAT_LINK)){
@@ -1612,12 +1610,6 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
1612 unsigned int index_cur_tx, index_dirty_tx; 1610 unsigned int index_cur_tx, index_dirty_tx;
1613 unsigned int count_dirty_tx; 1611 unsigned int count_dirty_tx;
1614 1612
1615 /* Don't transmit data before the complete of auto-negotiation */
1616 if(!sis_priv->autong_complete){
1617 netif_stop_queue(net_dev);
1618 return NETDEV_TX_BUSY;
1619 }
1620
1621 spin_lock_irqsave(&sis_priv->lock, flags); 1613 spin_lock_irqsave(&sis_priv->lock, flags);
1622 1614
1623 /* Calculate the next Tx descriptor entry. */ 1615 /* Calculate the next Tx descriptor entry. */
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index 05a1674e204f..22a7a4336211 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -1867,7 +1867,7 @@ static int cpsw_probe(struct platform_device *pdev)
1867 1867
1868 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { 1868 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) {
1869 for (i = res->start; i <= res->end; i++) { 1869 for (i = res->start; i <= res->end; i++) {
1870 if (request_irq(i, cpsw_interrupt, IRQF_DISABLED, 1870 if (request_irq(i, cpsw_interrupt, 0,
1871 dev_name(&pdev->dev), priv)) { 1871 dev_name(&pdev->dev), priv)) {
1872 dev_err(priv->dev, "error attaching irq\n"); 1872 dev_err(priv->dev, "error attaching irq\n");
1873 goto clean_ale_ret; 1873 goto clean_ale_ret;
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c
index 07b176bcf929..1a222bce4bd7 100644
--- a/drivers/net/ethernet/ti/davinci_emac.c
+++ b/drivers/net/ethernet/ti/davinci_emac.c
@@ -1568,8 +1568,7 @@ static int emac_dev_open(struct net_device *ndev)
1568 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) { 1568 while ((res = platform_get_resource(priv->pdev, IORESOURCE_IRQ, k))) {
1569 for (i = res->start; i <= res->end; i++) { 1569 for (i = res->start; i <= res->end; i++) {
1570 if (devm_request_irq(&priv->pdev->dev, i, emac_irq, 1570 if (devm_request_irq(&priv->pdev->dev, i, emac_irq,
1571 IRQF_DISABLED, 1571 0, ndev->name, ndev))
1572 ndev->name, ndev))
1573 goto rollback; 1572 goto rollback;
1574 } 1573 }
1575 k++; 1574 k++;
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index 18373b6ae37d..d0f9c2fd1d4f 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -337,8 +337,11 @@ static int macvlan_open(struct net_device *dev)
337 int err; 337 int err;
338 338
339 if (vlan->port->passthru) { 339 if (vlan->port->passthru) {
340 if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC)) 340 if (!(vlan->flags & MACVLAN_FLAG_NOPROMISC)) {
341 dev_set_promiscuity(lowerdev, 1); 341 err = dev_set_promiscuity(lowerdev, 1);
342 if (err < 0)
343 goto out;
344 }
342 goto hash_add; 345 goto hash_add;
343 } 346 }
344 347
@@ -863,6 +866,18 @@ static int macvlan_changelink(struct net_device *dev,
863 struct nlattr *tb[], struct nlattr *data[]) 866 struct nlattr *tb[], struct nlattr *data[])
864{ 867{
865 struct macvlan_dev *vlan = netdev_priv(dev); 868 struct macvlan_dev *vlan = netdev_priv(dev);
869 enum macvlan_mode mode;
870 bool set_mode = false;
871
872 /* Validate mode, but don't set yet: setting flags may fail. */
873 if (data && data[IFLA_MACVLAN_MODE]) {
874 set_mode = true;
875 mode = nla_get_u32(data[IFLA_MACVLAN_MODE]);
876 /* Passthrough mode can't be set or cleared dynamically */
877 if ((mode == MACVLAN_MODE_PASSTHRU) !=
878 (vlan->mode == MACVLAN_MODE_PASSTHRU))
879 return -EINVAL;
880 }
866 881
867 if (data && data[IFLA_MACVLAN_FLAGS]) { 882 if (data && data[IFLA_MACVLAN_FLAGS]) {
868 __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); 883 __u16 flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]);
@@ -879,8 +894,8 @@ static int macvlan_changelink(struct net_device *dev,
879 } 894 }
880 vlan->flags = flags; 895 vlan->flags = flags;
881 } 896 }
882 if (data && data[IFLA_MACVLAN_MODE]) 897 if (set_mode)
883 vlan->mode = nla_get_u32(data[IFLA_MACVLAN_MODE]); 898 vlan->mode = mode;
884 return 0; 899 return 0;
885} 900}
886 901
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index ee13f9eb740c..11c51f275366 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -344,17 +344,41 @@ static const int multicast_filter_limit = 32;
344static 344static
345int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) 345int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
346{ 346{
347 return usb_control_msg(tp->udev, usb_rcvctrlpipe(tp->udev, 0), 347 int ret;
348 void *tmp;
349
350 tmp = kmalloc(size, GFP_KERNEL);
351 if (!tmp)
352 return -ENOMEM;
353
354 ret = usb_control_msg(tp->udev, usb_rcvctrlpipe(tp->udev, 0),
348 RTL8152_REQ_GET_REGS, RTL8152_REQT_READ, 355 RTL8152_REQ_GET_REGS, RTL8152_REQT_READ,
349 value, index, data, size, 500); 356 value, index, tmp, size, 500);
357
358 memcpy(data, tmp, size);
359 kfree(tmp);
360
361 return ret;
350} 362}
351 363
352static 364static
353int set_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data) 365int set_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
354{ 366{
355 return usb_control_msg(tp->udev, usb_sndctrlpipe(tp->udev, 0), 367 int ret;
368 void *tmp;
369
370 tmp = kmalloc(size, GFP_KERNEL);
371 if (!tmp)
372 return -ENOMEM;
373
374 memcpy(tmp, data, size);
375
376 ret = usb_control_msg(tp->udev, usb_sndctrlpipe(tp->udev, 0),
356 RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE, 377 RTL8152_REQ_SET_REGS, RTL8152_REQT_WRITE,
357 value, index, data, size, 500); 378 value, index, tmp, size, 500);
379
380 kfree(tmp);
381 return ret;
358} 382}
359 383
360static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size, 384static int generic_ocp_read(struct r8152 *tp, u16 index, u16 size,
@@ -490,37 +514,31 @@ int usb_ocp_write(struct r8152 *tp, u16 index, u16 byteen, u16 size, void *data)
490 514
491static u32 ocp_read_dword(struct r8152 *tp, u16 type, u16 index) 515static u32 ocp_read_dword(struct r8152 *tp, u16 type, u16 index)
492{ 516{
493 u32 data; 517 __le32 data;
494 518
495 if (type == MCU_TYPE_PLA) 519 generic_ocp_read(tp, index, sizeof(data), &data, type);
496 pla_ocp_read(tp, index, sizeof(data), &data);
497 else
498 usb_ocp_read(tp, index, sizeof(data), &data);
499 520
500 return __le32_to_cpu(data); 521 return __le32_to_cpu(data);
501} 522}
502 523
503static void ocp_write_dword(struct r8152 *tp, u16 type, u16 index, u32 data) 524static void ocp_write_dword(struct r8152 *tp, u16 type, u16 index, u32 data)
504{ 525{
505 if (type == MCU_TYPE_PLA) 526 __le32 tmp = __cpu_to_le32(data);
506 pla_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(data), &data); 527
507 else 528 generic_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(tmp), &tmp, type);
508 usb_ocp_write(tp, index, BYTE_EN_DWORD, sizeof(data), &data);
509} 529}
510 530
511static u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index) 531static u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index)
512{ 532{
513 u32 data; 533 u32 data;
534 __le32 tmp;
514 u8 shift = index & 2; 535 u8 shift = index & 2;
515 536
516 index &= ~3; 537 index &= ~3;
517 538
518 if (type == MCU_TYPE_PLA) 539 generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
519 pla_ocp_read(tp, index, sizeof(data), &data);
520 else
521 usb_ocp_read(tp, index, sizeof(data), &data);
522 540
523 data = __le32_to_cpu(data); 541 data = __le32_to_cpu(tmp);
524 data >>= (shift * 8); 542 data >>= (shift * 8);
525 data &= 0xffff; 543 data &= 0xffff;
526 544
@@ -529,7 +547,8 @@ static u16 ocp_read_word(struct r8152 *tp, u16 type, u16 index)
529 547
530static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data) 548static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data)
531{ 549{
532 u32 tmp, mask = 0xffff; 550 u32 mask = 0xffff;
551 __le32 tmp;
533 u16 byen = BYTE_EN_WORD; 552 u16 byen = BYTE_EN_WORD;
534 u8 shift = index & 2; 553 u8 shift = index & 2;
535 554
@@ -542,34 +561,25 @@ static void ocp_write_word(struct r8152 *tp, u16 type, u16 index, u32 data)
542 index &= ~3; 561 index &= ~3;
543 } 562 }
544 563
545 if (type == MCU_TYPE_PLA) 564 generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
546 pla_ocp_read(tp, index, sizeof(tmp), &tmp);
547 else
548 usb_ocp_read(tp, index, sizeof(tmp), &tmp);
549 565
550 tmp = __le32_to_cpu(tmp) & ~mask; 566 data |= __le32_to_cpu(tmp) & ~mask;
551 tmp |= data; 567 tmp = __cpu_to_le32(data);
552 tmp = __cpu_to_le32(tmp);
553 568
554 if (type == MCU_TYPE_PLA) 569 generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type);
555 pla_ocp_write(tp, index, byen, sizeof(tmp), &tmp);
556 else
557 usb_ocp_write(tp, index, byen, sizeof(tmp), &tmp);
558} 570}
559 571
560static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index) 572static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index)
561{ 573{
562 u32 data; 574 u32 data;
575 __le32 tmp;
563 u8 shift = index & 3; 576 u8 shift = index & 3;
564 577
565 index &= ~3; 578 index &= ~3;
566 579
567 if (type == MCU_TYPE_PLA) 580 generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
568 pla_ocp_read(tp, index, sizeof(data), &data);
569 else
570 usb_ocp_read(tp, index, sizeof(data), &data);
571 581
572 data = __le32_to_cpu(data); 582 data = __le32_to_cpu(tmp);
573 data >>= (shift * 8); 583 data >>= (shift * 8);
574 data &= 0xff; 584 data &= 0xff;
575 585
@@ -578,7 +588,8 @@ static u8 ocp_read_byte(struct r8152 *tp, u16 type, u16 index)
578 588
579static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data) 589static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data)
580{ 590{
581 u32 tmp, mask = 0xff; 591 u32 mask = 0xff;
592 __le32 tmp;
582 u16 byen = BYTE_EN_BYTE; 593 u16 byen = BYTE_EN_BYTE;
583 u8 shift = index & 3; 594 u8 shift = index & 3;
584 595
@@ -591,19 +602,12 @@ static void ocp_write_byte(struct r8152 *tp, u16 type, u16 index, u32 data)
591 index &= ~3; 602 index &= ~3;
592 } 603 }
593 604
594 if (type == MCU_TYPE_PLA) 605 generic_ocp_read(tp, index, sizeof(tmp), &tmp, type);
595 pla_ocp_read(tp, index, sizeof(tmp), &tmp);
596 else
597 usb_ocp_read(tp, index, sizeof(tmp), &tmp);
598 606
599 tmp = __le32_to_cpu(tmp) & ~mask; 607 data |= __le32_to_cpu(tmp) & ~mask;
600 tmp |= data; 608 tmp = __cpu_to_le32(data);
601 tmp = __cpu_to_le32(tmp);
602 609
603 if (type == MCU_TYPE_PLA) 610 generic_ocp_write(tp, index, byen, sizeof(tmp), &tmp, type);
604 pla_ocp_write(tp, index, byen, sizeof(tmp), &tmp);
605 else
606 usb_ocp_write(tp, index, byen, sizeof(tmp), &tmp);
607} 611}
608 612
609static void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value) 613static void r8152_mdio_write(struct r8152 *tp, u32 reg_addr, u32 value)
@@ -685,21 +689,14 @@ static void ocp_reg_write(struct r8152 *tp, u16 addr, u16 data)
685static inline void set_ethernet_addr(struct r8152 *tp) 689static inline void set_ethernet_addr(struct r8152 *tp)
686{ 690{
687 struct net_device *dev = tp->netdev; 691 struct net_device *dev = tp->netdev;
688 u8 *node_id; 692 u8 node_id[8] = {0};
689
690 node_id = kmalloc(sizeof(u8) * 8, GFP_KERNEL);
691 if (!node_id) {
692 netif_err(tp, probe, dev, "out of memory");
693 return;
694 }
695 693
696 if (pla_ocp_read(tp, PLA_IDR, sizeof(u8) * 8, node_id) < 0) 694 if (pla_ocp_read(tp, PLA_IDR, sizeof(node_id), node_id) < 0)
697 netif_notice(tp, probe, dev, "inet addr fail\n"); 695 netif_notice(tp, probe, dev, "inet addr fail\n");
698 else { 696 else {
699 memcpy(dev->dev_addr, node_id, dev->addr_len); 697 memcpy(dev->dev_addr, node_id, dev->addr_len);
700 memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); 698 memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len);
701 } 699 }
702 kfree(node_id);
703} 700}
704 701
705static int rtl8152_set_mac_address(struct net_device *netdev, void *p) 702static int rtl8152_set_mac_address(struct net_device *netdev, void *p)
@@ -882,15 +879,10 @@ static void rtl8152_set_rx_mode(struct net_device *netdev)
882static void _rtl8152_set_rx_mode(struct net_device *netdev) 879static void _rtl8152_set_rx_mode(struct net_device *netdev)
883{ 880{
884 struct r8152 *tp = netdev_priv(netdev); 881 struct r8152 *tp = netdev_priv(netdev);
885 u32 tmp, *mc_filter; /* Multicast hash filter */ 882 u32 mc_filter[2]; /* Multicast hash filter */
883 __le32 tmp[2];
886 u32 ocp_data; 884 u32 ocp_data;
887 885
888 mc_filter = kmalloc(sizeof(u32) * 2, GFP_KERNEL);
889 if (!mc_filter) {
890 netif_err(tp, link, netdev, "out of memory");
891 return;
892 }
893
894 clear_bit(RTL8152_SET_RX_MODE, &tp->flags); 886 clear_bit(RTL8152_SET_RX_MODE, &tp->flags);
895 netif_stop_queue(netdev); 887 netif_stop_queue(netdev);
896 ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR); 888 ocp_data = ocp_read_dword(tp, MCU_TYPE_PLA, PLA_RCR);
@@ -918,14 +910,12 @@ static void _rtl8152_set_rx_mode(struct net_device *netdev)
918 } 910 }
919 } 911 }
920 912
921 tmp = mc_filter[0]; 913 tmp[0] = __cpu_to_le32(swab32(mc_filter[1]));
922 mc_filter[0] = __cpu_to_le32(swab32(mc_filter[1])); 914 tmp[1] = __cpu_to_le32(swab32(mc_filter[0]));
923 mc_filter[1] = __cpu_to_le32(swab32(tmp));
924 915
925 pla_ocp_write(tp, PLA_MAR, BYTE_EN_DWORD, sizeof(u32) * 2, mc_filter); 916 pla_ocp_write(tp, PLA_MAR, BYTE_EN_DWORD, sizeof(tmp), tmp);
926 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data); 917 ocp_write_dword(tp, MCU_TYPE_PLA, PLA_RCR, ocp_data);
927 netif_wake_queue(netdev); 918 netif_wake_queue(netdev);
928 kfree(mc_filter);
929} 919}
930 920
931static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb, 921static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb,
diff --git a/drivers/net/usb/r815x.c b/drivers/net/usb/r815x.c
index 852392269718..2df2f4fb42a7 100644
--- a/drivers/net/usb/r815x.c
+++ b/drivers/net/usb/r815x.c
@@ -24,34 +24,43 @@
24 24
25static int pla_read_word(struct usb_device *udev, u16 index) 25static int pla_read_word(struct usb_device *udev, u16 index)
26{ 26{
27 int data, ret; 27 int ret;
28 u8 shift = index & 2; 28 u8 shift = index & 2;
29 __le32 ocp_data; 29 __le32 *tmp;
30
31 tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
32 if (!tmp)
33 return -ENOMEM;
30 34
31 index &= ~3; 35 index &= ~3;
32 36
33 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 37 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
34 RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, 38 RTL815x_REQ_GET_REGS, RTL815x_REQT_READ,
35 index, MCU_TYPE_PLA, &ocp_data, sizeof(ocp_data), 39 index, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500);
36 500);
37 if (ret < 0) 40 if (ret < 0)
38 return ret; 41 goto out2;
39 42
40 data = __le32_to_cpu(ocp_data); 43 ret = __le32_to_cpu(*tmp);
41 data >>= (shift * 8); 44 ret >>= (shift * 8);
42 data &= 0xffff; 45 ret &= 0xffff;
43 46
44 return data; 47out2:
48 kfree(tmp);
49 return ret;
45} 50}
46 51
47static int pla_write_word(struct usb_device *udev, u16 index, u32 data) 52static int pla_write_word(struct usb_device *udev, u16 index, u32 data)
48{ 53{
49 __le32 ocp_data; 54 __le32 *tmp;
50 u32 mask = 0xffff; 55 u32 mask = 0xffff;
51 u16 byen = BYTE_EN_WORD; 56 u16 byen = BYTE_EN_WORD;
52 u8 shift = index & 2; 57 u8 shift = index & 2;
53 int ret; 58 int ret;
54 59
60 tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
61 if (!tmp)
62 return -ENOMEM;
63
55 data &= mask; 64 data &= mask;
56 65
57 if (shift) { 66 if (shift) {
@@ -63,19 +72,20 @@ static int pla_write_word(struct usb_device *udev, u16 index, u32 data)
63 72
64 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 73 ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
65 RTL815x_REQ_GET_REGS, RTL815x_REQT_READ, 74 RTL815x_REQ_GET_REGS, RTL815x_REQT_READ,
66 index, MCU_TYPE_PLA, &ocp_data, sizeof(ocp_data), 75 index, MCU_TYPE_PLA, tmp, sizeof(*tmp), 500);
67 500);
68 if (ret < 0) 76 if (ret < 0)
69 return ret; 77 goto out3;
70 78
71 data |= __le32_to_cpu(ocp_data) & ~mask; 79 data |= __le32_to_cpu(*tmp) & ~mask;
72 ocp_data = __cpu_to_le32(data); 80 *tmp = __cpu_to_le32(data);
73 81
74 ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 82 ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
75 RTL815x_REQ_SET_REGS, RTL815x_REQT_WRITE, 83 RTL815x_REQ_SET_REGS, RTL815x_REQT_WRITE,
76 index, MCU_TYPE_PLA | byen, &ocp_data, 84 index, MCU_TYPE_PLA | byen, tmp, sizeof(*tmp),
77 sizeof(ocp_data), 500); 85 500);
78 86
87out3:
88 kfree(tmp);
79 return ret; 89 return ret;
80} 90}
81 91
@@ -116,11 +126,18 @@ out1:
116static int r815x_mdio_read(struct net_device *netdev, int phy_id, int reg) 126static int r815x_mdio_read(struct net_device *netdev, int phy_id, int reg)
117{ 127{
118 struct usbnet *dev = netdev_priv(netdev); 128 struct usbnet *dev = netdev_priv(netdev);
129 int ret;
119 130
120 if (phy_id != R815x_PHY_ID) 131 if (phy_id != R815x_PHY_ID)
121 return -EINVAL; 132 return -EINVAL;
122 133
123 return ocp_reg_read(dev, BASE_MII + reg * 2); 134 if (usb_autopm_get_interface(dev->intf) < 0)
135 return -ENODEV;
136
137 ret = ocp_reg_read(dev, BASE_MII + reg * 2);
138
139 usb_autopm_put_interface(dev->intf);
140 return ret;
124} 141}
125 142
126static 143static
@@ -131,7 +148,12 @@ void r815x_mdio_write(struct net_device *netdev, int phy_id, int reg, int val)
131 if (phy_id != R815x_PHY_ID) 148 if (phy_id != R815x_PHY_ID)
132 return; 149 return;
133 150
151 if (usb_autopm_get_interface(dev->intf) < 0)
152 return;
153
134 ocp_reg_write(dev, BASE_MII + reg * 2, val); 154 ocp_reg_write(dev, BASE_MII + reg * 2, val);
155
156 usb_autopm_put_interface(dev->intf);
135} 157}
136 158
137static int r8153_bind(struct usbnet *dev, struct usb_interface *intf) 159static int r8153_bind(struct usbnet *dev, struct usb_interface *intf)
@@ -150,7 +172,7 @@ static int r8153_bind(struct usbnet *dev, struct usb_interface *intf)
150 dev->mii.phy_id = R815x_PHY_ID; 172 dev->mii.phy_id = R815x_PHY_ID;
151 dev->mii.supports_gmii = 1; 173 dev->mii.supports_gmii = 1;
152 174
153 return 0; 175 return status;
154} 176}
155 177
156static int r8152_bind(struct usbnet *dev, struct usb_interface *intf) 178static int r8152_bind(struct usbnet *dev, struct usb_interface *intf)
@@ -169,7 +191,7 @@ static int r8152_bind(struct usbnet *dev, struct usb_interface *intf)
169 dev->mii.phy_id = R815x_PHY_ID; 191 dev->mii.phy_id = R815x_PHY_ID;
170 dev->mii.supports_gmii = 0; 192 dev->mii.supports_gmii = 0;
171 193
172 return 0; 194 return status;
173} 195}
174 196
175static const struct driver_info r8152_info = { 197static const struct driver_info r8152_info = {
diff --git a/drivers/net/wireless/ath/ath10k/Kconfig b/drivers/net/wireless/ath/ath10k/Kconfig
index cde58fe96254..82e8088ca9b4 100644
--- a/drivers/net/wireless/ath/ath10k/Kconfig
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
@@ -1,6 +1,6 @@
1config ATH10K 1config ATH10K
2 tristate "Atheros 802.11ac wireless cards support" 2 tristate "Atheros 802.11ac wireless cards support"
3 depends on MAC80211 3 depends on MAC80211 && HAS_DMA
4 select ATH_COMMON 4 select ATH_COMMON
5 ---help--- 5 ---help---
6 This module adds support for wireless adapters based on 6 This module adds support for wireless adapters based on
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 277b37ae7126..7fa71f73cfe8 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -1093,8 +1093,11 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif)
1093 brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n "); 1093 brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n ");
1094 err = brcmf_fil_cmd_data_set(vif->ifp, 1094 err = brcmf_fil_cmd_data_set(vif->ifp,
1095 BRCMF_C_DISASSOC, NULL, 0); 1095 BRCMF_C_DISASSOC, NULL, 0);
1096 if (err) 1096 if (err) {
1097 brcmf_err("WLC_DISASSOC failed (%d)\n", err); 1097 brcmf_err("WLC_DISASSOC failed (%d)\n", err);
1098 cfg80211_disconnected(vif->wdev.netdev, 0,
1099 NULL, 0, GFP_KERNEL);
1100 }
1098 clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state); 1101 clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state);
1099 } 1102 }
1100 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state); 1103 clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h
index ff8cc75c189d..a70c7b9d9bad 100644
--- a/drivers/net/wireless/iwlwifi/iwl-prph.h
+++ b/drivers/net/wireless/iwlwifi/iwl-prph.h
@@ -97,6 +97,8 @@
97 97
98#define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) 98#define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800)
99 99
100#define APMG_RTC_INT_STT_RFKILL (0x10000000)
101
100/* Device system time */ 102/* Device system time */
101#define DEVICE_SYSTEM_TIME_REG 0xA0206C 103#define DEVICE_SYSTEM_TIME_REG 0xA0206C
102 104
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c
index 7e5e5c2f9f87..83da884cf303 100644
--- a/drivers/net/wireless/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/iwlwifi/mvm/d3.c
@@ -134,7 +134,7 @@ struct wowlan_key_data {
134 struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc; 134 struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc;
135 struct iwl_wowlan_tkip_params_cmd *tkip; 135 struct iwl_wowlan_tkip_params_cmd *tkip;
136 bool error, use_rsc_tsc, use_tkip; 136 bool error, use_rsc_tsc, use_tkip;
137 int gtk_key_idx; 137 int wep_key_idx;
138}; 138};
139 139
140static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, 140static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
@@ -188,8 +188,8 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
188 wkc.wep_key.key_offset = 0; 188 wkc.wep_key.key_offset = 0;
189 } else { 189 } else {
190 /* others start at 1 */ 190 /* others start at 1 */
191 data->gtk_key_idx++; 191 data->wep_key_idx++;
192 wkc.wep_key.key_offset = data->gtk_key_idx; 192 wkc.wep_key.key_offset = data->wep_key_idx;
193 } 193 }
194 194
195 ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC, 195 ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC,
@@ -316,8 +316,13 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
316 mvm->ptk_ivlen = key->iv_len; 316 mvm->ptk_ivlen = key->iv_len;
317 mvm->ptk_icvlen = key->icv_len; 317 mvm->ptk_icvlen = key->icv_len;
318 } else { 318 } else {
319 data->gtk_key_idx++; 319 /*
320 key->hw_key_idx = data->gtk_key_idx; 320 * firmware only supports TSC/RSC for a single key,
321 * so if there are multiple keep overwriting them
322 * with new ones -- this relies on mac80211 doing
323 * list_add_tail().
324 */
325 key->hw_key_idx = 1;
321 mvm->gtk_ivlen = key->iv_len; 326 mvm->gtk_ivlen = key->iv_len;
322 mvm->gtk_icvlen = key->icv_len; 327 mvm->gtk_icvlen = key->icv_len;
323 } 328 }
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
index b60d14151721..365095a0c3b3 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
@@ -69,7 +69,6 @@
69/* Scan Commands, Responses, Notifications */ 69/* Scan Commands, Responses, Notifications */
70 70
71/* Masks for iwl_scan_channel.type flags */ 71/* Masks for iwl_scan_channel.type flags */
72#define SCAN_CHANNEL_TYPE_PASSIVE 0
73#define SCAN_CHANNEL_TYPE_ACTIVE BIT(0) 72#define SCAN_CHANNEL_TYPE_ACTIVE BIT(0)
74#define SCAN_CHANNEL_NARROW_BAND BIT(22) 73#define SCAN_CHANNEL_NARROW_BAND BIT(22)
75 74
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 1eedc424051c..f19baf0dea6b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -512,6 +512,27 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
512 goto out_unlock; 512 goto out_unlock;
513 513
514 /* 514 /*
515 * TODO: remove this temporary code.
516 * Currently MVM FW supports power management only on single MAC.
517 * If new interface added, disable PM on existing interface.
518 * P2P device is a special case, since it is handled by FW similary to
519 * scan. If P2P deviced is added, PM remains enabled on existing
520 * interface.
521 * Note: the method below does not count the new interface being added
522 * at this moment.
523 */
524 if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
525 mvm->vif_count++;
526 if (mvm->vif_count > 1) {
527 IWL_DEBUG_MAC80211(mvm,
528 "Disable power on existing interfaces\n");
529 ieee80211_iterate_active_interfaces_atomic(
530 mvm->hw,
531 IEEE80211_IFACE_ITER_NORMAL,
532 iwl_mvm_pm_disable_iterator, mvm);
533 }
534
535 /*
515 * The AP binding flow can be done only after the beacon 536 * The AP binding flow can be done only after the beacon
516 * template is configured (which happens only in the mac80211 537 * template is configured (which happens only in the mac80211
517 * start_ap() flow), and adding the broadcast station can happen 538 * start_ap() flow), and adding the broadcast station can happen
@@ -534,27 +555,6 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
534 goto out_unlock; 555 goto out_unlock;
535 } 556 }
536 557
537 /*
538 * TODO: remove this temporary code.
539 * Currently MVM FW supports power management only on single MAC.
540 * If new interface added, disable PM on existing interface.
541 * P2P device is a special case, since it is handled by FW similary to
542 * scan. If P2P deviced is added, PM remains enabled on existing
543 * interface.
544 * Note: the method below does not count the new interface being added
545 * at this moment.
546 */
547 if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
548 mvm->vif_count++;
549 if (mvm->vif_count > 1) {
550 IWL_DEBUG_MAC80211(mvm,
551 "Disable power on existing interfaces\n");
552 ieee80211_iterate_active_interfaces_atomic(
553 mvm->hw,
554 IEEE80211_IFACE_ITER_NORMAL,
555 iwl_mvm_pm_disable_iterator, mvm);
556 }
557
558 ret = iwl_mvm_mac_ctxt_add(mvm, vif); 558 ret = iwl_mvm_mac_ctxt_add(mvm, vif);
559 if (ret) 559 if (ret)
560 goto out_release; 560 goto out_release;
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c
index 268f027b45b0..acdff6b67e04 100644
--- a/drivers/net/wireless/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
@@ -178,19 +178,12 @@ static void iwl_mvm_scan_fill_channels(struct iwl_scan_cmd *cmd,
178 struct iwl_scan_channel *chan = (struct iwl_scan_channel *) 178 struct iwl_scan_channel *chan = (struct iwl_scan_channel *)
179 (cmd->data + le16_to_cpu(cmd->tx_cmd.len)); 179 (cmd->data + le16_to_cpu(cmd->tx_cmd.len));
180 int i; 180 int i;
181 __le32 chan_type_value;
182
183 if (req->n_ssids > 0)
184 chan_type_value = cpu_to_le32(BIT(req->n_ssids) - 1);
185 else
186 chan_type_value = SCAN_CHANNEL_TYPE_PASSIVE;
187 181
188 for (i = 0; i < cmd->channel_count; i++) { 182 for (i = 0; i < cmd->channel_count; i++) {
189 chan->channel = cpu_to_le16(req->channels[i]->hw_value); 183 chan->channel = cpu_to_le16(req->channels[i]->hw_value);
184 chan->type = cpu_to_le32(BIT(req->n_ssids) - 1);
190 if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN) 185 if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN)
191 chan->type = SCAN_CHANNEL_TYPE_PASSIVE; 186 chan->type &= cpu_to_le32(~SCAN_CHANNEL_TYPE_ACTIVE);
192 else
193 chan->type = chan_type_value;
194 chan->active_dwell = cpu_to_le16(active_dwell); 187 chan->active_dwell = cpu_to_le16(active_dwell);
195 chan->passive_dwell = cpu_to_le16(passive_dwell); 188 chan->passive_dwell = cpu_to_le16(passive_dwell);
196 chan->iteration_count = cpu_to_le16(1); 189 chan->iteration_count = cpu_to_le16(1);
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.c b/drivers/net/wireless/iwlwifi/mvm/sta.c
index 85d4bbe52157..563f559b902d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/iwlwifi/mvm/sta.c
@@ -915,6 +915,7 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
915 struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv; 915 struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv;
916 struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; 916 struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
917 u16 txq_id; 917 u16 txq_id;
918 enum iwl_mvm_agg_state old_state;
918 919
919 /* 920 /*
920 * First set the agg state to OFF to avoid calling 921 * First set the agg state to OFF to avoid calling
@@ -924,13 +925,17 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
924 txq_id = tid_data->txq_id; 925 txq_id = tid_data->txq_id;
925 IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n", 926 IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n",
926 mvmsta->sta_id, tid, txq_id, tid_data->state); 927 mvmsta->sta_id, tid, txq_id, tid_data->state);
928 old_state = tid_data->state;
927 tid_data->state = IWL_AGG_OFF; 929 tid_data->state = IWL_AGG_OFF;
928 spin_unlock_bh(&mvmsta->lock); 930 spin_unlock_bh(&mvmsta->lock);
929 931
930 if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true)) 932 if (old_state >= IWL_AGG_ON) {
931 IWL_ERR(mvm, "Couldn't flush the AGG queue\n"); 933 if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
934 IWL_ERR(mvm, "Couldn't flush the AGG queue\n");
935
936 iwl_trans_txq_disable(mvm->trans, tid_data->txq_id);
937 }
932 938
933 iwl_trans_txq_disable(mvm->trans, tid_data->txq_id);
934 mvm->queue_to_mac80211[tid_data->txq_id] = 939 mvm->queue_to_mac80211[tid_data->txq_id] =
935 IWL_INVALID_MAC80211_QUEUE; 940 IWL_INVALID_MAC80211_QUEUE;
936 941
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c
index 81f3ea5b09a4..ff13458efc27 100644
--- a/drivers/net/wireless/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/iwlwifi/pcie/drv.c
@@ -130,6 +130,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
130 {IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */ 130 {IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */
131 {IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */ 131 {IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */
132 {IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */ 132 {IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */
133 {IWL_PCI_DEVICE(0x423C, 0x1326, iwl5150_abg_cfg)}, /* Half Mini Card */
133 134
134 {IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */ 135 {IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */
135 {IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */ 136 {IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c
index fd848cd1583e..f600e68a410a 100644
--- a/drivers/net/wireless/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/iwlwifi/pcie/rx.c
@@ -888,6 +888,14 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id)
888 888
889 iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill); 889 iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
890 if (hw_rfkill) { 890 if (hw_rfkill) {
891 /*
892 * Clear the interrupt in APMG if the NIC is going down.
893 * Note that when the NIC exits RFkill (else branch), we
894 * can't access prph and the NIC will be reset in
895 * start_hw anyway.
896 */
897 iwl_write_prph(trans, APMG_RTC_INT_STT_REG,
898 APMG_RTC_INT_STT_RFKILL);
891 set_bit(STATUS_RFKILL, &trans_pcie->status); 899 set_bit(STATUS_RFKILL, &trans_pcie->status);
892 if (test_and_clear_bit(STATUS_HCMD_ACTIVE, 900 if (test_and_clear_bit(STATUS_HCMD_ACTIVE,
893 &trans_pcie->status)) 901 &trans_pcie->status))
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index 826c15602c46..96cfcdd39079 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -670,6 +670,11 @@ static int iwl_trans_pcie_start_hw(struct iwl_trans *trans)
670 return err; 670 return err;
671 } 671 }
672 672
673 /* Reset the entire device */
674 iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
675
676 usleep_range(10, 15);
677
673 iwl_pcie_apm_init(trans); 678 iwl_pcie_apm_init(trans);
674 679
675 /* From now on, the op_mode will be kept updated about RF kill state */ 680 /* From now on, the op_mode will be kept updated about RF kill state */
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index ef5fa890a286..89459db4c53b 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -1716,9 +1716,9 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
1716 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); 1716 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
1717 int ret; 1717 int ret;
1718 1718
1719 if (priv->bss_mode != NL80211_IFTYPE_STATION) { 1719 if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) {
1720 wiphy_err(wiphy, 1720 wiphy_err(wiphy,
1721 "%s: reject infra assoc request in non-STA mode\n", 1721 "%s: reject infra assoc request in non-STA role\n",
1722 dev->name); 1722 dev->name);
1723 return -EINVAL; 1723 return -EINVAL;
1724 } 1724 }
diff --git a/drivers/net/wireless/mwifiex/cfp.c b/drivers/net/wireless/mwifiex/cfp.c
index 988552dece75..5178c4630d89 100644
--- a/drivers/net/wireless/mwifiex/cfp.c
+++ b/drivers/net/wireless/mwifiex/cfp.c
@@ -415,7 +415,8 @@ u32 mwifiex_get_supported_rates(struct mwifiex_private *priv, u8 *rates)
415 u32 k = 0; 415 u32 k = 0;
416 struct mwifiex_adapter *adapter = priv->adapter; 416 struct mwifiex_adapter *adapter = priv->adapter;
417 417
418 if (priv->bss_mode == NL80211_IFTYPE_STATION) { 418 if (priv->bss_mode == NL80211_IFTYPE_STATION ||
419 priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) {
419 switch (adapter->config_bands) { 420 switch (adapter->config_bands) {
420 case BAND_B: 421 case BAND_B:
421 dev_dbg(adapter->dev, "info: infra band=%d " 422 dev_dbg(adapter->dev, "info: infra band=%d "
diff --git a/drivers/net/wireless/mwifiex/join.c b/drivers/net/wireless/mwifiex/join.c
index 1c8a771e8e81..12e778159ec5 100644
--- a/drivers/net/wireless/mwifiex/join.c
+++ b/drivers/net/wireless/mwifiex/join.c
@@ -1291,8 +1291,10 @@ int mwifiex_associate(struct mwifiex_private *priv,
1291{ 1291{
1292 u8 current_bssid[ETH_ALEN]; 1292 u8 current_bssid[ETH_ALEN];
1293 1293
1294 /* Return error if the adapter or table entry is not marked as infra */ 1294 /* Return error if the adapter is not STA role or table entry
1295 if ((priv->bss_mode != NL80211_IFTYPE_STATION) || 1295 * is not marked as infra.
1296 */
1297 if ((GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) ||
1296 (bss_desc->bss_mode != NL80211_IFTYPE_STATION)) 1298 (bss_desc->bss_mode != NL80211_IFTYPE_STATION))
1297 return -1; 1299 return -1;
1298 1300
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
index 5ef49f2e375a..09185c963248 100644
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -1639,8 +1639,8 @@ static int mwifiex_sdio_host_to_card(struct mwifiex_adapter *adapter,
1639 /* Allocate buffer and copy payload */ 1639 /* Allocate buffer and copy payload */
1640 blk_size = MWIFIEX_SDIO_BLOCK_SIZE; 1640 blk_size = MWIFIEX_SDIO_BLOCK_SIZE;
1641 buf_block_len = (pkt_len + blk_size - 1) / blk_size; 1641 buf_block_len = (pkt_len + blk_size - 1) / blk_size;
1642 *(u16 *) &payload[0] = (u16) pkt_len; 1642 *(__le16 *)&payload[0] = cpu_to_le16((u16)pkt_len);
1643 *(u16 *) &payload[2] = type; 1643 *(__le16 *)&payload[2] = cpu_to_le16(type);
1644 1644
1645 /* 1645 /*
1646 * This is SDIO specific header 1646 * This is SDIO specific header
diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c
index 206c3e038072..8af97abf7108 100644
--- a/drivers/net/wireless/mwifiex/sta_ioctl.c
+++ b/drivers/net/wireless/mwifiex/sta_ioctl.c
@@ -257,10 +257,10 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
257 goto done; 257 goto done;
258 } 258 }
259 259
260 if (priv->bss_mode == NL80211_IFTYPE_STATION) { 260 if (priv->bss_mode == NL80211_IFTYPE_STATION ||
261 priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) {
261 u8 config_bands; 262 u8 config_bands;
262 263
263 /* Infra mode */
264 ret = mwifiex_deauthenticate(priv, NULL); 264 ret = mwifiex_deauthenticate(priv, NULL);
265 if (ret) 265 if (ret)
266 goto done; 266 goto done;
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 6c0a91ff963c..aa95c6cf3545 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -936,13 +936,8 @@ void rt2x00queue_index_inc(struct queue_entry *entry, enum queue_index index)
936 spin_unlock_irqrestore(&queue->index_lock, irqflags); 936 spin_unlock_irqrestore(&queue->index_lock, irqflags);
937} 937}
938 938
939void rt2x00queue_pause_queue(struct data_queue *queue) 939void rt2x00queue_pause_queue_nocheck(struct data_queue *queue)
940{ 940{
941 if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) ||
942 !test_bit(QUEUE_STARTED, &queue->flags) ||
943 test_and_set_bit(QUEUE_PAUSED, &queue->flags))
944 return;
945
946 switch (queue->qid) { 941 switch (queue->qid) {
947 case QID_AC_VO: 942 case QID_AC_VO:
948 case QID_AC_VI: 943 case QID_AC_VI:
@@ -958,6 +953,15 @@ void rt2x00queue_pause_queue(struct data_queue *queue)
958 break; 953 break;
959 } 954 }
960} 955}
956void rt2x00queue_pause_queue(struct data_queue *queue)
957{
958 if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) ||
959 !test_bit(QUEUE_STARTED, &queue->flags) ||
960 test_and_set_bit(QUEUE_PAUSED, &queue->flags))
961 return;
962
963 rt2x00queue_pause_queue_nocheck(queue);
964}
961EXPORT_SYMBOL_GPL(rt2x00queue_pause_queue); 965EXPORT_SYMBOL_GPL(rt2x00queue_pause_queue);
962 966
963void rt2x00queue_unpause_queue(struct data_queue *queue) 967void rt2x00queue_unpause_queue(struct data_queue *queue)
@@ -1019,7 +1023,7 @@ void rt2x00queue_stop_queue(struct data_queue *queue)
1019 return; 1023 return;
1020 } 1024 }
1021 1025
1022 rt2x00queue_pause_queue(queue); 1026 rt2x00queue_pause_queue_nocheck(queue);
1023 1027
1024 queue->rt2x00dev->ops->lib->stop_queue(queue); 1028 queue->rt2x00dev->ops->lib->stop_queue(queue);
1025 1029