]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: ath11k: relocate some Tx power related functions in mac.c
authorAditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Fri, 17 Oct 2025 04:07:57 +0000 (09:37 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Thu, 23 Oct 2025 13:59:20 +0000 (06:59 -0700)
A forthcoming change necessitates that these functions be defined prior to
their usage. Therefore, relocate them now as a preparatory step for the
upcoming modifications.

Compile tested only.

Signed-off-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com>
Link: https://patch.msgid.link/20251017-add_tx_power_insertion_support-v1-1-f08feacfca93@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath11k/mac.c

index ebde4208791ce193612b038f1c270b3f86d244a9..99dea865e31eabc7fa01bb4de509f0967bc50aab 100644 (file)
@@ -4028,6 +4028,141 @@ static int ath11k_start_scan(struct ath11k *ar,
        return 0;
 }
 
+static void ath11k_mac_fw_stats_reset(struct ath11k *ar)
+{
+       spin_lock_bh(&ar->data_lock);
+       ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
+       ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs);
+       ar->fw_stats.num_vdev_recvd = 0;
+       ar->fw_stats.num_bcn_recvd = 0;
+       spin_unlock_bh(&ar->data_lock);
+}
+
+int ath11k_mac_fw_stats_request(struct ath11k *ar,
+                               struct stats_request_params *req_param)
+{
+       struct ath11k_base *ab = ar->ab;
+       unsigned long time_left;
+       int ret;
+
+       lockdep_assert_held(&ar->conf_mutex);
+
+       ath11k_mac_fw_stats_reset(ar);
+
+       reinit_completion(&ar->fw_stats_complete);
+       reinit_completion(&ar->fw_stats_done);
+
+       ret = ath11k_wmi_send_stats_request_cmd(ar, req_param);
+
+       if (ret) {
+               ath11k_warn(ab, "could not request fw stats (%d)\n",
+                           ret);
+               return ret;
+       }
+
+       time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ);
+       if (!time_left)
+               return -ETIMEDOUT;
+
+       /* FW stats can get split when exceeding the stats data buffer limit.
+        * In that case, since there is no end marking for the back-to-back
+        * received 'update stats' event, we keep a 3 seconds timeout in case,
+        * fw_stats_done is not marked yet
+        */
+       time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ);
+       if (!time_left)
+               return -ETIMEDOUT;
+
+       return 0;
+}
+
+static int ath11k_mac_get_fw_stats(struct ath11k *ar, u32 pdev_id,
+                                  u32 vdev_id, u32 stats_id)
+{
+       struct ath11k_base *ab = ar->ab;
+       struct stats_request_params req_param;
+       int ret;
+
+       lockdep_assert_held(&ar->conf_mutex);
+
+       if (ar->state != ATH11K_STATE_ON)
+               return -ENETDOWN;
+
+       req_param.pdev_id = pdev_id;
+       req_param.vdev_id = vdev_id;
+       req_param.stats_id = stats_id;
+
+       ret = ath11k_mac_fw_stats_request(ar, &req_param);
+       if (ret)
+               ath11k_warn(ab, "failed to request fw stats: %d\n", ret);
+
+       ath11k_dbg(ab, ATH11K_DBG_WMI,
+                  "debug get fw stat pdev id %d vdev id %d stats id 0x%x\n",
+                  pdev_id, vdev_id, stats_id);
+
+       return ret;
+}
+
+static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw,
+                                    struct ieee80211_vif *vif,
+                                    unsigned int link_id,
+                                    int *dbm)
+{
+       struct ath11k *ar = hw->priv;
+       struct ath11k_base *ab = ar->ab;
+       struct ath11k_fw_stats_pdev *pdev;
+       int ret;
+
+       /* Final Tx power is minimum of Target Power, CTL power, Regulatory
+        * Power, PSD EIRP Power. We just know the Regulatory power from the
+        * regulatory rules obtained. FW knows all these power and sets the min
+        * of these. Hence, we request the FW pdev stats in which FW reports
+        * the minimum of all vdev's channel Tx power.
+        */
+       mutex_lock(&ar->conf_mutex);
+
+       /* Firmware doesn't provide Tx power during CAC hence no need to fetch
+        * the stats.
+        */
+       if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
+               mutex_unlock(&ar->conf_mutex);
+               return -EAGAIN;
+       }
+
+       ret = ath11k_mac_get_fw_stats(ar, ar->pdev->pdev_id, 0,
+                                     WMI_REQUEST_PDEV_STAT);
+       if (ret) {
+               ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
+               goto err_fallback;
+       }
+
+       spin_lock_bh(&ar->data_lock);
+       pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
+                                       struct ath11k_fw_stats_pdev, list);
+       if (!pdev) {
+               spin_unlock_bh(&ar->data_lock);
+               goto err_fallback;
+       }
+
+       /* tx power is set as 2 units per dBm in FW. */
+       *dbm = pdev->chan_tx_power / 2;
+
+       spin_unlock_bh(&ar->data_lock);
+       mutex_unlock(&ar->conf_mutex);
+
+       ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n",
+                  pdev->chan_tx_power, *dbm);
+       return 0;
+
+err_fallback:
+       mutex_unlock(&ar->conf_mutex);
+       /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
+       *dbm = vif->bss_conf.txpower;
+       ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
+                  *dbm);
+       return 0;
+}
+
 static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
                                 struct ieee80211_vif *vif,
                                 struct ieee80211_scan_request *hw_req)
@@ -9079,81 +9214,6 @@ static void ath11k_mac_put_chain_rssi(struct station_info *sinfo,
        }
 }
 
