OSDN Git Service

ath11k: optimize ath11k_hal_tx_status_parse
authorJohn Crispin <john@phrozen.org>
Fri, 13 Dec 2019 15:38:39 +0000 (16:38 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 18 Dec 2019 17:40:10 +0000 (19:40 +0200)
Moving the function into dp_tx.c allows gcc to optimize the code better
and also avoid chace invalidates and context switches.

Signed-off-by: John Crispin <john@phrozen.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath11k/dp_tx.c
drivers/net/wireless/ath/ath11k/hal_tx.c
drivers/net/wireless/ath/ath11k/hal_tx.h

index 3eff9e0..e994021 100644 (file)
@@ -423,6 +423,37 @@ exit:
        rcu_read_unlock();
 }
 
+static inline void ath11k_dp_tx_status_parse(struct ath11k_base *ab,
+                                            struct hal_wbm_release_ring *desc,
+                                            struct hal_tx_status *ts)
+{
+       ts->buf_rel_source =
+               FIELD_GET(HAL_WBM_RELEASE_INFO0_REL_SRC_MODULE, desc->info0);
+       if (ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_FW &&
+           ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)
+               return;
+
+       if (ts->buf_rel_source == HAL_WBM_REL_SRC_MODULE_FW)
+               return;
+
+       ts->status = FIELD_GET(HAL_WBM_RELEASE_INFO0_TQM_RELEASE_REASON,
+                              desc->info0);
+       ts->ppdu_id = FIELD_GET(HAL_WBM_RELEASE_INFO1_TQM_STATUS_NUMBER,
+                               desc->info1);
+       ts->try_cnt = FIELD_GET(HAL_WBM_RELEASE_INFO1_TRANSMIT_COUNT,
+                               desc->info1);
+       ts->ack_rssi = FIELD_GET(HAL_WBM_RELEASE_INFO2_ACK_FRAME_RSSI,
+                                desc->info2);
+       if (desc->info2 & HAL_WBM_RELEASE_INFO2_FIRST_MSDU)
+               ts->flags |= HAL_TX_STATUS_FLAGS_FIRST_MSDU;
+       ts->peer_id = FIELD_GET(HAL_WBM_RELEASE_INFO3_PEER_ID, desc->info3);
+       ts->tid = FIELD_GET(HAL_WBM_RELEASE_INFO3_TID, desc->info3);
+       if (desc->rate_stats.info0 & HAL_TX_RATE_STATS_INFO0_VALID)
+               ts->rate_stats = desc->rate_stats.info0;
+       else
+               ts->rate_stats = 0;
+}
+
 void ath11k_dp_tx_completion_handler(struct ath11k_base *ab, int ring_id)
 {
        struct ath11k *ar;
@@ -457,14 +488,17 @@ void ath11k_dp_tx_completion_handler(struct ath11k_base *ab, int ring_id)
 
        while (ATH11K_TX_COMPL_NEXT(tx_ring->tx_status_tail) != tx_ring->tx_status_head) {
                struct hal_wbm_release_ring *tx_status;
+               u32 desc_id;
 
                tx_ring->tx_status_tail =
                        ATH11K_TX_COMPL_NEXT(tx_ring->tx_status_tail);
                tx_status = &tx_ring->tx_status[tx_ring->tx_status_tail];
-               ath11k_hal_tx_status_parse(ab, tx_status, &ts);
+               ath11k_dp_tx_status_parse(ab, tx_status, &ts);
 
-               mac_id = FIELD_GET(DP_TX_DESC_ID_MAC_ID, ts.desc_id);
-               msdu_id = FIELD_GET(DP_TX_DESC_ID_MSDU_ID, ts.desc_id);
+               desc_id = FIELD_GET(BUFFER_ADDR_INFO1_SW_COOKIE,
+                                   tx_status->buf_addr_info.info1);
+               mac_id = FIELD_GET(DP_TX_DESC_ID_MAC_ID, desc_id);
+               msdu_id = FIELD_GET(DP_TX_DESC_ID_MSDU_ID, desc_id);
 
                if (ts.buf_rel_source == HAL_WBM_REL_SRC_MODULE_FW) {
                        ath11k_dp_tx_process_htt_tx_complete(ab,
index e8710bb..e4aa7e8 100644 (file)
@@ -74,49 +74,6 @@ void ath11k_hal_tx_cmd_desc_setup(struct ath11k_base *ab, void *cmd,
        tcl_cmd->info4 = 0;
 }
 
-void ath11k_hal_tx_status_parse(struct ath11k_base *ab,
-                               struct hal_wbm_release_ring *desc,
-                               struct hal_tx_status *ts)
-{
-       ts->buf_rel_source =
-               FIELD_GET(HAL_WBM_RELEASE_INFO0_REL_SRC_MODULE, desc->info0);
-       if (ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_FW &&
-           ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)
-               return;
-
-       ts->desc_id = FIELD_GET(BUFFER_ADDR_INFO1_SW_COOKIE,
-                               desc->buf_addr_info.info1);
-
-       if (ts->buf_rel_source == HAL_WBM_REL_SRC_MODULE_FW)
-               return;
-
-       ts->status = FIELD_GET(HAL_WBM_RELEASE_INFO0_TQM_RELEASE_REASON,
-                              desc->info0);
-       ts->ppdu_id = FIELD_GET(HAL_WBM_RELEASE_INFO1_TQM_STATUS_NUMBER,
-                               desc->info1);
-       ts->try_cnt = FIELD_GET(HAL_WBM_RELEASE_INFO1_TRANSMIT_COUNT,
-                               desc->info1);
-
-       ts->ack_rssi = FIELD_GET(HAL_WBM_RELEASE_INFO2_ACK_FRAME_RSSI,
-                                desc->info2);
-       if (desc->info2 & HAL_WBM_RELEASE_INFO2_FIRST_MSDU)
-               ts->flags |= HAL_TX_STATUS_FLAGS_FIRST_MSDU;
-
-       if (desc->info2 & HAL_WBM_RELEASE_INFO2_LAST_MSDU)
-               ts->flags |= HAL_TX_STATUS_FLAGS_LAST_MSDU;
-
-       if (desc->info2 & HAL_WBM_RELEASE_INFO2_MSDU_IN_AMSDU)
-               ts->flags |= HAL_TX_STATUS_FLAGS_MSDU_IN_AMSDU;
-
-       ts->peer_id = FIELD_GET(HAL_WBM_RELEASE_INFO3_PEER_ID, desc->info3);
-       ts->tid = FIELD_GET(HAL_WBM_RELEASE_INFO3_TID, desc->info3);
-
-       if (!(desc->rate_stats.info0 & HAL_TX_RATE_STATS_INFO0_VALID))
-               return;
-
-       ts->rate_stats = desc->rate_stats.info0;
-}
-
 void ath11k_hal_tx_set_dscp_tid_map(struct ath11k_base *ab, int id)
 {
        u32 ctrl_reg_val;
index 5fe89b7..ce48a61 100644 (file)
@@ -48,7 +48,6 @@ struct hal_tx_info {
 /* Tx status parsed from srng desc */
 struct hal_tx_status {
        enum hal_wbm_rel_src_module buf_rel_source;
-       u32 desc_id;
        enum hal_wbm_tqm_rel_reason status;
        u8 ack_rssi;
        u32 flags; /* %HAL_TX_STATUS_FLAGS_ */
@@ -61,9 +60,6 @@ struct hal_tx_status {
 
 void ath11k_hal_tx_cmd_desc_setup(struct ath11k_base *ab, void *cmd,
                                  struct hal_tx_info *ti);
-void ath11k_hal_tx_status_parse(struct ath11k_base *ab,
-                               struct hal_wbm_release_ring *desc,
-                               struct hal_tx_status *ts);
 void ath11k_hal_tx_set_dscp_tid_map(struct ath11k_base *ab, int id);
 int ath11k_hal_reo_cmd_send(struct ath11k_base *ab, struct hal_srng *srng,
                            enum hal_reo_cmd_type type,