aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtl818x/rtl8187_dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rtl818x/rtl8187_dev.c')
-rw-r--r--drivers/net/wireless/rtl818x/rtl8187_dev.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/net/wireless/rtl818x/rtl8187_dev.c b/drivers/net/wireless/rtl818x/rtl8187_dev.c
index 90f38357393c..9679b29e1c49 100644
--- a/drivers/net/wireless/rtl818x/rtl8187_dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8187_dev.c
@@ -32,6 +32,7 @@
32#ifdef CONFIG_RTL8187_LEDS 32#ifdef CONFIG_RTL8187_LEDS
33#include "rtl8187_leds.h" 33#include "rtl8187_leds.h"
34#endif 34#endif
35#include "rtl8187_rfkill.h"
35 36
36MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>"); 37MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
37MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>"); 38MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>");
@@ -648,10 +649,10 @@ static int rtl8187_init_hw(struct ieee80211_hw *dev)
648 649
649 /* setup card */ 650 /* setup card */
650 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0); 651 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0);
651 rtl818x_iowrite8(priv, &priv->map->GPIO, 0); 652 rtl818x_iowrite8(priv, &priv->map->GPIO0, 0);
652 653
653 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, (4 << 8)); 654 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, (4 << 8));
654 rtl818x_iowrite8(priv, &priv->map->GPIO, 1); 655 rtl818x_iowrite8(priv, &priv->map->GPIO0, 1);
655 rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0); 656 rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0);
656 657
657 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); 658 rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG);
@@ -674,11 +675,11 @@ static int rtl8187_init_hw(struct ieee80211_hw *dev)
674 675
675 /* host_usb_init */ 676 /* host_usb_init */
676 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0); 677 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0);
677 rtl818x_iowrite8(priv, &priv->map->GPIO, 0); 678 rtl818x_iowrite8(priv, &priv->map->GPIO0, 0);
678 reg = rtl818x_ioread8(priv, (u8 *)0xFE53); 679 reg = rtl818x_ioread8(priv, (u8 *)0xFE53);
679 rtl818x_iowrite8(priv, (u8 *)0xFE53, reg | (1 << 7)); 680 rtl818x_iowrite8(priv, (u8 *)0xFE53, reg | (1 << 7));
680 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, (4 << 8)); 681 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, (4 << 8));
681 rtl818x_iowrite8(priv, &priv->map->GPIO, 0x20); 682 rtl818x_iowrite8(priv, &priv->map->GPIO0, 0x20);
682 rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0); 683 rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, 0);
683 rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 0x80); 684 rtl818x_iowrite16(priv, &priv->map->RFPinsOutput, 0x80);
684 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0x80); 685 rtl818x_iowrite16(priv, &priv->map->RFPinsSelect, 0x80);
@@ -907,12 +908,12 @@ static int rtl8187_start(struct ieee80211_hw *dev)
907 u32 reg; 908 u32 reg;
908 int ret; 909 int ret;
909 910
911 mutex_lock(&priv->conf_mutex);
912
910 ret = (!priv->is_rtl8187b) ? rtl8187_init_hw(dev) : 913 ret = (!priv->is_rtl8187b) ? rtl8187_init_hw(dev) :
911 rtl8187b_init_hw(dev); 914 rtl8187b_init_hw(dev);
912 if (ret) 915 if (ret)
913 return ret; 916 goto rtl8187_start_exit;
914
915 mutex_lock(&priv->conf_mutex);
916 917
917 init_usb_anchor(&priv->anchored); 918 init_usb_anchor(&priv->anchored);
918 priv->dev = dev; 919 priv->dev = dev;
@@ -939,8 +940,7 @@ static int rtl8187_start(struct ieee80211_hw *dev)
939 (7 << 21 /* MAX TX DMA */)); 940 (7 << 21 /* MAX TX DMA */));
940 rtl8187_init_urbs(dev); 941 rtl8187_init_urbs(dev);
941 rtl8187b_init_status_urb(dev); 942 rtl8187b_init_status_urb(dev);
942 mutex_unlock(&priv->conf_mutex); 943 goto rtl8187_start_exit;
943 return 0;
944 } 944 }
945 945
946 rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0xFFFF); 946 rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0xFFFF);
@@ -984,9 +984,10 @@ static int rtl8187_start(struct ieee80211_hw *dev)
984 reg |= RTL818X_CMD_RX_ENABLE; 984 reg |= RTL818X_CMD_RX_ENABLE;
985 rtl818x_iowrite8(priv, &priv->map->CMD, reg); 985 rtl818x_iowrite8(priv, &priv->map->CMD, reg);
986 INIT_DELAYED_WORK(&priv->work, rtl8187_work); 986 INIT_DELAYED_WORK(&priv->work, rtl8187_work);
987 mutex_unlock(&priv->conf_mutex);
988 987
989 return 0; 988rtl8187_start_exit:
989 mutex_unlock(&priv->conf_mutex);
990 return ret;
990} 991}
991 992
992static void rtl8187_stop(struct ieee80211_hw *dev) 993static void rtl8187_stop(struct ieee80211_hw *dev)
@@ -1014,9 +1015,10 @@ static void rtl8187_stop(struct ieee80211_hw *dev)
1014 dev_kfree_skb_any(skb); 1015 dev_kfree_skb_any(skb);
1015 1016
1016 usb_kill_anchored_urbs(&priv->anchored); 1017 usb_kill_anchored_urbs(&priv->anchored);
1018 mutex_unlock(&priv->conf_mutex);
1019
1017 if (!priv->is_rtl8187b) 1020 if (!priv->is_rtl8187b)
1018 cancel_delayed_work_sync(&priv->work); 1021 cancel_delayed_work_sync(&priv->work);
1019 mutex_unlock(&priv->conf_mutex);
1020} 1022}
1021 1023
1022static int rtl8187_add_interface(struct ieee80211_hw *dev, 1024static int rtl8187_add_interface(struct ieee80211_hw *dev,
@@ -1276,7 +1278,8 @@ static const struct ieee80211_ops rtl8187_ops = {
1276 .bss_info_changed = rtl8187_bss_info_changed, 1278 .bss_info_changed = rtl8187_bss_info_changed,
1277 .prepare_multicast = rtl8187_prepare_multicast, 1279 .prepare_multicast = rtl8187_prepare_multicast,
1278 .configure_filter = rtl8187_configure_filter, 1280 .configure_filter = rtl8187_configure_filter,
1279 .conf_tx = rtl8187_conf_tx 1281 .conf_tx = rtl8187_conf_tx,
1282 .rfkill_poll = rtl8187_rfkill_poll
1280}; 1283};
1281 1284
1282static void rtl8187_eeprom_register_read(struct eeprom_93cx6 *eeprom) 1285static void rtl8187_eeprom_register_read(struct eeprom_93cx6 *eeprom)
@@ -1516,6 +1519,7 @@ static int __devinit rtl8187_probe(struct usb_interface *intf,
1516 reg &= 0xFF; 1519 reg &= 0xFF;
1517 rtl8187_leds_init(dev, reg); 1520 rtl8187_leds_init(dev, reg);
1518#endif 1521#endif
1522 rtl8187_rfkill_init(dev);
1519 1523
1520 return 0; 1524 return 0;
1521 1525
@@ -1539,6 +1543,7 @@ static void __devexit rtl8187_disconnect(struct usb_interface *intf)
1539#ifdef CONFIG_RTL8187_LEDS 1543#ifdef CONFIG_RTL8187_LEDS
1540 rtl8187_leds_exit(dev); 1544 rtl8187_leds_exit(dev);
1541#endif 1545#endif
1546 rtl8187_rfkill_exit(dev);
1542 ieee80211_unregister_hw(dev); 1547 ieee80211_unregister_hw(dev);
1543 1548
1544 priv = dev->priv; 1549 priv = dev->priv;