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

Commit f0844f6f authored by Skylar Chang's avatar Skylar Chang
Browse files

msm: ipa: latest QMI IDL changes



Introduce the latest QMI IDL changes and implement
the necessary changes in wan transport driver

Change-Id: I8cbd66492df5262d3d9a551f7d050b141d366bdf
Signed-off-by: default avatarSkylar Chang <chiaweic@codeaurora.org>
parent ea5cf73c
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -602,7 +602,7 @@ static int wwan_add_ul_flt_rule_to_ipa(void)
	int num_v4_rule = 0, num_v6_rule = 0;
	struct ipa_ioc_add_flt_rule *param;
	struct ipa_flt_rule_add flt_rule_entry;
	struct ipa_fltr_installed_notif_req_msg_v01 req;
	struct ipa_fltr_installed_notif_req_msg_v01 *req;

	pyld_sz = sizeof(struct ipa_ioc_add_flt_rule) +
	   sizeof(struct ipa_flt_rule_add);
@@ -610,6 +610,14 @@ static int wwan_add_ul_flt_rule_to_ipa(void)
	if (!param)
		return -ENOMEM;

	req = (struct ipa_fltr_installed_notif_req_msg_v01 *)
		kzalloc(sizeof(struct ipa_fltr_installed_notif_req_msg_v01),
			GFP_KERNEL);
	if (!req) {
		kfree(param);
		return -ENOMEM;
	}

	param->commit = 1;
	param->ep = IPA_CLIENT_APPS_LAN_WAN_PROD;
	param->global = false;
@@ -645,23 +653,22 @@ static int wwan_add_ul_flt_rule_to_ipa(void)
	}

	/* send ipa_fltr_installed_notif_req_msg_v01 to Q6*/
	memset(&req, 0, sizeof(struct ipa_fltr_installed_notif_req_msg_v01));
	req.source_pipe_index =
	req->source_pipe_index =
		ipa2_get_ep_mapping(IPA_CLIENT_APPS_LAN_WAN_PROD);
	req.install_status = QMI_RESULT_SUCCESS_V01;
	req.filter_index_list_len = num_q6_rule;
	req->install_status = QMI_RESULT_SUCCESS_V01;
	req->filter_index_list_len = num_q6_rule;
	for (i = 0; i < num_q6_rule; i++) {
		if (ipa_qmi_ctx->q6_ul_filter_rule[i].ip == IPA_IP_v4) {
			req.filter_index_list[i].filter_index = num_v4_rule;
			req->filter_index_list[i].filter_index = num_v4_rule;
			num_v4_rule++;
		} else {
			req.filter_index_list[i].filter_index = num_v6_rule;
			req->filter_index_list[i].filter_index = num_v6_rule;
			num_v6_rule++;
		}
		req.filter_index_list[i].filter_handle =
		req->filter_index_list[i].filter_handle =
			ipa_qmi_ctx->q6_ul_filter_rule[i].filter_hdl;
	}
	if (qmi_filter_notify_send(&req)) {
	if (qmi_filter_notify_send(req)) {
		IPAWANDBG("add filter rule index on A7-RX failed\n");
		retval = -EFAULT;
	}
@@ -669,6 +676,7 @@ static int wwan_add_ul_flt_rule_to_ipa(void)
	IPAWANDBG("add (%d) filter rule index on A7-RX\n",
			old_num_q6_rule);
	kfree(param);
	kfree(req);
	return retval;
}

+77 −29
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ static bool is_load_uc;
static uint32_t ipa_wan_platform;
struct ipa3_qmi_context *ipa3_qmi_ctx;
static bool workqueues_stopped;
static bool ipa3_modem_init_cmplt;

/* QMI A5 service */

