Commit 85a975d0 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

UHCI: no dummy TDs for Iso QHs

Isochronous queues don't need a dummy TD because the Queue Header
isn't managed by the hardware.  This patch (as836) removes the
unnecessary dummy TDs.

The patch also fixes a long-standing typo in a comment (a "don't" was
missing -- potentially very confusing!).
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent f3fe239b
...@@ -208,7 +208,7 @@ static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space) ...@@ -208,7 +208,7 @@ static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space)
space, "", nurbs); space, "", nurbs);
} }
if (qh->udev) { if (qh->dummy_td) {
out += sprintf(out, "%*s Dummy TD\n", space, ""); out += sprintf(out, "%*s Dummy TD\n", space, "");
out += uhci_show_td(qh->dummy_td, out, len - (out - buf), 0); out += uhci_show_td(qh->dummy_td, out, len - (out - buf), 0);
} }
......
...@@ -248,16 +248,18 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, ...@@ -248,16 +248,18 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci,
INIT_LIST_HEAD(&qh->node); INIT_LIST_HEAD(&qh->node);
if (udev) { /* Normal QH */ if (udev) { /* Normal QH */
qh->dummy_td = uhci_alloc_td(uhci); qh->type = hep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
if (!qh->dummy_td) { if (qh->type != USB_ENDPOINT_XFER_ISOC) {
dma_pool_free(uhci->qh_pool, qh, dma_handle); qh->dummy_td = uhci_alloc_td(uhci);
return NULL; if (!qh->dummy_td) {
dma_pool_free(uhci->qh_pool, qh, dma_handle);
return NULL;
}
} }
qh->state = QH_STATE_IDLE; qh->state = QH_STATE_IDLE;
qh->hep = hep; qh->hep = hep;
qh->udev = udev; qh->udev = udev;
hep->hcpriv = qh; hep->hcpriv = qh;
qh->type = hep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
} else { /* Skeleton QH */ } else { /* Skeleton QH */
qh->state = QH_STATE_ACTIVE; qh->state = QH_STATE_ACTIVE;
...@@ -275,7 +277,8 @@ static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh) ...@@ -275,7 +277,8 @@ static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
list_del(&qh->node); list_del(&qh->node);
if (qh->udev) { if (qh->udev) {
qh->hep->hcpriv = NULL; qh->hep->hcpriv = NULL;
uhci_free_td(uhci, qh->dummy_td); if (qh->dummy_td)
uhci_free_td(uhci, qh->dummy_td);
} }
dma_pool_free(uhci->qh_pool, qh, qh->dma_handle); dma_pool_free(uhci->qh_pool, qh, qh->dma_handle);
} }
...@@ -327,7 +330,7 @@ static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh, ...@@ -327,7 +330,7 @@ static int uhci_cleanup_queue(struct uhci_hcd *uhci, struct uhci_qh *qh,
goto done; goto done;
qh->element = UHCI_PTR_TERM; qh->element = UHCI_PTR_TERM;
/* Control pipes have to worry about toggles */ /* Control pipes don't have to worry about toggles */
if (qh->type == USB_ENDPOINT_XFER_CONTROL) if (qh->type == USB_ENDPOINT_XFER_CONTROL)
goto done; goto done;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment