[PATCH 2/2] USB: pxa: Add USB client support for Marvell PXA9xx/PXA168 chips

Chao Xie cxie4 at marvell.com
Mon Nov 22 22:11:33 EST 2010


Hi
You are right. I have added source code to fix it. Patch is attached.

+static int mv_ep_set_halt_wedge(struct usb_ep *_ep, int halt, int wedge)
+{
+	struct mv_ep *ep;
+	unsigned long flags = 0;
+	int status = 0;
+	struct mv_udc *udc;
+
+	ep = container_of(_ep, struct mv_ep, ep);
+	udc = ep->udc;
+	if (!_ep || !ep->desc) {
+		status = -EINVAL;
+		goto out;
+	}
+
+	if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) {
+		status = -EOPNOTSUPP;
+		goto out;
+	}
+
+	/* Attempt to halt IN ep will fail if any transfer requests
+	 * are still queue */
+	if (halt && (ep_dir(ep) == EP_DIR_IN) && !list_empty(&ep->queue)) {
+		status = -EAGAIN;
+		goto out;
+	}
+
+	spin_lock_irqsave(&ep->udc->lock, flags);
+	ep_set_stall(udc, ep->ep_num, ep_dir(ep), halt);
+	if (halt && wedge)
+		ep->wedge = 1;
+	else if (!halt)
+		ep->wedge = 0;
+	spin_unlock_irqrestore(&ep->udc->lock, flags);
+
+	if (ep->ep_num == 0) {
+		udc->ep0_state = WAIT_FOR_SETUP;
+		udc->ep0_dir = EP_DIR_OUT;
+	}
+out:
+	return status;
+}
+
+static int mv_ep_set_halt(struct usb_ep *_ep, int halt)
+{
+	return mv_ep_set_halt_wedge(_ep, halt, 0);
+}
+
+static int mv_ep_set_wedge(struct usb_ep *_ep)
+{
+	return mv_ep_set_halt_wedge(_ep, 1, 1);
+}

...
+
+	.set_wedge	= mv_ep_set_wedge,
+	.set_halt	= mv_ep_set_halt,
...
	case USB_ENDPOINT_HALT:
+			ep_num = setup->wIndex & USB_ENDPOINT_NUMBER_MASK;
+			direction = (setup->wIndex & USB_ENDPOINT_DIR_MASK)
+				? EP_DIR_IN : EP_DIR_OUT;
+			if (setup->wValue != 0 || setup->wLength != 0
+				|| ep_num > udc->max_eps)
+				goto out;
+			ep = &udc->eps[ep_num * 2 + direction];
+			if (ep->wedge == 1)
+				break;
+			spin_unlock(&udc->lock);
+			ep_set_stall(udc, ep_num, direction, 0);
+			spin_lock(&udc->lock);
+			break;

-----Original Message-----
From: Alan Stern [mailto:stern at rowland.harvard.edu] 
Sent: Monday, November 22, 2010 11:22 PM
To: Chao Xie
Cc: gregkh at suse.de; linux-usb at vger.kernel.org; linux-arm-kernel at lists.infradead.org; eric.y.miao at gmail.com; Chao Xie
Subject: Re: [PATCH 2/2] USB: pxa: Add USB client support for Marvell PXA9xx/PXA168 chips

On Mon, 22 Nov 2010 chao.xie at marvell.com wrote:

> From: cxie4 <cxie4 at marvell.com>
> 
> This patch add USB client support Marvell PXA9xx/PXA168 chips. The USB
> controller in PXA9xx/PXA168 is a High-Speed OTG controller. The available
> endpoints is different between PXA9xx and PXA168.
> 
> NOTE:
> It is the first version of Marvell PXA9xx/PXA168 USB controller driver.
> The support for OTG mode will be added in later patch.
> PXA9xx and PXA168 has integrated UTMI PHY in the chips. The initialization
> for the PHY is a little different between PXA9xx and PXA168.

...

> +static struct usb_ep_ops mv_ep_ops = {
> +	.enable		= mv_ep_enable,
> +	.disable	= mv_ep_disable,
> +
> +	.alloc_request	= mv_alloc_request,
> +	.free_request	= mv_free_request,
> +
> +	.queue		= mv_ep_queue,
> +	.dequeue	= mv_ep_dequeue,
> +
> +	.set_halt	= mv_ep_set_halt,
> +	.fifo_flush	= mv_ep_fifo_flush,	/* flush fifo */
> +};

What happened to the .set_wedge method?

Alan Stern

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-USB-pxa-Add-USB-client-support-for-Marvell-PXA9xx-PX.patch
Type: application/octet-stream
Size: 72344 bytes
Desc: 0002-USB-pxa-Add-USB-client-support-for-Marvell-PXA9xx-PX.patch
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20101122/b8b5e2a8/attachment-0001.obj>


More information about the linux-arm-kernel mailing list