@@ -70,17 +71,17 @@ static struct msg_desc ipa3_master_driver_complete_indication_desc = {
	.ei_array = ipa3_master_driver_init_complt_ind_msg_data_v01_ei,
};
static struct msg_desc ipa3_install_fltr_rule_req_desc = {
	.max_msg_len = QMI3_IPA_INSTALL_FILTER_RULE_REQ_MAX_MSG_LEN_V01,
	.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_REQ_MAX_MSG_LEN_V01,
	.msg_id = QMI_IPA_INSTALL_FILTER_RULE_REQ_V01,
	.ei_array = ipa3_install_fltr_rule_req_msg_data_v01_ei,
};
static struct msg_desc ipa3_install_fltr_rule_resp_desc = {
	.max_msg_len = QMI3_IPA_INSTALL_FILTER_RULE_RESP_MAX_MSG_LEN_V01,
	.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_RESP_MAX_MSG_LEN_V01,
	.msg_id = QMI_IPA_INSTALL_FILTER_RULE_RESP_V01,
	.ei_array = ipa3_install_fltr_rule_resp_msg_data_v01_ei,
};
static struct msg_desc ipa3_filter_installed_notif_req_desc = {
	.max_msg_len = QMI3_IPA_FILTER_INSTALLED_NOTIF_REQ_MAX_MSG_LEN_V01,
	.max_msg_len = QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_MAX_MSG_LEN_V01,
	.msg_id = QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_V01,
	.ei_array = ipa3_fltr_installed_notif_req_msg_data_v01_ei,
};
@@ -100,6 +101,18 @@ static struct msg_desc ipa3_config_resp_desc = {
	.ei_array = ipa3_config_resp_msg_data_v01_ei,
};

static struct msg_desc ipa3_init_modem_driver_cmplt_req_desc = {
	.max_msg_len = QMI_IPA_INIT_MODEM_DRIVER_CMPLT_REQ_MAX_MSG_LEN_V01,
	.msg_id = QMI_IPA_INIT_MODEM_DRIVER_CMPLT_REQ_V01,
	.ei_array = ipa3_init_modem_driver_cmplt_req_msg_data_v01_ei,
};

static struct msg_desc ipa3_init_modem_driver_cmplt_resp_desc = {
	.max_msg_len = QMI_IPA_INIT_MODEM_DRIVER_CMPLT_RESP_MAX_MSG_LEN_V01,
	.msg_id = QMI_IPA_INIT_MODEM_DRIVER_CMPLT_RESP_V01,
	.ei_array = ipa3_init_modem_driver_cmplt_resp_msg_data_v01_ei,
};

