Skip to content

Commit a36adf5

Browse files
Govindaraj SaminathanKalle Valo
authored andcommitted
ath11k: config reorder queue for all tids during peer setup
Currently rx tid setup is happening for TID 0 and TID 16 during peer setup. And if other TID packets received for the peer it will be redirected to rx error ring and not through reo ring. And this rx tid configuration cannot be done in the rx error ring path since it is a atomic context. So moving the rx tid setup for all tids during the peer setup. This is required to enable PN offload functionality to route all packets through reo ring. Co-developed-by: Tamizh Chelvam <[email protected]> Signed-off-by: Tamizh Chelvam <[email protected]> Signed-off-by: Govindaraj Saminathan <[email protected]> Signed-off-by: Kalle Valo <[email protected]>
1 parent bbdc8c5 commit a36adf5

File tree

4 files changed

+32
-17
lines changed

4 files changed

+32
-17
lines changed

drivers/net/wireless/ath/ath11k/dp.c

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ void ath11k_dp_peer_cleanup(struct ath11k *ar, int vdev_id, const u8 *addr)
3939
int ath11k_dp_peer_setup(struct ath11k *ar, int vdev_id, const u8 *addr)
4040
{
4141
struct ath11k_base *ab = ar->ab;
42+
struct ath11k_peer *peer;
4243
u32 reo_dest;
43-
int ret;
44+
int ret = 0, tid;
4445

4546
/* NOTE: reo_dest ring id starts from 1 unlike mac_id which starts from 0 */
4647
reo_dest = ar->dp.mac_id + 1;
@@ -54,24 +55,36 @@ int ath11k_dp_peer_setup(struct ath11k *ar, int vdev_id, const u8 *addr)
5455
return ret;
5556
}
5657

57-
ret = ath11k_peer_rx_tid_setup(ar, addr, vdev_id,
58-
HAL_DESC_REO_NON_QOS_TID, 1, 0);
59-
if (ret) {
60-
ath11k_warn(ab, "failed to setup rxd tid queue for non-qos tid %d\n",
61-
ret);
62-
return ret;
63-
}
64-
65-
ret = ath11k_peer_rx_tid_setup(ar, addr, vdev_id, 0, 1, 0);
66-
if (ret) {
67-
ath11k_warn(ab, "failed to setup rxd tid queue for tid 0 %d\n",
68-
ret);
69-
return ret;
58+
for (tid = 0; tid <= IEEE80211_NUM_TIDS; tid++) {
59+
ret = ath11k_peer_rx_tid_setup(ar, addr, vdev_id,
60+
tid, 1, 0);
61+
if (ret) {
62+
ath11k_warn(ab, "failed to setup rxd tid queue for tid %d: %d\n",
63+
tid, ret);
64+
goto peer_clean;
65+
}
7066
}
7167

7268
/* TODO: Setup other peer specific resource used in data path */
7369

7470
return 0;
71+
72+
peer_clean:
73+
spin_lock_bh(&ab->base_lock);
74+
75+
peer = ath11k_peer_find(ab, vdev_id, addr);
76+
if (!peer) {
77+
ath11k_warn(ab, "failed to find the peer to del rx tid\n");
78+
spin_unlock_bh(&ab->base_lock);
79+
return -ENOENT;
80+
}
81+
82+
for (; tid >= 0; tid--)
83+
ath11k_peer_rx_tid_delete(ar, peer, tid);
84+
85+
spin_unlock_bh(&ab->base_lock);
86+
87+
return ret;
7588
}
7689

7790
void ath11k_dp_srng_cleanup(struct ath11k_base *ab, struct dp_srng *ring)

drivers/net/wireless/ath/ath11k/dp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ struct ath11k_pdev_dp {
168168
#define DP_RX_RELEASE_RING_SIZE 1024
169169
#define DP_REO_EXCEPTION_RING_SIZE 128
170170
#define DP_REO_CMD_RING_SIZE 128
171-
#define DP_REO_STATUS_RING_SIZE 256
171+
#define DP_REO_STATUS_RING_SIZE 2048
172172
#define DP_RXDMA_BUF_RING_SIZE 4096
173173
#define DP_RXDMA_REFILL_RING_SIZE 2048
174174
#define DP_RXDMA_ERR_DST_RING_SIZE 1024

drivers/net/wireless/ath/ath11k/dp_rx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -633,8 +633,8 @@ static void ath11k_dp_rx_tid_del_func(struct ath11k_dp *dp, void *ctx,
633633
kfree(rx_tid->vaddr);
634634
}
635635

636-
static void ath11k_peer_rx_tid_delete(struct ath11k *ar,
637-
struct ath11k_peer *peer, u8 tid)
636+
void ath11k_peer_rx_tid_delete(struct ath11k *ar,
637+
struct ath11k_peer *peer, u8 tid)
638638
{
639639
struct ath11k_hal_reo_cmd cmd = {0};
640640
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];

drivers/net/wireless/ath/ath11k/dp_rx.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ int ath11k_dp_rx_ampdu_start(struct ath11k *ar,
4444
int ath11k_dp_rx_ampdu_stop(struct ath11k *ar,
4545
struct ieee80211_ampdu_params *params);
4646
void ath11k_peer_rx_tid_cleanup(struct ath11k *ar, struct ath11k_peer *peer);
47+
void ath11k_peer_rx_tid_delete(struct ath11k *ar,
48+
struct ath11k_peer *peer, u8 tid);
4749
int ath11k_peer_rx_tid_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id,
4850
u8 tid, u32 ba_win_sz, u16 ssn);
4951
void ath11k_dp_htt_htc_t2h_msg_handler(struct ath11k_base *ab,

0 commit comments

Comments
 (0)