--- zzzz-none-000/linux-2.6.39.4/drivers/usb/musb/musb_gadget_ep0.c 2011-08-03 19:43:28.000000000 +0000 +++ puma6-arm-6490-729/linux-2.6.39.4/drivers/usb/musb/musb_gadget_ep0.c 2021-11-10 13:23:10.000000000 +0000 @@ -109,8 +109,11 @@ struct musb_ep *ep; u16 tmp; void __iomem *regs; - +#ifdef CONFIG_MACH_PUMA5 + epnum = (u8) le16_to_cpu(ctrlrequest->wIndex); +#else epnum = (u8) ctrlrequest->wIndex; +#endif if (!epnum) { result[0] = 0; break; @@ -241,15 +244,24 @@ case USB_REQ_SET_ADDRESS: /* change it after the status stage */ musb->set_address = true; +#ifdef CONFIG_MACH_PUMA5 + musb->address = (u8) (le16_to_cpu(ctrlrequest->wValue) & 0x7f); +#else musb->address = (u8) (ctrlrequest->wValue & 0x7f); +#endif handled = 1; break; case USB_REQ_CLEAR_FEATURE: switch (recip) { case USB_RECIP_DEVICE: +#ifdef CONFIG_MACH_PUMA5 + if (le16_to_cpu(ctrlrequest->wValue) + != USB_DEVICE_REMOTE_WAKEUP) +#else if (ctrlrequest->wValue != USB_DEVICE_REMOTE_WAKEUP) +#endif break; musb->may_wakeup = 0; handled = 1; @@ -257,61 +269,34 @@ case USB_RECIP_INTERFACE: break; case USB_RECIP_ENDPOINT:{ - const u8 epnum = - ctrlrequest->wIndex & 0x0f; +#ifdef CONFIG_MACH_PUMA5 + const u8 epnum = le16_to_cpu(ctrlrequest->wIndex) & 0x0f; +#else + const u8 epnum = ctrlrequest->wIndex & 0x0f; +#endif struct musb_ep *musb_ep; - struct musb_hw_ep *ep; - struct musb_request *request; - void __iomem *regs; - int is_in; - u16 csr; - if (epnum == 0 || epnum >= MUSB_C_NUM_EPS || - ctrlrequest->wValue != USB_ENDPOINT_HALT) + if (epnum == 0 + || epnum >= MUSB_C_NUM_EPS + || le16_to_cpu(ctrlrequest->wValue) + != USB_ENDPOINT_HALT) break; - ep = musb->endpoints + epnum; - regs = ep->regs; - is_in = ctrlrequest->wIndex & USB_DIR_IN; - if (is_in) - musb_ep = &ep->ep_in; + if (le16_to_cpu(ctrlrequest->wIndex) & USB_DIR_IN) + musb_ep = &musb->endpoints[epnum].ep_in; else - musb_ep = &ep->ep_out; + musb_ep = &musb->endpoints[epnum].ep_out; if (!musb_ep->desc) break; - handled = 1; - /* Ignore request if endpoint is wedged */ - if (musb_ep->wedged) - break; - - musb_ep_select(mbase, epnum); - if (is_in) { - csr = musb_readw(regs, MUSB_TXCSR); - csr |= MUSB_TXCSR_CLRDATATOG | - MUSB_TXCSR_P_WZC_BITS; - csr &= ~(MUSB_TXCSR_P_SENDSTALL | - MUSB_TXCSR_P_SENTSTALL | - MUSB_TXCSR_TXPKTRDY); - musb_writew(regs, MUSB_TXCSR, csr); - } else { - csr = musb_readw(regs, MUSB_RXCSR); - csr |= MUSB_RXCSR_CLRDATATOG | - MUSB_RXCSR_P_WZC_BITS; - csr &= ~(MUSB_RXCSR_P_SENDSTALL | - MUSB_RXCSR_P_SENTSTALL); - musb_writew(regs, MUSB_RXCSR, csr); - } - - /* Maybe start the first request in the queue */ - request = next_request(musb_ep); - if (!musb_ep->busy && request) { - DBG(3, "restarting the request\n"); - musb_ep_restart(musb, request); - } + /* REVISIT do it directly, no locking games */ + spin_unlock(&musb->lock); + musb_gadget_set_halt(&musb_ep->end_point, 0); + spin_lock(&musb->lock); /* select ep0 again */ musb_ep_select(mbase, 0); + handled = 1; } break; default: /* class, vendor, etc ... delegate */ @@ -324,17 +309,17 @@ switch (recip) { case USB_RECIP_DEVICE: handled = 1; - switch (ctrlrequest->wValue) { + switch (le16_to_cpu(ctrlrequest->wValue)) { case USB_DEVICE_REMOTE_WAKEUP: musb->may_wakeup = 1; break; case USB_DEVICE_TEST_MODE: if (musb->g.speed != USB_SPEED_HIGH) goto stall; - if (ctrlrequest->wIndex & 0xff) + if (le16_to_cpu(ctrlrequest->wIndex) & 0xff) goto stall; - switch (ctrlrequest->wIndex >> 8) { + switch (le16_to_cpu(ctrlrequest->wIndex) >> 8) { case 1: pr_debug("TEST_J\n"); /* TEST_J */ @@ -359,31 +344,6 @@ musb->test_mode_nr = MUSB_TEST_PACKET; break; - - case 0xc0: - /* TEST_FORCE_HS */ - pr_debug("TEST_FORCE_HS\n"); - musb->test_mode_nr = - MUSB_TEST_FORCE_HS; - break; - case 0xc1: - /* TEST_FORCE_FS */ - pr_debug("TEST_FORCE_FS\n"); - musb->test_mode_nr = - MUSB_TEST_FORCE_FS; - break; - case 0xc2: - /* TEST_FIFO_ACCESS */ - pr_debug("TEST_FIFO_ACCESS\n"); - musb->test_mode_nr = - MUSB_TEST_FIFO_ACCESS; - break; - case 0xc3: - /* TEST_FORCE_HOST */ - pr_debug("TEST_FORCE_HOST\n"); - musb->test_mode_nr = - MUSB_TEST_FORCE_HOST; - break; default: goto stall; } @@ -410,9 +370,6 @@ musb->g.a_alt_hnp_support = 1; break; #endif - case USB_DEVICE_DEBUG_MODE: - handled = 0; - break; stall: default: handled = -EINVAL; @@ -425,20 +382,22 @@ case USB_RECIP_ENDPOINT:{ const u8 epnum = - ctrlrequest->wIndex & 0x0f; + le16_to_cpu(ctrlrequest->wIndex) & 0x0f; struct musb_ep *musb_ep; struct musb_hw_ep *ep; void __iomem *regs; int is_in; u16 csr; - if (epnum == 0 || epnum >= MUSB_C_NUM_EPS || - ctrlrequest->wValue != USB_ENDPOINT_HALT) + if (epnum == 0 + || epnum >= MUSB_C_NUM_EPS + || le16_to_cpu(ctrlrequest->wValue) + != USB_ENDPOINT_HALT) break; ep = musb->endpoints + epnum; regs = ep->regs; - is_in = ctrlrequest->wIndex & USB_DIR_IN; + is_in = le16_to_cpu(ctrlrequest->wIndex) & USB_DIR_IN; if (is_in) musb_ep = &ep->ep_in; else @@ -448,20 +407,24 @@ musb_ep_select(mbase, epnum); if (is_in) { - csr = musb_readw(regs, MUSB_TXCSR); + csr = musb_readw(regs, + MUSB_TXCSR); if (csr & MUSB_TXCSR_FIFONOTEMPTY) csr |= MUSB_TXCSR_FLUSHFIFO; csr |= MUSB_TXCSR_P_SENDSTALL | MUSB_TXCSR_CLRDATATOG | MUSB_TXCSR_P_WZC_BITS; - musb_writew(regs, MUSB_TXCSR, csr); + musb_writew(regs, MUSB_TXCSR, + csr); } else { - csr = musb_readw(regs, MUSB_RXCSR); + csr = musb_readw(regs, + MUSB_RXCSR); csr |= MUSB_RXCSR_P_SENDSTALL | MUSB_RXCSR_FLUSHFIFO | MUSB_RXCSR_CLRDATATOG - | MUSB_RXCSR_P_WZC_BITS; - musb_writew(regs, MUSB_RXCSR, csr); + | MUSB_TXCSR_P_WZC_BITS; + musb_writew(regs, MUSB_RXCSR, + csr); } /* select ep0 again */ @@ -563,13 +526,13 @@ fifo_src = (u8 *) request->buf + request->actual; fifo_count = min((unsigned) MUSB_EP0_FIFOSIZE, request->length - request->actual); + if (fifo_count > 0) musb_write_fifo(&musb->endpoints[0], fifo_count, fifo_src); request->actual += fifo_count; /* update the flags */ - if (fifo_count < MUSB_MAX_END0_PACKET - || (request->actual == request->length - && !request->zero)) { + if (!request->zero && (fifo_count < MUSB_MAX_END0_PACKET + || request->actual == request->length)) { musb->ep0_state = MUSB_EP0_STAGE_STATUSOUT; csr |= MUSB_CSR0_P_DATAEND; } else