1. 25 May, 2011 5 commits
    • Sarah Sharp's avatar
      xhci: STFU: Be quieter during URB submission and completion. · f444ff27
      Sarah Sharp authored
      Unsurprisingly, URBs get submitted and completed a lot in the xHCI
      driver.  If we have to print 10 lines of debug for every URB submitted
      or completed, then that can cause the whole system to stay in the
      interrupt handler too long, and can cause Missed Service completion
      codes for isochronous transfers.
      
      Cut down the debugging in the URB submission and completion paths:
       - Don't squawk about successful transfers, only unsuccessful ones.
       - Only print the number of bytes transferred if this was a short
         transfer.
       - Don't print the endpoint index for successful transfers (will add
         more debug to failed transfers to show endpoint index there later).
       - Stop printing MMIO writes.  This debugging shows up when the endpoint
         doorbell is rung a to start a transfer (basically for every URB).
       - Don't print out the ring enqueue and dequeue pointers
       - Stop printing when we're pointing to a link TRB.
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      f444ff27
    • 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 28 commits