Loading drivers/usb/gadget/function/f_gsi.c +24 −0 Original line number Diff line number Diff line Loading @@ -2665,6 +2665,16 @@ static void gsi_unbind(struct usb_configuration *c, struct usb_function *f) gsi->d_port.in_request.dma); } static void ipa_ready_callback(void *user_data) { struct f_gsi *gsi = user_data; pr_info("%s: ipa is ready\n", __func__); gsi->d_port.ipa_ready = true; wake_up_interruptible(&gsi->d_port.wait_for_ipa_ready); } int gsi_bind_config(struct usb_configuration *c, enum ipa_usb_teth_prot prot_id) { struct f_gsi *gsi; Loading Loading @@ -2731,6 +2741,18 @@ int gsi_bind_config(struct usb_configuration *c, enum ipa_usb_teth_prot prot_id) if (status) return status; status = ipa_register_ipa_ready_cb(ipa_ready_callback, gsi); if (!status) { pr_info("%s: ipa is not ready\n", __func__); status = wait_event_interruptible_timeout( gsi->d_port.wait_for_ipa_ready, gsi->d_port.ipa_ready, msecs_to_jiffies(GSI_IPA_READY_TIMEOUT)); if (!status) { pr_err("%s: ipa ready timeout\n", __func__); return -ETIMEDOUT; } } gsi->d_port.ipa_usb_notify_cb = ipa_usb_notify_cb; status = ipa_usb_init_teth_prot(prot_id, &gsi->d_port.ipa_init_params, gsi->d_port.ipa_usb_notify_cb, Loading Loading @@ -2762,6 +2784,8 @@ static int gsi_function_init(enum ipa_usb_teth_prot prot_id) spin_lock_init(&gsi->d_port.lock); init_waitqueue_head(&gsi->d_port.wait_for_ipa_ready); gsi->d_port.in_channel_handle = -EINVAL; gsi->d_port.out_channel_handle = -EINVAL; Loading include/linux/usb/f_gsi.h +4 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ #define GSI_NUM_OUT_BUFFERS 7 #define GSI_OUT_BUFF_SIZE 24576 #define GSI_IPA_READY_TIMEOUT 5000 #define ETH_ADDR_STR_LEN 14 /* mbin and ecm */ Loading Loading @@ -175,6 +177,7 @@ struct gsi_data_port { u16 in_last_trb_addr; u16 cdc_filter; bool ipa_ready; bool net_ready_trigger; struct gsi_ntb_info ntb_info; Loading @@ -184,6 +187,7 @@ struct gsi_data_port { struct workqueue_struct *ipa_usb_wq; enum connection_state sm_state; struct event_queue evt_q; wait_queue_head_t wait_for_ipa_ready; /* Track these for debugfs */ struct ipa_usb_xdci_chan_params ipa_in_channel_params; Loading Loading
drivers/usb/gadget/function/f_gsi.c +24 −0 Original line number Diff line number Diff line Loading @@ -2665,6 +2665,16 @@ static void gsi_unbind(struct usb_configuration *c, struct usb_function *f) gsi->d_port.in_request.dma); } static void ipa_ready_callback(void *user_data) { struct f_gsi *gsi = user_data; pr_info("%s: ipa is ready\n", __func__); gsi->d_port.ipa_ready = true; wake_up_interruptible(&gsi->d_port.wait_for_ipa_ready); } int gsi_bind_config(struct usb_configuration *c, enum ipa_usb_teth_prot prot_id) { struct f_gsi *gsi; Loading Loading @@ -2731,6 +2741,18 @@ int gsi_bind_config(struct usb_configuration *c, enum ipa_usb_teth_prot prot_id) if (status) return status; status = ipa_register_ipa_ready_cb(ipa_ready_callback, gsi); if (!status) { pr_info("%s: ipa is not ready\n", __func__); status = wait_event_interruptible_timeout( gsi->d_port.wait_for_ipa_ready, gsi->d_port.ipa_ready, msecs_to_jiffies(GSI_IPA_READY_TIMEOUT)); if (!status) { pr_err("%s: ipa ready timeout\n", __func__); return -ETIMEDOUT; } } gsi->d_port.ipa_usb_notify_cb = ipa_usb_notify_cb; status = ipa_usb_init_teth_prot(prot_id, &gsi->d_port.ipa_init_params, gsi->d_port.ipa_usb_notify_cb, Loading Loading @@ -2762,6 +2784,8 @@ static int gsi_function_init(enum ipa_usb_teth_prot prot_id) spin_lock_init(&gsi->d_port.lock); init_waitqueue_head(&gsi->d_port.wait_for_ipa_ready); gsi->d_port.in_channel_handle = -EINVAL; gsi->d_port.out_channel_handle = -EINVAL; Loading
include/linux/usb/f_gsi.h +4 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ #define GSI_NUM_OUT_BUFFERS 7 #define GSI_OUT_BUFF_SIZE 24576 #define GSI_IPA_READY_TIMEOUT 5000 #define ETH_ADDR_STR_LEN 14 /* mbin and ecm */ Loading Loading @@ -175,6 +177,7 @@ struct gsi_data_port { u16 in_last_trb_addr; u16 cdc_filter; bool ipa_ready; bool net_ready_trigger; struct gsi_ntb_info ntb_info; Loading @@ -184,6 +187,7 @@ struct gsi_data_port { struct workqueue_struct *ipa_usb_wq; enum connection_state sm_state; struct event_queue evt_q; wait_queue_head_t wait_for_ipa_ready; /* Track these for debugfs */ struct ipa_usb_xdci_chan_params ipa_in_channel_params; Loading