Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -105,6 +105,4 @@ extern void musb_gadget_cleanup(struct musb *);

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 */
+38 −25
Original line number Diff line number Diff line
@@ -257,19 +257,25 @@ __acquires(musb->lock)
			case USB_RECIP_INTERFACE:
				break;
			case USB_RECIP_ENDPOINT:{
				const u8 num = ctrlrequest->wIndex & 0x0f;
				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 @@ __acquires(musb->lock)
				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 @@ __acquires(musb->lock)

				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 */