usb: usb tethering is enabled 73/97273/4
authortaeyoung <ty317.kim@samsung.com>
Sat, 12 Nov 2016 07:56:54 +0000 (16:56 +0900)
committertaeyoung <ty317.kim@samsung.com>
Sat, 12 Nov 2016 09:59:55 +0000 (18:59 +0900)
- Previously, usb gadget is not enabled when usb tethering is turned on.
  The issue is also related with usb mode change.

- Now, usb mode change function disables, reconfigures, and enables
  the usb gadget. Thus usb tethering can be enabled.

- The positions of the usb state change operation are changed
  for physical and logical usb mode changes

Change-Id: I336a43a75bc03c831be61b80b09498c054efb7d1
Signed-off-by: taeyoung <ty317.kim@samsung.com>
src/usb/usb-operation.c
src/usb/usb-operation.conf
src/usb/usb-tethering.c
src/usb/usb.c
src/usb/usb.h

index 0484cd3..403de8b 100644 (file)
@@ -87,9 +87,6 @@ static int usb_execute_operation(unsigned int mode, operation_e type)
        int ret;
        struct oper_data data;
 
-       if (mode == USB_FUNCTION_NONE)
-               return -EINVAL;
-
        usb_state_get_mode_str(mode, data.mode_str, sizeof(data.mode_str));
 
        data.type = type;
index 32db01a..0329b04 100644 (file)
@@ -11,7 +11,5 @@ StopService=mtp-responder.service
 Start=/sbin/ifconfig usb0 192.168.129.3 up
 Start=/sbin/route add -net 192.168.129.0 netmask 255.255.255.0 dev usb0
 StartService=sshd.service
-StartService=sdbd.service
 StopService=sshd.service
 Stop=/sbin/ifconfig usb0 down
-StopService=sdbd.service
index e675b24..b7834ec 100644 (file)
@@ -51,6 +51,8 @@ static void usb_tethering_changed(keynode_t *key, void *data)
 
        tethering_state = curr;
 
+       _I("USB tethering %s", curr ? "ON" : "OFF");
+
        device_notify(DEVICE_NOTIFIER_USB_TETHERING_MODE, (void *)curr);
 }
 
index 7dfea04..41e27ab 100644 (file)
@@ -34,7 +34,6 @@
 
 static struct usb_gadget_translator *gadget_translator;
 static struct usb_client *usb_client;
-static unsigned current_mode;
 
 struct extcon_ops extcon_usb_ops;
 
@@ -195,7 +194,7 @@ no_hal:
        return -ENODEV;
 }
 
-int usb_change_mode(unsigned mode)
+static int usb_change_gadget(unsigned mode)
 {
        struct usb_gadget_id gadget_id;
        struct usb_gadget *gadget;
@@ -221,7 +220,9 @@ int usb_change_mode(unsigned mode)
                goto out;
        }
 
-       current_mode = mode;
+       usb_state_set_selected_mode(mode);
+       _I("USB gadget changed (%d)", mode);
+
 out:
        return ret;
 no_hal:
@@ -229,10 +230,122 @@ no_hal:
        return -ENODEV;
 }
 
