1. 24 9月, 2014 2 次提交
  2. 11 9月, 2014 1 次提交
  3. 28 8月, 2014 1 次提交
  4. 27 8月, 2014 1 次提交
  5. 20 8月, 2014 2 次提交
  6. 19 7月, 2014 2 次提交
    • P
      USB: Fix persist resume of some SS USB devices · a40178b2
      Pratyush Anand 提交于
      Problem Summary: Problem has been observed generally with PM states
      where VBUS goes off during suspend. There are some SS USB devices which
      take longer time for link training compared to many others.  Such
      devices fail to reconnect with same old address which was associated
      with it before suspend.
      
      When system resumes, at some point of time (dpm_run_callback->
      usb_dev_resume->usb_resume->usb_resume_both->usb_resume_device->
      usb_port_resume) SW reads hub status. If device is present,
      then it finishes port resume and re-enumerates device with same
      address. If device is not present then, SW thinks that device was
      removed during suspend and therefore does logical disconnection
      and removes all the resource allocated for this device.
      
      Now, if I put sufficient delay just before root hub status read in
      usb_resume_device then, SW sees always that device is present. In normal
      course(without any delay) SW sees that no device is present and then SW
      removes all resource associated with the device at this port.  In the
      latter case, after sometime, device says that hey I am here, now host
      enumerates it, but with new address.
      
      Problem had been reproduced when I connect verbatim USB3.0 hard disc
      with my STiH407 XHCI host running with 3.10 kernel.
      
      I see that similar problem has been reported here.
      https://bugzilla.kernel.org/show_bug.cgi?id=53211
      Reading above it seems that bug was not in 3.6.6 and was present in 3.8
      and again it was not present for some in 3.12.6, while it was present
      for few others. I tested with 3.13-FC19 running at i686 desktop, problem
      was still there. However, I was failed to reproduce it with 3.16-RC4
      running at same i686 machine. I would say it is just a random
      observation. Problem for few devices is always there, as I am unable to
      find a proper fix for the issue.
      
      So, now question is what should be the amount of delay so that host is
      always able to recognize suspended device after resume.
      
      XHCI specs 4.19.4 says that when Link training is successful, port sets
      CSC bit to 1. So if SW reads port status before successful link
      training, then it will not find device to be present.  USB Analyzer log
      with such buggy devices show that in some cases device switch on the
      RX termination after long delay of host enabling the VBUS. In few other
      cases it has been seen that device fails to negotiate link training in
      first attempt. It has been reported till now that few devices take as
      long as 2000 ms to train the link after host enabling its VBUS and
      RX termination. This patch implements a 2000 ms timeout for CSC bit to set
      ie for link training. If in a case link trains before timeout, loop will
      exit earlier.
      
      This patch implements above delay, but only for SS device and when
      persist is enabled.
      
      So, for the good device overhead is almost none. While for the bad
      devices penalty could be the time which it take for link training.
      But, If a device was connected before suspend, and was removed
      while system was asleep, then the penalty would be the timeout ie
      2000 ms.
      
      Results:
      
      Verbatim USB SS hard disk connected with STiH407 USB host running 3.10
      Kernel resumes in 461 msecs without this patch, but hard disk is
      assigned a new device address. Same system resumes in 790 msecs with
      this patch, but with old device address.
      
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NPratyush Anand <pratyush.anand@st.com>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a40178b2
    • O
      usbcore: don't log on consecutive debounce failures of the same port · 5ee0f803
      Oliver Neukum 提交于
      Some laptops have an internal port for a BT device which picks
      up noise when the kill switch is used, but not enough to trigger
      printk_rlimit(). So we shouldn't log consecutive faults of this kind.
      Signed-off-by: NOliver Neukum <oneukum@suse.de>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5ee0f803
  7. 18 7月, 2014 1 次提交
    • G
      usb: Check if port status is equal to RxDetect · bb86cf56
      Gavin Guo 提交于
      When using USB 3.0 pen drive with the [AMD] FCH USB XHCI Controller
      [1022:7814], the second hotplugging will experience the USB 3.0 pen
      drive is recognized as high-speed device. After bisecting the kernel,
      I found the commit number 41e7e056
      (USB: Allow USB 3.0 ports to be disabled.) causes the bug. After doing
      some experiments, the bug can be fixed by avoiding executing the function
      hub_usb3_port_disable(). Because the port status with [AMD] FCH USB
      XHCI Controlleris [1022:7814] is already in RxDetect
      (I tried printing out the port status before setting to Disabled state),
      it's reasonable to check the port status before really executing
      hub_usb3_port_disable().
      
      Fixes: 41e7e056 (USB: Allow USB 3.0 ports to be disabled.)
      Signed-off-by: NGavin Guo <gavin.guo@canonical.com>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bb86cf56
  8. 10 7月, 2014 2 次提交
    • D
      usb: force warm reset to break link re-connect livelock · 3cd12f91
      Dan Williams 提交于
      Resuming a powered down port sometimes results in the port state being
      stuck in the training sequence.
      
       hub 3-0:1.0: debounce: port 1: total 2000ms stable 0ms status 0x2e0
       port1: can't get reconnection after setting port  power on, status -110
       hub 3-0:1.0: port 1 status 0000.02e0 after resume, -19
       usb 3-1: can't resume, status -19
       hub 3-0:1.0: logical disconnect on port 1
      
      In the case above we wait for the port re-connect timeout of 2 seconds
      and observe that the port status is USB_SS_PORT_LS_POLLING (although it
      is likely toggling between this state and USB_SS_PORT_LS_RX_DETECT).
      This is indicative of a case where the device is failing to progress the
      link training state machine.
      
      It is resolved by issuing a warm reset to get the hub and device link
      state machines back in sync.
      
       hub 3-0:1.0: debounce: port 1: total 2000ms stable 0ms status 0x2e0
       usb usb3: port1 usb_port_runtime_resume requires warm reset
       hub 3-0:1.0: port 1 not warm reset yet, waiting 50ms
       usb 3-1: reset SuperSpeed USB device number 2 using xhci_hcd
      
      After a reconnect timeout when we expect the device to be present, force
      a warm reset of the device.  Note that we can not simply look at the
      link status to determine if a warm reset is required as any of the
      training states USB_SS_PORT_LS_POLLING, USB_SS_PORT_LS_RX_DETECT, or
      USB_SS_PORT_LS_COMP_MOD are valid states that do not indicate the need
      for warm reset by themselves.
      
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Cc: Kukjin Kim <kgene.kim@samsung.com>
      Cc: Vincent Palatin <vpalatin@chromium.org>
      Cc: Lan Tianyu <tianyu.lan@intel.com>
      Cc: Ksenia Ragiadakou <burzalodowa@gmail.com>
      Cc: Vivek Gautam <gautam.vivek@samsung.com>
      Cc: Douglas Anderson <dianders@chromium.org>
      Cc: Felipe Balbi <balbi@ti.com>
      Cc: Sunil Joshi <joshi@samsung.com>
      Cc: Hans de Goede <hdegoede@redhat.com>
      Acked-by: NJulius Werner <jwerner@chromium.org>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      3cd12f91
    • P
      usb: allow lpm (en/dis)able only if device is atleast in default state · 51df62ff
      Pratyush Anand 提交于
      When a USB device is disconnected, usb_unbind_interface is called, which
      tries to enable and disable LPM. usb_enable_lpm also try to send a
      control command SET SEL to the device.
      Since device is already disconnected, therefore it does not make sense
      to execute usb_(en/dis)able_lpm.
      This patch returns from usb_(en/dis)able_lpm, if device was not in
      default state atleast.
      Signed-off-by: NPratyush Anand <pratyush.anand@st.com>
      Tested-by: NAymen Bouattay <aymen.bouattay@st.com>
      Signed-off-by: NMathias Nyman <mathias.nyman@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      51df62ff
  9. 18 6月, 2014 3 次提交
  10. 03 6月, 2014 1 次提交
  11. 28 5月, 2014 13 次提交
    • D
      usb: resume child device when port is powered on · 7027df36
      Dan Williams 提交于
      Unconditionally wake up the child device when the power session is
      recovered.
      
      This addresses the following scenarios:
      
      1/ The device may need a reset on power-session loss, without this
         change port power-on recovery exposes khubd to scenarios that
         usb_port_resume() is set to handle.  Prior to port power control the
         only time a power session would be lost is during dpm_suspend of the
         hub.  In that scenario usb_port_resume() is guaranteed to be called
         prior to khubd running for that port.  With this change we wakeup the
         child device as soon as possible (prior to khubd running again for this
         port).
      
         Although khubd has facilities to wake a child device it will only do
         so if the portstatus / portchange indicates a suspend state.  In the
         case of port power control we are not coming from a hub-port-suspend
         state.  This implementation simply uses pm_request_resume() to wake the
         device and relies on the port_dev->status_lock to prevent any collisions
         between khubd and usb_port_resume().
      
      2/ This mechanism rate limits port power toggling.  The minimum port
         power on/off period is now gated by the child device suspend/resume
         latency.  Empirically this mitigates devices downgrading their connection
         on perceived instability of the host connection.  This ratelimiting is
         really only relevant to port power control testing, but it is a nice
         side effect of closing the above race.  Namely, the race of khubd for
         the given port running while a usb_port_resume() event is pending.
      
      3/ Going forward we are finding that power-session recovery requires
         warm-resets (http://marc.info/?t=138659232900003&r=1&w=2).  This
         mechanism allows for warm-resets to be requested at the same point in
         the resume path for hub dpm_suspend power session losses, or port
         rpm_suspend power session losses.
      
      4/ If the device *was* disconnected the only time we'll know for sure is
         after a failed resume, so it's necessary for usb_port_runtime_resume()
         to expedite a usb_port_resume() to clean up the removed device.  The
         reasoning for this is "least surprise" for the user. Turning on a port
         means that hotplug detection is again enabled for the port, it is
         surprising that devices that were removed while the port was off are not
         disconnected until they are attempted to be used.  As a user "why would
         I try to use a device I removed from the system?"
      
      1, 2, and 4 are not a problem in the system dpm_resume() case because,
      although the power-session is lost, khubd is frozen until after device
      resume.  For the rpm_resume() case pm_request_resume() is used to
      request re-validation of the device, and if it happens to collide with a
      khubd run we rely on the port_dev->status_lock to synchronize those
      operations.
      
      Besides testing, the primary scenario where this mechanism is expected
      to be triggered is when the user changes the port power policy
      (control/pm_qos_no_poweroff, or power/control).   Each time power is
      enabled want to revalidate the child device, where the revalidation is
      handled by usb_port_resume().
      
      Given that this arranges for port_dev->child to be de-referenced in
      usb_port_runtime_resume() we need to make sure not to collide with
      usb_disconnect() that frees the usb_device.  To this end we hold the
      port active with the "child_usage" reference across the disconnect
      event.  Subsequently, the need to access hub->child_usage_bits lead to
      the creation of hub_disconnect_children() to remove any ambiguity of
      which "hub" is being acted on in usb_disconnect() (prompted-by sharp
      eyes from Alan).
      
      Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7027df36
    • D
      usb: hub_handle_remote_wakeup() depends on CONFIG_PM_RUNTIME=y · 7e73be22
      Dan Williams 提交于
      Per Alan:
      "You mean from within hub_handle_remote_wakeup()?  That routine will
      never get called if CONFIG_PM_RUNTIME isn't enabled, because khubd
      never sees wakeup requests if they arise during system suspend.
      
      In fact, that routine ought to go inside the "#ifdef CONFIG_PM_RUNTIME"
      portion of hub.c, along with the other suspend/resume code."
      Suggested-by: NAlan Stern <stern@rowland.harvard.edu>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7e73be22
    • D
      usb: introduce port status lock · 5c79a1e3
      Dan Williams 提交于
      In general we do not want khubd to act on port status changes that are
      the result of in progress resets or USB runtime PM operations.
      Specifically port power control testing has been able to trigger an
      unintended disconnect in hub_port_connect_change(), paraphrasing:
      
      	if ((portstatus & USB_PORT_STAT_CONNECTION) && udev &&
      	    udev->state != USB_STATE_NOTATTACHED) {
      		if (portstatus & USB_PORT_STAT_ENABLE) {
      			/* Nothing to do */
      		} else if (udev->state == USB_STATE_SUSPENDED &&
      				udev->persist_enabled) {
      			...
      		} else {
      			/* Don't resuscitate */;
      		}
      	}
      
      ...by falling to the "Don't resuscitate" path or missing
      USB_PORT_STAT_CONNECTION because usb_port_resume() was in the middle of
      modifying the port status.
      
      So, we want a new lock to hold off khubd for a given port while the
      child device is being suspended, resumed, or reset.  The lock ordering
      rules are now usb_lock_device() => usb_lock_port().  This is mandated by
      the device core which may hold the device_lock on the usb_device before
      invoking usb_port_{suspend|resume} which in turn take the status_lock on
      the usb_port.  We attempt to hold the status_lock for the duration of a
      port_event() run, and drop/re-acquire it when needing to take the
      device_lock.  The lock is also dropped/re-acquired during
      hub_port_reconnect().
      
      This patch also deletes hub->busy_bits as all use cases are now covered
      by port PM runtime synchronization or the port->status_lock and it
      pushes down usb_device_lock() into usb_remote_wakeup().
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      5c79a1e3
    • D
      usb: synchronize port poweroff and khubd · 097a155f
      Dan Williams 提交于
      If a port is powered-off, or in the process of being powered-off, prevent
      khubd from operating on it.  Otherwise, the following sequence of events
      leading to an unintended disconnect may occur:
      
      Events:
      (0) <set pm_qos_no_poweroff to '0' for port1>
      (1) hub 2-2:1.0: hub_resume
      (2) hub 2-2:1.0: port 1: status 0301 change 0000
      (3) hub 2-2:1.0: state 7 ports 4 chg 0002 evt 0000
      (4) hub 2-2:1.0: port 1, power off status 0000, change 0000, 12 Mb/s
      (5) usb 2-2.1: USB disconnect, device number 5
      
      Description:
      (1) hub is resumed before sending a ClearPortFeature request
      (2) hub_activate() notices the port is connected and sets
          hub->change_bits for the port
      (3) hub_events() starts, but at the same time the port suspends
      (4) hub_connect_change() sees the disabled port and triggers disconnect
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      097a155f
    • D
      usb: refactor port handling in hub_events() · af376a46
      Dan Williams 提交于
      In preparation for synchronizing port handling with pm_runtime
      transitions refactor port handling into its own subroutine.
      
      We expect that clearing some status flags will be required regardless of
      the port state, so handle those first and group all non-trivial actions
      at the bottom of the routine.
      
      This also splits off the bottom half of hub_port_connect_change() into
      hub_port_reconnect() in prepartion for introducing a port->status_lock.
      hub_port_reconnect() will expect the port lock to not be held while
      hub_port_connect_change() expects to enter with it held.
      
      Other cleanups include:
      1/ reflowing to 80 columns
      2/ replacing redundant usages of 'hub->hdev' with 'hdev'
      3/ consolidate clearing of ->change_bits() in hub_port_connect_change
      4/ consolidate calls to usb_reset_device
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      af376a46
    • D
      usb: block suspension of superspeed port while hispeed peer is active · 7ad3c470
      Dan Williams 提交于
      ClearPortFeature(PORT_POWER) on a usb3 port places the port in either a
      DSPORT.Powered-off-detect / DSPORT.Powered-off-reset loop, or the
      DSPORT.Powered-off state.  There is no way to ensure that RX
      terminations will persist in this state, so it is possible a device will
      degrade to its usb2 connection.  Prevent this by blocking power-off of a
      usb3 port while its usb2 peer is active, and powering on a usb3 port
      before its usb2 peer.
      
      By default the latency between peer power-on events is 0.  In order for
      the device to not see usb2 active while usb3 is still powering up inject
      the hub recommended power_on_good delay.  In support of satisfying the
      power_on_good delay outside of hub_power_on() refactor the places where
      the delay is consumed to call a new hub_power_on_good_delay() helper.
      
      Finally, because this introduces several new checks for whether a port
      is_superspeed, cache that disctinction at port creation so that we don't
      need to keep looking up the parent hub device.
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      [alan]: add a 'superspeed' flag to the port
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7ad3c470
    • D
      usb: make usb_port flags atomic, rename did_runtime_put to child_usage · d5c3834e
      Dan Williams 提交于
      We want to manipulate ->did_runtime_put in usb_port_runtime_resume(),
      but we don't want that to collide with other updates.  Move usb_port
      flags to new port-bitmap fields in usb_hub. "did_runtime_put" is renamed
      "child_usage_bits" to reflect that it is strictly standing in for the
      fact that usb_devices are not the device_model children of their parent
      port.
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d5c3834e
    • D
      usb: assign default peer ports for root hubs · d8521afe
      Dan Williams 提交于
      Assume that the peer of a superspeed port is the port with the same id
      on the shared_hcd root hub.  This identification scheme is required of
      external hubs by the USB3 spec [1].  However, for root hubs, tier mismatch
      may be in effect [2].  Tier mismatch can only be enumerated via platform
      firmware.  For now, simply perform the nominal association.
      
      A new lock 'usb_port_peer_mutex' is introduced to synchronize port
      device add/remove with peer lookups.  It protects peering against
      changes to hcd->shared_hcd, hcd->self.root_hub, hdev->maxchild, and
      port_dev->child pointers.
      
      [1]: usb 3.1 section 10.3.3
      [2]: xhci 1.1 appendix D
      
      Cc: Alan Stern <stern@rowland.harvard.edu>
      [alan: usb_port_peer_mutex locking scheme]
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d8521afe
    • D
      usb: cleanup setting udev->removable from port_dev->connect_type · a4204ff0
      Dan Williams 提交于
      Once usb-acpi has set the port's connect type the usb_device's
      ->removable attribute can be set in the standard location
      set_usb_port_removable().
      
      This also changes behavior in the case where the firmware says that the
      port connect type is unknown.  In that case just use the default setting
      determined from the hub descriptor.
      
      Note, we no longer pass udev->portnum to acpi_find_child_device() in the
      root hub case since:
      1/ the usb-core sets this to zero
      2/ acpi always expects zero
      ...just pass zero.
      Suggested-by: NAlan Stern <stern@rowland.harvard.edu>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a4204ff0
    • D
      usb: rename usb_port device objects · d99f6b41
      Dan Williams 提交于
      The current port name "portX" is ambiguous.  Before adding more port
      messages rename ports to "<hub-device-name>-portX"
      
      This is an ABI change, but the suspicion is that it will go unnoticed as
      the port power control implementation has been broken since its
      introduction.  If however, someone was relying on the old name we can
      add sysfs links from the old name to the new name.
      
      Additionally, it unifies/simplifies port dev_printk messages and modifies
      instances of:
      	dev_XXX(hub->intfdev, ..."port %d"...
      	dev_XXX(&hdev->dev, ..."port%d"...
      into:
      	dev_XXX(&port_dev->dev, ...
      
      Now that the names are unique usb_port devices it would be nice if they
      could be included in /sys/bus/usb.  However, it turns out that this
      breaks 'lsusb -t'.  For now, create a dummy port driver so that print
      messages are prefixed "usb 1-1-port3" rather than the
      subsystem-ambiguous " 1-1-port3".
      
      Finally, it corrects an odd usage of sscanf("port%d") in usb-acpi.c.
      Suggested-by: NAlan Stern <stern@rowland.harvard.edu>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d99f6b41
    • D
      usb: disable port power control if not supported in wHubCharacteristics · 9262c19d
      Dan Williams 提交于
      A hub indicates whether it supports per-port power control via the
      wHubCharacteristics field in its descriptor.  If it is not supported
      a hub will still emulate ClearPortPower(PORT_POWER) requests by
      stopping the link state machine.  However, since this does not save
      power do not bother suspending.
      
      This also consolidates support checks into a
      hub_is_port_power_switchable() helper.
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      9262c19d
    • A
      USB: mutual exclusion for resetting a hub and power-managing a port · 600856c2
      Alan Stern 提交于
      The USB core doesn't properly handle mutual exclusion between
      resetting a hub and changing the power states of the hub's ports.  We
      need to avoid sending port-power requests to the hub while it is being
      reset, because such requests cannot succeed.
      
      This patch fixes the problem by keeping track of when a reset is in
      progress.  At such times, attempts to suspend (power-off) a port will
      fail immediately with -EBUSY, and calls to usb_port_runtime_resume()
      will update the power_is_on flag and return immediately.  When the
      reset is complete, hub_activate() will automatically restore each port
      to the proper power state.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      600856c2
    • T
      USB: separate usb_address0 mutexes for each bus · 6fecd4f2
      Todd E Brandt 提交于
      This patch creates a separate instance of the usb_address0 mutex for each USB
      bus, and attaches it to the usb_bus device struct. This allows devices on
      separate buses to be enumerated in parallel; saving time.
      
      In the current code, there is a single, global instance of the usb_address0
      mutex which is used for all devices on all buses. This isn't completely
      necessary, as this mutex is only needed to prevent address0 collisions for
      devices on the *same* bus (usb 2.0 spec, sec 4.6.1). This superfluous coverage
      can cause additional delay in system resume on systems with multiple hosts
      (up to several seconds depending on what devices are attached).
      Signed-off-by: NTodd Brandt <todd.e.brandt@linux.intel.com>
      Acked-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6fecd4f2
  12. 24 5月, 2014 1 次提交
    • A
      USB: Avoid runtime suspend loops for HCDs that can't handle suspend/resume · 8ef42ddd
      Alan Stern 提交于
      Not all host controller drivers have bus-suspend and bus-resume
      methods.  When one doesn't, it will cause problems if runtime PM is
      enabled in the kernel.  The PM core will attempt to suspend the
      controller's root hub, the suspend will fail because there is no
      bus-suspend routine, and a -EBUSY error code will be returned to the
      PM core.  This will cause the suspend attempt to be repeated shortly
      thereafter, in a never-ending loop.
      
      Part of the problem is that the original error code -ENOENT gets
      changed to -EBUSY in usb_runtime_suspend(), on the grounds that the PM
      core will interpret -ENOENT as meaning that the root hub has gotten
      into a runtime-PM error state.  While this change is appropriate for
      real USB devices, it's not such a good idea for a root hub.  In fact,
      considering the root hub to be in a runtime-PM error state would not
      be far from the truth.  Therefore this patch updates
      usb_runtime_suspend() so that it adjusts error codes only for
      non-root-hub devices.
      
      Furthermore, the patch attempts to prevent the problem from occurring
      in the first place by not enabling runtime PM by default for root hubs
      whose host controller driver doesn't have bus_suspend and bus_resume
      methods.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Reported-by: NWill Deacon <will.deacon@arm.com>
      Tested-by: NWill Deacon <will.deacon@arm.com>
      CC: <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      8ef42ddd
  13. 20 3月, 2014 1 次提交
    • A
      USB: disable reset-resume when USB_QUIRK_RESET is set · 1d10255c
      Alan Stern 提交于
      The USB_QUIRK_RESET flag indicates that a USB device changes its
      identity in some way when it is reset.  It may lose its firmware, its
      descriptors may change, or it may switch back to a default mode of
      operation.
      
      If a device does this, the kernel needs to avoid resetting it.  Resets
      are likely to fail, or worse, succeed while changing the device's
      state in a way the system can't detect.
      
      This means we should disable the reset-resume mechanism whenever this
      quirk flag is present.  An attempted reset-resume will fail, the
      device will be logically disconnected, and later on the hub driver
      will rediscover and re-enumerate the device.  This will cause the
      appropriate udev events to be generated, so that userspace will have a
      chance to switch the device into its normal operating mode, if
      necessary.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      CC: Oliver Neukum <oliver@neukum.org>
      Reviewed-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      1d10255c
  14. 18 3月, 2014 1 次提交
    • A
      USB: unbind all interfaces before rebinding any · 6aec044c
      Alan Stern 提交于
      When a driver doesn't have pre_reset, post_reset, or reset_resume
      methods, the USB core unbinds that driver when its device undergoes a
      reset or a reset-resume, and then rebinds it afterward.
      
      The existing straightforward implementation can lead to problems,
      because each interface gets unbound and rebound before the next
      interface is handled.  If a driver claims additional interfaces, the
      claim may fail because the old binding instance may still own the
      additional interface when the new instance tries to claim it.
      
      This patch fixes the problem by first unbinding all the interfaces
      that are marked (i.e., their needs_binding flag is set) and then
      rebinding all of them.
      
      The patch also makes the helper functions in driver.c a little more
      uniform and adjusts some out-of-date comments.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Reported-and-tested-by: N"Poulain, Loic" <loic.poulain@intel.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6aec044c
  15. 11 3月, 2014 1 次提交
  16. 09 3月, 2014 1 次提交
  17. 07 3月, 2014 1 次提交
    • T
      usb: don't use PREPARE_DELAYED_WORK · 77fa83cf
      Tejun Heo 提交于
      PREPARE_[DELAYED_]WORK() are being phased out.  They have few users
      and a nasty surprise in terms of reentrancy guarantee as workqueue
      considers work items to be different if they don't have the same work
      function.
      
      usb_hub->init_work is multiplexed with multiple work functions;
      however, the work item is never queued while in-flight, so we can
      simply use INIT_DELAYED_WORK() before each queueing.
      
      It would probably be best to route this with other related updates
      through the workqueue tree.
      
      Lightly tested.
      
      v2: Greg and Alan confirm that the work item is never queued while
          in-flight.  Simply use INIT_DELAYED_WORK().
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Cc: linux-usb@vger.kernel.org
      77fa83cf
  18. 05 3月, 2014 3 次提交
    • H
      usb: Reset USB-3 devices on USB-3 link bounce · a82b76f7
      Hans de Goede 提交于
      On disconnect USB3 protocol ports transit from U0 to SS.Inactive to Rx.Detect,
      on a recoverable error, the port stays in SS.Inactive and we recover from it by
      doing a warm-reset (through usb_device_reset if we have a udev for the port).
      
      If this really is a disconnect we may end up trying the warm-reset anyways,
      since khubd may run before the SS.Inactive to Rx.Detect transition, or it
      may get skipped if the transition to Rx.Detect happens before khubd gets run.
      
      With a loose connector, or in the case which actually led me to debugging this
      bad ACPI firmware toggling Vbus off and on in quick succession, the port
      may transition from Rx.Detect to U0 again before khubd gets run. In this case
      the device state is unknown really, but khubd happily goes into the resuscitate
      an existing device path, and the device driver never gets notified about the
      device state being messed up.
      
      If the above scenario happens with a streams using device, as soon as an urb
      is submitted to an endpoint with streams, the following appears in dmesg:
      
      ERROR Transfer event for disabled endpoint or incorrect stream ring
      @0000000036807420 00000000 00000000 04000000 04078000
      
      Notice how the TRB address is all zeros. I've seen this both on Intel
      Pantherpoint and Nec xhci hosts.
      
      Luckily we can detect the U0 to SS.Inactive to Rx.Detect to U0 all having
      happened before khubd runs case since the C_LINK_STATE bit gets set in the
      portchange bits on the U0 -> SS.Inactive change. This bit will also be set on
      suspend / resume, but then it gets cleared by port_hub_init before khubd runs.
      
      So if the C_LINK_STATE bit is set and a warm-reset is not needed, iow the port
      is not still in SS.Inactive, and the port still has a connection, then the
      device needs to be reset to put it back in a known state.
      
      I've verified that doing the device reset also fixes the transfer event with
      all zeros address issue.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      a82b76f7
    • H
      usb: Clear host_endpoint->streams when implicitly freeing streams · 7a7b562d
      Hans de Goede 提交于
      If streams are still allocated on device-reset or set-interface then the hcd
      code implictly frees the streams. Clear host_endpoint->streams in this case
      so that if a driver later tries to re-allocate them it won't run afoul of the
      device already having streams check in usb_alloc_streams().
      
      Note normally streams still being allocated at reset / set-intf  would be a
      driver bug, but this can happen without it being a driver bug on reset-resume.
      Signed-off-by: NHans de Goede <hdegoede@redhat.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      7a7b562d
    • S
      usb/xhci: Change how we indicate a host supports Link PM. · 25cd2882
      Sarah Sharp 提交于
      The xHCI driver currently uses a USB core internal field,
      udev->lpm_capable, to indicate the xHCI driver knows how to calculate
      the LPM timeout values.  If this value is set for the host controller
      udev, it means Link PM can be enabled for child devices under that host.
      
      Change the code so the xHCI driver isn't mucking with USB core internal
      fields.  Instead, indicate the xHCI driver doesn't support Link PM on
      this host by clearing the U1 and U2 exit latencies in the roothub
      SuperSpeed Extended Capabilities BOS descriptor.
      
      The code to check for the roothub setting U1 and U2 exit latencies to
      zero will also disable LPM for external devices that do that same.  This
      was already effectively done with commit
      ae8963ad "usb: Don't enable LPM if the
      exit latency is zero."  Leave that code in place, so that if a device
      sets one exit latency value to zero, but the other is set to a valid
      value, LPM is only enabled for the U1 or U2 state that had the valid
      value.  This is the same behavior the code had before.
      
      Also, change messages about missing Link PM information from warning
      level to info level.  Only print a warning about the first device that
      doesn't support LPM, to avoid log spam.  Further, cleanup some
      unnecessary line breaks to help people to grep for the error messages.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      25cd2882
  19. 01 3月, 2014 2 次提交