diff options
| author | Alan Stern <stern@rowland.harvard.edu> | 2006-05-05 16:26:58 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-21 18:04:10 -0400 |
| commit | 4de7d2c231a8624a47417977be0768c5b5257c4f (patch) | |
| tree | 3dba388c3c8e0673a5884c900f2b04339dc4708e | |
| parent | 2d61bde7a0e630e1906e6478b6b2a7aeaaa8f8da (diff) | |
[PATCH] USB: UHCI: store the endpoint type in the QH structure
This patch (as675) simplifies uhci-hcd slightly by storing each endpoint's
type in the corresponding Queue Header structure.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | drivers/usb/host/uhci-debug.c | 26 | ||||
| -rw-r--r-- | drivers/usb/host/uhci-hcd.h | 1 | ||||
| -rw-r--r-- | drivers/usb/host/uhci-q.c | 34 |
3 files changed, 38 insertions, 23 deletions
diff --git a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c index e1239319655c..28c1c51ec475 100644 --- a/drivers/usb/host/uhci-debug.c +++ b/drivers/usb/host/uhci-debug.c | |||
| @@ -98,6 +98,7 @@ static int uhci_show_urbp(struct urb_priv *urbp, char *buf, int len, int space) | |||
| 98 | char *out = buf; | 98 | char *out = buf; |
| 99 | struct uhci_td *td; | 99 | struct uhci_td *td; |
| 100 | int i, nactive, ninactive; | 100 | int i, nactive, ninactive; |
| 101 | char *ptype; | ||
| 101 | 102 | ||
| 102 | if (len < 200) | 103 | if (len < 200) |
| 103 | return 0; | 104 | return 0; |
| @@ -110,13 +111,14 @@ static int uhci_show_urbp(struct urb_priv *urbp, char *buf, int len, int space) | |||
| 110 | (usb_pipein(urbp->urb->pipe) ? "IN" : "OUT")); | 111 | (usb_pipein(urbp->urb->pipe) ? "IN" : "OUT")); |
| 111 | 112 | ||
| 112 | switch (usb_pipetype(urbp->urb->pipe)) { | 113 | switch (usb_pipetype(urbp->urb->pipe)) { |
| 113 | case PIPE_ISOCHRONOUS: out += sprintf(out, "ISO"); break; | 114 | case PIPE_ISOCHRONOUS: ptype = "ISO"; break; |
| 114 | case PIPE_INTERRUPT: out += sprintf(out, "INT"); break; | 115 | case PIPE_INTERRUPT: ptype = "INT"; break; |
| 115 | case PIPE_BULK: out += sprintf(out, "BLK"); break; | 116 | case PIPE_BULK: ptype = "BLK"; break; |
| 116 | case PIPE_CONTROL: out += sprintf(out, "CTL"); break; | 117 | default: |
| 118 | case PIPE_CONTROL: ptype = "CTL"; break; | ||
| 117 | } | 119 | } |
| 118 | 120 | ||
| 119 | out += sprintf(out, "%s", (urbp->fsbr ? " FSBR" : "")); | 121 | out += sprintf(out, "%s%s", ptype, (urbp->fsbr ? " FSBR" : "")); |
| 120 | 122 | ||
| 121 | if (urbp->urb->status != -EINPROGRESS) | 123 | if (urbp->urb->status != -EINPROGRESS) |
| 122 | out += sprintf(out, " Status=%d", urbp->urb->status); | 124 | out += sprintf(out, " Status=%d", urbp->urb->status); |
| @@ -147,13 +149,23 @@ static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space) | |||
| 147 | char *out = buf; | 149 | char *out = buf; |
| 148 | int i, nurbs; | 150 | int i, nurbs; |
| 149 | __le32 element = qh_element(qh); | 151 | __le32 element = qh_element(qh); |
| 152 | char *qtype; | ||
| 150 | 153 | ||
| 151 | /* Try to make sure there's enough memory */ | 154 | /* Try to make sure there's enough memory */ |
| 152 | if (len < 80 * 6) | 155 | if (len < 80 * 6) |
| 153 | return 0; | 156 | return 0; |
| 154 | 157 | ||
| 155 | out += sprintf(out, "%*s[%p] link (%08x) element (%08x)\n", space, "", | 158 | switch (qh->type) { |
| 156 | qh, le32_to_cpu(qh->link), le32_to_cpu(element)); | 159 | case USB_ENDPOINT_XFER_ISOC: qtype = "ISO"; break; |
| 160 | case USB_ENDPOINT_XFER_INT: qtype = "INT"; break; | ||
| 161 | case USB_ENDPOINT_XFER_BULK: qtype = "BLK"; break; | ||
| 162 | case USB_ENDPOINT_XFER_CONTROL: qtype = "CTL"; break; | ||
| 163 | default: qtype = "Skel" ; break; | ||
| 164 | } | ||
| 165 | |||
| 166 | out += sprintf(out, "%*s[%p] %s QH link (%08x) element (%08x)\n", | ||
| 167 | space, "", qh, qtype, | ||
| 168 | le32_to_cpu(qh->link), le32_to_cpu(element)); | ||
| 157 | 169 | ||
| 158 | if (element & UHCI_PTR_QH) | 170 | if (element & UHCI_PTR_QH) |
| 159 | out += sprintf(out, "%*s Element points to QH (bug?)\n", space, ""); | 171 | out += sprintf(out, "%*s Element points to QH (bug?)\n", space, ""); |
diff --git a/drivers/usb/host/uhci-hcd.h b/drivers/usb/host/uhci-hcd.h index d5c8f4d92823..8e5778650493 100644 --- a/drivers/usb/host/uhci-hcd.h +++ b/drivers/usb/host/uhci-hcd.h | |||
| @@ -132,6 +132,7 @@ struct uhci_qh { | |||
| 132 | 132 | ||
| 133 | unsigned int unlink_frame; /* When the QH was unlinked */ | 133 | unsigned int unlink_frame; /* When the QH was unlinked */ |
| 134 | int state; /* QH_STATE_xxx; see above */ | 134 | int state; /* QH_STATE_xxx; see above */ |
| 135 | int type; /* Queue type (control, bulk, etc) */ | ||
| 135 | 136 | ||
| 136 | unsigned int initial_toggle:1; /* Endpoint's current toggle value */ | 137 | unsigned int initial_toggle:1; /* Endpoint's current toggle value */ |
| 137 | unsigned int needs_fixup:1; /* Must fix the TD toggle values */ | 138 | unsigned int needs_fixup:1; /* Must fix the TD toggle values */ |
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index a06d84c19e13..8639e9035931 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c | |||
| @@ -179,10 +179,12 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci, | |||
| 179 | qh->hep = hep; | 179 | qh->hep = hep; |
| 180 | qh->udev = udev; | 180 | qh->udev = udev; |
| 181 | hep->hcpriv = qh; | 181 | hep->hcpriv = qh; |
| 182 | qh->type = hep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; | ||
| 182 | 183 | ||
| 183 | } else { /* Skeleton QH */ | 184 | } else { /* Skeleton QH */ |
| 184 | qh->state = QH_STATE_ACTIVE; | 185 | qh->state = QH_STATE_ACTIVE; |
| 185 | qh->udev = NULL; | 186 | qh->udev = NULL; |
| 187 | qh->type = -1; | ||
| 186 | } | 188 | } |
| 187 | return qh; | 189 | return qh; |
| 188 | } | 190 | } |
| @@ -217,8 +219,8 @@ static void uhci_save_toggle(struct uhci_qh *qh, struct urb *urb) | |||
| 217 | qh->element = UHCI_PTR_TERM; | 219 | qh->element = UHCI_PTR_TERM; |
| 218 | 220 | ||
| 219 | /* Only bulk and interrupt pipes have to worry about toggles */ | 221 | /* Only bulk and interrupt pipes have to worry about toggles */ |
| 220 | if (!(usb_pipetype(urb->pipe) == PIPE_BULK || | 222 | if (!(qh->type == USB_ENDPOINT_XFER_BULK || |
| 221 | usb_pipetype(urb->pipe) == PIPE_INTERRUPT)) | 223 | qh->type == USB_ENDPOINT_XFER_INT)) |
| 222 | return; | 224 | return; |
| 223 | 225 | ||
| 224 | /* Find the first active TD; that's the device's toggle state */ | 226 | /* Find the first active TD; that's the device's toggle state */ |
| @@ -1099,14 +1101,14 @@ static int uhci_urb_enqueue(struct usb_hcd *hcd, | |||
| 1099 | } | 1101 | } |
| 1100 | urbp->qh = qh; | 1102 | urbp->qh = qh; |
| 1101 | 1103 | ||
| 1102 | switch (usb_pipetype(urb->pipe)) { | 1104 | switch (qh->type) { |
| 1103 | case PIPE_CONTROL: | 1105 | case USB_ENDPOINT_XFER_CONTROL: |
| 1104 | ret = uhci_submit_control(uhci, urb, qh); | 1106 | ret = uhci_submit_control(uhci, urb, qh); |
| 1105 | break; | 1107 | break; |
| 1106 | case PIPE_BULK: | 1108 | case USB_ENDPOINT_XFER_BULK: |
| 1107 | ret = uhci_submit_bulk(uhci, urb, qh); | 1109 | ret = uhci_submit_bulk(uhci, urb, qh); |
| 1108 | break; | 1110 | break; |
| 1109 | case PIPE_INTERRUPT: | 1111 | case USB_ENDPOINT_XFER_INT: |
| 1110 | if (list_empty(&qh->queue)) { | 1112 | if (list_empty(&qh->queue)) { |
| 1111 | bustime = usb_check_bandwidth(urb->dev, urb); | 1113 | bustime = usb_check_bandwidth(urb->dev, urb); |
| 1112 | if (bustime < 0) | 1114 | if (bustime < 0) |
| @@ -1125,7 +1127,7 @@ static int uhci_urb_enqueue(struct usb_hcd *hcd, | |||
| 1125 | ret = uhci_submit_interrupt(uhci, urb, qh); | 1127 | ret = uhci_submit_interrupt(uhci, urb, qh); |
| 1126 | } | 1128 | } |
| 1127 | break; | 1129 | break; |
| 1128 | case PIPE_ISOCHRONOUS: | 1130 | case USB_ENDPOINT_XFER_ISOC: |
| 1129 | bustime = usb_check_bandwidth(urb->dev, urb); | 1131 | bustime = usb_check_bandwidth(urb->dev, urb); |
| 1130 | if (bustime < 0) { | 1132 | if (bustime < 0) { |
| 1131 | ret = bustime; | 1133 | ret = bustime; |
| @@ -1175,7 +1177,7 @@ static int uhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb) | |||
| 1175 | goto done; | 1177 | goto done; |
| 1176 | 1178 | ||
| 1177 | /* Remove Isochronous TDs from the frame list ASAP */ | 1179 | /* Remove Isochronous TDs from the frame list ASAP */ |
| 1178 | if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) | 1180 | if (urbp->qh->type == USB_ENDPOINT_XFER_ISOC) |
| 1179 | uhci_unlink_isochronous_tds(uhci, urb); | 1181 | uhci_unlink_isochronous_tds(uhci, urb); |
| 1180 | uhci_unlink_qh(uhci, urbp->qh); | 1182 | uhci_unlink_qh(uhci, urbp->qh); |
| 1181 | 1183 | ||
| @@ -1195,7 +1197,7 @@ __acquires(uhci->lock) | |||
| 1195 | struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; | 1197 | struct urb_priv *urbp = (struct urb_priv *) urb->hcpriv; |
| 1196 | 1198 | ||
| 1197 | /* Isochronous TDs get unlinked directly from the frame list */ | 1199 | /* Isochronous TDs get unlinked directly from the frame list */ |
| 1198 | if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) | 1200 | if (qh->type == USB_ENDPOINT_XFER_ISOC) |
| 1199 | uhci_unlink_isochronous_tds(uhci, urb); | 1201 | uhci_unlink_isochronous_tds(uhci, urb); |
| 1200 | 1202 | ||
| 1201 | /* If the URB isn't first on its queue, adjust the link pointer | 1203 | /* If the URB isn't first on its queue, adjust the link pointer |
| @@ -1224,13 +1226,13 @@ __acquires(uhci->lock) | |||
| 1224 | uhci_dec_fsbr(uhci, urb); /* Safe since it checks */ | 1226 | uhci_dec_fsbr(uhci, urb); /* Safe since it checks */ |
| 1225 | uhci_free_urb_priv(uhci, urbp); | 1227 | uhci_free_urb_priv(uhci, urbp); |
| 1226 | 1228 | ||
| 1227 | switch (usb_pipetype(urb->pipe)) { | 1229 | switch (qh->type) { |
| 1228 | case PIPE_ISOCHRONOUS: | 1230 | case USB_ENDPOINT_XFER_ISOC: |
| 1229 | /* Release bandwidth for Interrupt or Isoc. transfers */ | 1231 | /* Release bandwidth for Interrupt or Isoc. transfers */ |
| 1230 | if (urb->bandwidth) | 1232 | if (urb->bandwidth) |
| 1231 | usb_release_bandwidth(urb->dev, urb, 1); | 1233 | usb_release_bandwidth(urb->dev, urb, 1); |
| 1232 | break; | 1234 | break; |
| 1233 | case PIPE_INTERRUPT: | 1235 | case USB_ENDPOINT_XFER_INT: |
| 1234 | /* Release bandwidth for Interrupt or Isoc. transfers */ | 1236 | /* Release bandwidth for Interrupt or Isoc. transfers */ |
| 1235 | /* Make sure we don't release if we have a queued URB */ | 1237 | /* Make sure we don't release if we have a queued URB */ |
| 1236 | if (list_empty(&qh->queue) && urb->bandwidth) | 1238 | if (list_empty(&qh->queue) && urb->bandwidth) |
| @@ -1273,14 +1275,14 @@ static void uhci_scan_qh(struct uhci_hcd *uhci, struct uhci_qh *qh, | |||
| 1273 | urbp = list_entry(qh->queue.next, struct urb_priv, node); | 1275 | urbp = list_entry(qh->queue.next, struct urb_priv, node); |
| 1274 | urb = urbp->urb; | 1276 | urb = urbp->urb; |
| 1275 | 1277 | ||
| 1276 | switch (usb_pipetype(urb->pipe)) { | 1278 | switch (qh->type) { |
| 1277 | case PIPE_CONTROL: | 1279 | case USB_ENDPOINT_XFER_CONTROL: |
| 1278 | status = uhci_result_control(uhci, urb); | 1280 | status = uhci_result_control(uhci, urb); |
| 1279 | break; | 1281 | break; |
| 1280 | case PIPE_ISOCHRONOUS: | 1282 | case USB_ENDPOINT_XFER_ISOC: |
| 1281 | status = uhci_result_isochronous(uhci, urb); | 1283 | status = uhci_result_isochronous(uhci, urb); |
| 1282 | break; | 1284 | break; |
| 1283 | default: /* PIPE_BULK or PIPE_INTERRUPT */ | 1285 | default: /* USB_ENDPOINT_XFER_BULK or _INT */ |
| 1284 | status = uhci_result_common(uhci, urb); | 1286 | status = uhci_result_common(uhci, urb); |
| 1285 | break; | 1287 | break; |
| 1286 | } | 1288 | } |
