qcacmn: Flush queue before qref delete
REO_FLUSH_CACHE cmd - flush_q_1k_desc as 1 – This will flush Queue, Q1k and QEXT in one go. we need not give 11 cmd for each tid of the peer. - forward_all_mpdus_in_queue to 1 in FLUSH_CACHE_CMD. With this we need wait for aging threshold time. Change-Id: I695ab48a50968872eb22024ba5c770f0e5a74a09 CRs-Fixed: 3384665
This commit is contained in:

committed by
Madan Koyyalamudi

parent
94970e41cb
commit
8339fb6fde
@@ -4016,9 +4016,7 @@ void dp_rx_tid_delete_cb(struct dp_soc *soc, void *cb_ctxt,
|
|||||||
uint32_t list_size;
|
uint32_t list_size;
|
||||||
struct reo_desc_list_node *desc;
|
struct reo_desc_list_node *desc;
|
||||||
unsigned long curr_ts = qdf_get_system_timestamp();
|
unsigned long curr_ts = qdf_get_system_timestamp();
|
||||||
uint32_t desc_size, tot_desc_size;
|
|
||||||
struct hal_reo_cmd_params params;
|
struct hal_reo_cmd_params params;
|
||||||
bool flush_failure = false;
|
|
||||||
|
|
||||||
DP_RX_REO_QDESC_UPDATE_EVT(freedesc);
|
DP_RX_REO_QDESC_UPDATE_EVT(freedesc);
|
||||||
|
|
||||||
@@ -4074,52 +4072,15 @@ void dp_rx_tid_delete_cb(struct dp_soc *soc, void *cb_ctxt,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Flush and invalidate REO descriptor from HW cache: Base and
|
|
||||||
* extension descriptors should be flushed separately */
|
|
||||||
if (desc->pending_ext_desc_size)
|
|
||||||
tot_desc_size = desc->pending_ext_desc_size;
|
|
||||||
else
|
|
||||||
tot_desc_size = rx_tid->hw_qdesc_alloc_size;
|
|
||||||
/* Get base descriptor size by passing non-qos TID */
|
|
||||||
desc_size = hal_get_reo_qdesc_size(soc->hal_soc, 0,
|
|
||||||
DP_NON_QOS_TID);
|
|
||||||
|
|
||||||
/* Flush reo extension descriptors */
|
|
||||||
while ((tot_desc_size -= desc_size) > 0) {
|
|
||||||
qdf_mem_zero(¶ms, sizeof(params));
|
|
||||||
params.std.addr_lo =
|
|
||||||
((uint64_t)(rx_tid->hw_qdesc_paddr) +
|
|
||||||
tot_desc_size) & 0xffffffff;
|
|
||||||
params.std.addr_hi =
|
|
||||||
(uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
|
|
||||||
|
|
||||||
if (QDF_STATUS_SUCCESS != dp_reo_send_cmd(soc,
|
|
||||||
CMD_FLUSH_CACHE,
|
|
||||||
¶ms,
|
|
||||||
NULL,
|
|
||||||
NULL)) {
|
|
||||||
dp_info_rl("fail to send CMD_CACHE_FLUSH:"
|
|
||||||
"tid %d desc %pK", rx_tid->tid,
|
|
||||||
(void *)(rx_tid->hw_qdesc_paddr));
|
|
||||||
desc->pending_ext_desc_size = tot_desc_size +
|
|
||||||
desc_size;
|
|
||||||
dp_reo_desc_clean_up(soc, desc, reo_status);
|
|
||||||
flush_failure = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flush_failure)
|
|
||||||
break;
|
|
||||||
else
|
|
||||||
desc->pending_ext_desc_size = desc_size;
|
|
||||||
|
|
||||||
/* Flush base descriptor */
|
/* Flush base descriptor */
|
||||||
qdf_mem_zero(¶ms, sizeof(params));
|
qdf_mem_zero(¶ms, sizeof(params));
|
||||||
params.std.need_status = 1;
|
params.std.need_status = 1;
|
||||||
params.std.addr_lo =
|
params.std.addr_lo =
|
||||||
(uint64_t)(rx_tid->hw_qdesc_paddr) & 0xffffffff;
|
(uint64_t)(rx_tid->hw_qdesc_paddr) & 0xffffffff;
|
||||||
params.std.addr_hi = (uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
|
params.std.addr_hi = (uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
|
||||||
|
if (rx_tid->ba_win_size > 256)
|
||||||
|
params.u.fl_cache_params.flush_q_1k_desc = 1;
|
||||||
|
params.u.fl_cache_params.fwd_mpdus_in_queue = 1;
|
||||||
|
|
||||||
if (QDF_STATUS_SUCCESS != dp_reo_send_cmd(soc,
|
if (QDF_STATUS_SUCCESS != dp_reo_send_cmd(soc,
|
||||||
CMD_FLUSH_CACHE,
|
CMD_FLUSH_CACHE,
|
||||||
@@ -4160,6 +4121,7 @@ static int dp_rx_tid_delete_wifi3(struct dp_peer *peer, int tid)
|
|||||||
{
|
{
|
||||||
struct dp_rx_tid *rx_tid = &(peer->rx_tid[tid]);
|
struct dp_rx_tid *rx_tid = &(peer->rx_tid[tid]);
|
||||||
struct dp_soc *soc = peer->vdev->pdev->soc;
|
struct dp_soc *soc = peer->vdev->pdev->soc;
|
||||||
|
union hal_reo_status reo_status;
|
||||||
struct hal_reo_cmd_params params;
|
struct hal_reo_cmd_params params;
|
||||||
struct reo_desc_list_node *freedesc =
|
struct reo_desc_list_node *freedesc =
|
||||||
qdf_mem_malloc(sizeof(*freedesc));
|
qdf_mem_malloc(sizeof(*freedesc));
|
||||||
@@ -4178,25 +4140,8 @@ static int dp_rx_tid_delete_wifi3(struct dp_peer *peer, int tid)
|
|||||||
|
|
||||||
DP_RX_REO_QDESC_GET_MAC(freedesc, peer);
|
DP_RX_REO_QDESC_GET_MAC(freedesc, peer);
|
||||||
|
|
||||||
params.std.need_status = 1;
|
reo_status.rx_queue_status.header.status = HAL_REO_CMD_SUCCESS;
|
||||||
params.std.addr_lo = rx_tid->hw_qdesc_paddr & 0xffffffff;
|
dp_rx_tid_delete_cb(soc, freedesc, &reo_status);
|
||||||
params.std.addr_hi = (uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
|
|
||||||
params.u.upd_queue_params.update_vld = 1;
|
|
||||||
params.u.upd_queue_params.vld = 0;
|
|
||||||
|
|
||||||
if (dp_reo_send_cmd(soc, CMD_UPDATE_RX_REO_QUEUE, ¶ms,
|
|
||||||
dp_rx_tid_delete_cb, (void *)freedesc)
|
|
||||||
!= QDF_STATUS_SUCCESS) {
|
|
||||||
/* Defer the clean up to the call back context */
|
|
||||||
qdf_spin_lock_bh(&soc->reo_desc_freelist_lock);
|
|
||||||
freedesc->free_ts = qdf_get_system_timestamp();
|
|
||||||
freedesc->resend_update_reo_cmd = true;
|
|
||||||
qdf_list_insert_front(&soc->reo_desc_freelist,
|
|
||||||
(qdf_list_node_t *)freedesc);
|
|
||||||
DP_STATS_INC(soc, rx.err.reo_cmd_send_fail, 1);
|
|
||||||
qdf_spin_unlock_bh(&soc->reo_desc_freelist_lock);
|
|
||||||
dp_info("Failed to send CMD_UPDATE_RX_REO_QUEUE");
|
|
||||||
}
|
|
||||||
|
|
||||||
rx_tid->hw_qdesc_vaddr_unaligned = NULL;
|
rx_tid->hw_qdesc_vaddr_unaligned = NULL;
|
||||||
rx_tid->hw_qdesc_alloc_size = 0;
|
rx_tid->hw_qdesc_alloc_size = 0;
|
||||||
@@ -6194,6 +6139,11 @@ void dp_send_cache_flush_for_rx_tid(
|
|||||||
params.std.addr_hi =
|
params.std.addr_hi =
|
||||||
(uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
|
(uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
|
||||||
params.u.fl_cache_params.flush_no_inval = 0;
|
params.u.fl_cache_params.flush_no_inval = 0;
|
||||||
|
|
||||||
|
if (rx_tid->ba_win_size > 256)
|
||||||
|
params.u.fl_cache_params.flush_q_1k_desc = 1;
|
||||||
|
params.u.fl_cache_params.fwd_mpdus_in_queue = 1;
|
||||||
|
|
||||||
if (QDF_STATUS_SUCCESS !=
|
if (QDF_STATUS_SUCCESS !=
|
||||||
dp_reo_send_cmd(
|
dp_reo_send_cmd(
|
||||||
soc, CMD_FLUSH_CACHE,
|
soc, CMD_FLUSH_CACHE,
|
||||||
|
@@ -405,6 +405,9 @@ hal_reo_cmd_flush_cache_be(hal_ring_handle_t hal_ring_hdl,
|
|||||||
HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE,
|
HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE,
|
||||||
FLUSH_WITHOUT_INVALIDATE, cp->flush_no_inval);
|
FLUSH_WITHOUT_INVALIDATE, cp->flush_no_inval);
|
||||||
|
|
||||||
|
HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE,
|
||||||
|
FLUSH_QUEUE_1K_DESC, cp->flush_q_1k_desc);
|
||||||
|
|
||||||
HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE,
|
HAL_DESC_64_SET_FIELD(reo_desc, REO_FLUSH_CACHE,
|
||||||
BLOCK_CACHE_USAGE_AFTER_FLUSH,
|
BLOCK_CACHE_USAGE_AFTER_FLUSH,
|
||||||
cp->block_use_after_flush);
|
cp->block_use_after_flush);
|
||||||
|
@@ -206,6 +206,7 @@ struct hal_reo_cmd_flush_cache_params {
|
|||||||
bool flush_no_inval;
|
bool flush_no_inval;
|
||||||
bool block_use_after_flush;
|
bool block_use_after_flush;
|
||||||
bool flush_entire_cache;
|
bool flush_entire_cache;
|
||||||
|
bool flush_q_1k_desc;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user