diff options
Diffstat (limited to 'drivers/usb/host/r8a66597-hcd.c')
-rw-r--r-- | drivers/usb/host/r8a66597-hcd.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index 40a1de4c256e..94bb229df3bc 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
@@ -784,6 +784,9 @@ static void force_dequeue(struct r8a66597 *r8a66597, u16 pipenum, u16 address) | |||
784 | if (urb) { | 784 | if (urb) { |
785 | urb->status = -ENODEV; | 785 | urb->status = -ENODEV; |
786 | urb->hcpriv = NULL; | 786 | urb->hcpriv = NULL; |
787 | usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597), | ||
788 | urb); | ||
789 | |||
787 | spin_unlock(&r8a66597->lock); | 790 | spin_unlock(&r8a66597->lock); |
788 | usb_hcd_giveback_urb(r8a66597_to_hcd(r8a66597), urb); | 791 | usb_hcd_giveback_urb(r8a66597_to_hcd(r8a66597), urb); |
789 | spin_lock(&r8a66597->lock); | 792 | spin_lock(&r8a66597->lock); |
@@ -1131,6 +1134,8 @@ static void done(struct r8a66597 *r8a66597, struct r8a66597_td *td, | |||
1131 | urb->start_frame = r8a66597_get_frame(hcd); | 1134 | urb->start_frame = r8a66597_get_frame(hcd); |
1132 | 1135 | ||
1133 | urb->hcpriv = NULL; | 1136 | urb->hcpriv = NULL; |
1137 | usb_hcd_unlink_urb_from_ep(r8a66597_to_hcd(r8a66597), urb); | ||
1138 | |||
1134 | spin_unlock(&r8a66597->lock); | 1139 | spin_unlock(&r8a66597->lock); |
1135 | usb_hcd_giveback_urb(hcd, urb); | 1140 | usb_hcd_giveback_urb(hcd, urb); |
1136 | spin_lock(&r8a66597->lock); | 1141 | spin_lock(&r8a66597->lock); |
@@ -1722,21 +1727,25 @@ static struct r8a66597_td *r8a66597_make_td(struct r8a66597 *r8a66597, | |||
1722 | } | 1727 | } |
1723 | 1728 | ||
1724 | static int r8a66597_urb_enqueue(struct usb_hcd *hcd, | 1729 | static int r8a66597_urb_enqueue(struct usb_hcd *hcd, |
1725 | struct usb_host_endpoint *hep, | ||
1726 | struct urb *urb, | 1730 | struct urb *urb, |
1727 | gfp_t mem_flags) | 1731 | gfp_t mem_flags) |
1728 | { | 1732 | { |
1733 | struct usb_host_endpoint *hep = urb->ep; | ||
1729 | struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); | 1734 | struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); |
1730 | struct r8a66597_td *td = NULL; | 1735 | struct r8a66597_td *td = NULL; |
1731 | int ret = 0, request = 0; | 1736 | int ret, request = 0; |
1732 | unsigned long flags; | 1737 | unsigned long flags; |
1733 | 1738 | ||
1734 | spin_lock_irqsave(&r8a66597->lock, flags); | 1739 | spin_lock_irqsave(&r8a66597->lock, flags); |
1735 | if (!get_urb_to_r8a66597_dev(r8a66597, urb)) { | 1740 | if (!get_urb_to_r8a66597_dev(r8a66597, urb)) { |
1736 | ret = -ENODEV; | 1741 | ret = -ENODEV; |
1737 | goto error; | 1742 | goto error_not_linked; |
1738 | } | 1743 | } |
1739 | 1744 | ||
1745 | ret = usb_hcd_link_urb_to_ep(hcd, urb); | ||
1746 | if (ret) | ||
1747 | goto error_not_linked; | ||
1748 | |||
1740 | if (!hep->hcpriv) { | 1749 | if (!hep->hcpriv) { |
1741 | hep->hcpriv = kzalloc(sizeof(struct r8a66597_pipe), | 1750 | hep->hcpriv = kzalloc(sizeof(struct r8a66597_pipe), |
1742 | GFP_ATOMIC); | 1751 | GFP_ATOMIC); |
@@ -1761,15 +1770,7 @@ static int r8a66597_urb_enqueue(struct usb_hcd *hcd, | |||
1761 | if (list_empty(&r8a66597->pipe_queue[td->pipenum])) | 1770 | if (list_empty(&r8a66597->pipe_queue[td->pipenum])) |
1762 | request = 1; | 1771 | request = 1; |
1763 | list_add_tail(&td->queue, &r8a66597->pipe_queue[td->pipenum]); | 1772 | list_add_tail(&td->queue, &r8a66597->pipe_queue[td->pipenum]); |
1764 | |||
1765 | spin_lock(&urb->lock); | ||
1766 | if (urb->status != -EINPROGRESS) { | ||
1767 | spin_unlock(&urb->lock); | ||
1768 | ret = -EPIPE; | ||
1769 | goto error; | ||
1770 | } | ||
1771 | urb->hcpriv = td; | 1773 | urb->hcpriv = td; |
1772 | spin_unlock(&urb->lock); | ||
1773 | 1774 | ||
1774 | if (request) { | 1775 | if (request) { |
1775 | ret = start_transfer(r8a66597, td); | 1776 | ret = start_transfer(r8a66597, td); |
@@ -1781,17 +1782,26 @@ static int r8a66597_urb_enqueue(struct usb_hcd *hcd, | |||
1781 | set_td_timer(r8a66597, td); | 1782 | set_td_timer(r8a66597, td); |
1782 | 1783 | ||
1783 | error: | 1784 | error: |
1785 | if (ret) | ||
1786 | usb_hcd_unlink_urb_from_ep(hcd, urb); | ||
1787 | error_not_linked: | ||
1784 | spin_unlock_irqrestore(&r8a66597->lock, flags); | 1788 | spin_unlock_irqrestore(&r8a66597->lock, flags); |
1785 | return ret; | 1789 | return ret; |
1786 | } | 1790 | } |
1787 | 1791 | ||
1788 | static int r8a66597_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) | 1792 | static int r8a66597_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, |
1793 | int status) | ||
1789 | { | 1794 | { |
1790 | struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); | 1795 | struct r8a66597 *r8a66597 = hcd_to_r8a66597(hcd); |
1791 | struct r8a66597_td *td; | 1796 | struct r8a66597_td *td; |
1792 | unsigned long flags; | 1797 | unsigned long flags; |
1798 | int rc; | ||
1793 | 1799 | ||
1794 | spin_lock_irqsave(&r8a66597->lock, flags); | 1800 | spin_lock_irqsave(&r8a66597->lock, flags); |
1801 | rc = usb_hcd_check_unlink_urb(hcd, urb, status); | ||
1802 | if (rc) | ||
1803 | goto done; | ||
1804 | |||
1795 | if (urb->hcpriv) { | 1805 | if (urb->hcpriv) { |
1796 | td = urb->hcpriv; | 1806 | td = urb->hcpriv; |
1797 | pipe_stop(r8a66597, td->pipe); | 1807 | pipe_stop(r8a66597, td->pipe); |
@@ -1799,8 +1809,9 @@ static int r8a66597_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) | |||
1799 | disable_irq_empty(r8a66597, td->pipenum); | 1809 | disable_irq_empty(r8a66597, td->pipenum); |
1800 | done(r8a66597, td, td->pipenum, urb); | 1810 | done(r8a66597, td, td->pipenum, urb); |
1801 | } | 1811 | } |
1812 | done: | ||
1802 | spin_unlock_irqrestore(&r8a66597->lock, flags); | 1813 | spin_unlock_irqrestore(&r8a66597->lock, flags); |
1803 | return 0; | 1814 | return rc; |
1804 | } | 1815 | } |
1805 | 1816 | ||
1806 | static void r8a66597_endpoint_disable(struct usb_hcd *hcd, | 1817 | static void r8a66597_endpoint_disable(struct usb_hcd *hcd, |