diff options
author | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2009-05-14 14:44:22 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-06-16 00:44:51 -0400 |
commit | f88ba78d9ac0e1f583da4cada80b8816ca761a3f (patch) | |
tree | e02af0c83817517c2c5ba20c3cf9335b2f4ab9a9 /drivers/usb/host/xhci.h | |
parent | a4d88302268d1e458f7c6eb7855f1ba4b3a7cffc (diff) |
USB: xhci: Respect critical sections.
Narrow down time spent holding the xHCI spinlock so that it's only used to
protect the xHCI rings, not as mutual exclusion. Stop allocating memory
while holding the spinlock and calling xhci_alloc_virt_device() and
xhci_endpoint_init().
The USB core should have locking in it to prevent device state to be
manipulated by more than one kernel thread. E.g. you can't free a device
while you're in the middle of setting a new configuration. So removing
the locks from the sections where xhci_alloc_dev() and
xhci_reset_bandwidth() touch xHCI's representation of the device should be
OK.
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/xhci.h')
-rw-r--r-- | drivers/usb/host/xhci.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 3e8e09c4c2bf..8936eeb5588b 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
@@ -1101,7 +1101,9 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud | |||
1101 | unsigned int xhci_get_endpoint_index(struct usb_endpoint_descriptor *desc); | 1101 | unsigned int xhci_get_endpoint_index(struct usb_endpoint_descriptor *desc); |
1102 | unsigned int xhci_get_endpoint_flag(struct usb_endpoint_descriptor *desc); | 1102 | unsigned int xhci_get_endpoint_flag(struct usb_endpoint_descriptor *desc); |
1103 | void xhci_endpoint_zero(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_host_endpoint *ep); | 1103 | void xhci_endpoint_zero(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_host_endpoint *ep); |
1104 | int xhci_endpoint_init(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, struct usb_device *udev, struct usb_host_endpoint *ep); | 1104 | int xhci_endpoint_init(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev, |
1105 | struct usb_device *udev, struct usb_host_endpoint *ep, | ||
1106 | gfp_t mem_flags); | ||
1105 | void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring); | 1107 | void xhci_ring_free(struct xhci_hcd *xhci, struct xhci_ring *ring); |
1106 | 1108 | ||
1107 | #ifdef CONFIG_PCI | 1109 | #ifdef CONFIG_PCI |