Commit 46034dca authored by Sergei Shtylyov's avatar Sergei Shtylyov Committed by Greg Kroah-Hartman

USB: musb_gadget_ep0: stop abusing musb_gadget_set_halt()

Stop playing with musb->lock and abusing musb_gadget_set_halt() in
the code clearing the endpoint halt feature -- instead, manipulate
the registers directly.

While at it, get rid uf unneeded line breaks and over-indentation in
the code setting the endpoint halt feature.
Signed-off-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 47e97605
...@@ -105,6 +105,4 @@ extern void musb_gadget_cleanup(struct musb *); ...@@ -105,6 +105,4 @@ extern void musb_gadget_cleanup(struct musb *);
extern void musb_g_giveback(struct musb_ep *, struct usb_request *, int); extern void musb_g_giveback(struct musb_ep *, struct usb_request *, int);
extern int musb_gadget_set_halt(struct usb_ep *ep, int value);
#endif /* __MUSB_GADGET_H */ #endif /* __MUSB_GADGET_H */
...@@ -257,19 +257,25 @@ __acquires(musb->lock) ...@@ -257,19 +257,25 @@ __acquires(musb->lock)
case USB_RECIP_INTERFACE: case USB_RECIP_INTERFACE:
break; break;
case USB_RECIP_ENDPOINT:{ case USB_RECIP_ENDPOINT:{
const u8 num = ctrlrequest->wIndex & 0x0f; const u8 epnum =
struct musb_ep *musb_ep; ctrlrequest->wIndex & 0x0f;
struct musb_ep *musb_ep;
struct musb_hw_ep *ep;
void __iomem *regs;
int is_in;
u16 csr;
if (num == 0 if (epnum == 0 || epnum >= MUSB_C_NUM_EPS ||
|| num >= MUSB_C_NUM_EPS ctrlrequest->wValue != USB_ENDPOINT_HALT)
|| ctrlrequest->wValue
!= USB_ENDPOINT_HALT)
break; break;
if (ctrlrequest->wIndex & USB_DIR_IN) ep = musb->endpoints + epnum;
musb_ep = &musb->endpoints[num].ep_in; regs = ep->regs;
is_in = ctrlrequest->wIndex & USB_DIR_IN;
if (is_in)
musb_ep = &ep->ep_in;
else else
musb_ep = &musb->endpoints[num].ep_out; musb_ep = &ep->ep_out;
if (!musb_ep->desc) if (!musb_ep->desc)
break; break;
...@@ -278,10 +284,23 @@ __acquires(musb->lock) ...@@ -278,10 +284,23 @@ __acquires(musb->lock)
if (musb_ep->wedged) if (musb_ep->wedged)
break; break;
/* REVISIT do it directly, no locking games */ musb_ep_select(mbase, epnum);
spin_unlock(&musb->lock); if (is_in) {
musb_gadget_set_halt(&musb_ep->end_point, 0); csr = musb_readw(regs, MUSB_TXCSR);
spin_lock(&musb->lock); 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 */ /* select ep0 again */
musb_ep_select(mbase, 0); musb_ep_select(mbase, 0);
...@@ -377,10 +396,8 @@ __acquires(musb->lock) ...@@ -377,10 +396,8 @@ __acquires(musb->lock)
int is_in; int is_in;
u16 csr; u16 csr;
if (epnum == 0 if (epnum == 0 || epnum >= MUSB_C_NUM_EPS ||
|| epnum >= MUSB_C_NUM_EPS ctrlrequest->wValue != USB_ENDPOINT_HALT)
|| ctrlrequest->wValue
!= USB_ENDPOINT_HALT)
break; break;
ep = musb->endpoints + epnum; ep = musb->endpoints + epnum;
...@@ -395,24 +412,20 @@ __acquires(musb->lock) ...@@ -395,24 +412,20 @@ __acquires(musb->lock)
musb_ep_select(mbase, epnum); musb_ep_select(mbase, epnum);
if (is_in) { if (is_in) {
csr = musb_readw(regs, csr = musb_readw(regs, MUSB_TXCSR);
MUSB_TXCSR);
if (csr & MUSB_TXCSR_FIFONOTEMPTY) if (csr & MUSB_TXCSR_FIFONOTEMPTY)
csr |= MUSB_TXCSR_FLUSHFIFO; csr |= MUSB_TXCSR_FLUSHFIFO;
csr |= MUSB_TXCSR_P_SENDSTALL csr |= MUSB_TXCSR_P_SENDSTALL
| MUSB_TXCSR_CLRDATATOG | MUSB_TXCSR_CLRDATATOG
| MUSB_TXCSR_P_WZC_BITS; | MUSB_TXCSR_P_WZC_BITS;
musb_writew(regs, MUSB_TXCSR, musb_writew(regs, MUSB_TXCSR, csr);
csr);
} else { } else {
csr = musb_readw(regs, csr = musb_readw(regs, MUSB_RXCSR);
MUSB_RXCSR);
csr |= MUSB_RXCSR_P_SENDSTALL csr |= MUSB_RXCSR_P_SENDSTALL
| MUSB_RXCSR_FLUSHFIFO | MUSB_RXCSR_FLUSHFIFO
| MUSB_RXCSR_CLRDATATOG | MUSB_RXCSR_CLRDATATOG
| MUSB_RXCSR_P_WZC_BITS; | MUSB_RXCSR_P_WZC_BITS;
musb_writew(regs, MUSB_RXCSR, musb_writew(regs, MUSB_RXCSR, csr);
csr);
} }
/* select ep0 again */ /* select ep0 again */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment