Skip to content

Commit

Permalink
[PATCH] USB core and HCDs: don't put_device while atomic
Browse files Browse the repository at this point in the history
This patch (as640) removes several put_device and the corresponding
get_device calls from the USB core and HCDs.  Some of the puts were done
in atomic contexts, and none of them are needed since the core now
guarantees that every endpoint will be disabled and every URB completed
before a USB device is released.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: David Brownell <david-b@pacbell.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Alan Stern authored and Greg Kroah-Hartman committed Mar 20, 2006
1 parent 1393adb commit 6a8e87b
Show file tree
Hide file tree
Showing 7 changed files with 5 additions and 14 deletions.
2 changes: 0 additions & 2 deletions drivers/usb/core/hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1105,7 +1105,6 @@ static void urb_unlink (struct urb *urb)
spin_lock_irqsave (&hcd_data_lock, flags);
list_del_init (&urb->urb_list);
spin_unlock_irqrestore (&hcd_data_lock, flags);
usb_put_dev (urb->dev);
}


Expand Down Expand Up @@ -1145,7 +1144,6 @@ static int hcd_submit_urb (struct urb *urb, gfp_t mem_flags)
case HC_STATE_RUNNING:
case HC_STATE_RESUMING:
doit:
usb_get_dev (urb->dev);
list_add_tail (&urb->urb_list, &ep->urb_list);
status = 0;
break;
Expand Down
1 change: 0 additions & 1 deletion drivers/usb/host/ehci-mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ static void qh_destroy (struct kref *kref)
}
if (qh->dummy)
ehci_qtd_free (ehci, qh->dummy);
usb_put_dev (qh->dev);
dma_pool_free (ehci->qh_pool, qh, qh->qh_dma);
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/usb/host/ehci-q.c
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,7 @@ qh_make (
}

/* support for tt scheduling, and access to toggles */
qh->dev = usb_get_dev (urb->dev);
qh->dev = urb->dev;

/* using TT? */
switch (urb->dev->speed) {
Expand Down
6 changes: 2 additions & 4 deletions drivers/usb/host/ehci-sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -1399,7 +1399,7 @@ itd_complete (
*/

/* give urb back to the driver ... can be out-of-order */
dev = usb_get_dev (urb->dev);
dev = urb->dev;
ehci_urb_done (ehci, urb, regs);
urb = NULL;

Expand All @@ -1418,7 +1418,6 @@ itd_complete (
(stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
}
iso_stream_put (ehci, stream);
usb_put_dev (dev);

return 1;
}
Expand Down Expand Up @@ -1765,7 +1764,7 @@ sitd_complete (
*/

/* give urb back to the driver */
dev = usb_get_dev (urb->dev);
dev = urb->dev;
ehci_urb_done (ehci, urb, regs);
urb = NULL;

Expand All @@ -1784,7 +1783,6 @@ sitd_complete (
(stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
}
iso_stream_put (ehci, stream);
usb_put_dev (dev);

return 1;
}
Expand Down
3 changes: 1 addition & 2 deletions drivers/usb/host/isp116x-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -724,7 +724,7 @@ static int isp116x_urb_enqueue(struct usb_hcd *hcd,
ep = hep->hcpriv;
else {
INIT_LIST_HEAD(&ep->schedule);
ep->udev = usb_get_dev(udev);
ep->udev = udev;
ep->epnum = epnum;
ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
usb_settoggle(udev, epnum, is_out, 0);
Expand Down Expand Up @@ -891,7 +891,6 @@ static void isp116x_endpoint_disable(struct usb_hcd *hcd,
if (!list_empty(&hep->urb_list))
WARN("ep %p not empty?\n", ep);

usb_put_dev(ep->udev);
kfree(ep);
hep->hcpriv = NULL;
}
Expand Down
3 changes: 1 addition & 2 deletions drivers/usb/host/sl811-hcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -853,7 +853,7 @@ static int sl811h_urb_enqueue(

} else {
INIT_LIST_HEAD(&ep->schedule);
ep->udev = usb_get_dev(udev);
ep->udev = udev;
ep->epnum = epnum;
ep->maxpacket = usb_maxpacket(udev, urb->pipe, is_out);
ep->defctrl = SL11H_HCTLMASK_ARM | SL11H_HCTLMASK_ENABLE;
Expand Down Expand Up @@ -1052,7 +1052,6 @@ sl811h_endpoint_disable(struct usb_hcd *hcd, struct usb_host_endpoint *hep)
if (!list_empty(&hep->urb_list))
WARN("ep %p not empty?\n", ep);

usb_put_dev(ep->udev);
kfree(ep);
hep->hcpriv = NULL;
}
Expand Down
2 changes: 0 additions & 2 deletions drivers/usb/host/uhci-q.c
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,6 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci,
qh->hep = hep;
qh->udev = udev;
hep->hcpriv = qh;
usb_get_dev(udev);

} else { /* Skeleton QH */
qh->state = QH_STATE_ACTIVE;
Expand All @@ -197,7 +196,6 @@ static void uhci_free_qh(struct uhci_hcd *uhci, struct uhci_qh *qh)
list_del(&qh->node);
if (qh->udev) {
qh->hep->hcpriv = NULL;
usb_put_dev(qh->udev);
uhci_free_td(uhci, qh->dummy_td);
}
dma_pool_free(uhci->qh_pool, qh, qh->dma_handle);
Expand Down

0 comments on commit 6a8e87b

Please sign in to comment.