diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 029a6cd09dfe..bb5ee53799e7 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -487,6 +487,10 @@ static char *cnss_driver_event_to_str(enum cnss_driver_event_type type) return "IDLE_RESTART"; case CNSS_DRIVER_EVENT_IDLE_SHUTDOWN: return "IDLE_SHUTDOWN"; + case CNSS_DRIVER_EVENT_IMS_WFC_CALL_IND: + return "IMS_WFC_CALL_IND"; + case CNSS_DRIVER_EVENT_WLFW_TWT_CFG_IND: + return "WLFW_TWC_CFG_IND"; case CNSS_DRIVER_EVENT_QDSS_TRACE_REQ_MEM: return "QDSS_TRACE_REQ_MEM"; case CNSS_DRIVER_EVENT_QDSS_TRACE_SAVE: @@ -1627,6 +1631,14 @@ static void cnss_driver_event_work(struct work_struct *work) case CNSS_DRIVER_EVENT_POWER_DOWN: ret = cnss_power_down_hdlr(plat_priv); break; + case CNSS_DRIVER_EVENT_IMS_WFC_CALL_IND: + ret = cnss_process_wfc_call_ind_event(plat_priv, + event->data); + break; + case CNSS_DRIVER_EVENT_WLFW_TWT_CFG_IND: + ret = cnss_process_twt_cfg_ind_event(plat_priv, + event->data); + break; case CNSS_DRIVER_EVENT_QDSS_TRACE_REQ_MEM: ret = cnss_qdss_trace_req_mem_hdlr(plat_priv); break; diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index c58161caae33..92501696ff1f 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -255,6 +255,8 @@ enum cnss_driver_event_type { CNSS_DRIVER_EVENT_POWER_DOWN, CNSS_DRIVER_EVENT_IDLE_RESTART, CNSS_DRIVER_EVENT_IDLE_SHUTDOWN, + CNSS_DRIVER_EVENT_IMS_WFC_CALL_IND, + CNSS_DRIVER_EVENT_WLFW_TWT_CFG_IND, CNSS_DRIVER_EVENT_QDSS_TRACE_REQ_MEM, CNSS_DRIVER_EVENT_QDSS_TRACE_SAVE, CNSS_DRIVER_EVENT_QDSS_TRACE_FREE, diff --git a/drivers/net/wireless/cnss2/qmi.c b/drivers/net/wireless/cnss2/qmi.c index 13e10f3b8f73..b54a2d3ef1b7 100644 --- a/drivers/net/wireless/cnss2/qmi.c +++ b/drivers/net/wireless/cnss2/qmi.c @@ -2189,6 +2189,17 @@ out: return ret; } +int cnss_process_twt_cfg_ind_event(struct cnss_plat_data *plat_priv, + void *data) +{ + int ret; + struct wlfw_wfc_call_twt_config_ind_msg_v01 *ind_msg = data; + + ret = cnss_ims_wfc_call_twt_cfg_send_sync(plat_priv, ind_msg); + kfree(data); + return ret; +} + static void cnss_wlfw_process_twt_cfg_ind(struct qmi_handle *qmi_wlfw, struct sockaddr_qrtr *sq, struct qmi_txn *txn, @@ -2197,6 +2208,7 @@ static void cnss_wlfw_process_twt_cfg_ind(struct qmi_handle *qmi_wlfw, struct cnss_plat_data *plat_priv = container_of(qmi_wlfw, struct cnss_plat_data, qmi_wlfw); const struct wlfw_wfc_call_twt_config_ind_msg_v01 *ind_msg = data; + struct wlfw_wfc_call_twt_config_ind_msg_v01 *event_data; if (!txn) { cnss_pr_err("FW->CNSS: TWT_CFG_IND: Spurious indication\n"); @@ -2216,7 +2228,11 @@ static void cnss_wlfw_process_twt_cfg_ind(struct qmi_handle *qmi_wlfw, ind_msg->twt_sta_config_changed_valid, ind_msg->twt_sta_config_changed); - cnss_ims_wfc_call_twt_cfg_send_sync(plat_priv, ind_msg); + event_data = kmemdup(ind_msg, sizeof(*event_data), GFP_KERNEL); + if (!event_data) + return; + cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_WLFW_TWT_CFG_IND, 0, + event_data); } static struct qmi_msg_handler qmi_wlfw_msg_handlers[] = { @@ -2753,6 +2769,17 @@ static void ims_subscribe_for_indication_resp_cb(struct qmi_handle *qmi, } } +int cnss_process_wfc_call_ind_event(struct cnss_plat_data *plat_priv, + void *data) +{ + int ret; + struct ims_private_service_wfc_call_status_ind_msg_v01 *ind_msg = data; + + ret = cnss_wlfw_wfc_call_status_send_sync(plat_priv, ind_msg); + kfree(data); + return ret; +} + static void cnss_ims_process_wfc_call_ind_cb(struct qmi_handle *ims_qmi, struct sockaddr_qrtr *sq, @@ -2762,6 +2789,7 @@ cnss_ims_process_wfc_call_ind_cb(struct qmi_handle *ims_qmi, container_of(ims_qmi, struct cnss_plat_data, ims_qmi); const struct ims_private_service_wfc_call_status_ind_msg_v01 *ind_msg = data; + struct ims_private_service_wfc_call_status_ind_msg_v01 *event_data; if (!txn) { cnss_pr_err("IMS->CNSS: WFC_CALL_IND: Spurious indication\n"); @@ -2780,7 +2808,11 @@ cnss_ims_process_wfc_call_ind_cb(struct qmi_handle *ims_qmi, ind_msg->twt_ims_int_valid, ind_msg->twt_ims_int, ind_msg->media_quality_valid, ind_msg->media_quality); - cnss_wlfw_wfc_call_status_send_sync(plat_priv, ind_msg); + event_data = kmemdup(ind_msg, sizeof(*event_data), GFP_KERNEL); + if (!event_data) + return; + cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_IMS_WFC_CALL_IND, + 0, event_data); } static struct qmi_msg_handler qmi_ims_msg_handlers[] = { diff --git a/drivers/net/wireless/cnss2/qmi.h b/drivers/net/wireless/cnss2/qmi.h index 9413a93dac70..b7abd52d9fcf 100644 --- a/drivers/net/wireless/cnss2/qmi.h +++ b/drivers/net/wireless/cnss2/qmi.h @@ -60,6 +60,10 @@ int cnss_wlfw_antenna_grant_send_sync(struct cnss_plat_data *plat_priv); int cnss_wlfw_dynamic_feature_mask_send_sync(struct cnss_plat_data *plat_priv); int cnss_wlfw_get_info_send_sync(struct cnss_plat_data *plat_priv, int type, void *cmd, int cmd_len); +int cnss_process_wfc_call_ind_event(struct cnss_plat_data *plat_priv, + void *data); +int cnss_process_twt_cfg_ind_event(struct cnss_plat_data *plat_priv, + void *data); int cnss_register_coex_service(struct cnss_plat_data *plat_priv); void cnss_unregister_coex_service(struct cnss_plat_data *plat_priv); int coex_antenna_switch_to_wlan_send_sync_msg(struct cnss_plat_data *plat_priv); @@ -183,6 +187,20 @@ int cnss_wlfw_get_info_send_sync(struct cnss_plat_data *plat_priv, int type, return 0; } +static inline +int cnss_process_wfc_call_ind_event(struct cnss_plat_data *plat_priv, + void *data) +{ + return 0; +} + +static inline +int cnss_process_twt_cfg_ind_event(struct cnss_plat_data *plat_priv, + void *data) +{ + return 0; +} + static inline int cnss_register_coex_service(struct cnss_plat_data *plat_priv) {