aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/zydas/zd1211rw/zd_usb.c')
-rw-r--r--drivers/net/wireless/zydas/zd1211rw/zd_usb.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
index c30bf118c67d..c2cda3acd4af 100644
--- a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
+++ b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
@@ -371,25 +371,27 @@ static inline void handle_regs_int_override(struct urb *urb)
371{ 371{
372 struct zd_usb *usb = urb->context; 372 struct zd_usb *usb = urb->context;
373 struct zd_usb_interrupt *intr = &usb->intr; 373 struct zd_usb_interrupt *intr = &usb->intr;
374 unsigned long flags;
374 375
375 spin_lock(&intr->lock); 376 spin_lock_irqsave(&intr->lock, flags);
376 if (atomic_read(&intr->read_regs_enabled)) { 377 if (atomic_read(&intr->read_regs_enabled)) {
377 atomic_set(&intr->read_regs_enabled, 0); 378 atomic_set(&intr->read_regs_enabled, 0);
378 intr->read_regs_int_overridden = 1; 379 intr->read_regs_int_overridden = 1;
379 complete(&intr->read_regs.completion); 380 complete(&intr->read_regs.completion);
380 } 381 }
381 spin_unlock(&intr->lock); 382 spin_unlock_irqrestore(&intr->lock, flags);
382} 383}
383 384
384static inline void handle_regs_int(struct urb *urb) 385static inline void handle_regs_int(struct urb *urb)
385{ 386{
386 struct zd_usb *usb = urb->context; 387 struct zd_usb *usb = urb->context;
387 struct zd_usb_interrupt *intr = &usb->intr; 388 struct zd_usb_interrupt *intr = &usb->intr;
389 unsigned long flags;
388 int len; 390 int len;
389 u16 int_num; 391 u16 int_num;
390 392
391 ZD_ASSERT(in_interrupt()); 393 ZD_ASSERT(in_interrupt());
392 spin_lock(&intr->lock); 394 spin_lock_irqsave(&intr->lock, flags);
393 395
394 int_num = le16_to_cpu(*(__le16 *)(urb->transfer_buffer+2)); 396 int_num = le16_to_cpu(*(__le16 *)(urb->transfer_buffer+2));
395 if (int_num == CR_INTERRUPT) { 397 if (int_num == CR_INTERRUPT) {
@@ -425,7 +427,7 @@ static inline void handle_regs_int(struct urb *urb)
425 } 427 }
426 428
427out: 429out:
428 spin_unlock(&intr->lock); 430 spin_unlock_irqrestore(&intr->lock, flags);
429 431
430 /* CR_INTERRUPT might override read_reg too. */ 432 /* CR_INTERRUPT might override read_reg too. */
431 if (int_num == CR_INTERRUPT && atomic_read(&intr->read_regs_enabled)) 433 if (int_num == CR_INTERRUPT && atomic_read(&intr->read_regs_enabled))
@@ -665,6 +667,7 @@ static void rx_urb_complete(struct urb *urb)
665 struct zd_usb_rx *rx; 667 struct zd_usb_rx *rx;
666 const u8 *buffer; 668 const u8 *buffer;
667 unsigned int length; 669 unsigned int length;
670 unsigned long flags;
668 671
669 switch (urb->status) { 672 switch (urb->status) {
670 case 0: 673 case 0:
@@ -693,14 +696,14 @@ static void rx_urb_complete(struct urb *urb)
693 /* If there is an old first fragment, we don't care. */ 696 /* If there is an old first fragment, we don't care. */
694 dev_dbg_f(urb_dev(urb), "*** first fragment ***\n"); 697 dev_dbg_f(urb_dev(urb), "*** first fragment ***\n");
695 ZD_ASSERT(length <= ARRAY_SIZE(rx->fragment)); 698 ZD_ASSERT(length <= ARRAY_SIZE(rx->fragment));
696 spin_lock(&rx->lock); 699 spin_lock_irqsave(&rx->lock, flags);
697 memcpy(rx->fragment, buffer, length); 700 memcpy(rx->fragment, buffer, length);
698 rx->fragment_length = length; 701 rx->fragment_length = length;
699 spin_unlock(&rx->lock); 702 spin_unlock_irqrestore(&rx->lock, flags);
700 goto resubmit; 703 goto resubmit;
701 } 704 }
702 705
703 spin_lock(&rx->lock); 706 spin_lock_irqsave(&rx->lock, flags);
704 if (rx->fragment_length > 0) { 707 if (rx->fragment_length > 0) {
705 /* We are on a second fragment, we believe */ 708 /* We are on a second fragment, we believe */
706 ZD_ASSERT(length + rx->fragment_length <= 709 ZD_ASSERT(length + rx->fragment_length <=
@@ -710,9 +713,9 @@ static void rx_urb_complete(struct urb *urb)
710 handle_rx_packet(usb, rx->fragment, 713 handle_rx_packet(usb, rx->fragment,
711 rx->fragment_length + length); 714 rx->fragment_length + length);
712 rx->fragment_length = 0; 715 rx->fragment_length = 0;
713 spin_unlock(&rx->lock); 716 spin_unlock_irqrestore(&rx->lock, flags);
714 } else { 717 } else {
715 spin_unlock(&rx->lock); 718 spin_unlock_irqrestore(&rx->lock, flags);
716 handle_rx_packet(usb, buffer, length); 719 handle_rx_packet(usb, buffer, length);
717 } 720 }
718 721