Search Linux Wireless

[PATCH 1/2] ath9k: Fix warnings on card removal

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



There is no point in doing register read/write operations
when is hardware is not present. This leads to unnecessary
warnings on log. This patch resolves the following
warnings on card removal.

ath: Failed to wakeup in 500us
------------[ cut here ]------------
WARNING: at drivers/net/wireless/ath/ath9k/hw.c:1618
ath9k_hw_setpower+0x61f/0x630 [ath9k_hw]()
Hardware name: 64756D6
Pid: 540, comm: kworker/u:3 Not tainted 2.6.37-rc6-wl #37
Call Trace:
 [<ffffffff810501aa>] warn_slowpath_common+0x7a/0xb0
 [<ffffffffa056e280>] ? ath9k_iowrite32+0x0/0x90 [ath9k]
 [<ffffffff810501f5>] warn_slowpath_null+0x15/0x20
 [<ffffffffa05226ef>] ath9k_hw_setpower+0x61f/0x630 [ath9k_hw]
 [<ffffffffa05700e5>] ath9k_ps_wakeup+0x85/0xd0 [ath9k]
 [<ffffffffa0570685>] ath9k_configure_filter+0x25/0x80 [ath9k]
 [<ffffffffa04dde43>] ieee80211_configure_filter+0x133/0x190 [mac80211]
 [<ffffffffa04ee502>] ieee80211_do_stop+0x132/0x540 [mac80211]
 [<ffffffff813466ff>] ? _raw_spin_unlock_bh+0x1f/0x30
 [<ffffffff812b6923>] ? dev_deactivate+0x1c3/0x1e0
 [<ffffffffa04ee925>] ieee80211_stop+0x15/0x20 [mac80211]
 [<ffffffff8129d1b6>] __dev_close+0x56/0x90
 [<ffffffff8129d20a>] dev_close+0x1a/0x50
 [<ffffffff8129d57a>] rollback_registered_many+0x6a/0x250
 [<ffffffff8129d776>] unregister_netdevice_many+0x16/0x80
 [<ffffffffa04ee0f4>] ieee80211_remove_interfaces+0xb4/0xf0 [mac80211]
 [<ffffffffa04dd0be>] ieee80211_unregister_hw+0x4e/0x110 [mac80211]
 [<ffffffffa056f467>] ath9k_deinit_device+0x87/0xd0 [ath9k]
 [<ffffffffa057d029>] ath_pci_remove+0x49/0x90 [ath9k]

ath: Could not stop RX, we could be confusing the DMA engine when we
start RX up
------------[ cut here ]------------
WARNING: at drivers/net/wireless/ath/ath9k/recv.c:535
ath_stoprecv+0xdc/0xf0 [ath9k]()
Hardware name: 64756D6
Pid: 5493, comm: kworker/u:0 Tainted: G        W   2.6.37-rc5-wl+ #34
Call Trace:
 [<ffffffff8105018a>] warn_slowpath_common+0x7a/0xb0
 [<ffffffff810501d5>] warn_slowpath_null+0x15/0x20
 [<ffffffffa030806c>] ath_stoprecv+0xdc/0xf0 [ath9k]
 [<ffffffffa0306891>] ath9k_stop+0x221/0x260 [ath9k]
 [<ffffffffa052e387>] ieee80211_stop_device+0x57/0x90 [mac80211]
 [<ffffffffa051f63f>] ieee80211_do_stop+0x26f/0x540 [mac80211]
 [<ffffffff8134678f>] ? _raw_spin_unlock_bh+0x1f/0x30
 [<ffffffff812b6983>] ? dev_deactivate+0x1c3/0x1e0
 [<ffffffffa051f925>] ieee80211_stop+0x15/0x20 [mac80211]
 [<ffffffff8129d226>] __dev_close+0x56/0x90
 [<ffffffff8129d27a>] dev_close+0x1a/0x50

Signed-off-by: Rajkumar Manoharan <rmanoharan@xxxxxxxxxxx>
---
 drivers/net/wireless/ath/ath9k/eeprom.h |    3 ++-
 drivers/net/wireless/ath/ath9k/gpio.c   |    3 ++-
 drivers/net/wireless/ath/ath9k/init.c   |    5 +++--
 drivers/net/wireless/ath/ath9k/main.c   |   20 ++++++++++++++++++++
 drivers/net/wireless/ath/ath9k/pci.c    |    1 +
 5 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/eeprom.h b/drivers/net/wireless/ath/ath9k/eeprom.h
