1. 16 6月, 2009 13 次提交
    • S
      USB: xhci: Avoid compiler reordering in Link TRB giveback. · b7116ebc
      Sarah Sharp 提交于
      Force the compiler to write the cycle bit of the Link TRB last.  This
      ensures that the hardware doesn't think it owns the Link TRB before we set
      the chain bit.  Reported by Oliver in this thread:
      	http://marc.info/?l=linux-usb&m=124091532410219&w=2Reported-by: NOliver Neukum <oliver@neukum.org>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      b7116ebc
    • S
      USB: xhci: Avoid global namespace pollution. · 23e3be11
      Sarah Sharp 提交于
      Make all globally visible functions start with xhci_ and mark functions as
      static if they're only called within the same C file.  Fix some long lines
      while we're at it.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      23e3be11
    • S
      USB: xhci: Fix Link TRB handoff bit twiddling. · 06e7a148
      Sarah Sharp 提交于
      Make sure to preserve all bits *except* the TRB_CHAIN bit when giving a
      Link TRB to the hardware.  We need to save things like TRB type and the
      toggle bit in the control dword.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      06e7a148
    • G
      USB: xhci: fix lots of compiler warnings. · 700e2052
      Greg Kroah-Hartman 提交于
      Turns out someone never built this code on a 64bit platform.
      
      Someone owes me a beer...
      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>
      700e2052
    • S
      USB: xhci: use xhci_handle_event instead of handle_event · b7258a4a
      Stephen Rothwell 提交于
      The former is way to generic for a global symbol.
      
      Fixes this build error:
      
      drivers/usb/built-in.o: In function `.handle_event': (.text+0x67dd0): multiple definition of `.handle_event'
      drivers/pcmcia/built-in.o:(.text+0xcfcc): first defined here
      drivers/usb/built-in.o: In function `handle_event': (.opd+0x5bc8): multiple definition of `handle_event'
      drivers/pcmcia/built-in.o:(.opd+0xed0): first defined here
      Signed-off-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>
      b7258a4a
    • S
      USB: xhci: URB cancellation support. · ae636747
      Sarah Sharp 提交于
      Add URB cancellation support to the xHCI host controller driver.  This
      currently supports cancellation for endpoints that do not have streams
      enabled.
      
      An URB is represented by a number of Transaction Request Buffers (TRBs),
      that are chained together to make one (or more) Transaction Descriptors
      (TDs) on an endpoint ring.  The ring is comprised of contiguous segments,
      linked together with Link TRBs (which may or may not be chained into a TD).
      
      To cancel an URB, we must stop the endpoint ring, make the hardware skip
      over the TDs in the URB (either by turning them into No-op TDs, or by
      moving the hardware's ring dequeue pointer past the last TRB in the last
      TD), and then restart the ring.
      
      There are times when we must drop the xHCI lock during this process, like
      when we need to complete cancelled URBs.  We must ensure that additional
      URBs can be marked as cancelled, and that new URBs can be enqueued (since
      the URB completion handlers can do either).  The new endpoint ring
      variables cancels_pending and state (which can only be modified while
      holding the xHCI lock) ensure that future cancellation and enqueueing do
      not interrupt any pending cancellation code.
      
      To facilitate cancellation, we must keep track of the starting ring
      segment, first TRB, and last TRB for each URB.  We also need to keep track
      of the list of TDs that have been marked as cancelled, separate from the
      list of TDs that are queued for this endpoint.  The new variables and
      cancellation list are stored in the xhci_td structure.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      ae636747
    • S
      USB: xhci: Scatter gather list support for bulk transfers. · 8a96c052
      Sarah Sharp 提交于
      Add support for bulk URBs that pass scatter gather lists to xHCI.  This allows
      xHCI to more efficiently enqueue these transfers, and allows the host
      controller to take advantage of USB 3.0 "bursts" for bulk endpoints.
      
      Use requested length to calculate the number of TRBs needed for a scatter gather
      list transfer, instead of using the number of sglist entries.  The application
      can pass down a scatter gather list that is bigger than it needs for the
      requested transfer.
      
      Scatter gather entries can cross 64KB boundaries, so be careful to setup TRBs
      such that no buffer crosses a 64KB boundary.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      8a96c052
    • S
      USB: xhci: Bulk transfer support · b10de142
      Sarah Sharp 提交于
      Allow device drivers to submit URBs to bulk endpoints on devices under an
      xHCI host controller.  Share code between the control and bulk enqueueing
      functions when it makes sense.
      
      To get the best performance out of bulk transfers, SuperSpeed devices must
      have the bMaxBurst size copied from their endpoint companion controller
      into the xHCI device context.  This allows the host controller to "burst"
      up to 16 packets before it has to wait for the device to acknowledge the
      first packet.
      
      The buffers in Transfer Request Blocks (TRBs) can cross page boundaries,
      but they cannot cross 64KB boundaries.  The buffer must be broken into
      multiple TRBs if a 64KB boundary is crossed.
      
      The sum of buffer lengths in all the TRBs in a Transfer Descriptor (TD)
      cannot exceed 64MB.  To work around this, the enqueueing code must enqueue
      multiple TDs.  The transfer event handler may incorrectly give back the
      URB in this case, if it gets a transfer event that points somewhere in the
      first TD.  FIXME later.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      b10de142
    • S
      USB: xhci: Bandwidth allocation support · f94e0186
      Sarah Sharp 提交于
      Since the xHCI host controller hardware (xHC) has an internal schedule, it
      needs a better representation of what devices are consuming bandwidth on
      the bus.  Each device is represented by a device context, with data about
      the device, endpoints, and pointers to each endpoint ring.
      
      We need to update the endpoint information for a device context before a
      new configuration or alternate interface setting is selected.  We setup an
      input device context with modified endpoint information and newly
      allocated endpoint rings, and then submit a Configure Endpoint Command to
      the hardware.
      
      The host controller can reject the new configuration if it exceeds the bus
      bandwidth, or the host controller doesn't have enough internal resources
      for the configuration.  If the command fails, we still have the older
      device context with the previous configuration.  If the command succeeds,
      we free the old endpoint rings.
      
      The root hub isn't a real device, so always say yes to any bandwidth
      changes for it.
      
      The USB core will enable, disable, and then enable endpoint 0 several
      times during the initialization sequence.  The device will always have an
      endpoint ring for endpoint 0 and bandwidth allocated for that, unless the
      device is disconnected or gets a SetAddress 0 request.  So we don't pay
      attention for when xhci_check_bandwidth() is called for a re-add of
      endpoint 0.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      f94e0186
    • S
      USB: xhci: Control transfer support. · d0e96f5a
      Sarah Sharp 提交于
      Allow device drivers to enqueue URBs to control endpoints on devices under
      an xHCI host controller.  Each control transfer is represented by a
      series of Transfer Descriptors (TDs) written to an endpoint ring.  There
      is one TD for the Setup phase, (optionally) one TD for the Data phase, and
      one TD for the Status phase.
      
      Enqueue these TDs onto the endpoint ring that represents the control
      endpoint.  The host controller hardware will return an event on the event
      ring that points to the (DMA) address of one of the TDs on the endpoint
      ring.  If the transfer was successful, the transfer event TRB will have a
      completion code of success, and it will point to the Status phase TD.
      Anything else is considered an error.
      
      This should work for control endpoints besides the default endpoint, but
      that hasn't been tested.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      d0e96f5a
    • S
      USB: xhci: Allocate and address USB devices · 3ffbba95
      Sarah Sharp 提交于
      xHCI needs to get a "Slot ID" from the host controller and allocate other
      data structures for every USB device.  Make usb_alloc_dev() and
      usb_release_dev() allocate and free these device structures.  After
      setting up the xHC device structures, usb_alloc_dev() must wait for the
      hardware to respond to an Enable Slot command.  usb_alloc_dev() fires off
      a Disable Slot command and does not wait for it to complete.
      
      When the USB core wants to choose an address for the device, the xHCI
      driver must issue a Set Address command and wait for an event for that
      command.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      3ffbba95
    • S
      USB: xhci: Root hub support. · 0f2a7930
      Sarah Sharp 提交于
      Add functionality for getting port status and hub descriptor for xHCI root
      hubs.  This is WIP because the USB 3.0 hub descriptor is different from
      the USB 2.0 hub descriptor.  For now, we lie about the root hub descriptor
      because the changes won't effect how the core talks to the root hub.
      Later we will need to add the USB 3.0 hub descriptor for real hubs, and
      this code might change.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      0f2a7930
    • S
      USB: xhci: No-op command queueing and irq handler. · 7f84eef0
      Sarah Sharp 提交于
      xHCI host controllers can optionally implement a no-op test.  This
      simple test ensures the OS has correctly setup all basic data structures
      and can correctly respond to interrupts from the host controller
      hardware.
      
      There are two rings exercised by the no-op test:  the command ring, and
      the event ring.
      
      The host controller driver writes a no-op command TRB to the command
      ring, and rings the doorbell for the command ring (the first entry in
      the doorbell array).  The hardware receives this event, places a command
      completion event on the event ring, and fires an interrupt.
      
      The host controller driver sees the interrupt, and checks the event ring
      for TRBs it can process, and sees the command completion event.  (See
      the rules in xhci-ring.c for who "owns" a TRB.  This is a simplified set
      of rules, and may not contain all the details that are in the xHCI 0.95
      spec.)
      
      A timer fires every 60 seconds to debug the state of the hardware and
      command and event rings.  This timer only runs if
      CONFIG_USB_XHCI_HCD_DEBUGGING is 'y'.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      7f84eef0