1. 26 3月, 2013 7 次提交
    • A
      USB: EHCI: remove unused variable in unlink_empty_async() · afc2c9a2
      Alan Stern 提交于
      This patch (as1669) removes the check_unlinks_later flag in ehci-hcd's
      unlink_empty_async().  It wasn't being used for anything and should
      have been removed in an earlier patch, but I forgot about it.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      afc2c9a2
    • A
      USB: EHCI: improve end_unlink_async() · 214ac7a0
      Alan Stern 提交于
      This patch (as1665) changes the way ehci-hcd's end_unlink_async()
      routine works in order to avoid recursive execution and to be more
      efficient:
      
      	Now when an IAA cycle ends, a new one gets started up right
      	away (if it is needed) instead of waiting until the
      	just-unlinked QH has been processed.
      
      	The async_iaa list is renamed to async_idle, which better
      	expresses its new purpose: It is now the list of QHs which are
      	now completely idle and are waiting to be processed by
      	end_unlink_async().
      
      	A new flag is added to track whether an IAA cycle is in
      	progress, because the list formerly known as async_iaa no
      	longer stores the QHs waiting for the IAA to finish.
      
      	The decision about how many QHs to process when an IAA cycle
      	ends is now made at the end of the cycle, when we know the
      	current state of the hardware, rather than at the beginning.
      	This means a bunch of logic got moved from start_iaa_cycle()
      	to end_unlink_async().
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      214ac7a0
    • A
      USB: EHCI: convert singly-linked lists to list_heads · 6e018751
      Alan Stern 提交于
      This patch (as1664) converts ehci-hcd's async_unlink, async_iaa, and
      intr_unlink from singly-linked lists to standard doubly-linked
      list_heads.  Originally it didn't seem necessary to use list_heads,
      because items are always added to and removed from these lists in FIFO
      order.  But now with more list processing going on, it's easier to use
      the standard routines than continue with a roll-your-own approach.
      
      I don't know if the code ends up being notably shorter, but the
      patterns will be more familiar to any kernel hacker.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6e018751
    • A
      USB: EHCI: consolidate code in ehci_urb_dequeue() · 7655e316
      Alan Stern 提交于
      This patch (as1668) consolidates two nearly identical code paths in
      ehci_urb_dequeue().  The test for !qh can be removed because it will
      never succeed; the fact that usb_hcd_check_unlink_urb() returned 0
      means that urb must be queued and therefore urb->hcpriv must point to
      a QH.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7655e316
    • A
      USB: EHCI: split needs_rescan into two flags · 7bc782d7
      Alan Stern 提交于
      This patch (as1662) does some more QH-related cleanup in ehci-hcd.
      The qh->needs_rescan flag is currently used for two different
      purposes; the patch replaces it with two separate flags for greater
      clarity: qh->dequeue_during_giveback indicates that a completion
      handler dequeued an URB (implying that a rescan is needed), and
      qh->exception indicates that the QH is in an exceptional state
      requiring an unlink (either it encountered an I/O error or an unlink
      was requested).
      
      The new flags get set where the dequeue, exception, or unlink request
      occurred, rather than where the unlink is started.  This is so that in
      the future, if we need to, we will be able to tell apart unlinks that
      truly were required from those that were carried out merely because
      the QH wasn't being used.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7bc782d7
    • A
      USB: EHCI: change return value of qh_completions() · 79bcf7b0
      Alan Stern 提交于
      This patch (as1658) cleans up the usage of qh_completions() in
      ehci-hcd.  Currently the function's return value indicates whether any
      URBs were given back; the idea was that the caller can scan the QH
      over again to handle any URBs that were dequeued by a completion
      handler.  This is not necessary; when qh_completions() is ready to
      give back dequeued URBs, it does its own rescanning.
      
      Therefore the new return value will be a flag indicating whether the
      caller needs to unlink the QH.  This is more convenient than forcing
      the caller to check qh->needs_rescan, and it makes a lot more sense --
      why should "needs_rescan" imply that an unlink is needed?  The callers
      are also changed to remove the unneeded rescans.
      
      Lastly, the check for whether qh->qtd_list is non-empty is removed
      from the start of qh_completions().  Two of the callers have to make
      this test anyway, so the same test can simply be added to the other
      two callers.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      79bcf7b0
    • A
      USB: EHCI: changes related to qh_refresh() · c1fdb68e
      Alan Stern 提交于
      This patch (as1638) makes several changes to the ehci-hcd driver, all
      related to the qh_refresh() function.  This function must be called
      whenever an idle QH gets linked back into either the async or the
      periodic schedule.
      
      	Change a BUG_ON() in the qh_update routine to a WARN_ON().
      	Since this code runs in atomic context, a BUG_ON() would
      	immediately freeze the whole system.
      
      	Remove two unneeded calls to qh_refresh(), one when a QH is
      	initialized and one when a QH becomes idle.  Adjust the
      	adjacent comments accordingly.
      
      	Move the qh_refresh() and qh_link_periodic() calls for new
      	interrupt URBs to after the new TDs have been added.
      
      	As a result of the previous two changes, qh_refresh() is never
      	called when the qtd_list is empty.  The corresponding check in
      	qh_refresh() can be removed, along with an indentation level.
      
      These changes should not cause any alteration of behavior.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c1fdb68e
  2. 22 3月, 2013 1 次提交
  3. 21 3月, 2013 1 次提交
    • A
      USB: EHCI: fix regression in QH unlinking · d714aaf6
      Alan Stern 提交于
      This patch (as1670) fixes a regression caused by commit
      6402c796 (USB: EHCI: work around
      silicon bug in Intel's EHCI controllers).  The workaround goes through
      two IAA cycles for each QH being unlinked.  During the first cycle,
      the QH is not added to the async_iaa list (because it isn't fully gone
      from the hardware yet), which means that list will be empty.
      
      Unfortunately, I forgot to update the IAA watchdog timer routine.  It
      thinks that an empty async_iaa list means the timer expiration was an
      error, which isn't true any more.  This problem didn't show up during
      initial testing because the controllers being tested all had working
      IAA interrupts.  But not all controllers do, and when the watchdog
      timer expires, the empty-list check prevents the second IAA cycle from
      starting.  As a result, URB unlinks never complete.  The check needs
      to be removed.
      
      Among the symptoms of the regression are processes stuck in D wait
      states and hangs during system shutdown.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Reported-and-tested-by: NStephen Warren <swarren@wwwdotorg.org>
      Reported-and-tested-by: NSven Joachim <svenjoac@gmx.de>
      Reported-by: NAndreas Bombe <aeb@debian.org>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d714aaf6
  4. 19 3月, 2013 5 次提交
  5. 18 3月, 2013 1 次提交
    • D
      USB: xhci - fix bit definitions for IMAN register · f8264340
      Dmitry Torokhov 提交于
      According to XHCI specification (5.5.2.1) the IP is bit 0 and IE is bit 1
      of IMAN register. Previously their definitions were reversed.
      
      Even though there are no ill effects being observed from the swapped
      definitions (because IMAN_IP is RW1C and in legacy PCI case we come in
      with it already set to 1 so it was clearing itself even though we were
      setting IMAN_IE instead of IMAN_IP), we should still correct the values.
      
      This patch should be backported to kernels as old as 2.6.36, that
      contain the commit 4e833c0b "xhci: don't
      re-enable IE constantly".
      Signed-off-by: NDmitry Torokhov <dtor@vmware.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Cc: stable@vger.kernel.org
      f8264340
  6. 16 3月, 2013 19 次提交
  7. 05 3月, 2013 2 次提交
    • A
      USB: EHCI: don't check DMA values in QH overlays · feca7746
      Alan Stern 提交于
      This patch (as1661) fixes a rather obscure bug in ehci-hcd.  In a
      couple of places, the driver compares the DMA address stored in a QH's
      overlay region with the address of a particular qTD, in order to see
      whether that qTD is the one currently being processed by the hardware.
      (If it is then the status in the QH's overlay region is more
      up-to-date than the status in the qTD, and if it isn't then the
      overlay's value needs to be adjusted when the QH is added back to the
      active schedule.)
      
      However, DMA address in the overlay region isn't always valid.  It
      sometimes will contain a stale value, which may happen by coincidence
      to be equal to a qTD's DMA address.  Instead of checking the DMA
      address, we should check whether the overlay region is active and
      valid.  The patch tests the ACTIVE bit in the overlay, and clears this
      bit when the overlay becomes invalid (which happens when the
      currently-executing URB is unlinked).
      
      This is the second part of a fix for the regression reported at:
      
      	https://bugs.launchpad.net/bugs/1088733Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Reported-by: NJoseph Salisbury <joseph.salisbury@canonical.com>
      Reported-and-tested-by: NStephen Thirlwall <sdt@dr.com>
      CC: <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      feca7746
    • A
      USB: EHCI: work around silicon bug in Intel's EHCI controllers · 6402c796
      Alan Stern 提交于
      This patch (as1660) works around a hardware problem present in some
      (if not all) Intel EHCI controllers.  After a QH has been unlinked
      from the async schedule and the corresponding IAA interrupt has
      occurred, the controller is not supposed access the QH and its qTDs.
      There certainly shouldn't be any more DMA writes to those structures.
      Nevertheless, Intel's controllers have been observed to perform a
      final writeback to the QH's overlay region and to the most recent qTD.
      For more information and a test program to determine whether this
      problem is present in a particular controller, see
      
      	http://marc.info/?l=linux-usb&m=135492071812265&w=2
      	http://marc.info/?l=linux-usb&m=136182570800963&w=2
      
      This patch works around the problem by always waiting for two IAA
      cycles when unlinking an async QH.  The extra IAA delay gives the
      controller time to perform its final writeback.
      
      Surprisingly enough, the effects of this silicon bug have gone
      undetected until quite recently.  More through luck than anything
      else, it hasn't caused any apparent problems.  However, it does
      interact badly with the path that follows this one, so it needs to be
      addressed.
      
      This is the first part of a fix for the regression reported at:
      
      	https://bugs.launchpad.net/bugs/1088733Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Tested-by: NStephen Thirlwall <sdt@dr.com>
      CC: <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6402c796
  8. 27 2月, 2013 1 次提交
    • A
      USB: EHCI: revert "remove ASS/PSS polling timeout" · 221f8dfc
      Alan Stern 提交于
      This patch (as1649) reverts commit
      55bcdce8 (USB: EHCI: remove ASS/PSS
      polling timeout).  That commit was written under the assumption that
      some controllers may take a very long time to turn off their async and
      periodic schedules.  It now appears that in fact the schedules do get
      turned off reasonably quickly, but some controllers occasionally leave
      the schedules' status bits turned on and consequently ehci-hcd can't
      tell that the schedules are off.
      
      VIA controllers in particular have this problem.  ehci-hcd tells the
      hardware to turn off the async schedule, the schedule does get turned
      off, but the status bit remains on.  Since the EHCI spec requires that
      the schedules not be re-enabled until the previous disable has taken
      effect, with an unlimited timeout the async schedule never gets turned
      back on.  The resulting symptom is that the system is unable to
      communicate with USB devices.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Reported-and-tested-by: NRonald <ronald645@gmail.com>
      Reported-and-tested-by: NPaul Hartman <paul.hartman@gmail.com>
      Reported-and-tested-by: NDieter Nützel <dieter@nuetzel-hh.de>
      Reported-and-tested-by: NJean Delvare <khali@linux-fr.org>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      221f8dfc
  9. 21 2月, 2013 3 次提交