1. 03 8月, 2012 5 次提交
    • F
      usb: dwc3: ep0: move DATA phase away from on-demand · fca8892a
      Felipe Balbi 提交于
      We uncovered a limitation of this core WRT to the
      Link Layer Compliance Suite's TD7.06.
      
      On that test, host will start a GetDescriptor(DEVICE)
      standard request, but it will do so only on the
      SETUP phase, meaning there will *NOT* be any DATA or
      STATUS phases.
      
      The idea of the test is to verify robustness of the
      IP WRT framing errors, so the test will send a
      sequence of different SETUP_DPs each with a different
      framing error and the Suite expects us to be able to
      receive all SETUP_DPs with no timeouts.
      
      This core, has the ability to tell us which phase the
      host is expecting before we start it. Whenever we
      receive a TP or DP when no transfers are cached on
      the internal IP's caches, the IP will generate a
      XferNotReady event with status informing us (in case
      of physical ep0/ep1) if it's related to DATA or STATUS
      phases - SETUP phase is expected to be prestarted.
      
      Because we're always waiting for XferNotReady
      events for DATA and STATUS phases, we will never
      be able to know that the Host wants to start another
      SETUP phase instead, which will render us "not
      compliant" with TD7.06.
      
      In order to "fix" the problem we must not rely
      on XferNotReady events for the DATA phase  and try
      to always pre-start DATA transfers on physical
      endpoints 0 and 1. If host goes back to SETUP phase
      from DATA phase we will receive a XferComplete for
      that phase with TRB's status set to SETUP_PENDING,
      which is only useful for printing a debugging log as
      the core expects us to still go through to the STATUS
      phase, initiate a CONTROL_STATUS TRB just so it
      completes right away and, only then, we go back to
      the pending SETUP phase.
      
      SNPS has decided to modify the programming model of
      the core so that on-demand DATA phases will not be
      supported anymore. Note that this limitation does not
      affect 2-stage transfers, meaning that if TD7.06 would
      start a 2-stage transfer instead of a 3-stage transfer,
      we would receive a "fake" XferNotReady(STATUS) which
      would complete right after being initiated with
      SETUP_PENDING status.
      
      Other endpoints are also not affected, so we can still
      use on-demand transfers on Bulk/Isoc/Interrupt endpoints.
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      fca8892a
    • F
      usb: dwc3: ep0: ignore XferNotReady(STATUS) when we're not expecting it · 77fa6df8
      Felipe Balbi 提交于
      Databook doesn't say we should stall if we
      get XferNotReady(STATUS) while we're expecting
      something else.
      
      Instead of stalling and restarting, tests have
      proven that ignoring the event is far more
      effective.
      
      This problem has been caught while rewriting
      ep0 handling in order we pass Link Layer TD7.6.
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      77fa6df8
    • F
      usb: dwc3: ep0: drop dead code · 4635d3f2
      Felipe Balbi 提交于
      There's no such thing as XferNotReady(SETUP), we
      can safely drop all that code with no problems
      whatsoever.
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      4635d3f2
    • F
      usb: dwc3: ep0: split the special cases on ep0_queue · d9b33c60
      Felipe Balbi 提交于
      We can return early from each if () branch
      and split the special cases for clarity. While
      at that also add a comment to the delayed_status
      case.
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      d9b33c60
    • F
      usb: dwc3: ep0: drop unnecessary variable · 35f75696
      Felipe Balbi 提交于
      When returning from ep0_queue, we have an
      unnecessary ret variable which is always
      zero. Remove it.
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      35f75696
  2. 02 7月, 2012 2 次提交
  3. 26 6月, 2012 1 次提交
  4. 25 6月, 2012 1 次提交
  5. 04 6月, 2012 8 次提交
  6. 04 5月, 2012 1 次提交
  7. 02 5月, 2012 2 次提交
  8. 30 4月, 2012 1 次提交
  9. 11 4月, 2012 1 次提交
  10. 10 4月, 2012 2 次提交
  11. 02 3月, 2012 2 次提交
  12. 28 2月, 2012 1 次提交
    • F
      usb: dwc3: gadget: use generic map/unmap routines · 0fc9a1be
      Felipe Balbi 提交于
      those routines have everything we need to map/unmap
      USB requests and it's better to use them.
      
      In order to achieve that, we had to add a simple
      change on how we allocate and use our setup buffer;
      we cannot allocate it from coherent anymore otherwise
      the generic map/unmap routines won't be able to easily
      know that the GetStatus request already has a DMA
      address.
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      0fc9a1be
  13. 13 2月, 2012 1 次提交
    • F
      usb: dwc3: convert TRBs into bitshifts · f6bafc6a
      Felipe Balbi 提交于
      this will get rid of a useless memcpy on
      IRQ handling, thus improving driver performance.
      
      Tested with OMAP5430 running g_mass_storage on
      SuperSpeed and HighSpeed.
      
      Note that we are removing the little endian access
      of the TRB and all accesses will be in System endianness,
      if there happens to be a system in BE, bit 12 of GSBUSCFG0
      should be set so that HW does byte invariant BE accesses
      when fetching TRBs.
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      f6bafc6a
  14. 10 2月, 2012 1 次提交
    • G
      usb: dwc3: ep0: fix SetFeature(TEST) · 3b637367
      Gerard Cauvy 提交于
      When host requests us to enter a test mode,
      we cannot directly enter the test mode before
      Status Phase is completed, otherwise the core
      will never be able to deliver the Status ZLP
      to host, because it has already entered the
      requested Test Mode.
      
      In order to fix the error, we move the actual
      start of Test Mode right after we receive
      Transfer Complete event of the status phase.
      Signed-off-by: NGerard Cauvy <g-cauvy1@ti.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      3b637367
  15. 06 2月, 2012 3 次提交
  16. 24 1月, 2012 2 次提交
    • F
      usb: dwc3: ep0: fix compile warning · 1a0955fe
      Felipe Balbi 提交于
      commit 34c60a7 (usb: dwc3: ep0: tidy up Pending
      Request handling) introduced a compile warning
      by leaving an unused variable.
      
      This patch fixes that warning:
      
      drivers/usb/dwc3/ep0.c: In function ‘__dwc3_gadget_ep0_queue’:
      drivers/usb/dwc3/ep0.c:129:8: warning: unused variable ‘type’
      [-Wunused-variable]
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      1a0955fe
    • F
      usb: dwc3: ep0: tidy up Pending Request handling · 68d8a781
      Felipe Balbi 提交于
      The way our code was written, we should never have
      a DWC3_EP_PENDING_REQUEST flag set out of a Data Phase
      and the code in __dwc3_gadget_ep0_queue() did not
      reflect that situation properly.
      
      Tidy up that case to avoid any possible mistakes
      when starting requests for IRQs which are long
      gone.
      
      Cc: stable@vger.kernel.org
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      68d8a781
  17. 12 12月, 2011 6 次提交
    • F
      usb: dwc3: ep0: fix for possible early delayed_status · 68d3e668
      Felipe Balbi 提交于
      There is a very small possibility (previously unimagined
      by us) that the whole Mass Storage delayed status happens
      rather early, before we even get our XferNotReady event.
      
      In that case, we will be queueing a request to ep0 while
      we're still on Setup Phase and we would be waiting for
      another usb_ep_queue() forever.
      
      Handle such cases by clearing dwc->delayed_status so that
      we start control status from the next XferNotReady like
      there was no wait for Delayed Status.
      
      Tested against Linux 3.2-rc3 and USB30CV tool from USB-IF
      (on a Windows XP with USB3 PCIe card).
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      68d3e668
    • F
      usb: dwc3: ep0: fix GetStatus handling (again) · e2617796
      Felipe Balbi 提交于
      previous commit fixed part of it but it was still
      calling usb_ep_queue() from IRQ context without
      loosing locks. That cannot be done otherwise we will
      have a recursive locking.
      
      Also, we need to assign the 'dep' pointer on
      dwc->ep0_usb_req otherwise we will have a NULL
      pointer dereference on dwc3_map_buffer_to_dma().
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      e2617796
    • S
      usb: dwc3: ep0: use dwc3_request for ep0 requsts instead of usb_request · e0ce0b0a
      Sebastian Andrzej Siewior 提交于
      Instead of special functions and shortcuts for sending our internal
      answers to the host we started doing what the gadget does and used the
      public API for this. Since we only were using a few fields the
      usb_request was enough. Later added the list handling in order to
      synchronize the host / gadget events and now we require to have the
      dwc3_request struct around our usb_request or else we touch memory that
      does not belong to us. So this patch does this.
      Reported-by: NPartha Basak <p-basak2@ti.com>
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      e0ce0b0a
    • F
      usb: dwc3: workaround: missing disconnect event · df62df56
      Felipe Balbi 提交于
      DWC3 revisions <1.88a have an issue which would
      case a missing Disconnect event if cable is
      disconnected while there's a Setup packet
      pending the FIFO.
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      df62df56
    • S
      usb: dwc3: ep0: handle delayed_status again · 5bdb1dcc
      Sebastian Andrzej Siewior 提交于
      Since the re-worked ep0 handling (which uses HW's hints to recognize the ep0
      status) we lost the delayed status handling. This is used by the file and mass
      storage gadget to gain some extra time so setup its internal status before it
      can proceed further requests.
      In particular the storage gadget does nothing on USB_REQ_SET_CONFIGURATION but
      wakes up a thread which handles the request. If the udc driver continues ep0
      handling before the thread did its work then then endpoint is not yet
      configured and further requests will fail. Once the gadget is ready, it will
      enqueue an empty packet which is used for synchronization.
      In order to fix this issue, the patch does the following:
      Set ->delayed_status once the delayed_status has been notices and do not
      continue on the next XferNotReady event. We will continues ep0 processing once
      the gadget enqueued the zero packet for synchronization.
      
      A cleaner approach would be to enforce the gadget to enqueue an empty
      (zero) request even for the status phase but this would do for now.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      5bdb1dcc
    • S
      usb: dwc3: ep0: push ep0state into xfernotready processing · f0f2b2a2
      Sebastian Andrzej Siewior 提交于
      We wait for the XferNotReady before we start the transfer and by then we
      know ep0 state in which we supposed to be.
      This is some cleanup work for the following patch in which we require to
      know the ep0 state before the transfer completes.
      While here, also change the argument to dwc3_ep0_do_control_status() so
      we don't require the complete event structure but only the required
      piece of information.
      Inspired-by: NFelipe Balbi <balbi@ti.com>
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      f0f2b2a2