aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2006-05-05 16:26:58 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2006-06-21 18:04:10 -0400
commit4de7d2c231a8624a47417977be0768c5b5257c4f (patch)
tree3dba388c3c8e0673a5884c900f2b04339dc4708e /drivers/usb/host
parent2d61bde7a0e630e1906e6478b6b2a7aeaaa8f8da (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>
Diffstat (limited to 'drivers/usb/host')
-rw-r--r--drivers/usb/host/uhci-debug.c26
-rw-r--r--drivers/usb/host/uhci-hcd.h1
-rw-r--r--drivers/usb/host/uhci-q.c34
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 }