Commit 273d23574f9dacd9c63c80e7d63639a669aad441
Committed by
Greg Kroah-Hartman
1 parent
55b5a624a0
Exists in
master
and in
6 other branches
QE/FHCI: fixed the CONTROL bug
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> Cc: stable <stable@vger.kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Showing 1 changed file with 15 additions and 4 deletions Side-by-side Diff
drivers/usb/host/fhci-sched.c
1 | 1 | /* |
2 | 2 | * Freescale QUICC Engine USB Host Controller Driver |
3 | 3 | * |
4 | - * Copyright (c) Freescale Semicondutor, Inc. 2006. | |
4 | + * Copyright (c) Freescale Semicondutor, Inc. 2006, 2011. | |
5 | 5 | * Shlomi Gridish <gridish@freescale.com> |
6 | 6 | * Jerry Huang <Chang-Ming.Huang@freescale.com> |
7 | 7 | * Copyright (c) Logic Product Development, Inc. 2007 |
8 | 8 | |
... | ... | @@ -810,9 +810,11 @@ |
810 | 810 | ed->dev_addr = usb_pipedevice(urb->pipe); |
811 | 811 | ed->max_pkt_size = usb_maxpacket(urb->dev, urb->pipe, |
812 | 812 | usb_pipeout(urb->pipe)); |
813 | + /* setup stage */ | |
813 | 814 | td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, FHCI_TA_SETUP, |
814 | 815 | USB_TD_TOGGLE_DATA0, urb->setup_packet, 8, 0, 0, true); |
815 | 816 | |
817 | + /* data stage */ | |
816 | 818 | if (data_len > 0) { |
817 | 819 | td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, |
818 | 820 | usb_pipeout(urb->pipe) ? FHCI_TA_OUT : |
... | ... | @@ -820,9 +822,18 @@ |
820 | 822 | USB_TD_TOGGLE_DATA1, data, data_len, 0, 0, |
821 | 823 | true); |
822 | 824 | } |
823 | - td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, | |
824 | - usb_pipeout(urb->pipe) ? FHCI_TA_IN : FHCI_TA_OUT, | |
825 | - USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true); | |
825 | + | |
826 | + /* status stage */ | |
827 | + if (data_len > 0) | |
828 | + td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, | |
829 | + (usb_pipeout(urb->pipe) ? FHCI_TA_IN : | |
830 | + FHCI_TA_OUT), | |
831 | + USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true); | |
832 | + else | |
833 | + td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, | |
834 | + FHCI_TA_IN, | |
835 | + USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true); | |
836 | + | |
826 | 837 | urb_state = US_CTRL_SETUP; |
827 | 838 | break; |
828 | 839 | case FHCI_TF_ISO: |