From 0be5637d54031b536493641b8f1cbe3eb1542bd6 Mon Sep 17 00:00:00 2001 From: Naman Padhiar Date: Wed, 17 Mar 2021 16:36:11 +0530 Subject: [PATCH] cnss2: Do not wait in loop if MAC is not provisioned If "use-nv-mac" is set in device tree, CNSS driver waits for DMS server come up during boot and asserts if it timeout. Today, even if MAC is not programmed in device, QMI send API returns failure but CNSS driver assuming that DMS server is not up and waiting in a loop and finally asserts. Break and continue if MAC is not programmed in device. Change-Id: I8d89dbb0d47a0898a73a0c7e994d5fdc8fcceddd Signed-off-by: Naman Padhiar --- drivers/net/wireless/cnss2/main.c | 4 ++-- drivers/net/wireless/cnss2/main.h | 1 + drivers/net/wireless/cnss2/qmi.c | 12 +++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 719f03bf74fa..75326ff055eb 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -517,11 +517,11 @@ static int cnss_setup_dms_mac(struct cnss_plat_data *plat_priv) break; ret = cnss_qmi_get_dms_mac(plat_priv); - if (ret == 0) + if (ret != -EAGAIN) break; msleep(CNSS_DMS_QMI_CONNECTION_WAIT_MS); } - if (!plat_priv->dms.mac_valid) { + if (!plat_priv->dms.nv_mac_not_prov && !plat_priv->dms.mac_valid) { cnss_pr_err("Unable to get MAC from DMS after retries\n"); CNSS_ASSERT(0); return -EINVAL; diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index 3f614bc2d046..2a6af941a51e 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -394,6 +394,7 @@ enum cnss_ce_index { struct cnss_dms_data { u32 mac_valid; + u8 nv_mac_not_prov; u8 mac[QMI_WLFW_MAC_ADDR_SIZE_V01]; }; diff --git a/drivers/net/wireless/cnss2/qmi.c b/drivers/net/wireless/cnss2/qmi.c index a81967ae499c..d95b3790f922 100644 --- a/drivers/net/wireless/cnss2/qmi.c +++ b/drivers/net/wireless/cnss2/qmi.c @@ -39,6 +39,7 @@ #define QMI_WLFW_MAX_RECV_BUF_SIZE SZ_8K #define IMSPRIVATE_SERVICE_MAX_MSG_LEN SZ_8K #define DMS_QMI_MAX_MSG_LEN SZ_256 +#define DMS_MAC_NOT_PROVISIONED 16 #define QMI_WLFW_MAC_READY_TIMEOUT_MS 50 #define QMI_WLFW_MAC_READY_MAX_RETRY 200 @@ -2872,7 +2873,7 @@ int cnss_qmi_get_dms_mac(struct cnss_plat_data *plat_priv) if (!test_bit(CNSS_QMI_DMS_CONNECTED, &plat_priv->driver_state)) { cnss_pr_err("DMS QMI connection not established\n"); - return -EINVAL; + return -EAGAIN; } cnss_pr_dbg("Requesting DMS MAC address"); @@ -2903,8 +2904,13 @@ int cnss_qmi_get_dms_mac(struct cnss_plat_data *plat_priv) } if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { - cnss_pr_err("QMI_DMS_GET_MAC_ADDRESS_REQ_V01 failed, result: %d, err: %d\n", - resp.resp.result, resp.resp.error); + if (resp.resp.error == DMS_MAC_NOT_PROVISIONED) { + cnss_pr_err("NV MAC address is not provisioned"); + plat_priv->dms.nv_mac_not_prov = 1; + } else { + cnss_pr_err("QMI_DMS_GET_MAC_ADDRESS_REQ_V01 failed, result: %d, err: %d\n", + resp.resp.result, resp.resp.error); + } ret = -resp.resp.result; goto out; }