rtl8xxxu: Only setup USB interrupts for parts which support it
authorJes Sorensen <Jes.Sorensen@redhat.com>
Mon, 29 Feb 2016 22:04:13 +0000 (17:04 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 10 Mar 2016 13:28:56 +0000 (15:28 +0200)
Only 1st generation chips do provide USB interrupts, so do not try to
setup interrupts for newer chips (8192eu and 8723bu).

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h

index 93f6b714d98b5461836589135e318238407c3373..467c0bcaadb1450ca9b2b32d05fd57935a27b9a1 100644 (file)
@@ -1707,6 +1707,7 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
                        priv->rtlchip = 0x8723b;
                } else {
                        sprintf(priv->chip_name, "8723AU");
+                       priv->usb_interrupts = 1;
                        priv->rtlchip = 0x8723a;
                }
 
@@ -1744,12 +1745,14 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
                        priv->rf_paths = 2;
                        priv->rx_paths = 2;
                        priv->tx_paths = 1;
+                       priv->usb_interrupts = 1;
                        priv->rtlchip = 0x8191c;
                } else {
                        sprintf(priv->chip_name, "8192CU");
                        priv->rf_paths = 2;
                        priv->rx_paths = 2;
                        priv->tx_paths = 2;
+                       priv->usb_interrupts = 1;
                        priv->rtlchip = 0x8192c;
                }
                priv->has_wifi = 1;
@@ -1759,6 +1762,7 @@ static int rtl8xxxu_identify_chip(struct rtl8xxxu_priv *priv)
                priv->rx_paths = 1;
                priv->tx_paths = 1;
                priv->rtlchip = 0x8188c;
+               priv->usb_interrupts = 1;
                priv->has_wifi = 1;
        }
 
@@ -5825,9 +5829,11 @@ static int rtl8xxxu_start(struct ieee80211_hw *hw)
        init_usb_anchor(&priv->int_anchor);
 
        rtl8723a_enable_rf(priv);
-       ret = rtl8xxxu_submit_int_urb(hw);
-       if (ret)
-               goto exit;
+       if (priv->usb_interrupts) {
+               ret = rtl8xxxu_submit_int_urb(hw);
+               if (ret)
+                       goto exit;
+       }
 
        for (i = 0; i < RTL8XXXU_TX_URBS; i++) {
                tx_urb = kmalloc(sizeof(struct rtl8xxxu_tx_urb), GFP_KERNEL);
@@ -5902,14 +5908,16 @@ static void rtl8xxxu_stop(struct ieee80211_hw *hw)
 
        usb_kill_anchored_urbs(&priv->rx_anchor);
        usb_kill_anchored_urbs(&priv->tx_anchor);
-       usb_kill_anchored_urbs(&priv->int_anchor);
+       if (priv->usb_interrupts)
+               usb_kill_anchored_urbs(&priv->int_anchor);
 
        rtl8723a_disable_rf(priv);
 
        /*
         * Disable interrupts
         */
-       rtl8xxxu_write32(priv, REG_USB_HIMR, 0);
+       if (priv->usb_interrupts)
+               rtl8xxxu_write32(priv, REG_USB_HIMR, 0);
 
        rtl8xxxu_free_rx_resources(priv);
        rtl8xxxu_free_tx_resources(priv);
index bf424db90901a2b1303e3ea55f992e0599add743..20550484855862f2a4e8a14fcdab5cde498d8153 100644 (file)
@@ -693,6 +693,7 @@ struct rtl8xxxu_priv {
        u32 has_polarity_ctrl:1;
        u32 has_eeprom:1;
        u32 boot_eeprom:1;
+       u32 usb_interrupts:1;
        u32 ep_tx_high_queue:1;
        u32 ep_tx_normal_queue:1;
        u32 ep_tx_low_queue:1;