From 6404ccc934ccb63d638f6de33aba8abfc4144790 Mon Sep 17 00:00:00 2001 From: Manikandan Mohan Date: Wed, 21 Oct 2020 21:01:08 -0700 Subject: [PATCH] cnss2: Fix MAC address setup on late DMS server arrival Process QMI socket connection in DMS server arrival callback to avoid MAC address setup failure on late DMS service connection. Change-Id: I949b409e09afc7f98decc5f05912467df0d997b8 Signed-off-by: Manikandan Mohan --- drivers/net/wireless/cnss2/main.c | 17 +++------ drivers/net/wireless/cnss2/main.h | 2 - drivers/net/wireless/cnss2/qmi.c | 62 ++++++------------------------- drivers/net/wireless/cnss2/qmi.h | 13 ------- 4 files changed, 18 insertions(+), 76 deletions(-) diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 0b0dcde01abb..023f3de71db8 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -412,6 +412,10 @@ static int cnss_setup_dms_mac(struct cnss_plat_data *plat_priv) u32 i; int ret = 0; + ret = cnss_qmi_get_dms_mac(plat_priv); + if (ret == 0 && plat_priv->dms.mac_valid) + goto qmi_send; + /* DTSI property use-nv-mac is used to force DMS MAC address for WLAN. * Thus assert on failure to get MAC from DMS even after retries */ @@ -426,11 +430,12 @@ static int cnss_setup_dms_mac(struct cnss_plat_data *plat_priv) msleep(CNSS_DMS_QMI_CONNECTION_WAIT_MS); } if (!plat_priv->dms.mac_valid) { - cnss_pr_err("Unable to get MAC from DMS\n"); + cnss_pr_err("Unable to get MAC from DMS after retries\n"); CNSS_ASSERT(0); return -EINVAL; } } +qmi_send: if (plat_priv->dms.mac_valid) ret = cnss_wlfw_wlan_mac_req_send_sync(plat_priv, plat_priv->dms.mac, @@ -532,10 +537,6 @@ static char *cnss_driver_event_to_str(enum cnss_driver_event_type type) return "QDSS_TRACE_SAVE"; case CNSS_DRIVER_EVENT_QDSS_TRACE_FREE: return "QDSS_TRACE_FREE"; - case CNSS_DRIVER_EVENT_DMS_SERVER_ARRIVE: - return "DMS_SERVER_ARRIVE"; - case CNSS_DRIVER_EVENT_DMS_SERVER_EXIT: - return "DMS_SERVER_EXIT"; case CNSS_DRIVER_EVENT_MAX: return "EVENT_MAX"; } @@ -1695,12 +1696,6 @@ static void cnss_driver_event_work(struct work_struct *work) case CNSS_DRIVER_EVENT_QDSS_TRACE_FREE: ret = cnss_qdss_trace_free_hdlr(plat_priv); break; - case CNSS_DRIVER_EVENT_DMS_SERVER_ARRIVE: - ret = cnss_dms_server_arrive(plat_priv, event->data); - break; - case CNSS_DRIVER_EVENT_DMS_SERVER_EXIT: - ret = cnss_dms_server_exit(plat_priv); - break; default: cnss_pr_err("Invalid driver event type: %d", event->type); diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index 8dfe1aad8013..09c2d2bff74f 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -261,8 +261,6 @@ enum cnss_driver_event_type { CNSS_DRIVER_EVENT_QDSS_TRACE_REQ_MEM, CNSS_DRIVER_EVENT_QDSS_TRACE_SAVE, CNSS_DRIVER_EVENT_QDSS_TRACE_FREE, - CNSS_DRIVER_EVENT_DMS_SERVER_ARRIVE, - CNSS_DRIVER_EVENT_DMS_SERVER_EXIT, CNSS_DRIVER_EVENT_MAX, }; diff --git a/drivers/net/wireless/cnss2/qmi.c b/drivers/net/wireless/cnss2/qmi.c index 6b8359558d53..a8f717503aaa 100644 --- a/drivers/net/wireless/cnss2/qmi.c +++ b/drivers/net/wireless/cnss2/qmi.c @@ -2475,80 +2475,42 @@ out: } static int cnss_dms_connect_to_server(struct cnss_plat_data *plat_priv, - void *data) + unsigned int node, unsigned int port) { - struct cnss_qmi_event_server_arrive_data *event_data = data; struct qmi_handle *qmi_dms = &plat_priv->qmi_dms; struct sockaddr_qrtr sq = {0}; int ret = 0; - if (!event_data) - return -EINVAL; - sq.sq_family = AF_QIPCRTR; - sq.sq_node = event_data->node; - sq.sq_port = event_data->port; - kfree(data); + sq.sq_node = node; + sq.sq_port = port; ret = kernel_connect(qmi_dms->sock, (struct sockaddr *)&sq, sizeof(sq), 0); if (ret < 0) { - cnss_pr_err("Failed to connect to QMI DMS remote service port\n"); + cnss_pr_err("Failed to connect to QMI DMS remote service Node: %d Port: %d\n", + node, port); goto out; } set_bit(CNSS_QMI_DMS_CONNECTED, &plat_priv->driver_state); cnss_pr_info("QMI DMS service connected, state: 0x%lx\n", plat_priv->driver_state); - cnss_qmi_get_dms_mac(plat_priv); out: return ret; } -int cnss_dms_server_arrive(struct cnss_plat_data *plat_priv, void *data) -{ - int ret = 0; - - if (!plat_priv) { - cnss_pr_err("Platform not initialized on DMS server arrive\n"); - return -ENODEV; - } - ret = cnss_dms_connect_to_server(plat_priv, data); - return ret; -} - -int cnss_dms_server_exit(struct cnss_plat_data *plat_priv) -{ - if (!plat_priv) - return -ENODEV; - - clear_bit(CNSS_QMI_DMS_CONNECTED, &plat_priv->driver_state); - cnss_pr_info("QMI DMS service disconnected, state: 0x%lx\n", - plat_priv->driver_state); - return 0; -} - static int dms_new_server(struct qmi_handle *qmi_dms, struct qmi_service *service) { struct cnss_plat_data *plat_priv = container_of(qmi_dms, struct cnss_plat_data, qmi_dms); - struct cnss_qmi_event_server_arrive_data *event_data; - cnss_pr_err("DMS server arriving: node %u port %u\n", - service->node, service->port); + if (!service) + return -EINVAL; - event_data = kzalloc(sizeof(*event_data), GFP_KERNEL); - if (!event_data) - return -ENOMEM; - - event_data->node = service->node; - event_data->port = service->port; - - cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_DMS_SERVER_ARRIVE, - 0, event_data); - - return 0; + return cnss_dms_connect_to_server(plat_priv, service->node, + service->port); } static void dms_del_server(struct qmi_handle *qmi_dms, @@ -2557,9 +2519,9 @@ static void dms_del_server(struct qmi_handle *qmi_dms, struct cnss_plat_data *plat_priv = container_of(qmi_dms, struct cnss_plat_data, qmi_dms); - cnss_pr_dbg("DMS server exiting\n"); - cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_DMS_SERVER_EXIT, 0, - NULL); + clear_bit(CNSS_QMI_DMS_CONNECTED, &plat_priv->driver_state); + cnss_pr_info("QMI DMS service disconnected, state: 0x%lx\n", + plat_priv->driver_state); } static struct qmi_ops qmi_dms_ops = { diff --git a/drivers/net/wireless/cnss2/qmi.h b/drivers/net/wireless/cnss2/qmi.h index 2fa1a68480d2..4d74ad11dc33 100644 --- a/drivers/net/wireless/cnss2/qmi.h +++ b/drivers/net/wireless/cnss2/qmi.h @@ -77,8 +77,6 @@ void cnss_ignore_qmi_failure(bool ignore); int cnss_qmi_get_dms_mac(struct cnss_plat_data *plat_priv); int cnss_wlfw_wlan_mac_req_send_sync(struct cnss_plat_data *plat_priv, u8 *mac, u32 mac_len); -int cnss_dms_server_arrive(struct cnss_plat_data *plat_priv, void *data); -int cnss_dms_server_exit(struct cnss_plat_data *plat_priv); int cnss_dms_init(struct cnss_plat_data *plat_priv); void cnss_dms_deinit(struct cnss_plat_data *plat_priv); #else @@ -259,17 +257,6 @@ int cnss_wlfw_wlan_mac_req_send_sync(struct cnss_plat_data *plat_priv, return 0; } -static inline -int cnss_dms_server_arrive(struct cnss_plat_data *plat_priv, void *data) -{ - return 0; -} - -static inline int cnss_dms_server_exit(struct cnss_plat_data *plat_priv) -{ - return 0; -} - static inline int cnss_dms_init(struct cnss_plat_data *plat_priv) { return 0;