Skip to content
Snippets Groups Projects
  1. May 08, 2014
  2. May 07, 2014
    • Stephen Warren's avatar
      usb: ums: remove ci_udc special case · 340ed422
      Stephen Warren authored
      
      Now that the ci_udc driver supports allocating multiple requests per
      endpoint, we can revert the special-case added by a022c1e1 "usb:
      ums: use only 1 buffer for CI_UDC".
      
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      340ed422
    • Stephen Warren's avatar
      usb: ci_udc: allow multiple buffer allocs per ep · 2813006f
      Stephen Warren authored
      
      Modify ci_ep_alloc_request() to return a dynamically allocated request
      object, rather than a singleton that's part of the endpoint. This
      requires moving various state from the endpoint structure to the request
      structure, since we need one copy per request.
      
      The "fast bounce buffer" b_fast is removed by this change rather than
      moved to the request object. Instead, we enhance the bounce buffer logic
      in ci_bounce()/ci_debounce() to keep the bounce buffer around between
      request submissions. This avoids the need to allocate an arbitrarily-
      sized bounce buffer up-front, yet avoids incurring the allocation
      overhead each time a request is submitted.
      
      A future enhancement would be to actually submit multiple requests to HW
      at once. The Linux driver shows that this is possible. That might improve
      throughput (depending on the USB protocol in use), since USB could be
      performing a transfer to one HW buffer in parallel with whatever SW
      actions U-Boot performs on another buffer. However, I have not made this
      change as part of this patch, in order to keep SW changes related to
      buffer management separate from any change in the way the HW is
      programmed.
      
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      2813006f
  3. May 06, 2014
  4. May 05, 2014
  5. May 02, 2014
  6. May 01, 2014
    • Stephen Warren's avatar
      usb: gadget: allow ci_udc to build with new gadget framework · 2fc5dab2
      Stephen Warren authored
      
      Allow ci_udc.o to be built when using the new(?) USB gadget framework,
      as enabled by CONFIG_USB_GADGET.
      
      Note that this duplicates the Makefile entry for ci_udc.o, since it's
      also included inside #ifdef CONFIG_USB_ETHER. I'm not sure what that
      define means; perhaps an old style of Ethernet-specific USB gadget
      implementation?
      
      I wonder if the line that this patch adds shouldn't be outside all of
      the ifdefs, so it stands on its own, similar to how e.g. epautoconf.o
      is shared between the two?
      
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      2fc5dab2
  7. Apr 30, 2014
    • Stephen Warren's avatar
      usb: ums: use only 1 buffer for CI_UDC · a022c1e1
      Stephen Warren authored
      
      ci_udc.c allocates only a single buffer for each endpoint, which
      ci_ep_alloc_request() returns as a hard-coded value rather than
      dynamically allocating. Consequently, storage_common.c must limit
      itself to using a single buffer at a time. Add a special case
      to the definition of FSG_NUM_BUFFERS for this.
      
      Another option would be to fix ci_ep_alloc_request() to dynamically
      allocate the buffers like some/all(?) other device mode drivers do.
      However, I don't think that ci_ep_queue() supports queueing up
      multiple buffers either yet, and I'm not familiar enough with the
      controller yet to implement that. As such, any attempt to use multiple
      buffers simply results in data corruption and other errors.
      
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      a022c1e1
    • Stephen Warren's avatar
      usb: ci_udc: support variants with hostpc register · fcf2ede1
      Stephen Warren authored
      
      Tegra's USB controller appears to be a variant of the ChipIdea
      controller; perhaps derived from it, or simply a different version of
      the IP core to what U-Boot supports today.
      
      In this variant, at least the following difference are present:
      - Some registers are moved about.
      - Setup transaction completion is reported in a separate 'epsetupstat'
        register, rather than in 'epstat' (which still exists, perhaps for
        other transaction types).
      - USB connection speed is reported in a separate 'hostpc1_devlc'
        register, rather than 'portsc'.
      - The registers used by ci_udc.c begin at offset 0x130 from the USB
        register base, rather than offset 0x140. However, this is handled
        by the associated EHCI controller driver, since the register address
        is stored in controller.ctrl->hcor.
      
      Introduce define CONFIG_CI_UDC_HAS_HOSTPC to indicate which variant of
      the controller should be supported. The "HAS_HOSTPC" part of this name
      mirrors the similar "has_hostpc" field used by the Linux EHCI controller
      core to represent the presence/absence of the hostpc1_devlc register.
      
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      fcf2ede1
    • Stephen Warren's avatar
      usb: ci_udc: make PHY initialization conditional · 0c51dc6d
      Stephen Warren authored
      
      usb_gadget_register_driver() currently unconditionally programs PORTSC
      to select a ULPI PHY. This is incorrect on at least the Tegra boards I
      am testing with, which use a UTMI PHY for the OTG ports. Make the PHY
      selection code conditional upon the specific EHCI controller that is in
      use.
      
      Ideally, I believe that the PHY initialization code should be part of
      ehci_hcd_init() in the relevant EHCI controller driver, or some board-
      specific function that ehci_hcd_init() calls.
      
      For MX6, I'm not sure this PHY initialization code is correct even before
      this patch, since ehci-mx6's ehci_hcd_init() already configures PORTSC to
      a board-specific value, and it seems likely that the code in ci_udc.c is
      incorrectly undoing this. Perhaps this is not an issue if the PHY
      selection register bits aren't implemented on this instance of the MX6
      USB controller?
      
      ehci-mxs.c doens't appear to touch PORTSC, so this code is likely still
      required there.
      
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      0c51dc6d
    • Stephen Warren's avatar
      usb: ci_udc: set ep->req.actual after transfer · 8aac6e9c
      Stephen Warren authored
      
      At least drivers/usb/gadget/storage_common.c expects that ep->req.actual
      contain the number of bytes actually transferred. (At least in practice,
      I observed it failing to work correctly unless this was the case).
      
      However, ci_udc.c modifies ep->req.length instead. I assume that .length
       is supposed to represent the allocated buffer size, whereas .actual is
      supposed to represent the actual number of bytes transferred. In the OUT
      transaction case, this may happen simply because the host sends a smaller
       packet than the max possible size, which is quite legal. In the IN case,
      transferring fewer bytes than requested could presumably happen as an
      error.
      
      Modify handle_ep_complete() to write to .actual rather than modifying
      .length.
      
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      8aac6e9c
    • Stephen Warren's avatar
      usb: ci_udc: Support larger packets · f5c03006
      Stephen Warren authored
      
      ci_ep_queue() currently only fills in the page0/page1 fields in the
      queue item. If the buffer is larger than 4KiB (unaligned) or 8KiB
      (page-aligned), then this prevents the HW from knowing where to write
      the balance of the data.
      
      Fix this by initializing all 5 pageN pointers, which allows up to
      16KiB (potentially non-page-aligned) buffers.
      
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      f5c03006
    • Łukasz Majewski's avatar
      dfu:fix: Replace wrong return value with proper one · 672ad18c
      Łukasz Majewski authored
      
      This patch remove always false (since we tested ret = 0) ternary operator
      with ret value returned.
      
      Signed-off-by: default avatarLukasz Majewski <l.majewski@samsung.com>
      672ad18c
Loading