ath11k: config reorder queue for all tids during peer setup
authorGovindaraj Saminathan <gsamin@codeaurora.org>
Fri, 14 Feb 2020 02:18:44 +0000 (07:48 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 11 Mar 2020 16:43:43 +0000 (18:43 +0200)
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 <tamizhr@codeaurora.org>
Signed-off-by: Tamizh Chelvam <tamizhr@codeaurora.org>
Signed-off-by: Govindaraj Saminathan <gsamin@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath11k/dp.c
drivers/net/wireless/ath/ath11k/dp.h
drivers/net/wireless/ath/ath11k/dp_rx.c
drivers/net/wireless/ath/ath11k/dp_rx.h

index b112825a52edfaa6599e6c9ceee17b697d665c77..ce7634111bcfedc3e2c8e8d9cf380d2b0dc7ae1b 100644 (file)
@@ -39,8 +39,9 @@ void ath11k_dp_peer_cleanup(struct ath11k *ar, int vdev_id, const u8 *addr)
 int ath11k_dp_peer_setup(struct ath11k *ar, int vdev_id, const u8 *addr)
 {
        struct ath11k_base *ab = ar->ab;
+       struct ath11k_peer *peer;
        u32 reo_dest;
-       int ret;
+       int ret = 0, tid;
 
        /* NOTE: reo_dest ring id starts from 1 unlike mac_id which starts from 0 */
        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)
                return ret;
        }
 
-       ret = ath11k_peer_rx_tid_setup(ar, addr, vdev_id,
-                                      HAL_DESC_REO_NON_QOS_TID, 1, 0);
-       if (ret) {
-               ath11k_warn(ab, "failed to setup rxd tid queue for non-qos tid %d\n",
-                           ret);
-               return ret;
-       }
-
-       ret = ath11k_peer_rx_tid_setup(ar, addr, vdev_id, 0, 1, 0);
-       if (ret) {
-               ath11k_warn(ab, "failed to setup rxd tid queue for tid 0 %d\n",
-                           ret);
-               return ret;
+       for (tid = 0; tid <= IEEE80211_NUM_TIDS; tid++) {
+               ret = ath11k_peer_rx_tid_setup(ar, addr, vdev_id,
+                                              tid, 1, 0);
+               if (ret) {
+                       ath11k_warn(ab, "failed to setup rxd tid queue for tid %d: %d\n",
+                                   tid, ret);
+                       goto peer_clean;
+               }
        }
 
        /* TODO: Setup other peer specific resource used in data path */
 
        return 0;
+
+peer_clean:
+       spin_lock_bh(&ab->base_lock);
+
+       peer = ath11k_peer_find(ab, vdev_id, addr);
+       if (!peer) {
+               ath11k_warn(ab, "failed to find the peer to del rx tid\n");
+               spin_unlock_bh(&ab->base_lock);
+               return -ENOENT;
+       }
+
+       for (; tid >= 0; tid--)
+               ath11k_peer_rx_tid_delete(ar, peer, tid);
+
+       spin_unlock_bh(&ab->base_lock);
+
+       return ret;
 }
 
 void ath11k_dp_srng_cleanup(struct ath11k_base *ab, struct dp_srng *ring)
index 3592c39f84de2f13da3dcdffe7ef407dc8825a11..4f9e4cea056a7f596a6d7a391bbe3f860dbbdcf8 100644 (file)
@@ -168,7 +168,7 @@ struct ath11k_pdev_dp {
 #define DP_RX_RELEASE_RING_SIZE                1024
 #define DP_REO_EXCEPTION_RING_SIZE     128
 #define DP_REO_CMD_RING_SIZE           128
-#define DP_REO_STATUS_RING_SIZE                256
+#define DP_REO_STATUS_RING_SIZE                2048
 #define DP_RXDMA_BUF_RING_SIZE         4096
 #define DP_RXDMA_REFILL_RING_SIZE      2048
 #define DP_RXDMA_ERR_DST_RING_SIZE     1024
index 6dfaea113029fb9b66ab8cfb1fcfbe4be4a39e2b..dc7881baf80904c816d40323b288768d03472d4e 100644 (file)
@@ -633,8 +633,8 @@ free_desc:
        kfree(rx_tid->vaddr);
 }
 
-static void ath11k_peer_rx_tid_delete(struct ath11k *ar,
-                                     struct ath11k_peer *peer, u8 tid)
+void ath11k_peer_rx_tid_delete(struct ath11k *ar,
+                              struct ath11k_peer *peer, u8 tid)
 {
        struct ath11k_hal_reo_cmd cmd = {0};
        struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
index eec5deaa59ad798cac45a3f19c833805a3046a2c..1b08b7dcafbc24ab6139a4d82eeb7f2836e787bc 100644 (file)
@@ -44,6 +44,8 @@ int ath11k_dp_rx_ampdu_start(struct ath11k *ar,
 int ath11k_dp_rx_ampdu_stop(struct ath11k *ar,
                            struct ieee80211_ampdu_params *params);
 void ath11k_peer_rx_tid_cleanup(struct ath11k *ar, struct ath11k_peer *peer);
+void ath11k_peer_rx_tid_delete(struct ath11k *ar,
+                              struct ath11k_peer *peer, u8 tid);
 int ath11k_peer_rx_tid_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id,
                             u8 tid, u32 ba_win_sz, u16 ssn);
 void ath11k_dp_htt_htc_t2h_msg_handler(struct ath11k_base *ab,