diff options
Diffstat (limited to 'drivers/net/wireless/zd1211rw/zd_usb.c')
-rw-r--r-- | drivers/net/wireless/zd1211rw/zd_usb.c | 651 |
1 files changed, 524 insertions, 127 deletions
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index 818e1480ca93..631194d49828 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
@@ -55,10 +55,12 @@ static struct usb_device_id usb_ids[] = { | |||
55 | { USB_DEVICE(0x129b, 0x1666), .driver_info = DEVICE_ZD1211 }, | 55 | { USB_DEVICE(0x129b, 0x1666), .driver_info = DEVICE_ZD1211 }, |
56 | { USB_DEVICE(0x13b1, 0x001e), .driver_info = DEVICE_ZD1211 }, | 56 | { USB_DEVICE(0x13b1, 0x001e), .driver_info = DEVICE_ZD1211 }, |
57 | { USB_DEVICE(0x1435, 0x0711), .driver_info = DEVICE_ZD1211 }, | 57 | { USB_DEVICE(0x1435, 0x0711), .driver_info = DEVICE_ZD1211 }, |
58 | { USB_DEVICE(0x14ea, 0xab10), .driver_info = DEVICE_ZD1211 }, | ||
58 | { USB_DEVICE(0x14ea, 0xab13), .driver_info = DEVICE_ZD1211 }, | 59 | { USB_DEVICE(0x14ea, 0xab13), .driver_info = DEVICE_ZD1211 }, |
59 | { USB_DEVICE(0x157e, 0x300a), .driver_info = DEVICE_ZD1211 }, | 60 | { USB_DEVICE(0x157e, 0x300a), .driver_info = DEVICE_ZD1211 }, |
60 | { USB_DEVICE(0x157e, 0x300b), .driver_info = DEVICE_ZD1211 }, | 61 | { USB_DEVICE(0x157e, 0x300b), .driver_info = DEVICE_ZD1211 }, |
61 | { USB_DEVICE(0x157e, 0x3204), .driver_info = DEVICE_ZD1211 }, | 62 | { USB_DEVICE(0x157e, 0x3204), .driver_info = DEVICE_ZD1211 }, |
63 | { USB_DEVICE(0x157e, 0x3207), .driver_info = DEVICE_ZD1211 }, | ||
62 | { USB_DEVICE(0x1740, 0x2000), .driver_info = DEVICE_ZD1211 }, | 64 | { USB_DEVICE(0x1740, 0x2000), .driver_info = DEVICE_ZD1211 }, |
63 | { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 }, | 65 | { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 }, |
64 | /* ZD1211B */ | 66 | /* ZD1211B */ |
@@ -92,6 +94,7 @@ static struct usb_device_id usb_ids[] = { | |||
92 | { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, | 94 | { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B }, |
93 | { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B }, | 95 | { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B }, |
94 | { USB_DEVICE(0x2019, 0x5303), .driver_info = DEVICE_ZD1211B }, | 96 | { USB_DEVICE(0x2019, 0x5303), .driver_info = DEVICE_ZD1211B }, |
97 | { USB_DEVICE(0x2019, 0xed01), .driver_info = DEVICE_ZD1211B }, | ||
95 | /* "Driverless" devices that need ejecting */ | 98 | /* "Driverless" devices that need ejecting */ |
96 | { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER }, | 99 | { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER }, |
97 | { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER }, | 100 | { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER }, |
@@ -375,8 +378,10 @@ static inline void handle_regs_int(struct urb *urb) | |||
375 | int_num = le16_to_cpu(*(__le16 *)(urb->transfer_buffer+2)); | 378 | int_num = le16_to_cpu(*(__le16 *)(urb->transfer_buffer+2)); |
376 | if (int_num == CR_INTERRUPT) { | 379 | if (int_num == CR_INTERRUPT) { |
377 | struct zd_mac *mac = zd_hw_mac(zd_usb_to_hw(urb->context)); | 380 | struct zd_mac *mac = zd_hw_mac(zd_usb_to_hw(urb->context)); |
381 | spin_lock(&mac->lock); | ||
378 | memcpy(&mac->intr_buffer, urb->transfer_buffer, | 382 | memcpy(&mac->intr_buffer, urb->transfer_buffer, |
379 | USB_MAX_EP_INT_BUFFER); | 383 | USB_MAX_EP_INT_BUFFER); |
384 | spin_unlock(&mac->lock); | ||
380 | schedule_work(&mac->process_intr); | 385 | schedule_work(&mac->process_intr); |
381 | } else if (intr->read_regs_enabled) { | 386 | } else if (intr->read_regs_enabled) { |
382 | intr->read_regs.length = len = urb->actual_length; | 387 | intr->read_regs.length = len = urb->actual_length; |
@@ -407,8 +412,10 @@ static void int_urb_complete(struct urb *urb) | |||
407 | case -ENOENT: | 412 | case -ENOENT: |
408 | case -ECONNRESET: | 413 | case -ECONNRESET: |
409 | case -EPIPE: | 414 | case -EPIPE: |
410 | goto kfree; | 415 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); |
416 | return; | ||
411 | default: | 417 | default: |
418 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); | ||
412 | goto resubmit; | 419 | goto resubmit; |
413 | } | 420 | } |
414 | 421 | ||
@@ -439,12 +446,11 @@ static void int_urb_complete(struct urb *urb) | |||
439 | resubmit: | 446 | resubmit: |
440 | r = usb_submit_urb(urb, GFP_ATOMIC); | 447 | r = usb_submit_urb(urb, GFP_ATOMIC); |
441 | if (r) { | 448 | if (r) { |
442 | dev_dbg_f(urb_dev(urb), "resubmit urb %p\n", urb); | 449 | dev_dbg_f(urb_dev(urb), "error: resubmit urb %p err code %d\n", |
443 | goto kfree; | 450 | urb, r); |
451 | /* TODO: add worker to reset intr->urb */ | ||
444 | } | 452 | } |
445 | return; | 453 | return; |
446 | kfree: | ||
447 | kfree(urb->transfer_buffer); | ||
448 | } | 454 | } |
449 | 455 | ||
450 | static inline int int_urb_interval(struct usb_device *udev) | 456 | static inline int int_urb_interval(struct usb_device *udev) |
@@ -475,9 +481,8 @@ static inline int usb_int_enabled(struct zd_usb *usb) | |||
475 | int zd_usb_enable_int(struct zd_usb *usb) | 481 | int zd_usb_enable_int(struct zd_usb *usb) |
476 | { | 482 | { |
477 | int r; | 483 | int r; |
478 | struct usb_device *udev; | 484 | struct usb_device *udev = zd_usb_to_usbdev(usb); |
479 | struct zd_usb_interrupt *intr = &usb->intr; | 485 | struct zd_usb_interrupt *intr = &usb->intr; |
480 | void *transfer_buffer = NULL; | ||
481 | struct urb *urb; | 486 | struct urb *urb; |
482 | 487 | ||
483 | dev_dbg_f(zd_usb_dev(usb), "\n"); | 488 | dev_dbg_f(zd_usb_dev(usb), "\n"); |
@@ -498,20 +503,21 @@ int zd_usb_enable_int(struct zd_usb *usb) | |||
498 | intr->urb = urb; | 503 | intr->urb = urb; |
499 | spin_unlock_irq(&intr->lock); | 504 | spin_unlock_irq(&intr->lock); |
500 | 505 | ||
501 | /* TODO: make it a DMA buffer */ | ||
502 | r = -ENOMEM; | 506 | r = -ENOMEM; |
503 | transfer_buffer = kmalloc(USB_MAX_EP_INT_BUFFER, GFP_KERNEL); | 507 | intr->buffer = usb_alloc_coherent(udev, USB_MAX_EP_INT_BUFFER, |
504 | if (!transfer_buffer) { | 508 | GFP_KERNEL, &intr->buffer_dma); |
509 | if (!intr->buffer) { | ||
505 | dev_dbg_f(zd_usb_dev(usb), | 510 | dev_dbg_f(zd_usb_dev(usb), |
506 | "couldn't allocate transfer_buffer\n"); | 511 | "couldn't allocate transfer_buffer\n"); |
507 | goto error_set_urb_null; | 512 | goto error_set_urb_null; |
508 | } | 513 | } |
509 | 514 | ||
510 | udev = zd_usb_to_usbdev(usb); | ||
511 | usb_fill_int_urb(urb, udev, usb_rcvintpipe(udev, EP_INT_IN), | 515 | usb_fill_int_urb(urb, udev, usb_rcvintpipe(udev, EP_INT_IN), |
512 | transfer_buffer, USB_MAX_EP_INT_BUFFER, | 516 | intr->buffer, USB_MAX_EP_INT_BUFFER, |
513 | int_urb_complete, usb, | 517 | int_urb_complete, usb, |
514 | intr->interval); | 518 | intr->interval); |
519 | urb->transfer_dma = intr->buffer_dma; | ||
520 | urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | ||
515 | 521 | ||
516 | dev_dbg_f(zd_usb_dev(usb), "submit urb %p\n", intr->urb); | 522 | dev_dbg_f(zd_usb_dev(usb), "submit urb %p\n", intr->urb); |
517 | r = usb_submit_urb(urb, GFP_KERNEL); | 523 | r = usb_submit_urb(urb, GFP_KERNEL); |
@@ -523,7 +529,8 @@ int zd_usb_enable_int(struct zd_usb *usb) | |||
523 | 529 | ||
524 | return 0; | 530 | return 0; |
525 | error: | 531 | error: |
526 | kfree(transfer_buffer); | 532 | usb_free_coherent(udev, USB_MAX_EP_INT_BUFFER, |
533 | intr->buffer, intr->buffer_dma); | ||
527 | error_set_urb_null: | 534 | error_set_urb_null: |
528 | spin_lock_irq(&intr->lock); | 535 | spin_lock_irq(&intr->lock); |
529 | intr->urb = NULL; | 536 | intr->urb = NULL; |
@@ -537,8 +544,11 @@ out: | |||
537 | void zd_usb_disable_int(struct zd_usb *usb) | 544 | void zd_usb_disable_int(struct zd_usb *usb) |
538 | { | 545 | { |
539 | unsigned long flags; | 546 | unsigned long flags; |
547 | struct usb_device *udev = zd_usb_to_usbdev(usb); | ||
540 | struct zd_usb_interrupt *intr = &usb->intr; | 548 | struct zd_usb_interrupt *intr = &usb->intr; |
541 | struct urb *urb; | 549 | struct urb *urb; |
550 | void *buffer; | ||
551 | dma_addr_t buffer_dma; | ||
542 | 552 | ||
543 | spin_lock_irqsave(&intr->lock, flags); | 553 | spin_lock_irqsave(&intr->lock, flags); |
544 | urb = intr->urb; | 554 | urb = intr->urb; |
@@ -547,11 +557,18 @@ void zd_usb_disable_int(struct zd_usb *usb) | |||
547 | return; | 557 | return; |
548 | } | 558 | } |
549 | intr->urb = NULL; | 559 | intr->urb = NULL; |
560 | buffer = intr->buffer; | ||
561 | buffer_dma = intr->buffer_dma; | ||
562 | intr->buffer = NULL; | ||
550 | spin_unlock_irqrestore(&intr->lock, flags); | 563 | spin_unlock_irqrestore(&intr->lock, flags); |
551 | 564 | ||
552 | usb_kill_urb(urb); | 565 | usb_kill_urb(urb); |
553 | dev_dbg_f(zd_usb_dev(usb), "urb %p killed\n", urb); | 566 | dev_dbg_f(zd_usb_dev(usb), "urb %p killed\n", urb); |
554 | usb_free_urb(urb); | 567 | usb_free_urb(urb); |
568 | |||
569 | if (buffer) | ||
570 | usb_free_coherent(udev, USB_MAX_EP_INT_BUFFER, | ||
571 | buffer, buffer_dma); | ||
555 | } | 572 | } |
556 | 573 | ||
557 | static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer, | 574 | static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer, |
@@ -599,6 +616,7 @@ static void handle_rx_packet(struct zd_usb *usb, const u8 *buffer, | |||
599 | 616 | ||
600 | static void rx_urb_complete(struct urb *urb) | 617 | static void rx_urb_complete(struct urb *urb) |
601 | { | 618 | { |
619 | int r; | ||
602 | struct zd_usb *usb; | 620 | struct zd_usb *usb; |
603 | struct zd_usb_rx *rx; | 621 | struct zd_usb_rx *rx; |
604 | const u8 *buffer; | 622 | const u8 *buffer; |
@@ -613,6 +631,7 @@ static void rx_urb_complete(struct urb *urb) | |||
613 | case -ENOENT: | 631 | case -ENOENT: |
614 | case -ECONNRESET: | 632 | case -ECONNRESET: |
615 | case -EPIPE: | 633 | case -EPIPE: |
634 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); | ||
616 | return; | 635 | return; |
617 | default: | 636 | default: |
618 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); | 637 | dev_dbg_f(urb_dev(urb), "urb %p error %d\n", urb, urb->status); |
@@ -624,6 +643,8 @@ static void rx_urb_complete(struct urb *urb) | |||
624 | usb = urb->context; | 643 | usb = urb->context; |
625 | rx = &usb->rx; | 644 | rx = &usb->rx; |
626 | 645 | ||
646 | tasklet_schedule(&rx->reset_timer_tasklet); | ||
647 | |||
627 | if (length%rx->usb_packet_size > rx->usb_packet_size-4) { | 648 | if (length%rx->usb_packet_size > rx->usb_packet_size-4) { |
628 | /* If there is an old first fragment, we don't care. */ | 649 | /* If there is an old first fragment, we don't care. */ |
629 | dev_dbg_f(urb_dev(urb), "*** first fragment ***\n"); | 650 | dev_dbg_f(urb_dev(urb), "*** first fragment ***\n"); |
@@ -652,7 +673,9 @@ static void rx_urb_complete(struct urb *urb) | |||
652 | } | 673 | } |
653 | 674 | ||
654 | resubmit: | 675 | resubmit: |
655 | usb_submit_urb(urb, GFP_ATOMIC); | 676 | r = usb_submit_urb(urb, GFP_ATOMIC); |
677 | if (r) | ||
678 | dev_dbg_f(urb_dev(urb), "urb %p resubmit error %d\n", urb, r); | ||
656 | } | 679 | } |
657 | 680 | ||
658 | static struct urb *alloc_rx_urb(struct zd_usb *usb) | 681 | static struct urb *alloc_rx_urb(struct zd_usb *usb) |
@@ -688,7 +711,7 @@ static void free_rx_urb(struct urb *urb) | |||
688 | usb_free_urb(urb); | 711 | usb_free_urb(urb); |
689 | } | 712 | } |
690 | 713 | ||
691 | int zd_usb_enable_rx(struct zd_usb *usb) | 714 | static int __zd_usb_enable_rx(struct zd_usb *usb) |
692 | { | 715 | { |
693 | int i, r; | 716 | int i, r; |
694 | struct zd_usb_rx *rx = &usb->rx; | 717 | struct zd_usb_rx *rx = &usb->rx; |
@@ -740,7 +763,21 @@ error: | |||
740 | return r; | 763 | return r; |
741 | } | 764 | } |
742 | 765 | ||
743 | void zd_usb_disable_rx(struct zd_usb *usb) | 766 | int zd_usb_enable_rx(struct zd_usb *usb) |
767 | { | ||
768 | int r; | ||
769 | struct zd_usb_rx *rx = &usb->rx; | ||
770 | |||
771 | mutex_lock(&rx->setup_mutex); | ||
772 | r = __zd_usb_enable_rx(usb); | ||
773 | mutex_unlock(&rx->setup_mutex); | ||
774 | |||
775 | zd_usb_reset_rx_idle_timer(usb); | ||
776 | |||
777 | return r; | ||
778 | } | ||
779 | |||
780 | static void __zd_usb_disable_rx(struct zd_usb *usb) | ||
744 | { | 781 | { |
745 | int i; | 782 | int i; |
746 | unsigned long flags; | 783 | unsigned long flags; |
@@ -767,6 +804,41 @@ void zd_usb_disable_rx(struct zd_usb *usb) | |||
767 | spin_unlock_irqrestore(&rx->lock, flags); | 804 | spin_unlock_irqrestore(&rx->lock, flags); |
768 | } | 805 | } |
769 | 806 | ||
807 | void zd_usb_disable_rx(struct zd_usb *usb) | ||
808 | { | ||
809 | struct zd_usb_rx *rx = &usb->rx; | ||
810 | |||
811 | mutex_lock(&rx->setup_mutex); | ||
812 | __zd_usb_disable_rx(usb); | ||
813 | mutex_unlock(&rx->setup_mutex); | ||
814 | |||
815 | tasklet_kill(&rx->reset_timer_tasklet); | ||
816 | cancel_delayed_work_sync(&rx->idle_work); | ||
817 | } | ||
818 | |||
819 | static void zd_usb_reset_rx(struct zd_usb *usb) | ||
820 | { | ||
821 | bool do_reset; | ||
822 | struct zd_usb_rx *rx = &usb->rx; | ||
823 | unsigned long flags; | ||
824 | |||
825 | mutex_lock(&rx->setup_mutex); | ||
826 | |||
827 | spin_lock_irqsave(&rx->lock, flags); | ||
828 | do_reset = rx->urbs != NULL; | ||
829 | spin_unlock_irqrestore(&rx->lock, flags); | ||
830 | |||
831 | if (do_reset) { | ||
832 | __zd_usb_disable_rx(usb); | ||
833 | __zd_usb_enable_rx(usb); | ||
834 | } | ||
835 | |||
836 | mutex_unlock(&rx->setup_mutex); | ||
837 | |||
838 | if (do_reset) | ||
839 | zd_usb_reset_rx_idle_timer(usb); | ||
840 | } | ||
841 | |||
770 | /** | 842 | /** |
771 | * zd_usb_disable_tx - disable transmission | 843 | * zd_usb_disable_tx - disable transmission |
772 | * @usb: the zd1211rw-private USB structure | 844 | * @usb: the zd1211rw-private USB structure |
@@ -777,19 +849,21 @@ void zd_usb_disable_tx(struct zd_usb *usb) | |||
777 | { | 849 | { |
778 | struct zd_usb_tx *tx = &usb->tx; | 850 | struct zd_usb_tx *tx = &usb->tx; |
779 | unsigned long flags; | 851 | unsigned long flags; |
780 | struct list_head *pos, *n; | 852 | |
853 | atomic_set(&tx->enabled, 0); | ||
854 | |||
855 | /* kill all submitted tx-urbs */ | ||
856 | usb_kill_anchored_urbs(&tx->submitted); | ||
781 | 857 | ||
782 | spin_lock_irqsave(&tx->lock, flags); | 858 | spin_lock_irqsave(&tx->lock, flags); |
783 | list_for_each_safe(pos, n, &tx->free_urb_list) { | 859 | WARN_ON(!skb_queue_empty(&tx->submitted_skbs)); |
784 | list_del(pos); | 860 | WARN_ON(tx->submitted_urbs != 0); |
785 | usb_free_urb(list_entry(pos, struct urb, urb_list)); | ||
786 | } | ||
787 | tx->enabled = 0; | ||
788 | tx->submitted_urbs = 0; | 861 | tx->submitted_urbs = 0; |
862 | spin_unlock_irqrestore(&tx->lock, flags); | ||
863 | |||
789 | /* The stopped state is ignored, relying on ieee80211_wake_queues() | 864 | /* The stopped state is ignored, relying on ieee80211_wake_queues() |
790 | * in a potentionally following zd_usb_enable_tx(). | 865 | * in a potentionally following zd_usb_enable_tx(). |
791 | */ | 866 | */ |
792 | spin_unlock_irqrestore(&tx->lock, flags); | ||
793 | } | 867 | } |
794 | 868 | ||
795 | /** | 869 | /** |
@@ -805,63 +879,13 @@ void zd_usb_enable_tx(struct zd_usb *usb) | |||
805 | struct zd_usb_tx *tx = &usb->tx; | 879 | struct zd_usb_tx *tx = &usb->tx; |
806 | 880 | ||
807 | spin_lock_irqsave(&tx->lock, flags); | 881 | spin_lock_irqsave(&tx->lock, flags); |
808 | tx->enabled = 1; | 882 | atomic_set(&tx->enabled, 1); |
809 | tx->submitted_urbs = 0; | 883 | tx->submitted_urbs = 0; |
810 | ieee80211_wake_queues(zd_usb_to_hw(usb)); | 884 | ieee80211_wake_queues(zd_usb_to_hw(usb)); |
811 | tx->stopped = 0; | 885 | tx->stopped = 0; |
812 | spin_unlock_irqrestore(&tx->lock, flags); | 886 | spin_unlock_irqrestore(&tx->lock, flags); |
813 | } | 887 | } |
814 | 888 | ||
815 | /** | ||
816 | * alloc_tx_urb - provides an tx URB | ||
817 | * @usb: a &struct zd_usb pointer | ||
818 | * | ||
819 | * Allocates a new URB. If possible takes the urb from the free list in | ||
820 | * usb->tx. | ||
821 | */ | ||
822 | static struct urb *alloc_tx_urb(struct zd_usb *usb) | ||
823 | { | ||
824 | struct zd_usb_tx *tx = &usb->tx; | ||
825 | unsigned long flags; | ||
826 | struct list_head *entry; | ||
827 | struct urb *urb; | ||
828 | |||
829 | spin_lock_irqsave(&tx->lock, flags); | ||
830 | if (list_empty(&tx->free_urb_list)) { | ||
831 | urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
832 | goto out; | ||
833 | } | ||
834 | entry = tx->free_urb_list.next; | ||
835 | list_del(entry); | ||
836 | urb = list_entry(entry, struct urb, urb_list); | ||
837 | out: | ||
838 | spin_unlock_irqrestore(&tx->lock, flags); | ||
839 | return urb; | ||
840 | } | ||
841 | |||
842 | /** | ||
843 | * free_tx_urb - frees a used tx URB | ||
844 | * @usb: a &struct zd_usb pointer | ||
845 | * @urb: URB to be freed | ||
846 | * | ||
847 | * Frees the transmission URB, which means to put it on the free URB | ||
848 | * list. | ||
849 | */ | ||
850 | static void free_tx_urb(struct zd_usb *usb, struct urb *urb) | ||
851 | { | ||
852 | struct zd_usb_tx *tx = &usb->tx; | ||
853 | unsigned long flags; | ||
854 | |||
855 | spin_lock_irqsave(&tx->lock, flags); | ||
856 | if (!tx->enabled) { | ||
857 | usb_free_urb(urb); | ||
858 | goto out; | ||
859 | } | ||
860 | list_add(&urb->urb_list, &tx->free_urb_list); | ||
861 | out: | ||
862 | spin_unlock_irqrestore(&tx->lock, flags); | ||
863 | } | ||
864 | |||
865 | static void tx_dec_submitted_urbs(struct zd_usb *usb) | 889 | static void tx_dec_submitted_urbs(struct zd_usb *usb) |
866 | { | 890 | { |
867 | struct zd_usb_tx *tx = &usb->tx; | 891 | struct zd_usb_tx *tx = &usb->tx; |
@@ -903,6 +927,16 @@ static void tx_urb_complete(struct urb *urb) | |||
903 | struct sk_buff *skb; | 927 | struct sk_buff *skb; |
904 | struct ieee80211_tx_info *info; | 928 | struct ieee80211_tx_info *info; |
905 | struct zd_usb *usb; | 929 | struct zd_usb *usb; |
930 | struct zd_usb_tx *tx; | ||
931 | |||
932 | skb = (struct sk_buff *)urb->context; | ||
933 | info = IEEE80211_SKB_CB(skb); | ||
934 | /* | ||
935 | * grab 'usb' pointer before handing off the skb (since | ||
936 | * it might be freed by zd_mac_tx_to_dev or mac80211) | ||
937 | */ | ||
938 | usb = &zd_hw_mac(info->rate_driver_data[0])->chip.usb; | ||
939 | tx = &usb->tx; | ||
906 | 940 | ||
907 | switch (urb->status) { | 941 | switch (urb->status) { |
908 | case 0: | 942 | case 0: |
@@ -920,20 +954,16 @@ static void tx_urb_complete(struct urb *urb) | |||
920 | goto resubmit; | 954 | goto resubmit; |
921 | } | 955 | } |
922 | free_urb: | 956 | free_urb: |
923 | skb = (struct sk_buff *)urb->context; | 957 | skb_unlink(skb, &usb->tx.submitted_skbs); |
924 | /* | ||
925 | * grab 'usb' pointer before handing off the skb (since | ||
926 | * it might be freed by zd_mac_tx_to_dev or mac80211) | ||
927 | */ | ||
928 | info = IEEE80211_SKB_CB(skb); | ||
929 | usb = &zd_hw_mac(info->rate_driver_data[0])->chip.usb; | ||
930 | zd_mac_tx_to_dev(skb, urb->status); | 958 | zd_mac_tx_to_dev(skb, urb->status); |
931 | free_tx_urb(usb, urb); | 959 | usb_free_urb(urb); |
932 | tx_dec_submitted_urbs(usb); | 960 | tx_dec_submitted_urbs(usb); |
933 | return; | 961 | return; |
934 | resubmit: | 962 | resubmit: |
963 | usb_anchor_urb(urb, &tx->submitted); | ||
935 | r = usb_submit_urb(urb, GFP_ATOMIC); | 964 | r = usb_submit_urb(urb, GFP_ATOMIC); |
936 | if (r) { | 965 | if (r) { |
966 | usb_unanchor_urb(urb); | ||
937 | dev_dbg_f(urb_dev(urb), "error resubmit urb %p %d\n", urb, r); | 967 | dev_dbg_f(urb_dev(urb), "error resubmit urb %p %d\n", urb, r); |
938 | goto free_urb; | 968 | goto free_urb; |
939 | } | 969 | } |
@@ -954,10 +984,17 @@ resubmit: | |||
954 | int zd_usb_tx(struct zd_usb *usb, struct sk_buff *skb) | 984 | int zd_usb_tx(struct zd_usb *usb, struct sk_buff *skb) |
955 | { | 985 | { |
956 | int r; | 986 | int r; |
987 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
957 | struct usb_device *udev = zd_usb_to_usbdev(usb); | 988 | struct usb_device *udev = zd_usb_to_usbdev(usb); |
958 | struct urb *urb; | 989 | struct urb *urb; |
990 | struct zd_usb_tx *tx = &usb->tx; | ||
991 | |||
992 | if (!atomic_read(&tx->enabled)) { | ||
993 | r = -ENOENT; | ||
994 | goto out; | ||
995 | } | ||
959 | 996 | ||
960 | urb = alloc_tx_urb(usb); | 997 | urb = usb_alloc_urb(0, GFP_ATOMIC); |
961 | if (!urb) { | 998 | if (!urb) { |
962 | r = -ENOMEM; | 999 | r = -ENOMEM; |
963 | goto out; | 1000 | goto out; |
@@ -966,17 +1003,125 @@ int zd_usb_tx(struct zd_usb *usb, struct sk_buff *skb) | |||
966 | usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT), | 1003 | usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_DATA_OUT), |
967 | skb->data, skb->len, tx_urb_complete, skb); | 1004 | skb->data, skb->len, tx_urb_complete, skb); |
968 | 1005 | ||
1006 | info->rate_driver_data[1] = (void *)jiffies; | ||
1007 | skb_queue_tail(&tx->submitted_skbs, skb); | ||
1008 | usb_anchor_urb(urb, &tx->submitted); | ||
1009 | |||
969 | r = usb_submit_urb(urb, GFP_ATOMIC); | 1010 | r = usb_submit_urb(urb, GFP_ATOMIC); |
970 | if (r) | 1011 | if (r) { |
1012 | dev_dbg_f(zd_usb_dev(usb), "error submit urb %p %d\n", urb, r); | ||
1013 | usb_unanchor_urb(urb); | ||
1014 | skb_unlink(skb, &tx->submitted_skbs); | ||
971 | goto error; | 1015 | goto error; |
1016 | } | ||
972 | tx_inc_submitted_urbs(usb); | 1017 | tx_inc_submitted_urbs(usb); |
973 | return 0; | 1018 | return 0; |
974 | error: | 1019 | error: |
975 | free_tx_urb(usb, urb); | 1020 | usb_free_urb(urb); |
976 | out: | 1021 | out: |
977 | return r; | 1022 | return r; |
978 | } | 1023 | } |
979 | 1024 | ||
1025 | static bool zd_tx_timeout(struct zd_usb *usb) | ||
1026 | { | ||
1027 | struct zd_usb_tx *tx = &usb->tx; | ||
1028 | struct sk_buff_head *q = &tx->submitted_skbs; | ||
1029 | struct sk_buff *skb, *skbnext; | ||
1030 | struct ieee80211_tx_info *info; | ||
1031 | unsigned long flags, trans_start; | ||
1032 | bool have_timedout = false; | ||
1033 | |||
1034 | spin_lock_irqsave(&q->lock, flags); | ||
1035 | skb_queue_walk_safe(q, skb, skbnext) { | ||
1036 | info = IEEE80211_SKB_CB(skb); | ||
1037 | trans_start = (unsigned long)info->rate_driver_data[1]; | ||
1038 | |||
1039 | if (time_is_before_jiffies(trans_start + ZD_TX_TIMEOUT)) { | ||
1040 | have_timedout = true; | ||
1041 | break; | ||
1042 | } | ||
1043 | } | ||
1044 | spin_unlock_irqrestore(&q->lock, flags); | ||
1045 | |||
1046 | return have_timedout; | ||
1047 | } | ||
1048 | |||
1049 | static void zd_tx_watchdog_handler(struct work_struct *work) | ||
1050 | { | ||
1051 | struct zd_usb *usb = | ||
1052 | container_of(work, struct zd_usb, tx.watchdog_work.work); | ||
1053 | struct zd_usb_tx *tx = &usb->tx; | ||
1054 | |||
1055 | if (!atomic_read(&tx->enabled) || !tx->watchdog_enabled) | ||
1056 | goto out; | ||
1057 | if (!zd_tx_timeout(usb)) | ||
1058 | goto out; | ||
1059 | |||
1060 | /* TX halted, try reset */ | ||
1061 | dev_warn(zd_usb_dev(usb), "TX-stall detected, reseting device..."); | ||
1062 | |||
1063 | usb_queue_reset_device(usb->intf); | ||
1064 | |||
1065 | /* reset will stop this worker, don't rearm */ | ||
1066 | return; | ||
1067 | out: | ||
1068 | queue_delayed_work(zd_workqueue, &tx->watchdog_work, | ||
1069 | ZD_TX_WATCHDOG_INTERVAL); | ||
1070 | } | ||
1071 | |||
1072 | void zd_tx_watchdog_enable(struct zd_usb *usb) | ||
1073 | { | ||
1074 | struct zd_usb_tx *tx = &usb->tx; | ||
1075 | |||
1076 | if (!tx->watchdog_enabled) { | ||
1077 | dev_dbg_f(zd_usb_dev(usb), "\n"); | ||
1078 | queue_delayed_work(zd_workqueue, &tx->watchdog_work, | ||
1079 | ZD_TX_WATCHDOG_INTERVAL); | ||
1080 | tx->watchdog_enabled = 1; | ||
1081 | } | ||
1082 | } | ||
1083 | |||
1084 | void zd_tx_watchdog_disable(struct zd_usb *usb) | ||
1085 | { | ||
1086 | struct zd_usb_tx *tx = &usb->tx; | ||
1087 | |||
1088 | if (tx->watchdog_enabled) { | ||
1089 | dev_dbg_f(zd_usb_dev(usb), "\n"); | ||
1090 | tx->watchdog_enabled = 0; | ||
1091 | cancel_delayed_work_sync(&tx->watchdog_work); | ||
1092 | } | ||
1093 | } | ||
1094 | |||
1095 | static void zd_rx_idle_timer_handler(struct work_struct *work) | ||
1096 | { | ||
1097 | struct zd_usb *usb = | ||
1098 | container_of(work, struct zd_usb, rx.idle_work.work); | ||
1099 | struct zd_mac *mac = zd_usb_to_mac(usb); | ||
1100 | |||
1101 | if (!test_bit(ZD_DEVICE_RUNNING, &mac->flags)) | ||
1102 | return; | ||
1103 | |||
1104 | dev_dbg_f(zd_usb_dev(usb), "\n"); | ||
1105 | |||
1106 | /* 30 seconds since last rx, reset rx */ | ||
1107 | zd_usb_reset_rx(usb); | ||
1108 | } | ||
1109 | |||
1110 | static void zd_usb_reset_rx_idle_timer_tasklet(unsigned long param) | ||
1111 | { | ||
1112 | struct zd_usb *usb = (struct zd_usb *)param; | ||
1113 | |||
1114 | zd_usb_reset_rx_idle_timer(usb); | ||
1115 | } | ||
1116 | |||
1117 | void zd_usb_reset_rx_idle_timer(struct zd_usb *usb) | ||
1118 | { | ||
1119 | struct zd_usb_rx *rx = &usb->rx; | ||
1120 | |||
1121 | cancel_delayed_work(&rx->idle_work); | ||
1122 | queue_delayed_work(zd_workqueue, &rx->idle_work, ZD_RX_IDLE_INTERVAL); | ||
1123 | } | ||
1124 | |||
980 | static inline void init_usb_interrupt(struct zd_usb *usb) | 1125 | static inline void init_usb_interrupt(struct zd_usb *usb) |
981 | { | 1126 | { |
982 | struct zd_usb_interrupt *intr = &usb->intr; | 1127 | struct zd_usb_interrupt *intr = &usb->intr; |
@@ -990,23 +1135,32 @@ static inline void init_usb_interrupt(struct zd_usb *usb) | |||
990 | static inline void init_usb_rx(struct zd_usb *usb) | 1135 | static inline void init_usb_rx(struct zd_usb *usb) |
991 | { | 1136 | { |
992 | struct zd_usb_rx *rx = &usb->rx; | 1137 | struct zd_usb_rx *rx = &usb->rx; |
1138 | |||
993 | spin_lock_init(&rx->lock); | 1139 | spin_lock_init(&rx->lock); |
1140 | mutex_init(&rx->setup_mutex); | ||
994 | if (interface_to_usbdev(usb->intf)->speed == USB_SPEED_HIGH) { | 1141 | if (interface_to_usbdev(usb->intf)->speed == USB_SPEED_HIGH) { |
995 | rx->usb_packet_size = 512; | 1142 | rx->usb_packet_size = 512; |
996 | } else { | 1143 | } else { |
997 | rx->usb_packet_size = 64; | 1144 | rx->usb_packet_size = 64; |
998 | } | 1145 | } |
999 | ZD_ASSERT(rx->fragment_length == 0); | 1146 | ZD_ASSERT(rx->fragment_length == 0); |
1147 | INIT_DELAYED_WORK(&rx->idle_work, zd_rx_idle_timer_handler); | ||
1148 | rx->reset_timer_tasklet.func = zd_usb_reset_rx_idle_timer_tasklet; | ||
1149 | rx->reset_timer_tasklet.data = (unsigned long)usb; | ||
1000 | } | 1150 | } |
1001 | 1151 | ||
1002 | static inline void init_usb_tx(struct zd_usb *usb) | 1152 | static inline void init_usb_tx(struct zd_usb *usb) |
1003 | { | 1153 | { |
1004 | struct zd_usb_tx *tx = &usb->tx; | 1154 | struct zd_usb_tx *tx = &usb->tx; |
1155 | |||
1005 | spin_lock_init(&tx->lock); | 1156 | spin_lock_init(&tx->lock); |
1006 | tx->enabled = 0; | 1157 | atomic_set(&tx->enabled, 0); |
1007 | tx->stopped = 0; | 1158 | tx->stopped = 0; |
1008 | INIT_LIST_HEAD(&tx->free_urb_list); | 1159 | skb_queue_head_init(&tx->submitted_skbs); |
1160 | init_usb_anchor(&tx->submitted); | ||
1009 | tx->submitted_urbs = 0; | 1161 | tx->submitted_urbs = 0; |
1162 | tx->watchdog_enabled = 0; | ||
1163 | INIT_DELAYED_WORK(&tx->watchdog_work, zd_tx_watchdog_handler); | ||
1010 | } | 1164 | } |
1011 | 1165 | ||
1012 | void zd_usb_init(struct zd_usb *usb, struct ieee80211_hw *hw, | 1166 | void zd_usb_init(struct zd_usb *usb, struct ieee80211_hw *hw, |
@@ -1015,6 +1169,7 @@ void zd_usb_init(struct zd_usb *usb, struct ieee80211_hw *hw, | |||
1015 | memset(usb, 0, sizeof(*usb)); | 1169 | memset(usb, 0, sizeof(*usb)); |
1016 | usb->intf = usb_get_intf(intf); | 1170 | usb->intf = usb_get_intf(intf); |
1017 | usb_set_intfdata(usb->intf, hw); | 1171 | usb_set_intfdata(usb->intf, hw); |
1172 | init_usb_anchor(&usb->submitted_cmds); | ||
1018 | init_usb_interrupt(usb); | 1173 | init_usb_interrupt(usb); |
1019 | init_usb_tx(usb); | 1174 | init_usb_tx(usb); |
1020 | init_usb_rx(usb); | 1175 | init_usb_rx(usb); |
@@ -1238,6 +1393,7 @@ static void disconnect(struct usb_interface *intf) | |||
1238 | ieee80211_unregister_hw(hw); | 1393 | ieee80211_unregister_hw(hw); |
1239 | 1394 | ||
1240 | /* Just in case something has gone wrong! */ | 1395 | /* Just in case something has gone wrong! */ |
1396 | zd_usb_disable_tx(usb); | ||
1241 | zd_usb_disable_rx(usb); | 1397 | zd_usb_disable_rx(usb); |
1242 | zd_usb_disable_int(usb); | 1398 | zd_usb_disable_int(usb); |
1243 | 1399 | ||
@@ -1253,11 +1409,92 @@ static void disconnect(struct usb_interface *intf) | |||
1253 | dev_dbg(&intf->dev, "disconnected\n"); | 1409 | dev_dbg(&intf->dev, "disconnected\n"); |
1254 | } | 1410 | } |
1255 | 1411 | ||
1412 | static void zd_usb_resume(struct zd_usb *usb) | ||
1413 | { | ||
1414 | struct zd_mac *mac = zd_usb_to_mac(usb); | ||
1415 | int r; | ||
1416 | |||
1417 | dev_dbg_f(zd_usb_dev(usb), "\n"); | ||
1418 | |||
1419 | r = zd_op_start(zd_usb_to_hw(usb)); | ||
1420 | if (r < 0) { | ||
1421 | dev_warn(zd_usb_dev(usb), "Device resume failed " | ||
1422 | "with error code %d. Retrying...\n", r); | ||
1423 | if (usb->was_running) | ||
1424 | set_bit(ZD_DEVICE_RUNNING, &mac->flags); | ||
1425 | usb_queue_reset_device(usb->intf); | ||
1426 | return; | ||
1427 | } | ||
1428 | |||
1429 | if (mac->type != NL80211_IFTYPE_UNSPECIFIED) { | ||
1430 | r = zd_restore_settings(mac); | ||
1431 | if (r < 0) { | ||
1432 | dev_dbg(zd_usb_dev(usb), | ||
1433 | "failed to restore settings, %d\n", r); | ||
1434 | return; | ||
1435 | } | ||
1436 | } | ||
1437 | } | ||
1438 | |||
1439 | static void zd_usb_stop(struct zd_usb *usb) | ||
1440 | { | ||
1441 | dev_dbg_f(zd_usb_dev(usb), "\n"); | ||
1442 | |||
1443 | zd_op_stop(zd_usb_to_hw(usb)); | ||
1444 | |||
1445 | zd_usb_disable_tx(usb); | ||
1446 | zd_usb_disable_rx(usb); | ||
1447 | zd_usb_disable_int(usb); | ||
1448 | |||
1449 | usb->initialized = 0; | ||
1450 | } | ||
1451 | |||
1452 | static int pre_reset(struct usb_interface *intf) | ||
1453 | { | ||
1454 | struct ieee80211_hw *hw = usb_get_intfdata(intf); | ||
1455 | struct zd_mac *mac; | ||
1456 | struct zd_usb *usb; | ||
1457 | |||
1458 | if (!hw || intf->condition != USB_INTERFACE_BOUND) | ||
1459 | return 0; | ||
1460 | |||
1461 | mac = zd_hw_mac(hw); | ||
1462 | usb = &mac->chip.usb; | ||
1463 | |||
1464 | usb->was_running = test_bit(ZD_DEVICE_RUNNING, &mac->flags); | ||
1465 | |||
1466 | zd_usb_stop(usb); | ||
1467 | |||
1468 | mutex_lock(&mac->chip.mutex); | ||
1469 | return 0; | ||
1470 | } | ||
1471 | |||
1472 | static int post_reset(struct usb_interface *intf) | ||
1473 | { | ||
1474 | struct ieee80211_hw *hw = usb_get_intfdata(intf); | ||
1475 | struct zd_mac *mac; | ||
1476 | struct zd_usb *usb; | ||
1477 | |||
1478 | if (!hw || intf->condition != USB_INTERFACE_BOUND) | ||
1479 | return 0; | ||
1480 | |||
1481 | mac = zd_hw_mac(hw); | ||
1482 | usb = &mac->chip.usb; | ||
1483 | |||
1484 | mutex_unlock(&mac->chip.mutex); | ||
1485 | |||
1486 | if (usb->was_running) | ||
1487 | zd_usb_resume(usb); | ||
1488 | return 0; | ||
1489 | } | ||
1490 | |||
1256 | static struct usb_driver driver = { | 1491 | static struct usb_driver driver = { |
1257 | .name = KBUILD_MODNAME, | 1492 | .name = KBUILD_MODNAME, |
1258 | .id_table = usb_ids, | 1493 | .id_table = usb_ids, |
1259 | .probe = probe, | 1494 | .probe = probe, |
1260 | .disconnect = disconnect, | 1495 | .disconnect = disconnect, |
1496 | .pre_reset = pre_reset, | ||
1497 | .post_reset = post_reset, | ||
1261 | }; | 1498 | }; |
1262 | 1499 | ||
1263 | struct workqueue_struct *zd_workqueue; | 1500 | struct workqueue_struct *zd_workqueue; |
@@ -1296,6 +1533,31 @@ static void __exit usb_exit(void) | |||
1296 | module_init(usb_init); | 1533 | module_init(usb_init); |
1297 | module_exit(usb_exit); | 1534 | module_exit(usb_exit); |
1298 | 1535 | ||
1536 | static int zd_ep_regs_out_msg(struct usb_device *udev, void *data, int len, | ||
1537 | int *actual_length, int timeout) | ||
1538 | { | ||
1539 | /* In USB 2.0 mode EP_REGS_OUT endpoint is interrupt type. However in | ||
1540 | * USB 1.1 mode endpoint is bulk. Select correct type URB by endpoint | ||
1541 | * descriptor. | ||
1542 | */ | ||
1543 | struct usb_host_endpoint *ep; | ||
1544 | unsigned int pipe; | ||
1545 | |||
1546 | pipe = usb_sndintpipe(udev, EP_REGS_OUT); | ||
1547 | ep = usb_pipe_endpoint(udev, pipe); | ||
1548 | if (!ep) | ||
1549 | return -EINVAL; | ||
1550 | |||
1551 | if (usb_endpoint_xfer_int(&ep->desc)) { | ||
1552 | return usb_interrupt_msg(udev, pipe, data, len, | ||
1553 | actual_length, timeout); | ||
1554 | } else { | ||
1555 | pipe = usb_sndbulkpipe(udev, EP_REGS_OUT); | ||
1556 | return usb_bulk_msg(udev, pipe, data, len, actual_length, | ||
1557 | timeout); | ||
1558 | } | ||
1559 | } | ||
1560 | |||
1299 | static int usb_int_regs_length(unsigned int count) | 1561 | static int usb_int_regs_length(unsigned int count) |
1300 | { | 1562 | { |
1301 | return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data); | 1563 | return sizeof(struct usb_int_regs) + count * sizeof(struct reg_data); |
@@ -1391,30 +1653,34 @@ int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, | |||
1391 | return -EWOULDBLOCK; | 1653 | return -EWOULDBLOCK; |
1392 | } | 1654 | } |
1393 | if (!usb_int_enabled(usb)) { | 1655 | if (!usb_int_enabled(usb)) { |
1394 | dev_dbg_f(zd_usb_dev(usb), | 1656 | dev_dbg_f(zd_usb_dev(usb), |
1395 | "error: usb interrupt not enabled\n"); | 1657 | "error: usb interrupt not enabled\n"); |
1396 | return -EWOULDBLOCK; | 1658 | return -EWOULDBLOCK; |
1397 | } | 1659 | } |
1398 | 1660 | ||
1661 | ZD_ASSERT(mutex_is_locked(&zd_usb_to_chip(usb)->mutex)); | ||
1662 | BUILD_BUG_ON(sizeof(struct usb_req_read_regs) + USB_MAX_IOREAD16_COUNT * | ||
1663 | sizeof(__le16) > sizeof(usb->req_buf)); | ||
1664 | BUG_ON(sizeof(struct usb_req_read_regs) + count * sizeof(__le16) > | ||
1665 | sizeof(usb->req_buf)); | ||
1666 | |||
1399 | req_len = sizeof(struct usb_req_read_regs) + count * sizeof(__le16); | 1667 | req_len = sizeof(struct usb_req_read_regs) + count * sizeof(__le16); |
1400 | req = kmalloc(req_len, GFP_KERNEL); | 1668 | req = (void *)usb->req_buf; |
1401 | if (!req) | 1669 | |
1402 | return -ENOMEM; | ||
1403 | req->id = cpu_to_le16(USB_REQ_READ_REGS); | 1670 | req->id = cpu_to_le16(USB_REQ_READ_REGS); |
1404 | for (i = 0; i < count; i++) | 1671 | for (i = 0; i < count; i++) |
1405 | req->addr[i] = cpu_to_le16((u16)addresses[i]); | 1672 | req->addr[i] = cpu_to_le16((u16)addresses[i]); |
1406 | 1673 | ||
1407 | udev = zd_usb_to_usbdev(usb); | 1674 | udev = zd_usb_to_usbdev(usb); |
1408 | prepare_read_regs_int(usb); | 1675 | prepare_read_regs_int(usb); |
1409 | r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, EP_REGS_OUT), | 1676 | r = zd_ep_regs_out_msg(udev, req, req_len, &actual_req_len, 50 /*ms*/); |
1410 | req, req_len, &actual_req_len, 1000 /* ms */); | ||
1411 | if (r) { | 1677 | if (r) { |
1412 | dev_dbg_f(zd_usb_dev(usb), | 1678 | dev_dbg_f(zd_usb_dev(usb), |
1413 | "error in usb_bulk_msg(). Error number %d\n", r); | 1679 | "error in zd_ep_regs_out_msg(). Error number %d\n", r); |
1414 | goto error; | 1680 | goto error; |
1415 | } | 1681 | } |
1416 | if (req_len != actual_req_len) { | 1682 | if (req_len != actual_req_len) { |
1417 | dev_dbg_f(zd_usb_dev(usb), "error in usb_bulk_msg()\n" | 1683 | dev_dbg_f(zd_usb_dev(usb), "error in zd_ep_regs_out_msg()\n" |
1418 | " req_len %d != actual_req_len %d\n", | 1684 | " req_len %d != actual_req_len %d\n", |
1419 | req_len, actual_req_len); | 1685 | req_len, actual_req_len); |
1420 | r = -EIO; | 1686 | r = -EIO; |
@@ -1422,7 +1688,7 @@ int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, | |||
1422 | } | 1688 | } |
1423 | 1689 | ||
1424 | timeout = wait_for_completion_timeout(&usb->intr.read_regs.completion, | 1690 | timeout = wait_for_completion_timeout(&usb->intr.read_regs.completion, |
1425 | msecs_to_jiffies(1000)); | 1691 | msecs_to_jiffies(50)); |
1426 | if (!timeout) { | 1692 | if (!timeout) { |
1427 | disable_read_regs_int(usb); | 1693 | disable_read_regs_int(usb); |
1428 | dev_dbg_f(zd_usb_dev(usb), "read timed out\n"); | 1694 | dev_dbg_f(zd_usb_dev(usb), "read timed out\n"); |
@@ -1432,17 +1698,110 @@ int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, | |||
1432 | 1698 | ||
1433 | r = get_results(usb, values, req, count); | 1699 | r = get_results(usb, values, req, count); |
1434 | error: | 1700 | error: |
1435 | kfree(req); | ||
1436 | return r; | 1701 | return r; |
1437 | } | 1702 | } |
1438 | 1703 | ||
1439 | int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, | 1704 | static void iowrite16v_urb_complete(struct urb *urb) |
1440 | unsigned int count) | 1705 | { |
1706 | struct zd_usb *usb = urb->context; | ||
1707 | |||
1708 | if (urb->status && !usb->cmd_error) | ||
1709 | usb->cmd_error = urb->status; | ||
1710 | |||
1711 | if (!usb->cmd_error && | ||
1712 | urb->actual_length != urb->transfer_buffer_length) | ||
1713 | usb->cmd_error = -EIO; | ||
1714 | } | ||
1715 | |||
1716 | static int zd_submit_waiting_urb(struct zd_usb *usb, bool last) | ||
1717 | { | ||
1718 | int r = 0; | ||
1719 | struct urb *urb = usb->urb_async_waiting; | ||
1720 | |||
1721 | if (!urb) | ||
1722 | return 0; | ||
1723 | |||
1724 | usb->urb_async_waiting = NULL; | ||
1725 | |||
1726 | if (!last) | ||
1727 | urb->transfer_flags |= URB_NO_INTERRUPT; | ||
1728 | |||
1729 | usb_anchor_urb(urb, &usb->submitted_cmds); | ||
1730 | r = usb_submit_urb(urb, GFP_KERNEL); | ||
1731 | if (r) { | ||
1732 | usb_unanchor_urb(urb); | ||
1733 | dev_dbg_f(zd_usb_dev(usb), | ||
1734 | "error in usb_submit_urb(). Error number %d\n", r); | ||
1735 | goto error; | ||
1736 | } | ||
1737 | |||
1738 | /* fall-through with r == 0 */ | ||
1739 | error: | ||
1740 | usb_free_urb(urb); | ||
1741 | return r; | ||
1742 | } | ||
1743 | |||
1744 | void zd_usb_iowrite16v_async_start(struct zd_usb *usb) | ||
1745 | { | ||
1746 | ZD_ASSERT(usb_anchor_empty(&usb->submitted_cmds)); | ||
1747 | ZD_ASSERT(usb->urb_async_waiting == NULL); | ||
1748 | ZD_ASSERT(!usb->in_async); | ||
1749 | |||
1750 | ZD_ASSERT(mutex_is_locked(&zd_usb_to_chip(usb)->mutex)); | ||
1751 | |||
1752 | usb->in_async = 1; | ||
1753 | usb->cmd_error = 0; | ||
1754 | usb->urb_async_waiting = NULL; | ||
1755 | } | ||
1756 | |||
1757 | int zd_usb_iowrite16v_async_end(struct zd_usb *usb, unsigned int timeout) | ||
1758 | { | ||
1759 | int r; | ||
1760 | |||
1761 | ZD_ASSERT(mutex_is_locked(&zd_usb_to_chip(usb)->mutex)); | ||
1762 | ZD_ASSERT(usb->in_async); | ||
1763 | |||
1764 | /* Submit last iowrite16v URB */ | ||
1765 | r = zd_submit_waiting_urb(usb, true); | ||
1766 | if (r) { | ||
1767 | dev_dbg_f(zd_usb_dev(usb), | ||
1768 | "error in zd_submit_waiting_usb(). " | ||
1769 | "Error number %d\n", r); | ||
1770 | |||
1771 | usb_kill_anchored_urbs(&usb->submitted_cmds); | ||
1772 | goto error; | ||
1773 | } | ||
1774 | |||
1775 | if (timeout) | ||
1776 | timeout = usb_wait_anchor_empty_timeout(&usb->submitted_cmds, | ||
1777 | timeout); | ||
1778 | if (!timeout) { | ||
1779 | usb_kill_anchored_urbs(&usb->submitted_cmds); | ||
1780 | if (usb->cmd_error == -ENOENT) { | ||
1781 | dev_dbg_f(zd_usb_dev(usb), "timed out"); | ||
1782 | r = -ETIMEDOUT; | ||
1783 | goto error; | ||
1784 | } | ||
1785 | } | ||
1786 | |||
1787 | r = usb->cmd_error; | ||
1788 | error: | ||
1789 | usb->in_async = 0; | ||
1790 | return r; | ||
1791 | } | ||
1792 | |||
1793 | int zd_usb_iowrite16v_async(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, | ||
1794 | unsigned int count) | ||
1441 | { | 1795 | { |
1442 | int r; | 1796 | int r; |
1443 | struct usb_device *udev; | 1797 | struct usb_device *udev; |
1444 | struct usb_req_write_regs *req = NULL; | 1798 | struct usb_req_write_regs *req = NULL; |
1445 | int i, req_len, actual_req_len; | 1799 | int i, req_len; |
1800 | struct urb *urb; | ||
1801 | struct usb_host_endpoint *ep; | ||
1802 | |||
1803 | ZD_ASSERT(mutex_is_locked(&zd_usb_to_chip(usb)->mutex)); | ||
1804 | ZD_ASSERT(usb->in_async); | ||
1446 | 1805 | ||
1447 | if (count == 0) | 1806 | if (count == 0) |
1448 | return 0; | 1807 | return 0; |
@@ -1458,11 +1817,23 @@ int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, | |||
1458 | return -EWOULDBLOCK; | 1817 | return -EWOULDBLOCK; |
1459 | } | 1818 | } |
1460 | 1819 | ||
1820 | udev = zd_usb_to_usbdev(usb); | ||
1821 | |||
1822 | ep = usb_pipe_endpoint(udev, usb_sndintpipe(udev, EP_REGS_OUT)); | ||
1823 | if (!ep) | ||
1824 | return -ENOENT; | ||
1825 | |||
1826 | urb = usb_alloc_urb(0, GFP_KERNEL); | ||
1827 | if (!urb) | ||
1828 | return -ENOMEM; | ||
1829 | |||
1461 | req_len = sizeof(struct usb_req_write_regs) + | 1830 | req_len = sizeof(struct usb_req_write_regs) + |
1462 | count * sizeof(struct reg_data); | 1831 | count * sizeof(struct reg_data); |
1463 | req = kmalloc(req_len, GFP_KERNEL); | 1832 | req = kmalloc(req_len, GFP_KERNEL); |
1464 | if (!req) | 1833 | if (!req) { |
1465 | return -ENOMEM; | 1834 | r = -ENOMEM; |
1835 | goto error; | ||
1836 | } | ||
1466 | 1837 | ||
1467 | req->id = cpu_to_le16(USB_REQ_WRITE_REGS); | 1838 | req->id = cpu_to_le16(USB_REQ_WRITE_REGS); |
1468 | for (i = 0; i < count; i++) { | 1839 | for (i = 0; i < count; i++) { |
@@ -1471,29 +1842,52 @@ int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, | |||
1471 | rw->value = cpu_to_le16(ioreqs[i].value); | 1842 | rw->value = cpu_to_le16(ioreqs[i].value); |
1472 | } | 1843 | } |
1473 | 1844 | ||
1474 | udev = zd_usb_to_usbdev(usb); | 1845 | /* In USB 2.0 mode endpoint is interrupt type. However in USB 1.1 mode |
1475 | r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, EP_REGS_OUT), | 1846 | * endpoint is bulk. Select correct type URB by endpoint descriptor. |
1476 | req, req_len, &actual_req_len, 1000 /* ms */); | 1847 | */ |
1848 | if (usb_endpoint_xfer_int(&ep->desc)) | ||
1849 | usb_fill_int_urb(urb, udev, usb_sndintpipe(udev, EP_REGS_OUT), | ||
1850 | req, req_len, iowrite16v_urb_complete, usb, | ||
1851 | ep->desc.bInterval); | ||
1852 | else | ||
1853 | usb_fill_bulk_urb(urb, udev, usb_sndbulkpipe(udev, EP_REGS_OUT), | ||
1854 | req, req_len, iowrite16v_urb_complete, usb); | ||
1855 | |||
1856 | urb->transfer_flags |= URB_FREE_BUFFER; | ||
1857 | |||
1858 | /* Submit previous URB */ | ||
1859 | r = zd_submit_waiting_urb(usb, false); | ||
1477 | if (r) { | 1860 | if (r) { |
1478 | dev_dbg_f(zd_usb_dev(usb), | 1861 | dev_dbg_f(zd_usb_dev(usb), |
1479 | "error in usb_bulk_msg(). Error number %d\n", r); | 1862 | "error in zd_submit_waiting_usb(). " |
1480 | goto error; | 1863 | "Error number %d\n", r); |
1481 | } | ||
1482 | if (req_len != actual_req_len) { | ||
1483 | dev_dbg_f(zd_usb_dev(usb), | ||
1484 | "error in usb_bulk_msg()" | ||
1485 | " req_len %d != actual_req_len %d\n", | ||
1486 | req_len, actual_req_len); | ||
1487 | r = -EIO; | ||
1488 | goto error; | 1864 | goto error; |
1489 | } | 1865 | } |
1490 | 1866 | ||
1491 | /* FALL-THROUGH with r == 0 */ | 1867 | /* Delay submit so that URB_NO_INTERRUPT flag can be set for all URBs |
1868 | * of currect batch except for very last. | ||
1869 | */ | ||
1870 | usb->urb_async_waiting = urb; | ||
1871 | return 0; | ||
1492 | error: | 1872 | error: |
1493 | kfree(req); | 1873 | usb_free_urb(urb); |
1494 | return r; | 1874 | return r; |
1495 | } | 1875 | } |
1496 | 1876 | ||
1877 | int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, | ||
1878 | unsigned int count) | ||
1879 | { | ||
1880 | int r; | ||
1881 | |||
1882 | zd_usb_iowrite16v_async_start(usb); | ||
1883 | r = zd_usb_iowrite16v_async(usb, ioreqs, count); | ||
1884 | if (r) { | ||
1885 | zd_usb_iowrite16v_async_end(usb, 0); | ||
1886 | return r; | ||
1887 | } | ||
1888 | return zd_usb_iowrite16v_async_end(usb, 50 /* ms */); | ||
1889 | } | ||
1890 | |||
1497 | int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits) | 1891 | int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits) |
1498 | { | 1892 | { |
1499 | int r; | 1893 | int r; |
@@ -1531,18 +1925,23 @@ int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits) | |||
1531 | 1925 | ||
1532 | dev_dbg_f(zd_usb_dev(usb), "value %#09x bits %d\n", value, bits); | 1926 | dev_dbg_f(zd_usb_dev(usb), "value %#09x bits %d\n", value, bits); |
1533 | 1927 | ||
1534 | r = zd_usb_ioread16(usb, &bit_value_template, CR203); | 1928 | r = zd_usb_ioread16(usb, &bit_value_template, ZD_CR203); |
1535 | if (r) { | 1929 | if (r) { |
1536 | dev_dbg_f(zd_usb_dev(usb), | 1930 | dev_dbg_f(zd_usb_dev(usb), |
1537 | "error %d: Couldn't read CR203\n", r); | 1931 | "error %d: Couldn't read ZD_CR203\n", r); |
1538 | goto out; | 1932 | return r; |
1539 | } | 1933 | } |
1540 | bit_value_template &= ~(RF_IF_LE|RF_CLK|RF_DATA); | 1934 | bit_value_template &= ~(RF_IF_LE|RF_CLK|RF_DATA); |
1541 | 1935 | ||
1936 | ZD_ASSERT(mutex_is_locked(&zd_usb_to_chip(usb)->mutex)); | ||
1937 | BUILD_BUG_ON(sizeof(struct usb_req_rfwrite) + | ||
1938 | USB_MAX_RFWRITE_BIT_COUNT * sizeof(__le16) > | ||
1939 | sizeof(usb->req_buf)); | ||
1940 | BUG_ON(sizeof(struct usb_req_rfwrite) + bits * sizeof(__le16) > | ||
1941 | sizeof(usb->req_buf)); | ||
1942 | |||
1542 | req_len = sizeof(struct usb_req_rfwrite) + bits * sizeof(__le16); | 1943 | req_len = sizeof(struct usb_req_rfwrite) + bits * sizeof(__le16); |
1543 | req = kmalloc(req_len, GFP_KERNEL); | 1944 | req = (void *)usb->req_buf; |
1544 | if (!req) | ||
1545 | return -ENOMEM; | ||
1546 | 1945 | ||
1547 | req->id = cpu_to_le16(USB_REQ_WRITE_RF); | 1946 | req->id = cpu_to_le16(USB_REQ_WRITE_RF); |
1548 | /* 1: 3683a, but not used in ZYDAS driver */ | 1947 | /* 1: 3683a, but not used in ZYDAS driver */ |
@@ -1557,15 +1956,14 @@ int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits) | |||
1557 | } | 1956 | } |
1558 | 1957 | ||
1559 | udev = zd_usb_to_usbdev(usb); | 1958 | udev = zd_usb_to_usbdev(usb); |
1560 | r = usb_bulk_msg(udev, usb_sndbulkpipe(udev, EP_REGS_OUT), | 1959 | r = zd_ep_regs_out_msg(udev, req, req_len, &actual_req_len, 50 /*ms*/); |
1561 | req, req_len, &actual_req_len, 1000 /* ms */); | ||
1562 | if (r) { | 1960 | if (r) { |
1563 | dev_dbg_f(zd_usb_dev(usb), | 1961 | dev_dbg_f(zd_usb_dev(usb), |
1564 | "error in usb_bulk_msg(). Error number %d\n", r); | 1962 | "error in zd_ep_regs_out_msg(). Error number %d\n", r); |
1565 | goto out; | 1963 | goto out; |
1566 | } | 1964 | } |
1567 | if (req_len != actual_req_len) { | 1965 | if (req_len != actual_req_len) { |
1568 | dev_dbg_f(zd_usb_dev(usb), "error in usb_bulk_msg()" | 1966 | dev_dbg_f(zd_usb_dev(usb), "error in zd_ep_regs_out_msg()" |
1569 | " req_len %d != actual_req_len %d\n", | 1967 | " req_len %d != actual_req_len %d\n", |
1570 | req_len, actual_req_len); | 1968 | req_len, actual_req_len); |
1571 | r = -EIO; | 1969 | r = -EIO; |
@@ -1574,6 +1972,5 @@ int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits) | |||
1574 | 1972 | ||
1575 | /* FALL-THROUGH with r == 0 */ | 1973 | /* FALL-THROUGH with r == 0 */ |
1576 | out: | 1974 | out: |
1577 | kfree(req); | ||
1578 | return r; | 1975 | return r; |
1579 | } | 1976 | } |