diff options
Diffstat (limited to 'drivers/net/wireless/rtl8187_dev.c')
-rw-r--r-- | drivers/net/wireless/rtl8187_dev.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c index 177988efd660..57376fb993ed 100644 --- a/drivers/net/wireless/rtl8187_dev.c +++ b/drivers/net/wireless/rtl8187_dev.c | |||
@@ -31,6 +31,8 @@ MODULE_DESCRIPTION("RTL8187/RTL8187B USB wireless driver"); | |||
31 | MODULE_LICENSE("GPL"); | 31 | MODULE_LICENSE("GPL"); |
32 | 32 | ||
33 | static struct usb_device_id rtl8187_table[] __devinitdata = { | 33 | static struct usb_device_id rtl8187_table[] __devinitdata = { |
34 | /* Asus */ | ||
35 | {USB_DEVICE(0x0b05, 0x171d), .driver_info = DEVICE_RTL8187}, | ||
34 | /* Realtek */ | 36 | /* Realtek */ |
35 | {USB_DEVICE(0x0bda, 0x8187), .driver_info = DEVICE_RTL8187}, | 37 | {USB_DEVICE(0x0bda, 0x8187), .driver_info = DEVICE_RTL8187}, |
36 | {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B}, | 38 | {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B}, |
@@ -726,6 +728,7 @@ static int rtl8187_start(struct ieee80211_hw *dev) | |||
726 | if (ret) | 728 | if (ret) |
727 | return ret; | 729 | return ret; |
728 | 730 | ||
731 | mutex_lock(&priv->conf_mutex); | ||
729 | if (priv->is_rtl8187b) { | 732 | if (priv->is_rtl8187b) { |
730 | reg = RTL818X_RX_CONF_MGMT | | 733 | reg = RTL818X_RX_CONF_MGMT | |
731 | RTL818X_RX_CONF_DATA | | 734 | RTL818X_RX_CONF_DATA | |
@@ -747,6 +750,7 @@ static int rtl8187_start(struct ieee80211_hw *dev) | |||
747 | (7 << 0 /* long retry limit */) | | 750 | (7 << 0 /* long retry limit */) | |
748 | (7 << 21 /* MAX TX DMA */)); | 751 | (7 << 21 /* MAX TX DMA */)); |
749 | rtl8187_init_urbs(dev); | 752 | rtl8187_init_urbs(dev); |
753 | mutex_unlock(&priv->conf_mutex); | ||
750 | return 0; | 754 | return 0; |
751 | } | 755 | } |
752 | 756 | ||
@@ -790,6 +794,7 @@ static int rtl8187_start(struct ieee80211_hw *dev) | |||
790 | reg |= RTL818X_CMD_TX_ENABLE; | 794 | reg |= RTL818X_CMD_TX_ENABLE; |
791 | reg |= RTL818X_CMD_RX_ENABLE; | 795 | reg |= RTL818X_CMD_RX_ENABLE; |
792 | rtl818x_iowrite8(priv, &priv->map->CMD, reg); | 796 | rtl818x_iowrite8(priv, &priv->map->CMD, reg); |
797 | mutex_unlock(&priv->conf_mutex); | ||
793 | 798 | ||
794 | return 0; | 799 | return 0; |
795 | } | 800 | } |
@@ -801,6 +806,7 @@ static void rtl8187_stop(struct ieee80211_hw *dev) | |||
801 | struct sk_buff *skb; | 806 | struct sk_buff *skb; |
802 | u32 reg; | 807 | u32 reg; |
803 | 808 | ||
809 | mutex_lock(&priv->conf_mutex); | ||
804 | rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0); | 810 | rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0); |
805 | 811 | ||
806 | reg = rtl818x_ioread8(priv, &priv->map->CMD); | 812 | reg = rtl818x_ioread8(priv, &priv->map->CMD); |
@@ -820,7 +826,7 @@ static void rtl8187_stop(struct ieee80211_hw *dev) | |||
820 | usb_kill_urb(info->urb); | 826 | usb_kill_urb(info->urb); |
821 | kfree_skb(skb); | 827 | kfree_skb(skb); |
822 | } | 828 | } |
823 | return; | 829 | mutex_unlock(&priv->conf_mutex); |
824 | } | 830 | } |
825 | 831 | ||
826 | static int rtl8187_add_interface(struct ieee80211_hw *dev, | 832 | static int rtl8187_add_interface(struct ieee80211_hw *dev, |
@@ -840,6 +846,7 @@ static int rtl8187_add_interface(struct ieee80211_hw *dev, | |||
840 | return -EOPNOTSUPP; | 846 | return -EOPNOTSUPP; |
841 | } | 847 | } |
842 | 848 | ||
849 | mutex_lock(&priv->conf_mutex); | ||
843 | priv->vif = conf->vif; | 850 | priv->vif = conf->vif; |
844 | 851 | ||
845 | rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); | 852 | rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG); |
@@ -848,6 +855,7 @@ static int rtl8187_add_interface(struct ieee80211_hw *dev, | |||
848 | ((u8 *)conf->mac_addr)[i]); | 855 | ((u8 *)conf->mac_addr)[i]); |
849 | rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); | 856 | rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL); |
850 | 857 | ||
858 | mutex_unlock(&priv->conf_mutex); | ||
851 | return 0; | 859 | return 0; |
852 | } | 860 | } |
853 | 861 | ||
@@ -855,8 +863,10 @@ static void rtl8187_remove_interface(struct ieee80211_hw *dev, | |||
855 | struct ieee80211_if_init_conf *conf) | 863 | struct ieee80211_if_init_conf *conf) |
856 | { | 864 | { |
857 | struct rtl8187_priv *priv = dev->priv; | 865 | struct rtl8187_priv *priv = dev->priv; |
866 | mutex_lock(&priv->conf_mutex); | ||
858 | priv->mode = IEEE80211_IF_TYPE_MNTR; | 867 | priv->mode = IEEE80211_IF_TYPE_MNTR; |
859 | priv->vif = NULL; | 868 | priv->vif = NULL; |
869 | mutex_unlock(&priv->conf_mutex); | ||
860 | } | 870 | } |
861 | 871 | ||
862 | static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) | 872 | static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) |
@@ -864,6 +874,7 @@ static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) | |||
864 | struct rtl8187_priv *priv = dev->priv; | 874 | struct rtl8187_priv *priv = dev->priv; |
865 | u32 reg; | 875 | u32 reg; |
866 | 876 | ||
877 | mutex_lock(&priv->conf_mutex); | ||
867 | reg = rtl818x_ioread32(priv, &priv->map->TX_CONF); | 878 | reg = rtl818x_ioread32(priv, &priv->map->TX_CONF); |
868 | /* Enable TX loopback on MAC level to avoid TX during channel | 879 | /* Enable TX loopback on MAC level to avoid TX during channel |
869 | * changes, as this has be seen to causes problems and the | 880 | * changes, as this has be seen to causes problems and the |
@@ -896,6 +907,7 @@ static int rtl8187_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) | |||
896 | rtl818x_iowrite16(priv, &priv->map->ATIMTR_INTERVAL, 100); | 907 | rtl818x_iowrite16(priv, &priv->map->ATIMTR_INTERVAL, 100); |
897 | rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL, 100); | 908 | rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL, 100); |
898 | rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL_TIME, 100); | 909 | rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL_TIME, 100); |
910 | mutex_unlock(&priv->conf_mutex); | ||
899 | return 0; | 911 | return 0; |
900 | } | 912 | } |
901 | 913 | ||
@@ -907,6 +919,7 @@ static int rtl8187_config_interface(struct ieee80211_hw *dev, | |||
907 | int i; | 919 | int i; |
908 | u8 reg; | 920 | u8 reg; |
909 | 921 | ||
922 | mutex_lock(&priv->conf_mutex); | ||
910 | for (i = 0; i < ETH_ALEN; i++) | 923 | for (i = 0; i < ETH_ALEN; i++) |
911 | rtl818x_iowrite8(priv, &priv->map->BSSID[i], conf->bssid[i]); | 924 | rtl818x_iowrite8(priv, &priv->map->BSSID[i], conf->bssid[i]); |
912 | 925 | ||
@@ -920,6 +933,7 @@ static int rtl8187_config_interface(struct ieee80211_hw *dev, | |||
920 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); | 933 | rtl818x_iowrite8(priv, &priv->map->MSR, reg); |
921 | } | 934 | } |
922 | 935 | ||
936 | mutex_unlock(&priv->conf_mutex); | ||
923 | return 0; | 937 | return 0; |
924 | } | 938 | } |
925 | 939 | ||
@@ -1187,6 +1201,7 @@ static int __devinit rtl8187_probe(struct usb_interface *intf, | |||
1187 | printk(KERN_ERR "rtl8187: Cannot register device\n"); | 1201 | printk(KERN_ERR "rtl8187: Cannot register device\n"); |
1188 | goto err_free_dev; | 1202 | goto err_free_dev; |
1189 | } | 1203 | } |
1204 | mutex_init(&priv->conf_mutex); | ||
1190 | 1205 | ||
1191 | printk(KERN_INFO "%s: hwaddr %s, %s V%d + %s\n", | 1206 | printk(KERN_INFO "%s: hwaddr %s, %s V%d + %s\n", |
1192 | wiphy_name(dev->wiphy), print_mac(mac, dev->wiphy->perm_addr), | 1207 | wiphy_name(dev->wiphy), print_mac(mac, dev->wiphy->perm_addr), |