msm: ipa3: Initiate filter reservation during filter addition

Trigger filter reservation only when the first request to add
a filter with tuple info is received from C2 component.

Change-Id: I90f105bcb9bde83d510367c92aa30fe334f75a08
Signed-off-by: Prasad Arepalli <quic_parepall@quicinc.com>
This commit is contained in:
Prasad Arepalli
2024-06-27 17:13:41 +05:30
committed by Jagadeesh Ponduru
parent 74fb08d85c
commit d1483b79d1
5 changed files with 83 additions and 85 deletions

View File

@@ -59,10 +59,7 @@
* No. of filters reserving at wlan for IPA-XR usecase. * No. of filters reserving at wlan for IPA-XR usecase.
*/ */
#define NO_OF_FILTERS 2 #define NO_OF_FILTERS 2
#define IPA_WDI_FLT_RSRV_TIMEOUT_MS 200
static void ipa_xr_wdi_opt_dpath_rsrv_filter_wq_handler(struct work_struct *work);
static struct workqueue_struct *wlan_flt_rsrv_wq = NULL;
static DECLARE_DELAYED_WORK(wlan_flt_rsrv_handle, ipa_xr_wdi_opt_dpath_rsrv_filter_wq_handler);
struct ipa_wdi_intf_info { struct ipa_wdi_intf_info {
char netdev_name[IPA_RESOURCE_NAME_MAX]; char netdev_name[IPA_RESOURCE_NAME_MAX];
@@ -107,7 +104,7 @@ struct ipa_wdi_opt_dpath_add_flt_handle {
uint64_t filter_handle; uint64_t filter_handle;
}; };
struct ipa_wdi_opt_dpath_add_flt_handle add_flt_hndl[4]; struct ipa_wdi_opt_dpath_add_flt_handle add_flt_hndl[MAX_STREAMS];
/** /**
* opt_dpath_info contains fn callbacks which are set by WLAN context and * opt_dpath_info contains fn callbacks which are set by WLAN context and
@@ -874,23 +871,6 @@ int ipa_wdi_enable_pipes_per_inst(ipa_wdi_hdl_t hdl)
} }
} }
if (ipa3_ctx->platform_type == IPA_PLAT_TYPE_XR) {
if (wlan_flt_rsrv_wq == NULL) {
wlan_flt_rsrv_wq = create_singlethread_workqueue("wlan_flt_rsrv_wq");
if (!wlan_flt_rsrv_wq) {
IPA_WDI_ERR("failed to create wq\n");
return 0;
}
ret = queue_delayed_work(wlan_flt_rsrv_wq, &wlan_flt_rsrv_handle,
msecs_to_jiffies(QUEUE_DELAY_TIME));
if (!ret) {
IPA_WDI_ERR("failed to queue delayed wq\n");
return 0;
}
}
}
return 0; return 0;
} }
EXPORT_SYMBOL(ipa_wdi_enable_pipes_per_inst); EXPORT_SYMBOL(ipa_wdi_enable_pipes_per_inst);
@@ -1123,6 +1103,7 @@ int ipa_wdi_opt_dpath_notify_flt_rsvd_per_inst
(ipa_wdi_hdl_t hdl, bool is_success) (ipa_wdi_hdl_t hdl, bool is_success)
{ {
int ret = 0; int ret = 0;
int flt_rsv_status = 0;
struct ipa_wlan_opt_dp_rsrv_filter_complt_ind_msg_v01 ind; struct ipa_wlan_opt_dp_rsrv_filter_complt_ind_msg_v01 ind;
if (hdl < 0 || hdl >= IPA_WDI_INST_MAX) { if (hdl < 0 || hdl >= IPA_WDI_INST_MAX) {
@@ -1144,7 +1125,10 @@ int ipa_wdi_opt_dpath_notify_flt_rsvd_per_inst
} }
if (ipa3_ctx->platform_type == IPA_PLAT_TYPE_XR) { if (ipa3_ctx->platform_type == IPA_PLAT_TYPE_XR) {
ipa3_ctx->ipa_xr_wdi_flt_rsv_status = is_success; IPA_WDI_DBG("Received wlan flt rsv status %d\n", is_success);
flt_rsv_status = is_success ? 1 : 0;
atomic_set(&ipa3_ctx->ipa_xr_wdi_flt_rsv_status, flt_rsv_status);
complete(&ipa3_ctx->ipa_xr_wdi_flt_rsrv_success);
return ret; return ret;
} }
@@ -1169,6 +1153,7 @@ int ipa_wdi_opt_dpath_notify_flt_rlsd_per_inst
(ipa_wdi_hdl_t hdl, bool is_success) (ipa_wdi_hdl_t hdl, bool is_success)
{ {
int ret = 0; int ret = 0;
int flt_rsv_status = 0;
struct ipa_wlan_opt_dp_remove_all_filter_complt_ind_msg_v01 ind; struct ipa_wlan_opt_dp_remove_all_filter_complt_ind_msg_v01 ind;
if (hdl < 0 || hdl >= IPA_WDI_INST_MAX) { if (hdl < 0 || hdl >= IPA_WDI_INST_MAX) {
@@ -1182,8 +1167,13 @@ int ipa_wdi_opt_dpath_notify_flt_rlsd_per_inst
} }
ret = ipa_pm_deferred_deactivate(ipa_wdi_ctx_list[0]->ipa_pm_hdl); ret = ipa_pm_deferred_deactivate(ipa_wdi_ctx_list[0]->ipa_pm_hdl);
if (ipa3_ctx->platform_type == IPA_PLAT_TYPE_XR)
if (ipa3_ctx->platform_type == IPA_PLAT_TYPE_XR) {
IPA_WDI_DBG("Received wlan flt rlsd status %d\n", is_success);
flt_rsv_status = is_success ? 0 : 1;
atomic_set(&ipa3_ctx->ipa_xr_wdi_flt_rsv_status, flt_rsv_status);
return ret; return ret;
}
memset(&ind, 0, sizeof(ind)); memset(&ind, 0, sizeof(ind));
ind.filter_removal_all_status.result = ind.filter_removal_all_status.result =
@@ -1476,6 +1466,7 @@ int ipa_xr_wdi_opt_dpath_rsrv_filter_req(void)
{ {
int ret = 0; int ret = 0;
struct ipa_wdi_opt_dpath_flt_rsrv_cb_params rsrv_filter_req; struct ipa_wdi_opt_dpath_flt_rsrv_cb_params rsrv_filter_req;
int rsrv_completed;
memset(&rsrv_filter_req, 0, sizeof(struct ipa_wdi_opt_dpath_flt_rsrv_cb_params)); memset(&rsrv_filter_req, 0, sizeof(struct ipa_wdi_opt_dpath_flt_rsrv_cb_params));
if (!atomic_read(&opt_dpath_info[0].is_xr_opt_dp_cb_registered)) { if (!atomic_read(&opt_dpath_info[0].is_xr_opt_dp_cb_registered)) {
@@ -1494,6 +1485,7 @@ int ipa_xr_wdi_opt_dpath_rsrv_filter_req(void)
return -EFAULT; return -EFAULT;
} }
init_completion(&ipa3_ctx->ipa_xr_wdi_flt_rsrv_success);
rsrv_filter_req.num_filters = NO_OF_FILTERS; rsrv_filter_req.num_filters = NO_OF_FILTERS;
ret = opt_dpath_info[0].flt_rsrv_cb( ret = opt_dpath_info[0].flt_rsrv_cb(
opt_dpath_info[0].priv, &rsrv_filter_req); opt_dpath_info[0].priv, &rsrv_filter_req);
@@ -1505,6 +1497,12 @@ int ipa_xr_wdi_opt_dpath_rsrv_filter_req(void)
} }
IPA_WDI_DBG("reserved filter callbacks called.\n"); IPA_WDI_DBG("reserved filter callbacks called.\n");
rsrv_completed = wait_for_completion_timeout(&ipa3_ctx->ipa_xr_wdi_flt_rsrv_success,
msecs_to_jiffies(IPA_WDI_FLT_RSRV_TIMEOUT_MS));
if (!rsrv_completed) {
IPADBG("Timed out waiting for filter reservation notification from WLAN\n");
return -EPERM;
}
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(ipa_xr_wdi_opt_dpath_rsrv_filter_req); EXPORT_SYMBOL_GPL(ipa_xr_wdi_opt_dpath_rsrv_filter_req);
@@ -1532,8 +1530,9 @@ int ipa_xr_wdi_opt_dpath_add_filter_req(struct ipa_wdi_opt_dpath_flt_add_cb_para
ret = ret =
opt_dpath_info[0].flt_add_cb opt_dpath_info[0].flt_add_cb
(opt_dpath_info[0].priv, req); (opt_dpath_info[0].priv, req);
add_flt_hndl[stream_id].filter_handle = req->flt_info[0].out_hdl; IPA_WDI_DBG("Add filter callbacks called for stream id %d\n", stream_id);
IPA_WDI_DBG("add filter callbacks called, stream id %d\n", stream_id); if (!ret)
add_flt_hndl[stream_id].filter_handle = req->flt_info[0].out_hdl;
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(ipa_xr_wdi_opt_dpath_add_filter_req); EXPORT_SYMBOL_GPL(ipa_xr_wdi_opt_dpath_add_filter_req);
@@ -1563,7 +1562,9 @@ int ipa_xr_wdi_opt_dpath_remove_filter_req(u32 stream_id)
ret = opt_dpath_info[0].flt_rem_cb ret = opt_dpath_info[0].flt_rem_cb
(opt_dpath_info[0].priv, &flt_rem_req); (opt_dpath_info[0].priv, &flt_rem_req);
IPA_WDI_DBG("remove filter callbacks called, stream id %d\n", stream_id); IPA_WDI_DBG("Remove filter callbacks called for stream id %d\n", stream_id);
if (!ret)
add_flt_hndl[stream_id].filter_handle = 0;
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(ipa_xr_wdi_opt_dpath_remove_filter_req); EXPORT_SYMBOL_GPL(ipa_xr_wdi_opt_dpath_remove_filter_req);
@@ -1606,16 +1607,6 @@ int ipa_xr_wdi_opt_dpath_remove_all_filter_req(void)
} }
EXPORT_SYMBOL_GPL(ipa_xr_wdi_opt_dpath_remove_all_filter_req); EXPORT_SYMBOL_GPL(ipa_xr_wdi_opt_dpath_remove_all_filter_req);
static void ipa_xr_wdi_opt_dpath_rsrv_filter_wq_handler(struct work_struct *work)
{
int res = 0;
res = ipa_xr_wdi_opt_dpath_rsrv_filter_req();
if (res)
IPAERR("Failed to reserve the filters in wlan\n");
}
/** /**
* clean up WDI IPA offload data path * clean up WDI IPA offload data path
* *
@@ -1773,11 +1764,6 @@ int ipa_wdi_disconn_pipes_per_inst(ipa_wdi_hdl_t hdl)
return -EPERM; return -EPERM;
} }
if (wlan_flt_rsrv_wq) {
destroy_workqueue(wlan_flt_rsrv_wq);
wlan_flt_rsrv_wq = NULL;
}
if (ipa_wdi_ctx_list[hdl]->wdi_version >= IPA_WDI_1 && if (ipa_wdi_ctx_list[hdl]->wdi_version >= IPA_WDI_1 &&
ipa_wdi_ctx_list[hdl]->wdi_version < IPA_WDI_3 && ipa_wdi_ctx_list[hdl]->wdi_version < IPA_WDI_3 &&
hdl > 0) { hdl > 0) {
@@ -1919,6 +1905,8 @@ int ipa_wdi_disable_pipes_per_inst(ipa_wdi_hdl_t hdl)
return -EFAULT; return -EFAULT;
} }
if (ipa3_ctx->platform_type == IPA_PLAT_TYPE_XR)
atomic_set(&ipa3_ctx->ipa_xr_wdi_flt_rsv_status, 0);
return 0; return 0;
} }
EXPORT_SYMBOL(ipa_wdi_disable_pipes_per_inst); EXPORT_SYMBOL(ipa_wdi_disable_pipes_per_inst);

View File

@@ -579,7 +579,7 @@ enum {
/* XR-IPA uC no. of temp buffers */ /* XR-IPA uC no. of temp buffers */
#define NO_OF_BUFFS 0x04 #define NO_OF_BUFFS 0x04
/* Max number of RTP streams supported */ /* Max number of RTP streams supported */
#define MAX_STREAMS 4 #define MAX_STREAMS 2
/* miscellaneous for rmnet_ipa and qmi_service */ /* miscellaneous for rmnet_ipa and qmi_service */
enum ipa_type_mode { enum ipa_type_mode {
@@ -2439,7 +2439,8 @@ struct ipa3_context {
bool ipa_wdi2_over_gsi; bool ipa_wdi2_over_gsi;
bool ipa_wdi3_over_gsi; bool ipa_wdi3_over_gsi;
bool ipa_wdi_opt_dpath; bool ipa_wdi_opt_dpath;
bool ipa_xr_wdi_flt_rsv_status; atomic_t ipa_xr_wdi_flt_rsv_status;
struct completion ipa_xr_wdi_flt_rsrv_success;
u8 rtp_stream_id_cnt; u8 rtp_stream_id_cnt;
u32 rtp_proc_hdls[MAX_STREAMS]; u32 rtp_proc_hdls[MAX_STREAMS];
u32 rtp_rt4_tbl_hdls[MAX_STREAMS]; u32 rtp_rt4_tbl_hdls[MAX_STREAMS];

View File

@@ -24,7 +24,7 @@
.flags = 0, \ .flags = 0, \
} }
static u8 si[MAX_STREAMS]; static u8 ipa_rtp_active_streams[MAX_STREAMS];
static struct nla_policy ipa_rtp_genl_attr_policy[IPA_RTP_GENL_ATTR_MAX + 1] = { static struct nla_policy ipa_rtp_genl_attr_policy[IPA_RTP_GENL_ATTR_MAX + 1] = {
[IPA_RTP_GENL_ATTR_STR] = { .type = NLA_NUL_STRING, .len = IPA_RTP_GENL_MAX_STR_LEN }, [IPA_RTP_GENL_ATTR_STR] = { .type = NLA_NUL_STRING, .len = IPA_RTP_GENL_MAX_STR_LEN },
@@ -119,7 +119,6 @@ static int ipa3_rtp_del_flt_rule(u32 stream_id)
struct ipa3_ep_context *ep; struct ipa3_ep_context *ep;
struct ipa_ioc_del_flt_rule *rtp_del_flt_rule = NULL; struct ipa_ioc_del_flt_rule *rtp_del_flt_rule = NULL;
IPADBG("Deleting rtp filter rules of stream_id: %u\n", stream_id);
rtp_del_flt_rule = kzalloc(sizeof(*rtp_del_flt_rule) + rtp_del_flt_rule = kzalloc(sizeof(*rtp_del_flt_rule) +
1 * sizeof(struct ipa_flt_rule_del), GFP_KERNEL); 1 * sizeof(struct ipa_flt_rule_del), GFP_KERNEL);
if (!rtp_del_flt_rule) { if (!rtp_del_flt_rule) {
@@ -130,7 +129,10 @@ static int ipa3_rtp_del_flt_rule(u32 stream_id)
ipa_ep_idx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_PROD); ipa_ep_idx = ipa_get_ep_mapping(IPA_CLIENT_WLAN2_PROD);
ep = &ipa3_ctx->ep[ipa_ep_idx]; ep = &ipa3_ctx->ep[ipa_ep_idx];
if (ep->rtp_flt4_rule_hdls[stream_id]) {
/* check whether filter rule hdl is deleted or not */
if (ep->rtp_flt4_rule_hdls[stream_id] != -1) {
IPADBG("Deleting rtp filter rules of stream_id: %u\n", stream_id);
rtp_del_flt_rule->commit = 1; rtp_del_flt_rule->commit = 1;
rtp_del_flt_rule->ip = 0; rtp_del_flt_rule->ip = 0;
rtp_del_flt_rule->num_hdls = 1; rtp_del_flt_rule->num_hdls = 1;
@@ -141,7 +143,7 @@ static int ipa3_rtp_del_flt_rule(u32 stream_id)
rc = -EPERM; rc = -EPERM;
return rc; return rc;
} }
ep->rtp_flt4_rule_hdls[stream_id] = 0; ep->rtp_flt4_rule_hdls[stream_id] = -1;
} }
kfree(rtp_del_flt_rule); kfree(rtp_del_flt_rule);
@@ -153,7 +155,6 @@ static int ipa3_rtp_del_rt_rule(u32 stream_id)
int rc = 0; int rc = 0;
struct ipa_ioc_del_rt_rule *rtp_del_rt_rule = NULL; struct ipa_ioc_del_rt_rule *rtp_del_rt_rule = NULL;
IPADBG("Deleting rtp route rules of stream_id: %u\n", stream_id);
rtp_del_rt_rule = kzalloc(sizeof(*rtp_del_rt_rule) + rtp_del_rt_rule = kzalloc(sizeof(*rtp_del_rt_rule) +
1 * sizeof(struct ipa_rt_rule_del), GFP_KERNEL); 1 * sizeof(struct ipa_rt_rule_del), GFP_KERNEL);
if (!rtp_del_rt_rule) { if (!rtp_del_rt_rule) {
@@ -162,7 +163,9 @@ static int ipa3_rtp_del_rt_rule(u32 stream_id)
return rc; return rc;
} }
if (ipa3_ctx->rtp_rt4_rule_hdls[stream_id]) { /* check whether route rule hdl is deleted or not */
if (ipa3_ctx->rtp_rt4_rule_hdls[stream_id] != -1) {
IPADBG("Deleting rtp route rules of stream_id: %u\n", stream_id);
rtp_del_rt_rule->commit = 1; rtp_del_rt_rule->commit = 1;
rtp_del_rt_rule->ip = 0; rtp_del_rt_rule->ip = 0;
rtp_del_rt_rule->num_hdls = 1; rtp_del_rt_rule->num_hdls = 1;
@@ -187,7 +190,6 @@ static int ipa3_rtp_del_hdr_proc_ctx(u32 stream_id)
struct ipa_ioc_del_hdr_proc_ctx *rtp_del_proc_ctx = NULL; struct ipa_ioc_del_hdr_proc_ctx *rtp_del_proc_ctx = NULL;
struct ipa_hdr_proc_ctx_del *rtp_del_proc_ctx_entry = NULL; struct ipa_hdr_proc_ctx_del *rtp_del_proc_ctx_entry = NULL;
IPADBG("Deleting rtp hdr proc ctx of stream_id: %u\n", stream_id);
buf_size = (sizeof(struct ipa_ioc_del_hdr_proc_ctx) + buf_size = (sizeof(struct ipa_ioc_del_hdr_proc_ctx) +
(sizeof(struct ipa_hdr_proc_ctx_del))); (sizeof(struct ipa_hdr_proc_ctx_del)));
rtp_del_proc_ctx = kzalloc(buf_size, GFP_KERNEL); rtp_del_proc_ctx = kzalloc(buf_size, GFP_KERNEL);
@@ -197,7 +199,9 @@ static int ipa3_rtp_del_hdr_proc_ctx(u32 stream_id)
return rc; return rc;
} }
if (ipa3_ctx->rtp_proc_hdls[stream_id]) { /* check whether hdr proc ctx hdl is deleted or not */
if (ipa3_ctx->rtp_proc_hdls[stream_id] != -1) {
IPADBG("Deleting rtp hdr proc ctx of stream_id: %u\n", stream_id);
rtp_del_proc_ctx_entry = &(rtp_del_proc_ctx->hdl[0]); rtp_del_proc_ctx_entry = &(rtp_del_proc_ctx->hdl[0]);
rtp_del_proc_ctx->commit = 1; rtp_del_proc_ctx->commit = 1;
rtp_del_proc_ctx->num_hdls = 1; rtp_del_proc_ctx->num_hdls = 1;
@@ -526,16 +530,15 @@ int ipa_rtp_tuple_info_req_hdlr(struct sk_buff *skb_2,
memset(&tuple_info_resp, 0, sizeof(tuple_info_resp)); memset(&tuple_info_resp, 0, sizeof(tuple_info_resp));
for (i = 0; i < MAX_STREAMS; i++) { for (i = 0; i < MAX_STREAMS; i++) {
if (si[i] == 0) { if (ipa_rtp_active_streams[i] == 0) {
tuple_info_resp.stream_id = i; tuple_info_resp.stream_id = i;
si[i] = 1;
stream_id_available = 1; stream_id_available = 1;
break; break;
} }
} }
if (!stream_id_available) { if (!stream_id_available) {
IPAERR("max stream-ids supported are four only\n"); IPAERR("max stream-ids supported are %u only\n", MAX_STREAMS);
return rc; return rc;
} }
@@ -543,17 +546,20 @@ int ipa_rtp_tuple_info_req_hdlr(struct sk_buff *skb_2,
if (ipa3_install_rtp_hdr_proc_rt_flt_rules(&tuple_info_req, tuple_info_resp.stream_id) || if (ipa3_install_rtp_hdr_proc_rt_flt_rules(&tuple_info_req, tuple_info_resp.stream_id) ||
ipa3_tuple_info_cmd_to_wlan_uc(&tuple_info_req, tuple_info_resp.stream_id)) { ipa3_tuple_info_cmd_to_wlan_uc(&tuple_info_req, tuple_info_resp.stream_id)) {
IPAERR("failed to install hdr proc and flt rules or filters at WLAN\n"); IPAERR("failed to install hdr proc and flt rules or filters at WLAN\n");
ipa3_delete_rtp_hdr_proc_rt_flt_rules(tuple_info_resp.stream_id);
return rc; return rc;
} }
ipa_rtp_active_streams[tuple_info_resp.stream_id] = 1;
if (is_req_valid && if (is_req_valid &&
ipa_rtp_send_tuple_info_resp(info, &tuple_info_resp)) { ipa_rtp_send_tuple_info_resp(info, &tuple_info_resp)) {
IPAERR("failed in sending stream_id response\n"); IPAERR("failed in sending stream_id response\n");
memset(&rmv_sid_req, 0, sizeof(rmv_sid_req)); memset(&rmv_sid_req, 0, sizeof(rmv_sid_req));
rmv_sid_req.stream_id = tuple_info_resp.stream_id; rmv_sid_req.stream_id = tuple_info_resp.stream_id;
ipa3_uc_send_remove_stream_cmd(&rmv_sid_req); ipa3_uc_send_remove_stream_cmd(&rmv_sid_req);
ipa3_delete_rtp_hdr_proc_rt_flt_rules(rmv_sid_req.stream_id); ipa3_delete_rtp_hdr_proc_rt_flt_rules(rmv_sid_req.stream_id);
si[tuple_info_resp.stream_id] = 0; ipa_rtp_active_streams[tuple_info_resp.stream_id] = 0;
} else } else
rc = 0; rc = 0;
@@ -865,7 +871,7 @@ int ipa_rtp_rmv_stream_id_req_hdlr(struct sk_buff *skb_2,
return rc; return rc;
} }
si[rmv_sid_req.stream_id] = 0; ipa_rtp_active_streams[rmv_sid_req.stream_id] = 0;
ipa3_ctx->rtp_stream_id_cnt--; ipa3_ctx->rtp_stream_id_cnt--;
IPADBG("Exit\n"); IPADBG("Exit\n");

View File

@@ -69,6 +69,24 @@ struct remove_bitstream_buffers {
uint32_t stream_id; uint32_t stream_id;
}; };
struct bitstream_buffer_info_to_uc {
uint8_t stream_id;
uint16_t fence_id;
uint8_t reserved;
u64 buff_addr;
u32 buff_fd;
u32 buff_size;
u64 meta_buff_addr;
u32 meta_buff_fd;
u32 meta_buff_size;
} __packed;
struct bitstream_buffers_to_uc {
uint16_t buff_cnt;
uint16_t cookie;
struct bitstream_buffer_info_to_uc bs_info[MAX_BUFF];
} __packed;
/** /**
* struct traffic_selector_info - traffic selector information. * struct traffic_selector_info - traffic selector information.
* @no_of_openframe: no. of openframes in a stream. * @no_of_openframe: no. of openframes in a stream.

View File

@@ -60,24 +60,6 @@ enum ipa3_cpu_2_hw_rtp_commands {
FEATURE_ENUM_VAL(IPA_HW_FEATURE_RTP, 11), FEATURE_ENUM_VAL(IPA_HW_FEATURE_RTP, 11),
}; };
struct bitstream_buffer_info_to_uc {
uint8_t stream_id;
uint16_t fence_id;
uint8_t reserved;
u64 buff_addr;
u32 buff_fd;
u32 buff_size;
u64 meta_buff_addr;
u32 meta_buff_fd;
u32 meta_buff_size;
} __packed;
struct bitstream_buffers_to_uc {
uint16_t buff_cnt;
uint16_t cookie;
struct bitstream_buffer_info_to_uc bs_info[MAX_BUFF];
} __packed;
struct dma_address_map_table { struct dma_address_map_table {
struct dma_buf *dma_buf_list[2]; struct dma_buf *dma_buf_list[2];
struct dma_buf_attachment *attachment[2]; struct dma_buf_attachment *attachment[2];
@@ -222,9 +204,8 @@ int ipa3_tuple_info_cmd_to_wlan_uc(struct traffic_tuple_info *req, u32 stream_id
return -EINVAL; return -EINVAL;
} }
if (!ipa3_ctx->ipa_xr_wdi_flt_rsv_status) { if (!atomic_read(&ipa3_ctx->ipa_xr_wdi_flt_rsv_status)) {
result = ipa_xr_wdi_opt_dpath_rsrv_filter_req(); result = ipa_xr_wdi_opt_dpath_rsrv_filter_req();
ipa3_ctx->ipa_xr_wdi_flt_rsv_status = !result;
if (result) { if (result) {
IPAERR("filter reservation failed at WLAN %d\n", result); IPAERR("filter reservation failed at WLAN %d\n", result);
return result; return result;
@@ -264,18 +245,20 @@ int ipa3_tuple_info_cmd_to_wlan_uc(struct traffic_tuple_info *req, u32 stream_id
flt_add_req.flt_info[0].ipv6_addr.ipv6_daddr[3]); flt_add_req.flt_info[0].ipv6_addr.ipv6_daddr[3]);
} }
result = ipa3_uc_send_tuple_info_cmd(req);
if (result) {
IPAERR("Fail to send tuple info cmd to uc\n");
return -EPERM;
}
else
IPADBG("send tuple info cmd to uc succeeded\n");
result = ipa_xr_wdi_opt_dpath_add_filter_req(&flt_add_req, stream_id); result = ipa_xr_wdi_opt_dpath_add_filter_req(&flt_add_req, stream_id);
if (result) { if (result) {
IPAERR("Fail to send tuple info cmd to wlan\n"); IPAERR("Fail to send tuple info cmd to wlan\n");
return -EPERM; return -EPERM;
} }
result = ipa3_uc_send_tuple_info_cmd(req);
if (result)
IPAERR("Fail to send tuple info cmd to uc\n");
else
IPADBG("send tuple info cmd to uc succeeded\n");
return result; return result;
} }
@@ -291,8 +274,10 @@ int ipa3_uc_send_remove_stream_cmd(struct remove_bitstream_buffers *data)
} }
result = ipa_xr_wdi_opt_dpath_remove_filter_req(data->stream_id); result = ipa_xr_wdi_opt_dpath_remove_filter_req(data->stream_id);
if (result) if (result) {
IPAERR("Failed to remove wlan filter of stream ID %d\n", data->stream_id); IPAERR("Failed to remove wlan filter of stream ID %d\n", data->stream_id);
return result;
}
cmd.size = sizeof(*cmd_data); cmd.size = sizeof(*cmd_data);
cmd.base = dma_alloc_coherent(ipa3_ctx->uc_pdev, cmd.size, cmd.base = dma_alloc_coherent(ipa3_ctx->uc_pdev, cmd.size,