]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: ath12k: drop failed transmitted frames from metric calculation.
authorKarthikeyan Kathirvel <quic_kathirve@quicinc.com>
Fri, 3 May 2024 10:34:39 +0000 (13:34 +0300)
committerKalle Valo <quic_kvalo@quicinc.com>
Fri, 3 May 2024 13:21:31 +0000 (16:21 +0300)
In mesh node traffic, internal firmware-transmitted failures are
reported as transmitted failures in mesh metric calculation, leading
to the breakage of the mesh link.

Fix the issue by dropping the internal firmware-transmitted failures
before updating the TX completion status to mac80211, in order to
prevent false failure averaging in mesh metric calculation.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1

Fixes: d889913205cf ("wifi: ath12k: driver for Qualcomm Wi-Fi 7 devices")
Signed-off-by: Karthikeyan Kathirvel <quic_kathirve@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240430074313.885807-3-quic_kathirve@quicinc.com
drivers/net/wireless/ath/ath12k/dp_tx.c
drivers/net/wireless/ath/ath12k/hal_desc.h

index 81a85d5946f5a77bb4648364a1ad5b7ee24f9777..a7c7a868c14ce05dab713f29cb76e7faa9681343 100644 (file)
@@ -482,18 +482,36 @@ static void ath12k_dp_tx_complete_msdu(struct ath12k *ar,
        /* skip tx rate update from ieee80211_status*/
        info->status.rates[0].idx = -1;
 
-       if (ts->status == HAL_WBM_TQM_REL_REASON_FRAME_ACKED &&
-           !(info->flags & IEEE80211_TX_CTL_NO_ACK)) {
-               info->flags |= IEEE80211_TX_STAT_ACK;
-               info->status.ack_signal = ATH12K_DEFAULT_NOISE_FLOOR +
-                                         ts->ack_rssi;
-               info->status.flags = IEEE80211_TX_STATUS_ACK_SIGNAL_VALID;
+       switch (ts->status) {
+       case HAL_WBM_TQM_REL_REASON_FRAME_ACKED:
+               if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) {
+                       info->flags |= IEEE80211_TX_STAT_ACK;
+                       info->status.ack_signal = ATH12K_DEFAULT_NOISE_FLOOR +
+                                                 ts->ack_rssi;
+                       info->status.flags = IEEE80211_TX_STATUS_ACK_SIGNAL_VALID;
+               }
+               break;
+       case HAL_WBM_TQM_REL_REASON_CMD_REMOVE_TX:
+               if (info->flags & IEEE80211_TX_CTL_NO_ACK) {
+                       info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
+                       break;
+               }
+               fallthrough;
+       case HAL_WBM_TQM_REL_REASON_CMD_REMOVE_MPDU:
+       case HAL_WBM_TQM_REL_REASON_DROP_THRESHOLD:
+       case HAL_WBM_TQM_REL_REASON_CMD_REMOVE_AGED_FRAMES:
+               /* The failure status is due to internal firmware tx failure
+                * hence drop the frame; do not update the status of frame to
+                * the upper layer
+                */
+               ieee80211_free_txskb(ah->hw, msdu);
+               goto exit;
+       default:
+               ath12k_dbg(ab, ATH12K_DBG_DP_TX, "tx frame is not acked status %d\n",
+                          ts->status);
+               break;
        }
 
-       if (ts->status == HAL_WBM_TQM_REL_REASON_CMD_REMOVE_TX &&
-           (info->flags & IEEE80211_TX_CTL_NO_ACK))
-               info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
-
        /* NOTE: Tx rate status reporting. Tx completion status does not have
         * necessary information (for example nss) to build the tx rate.
         * Might end up reporting it out-of-band from HTT stats.
index 63340256d3f64ef20c7759d0d2958477315a9b26..814c02f876d6452717fd1ef1c83bc52182227594 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: BSD-3-Clause-Clear */
 /*
  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022, 2024 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include "core.h"
 
@@ -2048,6 +2048,19 @@ struct hal_wbm_release_ring {
  *     fw with fw_reason2.
  * @HAL_WBM_TQM_REL_REASON_CMD_REMOVE_RESEAON3: Remove command initiated by
  *     fw with fw_reason3.
+ * @HAL_WBM_TQM_REL_REASON_CMD_DISABLE_QUEUE: Remove command initiated by
+ *     fw with disable queue.
+ * @HAL_WBM_TQM_REL_REASON_CMD_TILL_NONMATCHING: Remove command initiated by
+ *     fw to remove all mpdu until 1st non-match.
+ * @HAL_WBM_TQM_REL_REASON_DROP_THRESHOLD: Dropped due to drop threshold
+ *     criteria
+ * @HAL_WBM_TQM_REL_REASON_DROP_LINK_DESC_UNAVAIL: Dropped due to link desc
+ *     not available
+ * @HAL_WBM_TQM_REL_REASON_DROP_OR_INVALID_MSDU: Dropped due drop bit set or
+ *     null flow
+ * @HAL_WBM_TQM_REL_REASON_MULTICAST_DROP: Dropped due mcast drop set for VDEV
+ * @HAL_WBM_TQM_REL_REASON_VDEV_MISMATCH_DROP: Dropped due to being set with
+ *     'TCL_drop_reason'
  */
 enum hal_wbm_tqm_rel_reason {
        HAL_WBM_TQM_REL_REASON_FRAME_ACKED,
@@ -2058,6 +2071,13 @@ enum hal_wbm_tqm_rel_reason {
        HAL_WBM_TQM_REL_REASON_CMD_REMOVE_RESEAON1,
        HAL_WBM_TQM_REL_REASON_CMD_REMOVE_RESEAON2,
        HAL_WBM_TQM_REL_REASON_CMD_REMOVE_RESEAON3,
+       HAL_WBM_TQM_REL_REASON_CMD_DISABLE_QUEUE,
+       HAL_WBM_TQM_REL_REASON_CMD_TILL_NONMATCHING,
+       HAL_WBM_TQM_REL_REASON_DROP_THRESHOLD,
+       HAL_WBM_TQM_REL_REASON_DROP_LINK_DESC_UNAVAIL,
+       HAL_WBM_TQM_REL_REASON_DROP_OR_INVALID_MSDU,
+       HAL_WBM_TQM_REL_REASON_MULTICAST_DROP,
+       HAL_WBM_TQM_REL_REASON_VDEV_MISMATCH_DROP,
 };
 
 struct hal_wbm_buffer_ring {