From 52f01ef02319336b43f59e99b2c0be2767932d10 Mon Sep 17 00:00:00 2001 From: Sai Chaitanya Kaveti Date: Tue, 9 Nov 2021 13:31:54 +0530 Subject: [PATCH] msm: mhi_dev: Checking the out channel status directly If the net dev init process is scheduled out in between registering a callback for in-channel and out-channel and start command for these channels gets processed at this time (after registering the callback for out channel but before registeringthe callback for in-channel) then with existing logic, we never register with the network interface. Checking the out channel status directly rather than using local bool variable out_channel_started before calling mhi_dev_net_open_chan_create_netif API. If out channel status is connected the mhi_dev_net_open_chan_create_netif API is called. Change-Id: I69af6c49ee565ffd04c4d0ac22b686ff986b7bc7 Signed-off-by: Sai Chaitanya Kaveti --- drivers/platform/msm/mhi_dev/mhi_dev_net.c | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/platform/msm/mhi_dev/mhi_dev_net.c b/drivers/platform/msm/mhi_dev/mhi_dev_net.c index fedda63c202c..08bf7f995f8f 100644 --- a/drivers/platform/msm/mhi_dev/mhi_dev_net.c +++ b/drivers/platform/msm/mhi_dev/mhi_dev_net.c @@ -695,7 +695,7 @@ static void mhi_dev_net_state_cb(struct mhi_dev_client_cb_data *cb_data) int mhi_dev_net_interface_init(void) { int ret_val = 0, index = 0; - bool out_channel_started = false; + uint32_t info_out_ch = 0; struct mhi_dev_net_client *mhi_net_client = NULL; if (mhi_net_ctxt.client_handle) { @@ -750,10 +750,7 @@ int mhi_dev_net_interface_init(void) } ret_val = mhi_register_state_cb(mhi_dev_net_state_cb, mhi_net_client, MHI_CLIENT_IP_SW_4_OUT); - /* -EEXIST indicates success and channel is already open */ - if (ret_val == -EEXIST) - out_channel_started = true; - else if (ret_val < 0) + if (ret_val < 0 && ret_val != -EEXIST) goto register_state_cb_fail; ret_val = mhi_register_state_cb(mhi_dev_net_state_cb, @@ -770,13 +767,16 @@ int mhi_dev_net_interface_init(void) * with mhi_dev_net_open_chan_create_netif(). */ ret_val = 0; - if (out_channel_started) { - ret_val = mhi_dev_net_open_chan_create_netif - (mhi_net_client); - if (ret_val < 0) { - mhi_dev_net_log(MHI_ERROR, - "Failed to open channels\n"); - goto channel_open_fail; + if (!mhi_ctrl_state_info(mhi_net_client->out_chan, + &info_out_ch)) { + if (info_out_ch == MHI_STATE_CONNECTED) { + ret_val = mhi_dev_net_open_chan_create_netif + (mhi_net_client); + if (ret_val < 0) { + mhi_dev_net_log(MHI_ERROR, + "Failed to open channels\n"); + goto channel_open_fail; + } } } } else if (ret_val < 0) {