]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
QE/FHCI: fixed the CONTROL bug
authorJerry Huang <r66093@freescale.com>
Tue, 18 Oct 2011 05:09:48 +0000 (13:09 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 7 Nov 2011 21:47:21 +0000 (13:47 -0800)
commit 273d23574f9dacd9c63c80e7d63639a669aad441 upstream.

For USB CONTROL transaction, when the data length is zero,
the IN package is needed to finish this transaction in status stage.

Signed-off-by: Jerry Huang <r66093@freescale.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/host/fhci-sched.c

index ff43747a614fb1fd0d09c60cfddb25def4526f07..b13d78a1c151fa1c8f83deb449ea2bd33e88786a 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Freescale QUICC Engine USB Host Controller Driver
  *
- * Copyright (c) Freescale Semicondutor, Inc. 2006.
+ * Copyright (c) Freescale Semicondutor, Inc. 2006, 2011.
  *               Shlomi Gridish <gridish@freescale.com>
  *               Jerry Huang <Chang-Ming.Huang@freescale.com>
  * Copyright (c) Logic Product Development, Inc. 2007
@@ -810,9 +810,11 @@ void fhci_queue_urb(struct fhci_hcd *fhci, struct urb *urb)
                ed->dev_addr = usb_pipedevice(urb->pipe);
                ed->max_pkt_size = usb_maxpacket(urb->dev, urb->pipe,
                        usb_pipeout(urb->pipe));
+               /* setup stage */
                td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, FHCI_TA_SETUP,
                        USB_TD_TOGGLE_DATA0, urb->setup_packet, 8, 0, 0, true);
 
+               /* data stage */
                if (data_len > 0) {
                        td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++,
                                usb_pipeout(urb->pipe) ? FHCI_TA_OUT :
@@ -820,9 +822,18 @@ void fhci_queue_urb(struct fhci_hcd *fhci, struct urb *urb)
                                USB_TD_TOGGLE_DATA1, data, data_len, 0, 0,
                                true);
                }
-               td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++,
-                       usb_pipeout(urb->pipe) ? FHCI_TA_IN : FHCI_TA_OUT,
-                       USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true);
+
+               /* status stage */
+               if (data_len > 0)
+                       td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++,
+                               (usb_pipeout(urb->pipe) ? FHCI_TA_IN :
+                                                         FHCI_TA_OUT),
+                               USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true);
+               else
+                        td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++,
+                               FHCI_TA_IN,
+                               USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true);
+
                urb_state = US_CTRL_SETUP;
                break;
        case FHCI_TF_ISO: