1. 13 7月, 2009 7 次提交
  2. 11 7月, 2009 3 次提交
  3. 09 7月, 2009 1 次提交
  4. 07 7月, 2009 1 次提交
    • K
      Fix virt_to_phys() warnings · 5bfd7560
      Kevin Cernekee 提交于
      These warnings were observed on MIPS32 using 2.6.31-rc1 and gcc-4.2.0:
      
      mm/page_alloc.c: In function 'alloc_pages_exact':
      mm/page_alloc.c:1986: warning: passing argument 1 of 'virt_to_phys' makes pointer from integer without a cast
      
      drivers/usb/mon/mon_bin.c: In function 'mon_alloc_buff':
      drivers/usb/mon/mon_bin.c:1264: warning: passing argument 1 of 'virt_to_phys' makes pointer from integer without a cast
      
      [akpm@linux-foundation.org: fix kernel/perf_counter.c too]
      Signed-off-by: NKevin Cernekee <cernekee@gmail.com>
      Cc: Andi Kleen <andi@firstfloor.org>
      Cc: Ralf Baechle <ralf@linux-mips.org>
      Cc: Ingo Molnar <mingo@elte.hu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      5bfd7560
  5. 04 7月, 2009 1 次提交
  6. 26 6月, 2009 3 次提交
  7. 16 6月, 2009 24 次提交
    • P
      USB: xhci depends on PCI. · 1b6ed69f
      Paul Mundt 提交于
      While it looks like xhci was written with both PCI and non-PCI in mind,
      apparently only the former has seen any testing. xhci-mem.o can be "fixed"
      with a linux/dmapool.h include, but there are still parts of the code that
      make use of struct pci_dev directly. So, at least more work is needed before
      this can be turned on for non-PCI builds:
      
        CC      drivers/usb/host/xhci-mem.o
      drivers/usb/host/xhci-mem.c: In function 'xhci_segment_alloc':
      drivers/usb/host/xhci-mem.c:45: error: implicit declaration of function 'dma_pool_alloc'
      drivers/usb/host/xhci-mem.c:45: warning: assignment makes pointer from integer without a cast
      drivers/usb/host/xhci-mem.c: In function 'xhci_segment_free':
      drivers/usb/host/xhci-mem.c:67: error: implicit declaration of function 'dma_pool_free'
      drivers/usb/host/xhci-mem.c: In function 'xhci_alloc_virt_device':
      drivers/usb/host/xhci-mem.c:239: warning: assignment makes pointer from integer without a cast
      drivers/usb/host/xhci-mem.c:248: warning: assignment makes pointer from integer without a cast
      drivers/usb/host/xhci-mem.c: In function 'xhci_mem_cleanup':
      drivers/usb/host/xhci-mem.c:578: error: implicit declaration of function 'dma_pool_destroy'
      drivers/usb/host/xhci-mem.c: In function 'xhci_mem_init':
      drivers/usb/host/xhci-mem.c:657: error: implicit declaration of function 'dma_pool_create'
      drivers/usb/host/xhci-mem.c:658: warning: assignment makes pointer from integer without a cast
      drivers/usb/host/xhci-mem.c:663: warning: assignment makes pointer from integer without a cast
      make[3]: *** [drivers/usb/host/xhci-mem.o] Error 1
      
        CC      drivers/usb/host/xhci-pci.o
      drivers/usb/host/xhci-pci.c: In function 'xhci_pci_reinit':
      drivers/usb/host/xhci-pci.c:39: error: implicit declaration of function 'pci_set_mwi'
      drivers/usb/host/xhci-pci.c: At top level:
      drivers/usb/host/xhci-pci.c:151: error: 'usb_hcd_pci_probe' undeclared here (not in a function)
      drivers/usb/host/xhci-pci.c:152: error: 'usb_hcd_pci_remove' undeclared here (not in a function)
      drivers/usb/host/xhci-pci.c:155: error: 'usb_hcd_pci_shutdown' undeclared here (not in a function)
      drivers/usb/host/xhci-pci.c:159: warning: function declaration isn't a prototype
      drivers/usb/host/xhci-pci.c:164: warning: function declaration isn't a prototype
      make[3]: *** [drivers/usb/host/xhci-pci.o] Error 1
      
      Cc: Sarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NPaul Mundt <lethal@linux-sh.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      
      1b6ed69f
    • S
      USB: xhci: Add Makefile, MAINTAINERS, and Kconfig entries. · eb6bab13
      Sarah Sharp 提交于
      Add Makefile and Kconfig entries for the xHCI host controller driver.
      List Sarah Sharp as the maintainer for the xHCI driver.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      eb6bab13
    • S
      USB: xhci: Respect critical sections. · f88ba78d
      Sarah Sharp 提交于
      Narrow down time spent holding the xHCI spinlock so that it's only used to
      protect the xHCI rings, not as mutual exclusion.  Stop allocating memory
      while holding the spinlock and calling xhci_alloc_virt_device() and
      xhci_endpoint_init().
      
      The USB core should have locking in it to prevent device state to be
      manipulated by more than one kernel thread.  E.g. you can't free a device
      while you're in the middle of setting a new configuration.  So removing
      the locks from the sections where xhci_alloc_dev() and
      xhci_reset_bandwidth() touch xHCI's representation of the device should be
      OK.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      f88ba78d
    • S
      USB: xHCI: Fix interrupt moderation. · a4d88302
      Sarah Sharp 提交于
      Mask off the lower 16 bits of the interrupt control register, instead of
      masking off the upper 16 bits.  The interrupt moderation interval field is
      the lower 16 bytes, and is set to 0x4000 (1ms) by default.  The previous
      code was adding 40 us to the default value, instead of setting it to 40
      us.  This makes performance really bad.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      a4d88302
    • S
      USB: xhci: Remove packed attribute from structures. · 98441973
      Sarah Sharp 提交于
      The packed attribute allows gcc to muck with the alignment of data
      structures, which may lead to byte-wise writes that break atomicity of
      writes.  Packed should only be used when the compile may add undesired
      padding to the structure.  Each element of the structure will be aligned
      by C based on its size and the size of the elements around it.  E.g. a u64
      would be aligned on an 8 byte boundary, the next u32 would be aligned on a
      four byte boundary, etc.
      
      Since most of the xHCI structures contain only u32 bit values, removing
      the packed attribute for them should be harmless.  (A future patch will
      change some of the twin 32-bit address fields to one 64-bit field, but all
      those places have an even number of 32-bit fields before them, so the
      alignment should be correct.)  Add BUILD_BUG_ON statements to check that
      the compiler doesn't add padding to the data structures that have a
      hardware-defined layout.
      
      While we're modifying the registers, change the name of intr_reg to
      xhci_intr_reg to avoid global conflicts.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      98441973
    • S
      usb; xhci: Fix TRB offset calculations. · 6071d836
      Sarah Sharp 提交于
      Greg KH introduced a bug into xhci_trb_virt_to_dma() when he changed the
      type of offset to dma_addr_t from unsigned int and dropped the casts to
      unsigned int around the virtual address pointer subtraction.
      
      trb and seg->trbs are both valid pointers to virtual addresses, so the
      compiler will mod the subtraction by the size of union trb (16 bytes).
      segment_offset is an unsigned long, which is guaranteed to be at least as
      big as a void *.
      
      Drop the void * casts in the first if statement because trb and seg->trbs
      are both pointers of the same type (pointers to union trb).
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      6071d836
    • V
      USB: xhci: replace if-elseif-else with switch-case · 7dd19e69
      Viral Mehta 提交于
      Replace if-elseif-else with switch-case
      to keep the code consistent which is semantically same
      
      Switch-case is used here,
      http://www.spinics.net/lists/linux-usb/msg17201.html
      Making consistent at other places in usb/core
      
      Also easier to read and maintain when USB4.0, 5.0, ... comes
      Signed-off-by: NViral Mehta <viral.mehta@einfochips.com>
      Tested-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      7dd19e69
    • S
      USB: xhci: Make xhci-mem.c include linux/dmapool.h · 527c6d7f
      Sarah Sharp 提交于
      xhci-mem.c includes calls to dma_pool_alloc() and other functions defined
      in linux/dmapool.h.  Make sure to include that header file.
      Reported-by: NRandy Dunlap <randy.dunlap@oracle.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      527c6d7f
    • S
      USB: xhci: drop spinlock in xhci_urb_enqueue() error path. · c7959fb2
      Sarah Sharp 提交于
      Make sure the error path in xhci_urb_enqueue() releases the spinlock
      before it returns.  Reported by Oliver in
      	http://marc.info/?l=linux-usb&m=124091637311832&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>
      c7959fb2
    • S
      USB: Change names of SuperSpeed ep companion descriptor structs. · f0058c62
      Sarah Sharp 提交于
      Differentiate between SuperSpeed endpoint companion descriptor and the
      wireless USB endpoint companion descriptor.  Make all structure names for
      this descriptor have "ss" (SuperSpeed) in them.  David Vrabel asked for
      this change in http://marc.info/?l=linux-usb&m=124091465109367&w=2Reported-by: NDavid Vrabel <david.vrabel@csr.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      f0058c62
    • 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: Clean up xhci_irq() function. · c96a2b81
      Sarah Sharp 提交于
      Drop spinlock in xhci_irq() error path.
      This fixes the issue reported by Oliver Neukum on this thread:
      	http://marc.info/?l=linux-usb&m=124090924401444&w=2
      
      Remove unnecessary register read reported by Viral Mehta:
      	http://marc.info/?l=linux-usb&m=124091326007398&w=2Reported-by: NOliver Neukum <oliver@neukum.org>
      Reported-by: NViral Mehta <viral.mehta@einfochips.com>
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      c96a2b81
    • 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
    • S
      USB: xhci: Fix register write order. · 3841d56e
      Sarah Sharp 提交于
      The 0.95 xHCI spec says that if the xHCI HW support 64-bit addressing, you
      must write the whole 64-bit address as one atomic operation, or write the
      low 32 bits, and then the high 32 bits.  I had the register writes
      swapped in some places.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      3841d56e
    • G
      USB: xhci: fix some compiler warnings in xhci.h · 045f123d
      Greg Kroah-Hartman 提交于
      This fixes the warning:
      drivers/usb/host/xhci.h:1083: warning: passing argument 1 of ‘xhci_to_hcd’ discards qualifiers from pointer target type
      drivers/usb/host/xhci.h:1083: warning: passing argument 1 of ‘xhci_to_hcd’ discards qualifiers from pointer target type
      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>
      045f123d
    • 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: Push scatter gather lists down to host controller drivers. · e04748e3
      Sarah Sharp 提交于
      This is the original patch I created before David Vrabel posted a better
      patch (http://marc.info/?l=linux-usb&m=123377477209109&w=2) that does
      basically the same thing.  This patch will get replaced with his
      (modified) patch later.
      
      Allow USB device drivers that use usb_sg_init() and usb_sg_wait() to push
      bulk endpoint scatter gather lists down to the host controller drivers.
      This allows host controller drivers to more efficiently enqueue these
      transfers, and allows the xHCI host controller to better take advantage of
      USB 3.0 "bursts" for bulk endpoints.
      
      This patch currently only enables scatter gather lists for bulk endpoints.
      Other endpoint types that use the usb_sg_* functions will not have their
      scatter gather lists pushed down to the host controller.  For periodic
      endpoints, we want each scatterlist entry to be a separate transfer.
      Eventually, HCDs could parse these scatter-gather lists for periodic
      endpoints also.  For now, we use the old code and call usb_submit_urb()
      for each scatterlist entry.
      
      The caller of usb_sg_init() can request that all bytes in the scatter
      gather list be transferred by passing in a length of zero.  Handle that
      request for a bulk endpoint under xHCI by walking the scatter gather list
      and calculating the length.  We could let the HCD handle a zero length in
      this case, but I'm not sure if the core layers in between will get
      confused by this.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      e04748e3
    • 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: Support for bandwidth allocation. · 79abb1ab
      Sarah Sharp 提交于
      Originally, the USB core had no support for allocating bandwidth when a
      particular configuration or alternate setting for an interface was
      selected.  Instead, the device driver's URB submission would fail if
      there was not enough bandwidth for a periodic endpoint.  Drivers could
      work around this, by using the scatter-gather list API to guarantee
      bandwidth.
      
      This patch adds host controller API to allow the USB core to allocate or
      deallocate bandwidth for an endpoint.  Endpoints are added to or dropped
      from a copy of the current schedule by calling add_endpoint() or
      drop_endpoint(), and then the schedule is atomically evaluated with a
      call to check_bandwidth().  This allows all the endpoints for a new
      configuration or alternate setting to be added at the same time that the
      endpoints from the old configuration or alt setting are dropped.
      
      Endpoints must be added to the schedule before any URBs are submitted to
      them.  The HCD must be allowed to reject a new configuration or alt
      setting before the control transfer is sent to the device requesting the
      change.  It may reject the change because there is not enough bandwidth,
      not enough internal resources (such as memory on an embedded host
      controller), or perhaps even for security reasons in a virtualized
      environment.
      
      If the call to check_bandwidth() fails, the USB core must call
      reset_bandwidth().  This causes the schedule to be reverted back to the
      state it was in just after the last successful check_bandwidth() call.
      
      If the call succeeds, the host controller driver (and hardware) will have
      changed its internal state to match the new configuration or alternate
      setting.  The USB core can then issue a control transfer to the device to
      change the configuration or alt setting.  This allows the core to test new
      configurations or alternate settings before unbinding drivers bound to
      interfaces in the old configuration.
      
      WIP:
      
      The USB core must add endpoints from all interfaces in a configuration
      to the schedule, because a driver may claim that interface at any time.
      A slight optimization might be to add the endpoints to the schedule once
      a driver claims that interface.  FIXME
      
      This patch does not cover changing alternate settings, but it does
      handle a configuration change or de-configuration.  FIXME
      
      The code for managing the schedule is currently HCD specific.  A generic
      scheduling algorithm could be added for host controllers without
      built-in scheduling support.  For now, if a host controller does not
      define the check_bandwidth() function, the call to
      usb_hcd_check_bandwidth() will always succeed.
      Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      79abb1ab