static int ipa3_handle_indication_req(void *req_h, void *req)
{
	struct ipa_indication_reg_req_msg_v01 *indication_req;
@@ -136,41 +149,43 @@ static int ipa3_handle_indication_req(void *req_h, void *req)

static int ipa3_handle_install_filter_rule_req(void *req_h, void *req)
{
	struct ipa3_install_fltr_rule_req_msg_v01 *rule_req;
	struct ipa3_install_fltr_rule_resp_msg_v01 resp;
	struct ipa_install_fltr_rule_req_msg_v01 *rule_req;
	struct ipa_install_fltr_rule_resp_msg_v01 resp;
	uint32_t rule_hdl[MAX_NUM_Q6_RULE];
	int rc = 0, i;

	rule_req = (struct ipa3_install_fltr_rule_req_msg_v01 *)req;
	rule_req = (struct ipa_install_fltr_rule_req_msg_v01 *)req;
	memset(rule_hdl, 0, sizeof(rule_hdl));
	memset(&resp, 0, sizeof(struct ipa3_install_fltr_rule_resp_msg_v01));
	memset(&resp, 0, sizeof(struct ipa_install_fltr_rule_resp_msg_v01));
	IPAWANDBG("Received install filter Request\n");

	rc = ipa3_copy_ul_filter_rule_to_ipa((struct
		ipa3_install_fltr_rule_req_msg_v01*)req);
		ipa_install_fltr_rule_req_msg_v01*)req);
	if (rc)
		IPAWANERR("copy UL rules from modem is failed\n");

	resp.resp.result = IPA_QMI_RESULT_SUCCESS_V01;
	if (rule_req->filter_spec_list_valid == true) {
		if (rule_req->filter_spec_list_len > MAX_NUM_Q6_RULE) {
	if (rule_req->filter_spec_ex_list_valid == true) {
		resp.rule_id_valid = 1;
		if (rule_req->filter_spec_ex_list_len > MAX_NUM_Q6_RULE) {
			resp.rule_id_len = MAX_NUM_Q6_RULE;
			IPAWANERR("installed (%d) max Q6-UL rules ",
			MAX_NUM_Q6_RULE);
			IPAWANERR("but modem gives total (%d)\n",
			rule_req->filter_spec_list_len);
			rule_req->filter_spec_ex_list_len);
		} else {
			resp.rule_id_len =
				rule_req->filter_spec_list_len;
				rule_req->filter_spec_ex_list_len;
		}
	} else {
		resp.rule_id_valid = 0;
		resp.rule_id_len = 0;
	}

	/* construct UL filter rules response to Modem*/
	for (i = 0; i < resp.rule_id_len; i++) {
		resp.rule_id[i] =
			rule_req->filter_spec_list[i].rule_id;
			rule_req->filter_spec_ex_list[i].rule_id;
	}

	rc = qmi_send_resp_from_cb(ipa3_svc_handle, curr_conn, req_h,
@@ -218,6 +233,32 @@ static int handle_ipa_config_req(void *req_h, void *req)
	return rc;
}

static int ipa3_handle_modem_init_cmplt_req(void *req_h, void *req)
{
	struct ipa_init_modem_driver_cmplt_req_msg_v01 *cmplt_req;
	struct ipa_init_modem_driver_cmplt_resp_msg_v01 resp;
	int rc;

	IPAWANDBG("Received QMI_IPA_INIT_MODEM_DRIVER_CMPLT_REQ_V01\n");
	BUG_ON(ipa3_qmi_modem_init_fin == false);
	cmplt_req = (struct ipa_init_modem_driver_cmplt_req_msg_v01 *)req;

	if (ipa3_modem_init_cmplt == false) {
		ipa3_modem_init_cmplt = true;
		ipa3_uc_load_notify();
	}

	memset(&resp, 0, sizeof(resp));
	resp.resp.result = IPA_QMI_RESULT_SUCCESS_V01;

	rc = qmi_send_resp_from_cb(ipa3_svc_handle, curr_conn, req_h,
			&ipa3_init_modem_driver_cmplt_resp_desc,
			&resp, sizeof(resp));

	IPAWANDBG("Sent QMI_IPA_INIT_MODEM_DRIVER_CMPLT_RESP_V01\n");
	return rc;
}

static int ipa3_a5_svc_connect_cb(struct qmi_handle *handle,
			       void *conn_h)
{
@@ -255,16 +296,20 @@ static int ipa3_a5_svc_req_desc_cb(unsigned int msg_id,

	case QMI_IPA_INSTALL_FILTER_RULE_REQ_V01:
		*req_desc = &ipa3_install_fltr_rule_req_desc;
		rc = sizeof(struct ipa3_install_fltr_rule_req_msg_v01);
		rc = sizeof(struct ipa_install_fltr_rule_req_msg_v01);
		break;
	case QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_V01:
		*req_desc = &ipa3_filter_installed_notif_req_desc;
		rc = sizeof(struct ipa3_fltr_installed_notif_req_msg_v01);
		rc = sizeof(struct ipa_fltr_installed_notif_req_msg_v01);
		break;
	case QMI_IPA_CONFIG_REQ_V01:
		*req_desc = &ipa3_config_req_desc;
		rc = sizeof(struct ipa_config_req_msg_v01);
		break;
	case QMI_IPA_INIT_MODEM_DRIVER_CMPLT_REQ_V01:
		*req_desc = &ipa3_init_modem_driver_cmplt_req_desc;
		rc = sizeof(struct ipa_init_modem_driver_cmplt_req_msg_v01);
		break;
	default:
		rc = -ENOTSUPP;
		break;
@@ -294,6 +339,9 @@ static int ipa3_a5_svc_req_cb(struct qmi_handle *handle, void *conn_h,
	case QMI_IPA_CONFIG_REQ_V01:
		rc = handle_ipa_config_req(req_h, req);
		break;
	case QMI_IPA_INIT_MODEM_DRIVER_CMPLT_REQ_V01:
		rc = ipa3_handle_modem_init_cmplt_req(req_h, req);
		break;
	default:
		rc = -ENOTSUPP;
		break;
@@ -386,13 +434,13 @@ static int ipa3_check_qmi_response(int rc,

static int ipa3_qmi_init_modem_send_sync_msg(void)
{
	struct ipa3_init_modem_driver_req_msg_v01 req;
	struct ipa_init_modem_driver_req_msg_v01 req;
	struct ipa_init_modem_driver_resp_msg_v01 resp;
	struct msg_desc req_desc, resp_desc;
	int rc;
	u16 smem_restr_bytes = ipa3_get_smem_restr_bytes();

	memset(&req, 0, sizeof(struct ipa3_init_modem_driver_req_msg_v01));
	memset(&req, 0, sizeof(struct ipa_init_modem_driver_req_msg_v01));
	memset(&resp, 0, sizeof(struct ipa_init_modem_driver_resp_msg_v01));

	req.platform_type_valid = true;
@@ -514,7 +562,7 @@ static int ipa3_qmi_init_modem_send_sync_msg(void)
	IPAWANDBG("v6_hash_filter_tbl_start_addr %d\n",
		req.v6_hash_filter_tbl_start_addr);

	req_desc.max_msg_len = QMI3_IPA_INIT_MODEM_DRIVER_REQ_MAX_MSG_LEN_V01;
	req_desc.max_msg_len = QMI_IPA_INIT_MODEM_DRIVER_REQ_MAX_MSG_LEN_V01;
	req_desc.msg_id = QMI_IPA_INIT_MODEM_DRIVER_REQ_V01;
	req_desc.ei_array = ipa3_init_modem_driver_req_msg_data_v01_ei;

@@ -533,9 +581,9 @@ static int ipa3_qmi_init_modem_send_sync_msg(void)
}

/* sending filter-install-request to modem*/
int ipa3_qmi_filter_request_send(struct ipa3_install_fltr_rule_req_msg_v01 *req)
int ipa3_qmi_filter_request_send(struct ipa_install_fltr_rule_req_msg_v01 *req)
{
	struct ipa3_install_fltr_rule_resp_msg_v01 resp;
	struct ipa_install_fltr_rule_resp_msg_v01 resp;
	struct msg_desc req_desc, resp_desc;
	int rc;

@@ -550,23 +598,23 @@ int ipa3_qmi_filter_request_send(struct ipa3_install_fltr_rule_req_msg_v01 *req)
	/* cache the qmi_filter_request */
	memcpy(&(ipa3_qmi_ctx->ipa_install_fltr_rule_req_msg_cache[
		ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg]),
			req, sizeof(struct ipa3_install_fltr_rule_req_msg_v01));
			req, sizeof(struct ipa_install_fltr_rule_req_msg_v01));
	ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg++;
	ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg %= 10;

	req_desc.max_msg_len = QMI3_IPA_INSTALL_FILTER_RULE_REQ_MAX_MSG_LEN_V01;
	req_desc.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_REQ_MAX_MSG_LEN_V01;
	req_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_REQ_V01;
	req_desc.ei_array = ipa3_install_fltr_rule_req_msg_data_v01_ei;

	memset(&resp, 0, sizeof(struct ipa3_install_fltr_rule_resp_msg_v01));
	memset(&resp, 0, sizeof(struct ipa_install_fltr_rule_resp_msg_v01));
	resp_desc.max_msg_len =
		QMI3_IPA_INSTALL_FILTER_RULE_RESP_MAX_MSG_LEN_V01;
		QMI_IPA_INSTALL_FILTER_RULE_RESP_MAX_MSG_LEN_V01;
	resp_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_RESP_V01;
	resp_desc.ei_array = ipa3_install_fltr_rule_resp_msg_data_v01_ei;

	rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc,
			req,
			sizeof(struct ipa3_install_fltr_rule_req_msg_v01),
			sizeof(struct ipa_install_fltr_rule_req_msg_v01),
			&resp_desc, &resp, sizeof(resp),
			QMI_SEND_REQ_TIMEOUT_MS);
	return ipa3_check_qmi_response(rc,
@@ -665,7 +713,7 @@ int ipa3_qmi_disable_force_clear_datapath_send(

/* sending filter-installed-notify-request to modem*/
int ipa3_qmi_filter_notify_send(
		struct ipa3_fltr_installed_notif_req_msg_v01 *req)
		struct ipa_fltr_installed_notif_req_msg_v01 *req)
{
	struct ipa_fltr_installed_notif_resp_msg_v01 resp;
	struct msg_desc req_desc, resp_desc;
@@ -681,12 +729,12 @@ int ipa3_qmi_filter_notify_send(
	/* cache the qmi_filter_request */
	memcpy(&(ipa3_qmi_ctx->ipa_fltr_installed_notif_req_msg_cache[
		ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg]),
		req, sizeof(struct ipa3_fltr_installed_notif_req_msg_v01));
		req, sizeof(struct ipa_fltr_installed_notif_req_msg_v01));
	ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg++;
	ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg %= 10;

	req_desc.max_msg_len =
	QMI3_IPA_FILTER_INSTALLED_NOTIF_REQ_MAX_MSG_LEN_V01;
	QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_MAX_MSG_LEN_V01;
	req_desc.msg_id = QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_V01;
	req_desc.ei_array = ipa3_fltr_installed_notif_req_msg_data_v01_ei;

@@ -699,7 +747,7 @@ int ipa3_qmi_filter_notify_send(
	rc = qmi_send_req_wait(ipa_q6_clnt,
			&req_desc,
			req,
			sizeof(struct ipa3_fltr_installed_notif_req_msg_v01),
			sizeof(struct ipa_fltr_installed_notif_req_msg_v01),
			&resp_desc, &resp, sizeof(resp),
			QMI_SEND_REQ_TIMEOUT_MS);
	return ipa3_check_qmi_response(rc,
+10 −8
Original line number Diff line number Diff line
@@ -41,10 +41,10 @@ struct ipa3_qmi_context {
struct ipa_ioc_ext_intf_prop q6_ul_filter_rule[MAX_NUM_Q6_RULE];
u32 q6_ul_filter_rule_hdl[MAX_NUM_Q6_RULE];
int num_ipa_install_fltr_rule_req_msg;
struct ipa3_install_fltr_rule_req_msg_v01
struct ipa_install_fltr_rule_req_msg_v01
		ipa_install_fltr_rule_req_msg_cache[MAX_NUM_QMI_RULE_CACHE];
int num_ipa_fltr_installed_notif_req_msg;
struct ipa3_fltr_installed_notif_req_msg_v01
struct ipa_fltr_installed_notif_req_msg_v01
		ipa_fltr_installed_notif_req_msg_cache[MAX_NUM_QMI_RULE_CACHE];
bool modem_cfg_emb_pipe_flt;
};
@@ -83,6 +83,8 @@ extern struct elem_info ipa3_set_data_usage_quota_resp_msg_data_v01_ei[];
extern struct elem_info ipa3_data_usage_quota_reached_ind_msg_data_v01_ei[];
extern struct elem_info ipa3_stop_data_usage_quota_req_msg_data_v01_ei[];
extern struct elem_info ipa3_stop_data_usage_quota_resp_msg_data_v01_ei[];
extern struct elem_info ipa3_init_modem_driver_cmplt_req_msg_data_v01_ei[];
extern struct elem_info ipa3_init_modem_driver_cmplt_resp_msg_data_v01_ei[];

/**
 * struct ipa3_rmnet_context - IPA rmnet context
@@ -106,10 +108,10 @@ void ipa3_qmi_service_exit(void);

/* sending filter-install-request to modem*/
int ipa3_qmi_filter_request_send(
	struct ipa3_install_fltr_rule_req_msg_v01 *req);
	struct ipa_install_fltr_rule_req_msg_v01 *req);

/* sending filter-installed-notify-request to modem*/
int ipa3_qmi_filter_notify_send(struct ipa3_fltr_installed_notif_req_msg_v01
int ipa3_qmi_filter_notify_send(struct ipa_fltr_installed_notif_req_msg_v01
		*req);

/* voting for bus BW to ipa_rm*/
@@ -121,7 +123,7 @@ int ipa3_qmi_enable_force_clear_datapath_send(
int ipa3_qmi_disable_force_clear_datapath_send(
	struct ipa_disable_force_clear_datapath_req_msg_v01 *req);

int ipa3_copy_ul_filter_rule_to_ipa(struct ipa3_install_fltr_rule_req_msg_v01
int ipa3_copy_ul_filter_rule_to_ipa(struct ipa_install_fltr_rule_req_msg_v01
	*rule_req);

int ipa3_wwan_update_mux_channel_prop(void);
@@ -167,14 +169,14 @@ static inline void ipa3_qmi_service_exit(void) { }

/* sending filter-install-request to modem*/
static inline int ipa3_qmi_filter_request_send(
	struct ipa3_install_fltr_rule_req_msg_v01 *req)
	struct ipa_install_fltr_rule_req_msg_v01 *req)
{
	return -EPERM;
}

/* sending filter-installed-notify-request to modem*/
static inline int ipa3_qmi_filter_notify_send(
	struct ipa3_fltr_installed_notif_req_msg_v01 *req)
	struct ipa_fltr_installed_notif_req_msg_v01 *req)
{
	return -EPERM;
}
@@ -192,7 +194,7 @@ static inline int ipa3_qmi_disable_force_clear_datapath_send(
}

static inline int ipa3_copy_ul_filter_rule_to_ipa(
	struct ipa3_install_fltr_rule_req_msg_v01 *rule_req)
	struct ipa_install_fltr_rule_req_msg_v01 *rule_req)
{
	return -EPERM;
}
+432 −71

File changed.

Preview size limit exceeded, changes collapsed.

+72 −56
Original line number Diff line number Diff line
@@ -384,13 +384,13 @@ static void ipa3_del_dflt_wan_rt_tables(void)
	kfree(rt_rule);
}

int ipa3_copy_ul_filter_rule_to_ipa(struct ipa3_install_fltr_rule_req_msg_v01
int ipa3_copy_ul_filter_rule_to_ipa(struct ipa_install_fltr_rule_req_msg_v01
		*rule_req)
{
	int i, j;

	if (rule_req->filter_spec_list_valid == true) {
		ipa3_num_q6_rule = rule_req->filter_spec_list_len;
	if (rule_req->filter_spec_ex_list_valid == true) {
		ipa3_num_q6_rule = rule_req->filter_spec_ex_list_len;
		IPAWANDBG("Received (%d) install_flt_req\n", ipa3_num_q6_rule);
	} else {
		ipa3_num_q6_rule = 0;
@@ -409,150 +409,157 @@ int ipa3_copy_ul_filter_rule_to_ipa(struct ipa3_install_fltr_rule_req_msg_v01
			goto failure;
		}
		ipa3_qmi_ctx->q6_ul_filter_rule[i].ip =
			rule_req->filter_spec_list[i].ip_type;
			rule_req->filter_spec_ex_list[i].ip_type;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].action =
			rule_req->filter_spec_list[i].filter_action;
		if (rule_req->filter_spec_list[i].is_routing_table_index_valid
			== true)
			rule_req->filter_spec_ex_list[i].filter_action;
		if (rule_req->filter_spec_ex_list[i].
			is_routing_table_index_valid == true)
			ipa3_qmi_ctx->q6_ul_filter_rule[i].rt_tbl_idx =
			rule_req->filter_spec_list[i].route_table_index;
		if (rule_req->filter_spec_list[i].is_mux_id_valid == true)
			rule_req->filter_spec_ex_list[i].route_table_index;
		if (rule_req->filter_spec_ex_list[i].is_mux_id_valid == true)
			ipa3_qmi_ctx->q6_ul_filter_rule[i].mux_id =
			rule_req->filter_spec_list[i].mux_id;
			rule_req->filter_spec_ex_list[i].mux_id;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].rule_id =
			rule_req->filter_spec_list[i].rule_id;
			rule_req->filter_spec_ex_list[i].rule_id;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].is_rule_hashable =
			rule_req->filter_spec_list[i].is_rule_hashable;
			rule_req->filter_spec_ex_list[i].is_rule_hashable;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.rule_eq_bitmap =
			rule_req->filter_spec_list[i].filter_rule.
			rule_req->filter_spec_ex_list[i].filter_rule.
			rule_eq_bitmap;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.tos_eq_present =
			rule_req->filter_spec_list[i].filter_rule.
			rule_req->filter_spec_ex_list[i].filter_rule.
			tos_eq_present;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.tos_eq =
			rule_req->filter_spec_list[i].filter_rule.tos_eq;
			rule_req->filter_spec_ex_list[i].filter_rule.tos_eq;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			protocol_eq_present = rule_req->filter_spec_list[i].
			protocol_eq_present = rule_req->filter_spec_ex_list[i].
			filter_rule.protocol_eq_present;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.protocol_eq =
			rule_req->filter_spec_list[i].filter_rule.
			rule_req->filter_spec_ex_list[i].filter_rule.
			protocol_eq;

		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			num_ihl_offset_range_16 = rule_req->filter_spec_list[i].
			num_ihl_offset_range_16 =
			rule_req->filter_spec_ex_list[i].
			filter_rule.num_ihl_offset_range_16;
		for (j = 0; j < ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			num_ihl_offset_range_16; j++) {
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			ihl_offset_range_16[j].offset = rule_req->
			filter_spec_list[i].filter_rule.
			filter_spec_ex_list[i].filter_rule.
			ihl_offset_range_16[j].offset;
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			ihl_offset_range_16[j].range_low = rule_req->
			filter_spec_list[i].filter_rule.
			filter_spec_ex_list[i].filter_rule.
			ihl_offset_range_16[j].range_low;
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			ihl_offset_range_16[j].range_high = rule_req->
			filter_spec_list[i].filter_rule.
			filter_spec_ex_list[i].filter_rule.
			ihl_offset_range_16[j].range_high;
		}
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.num_offset_meq_32 =
			rule_req->filter_spec_list[i].filter_rule.
			rule_req->filter_spec_ex_list[i].filter_rule.
			num_offset_meq_32;
		for (j = 0; j < ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
				num_offset_meq_32; j++) {
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			offset_meq_32[j].offset = rule_req->filter_spec_list[i].
			offset_meq_32[j].offset =
			rule_req->filter_spec_ex_list[i].
			filter_rule.offset_meq_32[j].offset;
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			offset_meq_32[j].mask = rule_req->filter_spec_list[i].
			offset_meq_32[j].mask =
			rule_req->filter_spec_ex_list[i].
			filter_rule.offset_meq_32[j].mask;
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			offset_meq_32[j].value = rule_req->filter_spec_list[i].
			offset_meq_32[j].value =
			rule_req->filter_spec_ex_list[i].
			filter_rule.offset_meq_32[j].value;
		}

		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.tc_eq_present =
			rule_req->filter_spec_list[i].filter_rule.tc_eq_present;
			rule_req->filter_spec_ex_list[i].
			filter_rule.tc_eq_present;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.tc_eq =
			rule_req->filter_spec_list[i].filter_rule.tc_eq;
			rule_req->filter_spec_ex_list[i].filter_rule.tc_eq;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.fl_eq_present =
			rule_req->filter_spec_list[i].filter_rule.
			rule_req->filter_spec_ex_list[i].filter_rule.
			flow_eq_present;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.fl_eq =
			rule_req->filter_spec_list[i].filter_rule.flow_eq;
			rule_req->filter_spec_ex_list[i].filter_rule.flow_eq;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
		ihl_offset_eq_16_present = rule_req->filter_spec_list[i].
		ihl_offset_eq_16_present = rule_req->filter_spec_ex_list[i].
		filter_rule.ihl_offset_eq_16_present;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
		ihl_offset_eq_16.offset = rule_req->filter_spec_list[i].
		ihl_offset_eq_16.offset = rule_req->filter_spec_ex_list[i].
		filter_rule.ihl_offset_eq_16.offset;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
		ihl_offset_eq_16.value = rule_req->filter_spec_list[i].
		ihl_offset_eq_16.value = rule_req->filter_spec_ex_list[i].
		filter_rule.ihl_offset_eq_16.value;

		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
		ihl_offset_eq_32_present = rule_req->filter_spec_list[i].
		ihl_offset_eq_32_present = rule_req->filter_spec_ex_list[i].
		filter_rule.ihl_offset_eq_32_present;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
		ihl_offset_eq_32.offset = rule_req->filter_spec_list[i].
		ihl_offset_eq_32.offset = rule_req->filter_spec_ex_list[i].
		filter_rule.ihl_offset_eq_32.offset;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
		ihl_offset_eq_32.value = rule_req->filter_spec_list[i].
		ihl_offset_eq_32.value = rule_req->filter_spec_ex_list[i].
		filter_rule.ihl_offset_eq_32.value;

		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
		num_ihl_offset_meq_32 = rule_req->filter_spec_list[i].
		num_ihl_offset_meq_32 = rule_req->filter_spec_ex_list[i].
		filter_rule.num_ihl_offset_meq_32;
		for (j = 0; j < ipa3_qmi_ctx->q6_ul_filter_rule[i].
			eq_attrib.num_ihl_offset_meq_32; j++) {
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
				ihl_offset_meq_32[j].offset = rule_req->
				filter_spec_list[i].filter_rule.
				filter_spec_ex_list[i].filter_rule.
				ihl_offset_meq_32[j].offset;
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
				ihl_offset_meq_32[j].mask = rule_req->
				filter_spec_list[i].filter_rule.
				filter_spec_ex_list[i].filter_rule.
				ihl_offset_meq_32[j].mask;
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
				ihl_offset_meq_32[j].value = rule_req->
				filter_spec_list[i].filter_rule.
				filter_spec_ex_list[i].filter_rule.
				ihl_offset_meq_32[j].value;
		}
		ipa3_qmi_ctx->
			q6_ul_filter_rule[i].eq_attrib.num_offset_meq_128 =
			rule_req->filter_spec_list[i].filter_rule.
			rule_req->filter_spec_ex_list[i].filter_rule.
			num_offset_meq_128;
		for (j = 0; j < ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			num_offset_meq_128; j++) {
			ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
				offset_meq_128[j].offset = rule_req->
				filter_spec_list[i].filter_rule.
				filter_spec_ex_list[i].filter_rule.
				offset_meq_128[j].offset;
			memcpy(ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
					offset_meq_128[j].mask,
					rule_req->filter_spec_list[i].
					rule_req->filter_spec_ex_list[i].
					filter_rule.offset_meq_128[j].mask, 16);
			memcpy(ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
					offset_meq_128[j].value, rule_req->
					filter_spec_list[i].filter_rule.
					filter_spec_ex_list[i].filter_rule.
					offset_meq_128[j].value, 16);
		}

		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			metadata_meq32_present = rule_req->filter_spec_list[i].
			metadata_meq32_present =
				rule_req->filter_spec_ex_list[i].
				filter_rule.metadata_meq32_present;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			metadata_meq32.offset = rule_req->filter_spec_list[i].
			metadata_meq32.offset =
			rule_req->filter_spec_ex_list[i].
			filter_rule.metadata_meq32.offset;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			metadata_meq32.mask = rule_req->filter_spec_list[i].
			metadata_meq32.mask = rule_req->filter_spec_ex_list[i].
			filter_rule.metadata_meq32.mask;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.metadata_meq32.
			value = rule_req->filter_spec_list[i].filter_rule.
			value = rule_req->filter_spec_ex_list[i].filter_rule.
			metadata_meq32.value;
		ipa3_qmi_ctx->q6_ul_filter_rule[i].eq_attrib.
			ipv4_frag_eq_present = rule_req->filter_spec_list[i].
			ipv4_frag_eq_present = rule_req->filter_spec_ex_list[i].
			filter_rule.ipv4_frag_eq_present;
	}

@@ -601,7 +608,7 @@ static int ipa3_wwan_add_ul_flt_rule_to_ipa(void)
	int i, retval = 0;
	struct ipa_ioc_add_flt_rule *param;
	struct ipa_flt_rule_add flt_rule_entry;
	struct ipa3_fltr_installed_notif_req_msg_v01 req;
	struct ipa_fltr_installed_notif_req_msg_v01 *req;

	pyld_sz = sizeof(struct ipa_ioc_add_flt_rule) +
	   sizeof(struct ipa_flt_rule_add);
@@ -609,6 +616,14 @@ static int ipa3_wwan_add_ul_flt_rule_to_ipa(void)
	if (!param)
		return -ENOMEM;

	req = (struct ipa_fltr_installed_notif_req_msg_v01 *)
		kzalloc(sizeof(struct ipa_fltr_installed_notif_req_msg_v01),
			GFP_KERNEL);
	if (!req) {
		kfree(param);
		return -ENOMEM;
	}

	param->commit = 1;
	param->ep = IPA_CLIENT_APPS_LAN_WAN_PROD;
	param->global = false;
@@ -647,17 +662,17 @@ static int ipa3_wwan_add_ul_flt_rule_to_ipa(void)
		}
	}

	/* send ipa3_fltr_installed_notif_req_msg_v01 to Q6*/
	memset(&req, 0, sizeof(struct ipa3_fltr_installed_notif_req_msg_v01));
	req.source_pipe_index =
	/* send ipa_fltr_installed_notif_req_msg_v01 to Q6*/
	req->source_pipe_index =
		ipa3_get_ep_mapping(IPA_CLIENT_APPS_LAN_WAN_PROD);
	req.install_status = QMI_RESULT_SUCCESS_V01;
	req.rule_id_len = ipa3_num_q6_rule;
	req->install_status = QMI_RESULT_SUCCESS_V01;
	req->rule_id_valid = 1;
	req->rule_id_len = ipa3_num_q6_rule;
	for (i = 0; i < ipa3_num_q6_rule; i++) {
		req.rule_id[i] =
		req->rule_id[i] =
			ipa3_qmi_ctx->q6_ul_filter_rule[i].rule_id;
	}
	if (ipa3_qmi_filter_notify_send(&req)) {
	if (ipa3_qmi_filter_notify_send(req)) {
		IPAWANDBG("add filter rule index on A7-RX failed\n");
		retval = -EFAULT;
	}
@@ -665,6 +680,7 @@ static int ipa3_wwan_add_ul_flt_rule_to_ipa(void)
	IPAWANDBG("add (%d) filter rule index on A7-RX\n",
			ipa3_old_num_q6_rule);
	kfree(param);
	kfree(req);
	return retval;
}

Loading