1. 15 1月, 2011 7 次提交
  2. 12 11月, 2010 1 次提交
    • S
      xhci: Remove excessive printks with shared IRQs. · 241b652f
      Sarah Sharp 提交于
      If the xHCI host controller shares an interrupt line with another device,
      the xHCI driver needs to check if the interrupt was generated by its
      hardware.  Unfortunately, the user will see a ton of "Spurious interrupt."
      lines if the other hardware interrupts often.  Lawrence found his dmesg
      output cluttered with this output when the xHCI host shared an interrupt
      with his i915 hardware.
      
      Remove the warning, as sharing an interrupt is a normal thing.
      
      This should be applied to the 2.6.36 stable tree.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Reported-by: NLawrence Rust <lvr@softsystem.co.uk>
      Cc: stable@kernel.org
      241b652f
  3. 23 10月, 2010 2 次提交
    • A
      USB: xHCI: port remote wakeup implementation · 56192531
      Andiry Xu 提交于
      This commit implements port remote wakeup.
      
      When a port is in U3 state and resume signaling is detected from a device,
      the port transitions to the Resume state, and the xHC generates a Port Status
      Change Event.
      
      For USB3 port, software write a '0' to the PLS field to complete the resume
      signaling. For USB2 port, the resume should be signaling for at least 20ms,
      irq handler set a timer for port remote wakeup, and then finishes process in
      hub_control GetPortStatus.
      
      Some codes are borrowed from EHCI code.
      Signed-off-by: NAndiry Xu <andiry.xu@amd.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      56192531
    • A
      USB: xHCI: port power management implementation · be88fe4f
      Andiry Xu 提交于
      Add software trigger USB device suspend resume function hook.
      Do port suspend & resume in terms of xHCI spec.
      
      Port Suspend:
      Stop all endpoints via Stop Endpoint Command with Suspend (SP) flag set.
      Place individual ports into suspend mode by writing '3' for Port Link State
      (PLS) field into PORTSC register. This can only be done when the port is in
      Enabled state. When writing, the Port Link State Write Strobe (LWS) bit shall
      be set to '1'.
      Allocate an xhci_command and stash it in xhci_virt_device to wait completion for
      the last Stop Endpoint Command.  Use the Suspend bit in TRB to indicate the Stop
      Endpoint Command is for port suspend. Based on Sarah's suggestion.
      
      Port Resume:
      Write '0' in PLS field, device will transition to running state.
      Ring an endpoints' doorbell to restart it.
      
      Ref: USB device remote wake need another patch to implement. For details of
      how USB subsystem do power management, please see:
          Documentation/usb/power-management.txt
      Signed-off-by: NCrane Cai <crane.cai@amd.com>
      Signed-off-by: NLibin Yang <libin.yang@amd.com>
      Signed-off-by: NAndiry Xu <andiry.xu@amd.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      be88fe4f
  4. 24 8月, 2010 2 次提交
  5. 11 8月, 2010 17 次提交
  6. 27 7月, 2010 1 次提交
    • S
      USB: xHCI: Fix another bug in link TRB activation change. · d1dc908a
      Sarah Sharp 提交于
      Commit 6c12db90 also seems to have
      introduced a bug that is triggered when the command ring is about to wrap.
      The inc_enq() function will not have moved the enqueue pointer past the
      link TRB.  It is supposed to be moved past the link TRB in prepare_ring(),
      which should be called before a TD is enqueued.  However, the
      queue_command() function never calls the prepare_ring() function because
      prepare_ring() is only supposed to be used for endpoint rings.  That means
      the enqueue pointer will not be moved past the link TRB, and will get
      overwritten.
      
      The fix is to make queue_command() call prepare_ring() with a fake
      endpoint status (set to running).  Then the enqueue pointer will get moved
      past the link TRB.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      d1dc908a
  7. 30 6月, 2010 1 次提交
    • S
      USB: xHCI: Fix bug in link TRB activation change. · 6cc30d85
      Sarah Sharp 提交于
      Commit 6c12db90 introduced a bug for
      control transfers.  The patch was supposed to change when the link TRBs at
      the end of each ring segment were given to the hardware.  If a transfer
      descriptor (TD) ended just before the link TRB, the code wouldn't give
      back the link TRB to the hardware; instead it would be given back in
      prepare_ring() just before the next TD was enqueued at the top of the
      ring.
      
      Unfortunately, the code relied on checking the chain bit of the TRB to
      determine whether the TD ended just before the link TRB.  It assumed that
      the ring enqueuing code would call prepare_ring() before enqueuing the
      next TD.  However, control transfers are made of multiple TDs, and
      prepare_ring() is only called once before enqueuing two or three TDs.
      
      If the first or second TD of the control transfer ended just before the
      link TRB, then the code in inc_enq() would not move the enqueue pointer
      past the link TRB, and the link TRB would get overwritten.  This would
      cause the xHCI driver to start writing to memory past the ring segment,
      and eventually the system would crash or hang.
      
      The fix is to add a flag to inc_enq() that says whether the caller will
      enqueue more TDs before calling prepare_ring().  If the chain bit is
      cleared (meaning this is the last TRB in a TD), and the caller will not
      enqueue more TDs, then we defer giving back the link TRB.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Cc: stable <stable@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      6cc30d85
  8. 05 6月, 2010 1 次提交
    • S
      USB: xhci: Print NEC firmware version. · 0238634d
      Sarah Sharp 提交于
      The NEC xHCI host controller firmware version can be found by putting a
      vendor-specific command on the command ring and extracting the BCD
      encoded-version out of the vendor-specific event TRB.
      
      The firmware version debug line in dmesg will look like:
      
      xhci_hcd 0000:05:00.0: NEC firmware version 30.21
      
      (NEC merged with Renesas Technologies and became Renesas Electronics on
      April 1, 2010.  I have their OK to merge this vendor-specific code.)
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Cc: Satoshi Otani <satoshi.otani.xm@renesas.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      0238634d
  9. 21 5月, 2010 8 次提交
    • G
      USB: xhci: fix compiler warning. · c3443a6d
      Greg Kroah-Hartman 提交于
      Reported-by: NStephen Rothwell <sfr@canb.auug.org.au>
      Cc: Sarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      c3443a6d
    • A
      USB: xHCI: Fix wrong usage of macro TRB_TYPE · 54b5acf3
      Andiry Xu 提交于
      Macro TRB_TYPE is misused in some places. Fix the wrong usage.
      Signed-off-by: NAndiry Xu <andiry.xu@amd.com>
      Cc: stable <stable@kernel.org>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      54b5acf3
    • J
      USB: xhci: Transfer ring link TRB activation change. · 6c12db90
      John Youn 提交于
      Change transfer ring behavior to not follow/activate link TRBs
      until active TRBs are queued after it.  This change affects
      the behavior when a TD ends just before a link TRB.
      Signed-off-by: NJohn Youn <johnyoun@synopsys.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      6c12db90
    • S
      USB: xhci: Set stream ID to 0 after cleaning up stalls. · 5e5cf6fc
      Sarah Sharp 提交于
      After using state stored in xhci_virt_ep to clean up a stalled endpoint,
      be sure to set the stalled stream ID back to 0.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      5e5cf6fc
    • 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
    • R
      USB: clean up some host controller sparse warnings · 326b4810
      Randy Dunlap 提交于
      Fix usb sparse warnings:
      
      drivers/usb/host/isp1362-hcd.c:2220:50: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-mem.c:43:24: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-mem.c:49:24: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-mem.c:161:24: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-mem.c:198:16: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-mem.c:319:31: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-mem.c:1231:33: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-pci.c:177:23: warning: non-ANSI function declaration of function 'xhci_register_pci'
      drivers/usb/host/xhci-pci.c:182:26: warning: non-ANSI function declaration of function 'xhci_unregister_pci'
      drivers/usb/host/xhci-ring.c:342:32: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-ring.c:525:34: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-ring.c:1009:32: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-ring.c:1031:32: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-ring.c:1041:16: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-ring.c:1096:30: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-ring.c:1100:27: warning: Using plain integer as NULL pointer
      drivers/usb/host/xhci-mem.c:224:27: warning: symbol 'xhci_alloc_container_ctx' was not declared. Should it be static?
      drivers/usb/host/xhci-mem.c:242:6: warning: symbol 'xhci_free_container_ctx' was not declared. Should it be static?
      Signed-off-by: NRandy Dunlap <randy.dunlap@oracle.com>
      Cc: Lothar Wassmann <LW@KARO-electronics.de>
      Signed-off By: Sarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      326b4810
    • S
      USB: xhci: Correct assumptions about number of rings per endpoint. · e9df17eb
      Sarah Sharp 提交于
      Much of the xHCI driver code assumes that endpoints only have one ring.
      Now an endpoint can have one ring per enabled stream ID, so correct that
      assumption.  Use functions that translate the stream_id field in the URB
      or the DMA address of a TRB into the correct stream ring.
      
      Correct the polling loop to print out all enabled stream rings.  Make the
      URB cancellation routine find the correct stream ring if the URB has
      stream_id set.  Make sure the URB enqueueing routine does the same.  Also
      correct the code that handles stalled/halted endpoints.
      
      Check that commands and registers that can take stream IDs handle them
      properly.  That includes ringing an endpoint doorbell, resetting a
      stalled/halted endpoint, and setting a transfer ring dequeue pointer
      (since that command can set the dequeue pointer in a stream context or an
      endpoint context).
      
      Correct the transfer event handler to translate a TRB DMA address into the
      stream ring it was enqueued to.  Make the code to allocate and prepare TD
      structures adds the TD to the right td_list for the stream ring.  Make
      sure the code to give the first TRB in a TD to the hardware manipulates
      the correct stream ring.
      
      When an endpoint stalls, store the stream ID of the stream ring that
      stalled in the xhci_virt_ep structure.  Use that instead of the stream ID
      in the URB, since an URB may be re-used after it is given back after a
      non-control endpoint stall.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      e9df17eb
    • S
      USB: xhci: Add memory allocation for USB3 bulk streams. · 8df75f42
      Sarah Sharp 提交于
      Add support for allocating streams for USB 3.0 bulk endpoints.  See
      Documentation/usb/bulk-streams.txt for more information about how and why
      you would use streams.
      
      When an endpoint has streams enabled, instead of having one ring where all
      transfers are enqueued to the hardware, it has several rings.  The ring
      dequeue pointer in the endpoint context is changed to point to a "Stream
      Context Array".  This is basically an array of pointers to transfer rings,
      one for each stream ID that the driver wants to use.
      
      The Stream Context Array size must be a power of two, and host controllers
      can place a limit on the size of the array (4 to 2^16 entries).  These
      two facts make calculating the size of the Stream Context Array and the
      number of entries actually used by the driver a bit tricky.
      
      Besides the Stream Context Array and rings for all the stream IDs, we need
      one more data structure.  The xHCI hardware will not tell us which stream
      ID a transfer event was for, but it will give us the slot ID, endpoint
      index, and physical address for the TRB that caused the event.  For every
      endpoint on a device, add a radix tree to map physical TRB addresses to
      virtual segments within a stream ring.
      
      Keep track of whether an endpoint is transitioning to using streams, and
      don't enqueue any URBs while that's taking place.  Refuse to transition an
      endpoint to streams if there are already URBs enqueued for that endpoint.
      
      We need to make sure that freeing streams does not fail, since a driver's
      disconnect() function may attempt to do this, and it cannot fail.
      Pre-allocate the command structure used to issue the Configure Endpoint
      command, and reserve space on the command ring for each stream endpoint.
      This may be a bit overkill, but it is permissible for the driver to
      allocate all streams in one call and free them in multiple calls.  (It is
      not advised, however, since it is a waste of resources and time.)
      
      Even with the memory and ring room pre-allocated, freeing streams can
      still fail because the xHC rejects the configure endpoint command.  It is
      valid (by the xHCI 0.96 spec) to return a "Bandwidth Error" or a "Resource
      Error" for a configure endpoint command.  We should never see a Bandwidth
      Error, since bulk endpoints do not effect the reserved bandwidth.  The
      host controller can still return a Resource Error, but it's improbable
      since the xHC would be going from a more resource-intensive configuration
      (streams) to a less resource-intensive configuration (no streams).
      
      If the xHC returns a Resource Error, the endpoint will be stuck with
      streams and will be unusable for drivers.  It's an unavoidable consequence
      of broken host controller hardware.
      
      Includes bug fixes from the original patch, contributed by
      John Youn <John.Youn@synopsys.com> and Andy Green <AGreen@PLXTech.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      8df75f42