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

Commit 6325b0a3 authored by Hemant Kumar's avatar Hemant Kumar
Browse files

usb: gadget: f_gsi: Perform IPA initialization after IPA is ready



IPA driver finishes its initialization only after the IPA FW is
loaded. Upon function bind config if IPA driver is not ready defer
IPA related initializations. This is done by registering a call
back with IPA and wait for IPA ready call back to unblock the
function bind config.

Change-Id: I0f4304c183bb9db401f3641115d358e1c993eb9e
Signed-off-by: default avatarHemant Kumar <hemantk@codeaurora.org>
parent e5cb9812
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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,
@@ -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;

+4 −0
Original line number Diff line number Diff line
@@ -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 */
@@ -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;

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