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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html