diff options
Diffstat (limited to 'drivers/net/wireless/zd1211rw/zd_usb.c')
-rw-r--r-- | drivers/net/wireless/zd1211rw/zd_usb.c | 45 |
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 | ||
369 | static 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 | ||
380 | static inline void handle_regs_int(struct urb *urb) | 377 | static 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 | ||
1140 | static void __exit usb_exit(void) | 1140 | static 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 | |||
1165 | static 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 | ||
1165 | static int get_results(struct zd_usb *usb, u16 *values, | 1174 | static 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; |
1206 | error_unlock: | 1215 | error_unlock: |
1207 | spin_unlock(&intr->lock); | 1216 | spin_unlock_irq(&intr->lock); |
1208 | return r; | 1217 | return r; |
1209 | } | 1218 | } |
1210 | 1219 | ||