提交 988199fe 编写于 作者: D David Brownell 提交者: Greg Kroah-Hartman

[PATCH] USB: goku_udc updates (sparse, SETUP api change)

Sparse updates; and the API change for SETUP packets being in USB byteorder.
Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 320f3459
...@@ -70,7 +70,7 @@ MODULE_LICENSE("GPL"); ...@@ -70,7 +70,7 @@ MODULE_LICENSE("GPL");
* seem to behave quite as expected. Used by default. * seem to behave quite as expected. Used by default.
* *
* OUT dma documents design problems handling the common "short packet" * OUT dma documents design problems handling the common "short packet"
* transfer termination policy; it couldn't enabled by default, even * transfer termination policy; it couldn't be enabled by default, even
* if the OUT-dma abort problems had a resolution. * if the OUT-dma abort problems had a resolution.
*/ */
static unsigned use_dma = 1; static unsigned use_dma = 1;
...@@ -313,7 +313,7 @@ goku_free_request(struct usb_ep *_ep, struct usb_request *_req) ...@@ -313,7 +313,7 @@ goku_free_request(struct usb_ep *_ep, struct usb_request *_req)
#if defined(CONFIG_X86) #if defined(CONFIG_X86)
#define USE_KMALLOC #define USE_KMALLOC
#elif defined(CONFIG_MIPS) && !defined(CONFIG_NONCOHERENT_IO) #elif defined(CONFIG_MIPS) && !defined(CONFIG_DMA_NONCOHERENT)
#define USE_KMALLOC #define USE_KMALLOC
#elif defined(CONFIG_PPC) && !defined(CONFIG_NOT_COHERENT_CACHE) #elif defined(CONFIG_PPC) && !defined(CONFIG_NOT_COHERENT_CACHE)
...@@ -1524,9 +1524,12 @@ static void ep0_setup(struct goku_udc *dev) ...@@ -1524,9 +1524,12 @@ static void ep0_setup(struct goku_udc *dev)
/* read SETUP packet and enter DATA stage */ /* read SETUP packet and enter DATA stage */
ctrl.bRequestType = readl(&regs->bRequestType); ctrl.bRequestType = readl(&regs->bRequestType);
ctrl.bRequest = readl(&regs->bRequest); ctrl.bRequest = readl(&regs->bRequest);
ctrl.wValue = (readl(&regs->wValueH) << 8) | readl(&regs->wValueL); ctrl.wValue = cpu_to_le16((readl(&regs->wValueH) << 8)
ctrl.wIndex = (readl(&regs->wIndexH) << 8) | readl(&regs->wIndexL); | readl(&regs->wValueL));
ctrl.wLength = (readl(&regs->wLengthH) << 8) | readl(&regs->wLengthL); ctrl.wIndex = cpu_to_le16((readl(&regs->wIndexH) << 8)
| readl(&regs->wIndexL));
ctrl.wLength = cpu_to_le16((readl(&regs->wLengthH) << 8)
| readl(&regs->wLengthL));
writel(0, &regs->SetupRecv); writel(0, &regs->SetupRecv);
nuke(&dev->ep[0], 0); nuke(&dev->ep[0], 0);
...@@ -1548,18 +1551,20 @@ static void ep0_setup(struct goku_udc *dev) ...@@ -1548,18 +1551,20 @@ static void ep0_setup(struct goku_udc *dev)
case USB_REQ_CLEAR_FEATURE: case USB_REQ_CLEAR_FEATURE:
switch (ctrl.bRequestType) { switch (ctrl.bRequestType) {
case USB_RECIP_ENDPOINT: case USB_RECIP_ENDPOINT:
tmp = ctrl.wIndex & 0x0f; tmp = le16_to_cpu(ctrl.wIndex) & 0x0f;
/* active endpoint */ /* active endpoint */
if (tmp > 3 || (!dev->ep[tmp].desc && tmp != 0)) if (tmp > 3 || (!dev->ep[tmp].desc && tmp != 0))
goto stall; goto stall;
if (ctrl.wIndex & USB_DIR_IN) { if (ctrl.wIndex & __constant_cpu_to_le16(
USB_DIR_IN)) {
if (!dev->ep[tmp].is_in) if (!dev->ep[tmp].is_in)
goto stall; goto stall;
} else { } else {
if (dev->ep[tmp].is_in) if (dev->ep[tmp].is_in)
goto stall; goto stall;
} }
if (ctrl.wValue != USB_ENDPOINT_HALT) if (ctrl.wValue != __constant_cpu_to_le16(
USB_ENDPOINT_HALT))
goto stall; goto stall;
if (tmp) if (tmp)
goku_clear_halt(&dev->ep[tmp]); goku_clear_halt(&dev->ep[tmp]);
...@@ -1571,7 +1576,7 @@ static void ep0_setup(struct goku_udc *dev) ...@@ -1571,7 +1576,7 @@ static void ep0_setup(struct goku_udc *dev)
return; return;
case USB_RECIP_DEVICE: case USB_RECIP_DEVICE:
/* device remote wakeup: always clear */ /* device remote wakeup: always clear */
if (ctrl.wValue != 1) if (ctrl.wValue != __constant_cpu_to_le16(1))
goto stall; goto stall;
VDBG(dev, "clear dev remote wakeup\n"); VDBG(dev, "clear dev remote wakeup\n");
goto succeed; goto succeed;
...@@ -1589,14 +1594,15 @@ static void ep0_setup(struct goku_udc *dev) ...@@ -1589,14 +1594,15 @@ static void ep0_setup(struct goku_udc *dev)
#ifdef USB_TRACE #ifdef USB_TRACE
VDBG(dev, "SETUP %02x.%02x v%04x i%04x l%04x\n", VDBG(dev, "SETUP %02x.%02x v%04x i%04x l%04x\n",
ctrl.bRequestType, ctrl.bRequest, ctrl.bRequestType, ctrl.bRequest,
ctrl.wValue, ctrl.wIndex, ctrl.wLength); le16_to_cpu(ctrl.wValue), le16_to_cpu(ctrl.wIndex),
le16_to_cpu(ctrl.wLength));
#endif #endif
/* hw wants to know when we're configured (or not) */ /* hw wants to know when we're configured (or not) */
dev->req_config = (ctrl.bRequest == USB_REQ_SET_CONFIGURATION dev->req_config = (ctrl.bRequest == USB_REQ_SET_CONFIGURATION
&& ctrl.bRequestType == USB_RECIP_DEVICE); && ctrl.bRequestType == USB_RECIP_DEVICE);
if (unlikely(dev->req_config)) if (unlikely(dev->req_config))
dev->configured = (ctrl.wValue != 0); dev->configured = (ctrl.wValue != __constant_cpu_to_le16(0));
/* delegate everything to the gadget driver. /* delegate everything to the gadget driver.
* it may respond after this irq handler returns. * it may respond after this irq handler returns.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册