Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 273d2357 authored by Jerry Huang's avatar Jerry Huang Committed by Greg Kroah-Hartman
Browse files

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: default avatarJerry Huang <r66093@freescale.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 55b5a624
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
/*
 * 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);
		}

		/* 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_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: