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

Commit bb1c9ef1 authored by David Brownell's avatar David Brownell Committed by Greg Kroah-Hartman
Browse files

USB: musb: host side diagnostics tweaks



Random host-side MUSB updates, mostly relating to better diagnostics:

 + Improve diagnostics on host side:
    - tx flush fifo:
       * Avoid hundreds of duplicate TX FIFONOTEMPTY messages
       * make "Can't flush TX fifo" a warning, and say which endpoint
    - giveback:
       * use correct status code
       * show completion function name not just URB pointer
    - Fix annoying "1 bytes" (should be "1 byte")

 + Be more consistent about failing init of unusable fifo_mode

It's not clear why that "can't flush TX fifo" message appears, though
it might relate to disconnection; I see it not infrequently

Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@nokia.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 71783e0d
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -1212,7 +1212,7 @@ static int __init ep_config_from_table(struct musb *musb)
		if (epn >= musb->config->num_eps) {
			pr_debug("%s: invalid ep %d\n",
					musb_driver_name, epn);
			continue;
			return -EINVAL;
		}
		offset = fifo_setup(musb, hw_ep + epn, cfg++, offset);
		if (offset < 0) {
@@ -1813,7 +1813,6 @@ allocate_instance(struct device *dev,
	for (epnum = 0, ep = musb->endpoints;
			epnum < musb->config->num_eps;
			epnum++, ep++) {

		ep->musb = musb;
		ep->epnum = epnum;
	}
+14 −9
Original line number Diff line number Diff line
@@ -112,18 +112,21 @@ static void musb_h_tx_flush_fifo(struct musb_hw_ep *ep)
{
	void __iomem	*epio = ep->regs;
	u16		csr;
	u16		lastcsr = 0;
	int		retries = 1000;

	csr = musb_readw(epio, MUSB_TXCSR);
	while (csr & MUSB_TXCSR_FIFONOTEMPTY) {
		DBG(5, "Host TX FIFONOTEMPTY csr: %02x\n", csr);
		if (csr != lastcsr)
			DBG(3, "Host TX FIFONOTEMPTY csr: %02x\n", csr);
		lastcsr = csr;
		csr |= MUSB_TXCSR_FLUSHFIFO;
		musb_writew(epio, MUSB_TXCSR, csr);
		csr = musb_readw(epio, MUSB_TXCSR);
		if (retries-- < 1) {
			ERR("Could not flush host TX fifo: csr: %04x\n", csr);
		if (WARN(retries-- < 1,
				"Could not flush host TX%d fifo: csr: %04x\n",
				ep->epnum, csr))
			return;
		}
		mdelay(1);
	}
}
@@ -268,7 +271,7 @@ __musb_giveback(struct musb *musb, struct urb *urb, int status)
__releases(musb->lock)
__acquires(musb->lock)
{
	DBG(({ int level; switch (urb->status) {
	DBG(({ int level; switch (status) {
				case 0:
					level = 4;
					break;
@@ -283,8 +286,8 @@ __acquires(musb->lock)
					level = 2;
					break;
				}; level; }),
			"complete %p (%d), dev%d ep%d%s, %d/%d\n",
			urb, urb->status,
			"complete %p %pF (%d), dev%d ep%d%s, %d/%d\n",
			urb, urb->complete, status,
			usb_pipedevice(urb->pipe),
			usb_pipeendpoint(urb->pipe),
			usb_pipein(urb->pipe) ? "in" : "out",
@@ -988,8 +991,10 @@ static bool musb_h_ep0_continue(struct musb *musb, u16 len, struct urb *urb)
		if (fifo_count) {
			fifo_dest = (u8 *) (urb->transfer_buffer
					+ urb->actual_length);
			DBG(3, "Sending %d bytes to %p\n",
					fifo_count, fifo_dest);
			DBG(3, "Sending %d byte%s to ep0 fifo %p\n",
					fifo_count,
					(fifo_count == 1) ? "" : "s",
					fifo_dest);
			musb_write_fifo(hw_ep, fifo_count, fifo_dest);

			urb->actual_length += fifo_count;