|
@@ -257,19 +257,25 @@ __acquires(musb->lock)
|
|
|
case USB_RECIP_INTERFACE:
|
|
|
break;
|
|
|
case USB_RECIP_ENDPOINT:{
|
|
|
- const u8 num = ctrlrequest->wIndex & 0x0f;
|
|
|
- struct musb_ep *musb_ep;
|
|
|
+ const u8 epnum =
|
|
|
+ ctrlrequest->wIndex & 0x0f;
|
|
|
+ struct musb_ep *musb_ep;
|
|
|
+ struct musb_hw_ep *ep;
|
|
|
+ void __iomem *regs;
|
|
|
+ int is_in;
|
|
|
+ u16 csr;
|
|
|
|
|
|
- if (num == 0
|
|
|
- || num >= MUSB_C_NUM_EPS
|
|
|
- || ctrlrequest->wValue
|
|
|
- != USB_ENDPOINT_HALT)
|
|
|
+ if (epnum == 0 || epnum >= MUSB_C_NUM_EPS ||
|
|
|
+ ctrlrequest->wValue != USB_ENDPOINT_HALT)
|
|
|
break;
|
|
|
|
|
|
- if (ctrlrequest->wIndex & USB_DIR_IN)
|
|
|
- musb_ep = &musb->endpoints[num].ep_in;
|
|
|
+ ep = musb->endpoints + epnum;
|
|
|
+ regs = ep->regs;
|
|
|
+ is_in = ctrlrequest->wIndex & USB_DIR_IN;
|
|
|
+ if (is_in)
|
|
|
+ musb_ep = &ep->ep_in;
|
|
|
else
|
|
|
- musb_ep = &musb->endpoints[num].ep_out;
|
|
|
+ musb_ep = &ep->ep_out;
|
|
|
if (!musb_ep->desc)
|
|
|
break;
|
|
|
|
|
@@ -278,10 +284,23 @@ __acquires(musb->lock)
|
|
|
if (musb_ep->wedged)
|
|
|
break;
|
|
|
|
|
|
- /* REVISIT do it directly, no locking games */
|
|
|
- spin_unlock(&musb->lock);
|
|
|
- musb_gadget_set_halt(&musb_ep->end_point, 0);
|
|
|
- spin_lock(&musb->lock);
|
|
|
+ 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);
|
|
|
+ }
|
|
|
|
|
|
/* select ep0 again */
|
|
|
musb_ep_select(mbase, 0);
|
|
@@ -377,10 +396,8 @@ stall:
|
|
|
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 ||
|
|
|
+ ctrlrequest->wValue != USB_ENDPOINT_HALT)
|
|
|
break;
|
|
|
|
|
|
ep = musb->endpoints + epnum;
|
|
@@ -395,24 +412,20 @@ stall:
|
|
|
|
|
|
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_writew(regs, MUSB_RXCSR, csr);
|
|
|
}
|
|
|
|
|
|
/* select ep0 again */
|