-static void ath11k_mac_fw_stats_reset(struct ath11k *ar)
-{
-       spin_lock_bh(&ar->data_lock);
-       ath11k_fw_stats_pdevs_free(&ar->fw_stats.pdevs);
-       ath11k_fw_stats_vdevs_free(&ar->fw_stats.vdevs);
-       ar->fw_stats.num_vdev_recvd = 0;
-       ar->fw_stats.num_bcn_recvd = 0;
-       spin_unlock_bh(&ar->data_lock);
-}
-
-int ath11k_mac_fw_stats_request(struct ath11k *ar,
-                               struct stats_request_params *req_param)
-{
-       struct ath11k_base *ab = ar->ab;
-       unsigned long time_left;
-       int ret;
-
-       lockdep_assert_held(&ar->conf_mutex);
-
-       ath11k_mac_fw_stats_reset(ar);
-
-       reinit_completion(&ar->fw_stats_complete);
-       reinit_completion(&ar->fw_stats_done);
-
-       ret = ath11k_wmi_send_stats_request_cmd(ar, req_param);
-
-       if (ret) {
-               ath11k_warn(ab, "could not request fw stats (%d)\n",
-                           ret);
-               return ret;
-       }
-
-       time_left = wait_for_completion_timeout(&ar->fw_stats_complete, 1 * HZ);
-       if (!time_left)
-               return -ETIMEDOUT;
-
-       /* FW stats can get split when exceeding the stats data buffer limit.
-        * In that case, since there is no end marking for the back-to-back
-        * received 'update stats' event, we keep a 3 seconds timeout in case,
-        * fw_stats_done is not marked yet
-        */
-       time_left = wait_for_completion_timeout(&ar->fw_stats_done, 3 * HZ);
-       if (!time_left)
-               return -ETIMEDOUT;
-
-       return 0;
-}
-
-static int ath11k_mac_get_fw_stats(struct ath11k *ar, u32 pdev_id,
-                                  u32 vdev_id, u32 stats_id)
-{
-       struct ath11k_base *ab = ar->ab;
-       struct stats_request_params req_param;
-       int ret;
-
-       lockdep_assert_held(&ar->conf_mutex);
-
-       if (ar->state != ATH11K_STATE_ON)
-               return -ENETDOWN;
-
-       req_param.pdev_id = pdev_id;
-       req_param.vdev_id = vdev_id;
-       req_param.stats_id = stats_id;
-
-       ret = ath11k_mac_fw_stats_request(ar, &req_param);
-       if (ret)
-               ath11k_warn(ab, "failed to request fw stats: %d\n", ret);
-
-       ath11k_dbg(ab, ATH11K_DBG_WMI,
-                  "debug get fw stat pdev id %d vdev id %d stats id 0x%x\n",
-                  pdev_id, vdev_id, stats_id);
-
-       return ret;
-}
-
 static void ath11k_mac_op_sta_statistics(struct ieee80211_hw *hw,
                                         struct ieee80211_vif *vif,
                                         struct ieee80211_sta *sta,
@@ -9539,66 +9599,6 @@ exit:
        return ret;
 }
 
-static int ath11k_mac_op_get_txpower(struct ieee80211_hw *hw,
-                                    struct ieee80211_vif *vif,
-                                    unsigned int link_id,
-                                    int *dbm)
-{
-       struct ath11k *ar = hw->priv;
-       struct ath11k_base *ab = ar->ab;
-       struct ath11k_fw_stats_pdev *pdev;
-       int ret;
-
-       /* Final Tx power is minimum of Target Power, CTL power, Regulatory
-        * Power, PSD EIRP Power. We just know the Regulatory power from the
-        * regulatory rules obtained. FW knows all these power and sets the min
-        * of these. Hence, we request the FW pdev stats in which FW reports
-        * the minimum of all vdev's channel Tx power.
-        */
-       mutex_lock(&ar->conf_mutex);
-
-       /* Firmware doesn't provide Tx power during CAC hence no need to fetch
-        * the stats.
-        */
-       if (test_bit(ATH11K_CAC_RUNNING, &ar->dev_flags)) {
-               mutex_unlock(&ar->conf_mutex);
-               return -EAGAIN;
-       }
-
-       ret = ath11k_mac_get_fw_stats(ar, ar->pdev->pdev_id, 0,
-                                     WMI_REQUEST_PDEV_STAT);
-       if (ret) {
-               ath11k_warn(ab, "failed to request fw pdev stats: %d\n", ret);
-               goto err_fallback;
-       }
-
-       spin_lock_bh(&ar->data_lock);
-       pdev = list_first_entry_or_null(&ar->fw_stats.pdevs,
-                                       struct ath11k_fw_stats_pdev, list);
-       if (!pdev) {
-               spin_unlock_bh(&ar->data_lock);
-               goto err_fallback;
-       }
-
-       /* tx power is set as 2 units per dBm in FW. */
-       *dbm = pdev->chan_tx_power / 2;
-
-       spin_unlock_bh(&ar->data_lock);
-       mutex_unlock(&ar->conf_mutex);
-
-       ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware %d, reported %d dBm\n",
-                  pdev->chan_tx_power, *dbm);
-       return 0;
-
-err_fallback:
-       mutex_unlock(&ar->conf_mutex);
-       /* We didn't get txpower from FW. Hence, relying on vif->bss_conf.txpower */
-       *dbm = vif->bss_conf.txpower;
-       ath11k_dbg(ar->ab, ATH11K_DBG_MAC, "txpower from firmware NaN, reported %d dBm\n",
-                  *dbm);
-       return 0;
-}
-
 static int ath11k_mac_station_add(struct ath11k *ar,
                                  struct ieee80211_vif *vif,
                                  struct ieee80211_sta *sta)