[PATCH v3 3/6] usb: musb: Introduce musb_qh_free() helper function
From: matwey . kornilov
Date: Tue Apr 21 2020 - 09:31:03 EST
From: "Matwey V. Kornilov" <matwey@xxxxxxxxxx>
Reduce the following similar snippets by using musb_qh_free().
qh->hep->hcpriv = NULL;
list_del(&qh->ring);
kfree(qh);
Signed-off-by: Matwey V. Kornilov <matwey@xxxxxxxxxx>
---
drivers/usb/musb/musb_host.c | 66 +++++++++++++++++-------------------
1 file changed, 32 insertions(+), 34 deletions(-)
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index af906f072cb3..28d6576b6d8d 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -85,6 +85,21 @@ static bool musb_qh_empty(struct musb_qh *qh)
return list_empty(&qh->hep->urb_list);
}
+static void musb_qh_unlink_hep(struct musb_qh *qh)
+{
+ if (!qh->hep)
+ return;
+
+ qh->hep->hcpriv = NULL;
+}
+
+static void musb_qh_free(struct musb_qh *qh)
+{
+ musb_qh_unlink_hep(qh);
+ list_del(&qh->ring);
+ kfree(qh);
+}
+
/*
* Clear TX fifo. Needed to avoid BABBLE errors.
*/
@@ -330,7 +345,7 @@ static void musb_advance_schedule(struct musb *musb, struct urb *urb,
* invalidate qh as soon as list_empty(&hep->urb_list)
*/
if (musb_qh_empty(qh)) {
- struct list_head *head;
+ struct list_head *head = NULL;
struct dma_controller *dma = musb->dma_controller;
if (is_in) {
@@ -349,34 +364,22 @@ static void musb_advance_schedule(struct musb *musb, struct urb *urb,
/* Clobber old pointers to this qh */
musb_ep_set_qh(ep, is_in, NULL);
- qh->hep->hcpriv = NULL;
- switch (qh->type) {
+ /* USB_ENDPOINT_XFER_CONTROL and USB_ENDPOINT_XFER_BULK: fifo
+ * policy for these lists, except that NAKing should rotate
+ * a qh to the end (for fairness).
+ * USB_ENDPOINT_XFER_ISOC and USB_ENDPOINT_XFER_INT: this is
+ * where periodic bandwidth should be de-allocated if it's
+ * tracked and allocated; and where we'd update the schedule
+ * tree...
+ */
+ if (qh->mux == 1
+ && (qh->type == USB_ENDPOINT_XFER_CONTROL || qh->type == USB_ENDPOINT_XFER_BULK))
+ head = qh->ring.prev;
- case USB_ENDPOINT_XFER_CONTROL:
- case USB_ENDPOINT_XFER_BULK:
- /* fifo policy for these lists, except that NAKing
- * should rotate a qh to the end (for fairness).
- */
- if (qh->mux == 1) {
- head = qh->ring.prev;
- list_del(&qh->ring);
- kfree(qh);
- qh = first_qh(head);
- break;
- }
- /* fall through */
+ musb_qh_free(qh);
- case USB_ENDPOINT_XFER_ISOC:
- case USB_ENDPOINT_XFER_INT:
- /* this is where periodic bandwidth should be
- * de-allocated if it's tracked and allocated;
- * and where we'd update the schedule tree...
- */
- kfree(qh);
- qh = NULL;
- break;
- }
+ qh = head ? first_qh(head) : NULL;
}
if (qh != NULL && qh->is_ready) {
@@ -2402,11 +2405,8 @@ static int musb_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
/* If nothing else (usually musb_giveback) is using it
* and its URB list has emptied, recycle this qh.
*/
- if (ready && musb_qh_empty(qh)) {
- qh->hep->hcpriv = NULL;
- list_del(&qh->ring);
- kfree(qh);
- }
+ if (ready && musb_qh_empty(qh))
+ musb_qh_free(qh);
} else
ret = musb_cleanup_urb(urb, qh);
done:
@@ -2460,9 +2460,7 @@ musb_h_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep)
while (!musb_qh_empty(qh))
musb_giveback(musb, next_urb(qh), -ESHUTDOWN);
- hep->hcpriv = NULL;
- list_del(&qh->ring);
- kfree(qh);
+ musb_qh_free(qh);
}
exit:
spin_unlock_irqrestore(&musb->lock, flags);
--
2.25.0