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

Commit ad2e60b4 authored by Sandeep Singh's avatar Sandeep Singh Committed by Gerrit - the friendly Code Review server
Browse files

icnss: Check firmware status to ignore QMI handshake



In case of Full Disk Encryption feature enablement, all core
class services including qrtr service gets restarted. When qrtr
service started wlan platform driver starts handshake with
firmware. In this case firmware rejects handshake request from
platform driver as QMI is out of sync between firmware and
platform driver. In order avoid handshake between platform driver
and firmware if it is already done, check firmware status during
indication registration request.

Change-Id: If5e2a9e90427f18304b1a9369d922f1021a9ab65
Signed-off-by: default avatarSandeep Singh <sandsing@codeaurora.org>
parent b482dc81
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -841,6 +841,10 @@ static int icnss_driver_event_server_arrive(void *data)

	ret = wlfw_ind_register_send_sync_msg(penv);
	if (ret < 0) {
		if (ret == -EALREADY) {
			ret = 0;
			goto qmi_registered;
		}
		ignore_assert = true;
		goto err_power_on;
	}
@@ -889,6 +893,7 @@ static int icnss_driver_event_server_arrive(void *data)
	icnss_clear_server(penv);
fail:
	ICNSS_ASSERT(ignore_assert);
qmi_registered:
	return ret;
}

@@ -2505,6 +2510,15 @@ static void icnss_allow_recursive_recovery(struct device *dev)
	icnss_pr_info("Recursive recovery allowed for WLAN\n");
}

static void icnss_disallow_recursive_recovery(struct device *dev)
{
	struct icnss_priv *priv = dev_get_drvdata(dev);

	priv->allow_recursive_recovery = false;

	icnss_pr_info("Recursive recovery disallowed for WLAN\n");
}

static ssize_t icnss_fw_debug_write(struct file *fp,
				    const char __user *user_buf,
				    size_t count, loff_t *off)
@@ -2556,6 +2570,9 @@ static ssize_t icnss_fw_debug_write(struct file *fp,
		case 4:
			icnss_allow_recursive_recovery(&priv->pdev->dev);
			break;
		case 5:
			icnss_disallow_recursive_recovery(&priv->pdev->dev);
			break;
		default:
			return -EINVAL;
		}
@@ -3204,6 +3221,8 @@ static int icnss_probe(struct platform_device *pdev)

	priv->vreg_info = icnss_vreg_info;

	icnss_allow_recursive_recovery(dev);

	if (of_property_read_bool(pdev->dev.of_node, "qcom,icnss-adc_tm")) {
		ret = icnss_get_vbatt_info(priv);
		if (ret == -EPROBE_DEFER)
+10 −1
Original line number Diff line number Diff line
@@ -307,14 +307,23 @@ int wlfw_ind_register_send_sync_msg(struct icnss_priv *priv)

	priv->stats.ind_register_resp++;

	if (resp->fw_status_valid &&
	   (resp->fw_status & QMI_WLFW_ALREADY_REGISTERED_V01)) {
		ret = -EALREADY;
		icnss_pr_dbg("WLFW already registered\n");
		goto qmi_registered;
	}

	kfree(resp);
	kfree(req);

	return 0;

out:
	priv->stats.ind_register_err++;
qmi_registered:
	kfree(resp);
	kfree(req);
	priv->stats.ind_register_err++;
	return ret;
}