Commit 0d2ada05 authored by Mark Tomlinson's avatar Mark Tomlinson Committed by Greg Kroah-Hartman
Browse files

usb: host: max3421-hcd: Correctly abort a USB request.



If the current USB request was aborted, the spi thread would not respond
to any further requests. This is because the "curr_urb" pointer would
not become NULL, so no further requests would be taken off the queue.
The solution here is to set the "urb_done" flag, as this will cause the
correct handling of the URB. Also clear interrupts that should only be
expected if an URB is in progress.

Fixes: 2d53139f ("Add support for using a MAX3421E chip as a host driver.")
Cc: stable <stable@kernel.org>
Signed-off-by: default avatarMark Tomlinson <mark.tomlinson@alliedtelesis.co.nz>
Link: https://lore.kernel.org/r/20241124221430.1106080-1-mark.tomlinson@alliedtelesis.co.nz


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 282615d1
Loading
Loading
Loading
Loading
+11 −5
Original line number Diff line number Diff line
@@ -779,6 +779,11 @@ max3421_check_unlink(struct usb_hcd *hcd)
				retval = 1;
				dev_dbg(&spi->dev, "%s: URB %p unlinked=%d",
					__func__, urb, urb->unlinked);
				if (urb == max3421_hcd->curr_urb) {
					max3421_hcd->urb_done = 1;
					max3421_hcd->hien &= ~(BIT(MAX3421_HI_HXFRDN_BIT) |
							       BIT(MAX3421_HI_RCVDAV_BIT));
				} else {
					usb_hcd_unlink_urb_from_ep(hcd, urb);
					spin_unlock_irqrestore(&max3421_hcd->lock,
							       flags);
@@ -787,6 +792,7 @@ max3421_check_unlink(struct usb_hcd *hcd)
				}
			}
		}
	}
	spin_unlock_irqrestore(&max3421_hcd->lock, flags);
	return retval;
}