diff --git a/drivers/usb/gadget/function/f_qdss.c b/drivers/usb/gadget/function/f_qdss.c index 14f5449b791d..3908f5c750d2 100644 --- a/drivers/usb/gadget/function/f_qdss.c +++ b/drivers/usb/gadget/function/f_qdss.c @@ -901,16 +901,20 @@ void usb_qdss_close(struct usb_qdss_ch *ch) qdss_log("channel:%s\n", ch->name); qdss = ch->priv_usb; qdss->qdss_close = true; + spin_lock(&qdss->lock); while (!list_empty(&qdss->queued_data_pool)) { qreq = list_first_entry(&qdss->queued_data_pool, struct qdss_req, list); + spin_unlock(&qdss->lock); spin_unlock_irqrestore(&channel_lock, flags); qdss_log("dequeue req:%pK\n", qreq->usb_req); - usb_ep_dequeue(qdss->port.data, qreq->usb_req); - wait_for_completion(&qreq->write_done); + if (!usb_ep_dequeue(qdss->port.data, qreq->usb_req)) + wait_for_completion(&qreq->write_done); spin_lock_irqsave(&channel_lock, flags); + spin_lock(&qdss->lock); } + spin_unlock(&qdss->lock); spin_unlock_irqrestore(&channel_lock, flags); usb_qdss_free_req(ch); spin_lock_irqsave(&channel_lock, flags);