Retry usb_device_claim_interface when it's connected to the kernel driver

usb_device_claim_interface is called solely for marking that a program
or a driver uses it and it does not trigger any signals over the bus.

usb_device_claim_interface has a possibility to be failed if the kernel
driver already connected to a usb device. When it happens, the function
call returns an error and errno is set to EBUSY. For that case, it is
necessary to disconnect to the kernel driver and retry to claim the
interface again.

Bug: 26845384
Change-Id: I4fae0e66ca1132f8cc16937cc6fb837ec4d5659f
diff --git a/media/mtp/MtpDevice.cpp b/media/mtp/MtpDevice.cpp
index 6f72a3e..5bbd747 100644
--- a/media/mtp/MtpDevice.cpp
+++ b/media/mtp/MtpDevice.cpp
@@ -181,7 +181,13 @@
                 return NULL;
             }
 
-            if (usb_device_claim_interface(device, interface->bInterfaceNumber)) {
+            int ret = usb_device_claim_interface(device, interface->bInterfaceNumber);
+            if (ret && errno == EBUSY) {
+                // disconnect kernel driver and try again
+                usb_device_connect_kernel_driver(device, interface->bInterfaceNumber, false);
+                ret = usb_device_claim_interface(device, interface->bInterfaceNumber);
+            }
+            if (ret) {
                 ALOGE("usb_device_claim_interface failed errno: %d\n", errno);
                 usb_device_close(device);
                 return NULL;