+static int usb_enable(unsigned int mode)
+{
+       int ret;
+       unsigned int selected;
+
+       selected = usb_state_get_selected_mode();
+
+       if (usb_state_get_connection() != USB_CONNECTED) {
+               _E("Failed to enable usb gadget (USB cable is not connected)");
+               return -ENOTSUP;
+       }
+
+       if (usb_state_get_current_mode() != USB_FUNCTION_NONE)
+               usb_state_update_state(USB_CONNECTED, USB_FUNCTION_NONE);
+
+       if (mode != selected)
+               usb_change_gadget(mode);
+
+       ret = usb_config_enable();
+       if (ret < 0) {
+               _E("Failed to enable usb config (%d)", ret);
+               return ret;
+       }
+
+       usb_state_update_state(USB_CONNECTED, mode);
+       pm_lock_internal(INTERNAL_LOCK_USB,
+                       LCD_OFF, STAY_CUR_STATE, 0);
+
+       return 0;
+}
+
+static int usb_disable(void)
+{
+       int ret;
+
+       if (usb_state_get_current_mode() != USB_FUNCTION_NONE) {
+               if (usb_state_get_connection() == USB_CONNECTED)
+                       usb_state_update_state(USB_CONNECTED, USB_FUNCTION_NONE);
+               else
+                       usb_state_update_state(USB_DISCONNECTED, USB_FUNCTION_NONE);
+       }
+
+       ret = usb_config_disable();
+       if (ret != 0)
+               _E("Failed to disable usb config (%d)", ret);
+
+       pm_unlock_internal(INTERNAL_LOCK_USB,
+                       LCD_OFF, STAY_CUR_STATE);
+
+       return 0;
+}
+
+int usb_change_mode(unsigned mode)
+{
+       int ret;
+       unsigned int curr = usb_state_get_current_mode();
+
+       if (curr != USB_FUNCTION_NONE) {
+               usb_operation_stop(curr);
+
+               ret = usb_disable();
+               if (ret < 0) {
+                       _E("Failed to disable current usb mode");
+                       return ret;
+               }
+       }
+
+       ret = usb_change_gadget(mode);
+       if (ret < 0) {
+               _E("Failed to change gadget (%d)", ret);
+               mode = usb_state_get_selected_mode();
+       }
+
+       if (usb_state_get_connection() == USB_CONNECTED) {
+               ret = usb_enable(mode);
+               if (ret < 0) {
+                       _E("Failed to enable usb mode (%d)");
+                       return ret;
+               }
+
+               usb_operation_start(mode);
+       }
+
+       return 0;
+}
+
+static int usb_connected(void)
+{
+       int ret;
+       unsigned int mode = usb_state_get_selected_mode();
+
+       usb_state_update_state(USB_CONNECTED, USB_FUNCTION_NONE);
+
+       ret = usb_enable(mode);
+       if (ret < 0) {
+               _E("Failed to enable usb gadget (gadget:%d, ret:%d)", mode, ret);
+               return ret;
+       }
+
+       usb_operation_start(mode);
+
+       return 0;
+}
+
+static int usb_disconnected(void)
+{
+       usb_operation_stop(usb_state_get_current_mode());
+
+       usb_state_update_state(USB_DISCONNECTED, USB_FUNCTION_NONE);
+
+       return usb_disable();
+}
+
 static int usb_state_changed(int status)
 {
        static int old = -1;    /* to update at the first time */
-       unsigned mode;
        int ret;
 
        _I("USB state is changed from (%d) to (%d)", old, status);
@@ -243,31 +356,11 @@ static int usb_state_changed(int status)
        switch (status) {
        case USB_CONNECTED:
                _I("USB cable is connected");
-               usb_state_update_state(USB_CONNECTED, USB_FUNCTION_NONE);
-               mode = usb_state_get_selected_mode();
-               if (mode != current_mode)
-                       usb_change_mode(mode);
-
-               ret = usb_config_enable();
-               if (ret < 0) {
-                       _E("Failed to enable usb config (%d)", ret);
-                       break;
-               }
-               usb_operation_start(mode);
-               usb_state_update_state(USB_CONNECTED, mode);
-               pm_lock_internal(INTERNAL_LOCK_USB,
-                               LCD_OFF, STAY_CUR_STATE, 0);
+               ret = usb_connected();
                break;
        case USB_DISCONNECTED:
                _I("USB cable is disconnected");
-               usb_operation_stop(usb_state_get_current_mode());
-               usb_state_update_state(USB_DISCONNECTED, USB_FUNCTION_NONE);
-               
-               ret = usb_config_disable();
-               if (ret != 0)
-                       _E("Failed to disable usb config (%d)", ret);
-               pm_unlock_internal(INTERNAL_LOCK_USB,
-                               LCD_OFF, STAY_CUR_STATE);
+               ret = usb_disconnected();
                break;
        default:
                _E("Invalid USB state(%d)", status);
index fe55917..ae26162 100644 (file)
@@ -65,6 +65,7 @@ char *usb_state_get_mode_str(unsigned int mode, char *str, size_t len);
 unsigned int usb_state_get_selected_mode(void);
 void usb_state_set_selected_mode(unsigned int mode);
 unsigned int usb_state_get_current_mode(void);
+usb_connection_state_e usb_state_get_connection(void);
 
 int usb_operation_start(unsigned int mode);
 int usb_operation_stop(unsigned int mode);