[PATCH 025/122] USB: xhci: Add watchdog timer for URB cancellation.

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Greg Kroah-Hartman
Date: Friday, December 11, 2009 - 3:24 pm

From: Sarah Sharp <sarah.a.sharp@linux.intel.com>

In order to giveback a canceled URB, we must ensure that the xHCI
hardware will not access the buffer in an URB.  We can't modify the
buffer pointers on endpoint rings without issuing and waiting for a stop
endpoint command.  Since URBs can be canceled in interrupt context, we
can't wait on that command.  The old code trusted that the host
controller would respond to the command, and would giveback the URBs in
the event handler.  If the hardware never responds to the stop endpoint
command, the URBs will never be completed, and we might hang the USB
subsystem.

Implement a watchdog timer that is spawned whenever a stop endpoint
command is queued.  If a stop endpoint command event is found on the
event ring during an interrupt, we need to stop the watchdog timer with
del_timer().  Since del_timer() can fail if the timer is running and
waiting on the xHCI lock, we need a way to signal to the timer that
everything is fine and it should exit.  If we simply clear
EP_HALT_PENDING, a new stop endpoint command could sneak in and set it
before the watchdog timer can grab the lock.

Instead we use a combination of the EP_HALT_PENDING flag and a counter
for the number of pending stop endpoint commands
(xhci_virt_ep->stop_cmds_pending).  If we need to cancel the watchdog
timer and del_timer() succeeds, we decrement the number of pending stop
endpoint commands.  If del_timer() fails, we leave the number of pending
stop endpoint commands alone.  In either case, we clear the
EP_HALT_PENDING flag.

The timer will decrement the number of pending stop endpoint commands
once it obtains the lock.  If the timer is the tail end of the last stop
endpoint command (xhci_virt_ep->stop_cmds_pending == 0), and the
endpoint's command is still pending (EP_HALT_PENDING is set), we assume
the host is dying.  The watchdog timer will set XHCI_STATE_DYING, try to
halt the xHCI host, and give back all pending URBs.

Various other places in the driver need to check whether the xHCI host
is dying.  If the interrupt handler ever notices, it should immediately
stop processing events.  The URB enqueue function should also return
-ESHUTDOWN.  The URB dequeue function should simply return the value
of usb_hcd_check_unlink_urb() and the watchdog timer will take care of
giving the URB back.  When a device is disconnected, the xHCI hardware
structures should be freed without issuing a disable slot command (since
the hardware probably won't respond to it anyway).  The debugging
polling loop should stop polling if the host is dying.

When a device is disconnected, any pending watchdog timers are killed
with del_timer_sync().  It must be synchronous so that the watchdog
timer doesn't attempt to access the freed endpoint structures.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 drivers/usb/host/xhci-hcd.c  |   52 ++++++++++++-
 drivers/usb/host/xhci-mem.c  |   15 +++-
 drivers/usb/host/xhci-ring.c |  170 +++++++++++++++++++++++++++++++++++++++---
 drivers/usb/host/xhci.h      |   22 ++++++
 4 files changed, 243 insertions(+), 16 deletions(-)

diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c
index 5839453..0d5a856 100644
--- a/drivers/usb/host/xhci-hcd.c
+++ b/drivers/usb/host/xhci-hcd.c
@@ -246,8 +246,14 @@ static void xhci_work(struct xhci_hcd *xhci)
 	/* Flush posted writes */
 	xhci_readl(xhci, &xhci->ir_set->irq_pending);
 
-	/* FIXME this should be a delayed service routine that clears the EHB */
-	xhci_handle_event(xhci);
+	if (xhci->xhc_state & XHCI_STATE_DYING)
+		xhci_dbg(xhci, "xHCI dying, ignoring interrupt. "
+				"Shouldn't IRQs be disabled?\n");
+	else
+		/* FIXME this should be a delayed service routine
+		 * that clears the EHB.
+		 */
+		xhci_handle_event(xhci);
 
 	/* Clear the event handler busy flag (RW1C); the event ring should be empty. */
 	temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue);
