diff options
Diffstat (limited to 'drivers/usb/host/ehci-sched.c')
-rw-r--r-- | drivers/usb/host/ehci-sched.c | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index e682f2342ef8..80d99bce2b38 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
@@ -797,7 +797,6 @@ done: | |||
797 | 797 | ||
798 | static int intr_submit ( | 798 | static int intr_submit ( |
799 | struct ehci_hcd *ehci, | 799 | struct ehci_hcd *ehci, |
800 | struct usb_host_endpoint *ep, | ||
801 | struct urb *urb, | 800 | struct urb *urb, |
802 | struct list_head *qtd_list, | 801 | struct list_head *qtd_list, |
803 | gfp_t mem_flags | 802 | gfp_t mem_flags |
@@ -805,23 +804,26 @@ static int intr_submit ( | |||
805 | unsigned epnum; | 804 | unsigned epnum; |
806 | unsigned long flags; | 805 | unsigned long flags; |
807 | struct ehci_qh *qh; | 806 | struct ehci_qh *qh; |
808 | int status = 0; | 807 | int status; |
809 | struct list_head empty; | 808 | struct list_head empty; |
810 | 809 | ||
811 | /* get endpoint and transfer/schedule data */ | 810 | /* get endpoint and transfer/schedule data */ |
812 | epnum = ep->desc.bEndpointAddress; | 811 | epnum = urb->ep->desc.bEndpointAddress; |
813 | 812 | ||
814 | spin_lock_irqsave (&ehci->lock, flags); | 813 | spin_lock_irqsave (&ehci->lock, flags); |
815 | 814 | ||
816 | if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, | 815 | if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, |
817 | &ehci_to_hcd(ehci)->flags))) { | 816 | &ehci_to_hcd(ehci)->flags))) { |
818 | status = -ESHUTDOWN; | 817 | status = -ESHUTDOWN; |
819 | goto done; | 818 | goto done_not_linked; |
820 | } | 819 | } |
820 | status = usb_hcd_link_urb_to_ep(ehci_to_hcd(ehci), urb); | ||
821 | if (unlikely(status)) | ||
822 | goto done_not_linked; | ||
821 | 823 | ||
822 | /* get qh and force any scheduling errors */ | 824 | /* get qh and force any scheduling errors */ |
823 | INIT_LIST_HEAD (&empty); | 825 | INIT_LIST_HEAD (&empty); |
824 | qh = qh_append_tds (ehci, urb, &empty, epnum, &ep->hcpriv); | 826 | qh = qh_append_tds(ehci, urb, &empty, epnum, &urb->ep->hcpriv); |
825 | if (qh == NULL) { | 827 | if (qh == NULL) { |
826 | status = -ENOMEM; | 828 | status = -ENOMEM; |
827 | goto done; | 829 | goto done; |
@@ -832,13 +834,16 @@ static int intr_submit ( | |||
832 | } | 834 | } |
833 | 835 | ||
834 | /* then queue the urb's tds to the qh */ | 836 | /* then queue the urb's tds to the qh */ |
835 | qh = qh_append_tds (ehci, urb, qtd_list, epnum, &ep->hcpriv); | 837 | qh = qh_append_tds(ehci, urb, qtd_list, epnum, &urb->ep->hcpriv); |
836 | BUG_ON (qh == NULL); | 838 | BUG_ON (qh == NULL); |
837 | 839 | ||
838 | /* ... update usbfs periodic stats */ | 840 | /* ... update usbfs periodic stats */ |
839 | ehci_to_hcd(ehci)->self.bandwidth_int_reqs++; | 841 | ehci_to_hcd(ehci)->self.bandwidth_int_reqs++; |
840 | 842 | ||
841 | done: | 843 | done: |
844 | if (unlikely(status)) | ||
845 | usb_hcd_unlink_urb_from_ep(ehci_to_hcd(ehci), urb); | ||
846 | done_not_linked: | ||
842 | spin_unlock_irqrestore (&ehci->lock, flags); | 847 | spin_unlock_irqrestore (&ehci->lock, flags); |
843 | if (status) | 848 | if (status) |
844 | qtd_list_free (ehci, urb, qtd_list); | 849 | qtd_list_free (ehci, urb, qtd_list); |
@@ -1622,7 +1627,7 @@ itd_complete ( | |||
1622 | 1627 | ||
1623 | /* give urb back to the driver ... can be out-of-order */ | 1628 | /* give urb back to the driver ... can be out-of-order */ |
1624 | dev = urb->dev; | 1629 | dev = urb->dev; |
1625 | ehci_urb_done (ehci, urb); | 1630 | ehci_urb_done(ehci, urb, 0); |
1626 | urb = NULL; | 1631 | urb = NULL; |
1627 | 1632 | ||
1628 | /* defer stopping schedule; completion can submit */ | 1633 | /* defer stopping schedule; completion can submit */ |
@@ -1686,12 +1691,19 @@ static int itd_submit (struct ehci_hcd *ehci, struct urb *urb, | |||
1686 | /* schedule ... need to lock */ | 1691 | /* schedule ... need to lock */ |
1687 | spin_lock_irqsave (&ehci->lock, flags); | 1692 | spin_lock_irqsave (&ehci->lock, flags); |
1688 | if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, | 1693 | if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, |
1689 | &ehci_to_hcd(ehci)->flags))) | 1694 | &ehci_to_hcd(ehci)->flags))) { |
1690 | status = -ESHUTDOWN; | 1695 | status = -ESHUTDOWN; |
1691 | else | 1696 | goto done_not_linked; |
1692 | status = iso_stream_schedule (ehci, urb, stream); | 1697 | } |
1698 | status = usb_hcd_link_urb_to_ep(ehci_to_hcd(ehci), urb); | ||
1699 | if (unlikely(status)) | ||
1700 | goto done_not_linked; | ||
1701 | status = iso_stream_schedule(ehci, urb, stream); | ||
1693 | if (likely (status == 0)) | 1702 | if (likely (status == 0)) |
1694 | itd_link_urb (ehci, urb, ehci->periodic_size << 3, stream); | 1703 | itd_link_urb (ehci, urb, ehci->periodic_size << 3, stream); |
1704 | else | ||
1705 | usb_hcd_unlink_urb_from_ep(ehci_to_hcd(ehci), urb); | ||
1706 | done_not_linked: | ||
1695 | spin_unlock_irqrestore (&ehci->lock, flags); | 1707 | spin_unlock_irqrestore (&ehci->lock, flags); |
1696 | 1708 | ||
1697 | done: | 1709 | done: |
@@ -1988,7 +2000,7 @@ sitd_complete ( | |||
1988 | 2000 | ||
1989 | /* give urb back to the driver */ | 2001 | /* give urb back to the driver */ |
1990 | dev = urb->dev; | 2002 | dev = urb->dev; |
1991 | ehci_urb_done (ehci, urb); | 2003 | ehci_urb_done(ehci, urb, 0); |
1992 | urb = NULL; | 2004 | urb = NULL; |
1993 | 2005 | ||
1994 | /* defer stopping schedule; completion can submit */ | 2006 | /* defer stopping schedule; completion can submit */ |
@@ -2049,12 +2061,19 @@ static int sitd_submit (struct ehci_hcd *ehci, struct urb *urb, | |||
2049 | /* schedule ... need to lock */ | 2061 | /* schedule ... need to lock */ |
2050 | spin_lock_irqsave (&ehci->lock, flags); | 2062 | spin_lock_irqsave (&ehci->lock, flags); |
2051 | if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, | 2063 | if (unlikely(!test_bit(HCD_FLAG_HW_ACCESSIBLE, |
2052 | &ehci_to_hcd(ehci)->flags))) | 2064 | &ehci_to_hcd(ehci)->flags))) { |
2053 | status = -ESHUTDOWN; | 2065 | status = -ESHUTDOWN; |
2054 | else | 2066 | goto done_not_linked; |
2055 | status = iso_stream_schedule (ehci, urb, stream); | 2067 | } |
2068 | status = usb_hcd_link_urb_to_ep(ehci_to_hcd(ehci), urb); | ||
2069 | if (unlikely(status)) | ||
2070 | goto done_not_linked; | ||
2071 | status = iso_stream_schedule(ehci, urb, stream); | ||
2056 | if (status == 0) | 2072 | if (status == 0) |
2057 | sitd_link_urb (ehci, urb, ehci->periodic_size << 3, stream); | 2073 | sitd_link_urb (ehci, urb, ehci->periodic_size << 3, stream); |
2074 | else | ||
2075 | usb_hcd_unlink_urb_from_ep(ehci_to_hcd(ehci), urb); | ||
2076 | done_not_linked: | ||
2058 | spin_unlock_irqrestore (&ehci->lock, flags); | 2077 | spin_unlock_irqrestore (&ehci->lock, flags); |
2059 | 2078 | ||
2060 | done: | 2079 | done: |