The xhci driver allows some command ring entries to be 'reserved' so
that some requests won't fail because the command ring is full.

However queue_command() would never allow the last few ring entries to
be used even if the caller indicated that it could use a reserved slot.

If 'command_must_succeed' is set, only check that a single entry is
available.

Note that entries are not dynamically reserved and then consumed later.
Initially one entry is reserved, later another is reserved for each active
stream.

Signed-off-by: David Laight <david.lai...@aculab.com>
---
 drivers/usb/host/xhci-ring.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 53c2e29..c021708 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -4018,23 +4018,20 @@ int xhci_queue_isoc_tx_prepare(struct xhci_hcd *xhci, 
gfp_t mem_flags,
 
 /* Generic function for queueing a command TRB on the command ring.
  * Check to make sure there's room on the command ring for one command TRB.
- * Also check that there's room reserved for commands that must not fail.
- * If this is a command that must not fail, meaning command_must_succeed = 
TRUE,
- * then only check for the number of reserved spots.
- * Don't decrement xhci->cmd_ring_reserved_trbs after we've queued the TRB
- * because the command event handler may want to resubmit a failed command.
+ * If this isn't one of the commands that can use a reserved slot then ensure
+ * that there are enough slots for all the reserved commands to be started.
  */
 static int queue_command(struct xhci_hcd *xhci, u32 field1, u32 field2,
                u32 field3, u32 field4, bool command_must_succeed)
 {
-       int reserved_trbs = xhci->cmd_ring_reserved_trbs;
+       int trbs_needed = 1;
        int ret;
 
        if (!command_must_succeed)
-               reserved_trbs++;
+               trbs_needed += xhci->cmd_ring_reserved_trbs;
 
        ret = prepare_ring(xhci, xhci->cmd_ring, EP_STATE_RUNNING,
-                       reserved_trbs, GFP_ATOMIC);
+                       trbs_needed, GFP_ATOMIC);
        if (ret < 0) {
                xhci_err(xhci, "ERR: No room for command on command ring\n");
                if (command_must_succeed)
-- 
1.8.1.2



--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to