Loading drivers/platform/msm/ipa/ipa_clients/ipa_usb.c +14 −3 Original line number Diff line number Diff line Loading @@ -299,6 +299,17 @@ static char *ipa3_usb_notify_event_to_string(enum ipa_usb_notify_event event) return "UNSUPPORTED"; } static bool ipa3_usb_get_teth_port_state(void) { if (ipa3_usb_ctx == NULL) return false; if (ipa3_usb_ctx->ttype_ctx[IPA_USB_TRANSPORT_TETH].state == IPA_USB_CONNECTED) return true; else return false; } static bool ipa3_usb_set_state(enum ipa3_usb_state new_state, bool err_permit, enum ipa3_usb_transport_type ttype) { Loading Loading @@ -2435,8 +2446,8 @@ int ipa_usb_xdci_connect(struct ipa_usb_xdci_chan_params *ul_chan_params, * For IPA_USB_DIAG/DPL config there will not be any UL ep. */ if (connect_params->teth_prot != IPA_USB_DIAG) ipa3_register_lock_unlock_callback(&ipa_usb_set_lock_unlock, ul_out_params->clnt_hdl); ipa3_register_client_callback(&ipa_usb_set_lock_unlock, &ipa3_usb_get_teth_port_state, ul_out_params->clnt_hdl); IPA_USB_DBG_LOW("exit\n"); mutex_unlock(&ipa3_usb_ctx->general_mutex); Loading Loading @@ -2522,7 +2533,7 @@ static int ipa_usb_xdci_dismiss_channels(u32 ul_clnt_hdl, u32 dl_clnt_hdl, * For IPA_USB_DIAG/DPL config there will not be any UL config. */ if (!IPA3_USB_IS_TTYPE_DPL(ttype)) ipa3_deregister_lock_unlock_callback(ul_clnt_hdl); ipa3_deregister_client_callback(ul_clnt_hdl); /* Change state to STOPPED */ if (!ipa3_usb_set_state(IPA_USB_STOPPED, false, ttype)) Loading drivers/platform/msm/ipa/ipa_v3/ipa_client.c +23 −16 Original line number Diff line number Diff line Loading @@ -644,13 +644,11 @@ int ipa3_smmu_map_peer_buff(u64 iova, u32 size, bool map, struct sg_table *sgt, return 0; } static enum ipa_client_cb_type ipa_get_client_cb_type(u32 ipa_ep_idx) static enum ipa_client_cb_type ipa_get_client_cb_type( enum ipa_client_type client_type) { enum ipa_client_type client_type; enum ipa_client_cb_type client_cb; client_type = ipa3_get_client_by_pipe(ipa_ep_idx); if (client_type == IPA_CLIENT_USB_PROD || client_type == IPA_CLIENT_USB_CONS) { IPADBG("USB Client registered\n"); Loading @@ -666,14 +664,16 @@ static enum ipa_client_cb_type ipa_get_client_cb_type(u32 ipa_ep_idx) return client_cb; } void ipa3_register_lock_unlock_callback(int (*client_cb)(bool is_lock), u32 ipa_ep_idx) void ipa3_register_client_callback(int (*client_cb)(bool is_lock), bool (*teth_port_state)(void), u32 ipa_ep_idx) { enum ipa_client_cb_type client; enum ipa_client_type client_type; IPADBG("entry\n"); client = ipa_get_client_cb_type(ipa_ep_idx); client_type = ipa3_get_client_by_pipe(ipa_ep_idx); client = ipa_get_client_cb_type(client_type); if (client == IPA_MAX_CLNT) return; Loading @@ -684,35 +684,42 @@ void ipa3_register_lock_unlock_callback(int (*client_cb)(bool is_lock), if (!ipa3_ctx->client_lock_unlock[client]) ipa3_ctx->client_lock_unlock[client] = client_cb; if (!ipa3_ctx->get_teth_port_state[client]) ipa3_ctx->get_teth_port_state[client] = teth_port_state; IPADBG("exit\n"); } void ipa3_deregister_lock_unlock_callback(u32 ipa_ep_idx) void ipa3_deregister_client_callback(u32 ipa_ep_idx) { enum ipa_client_cb_type client_cb; enum ipa_client_type client_type; IPADBG("entry\n"); client_cb = ipa_get_client_cb_type(ipa_ep_idx); client_type = ipa3_get_client_by_pipe(ipa_ep_idx); client_cb = ipa_get_client_cb_type(client_type); if (client_cb == IPA_MAX_CLNT) return; if (ipa3_ctx->client_lock_unlock[client_cb] == NULL) { if (ipa3_ctx->client_lock_unlock[client_cb] == NULL && ipa3_ctx->get_teth_port_state[client_cb] == NULL) { IPAERR("client_lock_unlock is already NULL"); return; } ipa3_ctx->client_lock_unlock[client_cb] = NULL; ipa3_ctx->get_teth_port_state[client_cb] = NULL; IPADBG("exit\n"); } static void client_lock_unlock_cb(u32 ipa_ep_idx, bool is_lock) static void client_lock_unlock_cb(enum ipa_client_type client, bool is_lock) { enum ipa_client_cb_type client_cb; IPADBG("entry\n"); client_cb = ipa_get_client_cb_type(ipa_ep_idx); client_cb = ipa_get_client_cb_type(client); if (client_cb == IPA_MAX_CLNT) return; Loading Loading @@ -1380,7 +1387,7 @@ int ipa3_set_reset_client_prod_pipe_delay(bool set_reset, ep = &ipa3_ctx->ep[pipe_idx]; /* Setting delay on USB_PROD with skip_ep_cfg */ client_lock_unlock_cb(pipe_idx, true); client_lock_unlock_cb(client, true); if (ep->valid && ep->skip_ep_cfg) { ep->ep_delay_set = ep_ctrl.ipa_ep_delay; result = ipa3_cfg_ep_ctrl(pipe_idx, &ep_ctrl); Loading @@ -1390,7 +1397,7 @@ int ipa3_set_reset_client_prod_pipe_delay(bool set_reset, else IPADBG("client (ep: %d) success\n", pipe_idx); } client_lock_unlock_cb(pipe_idx, false); client_lock_unlock_cb(client, false); return result; } Loading Loading @@ -1423,7 +1430,7 @@ int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, ep = &ipa3_ctx->ep[pipe_idx]; /* Setting sus/holb on MHI_CONS with skip_ep_cfg */ client_lock_unlock_cb(pipe_idx, true); client_lock_unlock_cb(client, true); if (ep->valid && ep->skip_ep_cfg) { if (ipa3_ctx->ipa_hw_type < IPA_HW_v4_0) ipahal_write_reg_n_fields( Loading @@ -1442,7 +1449,7 @@ int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, IPA_ENDP_INIT_HOL_BLOCK_EN_n, pipe_idx, &ep_holb); } client_lock_unlock_cb(pipe_idx, false); client_lock_unlock_cb(client, false); return 0; } Loading drivers/platform/msm/ipa/ipa_v3/ipa_i.h +4 −2 Original line number Diff line number Diff line Loading @@ -1625,6 +1625,7 @@ struct ipa3_context { bool wdi_over_pcie; bool fw_loaded; int (*client_lock_unlock[IPA_MAX_CLNT])(bool is_lock); bool (*get_teth_port_state[IPA_MAX_CLNT])(void); }; struct ipa3_plat_drv_res { Loading Loading @@ -1942,8 +1943,9 @@ int ipa3_xdci_connect(u32 clnt_hdl); int ipa3_xdci_disconnect(u32 clnt_hdl, bool should_force_clear, u32 qmi_req_id); void ipa3_xdci_ep_delay_rm(u32 clnt_hdl); void ipa3_register_lock_unlock_callback(int (*client_cb)(bool), u32 ipa_ep_idx); void ipa3_deregister_lock_unlock_callback(u32 ipa_ep_idx); void ipa3_register_client_callback(int (*client_cb)(bool), bool (*teth_port_state)(void), u32 ipa_ep_idx); void ipa3_deregister_client_callback(u32 ipa_ep_idx); int ipa3_set_reset_client_prod_pipe_delay(bool set_reset, enum ipa_client_type client); int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, Loading Loading
drivers/platform/msm/ipa/ipa_clients/ipa_usb.c +14 −3 Original line number Diff line number Diff line Loading @@ -299,6 +299,17 @@ static char *ipa3_usb_notify_event_to_string(enum ipa_usb_notify_event event) return "UNSUPPORTED"; } static bool ipa3_usb_get_teth_port_state(void) { if (ipa3_usb_ctx == NULL) return false; if (ipa3_usb_ctx->ttype_ctx[IPA_USB_TRANSPORT_TETH].state == IPA_USB_CONNECTED) return true; else return false; } static bool ipa3_usb_set_state(enum ipa3_usb_state new_state, bool err_permit, enum ipa3_usb_transport_type ttype) { Loading Loading @@ -2435,8 +2446,8 @@ int ipa_usb_xdci_connect(struct ipa_usb_xdci_chan_params *ul_chan_params, * For IPA_USB_DIAG/DPL config there will not be any UL ep. */ if (connect_params->teth_prot != IPA_USB_DIAG) ipa3_register_lock_unlock_callback(&ipa_usb_set_lock_unlock, ul_out_params->clnt_hdl); ipa3_register_client_callback(&ipa_usb_set_lock_unlock, &ipa3_usb_get_teth_port_state, ul_out_params->clnt_hdl); IPA_USB_DBG_LOW("exit\n"); mutex_unlock(&ipa3_usb_ctx->general_mutex); Loading Loading @@ -2522,7 +2533,7 @@ static int ipa_usb_xdci_dismiss_channels(u32 ul_clnt_hdl, u32 dl_clnt_hdl, * For IPA_USB_DIAG/DPL config there will not be any UL config. */ if (!IPA3_USB_IS_TTYPE_DPL(ttype)) ipa3_deregister_lock_unlock_callback(ul_clnt_hdl); ipa3_deregister_client_callback(ul_clnt_hdl); /* Change state to STOPPED */ if (!ipa3_usb_set_state(IPA_USB_STOPPED, false, ttype)) Loading
drivers/platform/msm/ipa/ipa_v3/ipa_client.c +23 −16 Original line number Diff line number Diff line Loading @@ -644,13 +644,11 @@ int ipa3_smmu_map_peer_buff(u64 iova, u32 size, bool map, struct sg_table *sgt, return 0; } static enum ipa_client_cb_type ipa_get_client_cb_type(u32 ipa_ep_idx) static enum ipa_client_cb_type ipa_get_client_cb_type( enum ipa_client_type client_type) { enum ipa_client_type client_type; enum ipa_client_cb_type client_cb; client_type = ipa3_get_client_by_pipe(ipa_ep_idx); if (client_type == IPA_CLIENT_USB_PROD || client_type == IPA_CLIENT_USB_CONS) { IPADBG("USB Client registered\n"); Loading @@ -666,14 +664,16 @@ static enum ipa_client_cb_type ipa_get_client_cb_type(u32 ipa_ep_idx) return client_cb; } void ipa3_register_lock_unlock_callback(int (*client_cb)(bool is_lock), u32 ipa_ep_idx) void ipa3_register_client_callback(int (*client_cb)(bool is_lock), bool (*teth_port_state)(void), u32 ipa_ep_idx) { enum ipa_client_cb_type client; enum ipa_client_type client_type; IPADBG("entry\n"); client = ipa_get_client_cb_type(ipa_ep_idx); client_type = ipa3_get_client_by_pipe(ipa_ep_idx); client = ipa_get_client_cb_type(client_type); if (client == IPA_MAX_CLNT) return; Loading @@ -684,35 +684,42 @@ void ipa3_register_lock_unlock_callback(int (*client_cb)(bool is_lock), if (!ipa3_ctx->client_lock_unlock[client]) ipa3_ctx->client_lock_unlock[client] = client_cb; if (!ipa3_ctx->get_teth_port_state[client]) ipa3_ctx->get_teth_port_state[client] = teth_port_state; IPADBG("exit\n"); } void ipa3_deregister_lock_unlock_callback(u32 ipa_ep_idx) void ipa3_deregister_client_callback(u32 ipa_ep_idx) { enum ipa_client_cb_type client_cb; enum ipa_client_type client_type; IPADBG("entry\n"); client_cb = ipa_get_client_cb_type(ipa_ep_idx); client_type = ipa3_get_client_by_pipe(ipa_ep_idx); client_cb = ipa_get_client_cb_type(client_type); if (client_cb == IPA_MAX_CLNT) return; if (ipa3_ctx->client_lock_unlock[client_cb] == NULL) { if (ipa3_ctx->client_lock_unlock[client_cb] == NULL && ipa3_ctx->get_teth_port_state[client_cb] == NULL) { IPAERR("client_lock_unlock is already NULL"); return; } ipa3_ctx->client_lock_unlock[client_cb] = NULL; ipa3_ctx->get_teth_port_state[client_cb] = NULL; IPADBG("exit\n"); } static void client_lock_unlock_cb(u32 ipa_ep_idx, bool is_lock) static void client_lock_unlock_cb(enum ipa_client_type client, bool is_lock) { enum ipa_client_cb_type client_cb; IPADBG("entry\n"); client_cb = ipa_get_client_cb_type(ipa_ep_idx); client_cb = ipa_get_client_cb_type(client); if (client_cb == IPA_MAX_CLNT) return; Loading Loading @@ -1380,7 +1387,7 @@ int ipa3_set_reset_client_prod_pipe_delay(bool set_reset, ep = &ipa3_ctx->ep[pipe_idx]; /* Setting delay on USB_PROD with skip_ep_cfg */ client_lock_unlock_cb(pipe_idx, true); client_lock_unlock_cb(client, true); if (ep->valid && ep->skip_ep_cfg) { ep->ep_delay_set = ep_ctrl.ipa_ep_delay; result = ipa3_cfg_ep_ctrl(pipe_idx, &ep_ctrl); Loading @@ -1390,7 +1397,7 @@ int ipa3_set_reset_client_prod_pipe_delay(bool set_reset, else IPADBG("client (ep: %d) success\n", pipe_idx); } client_lock_unlock_cb(pipe_idx, false); client_lock_unlock_cb(client, false); return result; } Loading Loading @@ -1423,7 +1430,7 @@ int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, ep = &ipa3_ctx->ep[pipe_idx]; /* Setting sus/holb on MHI_CONS with skip_ep_cfg */ client_lock_unlock_cb(pipe_idx, true); client_lock_unlock_cb(client, true); if (ep->valid && ep->skip_ep_cfg) { if (ipa3_ctx->ipa_hw_type < IPA_HW_v4_0) ipahal_write_reg_n_fields( Loading @@ -1442,7 +1449,7 @@ int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, IPA_ENDP_INIT_HOL_BLOCK_EN_n, pipe_idx, &ep_holb); } client_lock_unlock_cb(pipe_idx, false); client_lock_unlock_cb(client, false); return 0; } Loading
drivers/platform/msm/ipa/ipa_v3/ipa_i.h +4 −2 Original line number Diff line number Diff line Loading @@ -1625,6 +1625,7 @@ struct ipa3_context { bool wdi_over_pcie; bool fw_loaded; int (*client_lock_unlock[IPA_MAX_CLNT])(bool is_lock); bool (*get_teth_port_state[IPA_MAX_CLNT])(void); }; struct ipa3_plat_drv_res { Loading Loading @@ -1942,8 +1943,9 @@ int ipa3_xdci_connect(u32 clnt_hdl); int ipa3_xdci_disconnect(u32 clnt_hdl, bool should_force_clear, u32 qmi_req_id); void ipa3_xdci_ep_delay_rm(u32 clnt_hdl); void ipa3_register_lock_unlock_callback(int (*client_cb)(bool), u32 ipa_ep_idx); void ipa3_deregister_lock_unlock_callback(u32 ipa_ep_idx); void ipa3_register_client_callback(int (*client_cb)(bool), bool (*teth_port_state)(void), u32 ipa_ep_idx); void ipa3_deregister_client_callback(u32 ipa_ep_idx); int ipa3_set_reset_client_prod_pipe_delay(bool set_reset, enum ipa_client_type client); int ipa3_set_reset_client_cons_pipe_sus_holb(bool set_reset, Loading