aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/xhci-hcd.c
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2009-08-07 17:04:52 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-09-23 09:46:17 -0400
commit82d1009f537c2a43be0a410abd33521f76ee3a5a (patch)
tree98ff36d6d21b627fd42d0d59b1fc507fd5c92347 /drivers/usb/host/xhci-hcd.c
parent2d3f1fac7ee8bb4c6fad40f838488edbeabb0c50 (diff)
USB: xhci: Handle stalled control endpoints.
When a control endpoint stalls, the next control transfer will clear the stall. The USB core doesn't call down to the host controller driver's endpoint_reset() method when control endpoints stall, so the xHCI driver has to do all its stall handling for internal state in its interrupt handler. When the host stalls on a control endpoint, it may stop on the data phase or status phase of the control transfer. Like other stalled endpoints, the xHCI driver needs to queue a Reset Endpoint command and move the hardware's control endpoint ring dequeue pointer past the failed control transfer (with a Set TR Dequeue Pointer or a Configure Endpoint command). Since the USB core doesn't call usb_hcd_reset_endpoint() for control endpoints, we need to do this in interrupt context when we get notified of the stalled transfer. URBs may be queued to the hardware before these two commands complete. The endpoint queue will be restarted once both commands complete. Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Cc: stable <stable@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/xhci-hcd.c')
-rw-r--r--drivers/usb/host/xhci-hcd.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c
index 4e18f4edf5aa..4353c1c78935 100644
--- a/drivers/usb/host/xhci-hcd.c
+++ b/drivers/usb/host/xhci-hcd.c
@@ -1230,6 +1230,25 @@ void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev)
1230 xhci_zero_in_ctx(xhci, virt_dev); 1230 xhci_zero_in_ctx(xhci, virt_dev);
1231} 1231}
1232 1232
1233void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci,
1234 struct usb_device *udev, struct usb_host_endpoint *ep,
1235 unsigned int ep_index, struct xhci_ring *ep_ring)
1236{
1237 struct xhci_dequeue_state deq_state;
1238
1239 xhci_dbg(xhci, "Cleaning up stalled endpoint ring\n");
1240 /* We need to move the HW's dequeue pointer past this TD,
1241 * or it will attempt to resend it on the next doorbell ring.
1242 */
1243 xhci_find_new_dequeue_state(xhci, udev->slot_id,
1244 ep_index, ep_ring->stopped_td, &deq_state);
1245
1246 xhci_dbg(xhci, "Queueing new dequeue state\n");
1247 xhci_queue_new_dequeue_state(xhci, ep_ring,
1248 udev->slot_id,
1249 ep_index, &deq_state);
1250}
1251
1233/* Deal with stalled endpoints. The core should have sent the control message 1252/* Deal with stalled endpoints. The core should have sent the control message
1234 * to clear the halt condition. However, we need to make the xHCI hardware 1253 * to clear the halt condition. However, we need to make the xHCI hardware
1235 * reset its sequence number, since a device will expect a sequence number of 1254 * reset its sequence number, since a device will expect a sequence number of
@@ -1244,7 +1263,6 @@ void xhci_endpoint_reset(struct usb_hcd *hcd,
1244 unsigned int ep_index; 1263 unsigned int ep_index;
1245 unsigned long flags; 1264 unsigned long flags;
1246 int ret; 1265 int ret;
1247 struct xhci_dequeue_state deq_state;
1248 struct xhci_ring *ep_ring; 1266 struct xhci_ring *ep_ring;
1249 1267
1250 xhci = hcd_to_xhci(hcd); 1268 xhci = hcd_to_xhci(hcd);
@@ -1261,6 +1279,10 @@ void xhci_endpoint_reset(struct usb_hcd *hcd,
1261 ep->desc.bEndpointAddress); 1279 ep->desc.bEndpointAddress);
1262 return; 1280 return;
1263 } 1281 }
1282 if (usb_endpoint_xfer_control(&ep->desc)) {
1283 xhci_dbg(xhci, "Control endpoint stall already handled.\n");
1284 return;
1285 }
1264 1286
1265 xhci_dbg(xhci, "Queueing reset endpoint command\n"); 1287 xhci_dbg(xhci, "Queueing reset endpoint command\n");
1266 spin_lock_irqsave(&xhci->lock, flags); 1288 spin_lock_irqsave(&xhci->lock, flags);
@@ -1271,16 +1293,7 @@ void xhci_endpoint_reset(struct usb_hcd *hcd,
1271 * command. Better hope that last command worked! 1293 * command. Better hope that last command worked!
1272 */ 1294 */
1273 if (!ret) { 1295 if (!ret) {
1274 xhci_dbg(xhci, "Cleaning up stalled endpoint ring\n"); 1296 xhci_cleanup_stalled_ring(xhci, udev, ep, ep_index, ep_ring);
1275 /* We need to move the HW's dequeue pointer past this TD,
1276 * or it will attempt to resend it on the next doorbell ring.
1277 */
1278 xhci_find_new_dequeue_state(xhci, udev->slot_id,
1279 ep_index, ep_ring->stopped_td, &deq_state);
1280 xhci_dbg(xhci, "Queueing new dequeue state\n");
1281 xhci_queue_new_dequeue_state(xhci, ep_ring,
1282 udev->slot_id,
1283 ep_index, &deq_state);
1284 kfree(ep_ring->stopped_td); 1297 kfree(ep_ring->stopped_td);
1285 xhci_ring_cmd_db(xhci); 1298 xhci_ring_cmd_db(xhci);
1286 } 1299 }