1. 21 5月, 2010 7 次提交
    • M
      USB: add missing "{}" in map_urb_for_dma · f537da68
      Ming Lei 提交于
      Obviously, {} is needed in the branch of
      	"else if (hcd->driver->flags & HCD_LOCAL_MEM)"
      for handling of setup packet mapping.
      Signed-off-by: NMing Lei <tom.leiming@gmail.com>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Cc: stable <stable@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      f537da68
    • M
      USB: Change the scatterlist type in struct urb · 910f8d0c
      Matthew Wilcox 提交于
      Change the type of the URB's 'sg' pointer from a usb_sg_request to
      a scatterlist.  This allows drivers to submit scatter-gather lists
      without using the usb_sg_wait() interface.  It has the added benefit
      of removing the typecasts that were added as part of patch as1368 (and
      slightly decreasing the number of pointer dereferences).
      Signed-off-by: NMatthew Wilcox <willy@linux.intel.com>
      Reviewed-by: NAlan Stern <stern@rowland.harvard.edu>
      Tested-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      910f8d0c
    • A
      USB: remove URB_NO_SETUP_DMA_MAP · 85bcb5ee
      Alan Stern 提交于
      Now that URB_NO_SETUP_DMA_MAP is no longer in use, this patch (as1376)
      removes all references to it.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      85bcb5ee
    • S
      USB: Support for allocating USB 3.0 streams. · eab1cafc
      Sarah Sharp 提交于
      Bulk endpoint streams were added in the USB 3.0 specification.  Streams
      allow a device driver to overload a bulk endpoint so that multiple
      transfers can be queued at once.
      
      The device then decides which transfer it wants to work on first, and can
      queue part of a transfer before it switches to a new stream.  All this
      switching is invisible to the device driver, which just gets a completion
      for the URB.  Drivers that use streams must be able to handle URBs
      completing in a different order than they were submitted to the endpoint.
      
      This requires adding new API to set up xHCI data structures to support
      multiple queues ("stream rings") per endpoint.  Drivers will allocate a
      number of stream IDs before enqueueing URBs to the bulk endpoints of the
      device, and free the stream IDs in their disconnect function.  See
      Documentation/usb/bulk-streams.txt for details.
      
      The new mass storage device class, USB Attached SCSI Protocol (UASP), uses
      these streams API.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      eab1cafc
    • A
      USB: fix usbmon and DMA mapping for scatter-gather URBs · ff9c895f
      Alan Stern 提交于
      This patch (as1368) fixes a rather obscure bug in usbmon: When tracing
      URBs sent by the scatter-gather library, it accesses the data buffers
      while they are still mapped for DMA.
      
      The solution is to move the mapping and unmapping out of the s-g
      library and into the usual place in hcd.c.  This requires the addition
      of new URB flag bits to describe the kind of mapping needed, since we
      have to call dma_map_sg() if the HCD supports native scatter-gather
      operation and dma_map_page() if it doesn't.  The nice thing about
      having the new flags is that they simplify the testing for unmapping.
      
      The patch removes the only caller of usb_buffer_[un]map_sg(), so those
      functions are #if'ed out.  A later patch will remove them entirely.
      
      As a result of this change, urb->sg will be set in situations where
      it wasn't set previously.  Hence the xhci and whci drivers are
      adjusted to test urb->num_sgs instead, which retains its original
      meaning and is nonzero only when the HCD has to handle a scatterlist.
      
      Finally, even when a submission error occurs we don't want to hand
      URBs to usbmon before they are unmapped.  The submission path is
      rearranged so that map_urb_for_dma() is called only for non-root-hub
      URBs and unmap_urb_for_dma() is called immediately after a submission
      error.  This simplifies the error handling.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      CC: <stable@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      
      ff9c895f
    • H
      USB: remove duplicated #include · 45f30e0b
      Huang Weiyi 提交于
      Remove duplicated #include('s) in
        drivers/usb/core/hcd.c
      Signed-off-by: NHuang Weiyi <weiyi.huang@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      45f30e0b
    • E
      USB: make hcd.h public (drivers dependency) · 27729aad
      Eric Lescouet 提交于
      The usbcore headers: hcd.h and hub.h are shared between usbcore,
      HCDs and a couple of other drivers (e.g. USBIP modules).
      So, it makes sense to move them into a more public location and
      to cleanup dependency of those modules on kernel internal headers.
      This patch moves hcd.h from drivers/usb/core into include/linux/usb/
      Signed-of-by: NEric Lescouet <eric@lescouet.org>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      27729aad
  2. 03 3月, 2010 4 次提交
    • A
      USB: fix the idProduct value for USB-3.0 root hubs · cd780694
      Alan Stern 提交于
      This patch (as1346) changes the idProduct value for USB-3.0 root hubs
      from 0x0002 (which we already use for USB-2.0 root hubs) to 0x0003.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Acked-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      CC: stable <stable@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      cd780694
    • A
      USB: convert to the runtime PM framework · 9bbdf1e0
      Alan Stern 提交于
      This patch (as1329) converts the USB stack over to the PM core's
      runtime PM framework.  This involves numerous changes throughout
      usbcore, especially to hub.c and driver.c.  Perhaps the most notable
      change is that CONFIG_USB_SUSPEND now depends on CONFIG_PM_RUNTIME
      instead of CONFIG_PM.
      
      Several fields in the usb_device and usb_interface structures are no
      longer needed.  Some code which used to depend on CONFIG_USB_PM now
      depends on CONFIG_USB_SUSPEND (requiring some rearrangement of header
      files).
      
      The only visible change in behavior should be that following a system
      sleep (resume from RAM or resume from hibernation), autosuspended USB
      devices will be resumed just like everything else.  They won't remain
      suspended.  But if they aren't in use then they will naturally
      autosuspend again in a few seconds.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      9bbdf1e0
    • A
      USB: consolidate remote wakeup routines · 0534d468
      Alan Stern 提交于
      This patch (as1324) makes a small change to the code used for remote
      wakeup of root hubs.  hcd_resume_work() now calls the hub driver's
      remote-wakeup routine instead of implementing its own version.
      
      The patch is complicated by the need to rename remote_wakeup() to
      usb_remote_wakeup(), make it non-static, and declare it in a header
      file.  There's also the additional complication required to make
      everything work when CONFIG_PM isn't set; the do-nothing inline
      routine had to be moved into the header file.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      0534d468
    • S
      USB: Use bInterfaceNumber in bandwidth allocations. · d837e219
      Sarah Sharp 提交于
      USB devices do not have to sort interfaces in their descriptors based on
      the interface number, and they may choose to skip interface numbers.  The
      USB bandwidth allocation code for installing a new configuration assumes
      the for loop variable will match the interface number.  Make it use the
      interface number (bInterfaceNumber) in the descriptor instead.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      d837e219
  3. 21 1月, 2010 1 次提交
    • S
      USB: Fix duplicate sysfs problem after device reset. · 04a723ea
      Sarah Sharp 提交于
      Borislav Petkov reports issues with duplicate sysfs endpoint files after a
      resume from a hibernate.  It turns out that the code to support alternate
      settings under xHCI has issues when a device with a non-default alternate
      setting is reset during the hibernate:
      
      [  427.681810] Restarting tasks ...
      [  427.681995] hub 1-0:1.0: state 7 ports 6 chg 0004 evt 0000
      [  427.682019] usb usb3: usb resume
      [  427.682030] ohci_hcd 0000:00:12.0: wakeup root hub
      [  427.682191] hub 1-0:1.0: port 2, status 0501, change 0000, 480 Mb/s
      [  427.682205] usb 1-2: usb wakeup-resume
      [  427.682226] usb 1-2: finish reset-resume
      [  427.682886] done.
      [  427.734658] ehci_hcd 0000:00:12.2: port 2 high speed
      [  427.734663] ehci_hcd 0000:00:12.2: GetStatus port 2 status 001005 POWER sig=se0 PE CONNECT
      [  427.746682] hub 3-0:1.0: hub_reset_resume
      [  427.746693] hub 3-0:1.0: trying to enable port power on non-switchable hub
      [  427.786715] usb 1-2: reset high speed USB device using ehci_hcd and address 2
      [  427.839653] ehci_hcd 0000:00:12.2: port 2 high speed
      [  427.839666] ehci_hcd 0000:00:12.2: GetStatus port 2 status 001005 POWER sig=se0 PE CONNECT
      [  427.847717] ohci_hcd 0000:00:12.0: GetStatus roothub.portstatus [1] = 0x00010100 CSC PPS
      [  427.915497] hub 1-2:1.0: remove_intf_ep_devs: if: ffff88022f9e8800 ->ep_devs_created: 1
      [  427.915774] hub 1-2:1.0: remove_intf_ep_devs: bNumEndpoints: 1
      [  427.915934] hub 1-2:1.0: if: ffff88022f9e8800: endpoint devs removed.
      [  427.916158] hub 1-2:1.0: create_intf_ep_devs: if: ffff88022f9e8800 ->ep_devs_created: 0, ->unregistering: 0
      [  427.916434] hub 1-2:1.0: create_intf_ep_devs: bNumEndpoints: 1
      [  427.916609]  ep_81: create, parent hub
      [  427.916632] ------------[ cut here ]------------
      [  427.916644] WARNING: at fs/sysfs/dir.c:477 sysfs_add_one+0x82/0x96()
      [  427.916649] Hardware name: System Product Name
      [  427.916653] sysfs: cannot create duplicate filename '/devices/pci0000:00/0000:00:12.2/usb1/1-2/1-2:1.0/ep_81'
      [  427.916658] Modules linked in: binfmt_misc kvm_amd kvm powernow_k8 cpufreq_ondemand cpufreq_powersave cpufreq_userspace freq_table cpufreq_conservative ipv6 vfat fat
      +8250_pnp 8250 pcspkr ohci_hcd serial_core k10temp edac_core
      [  427.916694] Pid: 278, comm: khubd Not tainted 2.6.33-rc2-00187-g08d869aa-dirty #13
      [  427.916699] Call Trace:
      
      The problem is caused by a mismatch between the USB core's view of the
      device state and the USB device and xHCI host's view of the device state.
      
      After the device reset and re-configuration, the device and the xHCI host
      think they are using alternate setting 0 of all interfaces.  However, the
      USB core keeps track of the old state, which may include non-zero
      alternate settings.  It uses intf->cur_altsetting to keep the endpoint
      sysfs files for the old state across the reset.
      
      The bandwidth allocation functions need to know what the xHCI host thinks
      the current alternate settings are, so original patch set
      intf->cur_altsetting to the alternate setting 0.  This caused duplicate
      endpoint files to be created.
      
      The solution is to not set intf->cur_altsetting before calling
      usb_set_interface() in usb_reset_and_verify_device().  Instead, we add a
      new flag to struct usb_interface to tell usb_hcd_alloc_bandwidth() to use
      alternate setting 0 as the currently installed alternate setting.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Tested-by: NBorislav Petkov <petkovbb@googlemail.com>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      04a723ea
  4. 24 12月, 2009 1 次提交
  5. 12 12月, 2009 4 次提交
    • S
      USB: Check bandwidth when switching alt settings. · 3f0479e0
      Sarah Sharp 提交于
      Make the USB core check the bandwidth when switching from one
      interface alternate setting to another.  Also check the bandwidth
      when resetting a configuration (so that alt setting 0 is used).  If
      this check fails, the device's state is unchanged.  If the device
      refuses the new alt setting, re-instate the old alt setting in the
      host controller hardware.
      
      If a USB device doesn't have an alternate interface setting 0, install
      the first alt setting in its descriptors when a new configuration is
      requested, or the device is reset.
      
      Add a mutex per root hub to protect bandwidth operations:
      adding/reseting/changing configurations, and changing alternate interface
      settings.  We want to ensure that the xHCI host controller and the USB
      device are set up for the same configurations and alternate settings.
      There are two (possibly three) steps to do this:
      
       1. The host controller needs to check that bandwidth is available for a
          different setting, by issuing and waiting for a configure endpoint
          command.
       2. Once that returns successfully, a control message is sent to the
          device.
       3. If that fails, the host controller must be notified through another
          configure endpoint command.
      
      The mutex is used to make these three operations seem atomic, to prevent
      another driver from using more bandwidth for a different device while
      we're in the middle of these operations.
      
      While we're touching the bandwidth code, rename usb_hcd_check_bandwidth()
      to usb_hcd_alloc_bandwidth().  This function does more than just check
      that the bandwidth change won't exceed the bus bandwidth; it actually
      changes the bandwidth configuration in the xHCI host controller.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      3f0479e0
    • S
      USB: Refactor code to find alternate interface settings. · 91017f9c
      Sarah Sharp 提交于
      Refactor out the code to find alternate interface settings into
      usb_find_alt_setting().  Print a debugging message and return null if the
      alt setting is not found.
      
      While we're at it, correct a bug in the refactored code.  The interfaces
      in the configuration's interface cache are not necessarily in numerical
      order, so we can't just use the interface number as an array index.  Loop
      through the interface caches, looking for the correct interface.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      91017f9c
    • H
      USB: hcd.c: quiet NULL pointer sparse noise · 576a362a
      H Hartley Sweeten 提交于
      Quiet the following sparse noise:
      
        warning: Using plain integer as NULL pointer
      Signed-off-by: NH Hartley Sweeten <hsweeten@visionengravers.com>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      576a362a
    • L
      USB: Check results of dma_map_single · 85e034fd
      Larry Finger 提交于
      In map_urb_for_dma(), the DMA address returned by dma_map_single()
      is not checked to determine if it is legal. This lack of checking
      contributed to a problem with the libertas wireless driver
      (http://marc.info/?l=linux-wireless&m=125695331205062&w=2). The
      difficulty was not detected until the buffer was unmapped. By this time
      memory corruption had occurred.
      
      The situation is fixed by testing the returned DMA address, and
      returning -EAGAIN if the address is invalid.
      Signed-off-by: NLarry Finger <Larry.Finger@lwfinger.net>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      85e034fd
  6. 23 9月, 2009 1 次提交
  7. 09 7月, 2009 1 次提交
  8. 16 6月, 2009 6 次提交
    • V
      USB: xhci: replace if-elseif-else with switch-case · 7dd19e69
      Viral Mehta 提交于
      Replace if-elseif-else with switch-case
      to keep the code consistent which is semantically same
      
      Switch-case is used here,
      http://www.spinics.net/lists/linux-usb/msg17201.html
      Making consistent at other places in usb/core
      
      Also easier to read and maintain when USB4.0, 5.0, ... comes
      Signed-off-by: NViral Mehta <viral.mehta@einfochips.com>
      Tested-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      7dd19e69
    • S
      USB: Push scatter gather lists down to host controller drivers. · e04748e3
      Sarah Sharp 提交于
      This is the original patch I created before David Vrabel posted a better
      patch (http://marc.info/?l=linux-usb&m=123377477209109&w=2) that does
      basically the same thing.  This patch will get replaced with his
      (modified) patch later.
      
      Allow USB device drivers that use usb_sg_init() and usb_sg_wait() to push
      bulk endpoint scatter gather lists down to the host controller drivers.
      This allows host controller drivers to more efficiently enqueue these
      transfers, and allows the xHCI host controller to better take advantage of
      USB 3.0 "bursts" for bulk endpoints.
      
      This patch currently only enables scatter gather lists for bulk endpoints.
      Other endpoint types that use the usb_sg_* functions will not have their
      scatter gather lists pushed down to the host controller.  For periodic
      endpoints, we want each scatterlist entry to be a separate transfer.
      Eventually, HCDs could parse these scatter-gather lists for periodic
      endpoints also.  For now, we use the old code and call usb_submit_urb()
      for each scatterlist entry.
      
      The caller of usb_sg_init() can request that all bytes in the scatter
      gather list be transferred by passing in a length of zero.  Handle that
      request for a bulk endpoint under xHCI by walking the scatter gather list
      and calculating the length.  We could let the HCD handle a zero length in
      this case, but I'm not sure if the core layers in between will get
      confused by this.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      e04748e3
    • S
      USB: Support for bandwidth allocation. · 79abb1ab
      Sarah Sharp 提交于
      Originally, the USB core had no support for allocating bandwidth when a
      particular configuration or alternate setting for an interface was
      selected.  Instead, the device driver's URB submission would fail if
      there was not enough bandwidth for a periodic endpoint.  Drivers could
      work around this, by using the scatter-gather list API to guarantee
      bandwidth.
      
      This patch adds host controller API to allow the USB core to allocate or
      deallocate bandwidth for an endpoint.  Endpoints are added to or dropped
      from a copy of the current schedule by calling add_endpoint() or
      drop_endpoint(), and then the schedule is atomically evaluated with a
      call to check_bandwidth().  This allows all the endpoints for a new
      configuration or alternate setting to be added at the same time that the
      endpoints from the old configuration or alt setting are dropped.
      
      Endpoints must be added to the schedule before any URBs are submitted to
      them.  The HCD must be allowed to reject a new configuration or alt
      setting before the control transfer is sent to the device requesting the
      change.  It may reject the change because there is not enough bandwidth,
      not enough internal resources (such as memory on an embedded host
      controller), or perhaps even for security reasons in a virtualized
      environment.
      
      If the call to check_bandwidth() fails, the USB core must call
      reset_bandwidth().  This causes the schedule to be reverted back to the
      state it was in just after the last successful check_bandwidth() call.
      
      If the call succeeds, the host controller driver (and hardware) will have
      changed its internal state to match the new configuration or alternate
      setting.  The USB core can then issue a control transfer to the device to
      change the configuration or alt setting.  This allows the core to test new
      configurations or alternate settings before unbinding drivers bound to
      interfaces in the old configuration.
      
      WIP:
      
      The USB core must add endpoints from all interfaces in a configuration
      to the schedule, because a driver may claim that interface at any time.
      A slight optimization might be to add the endpoints to the schedule once
      a driver claims that interface.  FIXME
      
      This patch does not cover changing alternate settings, but it does
      handle a configuration change or de-configuration.  FIXME
      
      The code for managing the schedule is currently HCD specific.  A generic
      scheduling algorithm could be added for host controllers without
      built-in scheduling support.  For now, if a host controller does not
      define the check_bandwidth() function, the call to
      usb_hcd_check_bandwidth() will always succeed.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      79abb1ab
    • S
      USB: Add USB 3.0 roothub support to USB core. · d2e9b4d6
      Sarah Sharp 提交于
      Add USB 3.0 root hub descriptors.  This is a kludge because I reused the old
      USB 2.0 descriptors, instead of using the new USB 3.0 hub descriptors with
      endpoint companion descriptors and other descriptors.  I did this because I
      wasn't ready to add USB 3.0 hub changes to khubd.  For now, a USB 3.0 roothub
      looks like a USB 2.0 roothub, with a higher speed.
      
      USB 3.0 hubs have no transaction translator (TT).
      
      Make USB core debugging handle super speed ports.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      d2e9b4d6
    • S
      USB: Add SuperSpeed to the list of USB device speeds. · 6b403b02
      Sarah Sharp 提交于
      Modify the USB core to handle the new USB 3.0 speed, "SuperSpeed".  This
      is 5.0 Gbps (wire speed).  There are probably more places that check for
      speed that I've missed.
      
      SuperSpeed devices have a 512 byte endpoint 0 max packet size.  This shows
      up as a bMaxPacketSize0 set to 0x09 (see table 9-8 of the USB 3.0 bus
      spec).
      
      xHCI spec says that the xHC can handle intervals up to 2^15 microframes.  That
      might change when real silicon becomes available.
      
      Add FIXME note for SuperSpeed isochronous endpoints.  They can transmit up
      to 16 packets in one "burst" before they wait for an acknowledgment of the
      packets.  They can do up to 3 bursts per microframe (determined by the
      mult value in the endpoint companion descriptor).  The xHCI driver doesn't
      have support for isoc yet, so fix this later.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      6b403b02
    • G
      USB: remove unused usb_host class · 820d7a25
      Greg Kroah-Hartman 提交于
      The usb_host class isn't used for anything anymore (it was used for
      debug files, but they have moved to debugfs a few kernel releases ago),
      so let's delete it before someone accidentally puts a file in it.
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      820d7a25
  9. 18 4月, 2009 1 次提交
    • D
      USB: add reset endpoint operations · 3444b26a
      David Vrabel 提交于
      Wireless USB endpoint state has a sequence number and a current
      window and not just a single toggle bit.  So allow HCDs to provide a
      endpoint_reset method and call this or clear the software toggles as
      required (after a clear halt, set configuration etc.).
      
      usb_settoggle() and friends are then HCD internal and are moved into
      core/hcd.h and all device drivers call usb_reset_endpoint() instead.
      
      If the device endpoint state has been reset (with a clear halt) but
      the host endpoint state has not then subsequent data transfers will
      not complete. The device will only work again after it is reset or
      disconnected.
      Signed-off-by: NDavid Vrabel <david.vrabel@csr.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      3444b26a
  10. 25 3月, 2009 2 次提交
  11. 08 1月, 2009 3 次提交
  12. 30 10月, 2008 1 次提交
    • A
      USB: fix crash when URBs are unlinked after the device is gone · cde217a5
      Alan Stern 提交于
      This patch (as1151) protects usbcore against drivers that try to
      unlink an URB after the URB's device or bus have been removed.  The
      core does not currently check for this, and certain drivers can cause
      a crash if they are running while an HCD is unloaded.
      
      Certainly it would be best to fix the guilty drivers.  But a little
      defensive programming doesn't hurt, especially since it appears that
      quite a few drivers need to be fixed.
      
      The patch prevents the problem by grabbing a reference to the device
      while an unlink is in progress and using a new spinlock to synchronize
      unlinks with device removal.  (There's no need to acquire a reference
      to the bus as well, since the device structure itself keeps a
      reference to the bus.)  In addition, the kerneldoc is updated to
      indicate that URBs should not be unlinked after the disconnect method
      returns.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Cc: stable <stable@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      cde217a5
  13. 18 10月, 2008 1 次提交
  14. 17 10月, 2008 1 次提交
  15. 24 9月, 2008 1 次提交
    • G
      USB: fix hcd interrupt disabling · 83a79820
      Geoff Levand 提交于
      Commit de85422b, 'USB: fix interrupt
      disabling for HCDs with shared interrupt handlers' changed usb_add_hcd()
      to strip IRQF_DISABLED from irqflags prior to calling request_irq()
      with the justification that such a removal was necessary for shared
      interrupts to work properly.  Unfortunately, the change in that commit
      unconditionally removes the IRQF_DISABLED flag, causing problems on
      platforms that don't use a shared interrupt but require IRQF_DISABLED.
      This change adds a check for IRQF_SHARED prior to removing the
      IRQF_DISABLED flag.
      
      Fixes the PS3 system startup hang reported with recent Fedora and
      OpenSUSE kernels.
      
      Note that this problem is hidden when CONFIG_LOCKDEP=y (ps3_defconfig),
      as local_irq_enable_in_hardirq() is defined as a null statement for
      that config.
      
      CC: stable <stable@kernel.org>
      Signed-off-by: NGeoff Levand <geoffrey.levand@am.sony.com>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Cc: Stefan Becker <Stefan.Becker@nokia.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      83a79820
  16. 22 8月, 2008 1 次提交
    • A
      USB: automatically enable RHSC interrupts · b5fb454f
      Alan Stern 提交于
      This patch (as1069c) changes the way OHCI root-hub status-change
      interrupts are enabled.  Currently a special HCD method,
      hub_irq_enable(), is called when the hub driver is finished using a
      root hub.  This approach turns out to be subject to races, resulting
      in unnecessary polling.
      
      The patch does away with the method entirely.  Instead, the driver
      automatically enables the RHSC interrupt when no more status changes
      are present.  This scheme is safe with controllers using
      level-triggered semantics for their interrupt flags.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      b5fb454f
  17. 22 7月, 2008 2 次提交
  18. 07 7月, 2008 1 次提交
  19. 04 7月, 2008 1 次提交
    • S
      USB: fix interrupt disabling for HCDs with shared interrupt handlers · de85422b
      Stefan Becker 提交于
      USB: fix interrupt disabling for HCDs with shared interrupt handlers
      
      As has been discussed several times on LKML, IRQF_SHARED | IRQF_DISABLED
      doesn't work reliably, i.e. a shared interrupt handler CAN'T be certain to
      be called with interrupts disabled. Most USB HCD handlers use IRQF_DISABLED
      and therefore havoc can break out if they share their interrupt with a
      handler that doesn't use it.
      
      On my test machine the yenta_socket interrupt handler (no IRQF_DISABLED)
      was registered before ehci_hcd and one uhci_hcd instance. Therefore all
      usb_hcd_irq() invocations for ehci_hcd and for one uhci_hcd instance
      happened with interrupts enabled. That led to random lockups as USB core
      HCD functions that acquire the same spinlock could be called twice
      from interrupt handlers.
      
      This patch updates usb_hcd_irq() to always disable/restore interrupts.
      usb_add_hcd() will silently remove any IRQF_DISABLED requested from HCD code.
      Signed-off-by: NStefan Becker <stefan.becker@nokia.com>
      Cc: stable <stable@kernel.org>
      Acked-by: NDavid Brownell <david-b@pacbell.net>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      de85422b