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

Commit d89df1ec authored by Manikandan Mohan's avatar Manikandan Mohan
Browse files

cnss2: Process TWT Indication message in event workqueue



Since TWT indication messages requires QMI message forwarding
between IMS and WLFW, update platform driver for processing
the QMI indication in event workqueue.

Change-Id: I9fdb09a16ebcdc352e0354beae156658a32fdf99
Signed-off-by: default avatarManikandan Mohan <manikand@codeaurora.org>
parent da2e3647
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -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;
+2 −0
Original line number Diff line number Diff line
@@ -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,
+34 −2
Original line number Diff line number Diff line
@@ -2189,6 +2189,17 @@ static int cnss_ims_wfc_call_twt_cfg_send_sync
	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[] = {
+18 −0
Original line number Diff line number Diff line
@@ -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)
{