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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
55b5a624a0
commit
273d23574f
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Freescale QUICC Engine USB Host Controller Driver
|
* 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>
|
* Shlomi Gridish <gridish@freescale.com>
|
||||||
* Jerry Huang <Chang-Ming.Huang@freescale.com>
|
* Jerry Huang <Chang-Ming.Huang@freescale.com>
|
||||||
* Copyright (c) Logic Product Development, Inc. 2007
|
* 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->dev_addr = usb_pipedevice(urb->pipe);
|
||||||
ed->max_pkt_size = usb_maxpacket(urb->dev, urb->pipe,
|
ed->max_pkt_size = usb_maxpacket(urb->dev, urb->pipe,
|
||||||
usb_pipeout(urb->pipe));
|
usb_pipeout(urb->pipe));
|
||||||
|
/* setup stage */
|
||||||
td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, FHCI_TA_SETUP,
|
td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++, FHCI_TA_SETUP,
|
||||||
USB_TD_TOGGLE_DATA0, urb->setup_packet, 8, 0, 0, true);
|
USB_TD_TOGGLE_DATA0, urb->setup_packet, 8, 0, 0, true);
|
||||||
|
|
||||||
|
/* data stage */
|
||||||
if (data_len > 0) {
|
if (data_len > 0) {
|
||||||
td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++,
|
td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++,
|
||||||
usb_pipeout(urb->pipe) ? FHCI_TA_OUT :
|
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,
|
USB_TD_TOGGLE_DATA1, data, data_len, 0, 0,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
td = fhci_td_fill(fhci, urb, urb_priv, ed, cnt++,
|
|
||||||
usb_pipeout(urb->pipe) ? FHCI_TA_IN : FHCI_TA_OUT,
|
/* status stage */
|
||||||
USB_TD_TOGGLE_DATA1, data, 0, 0, 0, true);
|
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;
|
urb_state = US_CTRL_SETUP;
|
||||||
break;
|
break;
|
||||||
case FHCI_TF_ISO:
|
case FHCI_TF_ISO:
|
||||||
|
Reference in New Issue
Block a user