On Tue, 2013-08-13 at 11:40 -0500, Thomas Pugliese wrote: > static void wa_xfer_result_chew(struct wahc *wa, struct wa_xfer > *xfer) > { > @@ -1488,17 +1532,38 @@ error_submit_buf_in: > seg->result = result; > kfree(wa->buf_in_urb->sg); > error_sg_alloc: > + __wa_xfer_abort(xfer); > error_complete: > seg->status = WA_SEG_ERROR; > xfer->segs_done++; > rpipe_ready = rpipe_avail_inc(rpipe); > - __wa_xfer_abort(xfer); > done = __wa_xfer_is_done(xfer); > - spin_unlock_irqrestore(&xfer->lock, flags); > - if (done) > - wa_xfer_completion(xfer); > - if (rpipe_ready) > - wa_xfer_delayed_run(rpipe); > + /* > + * queue work item to clear STALL for control endpoints. > + * Otherwise, let endpoint_reset take care of it. > + */ > + if (((usb_status & 0x3f) == WA_XFER_STATUS_HALTED) && > + usb_endpoint_xfer_control(&xfer->ep->desc) && > + done) { > + unsigned long flags2; > + > + dev_info(dev, "Control EP stall. Queue delayed > work.\n"); > + spin_lock_irqsave(&wa->xfer_list_lock, flags2); > + /* remove xfer from xfer_list. */ > + list_del(&xfer->list_node); > + /* add xfer to xfer_errored_list. */ > + list_add_tail(&xfer->list_node, > &wa->xfer_errored_list); > + spin_unlock_irqrestore(&wa->xfer_list_lock, flags2); > + spin_unlock_irqrestore(&xfer->lock, flags); Hi, there is no use in taking irqsave spinlocks in a nested manner. Just do: spin_lock_irqsave() spin_lock() spin_unlock() spin_unlock_irqrestore() Regards Oliver -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html