summaryrefslogtreecommitdiffstats
path: root/drivers/usb/dwc3/gadget.c (follow)
Commit message (Collapse)AuthorAgeFilesLines
* usb: dwc3: gadget: drop unnecessary loop when cleaning up TRBsFelipe Balbi2015-03-091-21/+16
| | | | | | | | | Now that we're using XFERINPROGRESS for all endpoint types (except Control), we will *always* be completing one TRB at a time, so it's safe to remove the loop from dwc3_cleanup_done_reqs. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: use common is_selfpoweredPeter Chen2015-01-291-1/+1
| | | | | | | Delete private selfpowered variable, and use common one. Signed-off-by: Peter Chen <peter.chen@freescale.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: add missing spin_lock()Felipe Balbi2015-01-291-0/+1
| | | | | | | | | | | | commit 8e74475b0e0a (usb: dwc3: gadget: use udc-core's reset notifier) added support for the new UDC core's reset notifier to dwc3 but while at it, it removed a spin_lock() from dwc3_reset_gadget() which might cause an unbalanced spin_unlock() further down the line Fixes: 8e74475b0e0a (usb: dwc3: gadget: use udc-core's reset notifier) Cc: <stable@vger.kernel.org> # v3.19 Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: remove reliance on dev_vdbg()Felipe Balbi2015-01-271-27/+38
| | | | | | | | By moving all dev_vdbg() to tracepoints, we can finally get rid of dev_vdbg() usage from dwc3. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: WARN() in case of unknown IRQFelipe Balbi2015-01-271-1/+1
| | | | | | | | | if an unknown IRQ event is triggered, that means the HW is really misbehaving. Instead of printing a debug message, let's WARN() so users report when that happens. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: avoid variable shadowingFelipe Balbi2015-01-271-6/+1
| | | | | | | We already have both ret and dwc defined in this same function. Signed-off-by: Felipe Balbi <balbi@ti.com>
* Merge tag 'v3.19-rc5' into nextFelipe Balbi2015-01-191-2/+4
|\ | | | | | | | | | | | | | | Linux 3.19-rc5 Conflicts: drivers/usb/dwc2/gadget.c drivers/usb/gadget/udc/bdc/bdc_ep.c
| * usb: dwc3: gadget: Stop TRB preparation after limit is reachedAmit Virdi2015-01-141-0/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | DWC3 gadget sets up a pool of 32 TRBs for each EP during initialization. This means, the max TRBs that can be submitted for an EP is fixed to 32. Since the request queue for an EP is a linked list, any number of requests can be queued to it by the gadget layer. However, the dwc3 driver must not submit TRBs more than the pool it has created for. This limit wasn't respected when SG was used resulting in submitting more than the max TRBs, eventually leading to non-transfer of the TRBs submitted over the max limit. Root cause: When SG is used, there are two loops iterating to prepare TRBs: - Outer loop over the request_list - Inner loop over the SG list The code was missing break to get out of the outer loop. Fixes: eeb720fb21d6 (usb: dwc3: gadget: add support for SG lists) Cc: <stable@vger.kernel.org> # v3.9+ Signed-off-by: Amit Virdi <amit.virdi@st.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
| * usb: dwc3: gadget: Fix TRB preparation during SGAmit Virdi2015-01-141-2/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When scatter gather (SG) is used, multiple TRBs are prepared from one DWC3 request (dwc3_request). So while preparing TRBs, the 'last' flag should be set only when it is the last TRB being prepared from the last dwc3_request entry. The current implementation uses list_is_last to check if the dwc3_request is the last entry from the request_list. However, list_is_last returns false for the last entry too. This is because, while preparing the first TRB from a request, the function dwc3_prepare_one_trb modifies the request's next and prev pointers while moving the URB to req_queued. Hence, list_is_last always returns false no matter what. The correct way is not to access the modified pointers of dwc3_request but to use list_empty macro instead. Fixes: e5ba5ec833aa (usb: dwc3: gadget: fix scatter gather implementation) Signed-off-by: Amit Virdi <amit.virdi@st.com> Cc: <stable@vger.kernel.org> # v3.9+ Signed-off-by: Felipe Balbi <balbi@ti.com>
* | usb: dwc3: gadget: Remove redundant checkAmit Virdi2015-01-121-3/+0
| | | | | | | | | | | | | | | | dwc3_gadget_init_hw_endpoints calls dwc3_alloc_trb_pool only if epnum is not equal to 0 or 1. Hence, rechecking it in the called function is redundant. Signed-off-by: Amit Virdi <amit.virdi@st.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* | usb: dwc3: Fixed a typo in commentsMickael Maison2015-01-121-1/+1
|/ | | | | | | Fixed a typo in comments Signed-off-by: Mickael Maison <mickael.maison@gmail.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: use udc-core's reset notifierFelipe Balbi2014-11-111-5/+12
| | | | | | | | | Replace usb_gadget_driver's disconnect with udc-core's reset notifier at bus reset handler. Signed-off-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Peter Chen <peter.chen@freescale.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: make HIRD threshold configurableHuang Rui2014-11-031-5/+1
| | | | | | | | | | | | | | | HIRD threshold should be configurable by different platforms. From DesignWare databook: When HIRD_Threshold[4] is set to 1b1 and HIRD value is greater than or equal to the value in HIRD_Threshold[3:0], dwc3 asserts output signals utmi_l1_suspend_n to put PHY into Deep Low-Power mode in L1. When HIRD_Threshold[4] is set to 1b0 or the HIRD value is less than HIRD_Threshold[3:0], dwc3 asserts output signals utmi_sleep_n on L1. Signed-off-by: Huang Rui <ray.huang@amd.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: add lpm erratum supportHuang Rui2014-11-031-0/+13
| | | | | | | | | | | | | | | | | | When parameter DWC_USB3_LPM_ERRATA_ENABLE is enabled in Andvanced Configuration of coreConsultant, it supports of xHCI BESL Errata Dated 10/19/2011 is enabled in host mode. In device mode it adds the capability to send NYET response threshold based on the BESL value received in the LPM token, and the threhold is configurable for each soc platform. This patch adds an entry that soc platform is able to define the lpm capacity with their own device tree or bus glue layer. [ balbi@ti.com : added devicetree documentation, spelled threshold completely, made sure threshold is only applied to proper core revisions. ] Signed-off-by: Huang Rui <ray.huang@amd.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: gadget: remove unnecessary 'driver' argumentFelipe Balbi2014-11-031-2/+1
| | | | | | | | | | | | | | | | | | | | | | now that no UDC driver relies on the extra 'driver' argument to ->udc_stop(), we can safely remove it. This commit is based on previous work by Robert Baldyga <r.baldyga@samsung.com> which can be found at [1]; however that patch turned out to have a high probability of regressing many UDC drivers because of a blind search & replace s/driver/$udc->driver/ which caused the 'driver' argument to stop_activity() to be a valid non-NULL pointer when it should be NULL, thus causing UDCs to mistakenly call gadget driver's ->disconnect() callback. [1] http://markmail.org/message/x5zneg4xea4zntab Acked-by: Peter Chen <peter.chen@freescale.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: WARN() on bogus usb_ep_queue()Felipe Balbi2014-11-031-2/+10
| | | | | | | | | | | | | | | Some gadget/function drivers might want to do improper request recycling by allocating a single request from one particular endpoint and queueing it to another completely unrelated endpoint. One such case was found with f_loopback.c. To prevent such cases from happening again, let's WARN() so we get a loud enough failure and persuade users to report errors. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: set state to NOT_ATTACHED on disconnect_irqFelipe Balbi2014-11-031-0/+1
| | | | | | | | whenever we get a Disconnect Interrupt, we should make sure to update out udc state to NOT_ATTACHED, otherwise sysfs will show wrong values. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: get rid of ->prepare()/->complete()Felipe Balbi2014-11-031-14/+6
| | | | | | | | | | | Using ->prepare()/->complete() to mask/unmask IRQs is wrong at least for dwc3. We need to make sure that by the end of ->resume(), IRQs are working and ready to fire because a child device may need working IRQs for its own ->resume() method. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: Properly initialize LINK TRBJack Pham2014-10-231-2/+1
| | | | | | | | | | | | | | | On ISOC endpoints the last trb_pool entry used as a LINK TRB is not getting zeroed out correctly due to memset being called incorrectly and in the wrong place. If pool allocated from DMA was not zero-initialized to begin with this will result in the size and ctrl values being random garbage. Call memset correctly after assignment of the trb_link pointer. Fixes: f6bafc6a1c ("usb: dwc3: convert TRBs into bitshifts") Cc: <stable@vger.kernel.org> # v3.4+ Signed-off-by: Jack Pham <jackp@codeaurora.org> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: fix set_halt() bug with pending transfersFelipe Balbi2014-10-201-4/+12
| | | | | | | | | | | | | | | | According to our Gadget Framework API documentation, ->set_halt() *must* return -EAGAIN if we have pending transfers (on either direction) or FIFO isn't empty (on TX endpoints). Fix this bug so that the mass storage gadget can be used without stall=0 parameter. This patch should be backported to all kernels since v3.2. Cc: <stable@vger.kernel.org> # v3.2+ Suggested-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: hold the lock through set_wedge()'s lifeFelipe Balbi2014-10-201-3/+6
| | | | | | | | | Instead of releasing the lock and calling locked versions of our set_halt() methods, let's hold the lock all the way through and call unlocked versions of those functions. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: move isoc endpoint check to unlocked set_haltFelipe Balbi2014-10-201-8/+5
| | | | | | | | | __dwc3_gadget_ep_set_halt() is the function which handles the actual halt feature. In order to cope with some extra cleanup comming as a follow-up patch let's move the isochronous endpoint check there too. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: gadget: Refactor request completionMichal Sojka2014-09-251-1/+1
| | | | | | | | | | | | | | Use the recently introduced usb_gadget_giveback_request() in favor of direct invocation of the completion routine. All places in drivers/usb/ matching "[-.]complete(" were replaced with a call to usb_gadget_giveback_request(). This was compile-tested with all ARM drivers enabled and runtime-tested for musb. Signed-off-by: Michal Sojka <sojka@merica.cz> Acked-by: Felipe Balbi <balbi@ti.com> Tested-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
* Merge tag 'v3.17-rc5' into nextFelipe Balbi2014-09-161-8/+3
|\ | | | | | | | | | | | | | | | | | | Linux 3.17-rc5 Signed-off-by: Felipe Balbi <balbi@ti.com> Conflicts: Documentation/devicetree/bindings/usb/mxs-phy.txt drivers/usb/phy/phy-mxs-usb.c
| * usb: dwc3: fix TRB completion when multiple TRBs are startedFelipe Balbi2014-09-051-7/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After commit 2ec2a8be (usb: dwc3: gadget: always enable IOC on bulk/interrupt transfers) we created a situation where it was possible to hang a bulk/interrupt endpoint if we had more than one pending request in our queue and they were both started with a single Start Transfer command. The problems triggers because we had not enabled Transfer In Progress event for those endpoints and we were not able to process early giveback of requests completed without LST bit set. Fix the problem by finally enabling Xfer In Progress event for all endpoint types, except control. Fixes: 2ec2a8be (usb: dwc3: gadget: always enable IOC on bulk/interrupt transfers) Cc: <stable@vger.kernel.org> # v3.14+ Reported-by: Pratyush Anand <pratyush.anand@st.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
| * usb: dwc3: gadget: Fix desc NULL pointer in dwc3_gadget_ep_queue()Zhuang Jin Can2014-09-031-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | dep->endpoint.desc is checked at the beginning of dwc3_gadget_ep_queue(), but after that it may be set to NULL by another thread and then accessed again in dwc3_gadget_ep_queue(). This will lead to kernel oops. Expand spinlock protection area to aviod race condition. Signed-off-by: Zhuang Jin Can <jin.can.zhuang@intel.com> Signed-off-by: Jiebing Li <jiebing.li@intel.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* | usb: dwc3: add tracepoints to aid debuggingFelipe Balbi2014-09-051-21/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | When we're debugging hard-to-reproduce and time-sensitive use cases, printk() poses too much overhead. That's when the kernel's tracing infrastructure comes into play. This patch implements a few initial tracepoints for the dwc3 driver. More traces can be added as necessary in order to ease the task of debugging dwc3. Reviewed-by: Paul Zimmerman <paulz@synopsys.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* | usb: dwc3: gadget: cmd argument should always be unsignedFelipe Balbi2014-09-051-1/+1
| | | | | | | | | | | | | | No functional changes, just making sure we're dealing with unsigned ints. Signed-off-by: Felipe Balbi <balbi@ti.com>
* | usb: dwc3: move all string helper functions to debug.hFelipe Balbi2014-09-051-88/+1
| | | | | | | | | | | | | | | | | | | | Those functions are only using within debugging messages, grouping them into debug.h makes sense. While at that, also add missing multiple inclusion guard. Signed-off-by: Felipe Balbi <balbi@ti.com>
* | usb: dwc3: remove unnecessary OOM messagesJingoo Han2014-08-201-9/+2
|/ | | | | | | | The site-specific OOM messages are unnecessary, because they duplicate the MM subsystem generic OOM message. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* Merge tag 'usb-for-v3.17' of ↵Greg Kroah-Hartman2014-07-211-4/+3
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-next Felipe writes: usb: patches for v3.17 merge window Surprisingly enough, while a big set of patches, the majority is composed of cleanups (using devm_*, fixing sparse errors, moving code around, adding const, etc). The highlights are addition of new support for PLX USB338x devices, and support for USB 2.0-only configurations of the DWC3 IP core. Signed-of-by: Felipe Balbi <balbi@ti.com>
| * usb: dwc3: gadget: remove unnecessary 'start_new' variableJingoo Han2014-07-101-4/+3
| | | | | | | | | | | | | | | | Remove 'start_new' variable from dwc3_endpoint_transfer_complete(), since this variable has not been used. Signed-off-by: Jingoo Han <jg1.han@samsung.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* | usb: dwc3: gadget: check link trb after free_slot is increasedZhuang Jin Can2014-06-191-4/+4
|/ | | | | | | | | | | | | | | | | | | | | | | | | In ISOC transfers, when free_slot points to the last TRB (i.e. Link TRB), and all queued requests meet Missed Interval Isoc error, busy_slot points to trb0. busy_slot->trb0 trb1 ... free_slot->trb31(Link TRB) After end transfer and receiving the XferNotReady event, trb_left is caculated as 1 which is wrong, and no TRB will be primed to the endpoint. The root cause is free_slot is not increased the same way as busy_slot. When busy_slot is increased by one, it checks if points to a link TRB after increasement, but free_slot checks it before increasement. free_slot should behave the same as busy_slot to make the trb_left caculation correct. Reviewed-by: Pratyush Anand <pratyush.anand@st.com> Signed-off-by: Zhuang Jin Can <jin.can.zhuang@intel.com> Signed-off-by: Jiebing Li <jiebing.li@intel.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* Merge tag 'usb-for-v3.16' of ↵Greg Kroah-Hartman2014-05-231-6/+77
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-next Felipe writes: usb: patches for v3.16 merge window Not a lot here during this merge window. Mostly we just have the usual miscellaneous patches (removal of unnecessary prints, proper dependencies being added to Kconfig, build warning fixes, new device ID, etc. Other than those, the only important new features are the new support for OS Strings which should help Linux Gadget Drivers behave better under MS Windows. Also Babble Recovery implementation for MUSB on AM335x. Lastly, we also have ARCH_QCOM PHY support though phy-msm. Signed-of-by: Felipe Balbi <balbi@ti.com> Conflicts: drivers/usb/phy/phy-mv-u3d-usb.c
| * usb: dwc3: no need to initialize ret variableAndy Shevchenko2014-05-151-1/+1
| | | | | | | | | | | | | | | | First usage of ret variable will re-write initial value. Thus, there is no need to initialize it. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
| * usb: dwc3: gadget: pretty print Generic CMDsFelipe Balbi2014-04-251-0/+29
| | | | | | | | | | | | | | | | this makes it slightly easier to read generic CMD logs. It also helps make sure we're sending proper parameters for each command. Signed-off-by: Felipe Balbi <balbi@ti.com>
| * usb: dwc3: gadget: pretty print link statesFelipe Balbi2014-04-251-3/+41
| | | | | | | | | | | | | | this makes it slightly easier to read link state change interrupt logs. Signed-off-by: Felipe Balbi <balbi@ti.com>
| * usb: dwc3: gadget: print both cmd string and numberFelipe Balbi2014-04-251-2/+2
| | | | | | | | | | | | | | That way it's easy for humans looking at dmesg and humans(?) looking at Databooks. Signed-off-by: Felipe Balbi <balbi@ti.com>
| * usb: dwc3: gadget: clear stall when disabling endpointFelipe Balbi2014-04-161-0/+4
| | | | | | | | | | | | | | | | | | | | | | so it seems like DWC3 IP doesn't clear stalls automatically when we disable an endpoint, because of that, we _must_ make sure stalls are cleared before clearing the proper bit in DALEPENA register. Cc: <stable@vger.kernel.org> # v3.4+ Reported-by: Johannes Stezenbach <js@sig21.net> Signed-off-by: Felipe Balbi <balbi@ti.com>
* | usb: dwc3: gadget: Iterate only over valid endpointsJack Pham2014-04-161-8/+4
|/ | | | | | | | | | | Make dwc3_gadget_resize_tx_fifos() iterate only over IN endpoints that are actually present, based on the num_in_eps parameter. This terminates the loop so as to prevent dereferencing a potential NULL dwc->eps[i] where i >= (num_in_eps + num_out_eps). Signed-off-by: Jack Pham <jackp@codeaurora.org> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: remove known conditionsDan Carpenter2014-03-071-4/+2
| | | | | | | | We know what "value" is and it upsets static checkers that we appear to have doubts about it. Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: cut and paste fixups in suspend/resumeDan Carpenter2014-03-071-2/+2
| | | | | | | | | | These were cut and paste from the ->disconnect function. Fixes commit 30d577b9bcc4 ('usb: dwc3: gadget: call gadget driver's ->suspend/->resume') Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: pre-start Stream transfers when they're queuedFelipe Balbi2014-03-051-0/+17
| | | | | | | we need to pre-start stream transfers otherwise we will never know when to start them. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: call gadget driver's ->suspend/->resumeFelipe Balbi2014-03-051-0/+35
| | | | | | | | | When going into bus suspend/resume we _must_ call gadget driver's ->suspend/->resume callbacks accordingly. This patch implements that very feature which has been missing forever. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: add 'force' argument to stop_active_transferPaul Zimmerman2014-03-051-7/+8
| | | | | | | | | It's not always we need to force a transfer to be removed from the core's internal cache. This extra argument will help differentiating those two cases. Signed-off-by: Paul Zimmerman <paulz@synopsys.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: make sure HIRD threshold is 0 in superspeedFelipe Balbi2014-03-051-0/+4
| | | | | | | | During superspeed, HIRD threshold should always be zero. Curent driver wasn't making sure that was the case. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: set KEEP_CONNECT in case of hibernationFelipe Balbi2014-03-051-4/+14
| | | | | | | | | if we have hibernation configured, Databook instructs us to set KEEP_CONNECT bit together with RUN_STOP bit, in step 9 of section 12.3.6.1 Initialization for Hibernation Support. Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: add a 'restore' argument to set_ep_configPaul Zimmerman2014-03-051-10/+22
| | | | | | | | | | | | | | | | | That argument will be used in later patches when we have working hibernation support. For now, always pass it as false. The idea of this patch is to decrease to size of following patches and slowly add hibernation building blocks to the gadget side of dwc3 so that it becomes very easy to review the actual hibernation code. [ balbi@ti.com : rewrote patch on top of current tree. Added commit log. ] Signed-off-by: Paul Zimmerman <paulz@synopsys.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: gadget: implement dwc3_gadget_get_link_statePaul Zimmerman2014-03-051-0/+16
| | | | | | | | | This function will be used during hibernation to get the current link state. It will be needed at least for Hibernation support. Signed-off-by: Paul Zimmerman <paulz@synopsys.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
* usb: dwc3: workaround: bogus hibernation eventsFelipe Balbi2014-03-051-0/+31
| | | | | | | | | | | | | Revision 2.20a of the core has a known issue which would generate bogus hibernation events _and_ random failures on USB CV TD.9.23 test case. The suggested workaround is to ignore hibernation events which don't match currently connected speed. Signed-off-by: Felipe Balbi <balbi@ti.com>