ath11k: avoid active pdev check for each msdu
The Active Pdev and CAC check are done for each msdu in ath11k_dp_rx_process_received_packets which is a overhead. To avoid this overhead, collect all msdus in a per mac msdu list and pass to function. Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1.r2-00012-QCAHKSWPL_SILICONZ-1 Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-01695-QCAHKSWPL_SILICONZ-1 Co-developed-by: Sriram R <srirrama@codeaurora.org> Signed-off-by: Sriram R <srirrama@codeaurora.org> Signed-off-by: Jouni Malinen <jouni@codeaurora.org> Signed-off-by: P Praneesh <ppranees@codeaurora.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org> Link: https://lore.kernel.org/r/1630560820-21905-6-git-send-email-ppranees@codeaurora.org
This commit is contained in:
parent
a1775e732e
commit
c4d12cb37e
1 changed files with 34 additions and 36 deletions
|
@ -2600,13 +2600,11 @@ free_out:
|
||||||
static void ath11k_dp_rx_process_received_packets(struct ath11k_base *ab,
|
static void ath11k_dp_rx_process_received_packets(struct ath11k_base *ab,
|
||||||
struct napi_struct *napi,
|
struct napi_struct *napi,
|
||||||
struct sk_buff_head *msdu_list,
|
struct sk_buff_head *msdu_list,
|
||||||
int *quota, int ring_id)
|
int *quota, int mac_id)
|
||||||
{
|
{
|
||||||
struct ath11k_skb_rxcb *rxcb;
|
|
||||||
struct sk_buff *msdu;
|
struct sk_buff *msdu;
|
||||||
struct ath11k *ar;
|
struct ath11k *ar;
|
||||||
struct ieee80211_rx_status rx_status = {0};
|
struct ieee80211_rx_status rx_status = {0};
|
||||||
u8 mac_id;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (skb_queue_empty(msdu_list))
|
if (skb_queue_empty(msdu_list))
|
||||||
|
@ -2614,20 +2612,20 @@ static void ath11k_dp_rx_process_received_packets(struct ath11k_base *ab,
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
|
|
||||||
while (*quota && (msdu = __skb_dequeue(msdu_list))) {
|
ar = ab->pdevs[mac_id].ar;
|
||||||
rxcb = ATH11K_SKB_RXCB(msdu);
|
if (!rcu_dereference(ab->pdevs_active[mac_id])) {
|
||||||
mac_id = rxcb->mac_id;
|
__skb_queue_purge(msdu_list);
|
||||||
ar = ab->pdevs[mac_id].ar;
|
rcu_read_unlock();
|
||||||
if (!rcu_dereference(ab->pdevs_active[mac_id])) {
|
return;
|
||||||
dev_kfree_skb_any(msdu);
|
}
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
|
if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
|
||||||
dev_kfree_skb_any(msdu);
|
__skb_queue_purge(msdu_list);
|
||||||
continue;
|
rcu_read_unlock();
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((msdu = __skb_dequeue(msdu_list))) {
|
||||||
ret = ath11k_dp_rx_process_msdu(ar, msdu, msdu_list, &rx_status);
|
ret = ath11k_dp_rx_process_msdu(ar, msdu, msdu_list, &rx_status);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ath11k_dbg(ab, ATH11K_DBG_DATA,
|
ath11k_dbg(ab, ATH11K_DBG_DATA,
|
||||||
|
@ -2649,7 +2647,7 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
|
||||||
struct ath11k_dp *dp = &ab->dp;
|
struct ath11k_dp *dp = &ab->dp;
|
||||||
struct dp_rxdma_ring *rx_ring;
|
struct dp_rxdma_ring *rx_ring;
|
||||||
int num_buffs_reaped[MAX_RADIOS] = {0};
|
int num_buffs_reaped[MAX_RADIOS] = {0};
|
||||||
struct sk_buff_head msdu_list;
|
struct sk_buff_head msdu_list[MAX_RADIOS];
|
||||||
struct ath11k_skb_rxcb *rxcb;
|
struct ath11k_skb_rxcb *rxcb;
|
||||||
int total_msdu_reaped = 0;
|
int total_msdu_reaped = 0;
|
||||||
struct hal_srng *srng;
|
struct hal_srng *srng;
|
||||||
|
@ -2658,10 +2656,13 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
|
||||||
bool done = false;
|
bool done = false;
|
||||||
int buf_id, mac_id;
|
int buf_id, mac_id;
|
||||||
struct ath11k *ar;
|
struct ath11k *ar;
|
||||||
u32 *rx_desc;
|
struct hal_reo_dest_ring *desc;
|
||||||
|
enum hal_reo_dest_ring_push_reason push_reason;
|
||||||
|
u32 cookie;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
__skb_queue_head_init(&msdu_list);
|
for (i = 0; i < MAX_RADIOS; i++)
|
||||||
|
__skb_queue_head_init(&msdu_list[i]);
|
||||||
|
|
||||||
srng = &ab->hal.srng_list[dp->reo_dst_ring[ring_id].ring_id];
|
srng = &ab->hal.srng_list[dp->reo_dst_ring[ring_id].ring_id];
|
||||||
|
|
||||||
|
@ -2670,13 +2671,11 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
|
||||||
ath11k_hal_srng_access_begin(ab, srng);
|
ath11k_hal_srng_access_begin(ab, srng);
|
||||||
|
|
||||||
try_again:
|
try_again:
|
||||||
while ((rx_desc = ath11k_hal_srng_dst_get_next_entry(ab, srng))) {
|
while (likely(desc =
|
||||||
struct hal_reo_dest_ring desc = *(struct hal_reo_dest_ring *)rx_desc;
|
(struct hal_reo_dest_ring *)ath11k_hal_srng_dst_get_next_entry(ab,
|
||||||
enum hal_reo_dest_ring_push_reason push_reason;
|
srng))) {
|
||||||
u32 cookie;
|
|
||||||
|
|
||||||
cookie = FIELD_GET(BUFFER_ADDR_INFO1_SW_COOKIE,
|
cookie = FIELD_GET(BUFFER_ADDR_INFO1_SW_COOKIE,
|
||||||
desc.buf_addr_info.info1);
|
desc->buf_addr_info.info1);
|
||||||
buf_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_BUF_ID,
|
buf_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_BUF_ID,
|
||||||
cookie);
|
cookie);
|
||||||
mac_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_PDEV_ID, cookie);
|
mac_id = FIELD_GET(DP_RXDMA_BUF_COOKIE_PDEV_ID, cookie);
|
||||||
|
@ -2703,7 +2702,7 @@ try_again:
|
||||||
num_buffs_reaped[mac_id]++;
|
num_buffs_reaped[mac_id]++;
|
||||||
|
|
||||||
push_reason = FIELD_GET(HAL_REO_DEST_RING_INFO0_PUSH_REASON,
|
push_reason = FIELD_GET(HAL_REO_DEST_RING_INFO0_PUSH_REASON,
|
||||||
desc.info0);
|
desc->info0);
|
||||||
if (push_reason !=
|
if (push_reason !=
|
||||||
HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION) {
|
HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION) {
|
||||||
dev_kfree_skb_any(msdu);
|
dev_kfree_skb_any(msdu);
|
||||||
|
@ -2711,21 +2710,21 @@ try_again:
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
rxcb->is_first_msdu = !!(desc.rx_msdu_info.info0 &
|
rxcb->is_first_msdu = !!(desc->rx_msdu_info.info0 &
|
||||||
RX_MSDU_DESC_INFO0_FIRST_MSDU_IN_MPDU);
|
RX_MSDU_DESC_INFO0_FIRST_MSDU_IN_MPDU);
|
||||||
rxcb->is_last_msdu = !!(desc.rx_msdu_info.info0 &
|
rxcb->is_last_msdu = !!(desc->rx_msdu_info.info0 &
|
||||||
RX_MSDU_DESC_INFO0_LAST_MSDU_IN_MPDU);
|
RX_MSDU_DESC_INFO0_LAST_MSDU_IN_MPDU);
|
||||||
rxcb->is_continuation = !!(desc.rx_msdu_info.info0 &
|
rxcb->is_continuation = !!(desc->rx_msdu_info.info0 &
|
||||||
RX_MSDU_DESC_INFO0_MSDU_CONTINUATION);
|
RX_MSDU_DESC_INFO0_MSDU_CONTINUATION);
|
||||||
rxcb->peer_id = FIELD_GET(RX_MPDU_DESC_META_DATA_PEER_ID,
|
rxcb->peer_id = FIELD_GET(RX_MPDU_DESC_META_DATA_PEER_ID,
|
||||||
desc.rx_mpdu_info.meta_data);
|
desc->rx_mpdu_info.meta_data);
|
||||||
rxcb->seq_no = FIELD_GET(RX_MPDU_DESC_INFO0_SEQ_NUM,
|
rxcb->seq_no = FIELD_GET(RX_MPDU_DESC_INFO0_SEQ_NUM,
|
||||||
desc.rx_mpdu_info.info0);
|
desc->rx_mpdu_info.info0);
|
||||||
rxcb->tid = FIELD_GET(HAL_REO_DEST_RING_INFO0_RX_QUEUE_NUM,
|
rxcb->tid = FIELD_GET(HAL_REO_DEST_RING_INFO0_RX_QUEUE_NUM,
|
||||||
desc.info0);
|
desc->info0);
|
||||||
|
|
||||||
rxcb->mac_id = mac_id;
|
rxcb->mac_id = mac_id;
|
||||||
__skb_queue_tail(&msdu_list, msdu);
|
__skb_queue_tail(&msdu_list[mac_id], msdu);
|
||||||
|
|
||||||
if (rxcb->is_continuation) {
|
if (rxcb->is_continuation) {
|
||||||
done = false;
|
done = false;
|
||||||
|
@ -2760,16 +2759,15 @@ try_again:
|
||||||
if (!num_buffs_reaped[i])
|
if (!num_buffs_reaped[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
ath11k_dp_rx_process_received_packets(ab, napi, &msdu_list[i],
|
||||||
|
"a, i);
|
||||||
|
|
||||||
ar = ab->pdevs[i].ar;
|
ar = ab->pdevs[i].ar;
|
||||||
rx_ring = &ar->dp.rx_refill_buf_ring;
|
rx_ring = &ar->dp.rx_refill_buf_ring;
|
||||||
|
|
||||||
ath11k_dp_rxbufs_replenish(ab, i, rx_ring, num_buffs_reaped[i],
|
ath11k_dp_rxbufs_replenish(ab, i, rx_ring, num_buffs_reaped[i],
|
||||||
ab->hw_params.hal_params->rx_buf_rbm);
|
ab->hw_params.hal_params->rx_buf_rbm);
|
||||||
}
|
}
|
||||||
|
|
||||||
ath11k_dp_rx_process_received_packets(ab, napi, &msdu_list,
|
|
||||||
"a, ring_id);
|
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
return budget - quota;
|
return budget - quota;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue