diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index f8850f9..e94cc49 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -100,6 +100,9 @@
 #define XTYPE_XBOXONE     3
 #define XTYPE_UNKNOWN     4
 
+#define OUT_IRQ_SUBMITTED	0
+#define OUT_IRQ_QUEUE_EMPTY	1
+
 static bool dpad_to_buttons;
 module_param(dpad_to_buttons, bool, S_IRUGO);
 MODULE_PARM_DESC(dpad_to_buttons, "Map D-PAD to buttons rather than axes for unknown pads");
@@ -334,7 +337,9 @@ struct usb_xpad {
 	struct urb *irq_out;		/* urb for interrupt out report */
 	unsigned char *odata;		/* output data */
 	dma_addr_t odata_dma;
-	struct mutex odata_mutex;
+	unsigned long odata_flags;
+	spinlock_t queue_lock;
+	struct list_head odata_queue;	/* queue of commands */
 
 #if defined(CONFIG_JOYSTICK_XPAD_LEDS)
 	struct xpad_led *led;
@@ -347,6 +352,94 @@ struct usb_xpad {
 	unsigned long led_no;		/* led to lit on xbox360 controllers */
 };
 
+struct xpad_queue_item {
+	char odata[XPAD_PKT_LEN];
+	int transfer_length;
+	struct list_head entry;
+};
+
+static void __xpad_remove_urb(struct usb_xpad *xpad, struct xpad_queue_item *item)
+{
+	list_del(&item->entry);
+	kfree(item);
+}
+
+/*
+ * This function must be called with the queue lock held
+ *
+ * returns
+ *  0 - urb successfully submitted
+ *  OUT_IRQ_QUEUE_EMPTY - queue was empty
+ *  negative - error submitting urb
+ */
+static int __xpad_submit_urb(struct usb_xpad *xpad, bool safe_submit)
+{
+	int ret = 0;
+
+	if (list_empty(&xpad->odata_queue))
+		return OUT_IRQ_QUEUE_EMPTY;
+
+	if (safe_submit || !test_and_set_bit( OUT_IRQ_SUBMITTED, &xpad->odata_flags)) {
+		struct xpad_queue_item *head =
+			list_first_entry(&xpad->odata_queue,
+					 struct xpad_queue_item, entry);
+
+		memcpy(xpad->odata, head->odata, head->transfer_length);
+		xpad->irq_out->transfer_buffer_length = head->transfer_length;
+		ret = usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
+		if (ret)
+			__xpad_remove_urb(xpad, head);
+	}
+
+	return ret;
+}
+
+static int xpad_add_and_submit_urb(struct usb_xpad *xpad,
+				   struct xpad_queue_item *item)
+{
+	unsigned long flags;
+	int ret;
+
+	spin_lock_irqsave(&xpad->queue_lock, flags);
+	list_add_tail(&item->entry, &xpad->odata_queue);
+	ret = __xpad_submit_urb(xpad, false);
+	spin_unlock_irqrestore(&xpad->queue_lock, flags);
+
+	return ret;
+}
+
+static int xpad_remove_urb(struct usb_xpad *xpad)
+{
+	unsigned long flags;
+	struct xpad_queue_item *head;
+	int ret = 0;
+
+	spin_lock_irqsave(&xpad->queue_lock, flags);
+	if (list_empty(&xpad->odata_queue)) {
+		ret = OUT_IRQ_QUEUE_EMPTY;
+		goto out;
+	}
+
+	head = list_first_entry(&xpad->odata_queue, struct xpad_queue_item,
+					entry);
+	__xpad_remove_urb(xpad, head);
+out:
+	spin_unlock_irqrestore(&xpad->queue_lock, flags);
+	return ret;
+}
+
+static int xpad_resubmit_urb(struct usb_xpad *xpad)
+{
+	unsigned long flags;
+	int ret;
+
+	spin_lock_irqsave(&xpad->queue_lock, flags);
+	ret = __xpad_submit_urb(xpad, true);
+	spin_unlock_irqrestore(&xpad->queue_lock, flags);
+
+	return ret;
+}
+
 /*
  *	xpad_process_packet
  *
@@ -707,7 +800,8 @@ static void xpad_irq_out(struct urb *urb)
 	switch (status) {
 	case 0:
 		/* success */
-		return;
+		xpad_remove_urb(xpad);
+		break;
 
 	case -ECONNRESET:
 	case -ENOENT:
@@ -720,14 +814,21 @@ static void xpad_irq_out(struct urb *urb)
 	default:
 		dev_dbg(dev, "%s - nonzero urb status received: %d\n",
 			__func__, status);
-		goto exit;
+		break;
 	}
 
-exit:
-	retval = usb_submit_urb(urb, GFP_ATOMIC);
-	if (retval)
-		dev_err(dev, "%s - usb_submit_urb failed with result %d\n",
-			__func__, retval);
+
+	/*
+	 * We must keep resubmitting, otherwise the other items in the
+	 * queue will stall until until the next urb submit which may
+	 * be indefinitely
+	 */
+	do {
+		retval = xpad_resubmit_urb(xpad);
+	} while (retval < 0);
+
+	if (retval == OUT_IRQ_QUEUE_EMPTY)
+		clear_bit(OUT_IRQ_SUBMITTED, &xpad->odata_flags);
 }
 
 static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)
@@ -746,7 +847,8 @@ static int xpad_init_output(struct usb_interface *intf, struct usb_xpad *xpad)
 		goto fail1;
 	}
 
-	mutex_init(&xpad->odata_mutex);
+	xpad->odata_flags = 0;
+	INIT_LIST_HEAD(&xpad->odata_queue);
 
 	xpad->irq_out = usb_alloc_urb(0, GFP_KERNEL);
 	if (!xpad->irq_out) {
@@ -780,9 +882,14 @@ static void xpad_stop_output(struct usb_xpad *xpad)
 static void xpad_deinit_output(struct usb_xpad *xpad)
 {
 	if (xpad->xtype != XTYPE_UNKNOWN) {
+		int ret;
+
 		usb_free_urb(xpad->irq_out);
 		usb_free_coherent(xpad->udev, XPAD_PKT_LEN,
 				xpad->odata, xpad->odata_dma);
+		do {
+			ret = xpad_remove_urb(xpad);
+		} while (ret != OUT_IRQ_QUEUE_EMPTY);
 	}
 }
 
@@ -790,6 +897,11 @@ static void xpad_deinit_output(struct usb_xpad *xpad)
 static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect *effect)
 {
 	struct usb_xpad *xpad = input_get_drvdata(dev);
+	struct xpad_queue_item *item;
+
+	item = kzalloc(sizeof(*item), GFP_ATOMIC);
+	if (!item)
+		return -ENOMEM;
 
 	if (effect->type == FF_RUMBLE) {
 		__u16 strong = effect->u.rumble.strong_magnitude;
@@ -798,62 +910,62 @@ static int xpad_play_effect(struct input_dev *dev, void *data, struct ff_effect
 		switch (xpad->xtype) {
 
 		case XTYPE_XBOX:
-			xpad->odata[0] = 0x00;
-			xpad->odata[1] = 0x06;
-			xpad->odata[2] = 0x00;
-			xpad->odata[3] = strong / 256;	/* left actuator */
-			xpad->odata[4] = 0x00;
-			xpad->odata[5] = weak / 256;	/* right actuator */
-			xpad->irq_out->transfer_buffer_length = 6;
+			item->odata[0] = 0x00;
+			item->odata[1] = 0x06;
+			item->odata[2] = 0x00;
+			item->odata[3] = strong / 256;	/* left actuator */
+			item->odata[4] = 0x00;
+			item->odata[5] = weak / 256;	/* right actuator */
+			item->transfer_length = 6;
 
-			return usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
+			return xpad_add_and_submit_urb(xpad, item);
 
 		case XTYPE_XBOX360:
-			xpad->odata[0] = 0x00;
-			xpad->odata[1] = 0x08;
-			xpad->odata[2] = 0x00;
-			xpad->odata[3] = strong / 256;  /* left actuator? */
-			xpad->odata[4] = weak / 256;	/* right actuator? */
-			xpad->odata[5] = 0x00;
-			xpad->odata[6] = 0x00;
-			xpad->odata[7] = 0x00;
-			xpad->irq_out->transfer_buffer_length = 8;
-
-			return usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
+			item->odata[0] = 0x00;
+			item->odata[1] = 0x08;
+			item->odata[2] = 0x00;
+			item->odata[3] = strong / 256;  /* left actuator? */
+			item->odata[4] = weak / 256;	/* right actuator? */
+			item->odata[5] = 0x00;
+			item->odata[6] = 0x00;
+			item->odata[7] = 0x00;
+			item->transfer_length = 8;
+
+			return xpad_add_and_submit_urb(xpad, item);
 
 		case XTYPE_XBOX360W:
-			xpad->odata[0] = 0x00;
-			xpad->odata[1] = 0x01;
-			xpad->odata[2] = 0x0F;
-			xpad->odata[3] = 0xC0;
-			xpad->odata[4] = 0x00;
-			xpad->odata[5] = strong / 256;
-			xpad->odata[6] = weak / 256;
-			xpad->odata[7] = 0x00;
-			xpad->odata[8] = 0x00;
-			xpad->odata[9] = 0x00;
-			xpad->odata[10] = 0x00;
-			xpad->odata[11] = 0x00;
-			xpad->irq_out->transfer_buffer_length = 12;
-
-			return usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
+			item->odata[0] = 0x00;
+			item->odata[1] = 0x01;
+			item->odata[2] = 0x0F;
+			item->odata[3] = 0xC0;
+			item->odata[4] = 0x00;
+			item->odata[5] = strong / 256;
+			item->odata[6] = weak / 256;
+			item->odata[7] = 0x00;
+			item->odata[8] = 0x00;
+			item->odata[9] = 0x00;
+			item->odata[10] = 0x00;
+			item->odata[11] = 0x00;
+			item->transfer_length = 12;
+
+			return pad_add_and_submit_urb(xpad, item);
 
 		case XTYPE_XBOXONE:
-			xpad->odata[0] = 0x09; /* activate rumble */
-			xpad->odata[1] = 0x08;
-			xpad->odata[2] = 0x00;
-			xpad->odata[3] = 0x08; /* continuous effect */
-			xpad->odata[4] = 0x00; /* simple rumble mode */
-			xpad->odata[5] = 0x03; /* L and R actuator only */
-			xpad->odata[6] = 0x00; /* TODO: LT actuator */
-			xpad->odata[7] = 0x00; /* TODO: RT actuator */
-			xpad->odata[8] = strong / 256;	/* left actuator */
-			xpad->odata[9] = weak / 256;	/* right actuator */
-			xpad->odata[10] = 0x80;	/* length of pulse */
-			xpad->odata[11] = 0x00;	/* stop period of pulse */
-			xpad->irq_out->transfer_buffer_length = 12;
-
-			return usb_submit_urb(xpad->irq_out, GFP_ATOMIC);
+			item->odata[0] = 0x09; /* activate rumble */
+			item->odata[1] = 0x08;
+			item->odata[2] = 0x00;
+			item->odata[3] = 0x08; /* continuous effect */
+			item->odata[4] = 0x00; /* simple rumble mode */
+			item->odata[5] = 0x03; /* L and R actuator only */
+			item->odata[6] = 0x00; /* TODO: LT actuator */
+			item->odata[7] = 0x00; /* TODO: RT actuator */
+			item->odata[8] = strong / 256;	/* left actuator */
+			item->odata[9] = weak / 256;	/* right actuator */
+			item->odata[10] = 0x80;	/* length of pulse */
+			item->odata[11] = 0x00;	/* stop period of pulse */
+			item->transfer_length = 12;
+
+			return xpad_add_and_submit_urb(xpad, item);
 
 		default:
 			dev_dbg(&xpad->dev->dev,
@@ -910,36 +1022,39 @@ struct xpad_led {
  */
 static void xpad_send_led_command(struct usb_xpad *xpad, int command)
 {
-	command %= 16;
+	struct xpad_queue_item *item;
 
-	mutex_lock(&xpad->odata_mutex);
+	item = kzalloc(sizeof(*item), GFP_KERNEL);
+	if (!item)
+		return;
+
+	command %= 16;
 
 	switch (xpad->xtype) {
 	case XTYPE_XBOX360:
-		xpad->odata[0] = 0x01;
-		xpad->odata[1] = 0x03;
-		xpad->odata[2] = command;
-		xpad->irq_out->transfer_buffer_length = 3;
+		item->odata[0] = 0x01;
+		item->odata[1] = 0x03;
+		item->odata[2] = command;
+		item->transfer_length = 3;
 		break;
 	case XTYPE_XBOX360W:
-		xpad->odata[0] = 0x00;
-		xpad->odata[1] = 0x00;
-		xpad->odata[2] = 0x08;
-		xpad->odata[3] = 0x40 + command;
-		xpad->odata[4] = 0x00;
-		xpad->odata[5] = 0x00;
-		xpad->odata[6] = 0x00;
-		xpad->odata[7] = 0x00;
-		xpad->odata[8] = 0x00;
-		xpad->odata[9] = 0x00;
-		xpad->odata[10] = 0x00;
-		xpad->odata[11] = 0x00;
-		xpad->irq_out->transfer_buffer_length = 12;
+		item->odata[0] = 0x00;
+		item->odata[1] = 0x00;
+		item->odata[2] = 0x08;
+		item->odata[3] = 0x40 + command;
+		item->odata[4] = 0x00;
+		item->odata[5] = 0x00;
+		item->odata[6] = 0x00;
+		item->odata[7] = 0x00;
+		item->odata[8] = 0x00;
+		item->odata[9] = 0x00;
+		item->odata[10] = 0x00;
+		item->odata[11] = 0x00;
+		item->transfer_length = 12;
 		break;
 	}
 
-	usb_submit_urb(xpad->irq_out, GFP_KERNEL);
-	mutex_unlock(&xpad->odata_mutex);
+	xpad_add_and_submit_urb(xpad, item);
 }
 
 static void xpad_identify_controller(struct usb_xpad *xpad)
