1. 25 May, 2011 4 commits
    • Sarah Sharp's avatar
      xhci: STFU: Don't print event ring dequeue pointer. · 5153b7b3
      Sarah Sharp authored
      Stop printing out the event ring dequeue pointer and status register in
      the operational register set.  The host will report an OK status 99% of
      the time the interrupt handler is called, and usually when it's really
      hosed, a host controller won't even call the interrupt handler.  So the
      line is really useless.
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      5153b7b3
    • Sarah Sharp's avatar
      xhci: STFU: Remove function tracing. · 380032c3
      Sarah Sharp authored
      Remove unnecessary debugging from the xHCI driver.  We don't need to
      know what function we're calling or returning from.  Now I know how to
      use markup-oops.pl to de-mystify stack dumps of crashes.
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      380032c3
    • Sarah Sharp's avatar
      xhci: Don't submit commands when the host is dead. · fe6c6c13
      Sarah Sharp authored
      When the xHCI host controller dies, the USB core may attempt to reset the
      devices to their default configuration before disconnecting them.  This
      causes calls into the xHCI bandwidth allocation functions.  Don't allow
      those functions to submit commands or work on xHCI structures if the host
      controller is marked as dying.
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      fe6c6c13
    • Sarah Sharp's avatar
      xhci: Clear stopped_td when Stop Endpoint command completes. · 0714a57c
      Sarah Sharp authored
      When an URB is cancelled, the xHCI driver issues a Stop Endpoint command
      so that it can manipulate the ring and remove the transfer.  The xHC
      hardware then places a transfer event with the completion code "Stopped"
      or "Stopped Invalid" to let the driver know what TD it was in the middle
      of processing.  This TD and TRB is stored in ep->stopped_td and
      ep->stopped_trb.  These pointers are also used in handling stalled
      endpoints.
      
      By design, the Stop Endpoint command can race with URB completion.  By
      the time the Stop Endpoint command is handled, the URBs to be cancelled
      may have been given back to the driver.  Unfortunately, the stopped_td
      and stopped_trb pointers were not getting cleared in this case.
      
      The USB core unconditionally tries to reset the toggle bits on any
      endpoints when a new alternate interface setting is installed.  When the
      xHCI driver saw that ep->stopped_td was still set from the Stop Endpoint
      command, xhci_reset_endpoint assumed the endpoint was actually stalled,
      and attempted to clean up the endpoint rings.  This would manifest
      itself in a failed Reset Endpoint command and failed Set TR dequeue
      Pointer command after a successful Configure Endpoint command.  It may
      have also been causing driver oops when the stopped_td was accessed.
      
      This patch should be backported to stable kernels since 2.6.31.  Before
      2.6.33, stopped_td was found in the xhci_endpoint_ring, not the
      xhci_virt_ep.
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      0714a57c
  2. 24 May, 2011 7 commits
  3. 23 May, 2011 29 commits