ath9k_htc: Fix warning on device removal
authorSujith Manoharan <Sujith.Manoharan@atheros.com>
Mon, 20 Dec 2010 02:32:42 +0000 (08:02 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 22 Dec 2010 20:43:25 +0000 (15:43 -0500)
The commit "ath9k_hw: warn if we cannot change the power to the chip"
introduced a new warning to indicate chip powerup failures, but this
is not required for devices that have been removed. Handle USB device
removal properly by checking for unplugged status.

For PCI devices, this warning will still be seen when the card is pulled
out, not sure how to check for card removal.

Signed-off-by: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/eeprom.h
drivers/net/wireless/ath/ath9k/hif_usb.c
drivers/net/wireless/ath/ath9k/htc.h
drivers/net/wireless/ath/ath9k/htc_drv_init.c
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/ath/ath9k/wmi.c

index f6f09d1378f4c15b65782ebbed4fb8681b2d6e7b..58e2ddc927a9878309c17cc3fb021e7466319c4d 100644 (file)
@@ -23,8 +23,6 @@
 #include <net/cfg80211.h>
 #include "ar9003_eeprom.h"
 
-#define AH_USE_EEPROM   0x1
-
 #ifdef __BIG_ENDIAN
 #define AR5416_EEPROM_MAGIC 0x5aa5
 #else
index 22b68b3c856693d2aada4419db6aa003a807f31d..c20c8c8201a26b659ea3fc146b5663745cef7f09 100644 (file)
@@ -993,16 +993,16 @@ static void ath9k_hif_usb_disconnect(struct usb_interface *interface)
 {
        struct usb_device *udev = interface_to_usbdev(interface);
        struct hif_device_usb *hif_dev = usb_get_intfdata(interface);
+       bool unplugged = (udev->state == USB_STATE_NOTATTACHED) ? true : false;
 
        if (hif_dev) {
-               ath9k_htc_hw_deinit(hif_dev->htc_handle,
-                   (udev->state == USB_STATE_NOTATTACHED) ? true : false);
+               ath9k_htc_hw_deinit(hif_dev->htc_handle, unplugged);
                ath9k_htc_hw_free(hif_dev->htc_handle);
                ath9k_hif_usb_dev_deinit(hif_dev);
                usb_set_intfdata(interface, NULL);
        }
 
-       if (hif_dev->flags & HIF_USB_START)
+       if (!unplugged && (hif_dev->flags & HIF_USB_START))
                ath9k_hif_usb_reboot(udev);
 
        kfree(hif_dev);
index fdf9d5fe8cc0bc7c41d6a8682dfcc9521f165e10..e6c2f0aad28f5b474acf434f64584daa8eb09b53 100644 (file)
@@ -339,9 +339,8 @@ void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv);
 #define OP_ASSOCIATED             BIT(7)
 #define OP_ENABLE_BEACON          BIT(8)
 #define OP_LED_DEINIT             BIT(9)
-#define OP_UNPLUGGED              BIT(10)
-#define OP_BT_PRIORITY_DETECTED           BIT(11)
-#define OP_BT_SCAN                BIT(12)
+#define OP_BT_PRIORITY_DETECTED    BIT(10)
+#define OP_BT_SCAN                 BIT(11)
 
 struct ath9k_htc_priv {
        struct device *dev;
index 0f6be350fd3cce6db5f9dbffd4c994f6780ff9ca..724f5451a4157aa36c82c4c557cbdaff7f7f4d27 100644 (file)
@@ -851,9 +851,6 @@ int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
        if (ret)
                goto err_init;
 
-       /* The device may have been unplugged earlier. */
-       priv->op_flags &= ~OP_UNPLUGGED;
-
        ret = ath9k_init_device(priv, devid, product, drv_info);
        if (ret)
                goto err_init;
@@ -873,7 +870,7 @@ void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
 
                /* Check if the device has been yanked out. */
                if (hotunplug)
-                       htc_handle->drv_priv->op_flags |= OP_UNPLUGGED;
+                       htc_handle->drv_priv->ah->ah_flags |= AH_UNPLUGGED;
 
                ath9k_deinit_device(htc_handle->drv_priv);
                ath9k_deinit_wmi(htc_handle->drv_priv);
index 4b51ed47fe6902783d75cc7ce24098ec35764dd5..fde978665e07c63328e675823eb6d53f65fbf7c7 100644 (file)
@@ -1615,7 +1615,9 @@ bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
         * simply keep the ATH_DBG_WARN_ON_ONCE() but make
         * ath9k_hw_setpower() return type void.
         */
-       ATH_DBG_WARN_ON_ONCE(!status);
+
+       if (!(ah->ah_flags & AH_UNPLUGGED))
+               ATH_DBG_WARN_ON_ONCE(!status);
 
        return status;
 }
index b8ffaa5dc650ca55580bc5dffd50fe01b4a17848..5a3dfec45e96004d02c84a33cbb39ff9aa201d45 100644 (file)
@@ -646,6 +646,10 @@ struct ath_nf_limits {
        s16 nominal;
 };
 
+/* ah_flags */
+#define AH_USE_EEPROM   0x1
+#define AH_UNPLUGGED    0x2 /* The card has been physically removed. */
+
 struct ath_hw {
        struct ieee80211_hw *hw;
        struct ath_common common;
index 8f42ea78198cbd02e23c5fe15e9fa48242ece967..573daca135fdcac1c0bb58a5ac8441be762e5b9d 100644 (file)
@@ -250,7 +250,7 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
        int time_left, ret = 0;
        unsigned long flags;
 
-       if (wmi->drv_priv->op_flags & OP_UNPLUGGED)
+       if (ah->ah_flags & AH_UNPLUGGED)
                return 0;
 
        skb = alloc_skb(headroom + cmd_len, GFP_ATOMIC);