index f6f09d1..c0942f7 100644
--- a/drivers/net/wireless/ath/ath9k/eeprom.h
+++ b/drivers/net/wireless/ath/ath9k/eeprom.h
@@ -23,7 +23,8 @@
 #include <net/cfg80211.h>
 #include "ar9003_eeprom.h"
 
-#define AH_USE_EEPROM   0x1
+#define AH_USE_EEPROM   0x00000001
+#define AH_UNPLUGGED    0x00000002
 
 #ifdef __BIG_ENDIAN
 #define AR5416_EEPROM_MAGIC 0x5aa5
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c
index 1337640..978a223 100644
--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
@@ -125,7 +125,8 @@ void ath_deinit_leds(struct ath_softc *sc)
 	ath_unregister_led(&sc->tx_led);
 	ath_unregister_led(&sc->rx_led);
 	ath_unregister_led(&sc->radio_led);
-	ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1);
+	if (!(sc->sc_ah->ah_flags & AH_UNPLUGGED))
+		ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1);
 }
 
 void ath_init_leds(struct ath_softc *sc)
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
index 1238795..8cf2414 100644
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -542,6 +542,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
 	if (!sc->dev->platform_data)
 		ah->ah_flags |= AH_USE_EEPROM;
 
+	sc->sc_ah->ah_flags &= ~AH_UNPLUGGED;
 	common = ath9k_hw_common(ah);
 	common->ops = &ath9k_common_ops;
 	common->bus_ops = bus_ops;
@@ -818,8 +819,8 @@ void ath9k_deinit_device(struct ath_softc *sc)
 	struct ieee80211_hw *hw = sc->hw;
 	int i = 0;
 
-	ath9k_ps_wakeup(sc);
-
+	if (!(sc->sc_ah->ah_flags & AH_UNPLUGGED))
+		ath9k_ps_wakeup(sc);
 	wiphy_rfkill_stop_polling(sc->hw->wiphy);
 	ath_deinit_leds(sc);
 
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index cb53fbb..e06a44e 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -1220,6 +1220,12 @@ static int ath9k_tx(struct ieee80211_hw *hw,
 	struct ath_tx_control txctl;
 	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
 
+	if (sc->sc_ah->ah_flags & AH_UNPLUGGED) {
+		ath_dbg(common, ATH_DBG_ANY,
+			"Device not present, can not xmit\n");
+		goto exit;
+	}
+
 	if (aphy->state != ATH_WIPHY_ACTIVE && aphy->state != ATH_WIPHY_SCAN) {
 		ath_dbg(common, ATH_DBG_XMIT,
 			"ath9k: %s: TX in unexpected wiphy state %d\n",
@@ -1318,6 +1324,12 @@ static void ath9k_stop(struct ieee80211_hw *hw)
 		return;
 	}
 
+	if (ah->ah_flags & AH_UNPLUGGED) {
+		ath_dbg(common, ATH_DBG_ANY, "Device not present\n");
+		mutex_unlock(&sc->mutex);
+		return;
+	}
+
 	if (ath9k_wiphy_started(sc)) {
 		mutex_unlock(&sc->mutex);
 		return; /* another wiphy still in use */
@@ -1585,6 +1597,11 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
 
 	mutex_lock(&sc->mutex);
 
+	if (ah->ah_flags & AH_UNPLUGGED) {
+		mutex_unlock(&sc->mutex);
+		return 0;
+	}
+
 	/*
 	 * Leave this as the first check because we need to turn on the
 	 * radio if it was disabled before prior to processing the rest
@@ -1765,6 +1782,9 @@ static void ath9k_configure_filter(struct ieee80211_hw *hw,
 	changed_flags &= SUPPORTED_FILTERS;
 	*total_flags &= SUPPORTED_FILTERS;
 
+	if (sc->sc_ah->ah_flags & AH_UNPLUGGED)
+		return;
+
 	sc->rx.rxfilter = *total_flags;
 	ath9k_ps_wakeup(sc);
 	rfilt = ath_calcrxfilter(sc);
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c
index 7ca8499..96c6005 100644
--- a/drivers/net/wireless/ath/ath9k/pci.c
+++ b/drivers/net/wireless/ath/ath9k/pci.c
@@ -264,6 +264,7 @@ static void ath_pci_remove(struct pci_dev *pdev)
 	struct ath_softc *sc = aphy->sc;
 	void __iomem *mem = sc->mem;
 
+	sc->sc_ah->ah_flags |= AH_UNPLUGGED;
 	ath9k_deinit_device(sc);
 	free_irq(sc->irq, sc);
 	ieee80211_free_hw(sc->hw);
-- 
1.7.3.3

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux