summaryrefslogtreecommitdiff
path: root/drivers/usb (follow)
Commit message (Collapse)AuthorAge
...
* | | USB: gadget: Add support for DUN Character DriverMayank Rana2016-03-23
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This driver provides character device node (/dev/at_usb0) to user space application for file operations like open, close, read, write, poll and ioctl (for control signals). This change also adds required support to use this new character bridge driver with existing USB Serial driver and android gadget driver. Change-Id: I26f297636de585d3fd99d10fac76ecb71f852df3 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: gadget: Add snapshot of changes with u_serialMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Squash and apply following u_serial driver changes taken from msm-3.10 kernel as of commit ec18e1c5aed (Merge "mmc: card: set dma_mask as the queue bounce limit") feb56a3 usb: gadget: Fix bug in serial driver RX path 2ff1b9a USB: Gadget: u_serial: Debugfs for endpoint buffer monitoring 272d2fd USB: gadget: u_serial: free read/write requests upon queue failure 950a3a3 USB: Gadget: u_serial: Freeing usb requests as a part of gs_close e4e6bc4 USB: u_serial: Don't allow UDC to append and send a zero length packet 4bd2646 usb: gadget: serial: Limit write permissions to root 13e7219 USB: Fix multiple issues found by static analysis tool 505294c USB: Debugfs: Fix compilation issues when debugfs is disabled 0e7633e usb: gadget: Fix code quality issues when accessing port 607dbeb USB: u_serial: Don't free usb_requests in gs_close and reuse them 4aebedc usb: u_serial: Fix NULL pointer dereference in u_serial tty callbacks Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: gadget: serial: Add snapshot of changes with f_serialMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Squash and apply following f_serial driver changes taken from msm-3.10 kernel as of commit ec18e1c5aed (Merge "mmc: card: set dma_mask as the queue bounce limit") d98217e USB: android gadget: queue the request only when serial is online b8bd483 USB: android gadget: Add interrupt ep and modem support in f_serial 7b56862 USB: Add super speed descriptors for android functions c5a7f7f gadget: u_serial: Add tiocmset/tiocmget functionality 2a821c8 usb: gadget: Add debug message to print the control line state information Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Allow epfile to be opened only onceMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Due to USB cable disconnect, ADBD closes its epfiles and re-opens the same. In normal operation the sequence is: ffs_func_eps_disable() setting epfile->error to 1 ffs_epfile_release() setting epfile->error to 1 ffs_epfile_open() setting epfile->error to 0 In some cases when above sequeunce gets changed, epfile->error is set to 1. Hence there is no data transfer happening on ep-IN endpoint. Fix this by not allowing opening of epfiles until it has being successfully released. Change-Id: I26b9ec1b6218d00cc0965ce3e71fcea49f9bf567 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Use config_ep_by_speed() for ADB endpointsMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | config_ep_by_speed() configures endpoint based on speed and uses already available endpoint descriptors. Here it overrides maxpacket field based on selected descriptor for endpoint. maxpacket field is used by some of UDC driver to resize TXFIFO for IN endpoint. Due to maxpacket is not being configured with selected endpoint descriptor, UDC driver uses previously stale maxpacket value which results into wrong TXFIFO calculated for used IN endpoint. Fix this issue by calling config_ep_by_speed() for ADB endpoints to make sure that proper value is updated with maxpacket field based on descriptor. Change-Id: I9121f4df898de1455f9be4333ca8d0e744f4eb9e Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Don't queue already queued request againTarun Gupta2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | f_fs uses only one request per ep and driver is trying to queue same request again before it completed. This is seen in following scenario, as part of system suspend wait_for_completion was interrupted by -ERESTARTSYS, and driver tried to dequeue this request, as USB was in LPM it was unable to dequeue this and later on system resume ffs_epfile_read tried to queue same request again which was never dequeued or completed. ep_queue will return error if same request is queued again while it is in progress. User space considers this ep_queue failure as halt and try to clear halt condition that never happened. When User space is trying to clear halt by that time USB has entered LPM again leading to crash. Avoid this by making sure same request is not queued again until it is completed. Change-Id: I6e9f357b9b8a47753b1323b4308e60844d7dec94 Signed-off-by: Tarun Gupta <tarung@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Add memory barrier before atomic operationsMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In few instances, it is observed that multiple adbd instances are running on device causing condition BUG_ON(ffs->gadget) to be true. ffs->opened and ffs->ref atomic variables are used here to make decision for checking ffs->gadget. These atomic variable operations requires expilict memory barrier to make sure that update to ffs->gadget is visible to other CPUs before updated atomic variable based value is seen. This change also adds explicit memory barriers before reading or modified any atomic varaiables. Change-Id: I3c846eb6bbb53663892e05d51ebac8439aac957a Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: gadget: f_fs: Allow only one adb daemon perform device openSaket Saurabh2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As part of ffs_ep0_open(), atomic variable ffs.opened is set and as part of ffs_ep0_release() it is cleared. Also as part of release operation, in ffs_data_clear() ffs->gadget is set to NULL. If two adb daemons are running in parallel, then BUG ON is observed as part of release operation as ffs->gadget is not set to NULL. To fix the issue add check for ffs->opened to allow only one adb daemon perform device open. This ensures open and release operation are performed in serialized way and avoids any race. Also add debug print for dumping the ffs gadget. Change-Id: Ifccdfa6068f506bb7dfdc9945b60591da530df8f Signed-off-by: Saket Saurabh <ssaurabh@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Add print message in case of error scenarioVijayavardhan Vennapusa2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | Add print message in case of error scenarios which will be useful for debugging adb offline issues. Change-Id: I75bc136eab05151abb187c1fa1e5956b6f507297 Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Avoid using completion variable on stackSujeet Kumar2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | done completion variable is local stack variable to ffs_epfile_io(). It is being used to unblock ffs_epfile_io() from USB request completion context where done is accessed through req->context. If ffs_epfile_io() is unblocked or interrupted due to epfile close or any signal before USB request completion is handled, req->context is having stale "done" reference causing invalid access. Fix this issue by storing done completion reference with epfile structure instead of having it on stack to have valid req->context in completion handler. Change-Id: I15102538d1b5bee14dfa3c7b3fa1f8e3f767cf71 Signed-off-by: Sujeet Kumar <ksujeet@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Fix disconnect check during ongoing IOManu Gautam2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | F_FS function driver allocated ffs_eps and updates ffs_ep->ep to corresponding usb_ep during func->bind and never clears it. On bind it also saves ffs_ep context in epfile->ep. During func->disable, it clears only ffs_ep context in epfile->ep and on func->unbind it frees ffs_eps memory. ffs_epfile_io routine currently relies on ffs_ep->ep (which is never cleared and ffs_ep could be freed on unbind) to detect any disconnect during active IO. This can result in various issues e.g. use after free use of ffs_ep if unbind finished before epfile_io could resume or "stop adbd" trying to dequeue a freed USB request when epfile_io could execute only after F_FS got disabled as 'if (ep->ep)' check would be TRUE. Fix this by checking stored ffs_ep context against latest epfile->ep to figure out if endpoint got disabled or changed before acquiring spin_lock. Change-Id: I6bdcdf0dff0813ed7b2af8c24f544a22796b0369 Signed-off-by: Manu Gautam <mgautam@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Check error status before doing epfile I/OVijayavardhan Vennapusa2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Set error status before disabling endpoint during function disable and also check error status before handling I/O. If error status is set, return error status to read/write calls made by userspace. Also set file's private data to NULL during epfile release. Change-Id: I14b5ee541dfc18a7802ef4a8033878a7729d9adb Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Fail stale read IOs after disconnectSujeet Kumar2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After a USB disconnect, endpoints for adb are disabled. After this no IO is allowed on the endpoints. Since, adbd is not aware of this disconnect, it may still perform read/writes IO. For adb writes, IOs are failed, but for adb reads kernel waits untill endpoints are enabled. When a USB disconnect and adb read still queued a buffer to kernel, ffs_epfile_io simply waits for endpoint to be enabled. A next connect happens and endpoints are enabled after set_alt, the adb read stale buffer from previous session continues and queues to endpoint. All this time, adb did not close the epfile because it did not get return status on the IOs which it queued. This is an issue, because a new session is not established and both userspace and kernel goes out of sync. To fix this issue, when endpoints are disbled set epfile error. This epfile error is only cleared in epfile open. This will ensure that after a USB disconnect and connect, new session is established. Also, return ENODEV if endpoints not enabled rather than EINTR as EINTR case, and simply retries the request. Incase usb_ep_queue failed, return -EIO inspite of depend on return status from usb_ep_queue. Change-Id: I6e677e98ec28e5462b372ed290acdde251286f48 Signed-off-by: Sujeet Kumar <ksujeet@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Fix epfile crash during composition switchSujeet Kumar2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | epfile's ep pointer may be NULL during adb transfer and composition switch happening in parallel. As part of composition switch, first it is set to NONE. Setting sys.usb.config to NONE stops adb and disables the composition. stop adb is not blocking call and adb still might be doing epfile read/write for some time when function unbind is ongoing making the data structures NULL. To fix this crash, call usb_ep_dequeue only if ep->ep is valid. Similarly in success case, return ep->status only if ep->ep is valid otherwise return -ENODEV. Change-Id: Ic152fc1db31cad6f97b8d16d91350dad857a4bf9 Signed-off-by: Sujeet Kumar <ksujeet@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | USB: f_fs: Set ffs->func to NULL after disabling endpoint in set_alt()Vijayavardhan Vennapusa2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When adb root is performed, userspace will close and open ffs_epsfile. Closing this file will call ffs_functionfs_callback() which does call remove_config(). This will call ffs_function_eps_disable to disable endpoints and then calls ffs_func_unbind(). Unbind() will also call endpoint disable which might lead to disabling endpoint which is already disabled. Some of UDC driver throws WARN_ON() if same endpoint is being disabled multiple time. Hence set ffs->func to NULL after disabling endpoints in set_alt() to overcome WARN_ON(). Change-Id: I3052bdee74a1793d4e003de4b991d353e5d699b0 Signed-off-by: Vijayavardhan Vennapusa <vvreddy@codeaurora.org> Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: dwc3-msm: Update timeout value for EP commandDov Levenglick2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The previous timeout value was explained as being based on trial and error. We saw a timeout as high as 800[us]. In order to be on the safe-side, the new timeout value is increased to allow such a delay with room for error Change-Id: I7bc953d9bd494b57dd5492b492d48b18994e6b8f Signed-off-by: Dov Levenglick <dovl@codeaurora.org>
* | | Revert "usb: dwc3: Allocate TRB pool upon enabling endpoint"Mayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This reverts commit 55312d5442f147aa1a366e8ecb483b07e38961b3. WARN_ON() is seen from dma mapping API while freeing TRBs on USB cable disconnect (i.e usb endpoint disable context) due interrupts are disabled. Change-Id: Ib5689cbd5a379a8d1dc1a734026174779202386b Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: dwc3-msm: Allow compilation when USB_GADGET=nJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | Fix link errors when USB_GADGET=n which causes dwc3/gadget.c not to be built. These symbols are only used in the msm_ep_config/ unconfig functions so we can conditionally compile them. Signed-off-by: Jack Pham <jackp@codeaurora.org>
* | | usb: dwc3: host: Call arch_setup_dma_ops() before setting DMA maskJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For host mode operation, the DWC3 driver instantiates an XHCI device directly using platform_device_alloc()/_add() instead of using typical device population methods (i.e. DT or ACPI). In the latter cases, there is additional setup involved beyond the allocation itself, not the least of which is DMA setup. On ARM64 the recent commit 1dccb598df54 ("arm64: simplify dma_get_ops") sets the default DMA operations to dummy ops. This causes a regression as this directly created XHCI platform device now fails probe when the call to dma_set_mask_and_coherent() is unable to proceed due to dma_supported() returning false. Since we know that the XHCI device is a child of DWC3 and hence is also DMA-capable, fix this in the DWC3 host driver by simply calling arch_setup_dma_ops() after allocating the platform_device. Signed-off-by: Jack Pham <jackp@codeaurora.org>
* | | dwc3: gadget: Ignore suspend event if USB speed is unknownMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In some of host machine reboot usecases, it has been found that multiple suspend events are being received before usb device is being enumerated with host including receiving suspend before BUS RESET. This suspend event is being seen due to not host initiated suspend but due to LINE state at that point and may put USB Host and Device out of sync where host may not send any more BUS RESET which would cause USB device enumeration as unknown device with host machine. Fix this issue by honouring suspend event only when USB enumeration speed is known. CRs-Fixed: 717151 Change-Id: I201f106d1be71716eaa7a6246d2187889ea53a9c Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: dwc3: Add changes to support dual-role switchingJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This patch is a squash of several commits from msm-3.18 that add support for dual-role switching (formerly known as "OTG") to the DWC3 and XHCI platform drivers. Based on the following commits: usb: dwc3: Introduce OTG driver for dwc3 usb: dwc3-msm: Add support for LPM on cable disconnect DWC3: Enable XHCI host in OTG mode USB: dwc3: Add support for host bus suspend usb: dwc3 / xhci_plat: Call xhci_suspend/resume when entering/exiting LPM USB: dwc3: gadget: Implement gadget_vbus_draw() API USB: gadget: dwc3: Fix composition switch issue during cable disconnect usb: dwc3: notify gadget disconnect upon VBUS low usb: dwc3: msm: Remove last of dwc3_otg dwc3: Reset USB controller/PHY after psy connect indication at bootup dwc3: Use otg_sm_work state machine for host and device only mode Signed-off-by: Jack Pham <jackp@codeaurora.org>
* | | usb: dwc3: Add support for POR upon composition switchHemant Kumar2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Composition switch to GSI transport based composition from another GSI transport based composition requires power on reset of USB controller to synchronize operation with USB wrapper for GSI. Specifically GSI_EN bit cannot be cleared without performing usb controller reset. Hence introduce gadget restart operation to simulate vbus off and vbus on and perform this operation from gsi bind config. Change-Id: Ie4695807c73c2d14c0d9e17c486f34a90fd93ddb Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
* | | usb: dwc3: gadget: Increase the link state change timeout valueHemant Kumar2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | After the device remote wake up some USB hosts are driving bus resume for longer than 3 seconds. As a result link state change does not happen within 3 seconds and remote wake up fails. In worst case it is observed that usb host is driving bus resume for 8 seconds. Hence increase the timeout value to 16 seconds. CRs-Fixed: 803183 Change-Id: I1cbb29ccd2b4e264c032d7237efcfd87cef71942 Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
* | | usb: dwc3: gadget: Avoid unclocked access due to pm_runtime_get failureTarun Gupta2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If remote wakeup request is received during system resume where resume_early is still processing, pm_runtime_get_sync returns -EACCES error as pm_runtime framework is disabled between late_suspend and early_resume. Due to failure of this API controller did not exit LPM. This leads to unclocked access of registers as part of remote wakeup processing causing target to crash. Fix this by checking for return value of pm_runtime_get_sync, and queuing dwc3_gadget_wakeup_work again with intermediate delay of 100ms for maximum of 20 times. Change-Id: I8e2215ef9ee708e86356622e85fd2f23a18f7944 Signed-off-by: Tarun Gupta <tarung@codeaurora.org>
* | | usb: dwc3: gadget: Fix PM runtime get/put in case of remote wakeupAzhar Shaikh2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In case of remote wakeup interrupt, dwc3_gadget_wakeup_work() does a pm_runtime_get_sync() and dwc3_gadget_wakeup_interrupt() does not notify OTG state machine about this state change. Due to which OTG will be still in B_SUSPEND state. Now when bus suspend happens, since OTG state machine is already in B_SUSPEND state, it does not do a pm_runtime_put_autosuspend() and the count is not decremented. To fix, this do an unconditional pm_runtime_get_sync() and pm_runtime_put_noidle() in dwc3_gadget_wakeup_work() to avoid any unclocked register access. In dwc3_gadget_wakeup_interrupt() kick in SM machine in all cases and handle the remote wakeup same as host initiated resume, by clearing the B_SUSPEND bit so that OTG state machine moves to B_PERIPHERAL state. CRs-fixed: 829205 Change-Id: I270df517d5dd58fe28bf0087e0ba951c4e9e15ba Signed-off-by: Azhar Shaikh <azhars@codeaurora.org>
* | | dwc3: gadget: Replace polling mechnism to go into U0 stateMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Moving into U0 state is being confirmed by polling for 100ms after performing remote wakeup from device. In some of cases where host is taking more time to respond, remote wakeup is failing. Also USB specification does not define any limit for the host response time. Hence this change replaces polling mechnism by using LINK status change event notification with core and increase host response time from 100ms to 3 seconds. It also makes sure that composite_resume() is being called after remote wakeup is completed succesfully. It removes some of flag used to avoid race between bus suspend/resume and fuction suspend/resume as those are serialize and not required anymore. CRs-Fixed: 712681 Change-Id: I71285daf117282c738e139e9a05ead6ef16dd202 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: dwc3: gadget: Ignore L1 RESUME eventsJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Events may get generated for Link Power Management L1 Suspend and Resume. The suspend case currently ignores L1 and only proceeds to call the gadget driver suspend routines if it is for L2/U3 entry. However, the resume callback doesn't make this distinction, which will result in the gadget layer resume getting called for which there had not been a previous suspend. Instead of relying on reading the DWC3_DSTS register for U0 and U3 state, update dwc->link_state directly on receiving reset/wakeup and suspend/disconnect interrupts respectively. Change-Id: Ifaa71d2e85bd797154f368e7623bc8ff94b6a727 Signed-off-by: Mayank Rana <mrana@codeaurora.org> [jackp@codeaurora.org: Squashed with "usb: dwc3: gadget: Update link_state based on receiving interrupt" and "dwc3: gadget: Update link_state flag on receiving wakeup_interrupt" ] Signed-off-by: Jack Pham <jackp@codeaurora.org>
* | | usb: dwc3: Allow controller to enter LPM in bus suspendJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Add a DT property that decides whether to allow controller low power mode upon bus suspend, which will be invoked by the OTG state machine. It is also required to take the core out of LPM in case ep_queue is called by the upper layers. In this case, remote wakeup sequence will be initiated once the core is out of LPM. [jackp@codeaurora.org: Squashed with dwc3 changes from "usb: dwc3: Add new OTG state OTG_STATE_B_SUSPENDED"] Signed-off-by: Jack Pham <jackp@codeaurora.org>
* | | usb: dwc3-msm: Remove POST_INIT notificationJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | This notification for this event is no longer used, so remove it. Signed-off-by: Jack Pham <jackp@codeaurora.org>
* | | usb: dwc3: Add support to suspend SS phyJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Upstream commit 636e2a2caeafcb1b55b6799b29fe436039819eb9 (usb: dwc3: gadget: drop dwc3 manual phy control) removed the support to suspend the PHYs since the recent controller versions can do that automatically. But MSM targets, still do not have the latest controller and hence adding back the functionality to suspend/resume SS phy. Change-Id: I02a7ae8daf194a645f3582480f5a6b7d504b32ec Signed-off-by: Jack Pham <jackp@codeaurora.org>
* | | usb: dwc3: Add support for GSI operations to gadget frameworkHemant Kumar2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Targets supporting h/w accelerated path over GSI require GSI specific configuration of USB controller. Add support to enable h/w accelerated path to IPA. Include operations to configure USB endpoints as GSI capable, allocate TRBs that are associated with GSI capable endpoints, perform operations on these endpoints, and enable the GSI wrapper in DWC3 controller. This allows a function driver to use GSI based h/w accelerated data path. Change-Id: I62688c70a04b1fdab3e522e0af759ebab69d92d7 Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
* | | Revert "usb: dwc3: Reset the transfer resource index on SET_INTERFACE"Azhar Shaikh2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | commit a0c760181ca874 ("usb: dwc3: Reset the transfer resource index on SET_INTERFACE") was resetting the start_config_issued flag on receiving SetInterface request. But in cases where transfer resource index is shared between two endpoints and if both are trying to do a transfer then transfer on one of the endpoints will fail, since the transfer resource index will be acquired by the first endpoint and when the second endpoint tries to get the same transfer resource index, it will fail and hence STARTTRANSFER command also fails on second endpoint. Reverting this change ensures endpoints get allocated with unique transfer resource index. CRs-fixed: 953585 Change-Id: I7800356e455900cc39b9463366275c68db777199 Signed-off-by: Azhar Shaikh <azhars@codeaurora.org>
* | | usb: dwc3: Offload IRQ handling to softirq contextAzhar Shaikh2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | Move interrupt handling from threaded IRQ context to a tasklet. This may help in reducing latencies associated with starvation caused by high priority softirq over threaded USB IRQ. Change-Id: I2f988be9c484a6ee59236d9dfd7f06f07414ee96 Signed-off-by: Azhar Shaikh <azhars@codeaurora.org>
* | | usb: dwc3: Don't check usb isochronous endpoint check for ep0Mayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 5ad02fb813a9 ("usb: dwc3: gadget: move isoc endpoint check to unlocked set_halt") moved usb isochronous endpoint check form dwc3_gadget_ep_set_halt() to __dwc3_gadget_ep_set_halt(). dwc3_gadget_ep_set_halt() API is being called explicitly by USB function driver to stalls USB endpoints whereas __dwc3_gadget_ep_set_halt() API is also being called to stall ep0 on receiving invalid setup packet or not able to queue response to setup packet. It is not supposed to have any descriptors with ep0 early stage of enumeration process. Hence revert change which makes sure to check usb endpoint type against isochronous before halting endpoint with dwc3_gadget_ep_set_halt() instead of __dwc3_gadget_ep_set_halt(). Change-Id: I24b3e78613bf89340c812e353dafaf384ac4a057 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: dwc3: Clear pending events when it is bigger than event buffer sizeMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently there exists a race condition between dwc3_gadget_run_stop() and dwc3 gadget interrupt handling. run_stop() could get cleared and set again in between hard IRQ and threaded IRQ contexts, the DWC3_GEVNTCOUNT could first get set to 0, and then written again in the threaded handler with a non-zero value. Writing back to this register will cause hardware to decrement the value, and since it is 0 will result in a high unsigned value (~65k). To handle this condition mark received events as processed and return IRQ_HANDLED if events count is bigger than event buffer size. Note that the root cause of this condition will be addressed in another patch that prevents the race by synchronizing the hard and threaded interrupt handlers with dwc3_gadget_run_stop() getting called asynchronously. Change-Id: I4d6ade8243867885f26876a5233a8456a7e8bf42 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: dwc3: Disable ep0 and interrupts when clearing run/stopJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In dwc3_gadget_run_stop() when clearing the run/stop bit, ensure that IRQs are masked and the ep0 in and out endpoints are disabled. In case pullups are removed while a control transfer is in progress, this makes sure that the control endpoints are properly cleaned up. If and when run/stop is set again, the function already re-enables the IRQ and ep0 when calling dwc3_gadget_restart(). While at it, memset() the event buffers to clear stale contents when reinitializing them in dwc3_event_buffers_setup(). Also, since calling dwc3_gadget_disable_irq() only masks the interrupts at the controller layer, it might not catch instances where an IRQ itself may have already been asserted but does not arrive at the handler until after the pullups are removed. Add a check to dwc3_interrupt() to catch this case as well. Change-Id: Ie58979fe4b229240231760652189338ec5343a2d Signed-off-by: Jack Pham <jackp@codeaurora.org>
* | | usb: dwc3: Replace WARN_ON() by WARN_ON_ONCE() and logging with bufferMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In some of cases when ep0 operations are fails, WARN_ON is called from interrupt context. This may lead to watchdog bark if repeated WARN_ON condition occurs. Hence replace usage of WARN_ON() by WARN_ON_ONCE() and logging errror as part of debug buffer. CRs-Fixed: 907077 Change-Id: I40de055b1e8d610c43c7fff32cd904c43b9bec00 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: dwc3: Allocate TRB pool upon enabling endpointHemant Kumar2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently gadget driver is by default allocating dma TRB pool per endpoint for 30 endpoints upon driver probe. Optimize this by allocating dma memory only for enabled endpoints. Change-Id: I378a42d0b84fa43f7c20cd025cd9361c467cb41b Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
* | | dwc3: gadget: Use default TX FIFO size as 1024 bytes with each IN epsMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit d8a39efaa477 ("dwc3: gadget: Improve TX FIFO resize functionality") is considering USB enumerated speed to allocate TX FIFO size for each IN endpoints. This change simplifies this by using 1024 bytes as default TXFIFO size with each IN endpoints. Change-Id: I55b5886c824d9b689ac8496f50f6e0e784afae98 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | dwc3: gadget: Avoid processing of trb if HWO bit is setMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | HWO bit signifies that TRB is still pending with hardware. Hence avoid processing of TRB if HWO bit is set. Change-Id: I6d4068eb9e6934f68e7b6204cac8f6f3266dabf4 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | dwc3: Increase event buffer size to 8KB from 256 bytesMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 5da93478251c ("usb: dwc3: decrease event buffer size") has decreased controller's event buffer size to 256 bytes which results into multiple overflow events. Receiving of overflow events suggests that software is not able to process received events fast enough which results into losing of those events. Fix this issue by increasing event buffer size to 8KB. Change-Id: I37f6203f0b6d87098d57b2ce0ba8a3a0b8ef5bd2 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | dwc3: gadget: Improve TX FIFO resize functionalityMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | This change considers USB device speed to set max_packet size instead of provided max_packet value from USB function driver. It doesn't resize ep0IN TxFIFO, and starts with ep1IN TxFIFO only. Change-Id: Ifce63f5a8570f79bad1e5d3ae6f5d580c34046b5 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | dwc3: gadget: Initialized USB TRBs pool memory with zeroMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | dma_coherent_alloc() API doesn't guaranteed that allocated memory is initialized with zero. It is observed in some cases where there is stale data seen with allocated memory for TRB pool and providing this TRB with USB controller results into different memory access issues. Fix this issue by using dma_zalloc_coherent() API which allocates memory and initialized it with zero. Change-Id: I160e319aace262958a11ba5196f53ec21b98977f Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | drivers: usb: dwc3: Add XMIT_DEV commandIdo Shayevitz2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Starting with synopsis version 220A the command to wake up the host changed from 0x3 to 0x7. The code is fixed accordingly. The problem that was seen is that upon MBIM function suspend, a remote wakeup from the IPA side wouldn't wake up the host, and at some point a stall in the IPA would be seen. CRs-fixed: 695414 Change-Id: I6ef5c649f263f388a1cc92a3db71c14c741b5b71 Signed-off-by: Lena Salman <esalman@codeaurora.org> Signed-off-by: Ido Shayevitz <idos@codeaurora.org>
* | | usb: dwc3-msm: Bring controller out of LPM early upon system resumeHemant Kumar2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In case of host initiated usb bus resume upon system suspend controller exits from LPM as part of dwc3 PM resume. Since call to dwc3 PM resume from PM framework involves latency due to which usb device misses the timeline of response for bus resume. This results into host issuing warm reset. Hence bring controller out of LPM in power event irq thread context. Set IRQF_EARLY_RESUME for power event irq which reduces irq level latency by enabling this irq early during system resume. Also, save power event irq time stamp to track latency between hard irq and irq thread. CRs-Fixed: 804476 Change-Id: Ib5470c6046ffbfff55b89e717f040bd6435454da Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
* | | dwc3: gadget: Ignore suspend event if USB is not into CONFIGURED stateMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | For reboot usecase with some of host machine, it has been observed that Suspend event is being received in between USB enumeration process which is highly unlikely case. Although due to this event, device side USB goes into suspend state which cause USB device enumerates as unknown device with host machine. Fix this issue by ignoring suspend event until USB enumeration process is not being completed i.e. device side USB is not reach into CONFIGURED state. Add check for CONFIGURED state with controller suspend routine as well to make sure that if this routine finds controller into L2 state before it performs LPM functionality, it confirms that state of USB as CONFIGURED. CRs-Fixed: 717151 Change-Id: I86925f22edf94c526a3b7504333501b6e27412d7 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: dwc3: core: Disable internal clock gating conditionallyMayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Currently USB DWC3 controller's internal clock gating is disabled unconditionally. In few platform, it is possible to enable internal clock gating with controller. Hence this change adds support to disable this functionality conditionally using "snps,disable-clk-gating" device tree property. With this change USB controller's internal clock gating is enabled by default. CRs-Fixed: 851877 Change-Id: I17d43a23d3bff0cb516b952c35c4a13af53f7777 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | dwc3: gadget: Add NULL check against endpoint's desc in set_halt()Mayank Rana2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | In few instances, dwc3_gadget_ep_set_halt() API is called after USB endpoint is disabled which results into device crash with NULL pointer dereference. USB endpoint's descriptors are set to NULL as part of USB endpoint disable functionality. Hence fix this issue by adding NULL pointer check against endpoint's descriptor. CRs-Fixed: 829034 Change-Id: I2e1f67571ed202fab21655bd8f13fc54706419a7 Signed-off-by: Mayank Rana <mrana@codeaurora.org>
* | | usb: dwc3: Ignore multiple U3/L2 suspend eventsJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | The controller may sometimes generate back-to-back suspend interrupt events. Ignore the repeated events to avoid calling the gadget driver's suspend callback multiple times. Change-Id: I284b461adeab5911388efd8bb7ecbf39a85c86ca Signed-off-by: Jack Pham <jackp@codeaurora.org>
* | | usb: dwc3: gadget: Keep track of IRQ timing statisticsJack Pham2016-03-22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | It may be useful to debug how much time is spent in the DWC3 hard IRQ context. Add low-overhead statistics counters which keep a histogram of the last 10 interrupts' time of occurence, time spent, and number of events read (which will get processed in the bottom half handler). Change-Id: I466144d8141f4236b9fb834dded93225b56d0422 Signed-off-by: Jack Pham <jackp@codeaurora.org>