@@ -320,7 +326,7 @@ void xhci_event_ring_work(unsigned long arg)
 	spin_lock_irqsave(&xhci->lock, flags);
 	temp = xhci_readl(xhci, &xhci->op_regs->status);
 	xhci_dbg(xhci, "op reg status = 0x%x\n", temp);
-	if (temp == 0xffffffff) {
+	if (temp == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING)) {
 		xhci_dbg(xhci, "HW died, polling stopped.\n");
 		spin_unlock_irqrestore(&xhci->lock, flags);
 		return;
@@ -710,16 +716,22 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags)
 		 * atomic context to this function, which may allocate memory.
 		 */
 		spin_lock_irqsave(&xhci->lock, flags);
+		if (xhci->xhc_state & XHCI_STATE_DYING)
+			goto dying;
 		ret = xhci_queue_ctrl_tx(xhci, GFP_ATOMIC, urb,
 				slot_id, ep_index);
 		spin_unlock_irqrestore(&xhci->lock, flags);
 	} else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) {
 		spin_lock_irqsave(&xhci->lock, flags);
+		if (xhci->xhc_state & XHCI_STATE_DYING)
+			goto dying;
 		ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb,
 				slot_id, ep_index);
 		spin_unlock_irqrestore(&xhci->lock, flags);
 	} else if (usb_endpoint_xfer_int(&urb->ep->desc)) {
 		spin_lock_irqsave(&xhci->lock, flags);
+		if (xhci->xhc_state & XHCI_STATE_DYING)
+			goto dying;
 		ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb,
 				slot_id, ep_index);
 		spin_unlock_irqrestore(&xhci->lock, flags);
@@ -728,6 +740,12 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags)
 	}
 exit:
 	return ret;
+dying:
+	xhci_dbg(xhci, "Ep 0x%x: URB %p submitted for "
+			"non-responsive xHCI host.\n",
+			urb->ep->desc.bEndpointAddress, urb);
+	spin_unlock_irqrestore(&xhci->lock, flags);
+	return -ESHUTDOWN;
 }
 
 /*
@@ -789,6 +807,17 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
 		kfree(td);
 		return ret;
 	}
+	if (xhci->xhc_state & XHCI_STATE_DYING) {
+		xhci_dbg(xhci, "Ep 0x%x: URB %p to be canceled on "
+				"non-responsive xHCI host.\n",
+				urb->ep->desc.bEndpointAddress, urb);
+		/* Let the stop endpoint command watchdog timer (which set this
+		 * state) finish cleaning up the endpoint TD lists.  We must
+		 * have caught it in the middle of dropping a lock and giving
+		 * back an URB.
+		 */
+		goto done;
+	}
 
 	xhci_dbg(xhci, "Cancel URB %p\n", urb);
 	xhci_dbg(xhci, "Event ring:\n");
@@ -806,6 +835,10 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
 	 */
 	if (!(ep->ep_state & EP_HALT_PENDING)) {
 		ep->ep_state |= EP_HALT_PENDING;
+		ep->stop_cmds_pending++;
+		ep->stop_cmd_timer.expires = jiffies +
+			XHCI_STOP_EP_CMD_TIMEOUT * HZ;
+		add_timer(&ep->stop_cmd_timer);
 		xhci_queue_stop_endpoint(xhci, urb->dev->slot_id, ep_index);
 		xhci_ring_cmd_db(xhci);
 	}
