1. 29 May, 2015 1 commit
  2. 14 Apr, 2015 13 commits
    • Stephen Warren's avatar
      usb: dwc2: retry NAK'd interrupt transfers · 5877de91
      Stephen Warren authored
      
      
      IIUC, interrupt transfers are NAK'd by devices until they wish to trigger
      an interrupt, and e.g. EHCI controllers retry these in HW until they are
      ACK'd. However, DWC2 doesn't seem to retry, so we need to do this in SW.
      In practice, I've seen DWC2_HCINT_FRMOVRUN happen too. I'm not quite sure
      what this error implies; perhaps it's related to how near the end of a
      USB frame we're at when the interrupt transfer is initiated? Anyway,
      retrying this temporary error seems to be necessary too.
      
      With all these commits applied, both my USB keyboards (one LS Lenovo and
      one FS Dell) work correctly when there is no USB hub between the SoC and
      the keyboard; We still need split transactions to be implemented for hubs
      to work.
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      5877de91
    • Stephen Warren's avatar
      usb: dwc2: implement interrupt transfers · e236519b
      Stephen Warren authored
      
      
      As best I can tell, there's no difference between bulk and interrupt
      transfers in terms of how the HW should be programmed, at least given
      that we're executing one transaction at a time rather than scheduling
      them into frames for maximum throughput.
      
      This patch ends up sharing the toggle bit state between bulk and
      interrupt transfers on a particular EP. However I believe this is fine;
      AFAIK a given EP either uses bulk or interrupt transfers and doesn't mix
      them.
      
      This patch doesn't do anything with the "interval" parameter for
      interrupt transfers, but then most other USB controller drivers in U-Boot
      don't either.
      
      It turns out that one of my keyboards is happy to work using control
      transfers but the other only gives non-zero "HID reports" via interrupt
      transfers.
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      e236519b
    • Stephen Warren's avatar
      usb: dwc2: correctly program hcchar for LS devices · ed9bcbc7
      Stephen Warren authored
      
      
      A bit must be set in HCCHAR when communicating with low-speed devices.
      I have no idea why there's no corresponding bit to distinguish between
      full-speed and high-speed devices, but no matter; they all work now!
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      ed9bcbc7
    • Stephen Warren's avatar
      usb: dwc2: detect device speed correctly · 4748cce5
      Stephen Warren authored
      
      
      This doesn't make my LS keyboard work any better, but it does at least
      report the correct speed in "usb tree".
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      4748cce5
    • Stephen Warren's avatar
      usb: dwc2: use phys_to_bus/bus_to_phys · 5c0beb5c
      Stephen Warren authored
      
      
      Use of these APIs is required on the Raspberry Pi. With this change, USB
      on RPi1 should be more reliable, and USB on the RPi2 will start working.
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      5c0beb5c
    • Stephen Warren's avatar
      usb: dwc2: fix bulk transfers · fc909c05
      Stephen Warren authored
      
      
      When I created wait_for_chhltd(), I noticed that some instances of the
      code it replaced expected the ACK bit to be set and others didn't. I
      assumed this was an accidental inconsistency in the code, so wrote
      wait_for_chhltd() to always expect ACK to be set. This code appeared to
      work correctly for both enumeration of USB keyboards and operation of
      USB Ethernet devices. However, this change broke USB Mass Storage (at
      least my USB SD card reader). This change reverts to exactly the
      original behaviour. I'm not sure why the ACK bit isn't always set
      (perhaps a quirk in the USB HW or DWC2 controller), but the code works
      this way!
      
      Fixes: 5be4ca7d6ac8 ("usb: dwc2: unify waiting for transfer completion")
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      fc909c05
    • Stephen Warren's avatar
      usb: dwc2: remove restriction on buffer length · 805b67e1
      Stephen Warren authored
      
      
      Each USB transfer is split up into chunks that are held in an aligned
      buffer. This imposes a limit on the size of each chunk, but no limit on
      the total size of transferred data. Fix the logic in chunk_msg() not to
      reject large transfers, but simply take the size of the aligned buffer
      into account when calculating the chunk size.
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      805b67e1
    • Stephen Warren's avatar
      usb: dwc2: fix aligned buffer usage · d1c880c6
      Stephen Warren authored
      
      
      The original aligned_buffer usage:
      a) Uselessly copied data into the aligned buffer even for IN
         transactions. Fix this my making the copy conditional.
      b) Always programmed the HW to transfer to/from the start of the aligned
         buffer. This worked fine for OUT transactions since the memcpy copied
         the OUT data to this location too. However, for large IN transactions,
         since the copy from the aligned buffer to the "client" buffer was
         deferred until after all chunks were transferred. it resulted in each
         chunk's transfer over-writing the data for the first transfer. Fix
         this by copying IN data as soon as it's received.
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      d1c880c6
    • Stephen Warren's avatar
      usb: dwc2: simplify wait_for_chhltd · 66ffc875
      Stephen Warren authored
      
      
      toggle is never NULL. Simplify the code by removing handling of when it
      is NULL.
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      66ffc875
    • Stephen Warren's avatar
      usb: dwc2: remove control_data_toggle[] · 282685e0
      Stephen Warren authored
      
      
      The control data toggle resets to DATA1 at the start of the data phase
      of every setup transaction. We don't need a global variable to store
      the value; we can just store it on the stack.
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      282685e0
    • Stephen Warren's avatar
      usb: dwc2: usb chunk_msg() for control transfers too · ee837554
      Stephen Warren authored
      
      
      This removes duplicated code.
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      ee837554
    • Stephen Warren's avatar
      usb: dwc2: refactor submit_bulk_msg to be common · 7b5e504d
      Stephen Warren authored
      
      
      Move the body of submit_bulk_msg() into new function chunk_msg(). This
      can be shared with submit_control_msg() to reduce code duplication, and
      allow control messages larger than maxpacket.
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      7b5e504d
    • Stephen Warren's avatar
      usb: dwc2: unify waiting for transfer completion · 4a1d21fc
      Stephen Warren authored
      
      
      Lift common code out of submit_bulk_msg() and submit_control_msg().
      Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      4a1d21fc
  3. 23 Nov, 2014 1 commit
  4. 22 Oct, 2014 1 commit