Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 98a483a6 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: ipa3: Fix to start/stop gsi channel USB pipe connected"

parents 8182938a 4fe45567
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -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)
{
@@ -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);
@@ -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))
+23 −16
Original line number Diff line number Diff line
@@ -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");
@@ -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;

@@ -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;

@@ -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);
@@ -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;
}

@@ -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(
@@ -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;
}

+4 −2
Original line number Diff line number Diff line
@@ -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 {
@@ -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,