Revert "USB: android: Avoid re-enabling the same configuration"

Commit d9b1897713 doesn't allow re-enumeration of USB default composition
on bus reset. if adb close and adb open has been called within 1 second
of duration. with adb usb command, it restarts the adb into USB mode after
closing the adb device and re-opening the same within 1 second. To the
user it looks as if command is stuck. Terminating adb usb based command
prompt, killing adb server and doing adb shell again gets the adb
functionality. Here user doesn't see any USB re-enumeration with it. Hence
revert commit d9b1897713 which doesn't block the adb usb command and
re-enumeration of USB.

(cherry picked from commit ff3e0492ee60c8594b3f48eed87e086f4b3d5b0b)

Change-Id: I50ab56f94293b2e02b66c548ee703d26284bcc57
CRs-Fixed: 385973
Signed-off-by: Mayank Rana <mrana@codeaurora.org>
USB: android: Don't disable configuration for every adb close

Certain ADB commands like "adb usb" and "adb root" restart the
adb daemon running on the device.  These commands require USB
bus reset, otherwise adb commands on the host side would stuck
for ever.

USB bus reset can be forced from device side by re-enabling the
same composition.  Earlier, configuration is disabled when adb
daemon closes /dev/android_usb device file.  The configuration
is enabled again after adb daemon opens the device file. This
approach solves the "adb usb" problem with the below side effects.

1. When USB cable is disconnected, the Rx request is flushed and
an error code is returned to user space.  The adb daemon is simply
restarted in this case which cause an unnecessary rebinding of
all functions.
2. The above scenario can happen if host reset the bus when device
is in configured state.  If device disable pull-up during, bus
reset, USB CV CH9 test cases are failing.

The commit d9b1897 (USB: android: Avoid re-enabling the same
configuration) fixed the above side effects. But silently ignores the
original "adb usb" problem.

This commit is another attempt to solve all the above mentioned problems
by forcing re-enumeration only when device is in connected state.  That
means, "adb usb" and "adb root" commands force usb bus reset where as
plugging out a cable does not.

(cherry picked from commit 1aa235a6c0a3d67bff24609766baf5a7d5d8e3e4)

Change-Id: I984f1320c6adfa925ed2f3beca5ae1464981e5fc
CRs-Fixed: 407882
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
USB: android: Fix adb device file closing bug

adb device file closing and config disabling can happen in
parallel during composition switch.  If adb device file
is closed prior to config disable, adb function driver request
android to disable configuration.  But this is not undone later
when adb device file is opened.  Due to this bug config remains
disabled after composition switch completion.  Fix this bug.

(cherry picked from commit c4d8e2ca7cfb2118bcc9f14a97568bfe42b76bcc)

Change-Id: Ia2b7024cfcc438f4e17ca1f165be03abcf380230
CRs-Fixed: 414360
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
USB: android: Wakeup both reader and writer processes upon TX/RX error

The writer process is blocked on a wait queue if there are no free
TX requests.  It is unblocked from TX completion handler. When error
is encountered on RX path, wakeup the writer thread.  If the host
stops reading the data after RX errors, the writer process will never
be unblocked.  Similarly wakeup reader process when error is encountered
on TX path.

(cherry picked from commit e8757ca19d3f2230af507fc44262f9c92af37b59)

Change-Id: Ibee111876a837189d513057f664f079ed4e4cde2
CRs-Fixed: 449129
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
USB: ci13xxx_udc: Don't flush and disable all endpoints during disconnect

Flushing and disabling all endpoints during disconnect in controller
driver is simply wasteful and unnecessary.  Flushing endpoints before
notifying disconnect to composite driver will have side effects too.
The active endpoints will be disabled by function drivers when they
notified about disconnect.

The current code use 100 msec timeout for flush operation.  If controller
driver flush and disable all endpoints, the worst case timeout will be
added up to several seconds.  This is leading to watch dog timeout.

(cherry picked from commit d658d937d00993f942343b8aedb2d4c4bd8e372c)

CRs-Fixed: 431623
Change-Id: If6a2e87006cda367c2eb4def616e9672e13eadf5
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
USB: ci13xxx_udc: Avoid flushing endpoint twice during disable

The ep_disable() function nukes all pending requests before
disabling the endpoint in hardware.  The endpoint is flushed
during nuking.  Don't flush the endpoint again.

(cherry picked from commit a89f80f9942e5dc2796ad742f9d01f6aa68e1267)

CRs-Fixed: 445916
Change-Id: Ib330c67b360b448ec524e6ef0e8c040f04fdf0b8
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
USB: ci13xxx_udc: Don't flush inactive endpoints

The endpoint must be flushed prior to retiring pending requests.
This is done during disabling an endpoint.  Don't flush an endpoint
if there are no pending requests.  According databook flushing
endpoint may take large amount of time.  This optimization will
make USB disconnect/reset processing a little bit faster.

(cherry picked from commit 58db2c1f94451d7a352d2ad1a1b1e9732f4f0a11)

CRs-Fixed: 445916
Change-Id: I035b624dbac4529bbe33a67f9e7e1916d4772d6f
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
USB: ci13xxx_udc: Skip flushing endpoints upon failure

Flushing an endpoint involve polling ENDPTFLUSH and ENDPTSTAT
registers.  The worst case timeout is 100 msec for each endpoint.
The reason for failure is unknown.  When flushing an endpoint
fails, successive flushing of remaining endpoints are also failing.
Hence skip flushing remaining endpoints.  Reset this condition
upon USB bus reset.

(cherry picked from commit 2a630fb9b83b31e607ef61f3b61959cc1b095349)

CRs-Fixed: 445916
Change-Id: I9feeeb434dc180f1df859275ef1364c7dd829d78
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
USB: f_rndis: Check if cdev is NULL before accessing

RNDIS control path completion handlers are getting called after setting
cdev to NULL during disconnect as part of composition switch and this
is leading to a crash. Avoid this crash, by checking, if cdev is NULL
before accessing. Also don't queue request's to DCD, if composition switch
is in progress.

(cherry picked from commit 46874732be9d6997ff3bceaf97f07911f9f22440)

CRs-Fixed: 433534
Change-Id: Ic0790415ec3eaf866af2895370249e45adcbba5d
Signed-off-by: Chiranjeevi Velempati <cvelempa@codeaurora.org>