diff options
Diffstat (limited to 'drivers/net/wireless/zydas/zd1211rw/zd_usb.c')
| -rw-r--r-- | drivers/net/wireless/zydas/zd1211rw/zd_usb.c | 21 |
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 | ||
| 384 | static inline void handle_regs_int(struct urb *urb) | 385 | static 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 | ||
| 427 | out: | 429 | out: |
| 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 | ||
