aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/zd1211rw/zd_usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/zd1211rw/zd_usb.c')
-rw-r--r--drivers/net/wireless/zd1211rw/zd_usb.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c
index 3faaeb2b7c89..aa782e88754b 100644
--- a/drivers/net/wireless/zd1211rw/zd_usb.c
+++ b/drivers/net/wireless/zd1211rw/zd_usb.c
@@ -47,11 +47,17 @@ static struct usb_device_id usb_ids[] = {
47 { USB_DEVICE(0x0586, 0x3402), .driver_info = DEVICE_ZD1211 }, 47 { USB_DEVICE(0x0586, 0x3402), .driver_info = DEVICE_ZD1211 },
48 { USB_DEVICE(0x0b3b, 0x5630), .driver_info = DEVICE_ZD1211 }, 48 { USB_DEVICE(0x0b3b, 0x5630), .driver_info = DEVICE_ZD1211 },
49 { USB_DEVICE(0x0b05, 0x170c), .driver_info = DEVICE_ZD1211 }, 49 { USB_DEVICE(0x0b05, 0x170c), .driver_info = DEVICE_ZD1211 },
50 { USB_DEVICE(0x1435, 0x0711), .driver_info = DEVICE_ZD1211 },
51 { USB_DEVICE(0x0586, 0x3409), .driver_info = DEVICE_ZD1211 },
52 { USB_DEVICE(0x0b3b, 0x1630), .driver_info = DEVICE_ZD1211 },
53 { USB_DEVICE(0x0586, 0x3401), .driver_info = DEVICE_ZD1211 },
54 { USB_DEVICE(0x14ea, 0xab13), .driver_info = DEVICE_ZD1211 },
50 /* ZD1211B */ 55 /* ZD1211B */
51 { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B }, 56 { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B },
52 { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, 57 { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B },
53 { USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B }, 58 { USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B },
54 { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B }, 59 { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B },
60 { USB_DEVICE(0x050d, 0x705c), .driver_info = DEVICE_ZD1211B },
55 /* "Driverless" devices that need ejecting */ 61 /* "Driverless" devices that need ejecting */
56 { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER }, 62 { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER },
57 {} 63 {}
@@ -366,15 +372,6 @@ error:
366 return r; 372 return r;
367} 373}
368 374
369static void disable_read_regs_int(struct zd_usb *usb)
370{
371 struct zd_usb_interrupt *intr = &usb->intr;
372
373 spin_lock(&intr->lock);
374 intr->read_regs_enabled = 0;
375 spin_unlock(&intr->lock);
376}
377
378#define urb_dev(urb) (&(urb)->dev->dev) 375#define urb_dev(urb) (&(urb)->dev->dev)
379 376
380static inline void handle_regs_int(struct urb *urb) 377static inline void handle_regs_int(struct urb *urb)
@@ -596,6 +593,8 @@ static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer,
596 unsigned int l, k, n; 593 unsigned int l, k, n;
597 for (i = 0, l = 0;; i++) { 594 for (i = 0, l = 0;; i++) {
598 k = le16_to_cpu(get_unaligned(&length_info->length[i])); 595 k = le16_to_cpu(get_unaligned(&length_info->length[i]));
596 if (k == 0)
597 return;
599 n = l+k; 598 n = l+k;
600 if (n > length) 599 if (n > length)
601 return; 600 return;
@@ -1119,27 +1118,28 @@ static int __init usb_init(void)
1119{ 1118{
1120 int r; 1119 int r;
1121 1120
1122 pr_debug("usb_init()\n"); 1121 pr_debug("%s usb_init()\n", driver.name);
1123 1122
1124 zd_workqueue = create_singlethread_workqueue(driver.name); 1123 zd_workqueue = create_singlethread_workqueue(driver.name);
1125 if (zd_workqueue == NULL) { 1124 if (zd_workqueue == NULL) {
1126 printk(KERN_ERR "%s: couldn't create workqueue\n", driver.name); 1125 printk(KERN_ERR "%s couldn't create workqueue\n", driver.name);
1127 return -ENOMEM; 1126 return -ENOMEM;
1128 } 1127 }
1129 1128
1130 r = usb_register(&driver); 1129 r = usb_register(&driver);
1131 if (r) { 1130 if (r) {
1132 printk(KERN_ERR "usb_register() failed. Error number %d\n", r); 1131 printk(KERN_ERR "%s usb_register() failed. Error number %d\n",
1132 driver.name, r);
1133 return r; 1133 return r;
1134 } 1134 }
1135 1135
1136 pr_debug("zd1211rw initialized\n"); 1136 pr_debug("%s initialized\n", driver.name);
1137 return 0; 1137 return 0;
1138} 1138}
1139 1139
1140static void __exit usb_exit(void) 1140static void __exit usb_exit(void)
1141{ 1141{
1142 pr_debug("usb_exit()\n"); 1142 pr_debug("%s usb_exit()\n", driver.name);
1143 usb_deregister(&driver); 1143 usb_deregister(&driver);
1144 destroy_workqueue(zd_workqueue); 1144 destroy_workqueue(zd_workqueue);
1145} 1145}
@@ -1156,10 +1156,19 @@ static void prepare_read_regs_int(struct zd_usb *usb)
1156{ 1156{
1157 struct zd_usb_interrupt *intr = &usb->intr; 1157 struct zd_usb_interrupt *intr = &usb->intr;
1158 1158
1159 spin_lock(&intr->lock); 1159 spin_lock_irq(&intr->lock);
1160 intr->read_regs_enabled = 1; 1160 intr->read_regs_enabled = 1;
1161 INIT_COMPLETION(intr->read_regs.completion); 1161 INIT_COMPLETION(intr->read_regs.completion);
1162 spin_unlock(&intr->lock); 1162 spin_unlock_irq(&intr->lock);
1163}
1164
1165static void disable_read_regs_int(struct zd_usb *usb)
1166{
1167 struct zd_usb_interrupt *intr = &usb->intr;
1168
1169 spin_lock_irq(&intr->lock);
1170 intr->read_regs_enabled = 0;
1171 spin_unlock_irq(&intr->lock);
1163} 1172}
1164 1173
1165static int get_results(struct zd_usb *usb, u16 *values, 1174static int get_results(struct zd_usb *usb, u16 *values,
@@ -1171,7 +1180,7 @@ static int get_results(struct zd_usb *usb, u16 *values,
1171 struct read_regs_int *rr = &intr->read_regs; 1180 struct read_regs_int *rr = &intr->read_regs;
1172 struct usb_int_regs *regs = (struct usb_int_regs *)rr->buffer; 1181 struct usb_int_regs *regs = (struct usb_int_regs *)rr->buffer;
1173 1182
1174 spin_lock(&intr->lock); 1183 spin_lock_irq(&intr->lock);
1175 1184
1176 r = -EIO; 1185 r = -EIO;
1177 /* The created block size seems to be larger than expected. 1186 /* The created block size seems to be larger than expected.
@@ -1204,7 +1213,7 @@ static int get_results(struct zd_usb *usb, u16 *values,
1204 1213
1205 r = 0; 1214 r = 0;
1206error_unlock: 1215error_unlock:
1207 spin_unlock(&intr->lock); 1216 spin_unlock_irq(&intr->lock);
1208 return r; 1217 return r;
1209} 1218}
1210 1219