aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ar9170/usb.c
diff options
context:
space:
mode:
authorGrant Likely <grant.likely@secretlab.ca>2010-05-22 02:36:56 -0400
committerGrant Likely <grant.likely@secretlab.ca>2010-05-22 02:36:56 -0400
commitcf9b59e9d3e008591d1f54830f570982bb307a0d (patch)
tree113478ce8fd8c832ba726ffdf59b82cb46356476 /drivers/net/wireless/ath/ar9170/usb.c
parent44504b2bebf8b5823c59484e73096a7d6574471d (diff)
parentf4b87dee923342505e1ddba8d34ce9de33e75050 (diff)
Merge remote branch 'origin' into secretlab/next-devicetree
Merging in current state of Linus' tree to deal with merge conflicts and build failures in vio.c after merge. Conflicts: drivers/i2c/busses/i2c-cpm.c drivers/i2c/busses/i2c-mpc.c drivers/net/gianfar.c Also fixed up one line in arch/powerpc/kernel/vio.c to use the correct node pointer. Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
Diffstat (limited to 'drivers/net/wireless/ath/ar9170/usb.c')
-rw-r--r--drivers/net/wireless/ath/ar9170/usb.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/drivers/net/wireless/ath/ar9170/usb.c b/drivers/net/wireless/ath/ar9170/usb.c
index 99a6da464bd3..82ab532a4923 100644
--- a/drivers/net/wireless/ath/ar9170/usb.c
+++ b/drivers/net/wireless/ath/ar9170/usb.c
@@ -42,6 +42,7 @@
42#include <linux/usb.h> 42#include <linux/usb.h>
43#include <linux/firmware.h> 43#include <linux/firmware.h>
44#include <linux/etherdevice.h> 44#include <linux/etherdevice.h>
45#include <linux/device.h>
45#include <net/mac80211.h> 46#include <net/mac80211.h>
46#include "ar9170.h" 47#include "ar9170.h"
47#include "cmd.h" 48#include "cmd.h"
@@ -67,18 +68,28 @@ static struct usb_device_id ar9170_usb_ids[] = {
67 { USB_DEVICE(0x0cf3, 0x1001) }, 68 { USB_DEVICE(0x0cf3, 0x1001) },
68 /* TP-Link TL-WN821N v2 */ 69 /* TP-Link TL-WN821N v2 */
69 { USB_DEVICE(0x0cf3, 0x1002) }, 70 { USB_DEVICE(0x0cf3, 0x1002) },
71 /* 3Com Dual Band 802.11n USB Adapter */
72 { USB_DEVICE(0x0cf3, 0x1010) },
73 /* H3C Dual Band 802.11n USB Adapter */
74 { USB_DEVICE(0x0cf3, 0x1011) },
70 /* Cace Airpcap NX */ 75 /* Cace Airpcap NX */
71 { USB_DEVICE(0xcace, 0x0300) }, 76 { USB_DEVICE(0xcace, 0x0300) },
72 /* D-Link DWA 160 A1 */ 77 /* D-Link DWA 160 A1 */
73 { USB_DEVICE(0x07d1, 0x3c10) }, 78 { USB_DEVICE(0x07d1, 0x3c10) },
74 /* D-Link DWA 160 A2 */ 79 /* D-Link DWA 160 A2 */
75 { USB_DEVICE(0x07d1, 0x3a09) }, 80 { USB_DEVICE(0x07d1, 0x3a09) },
81 /* Netgear WNA1000 */
82 { USB_DEVICE(0x0846, 0x9040) },
76 /* Netgear WNDA3100 */ 83 /* Netgear WNDA3100 */
77 { USB_DEVICE(0x0846, 0x9010) }, 84 { USB_DEVICE(0x0846, 0x9010) },
78 /* Netgear WN111 v2 */ 85 /* Netgear WN111 v2 */
79 { USB_DEVICE(0x0846, 0x9001) }, 86 { USB_DEVICE(0x0846, 0x9001) },
80 /* Zydas ZD1221 */ 87 /* Zydas ZD1221 */
81 { USB_DEVICE(0x0ace, 0x1221) }, 88 { USB_DEVICE(0x0ace, 0x1221) },
89 /* Proxim ORiNOCO 802.11n USB */
90 { USB_DEVICE(0x1435, 0x0804) },
91 /* WNC Generic 11n USB Dongle */
92 { USB_DEVICE(0x1435, 0x0326) },
82 /* ZyXEL NWD271N */ 93 /* ZyXEL NWD271N */
83 { USB_DEVICE(0x0586, 0x3417) }, 94 { USB_DEVICE(0x0586, 0x3417) },
84 /* Z-Com UB81 BG */ 95 /* Z-Com UB81 BG */
@@ -99,6 +110,8 @@ static struct usb_device_id ar9170_usb_ids[] = {
99 { USB_DEVICE(0x0409, 0x0249) }, 110 { USB_DEVICE(0x0409, 0x0249) },
100 /* AVM FRITZ!WLAN USB Stick N 2.4 */ 111 /* AVM FRITZ!WLAN USB Stick N 2.4 */
101 { USB_DEVICE(0x057C, 0x8402), .driver_info = AR9170_REQ_FW1_ONLY }, 112 { USB_DEVICE(0x057C, 0x8402), .driver_info = AR9170_REQ_FW1_ONLY },
113 /* Qwest/Actiontec 802AIN Wireless N USB Network Adapter */
114 { USB_DEVICE(0x1668, 0x1200) },
102 115
103 /* terminate */ 116 /* terminate */
104 {} 117 {}
@@ -202,7 +215,7 @@ resubmit:
202 return; 215 return;
203 216
204free: 217free:
205 usb_buffer_free(aru->udev, 64, urb->transfer_buffer, urb->transfer_dma); 218 usb_free_coherent(aru->udev, 64, urb->transfer_buffer, urb->transfer_dma);
206} 219}
207 220
208static void ar9170_usb_rx_completed(struct urb *urb) 221static void ar9170_usb_rx_completed(struct urb *urb)
@@ -283,7 +296,7 @@ static int ar9170_usb_alloc_rx_irq_urb(struct ar9170_usb *aru)
283 if (!urb) 296 if (!urb)
284 goto out; 297 goto out;
285 298
286 ibuf = usb_buffer_alloc(aru->udev, 64, GFP_KERNEL, &urb->transfer_dma); 299 ibuf = usb_alloc_coherent(aru->udev, 64, GFP_KERNEL, &urb->transfer_dma);
287 if (!ibuf) 300 if (!ibuf)
288 goto out; 301 goto out;
289 302
@@ -296,8 +309,8 @@ static int ar9170_usb_alloc_rx_irq_urb(struct ar9170_usb *aru)
296 err = usb_submit_urb(urb, GFP_KERNEL); 309 err = usb_submit_urb(urb, GFP_KERNEL);
297 if (err) { 310 if (err) {
298 usb_unanchor_urb(urb); 311 usb_unanchor_urb(urb);
299 usb_buffer_free(aru->udev, 64, urb->transfer_buffer, 312 usb_free_coherent(aru->udev, 64, urb->transfer_buffer,
300 urb->transfer_dma); 313 urb->transfer_dma);
301 } 314 }
302 315
303out: 316out:
@@ -727,12 +740,16 @@ static void ar9170_usb_firmware_failed(struct ar9170_usb *aru)
727{ 740{
728 struct device *parent = aru->udev->dev.parent; 741 struct device *parent = aru->udev->dev.parent;
729 742
743 complete(&aru->firmware_loading_complete);
744
730 /* unbind anything failed */ 745 /* unbind anything failed */
731 if (parent) 746 if (parent)
732 down(&parent->sem); 747 device_lock(parent);
733 device_release_driver(&aru->udev->dev); 748 device_release_driver(&aru->udev->dev);
734 if (parent) 749 if (parent)
735 up(&parent->sem); 750 device_unlock(parent);
751
752 usb_put_dev(aru->udev);
736} 753}
737 754
738static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context) 755static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context)
@@ -761,6 +778,8 @@ static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context)
761 if (err) 778 if (err)
762 goto err_unrx; 779 goto err_unrx;
763 780
781 complete(&aru->firmware_loading_complete);
782 usb_put_dev(aru->udev);
764 return; 783 return;
765 784
766 err_unrx: 785 err_unrx:
@@ -858,6 +877,7 @@ static int ar9170_usb_probe(struct usb_interface *intf,
858 init_usb_anchor(&aru->tx_pending); 877 init_usb_anchor(&aru->tx_pending);
859 init_usb_anchor(&aru->tx_submitted); 878 init_usb_anchor(&aru->tx_submitted);
860 init_completion(&aru->cmd_wait); 879 init_completion(&aru->cmd_wait);
880 init_completion(&aru->firmware_loading_complete);
861 spin_lock_init(&aru->tx_urb_lock); 881 spin_lock_init(&aru->tx_urb_lock);
862 882
863 aru->tx_pending_urbs = 0; 883 aru->tx_pending_urbs = 0;
@@ -877,6 +897,7 @@ static int ar9170_usb_probe(struct usb_interface *intf,
877 if (err) 897 if (err)
878 goto err_freehw; 898 goto err_freehw;
879 899
900 usb_get_dev(aru->udev);
880 return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw", 901 return request_firmware_nowait(THIS_MODULE, 1, "ar9170.fw",
881 &aru->udev->dev, GFP_KERNEL, aru, 902 &aru->udev->dev, GFP_KERNEL, aru,
882 ar9170_usb_firmware_step2); 903 ar9170_usb_firmware_step2);
@@ -896,6 +917,9 @@ static void ar9170_usb_disconnect(struct usb_interface *intf)
896 return; 917 return;
897 918
898 aru->common.state = AR9170_IDLE; 919 aru->common.state = AR9170_IDLE;
920
921 wait_for_completion(&aru->firmware_loading_complete);
922
899 ar9170_unregister(&aru->common); 923 ar9170_unregister(&aru->common);
900 ar9170_usb_cancel_urbs(aru); 924 ar9170_usb_cancel_urbs(aru);
901 925