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:

committed by
Jagadeesh Ponduru

parent
74fb08d85c
commit
d1483b79d1
@@ -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);
|
||||||
|
IPA_WDI_DBG("Add filter callbacks called for stream id %d\n", stream_id);
|
||||||
|
if (!ret)
|
||||||
add_flt_hndl[stream_id].filter_handle = req->flt_info[0].out_hdl;
|
add_flt_hndl[stream_id].filter_handle = req->flt_info[0].out_hdl;
|
||||||
IPA_WDI_DBG("add filter callbacks called, stream id %d\n", stream_id);
|
|
||||||
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);
|
||||||
|
@@ -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];
|
||||||
|
@@ -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,9 +546,12 @@ 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");
|
||||||
@@ -553,7 +559,7 @@ int ipa_rtp_tuple_info_req_hdlr(struct sk_buff *skb_2,
|
|||||||
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");
|
||||||
|
@@ -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.
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user