Loading drivers/usb/gadget/function/f_gsi.c +35 −31 Original line number Diff line number Diff line Loading @@ -188,26 +188,23 @@ static int gsi_wakeup_host(struct f_gsi *gsi) return ret; } static void debugfs_rw_timer_func(unsigned long arg) static void gsi_rw_timer_func(unsigned long arg) { struct f_gsi *gsi; gsi = (struct f_gsi *)arg; struct f_gsi *gsi = (struct f_gsi *)arg; if (!atomic_read(&gsi->connected)) { log_event_dbg("%s: gsi not connected..del timer\n", __func__); gsi->debugfs_rw_enable = 0; del_timer(&gsi->debugfs_rw_timer); log_event_dbg("%s: gsi not connected.. bail-out\n", __func__); gsi->debugfs_rw_timer_enable = 0; return; } log_event_dbg("%s: calling gsi_wakeup_host\n", __func__); gsi_wakeup_host(gsi); if (gsi->debugfs_rw_enable) { if (gsi->debugfs_rw_timer_enable) { log_event_dbg("%s: re-arm the timer\n", __func__); mod_timer(&gsi->debugfs_rw_timer, jiffies + msecs_to_jiffies(gsi->debugfs_rw_interval)); mod_timer(&gsi->gsi_rw_timer, jiffies + msecs_to_jiffies(gsi->gsi_rw_timer_interval)); } } Loading Loading @@ -260,7 +257,7 @@ static ssize_t usb_gsi_rw_write(struct file *file, goto err; } if (gsi->debugfs_rw_enable == !!input) { if (gsi->debugfs_rw_timer_enable == !!input) { if (!!input) log_event_dbg("%s: RW already enabled\n", __func__); else Loading @@ -268,21 +265,14 @@ static ssize_t usb_gsi_rw_write(struct file *file, goto err; } gsi->debugfs_rw_enable = !!input; if (gsi->debugfs_rw_enable) { init_timer(&gsi->debugfs_rw_timer); gsi->debugfs_rw_timer.data = (unsigned long) gsi; gsi->debugfs_rw_timer.function = debugfs_rw_timer_func; gsi->debugfs_rw_timer_enable = !!input; /* Use default remote wakeup timer interval if it is not set */ if (!gsi->debugfs_rw_interval) gsi->debugfs_rw_interval = DEFAULT_RW_TIMER_INTERVAL; gsi->debugfs_rw_timer.expires = jiffies + msecs_to_jiffies(gsi->debugfs_rw_interval); add_timer(&gsi->debugfs_rw_timer); if (gsi->debugfs_rw_timer_enable) { mod_timer(&gsi->gsi_rw_timer, jiffies + msecs_to_jiffies(gsi->gsi_rw_timer_interval)); log_event_dbg("%s: timer initialized\n", __func__); } else { del_timer_sync(&gsi->debugfs_rw_timer); del_timer_sync(&gsi->gsi_rw_timer); log_event_dbg("%s: timer deleted\n", __func__); } Loading @@ -301,7 +291,7 @@ static int usb_gsi_rw_show(struct seq_file *s, void *unused) return 0; } seq_printf(s, "%d\n", gsi->debugfs_rw_enable); seq_printf(s, "%d\n", gsi->debugfs_rw_timer_enable); return 0; } Loading Loading @@ -349,7 +339,7 @@ static ssize_t usb_gsi_rw_timer_write(struct file *file, goto err; } gsi->debugfs_rw_interval = timer_val; gsi->gsi_rw_timer_interval = timer_val; err: return count; } Loading @@ -357,7 +347,6 @@ static ssize_t usb_gsi_rw_timer_write(struct file *file, static int usb_gsi_rw_timer_show(struct seq_file *s, void *unused) { struct f_gsi *gsi; unsigned int timer_interval; gsi = get_connected_gsi(); if (!gsi) { Loading @@ -365,11 +354,7 @@ static int usb_gsi_rw_timer_show(struct seq_file *s, void *unused) return 0; } timer_interval = DEFAULT_RW_TIMER_INTERVAL; if (gsi->debugfs_rw_interval) timer_interval = gsi->debugfs_rw_interval; seq_printf(s, "%ums\n", timer_interval); seq_printf(s, "%ums\n", gsi->gsi_rw_timer_interval); return 0; } Loading Loading @@ -2485,6 +2470,9 @@ static void gsi_disable(struct usb_function *f) atomic_set(&gsi->connected, 0); del_timer(&gsi->gsi_rw_timer); gsi->debugfs_rw_timer_enable = 0; if (gsi->prot_id == IPA_USB_RNDIS) rndis_uninit(gsi->params); Loading Loading @@ -2533,6 +2521,16 @@ static void gsi_suspend(struct usb_function *f) post_event(&gsi->d_port, EVT_SUSPEND); queue_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w); log_event_dbg("gsi suspended"); /* * If host suspended bus without receiving notification request then * initiate remote-wakeup. As driver won't be able to do it later since * notification request is already queued. */ if (gsi->c_port.notify_req_queued && usb_gsi_remote_wakeup_allowed(f)) { mod_timer(&gsi->gsi_rw_timer, jiffies + msecs_to_jiffies(2000)); log_event_dbg("%s: pending response, arm rw_timer\n", __func__); } } static void gsi_resume(struct usb_function *f) Loading @@ -2550,6 +2548,10 @@ static void gsi_resume(struct usb_function *f) f->func_is_suspended) return; /* Keep timer enabled if user enabled using debugfs */ if (!gsi->debugfs_rw_timer_enable) del_timer(&gsi->gsi_rw_timer); if (gsi->c_port.notify && !gsi->c_port.notify->desc) config_ep_by_speed(cdev->gadget, f, gsi->c_port.notify); Loading Loading @@ -3286,6 +3288,8 @@ static struct f_gsi *gsi_function_init(enum ipa_usb_teth_prot prot_id) kfree(gsi); goto error; } gsi->gsi_rw_timer_interval = DEFAULT_RW_TIMER_INTERVAL; setup_timer(&gsi->gsi_rw_timer, gsi_rw_timer_func, (unsigned long) gsi); return gsi; error: Loading drivers/usb/gadget/function/f_gsi.h +5 −3 Original line number Diff line number Diff line Loading @@ -281,10 +281,12 @@ struct f_gsi { struct gsi_ctrl_port c_port; void *ipc_log_ctxt; bool rmnet_dtr_status; /* To test remote wakeup using debugfs */ struct timer_list debugfs_rw_timer; u8 debugfs_rw_enable; u16 debugfs_rw_interval; struct timer_list gsi_rw_timer; u8 debugfs_rw_timer_enable; u16 gsi_rw_timer_interval; }; static inline struct f_gsi *func_to_gsi(struct usb_function *f) Loading Loading
drivers/usb/gadget/function/f_gsi.c +35 −31 Original line number Diff line number Diff line Loading @@ -188,26 +188,23 @@ static int gsi_wakeup_host(struct f_gsi *gsi) return ret; } static void debugfs_rw_timer_func(unsigned long arg) static void gsi_rw_timer_func(unsigned long arg) { struct f_gsi *gsi; gsi = (struct f_gsi *)arg; struct f_gsi *gsi = (struct f_gsi *)arg; if (!atomic_read(&gsi->connected)) { log_event_dbg("%s: gsi not connected..del timer\n", __func__); gsi->debugfs_rw_enable = 0; del_timer(&gsi->debugfs_rw_timer); log_event_dbg("%s: gsi not connected.. bail-out\n", __func__); gsi->debugfs_rw_timer_enable = 0; return; } log_event_dbg("%s: calling gsi_wakeup_host\n", __func__); gsi_wakeup_host(gsi); if (gsi->debugfs_rw_enable) { if (gsi->debugfs_rw_timer_enable) { log_event_dbg("%s: re-arm the timer\n", __func__); mod_timer(&gsi->debugfs_rw_timer, jiffies + msecs_to_jiffies(gsi->debugfs_rw_interval)); mod_timer(&gsi->gsi_rw_timer, jiffies + msecs_to_jiffies(gsi->gsi_rw_timer_interval)); } } Loading Loading @@ -260,7 +257,7 @@ static ssize_t usb_gsi_rw_write(struct file *file, goto err; } if (gsi->debugfs_rw_enable == !!input) { if (gsi->debugfs_rw_timer_enable == !!input) { if (!!input) log_event_dbg("%s: RW already enabled\n", __func__); else Loading @@ -268,21 +265,14 @@ static ssize_t usb_gsi_rw_write(struct file *file, goto err; } gsi->debugfs_rw_enable = !!input; if (gsi->debugfs_rw_enable) { init_timer(&gsi->debugfs_rw_timer); gsi->debugfs_rw_timer.data = (unsigned long) gsi; gsi->debugfs_rw_timer.function = debugfs_rw_timer_func; gsi->debugfs_rw_timer_enable = !!input; /* Use default remote wakeup timer interval if it is not set */ if (!gsi->debugfs_rw_interval) gsi->debugfs_rw_interval = DEFAULT_RW_TIMER_INTERVAL; gsi->debugfs_rw_timer.expires = jiffies + msecs_to_jiffies(gsi->debugfs_rw_interval); add_timer(&gsi->debugfs_rw_timer); if (gsi->debugfs_rw_timer_enable) { mod_timer(&gsi->gsi_rw_timer, jiffies + msecs_to_jiffies(gsi->gsi_rw_timer_interval)); log_event_dbg("%s: timer initialized\n", __func__); } else { del_timer_sync(&gsi->debugfs_rw_timer); del_timer_sync(&gsi->gsi_rw_timer); log_event_dbg("%s: timer deleted\n", __func__); } Loading @@ -301,7 +291,7 @@ static int usb_gsi_rw_show(struct seq_file *s, void *unused) return 0; } seq_printf(s, "%d\n", gsi->debugfs_rw_enable); seq_printf(s, "%d\n", gsi->debugfs_rw_timer_enable); return 0; } Loading Loading @@ -349,7 +339,7 @@ static ssize_t usb_gsi_rw_timer_write(struct file *file, goto err; } gsi->debugfs_rw_interval = timer_val; gsi->gsi_rw_timer_interval = timer_val; err: return count; } Loading @@ -357,7 +347,6 @@ static ssize_t usb_gsi_rw_timer_write(struct file *file, static int usb_gsi_rw_timer_show(struct seq_file *s, void *unused) { struct f_gsi *gsi; unsigned int timer_interval; gsi = get_connected_gsi(); if (!gsi) { Loading @@ -365,11 +354,7 @@ static int usb_gsi_rw_timer_show(struct seq_file *s, void *unused) return 0; } timer_interval = DEFAULT_RW_TIMER_INTERVAL; if (gsi->debugfs_rw_interval) timer_interval = gsi->debugfs_rw_interval; seq_printf(s, "%ums\n", timer_interval); seq_printf(s, "%ums\n", gsi->gsi_rw_timer_interval); return 0; } Loading Loading @@ -2485,6 +2470,9 @@ static void gsi_disable(struct usb_function *f) atomic_set(&gsi->connected, 0); del_timer(&gsi->gsi_rw_timer); gsi->debugfs_rw_timer_enable = 0; if (gsi->prot_id == IPA_USB_RNDIS) rndis_uninit(gsi->params); Loading Loading @@ -2533,6 +2521,16 @@ static void gsi_suspend(struct usb_function *f) post_event(&gsi->d_port, EVT_SUSPEND); queue_work(gsi->d_port.ipa_usb_wq, &gsi->d_port.usb_ipa_w); log_event_dbg("gsi suspended"); /* * If host suspended bus without receiving notification request then * initiate remote-wakeup. As driver won't be able to do it later since * notification request is already queued. */ if (gsi->c_port.notify_req_queued && usb_gsi_remote_wakeup_allowed(f)) { mod_timer(&gsi->gsi_rw_timer, jiffies + msecs_to_jiffies(2000)); log_event_dbg("%s: pending response, arm rw_timer\n", __func__); } } static void gsi_resume(struct usb_function *f) Loading @@ -2550,6 +2548,10 @@ static void gsi_resume(struct usb_function *f) f->func_is_suspended) return; /* Keep timer enabled if user enabled using debugfs */ if (!gsi->debugfs_rw_timer_enable) del_timer(&gsi->gsi_rw_timer); if (gsi->c_port.notify && !gsi->c_port.notify->desc) config_ep_by_speed(cdev->gadget, f, gsi->c_port.notify); Loading Loading @@ -3286,6 +3288,8 @@ static struct f_gsi *gsi_function_init(enum ipa_usb_teth_prot prot_id) kfree(gsi); goto error; } gsi->gsi_rw_timer_interval = DEFAULT_RW_TIMER_INTERVAL; setup_timer(&gsi->gsi_rw_timer, gsi_rw_timer_func, (unsigned long) gsi); return gsi; error: Loading
drivers/usb/gadget/function/f_gsi.h +5 −3 Original line number Diff line number Diff line Loading @@ -281,10 +281,12 @@ struct f_gsi { struct gsi_ctrl_port c_port; void *ipc_log_ctxt; bool rmnet_dtr_status; /* To test remote wakeup using debugfs */ struct timer_list debugfs_rw_timer; u8 debugfs_rw_enable; u16 debugfs_rw_interval; struct timer_list gsi_rw_timer; u8 debugfs_rw_timer_enable; u16 gsi_rw_timer_interval; }; static inline struct f_gsi *func_to_gsi(struct usb_function *f) Loading