@@ -1410,16 +1443,27 @@ void xhci_endpoint_reset(struct usb_hcd *hcd,
 void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev)
 {
 	struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+	struct xhci_virt_device *virt_dev;
 	unsigned long flags;
 	u32 state;
+	int i;
 
 	if (udev->slot_id == 0)
 		return;
+	virt_dev = xhci->devs[udev->slot_id];
+	if (!virt_dev)
+		return;
+
+	/* Stop any wayward timer functions (which may grab the lock) */
+	for (i = 0; i < 31; ++i) {
+		virt_dev->eps[i].ep_state &= ~EP_HALT_PENDING;
+		del_timer_sync(&virt_dev->eps[i].stop_cmd_timer);
+	}
 
 	spin_lock_irqsave(&xhci->lock, flags);
 	/* Don't disable the slot if the host controller is dead. */
 	state = xhci_readl(xhci, &xhci->op_regs->status);
-	if (state == 0xffffffff) {
+	if (state == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING)) {
 		xhci_free_virt_device(xhci, udev->slot_id);
 		spin_unlock_irqrestore(&xhci->lock, flags);
 		return;
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index b8fd270..fd05247 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -248,6 +248,15 @@ struct xhci_ep_ctx *xhci_get_ep_ctx(struct xhci_hcd *xhci,
 		(ctx->bytes + (ep_index * CTX_SIZE(xhci->hcc_params)));
 }
 
+static void xhci_init_endpoint_timer(struct xhci_hcd *xhci,
+		struct xhci_virt_ep *ep)
+{
+	init_timer(&ep->stop_cmd_timer);
+	ep->stop_cmd_timer.data = (unsigned long) ep;
+	ep->stop_cmd_timer.function = xhci_stop_endpoint_command_watchdog;
+	ep->xhci = xhci;
+}
+
 /* All the xhci_tds in the ring's TD list should be freed at this point */
 void xhci_free_virt_device(struct xhci_hcd *xhci, int slot_id)
 {
@@ -309,9 +318,11 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id,
 	xhci_dbg(xhci, "Slot %d input ctx = 0x%llx (dma)\n", slot_id,
 			(unsigned long long)dev->in_ctx->dma);
 
-	/* Initialize the cancellation list for each endpoint */
-	for (i = 0; i < 31; i++)
+	/* Initialize the cancellation list and watchdog timers for each ep */
+	for (i = 0; i < 31; i++) {
+		xhci_init_endpoint_timer(xhci, &dev->eps[i]);
 		INIT_LIST_HEAD(&dev->eps[i].cancelled_td_list);
+	}
 
 	/* Allocate endpoint 0 ring */
 	dev->eps[0].ring = xhci_ring_alloc(xhci, 1, true, flags);
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 184e8b6..9541e88 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -475,6 +475,35 @@ void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci,
 	ep->ep_state |= SET_DEQ_PENDING;
 }
 
+static inline void xhci_stop_watchdog_timer_in_irq(struct xhci_hcd *xhci,
+		struct xhci_virt_ep *ep)
+{
+	ep->ep_state &= ~EP_HALT_PENDING;
+	/* Can't del_timer_sync in interrupt, so we attempt to cancel.  If the
+	 * timer is running on another CPU, we don't decrement stop_cmds_pending
+	 * (since we didn't successfully stop the watchdog timer).
+	 */
+	if (del_timer(&ep->stop_cmd_timer))
+		ep->stop_cmds_pending--;
+}
+
+/* Must be called with xhci->lock held in interrupt context */
+static void xhci_giveback_urb_in_irq(struct xhci_hcd *xhci,
+		struct xhci_td *cur_td, int status, char *adjective)
+{
+	struct usb_hcd *hcd = xhci_to_hcd(xhci);
+
+	cur_td->urb->hcpriv = NULL;
+	usb_hcd_unlink_urb_from_ep(hcd, cur_td->urb);
+	xhci_dbg(xhci, "Giveback %s URB %p\n", adjective, cur_td->urb);
+
+	spin_unlock(&xhci->lock);
+	usb_hcd_giveback_urb(hcd, cur_td->urb, status);
+	kfree(cur_td);
+	spin_lock(&xhci->lock);
+	xhci_dbg(xhci, "%s URB given back\n", adjective);
+}
+
 /*
  * When we get a command completion for a Stop Endpoint Command, we need to
  * unlink any cancelled TDs from the ring.  There are two ways to do that:
@@ -508,7 +537,7 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci,
 	ep_ring = ep->ring;
 
 	if (list_empty(&ep->cancelled_td_list)) {
-		ep->ep_state &= ~EP_HALT_PENDING;
+		xhci_stop_watchdog_timer_in_irq(xhci, ep);
 		ring_ep_doorbell(xhci, slot_id, ep_index);
 		return;
 	}
@@ -540,7 +569,7 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci,
 		list_del(&cur_td->td_list);
 	}
 	last_unlinked_td = cur_td;
-	ep->ep_state &= ~EP_HALT_PENDING;
+	xhci_stop_watchdog_timer_in_irq(xhci, ep);
 
 	/* If necessary, queue a Set Transfer Ring Dequeue Pointer command */
 	if (deq_state.new_deq_ptr && deq_state.new_deq_seg) {
@@ -568,23 +597,136 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci,
 		hcd_stat_update(xhci->tp_stat, cur_td->urb->actual_length,
 				ktime_sub(stop_time, cur_td->start_time));
 #endif
-		cur_td->urb->hcpriv = NULL;
-		usb_hcd_unlink_urb_from_ep(xhci_to_hcd(xhci), cur_td->urb);
-
-		xhci_dbg(xhci, "Giveback cancelled URB %p\n", cur_td->urb);
-		spin_unlock(&xhci->lock);
 		/* Doesn't matter what we pass for status, since the core will
 		 * just overwrite it (because the URB has been unlinked).
 		 */
-		usb_hcd_giveback_urb(xhci_to_hcd(xhci), cur_td->urb, 0);
-		kfree(cur_td);
+		xhci_giveback_urb_in_irq(xhci, cur_td, 0, "cancelled");
 
-		spin_lock(&xhci->lock);
+		/* Stop processing the cancelled list if the watchdog timer is
+		 * running.
+		 */
+		if (xhci->xhc_state & XHCI_STATE_DYING)
+			return;
 	} while (cur_td != last_unlinked_td);
 
 	/* Return to the event handler with xhci->lock re-acquired */
 }
 
+/* Watchdog timer function for when a stop endpoint command fails to complete.
+ * In this case, we assume the host controller is broken or dying or dead.  The
+ * host may still be completing some other events, so we have to be careful to
+ * let the event ring handler and the URB dequeueing/enqueueing functions know
+ * through xhci->state.
+ *
+ * The timer may also fire if the host takes a very long time to respond to the
+ * command, and the stop endpoint command completion handler cannot delete the
+ * timer before the timer function is called.  Another endpoint cancellation may
+ * sneak in before the timer function can grab the lock, and that may queue
+ * another stop endpoint command and add the timer back.  So we cannot use a
+ * simple flag to say whether there is a pending stop endpoint command for a
+ * particular endpoint.
+ *
+ * Instead we use a combination of that flag and a counter for the number of
+ * pending stop endpoint commands.  If the timer is the tail end of the last
+ * stop endpoint command, and the endpoint's command is still pending, we assume
+ * the host is dying.
+ */
+void xhci_stop_endpoint_command_watchdog(unsigned long arg)
+{
+	struct xhci_hcd *xhci;
+	struct xhci_virt_ep *ep;
+	struct xhci_virt_ep *temp_ep;
+	struct xhci_ring *ring;
+	struct xhci_td *cur_td;
+	int ret, i, j;
+
+	ep = (struct xhci_virt_ep *) arg;
+	xhci = ep->xhci;
+
+	spin_lock(&xhci->lock);
+
+	ep->stop_cmds_pending--;
+	if (xhci->xhc_state & XHCI_STATE_DYING) {
+		xhci_dbg(xhci, "Stop EP timer ran, but another timer marked "
+				"xHCI as DYING, exiting.\n");
+		spin_unlock(&xhci->lock);
+		return;
+	}
+	if (!(ep->stop_cmds_pending == 0 && (ep->ep_state & EP_HALT_PENDING))) {
+		xhci_dbg(xhci, "Stop EP timer ran, but no command pending, "
+				"exiting.\n");
+		spin_unlock(&xhci->lock);
+		return;
+	}
+
+	xhci_warn(xhci, "xHCI host not responding to stop endpoint command.\n");
+	xhci_warn(xhci, "Assuming host is dying, halting host.\n");
+	/* Oops, HC is dead or dying or at least not responding to the stop
+	 * endpoint command.
+	 */
+	xhci->xhc_state |= XHCI_STATE_DYING;
+	/* Disable interrupts from the host controller and start halting it */
+	xhci_quiesce(xhci);
+	spin_unlock(&xhci->lock);
+
+	ret = xhci_halt(xhci);
+
+	spin_lock(&xhci->lock);
+	if (ret < 0) {
+		/* This is bad; the host is not responding to commands and it's
+		 * not allowing itself to be halted.  At least interrupts are
+		 * disabled, so we can set HC_STATE_HALT and notify the
+		 * USB core.  But if we call usb_hc_died(), it will attempt to
+		 * disconnect all device drivers under this host.  Those
+		 * disconnect() methods will wait for all URBs to be unlinked,
+		 * so we must complete them.
+		 */
+		xhci_warn(xhci, "Non-responsive xHCI host is not halting.\n");
+		xhci_warn(xhci, "Completing active URBs anyway.\n");
+		/* We could turn all TDs on the rings to no-ops.  This won't
+		 * help if the host has cached part of the ring, and is slow if
+		 * we want to preserve the cycle bit.  Skip it and hope the host
+		 * doesn't touch the memory.
+		 */
+	}
+	for (i = 0; i < MAX_HC_SLOTS; i++) {
+		if (!xhci->devs[i])
+			continue;
+		for (j = 0; j < 31; j++) {
+			temp_ep = &xhci->devs[i]->eps[j];
+			ring = temp_ep->ring;
+			if (!ring)
+				continue;
+			xhci_dbg(xhci, "Killing URBs for slot ID %u, "
+					"ep index %u\n", i, j);
+			while (!list_empty(&ring->td_list)) {
+				cur_td = list_first_entry(&ring->td_list,
+						struct xhci_td,
+						td_list);
+				list_del(&cur_td->td_list);
+				if (!list_empty(&cur_td->cancelled_td_list))
+					list_del(&cur_td->cancelled_td_list);
+				xhci_giveback_urb_in_irq(xhci, cur_td,
+						-ESHUTDOWN, "killed");
+			}
+			while (!list_empty(&temp_ep->cancelled_td_list)) {
+				cur_td = list_first_entry(
+						&temp_ep->cancelled_td_list,
+						struct xhci_td,
+						cancelled_td_list);
+				list_del(&cur_td->cancelled_td_list);
+				xhci_giveback_urb_in_irq(xhci, cur_td,
+						-ESHUTDOWN, "killed");
+			}
+		}
+	}
+	spin_unlock(&xhci->lock);
+	xhci_to_hcd(xhci)->state = HC_STATE_HALT;
+	xhci_dbg(xhci, "Calling usb_hc_died()\n");
+	usb_hc_died(xhci_to_hcd(xhci));
+	xhci_dbg(xhci, "xHCI host controller is dead.\n");
+}
+
 /*
  * When we get a completion for a Set Transfer Ring Dequeue Pointer command,
  * we need to clear the set deq pending flag in the endpoint ring state, so that
@@ -1333,6 +1475,14 @@ void xhci_handle_event(struct xhci_hcd *xhci)
 	default:
 		xhci->error_bitmask |= 1 << 3;
 	}
+	/* Any of the above functions may drop and re-acquire the lock, so check
+	 * to make sure a watchdog timer didn't mark the host as non-responsive.
+	 */
+	if (xhci->xhc_state & XHCI_STATE_DYING) {
+		xhci_dbg(xhci, "xHCI host dying, returning from "
+				"event handler.\n");
+		return;
+	}
 
 	if (update_ptrs) {
 		/* Update SW and HC event ring dequeue pointer */
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index af3c563..c92f841 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -659,6 +659,10 @@ struct xhci_virt_ep {
 	/* The TRB that was last reported in a stopped endpoint ring */
 	union xhci_trb		*stopped_trb;
 	struct xhci_td		*stopped_td;
+	/* Watchdog timer for stop endpoint command to cancel URBs */
+	struct timer_list	stop_cmd_timer;
+	int			stop_cmds_pending;
+	struct xhci_hcd		*xhci;
 };
 
 struct xhci_virt_device {
@@ -1022,6 +1026,8 @@ struct xhci_scratchpad {
 #define	ERST_ENTRIES	1
 /* Poll every 60 seconds */
 #define	POLL_TIMEOUT	60
+/* Stop endpoint command timeout (secs) for URB cancellation watchdog timer */
+#define XHCI_STOP_EP_CMD_TIMEOUT	5
 /* XXX: Make these module parameters */
 
 
@@ -1083,6 +1089,21 @@ struct xhci_hcd {
 	struct timer_list	event_ring_timer;
 	int			zombie;
 #endif
+	/* Host controller watchdog timer structures */
+	unsigned int		xhc_state;
+/* Host controller is dying - not responding to commands. "I'm not dead yet!"
+ *
+ * xHC interrupts have been disabled and a watchdog timer will (or has already)
+ * halt the xHCI host, and complete all URBs with an -ESHUTDOWN code.  Any code
+ * that sees this status (other than the timer that set it) should stop touching
+ * hardware immediately.  Interrupt handlers should return immediately when
+ * they see this status (any time they drop and re-acquire xhci->lock).
+ * xhci_urb_dequeue() should call usb_hcd_check_unlink_urb() and return without
+ * putting the TD on the canceled list, etc.
+ *
+ * There are no reports of xHCI host controllers that display this issue.
+ */
+#define XHCI_STATE_DYING	(1 << 0)
 	/* Statistics */
 	int			noops_submitted;
 	int			noops_handled;
@@ -1279,6 +1300,7 @@ void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci,
 void xhci_queue_config_ep_quirk(struct xhci_hcd *xhci,
 		unsigned int slot_id, unsigned int ep_index,
 		struct xhci_dequeue_state *deq_state);
+void xhci_stop_endpoint_command_watchdog(unsigned long arg);
 
 /* xHCI roothub code */
 int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex,
-- 
1.6.5.5

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[GIT PATCH] USB patches for 2.6.33-git, Greg KH, (Fri Dec 11, 2:26 pm)
[PATCH 001/122] USB: serial: ftdi_sio: add space/mark parity, Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 003/122] USB: Convert a dev_info to a dev_dbg, Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 004/122] USB: usb-storage: Associate the name of th ..., Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 005/122] USB Storage: Make driver less chatty when ..., Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 006/122] USB: Add support for Xilinx USB host contr ..., Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 007/122] USB: Add missing static markers to ohci-pn ..., Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 008/122] USB: make urb scatter-gather support more ..., Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 009/122] USB: whci-hcd: support urbs with scatter-g ..., Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 010/122] USB: allow interrupt transfers to WUSB devices, Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 011/122] USB: whci-hcd: fix type and format warning ..., Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 012/122] USB: skeleton: Correct use of ! and &amp;, Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 013/122] USB gadget: Handle endpoint requests at th ..., Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 014/122] USB audio gadget: handle endpoint control ..., Greg Kroah-Hartman, (Fri Dec 11, 3:23 pm)
[PATCH 015/122] USB: modifications for at91sam9g10, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 016/122] USB: usbtmc: minor formatting cleanups, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 017/122] usb: whci-hcd: decode more QHead fields in ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 018/122] USB: wusb: add wusb_phy_rate sysfs file to ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 019/122] USB OTG: add support for ulpi connected ex ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 020/122] USB OTG: Add generic driver for ULPI OTG t ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 021/122] USB: host: ehci: introduce omap ehci-hcd d ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 022/122] USB: improved error handling in usb_port_s ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 023/122] USB: xhci: Handle URB cancel, complete and ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 024/122] USB: xhci: Re-purpose xhci_quiesce()., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 025/122] USB: xhci: Add watchdog timer for URB canc ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 026/122] USB: xhci: Remove unused HCD statistics code., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 027/122] USB: ehci: Minor constant fix for SCHEDULE ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 028/122] USB: ehci: Respect IST when scheduling new ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 029/122] USB: don't use a fixed DMA mapping for hub ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 031/122] USB: fix a bug in the scatter-gather library, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 032/122] USB: Add EHCI support for MX27 and MX31 ba ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 033/122] USB: g_file_storage: parts of file_storage ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 035/122] USB: g_file_storage: per-LUN ro, removable ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 036/122] USB: g_file_storage: more code from file_s ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 037/122] USB: g_mass_storage: template f_mass_stora ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 038/122] USB: g_mass_storage: testing code from f_m ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 039/122] USB: g_mass_storage: parts of fsg_dev move ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 040/122] USB: g_mass_storage: constant length buffe ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 041/122] USB: g_mass_storage: fsg_common_init() created, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 042/122] USB: Interface Association Descriptors add ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 043/122] USB: serial: sierra driver memory reduction, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 044/122] USB: EHCI: add native scatter-gather support, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 045/122] USB: add scatter-gather support to usbmon, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 046/122] USB: ehci: Allow EHCI to be built on OMAP3, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 047/122] USB: Check results of dma_map_single, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 048/122] USB: Exposing second ACM channel as tty fo ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 049/122] USB: add hex/bcd detection to usb modalias ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 050/122] USB: handle bcd incrementation in usb moda ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 051/122] USB: FIX bitfield istl_flip:1, make it uns ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 052/122] USB: Close usb_find_interface race, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 053/122] USB: ark3116: Setup some basic infrastruct ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 054/122] USB: ark3116: Make existing functions 1645 ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 055/122] USB: ark3116: Replace cmget, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 056/122] USB: ark3116: Add cmset and break, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 057/122] USB: ark3116: Callbacks for interrupt and ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 058/122] USB: ark3116: Cleanup of now unneeded func ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 059/122] USB: option.c: add support for D-Link DWM- ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 060/122] USB: hcd.c: quiet NULL pointer sparse noise, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 061/122] USB: remove the auto_pm flag, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 062/122] USB: r8a66597: clean up. remove unneeded n ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 063/122] USB: fix possible null deref in init_usb_c ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 064/122] usbtest: make module param pattern writeable, Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 065/122] USB: xhci: Add tests for TRB address trans ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 066/122] USB: g_mass_storage: Mass Storage Function ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 068/122] USB: g_mass_storage: lun_name_format and t ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 069/122] USB: g_mass_storage: code cleaned up and c ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 070/122] USB: g_mass_storage: most data moved to fs ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 071/122] USB: composite: usb_composite_unregister() ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 072/122] USB: g_mass_storage: thread_exits callback ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 073/122] USB: g_multi: Multifunction Composite Gadg ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 074/122] USB: xhci: Set transfer descriptor size fi ..., Greg Kroah-Hartman, (Fri Dec 11, 3:24 pm)
[PATCH 075/122] USB: xhci: Return -EPROTO on a split trans ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 076/122] USB: xhci: Return success for vendor-speci ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 077/122] USB: xhci: Handle errors that cause endpoi ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 078/122] USB: musb: tweak musb_read_fifo() to avoid ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 079/122] USB: musb: kill compile warning for Blackf ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 080/122] USB: musb: kill some useless comments in B ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 081/122] USB: musb: update Blackfin processor depen ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 082/122] USB: musb: add notes for Blackfin anomalies, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 083/122] USB: musb: add work around for Blackfin an ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 084/122] USB: musb: fix musb_platform_set_mode() de ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 085/122] USB: musb: clear the Blackfin interrupt pe ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 086/122] USB: musb: error out when anomaly 05000380 ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 087/122] USB: musb: Blackfin code needs NOP_USB_XCE ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 088/122] USB: musb: fix printf warning in debug code, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 089/122] USB: MUSB: save hardware revision at init, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 090/122] USB: musb_gadget_ep0: fix unhandled endpoi ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 091/122] USB: musb_gadget: implement set_wedge() method, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 092/122] USB: musb_gadget_ep0: stop abusing musb_ga ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 093/122] USB: musb_gadget: remove pointless loop, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 094/122] USB: usbtmc: repeat usb_bulk_msg until who ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 095/122] USB: twl4030: Enable USB regulators before ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 096/122] USB: add devpath sysfs attribute, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 097/122] USB: prepare for changover to Runtime PM f ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 098/122] USB: usb-storage: add BAD_SENSE flag, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 099/122] USB: usb-storage: fix bug in fill_inquiry, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 100/122] USB: whci-hcd: correctly handle sg lists l ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 101/122] USB: wusb: don't leak urb in certain error ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 102/122] USB: wusb: correctly check size of securit ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 103/122] USB: option: add pid for ZTE, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 104/122] USB: g_multi kconfig: fix depends and help ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 105/122] USB: add remove_id sysfs attr for usb drivers, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 106/122] USB: xhci-mem.c: introduce missing kfree, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 107/122] USB: ehci-omap.c: introduce missing kfree, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 108/122] USB: xhci: Add correct email and files to ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 109/122] USB: usbtmc: Use usb_clear_halt() instead ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 111/122] USB: xhci: Fix command completion after a ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 112/122] USB: Refactor code to find alternate inter ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 113/122] USB: Check bandwidth when switching alt se ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 114/122] USB: Added USB_ETH_RNDIS to use instead of ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 115/122] USB: core: fix sparse warning for static f ..., Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 116/122] USB: core: hub: fix sparse warning, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 117/122] USB: core: message: fix sparse warning, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 118/122] USB: musb: omap2430: fix sparse warning, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 119/122] USB: musb: musb_gadget: fix sparse warning, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
[PATCH 120/122] USB: musb: musb_host: fix sparse warning, Greg Kroah-Hartman, (Fri Dec 11, 3:25 pm)
Re: [PATCH 093/122] USB: musb_gadget: remove pointless loop, Sergei Shtylyov, (Sat Dec 12, 4:08 pm)
Re: [GIT PATCH] USB patches for 2.6.33-git, Linus Torvalds, (Mon Dec 14, 5:39 pm)
Re: [GIT PATCH] USB patches for 2.6.33-git, Greg KH, (Mon Dec 14, 5:52 pm)
Re: [GIT PATCH] USB patches for 2.6.33-git, Linus Torvalds, (Mon Dec 14, 6:00 pm)
Re: [GIT PATCH] USB patches for 2.6.33-git, Linus Torvalds, (Mon Dec 14, 6:47 pm)
Re: [GIT PATCH] USB patches for 2.6.33-git, Linus Torvalds, (Mon Dec 14, 7:29 pm)
Re: [GIT PATCH] USB patches for 2.6.33-git, Linus Torvalds, (Mon Dec 14, 8:09 pm)