The branch main has been updated by bz:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=3f8cfb8a3a3b9fbe6d4aebde81aee80f8e89e2ea

commit 3f8cfb8a3a3b9fbe6d4aebde81aee80f8e89e2ea
Author:     Bjoern A. Zeeb <b...@freebsd.org>
AuthorDate: 2025-01-25 11:00:23 +0000
Commit:     Bjoern A. Zeeb <b...@freebsd.org>
CommitDate: 2025-02-26 02:10:55 +0000

    iwlwifi: bring in some of the rs code
    
    Bring in code to call into rs-fw.c functionality for firmware
    supported rate select.
    
    Anything before AX200 (firmware matching iwlwiif-[0-9]*.ucode) will
    still need further implementation, and so does iwl_mvm_rs_tx_status().
    These bits marked with compat.linuxkpi.80211.debug TODO()s for now.
    
    Implement some lindebugfs bits to gather more statistical information.
    
    Sponsored by:   The FreeBSD Foundation
    Obtained from:  bz_wifi_11n branch (partially)
    MFC after:      3 days
---
 sys/contrib/dev/iwlwifi/mvm/rs.c | 133 +++++++++++++++++++++++++++++++++++----
 sys/contrib/dev/iwlwifi/mvm/rs.h |   9 ++-
 2 files changed, 128 insertions(+), 14 deletions(-)

diff --git a/sys/contrib/dev/iwlwifi/mvm/rs.c b/sys/contrib/dev/iwlwifi/mvm/rs.c
index 981686e66920..f460624871ee 100644
--- a/sys/contrib/dev/iwlwifi/mvm/rs.c
+++ b/sys/contrib/dev/iwlwifi/mvm/rs.c
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2020-2021 The FreeBSD Foundation
+ * Copyright (c) 2020-2025 The FreeBSD Foundation
  *
  * This software was developed by Björn Zeeb under sponsorship from
  * the FreeBSD Foundation.
@@ -33,42 +33,123 @@
  * This file is left as a wrapper to make mvm compile and we will only
  * deal with it on a need basis.  Most newer chipsets do this in firmware.
  */
+#include <sys/param.h>
+#include <net/cfg80211.h>              /* LinuxKPI 802.11 TODO() calls. */
 
-#include <sys/errno.h>
-
+#include "rs.h"
 #include "mvm.h"
 
 #ifdef CONFIG_IWLWIFI_DEBUGFS
+/*
+ * Fill struct iwl_mvm_frame_stats.
+ * Deal with various RATE_MCS_*_MSK. See rx.c, fw/api/rs.h, et al.
+ * XXX-BZ consider calling iwl_new_rate_from_v1() in rx.c so we can also
+ * use this in rxmq.c.
+ */
 void
 iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg)
 {
-
+       uint8_t nss;
+
+       spin_lock_bh(&mvm->drv_stats_lock);
+       mvm->drv_rx_stats.success_frames++;
+
+       if (rate & RATE_MCS_HT_MSK_V1) {
+               mvm->drv_rx_stats.ht_frames++;
+               nss = 1 + ((rate & RATE_HT_MCS_NSS_MSK_V1) >> 
RATE_HT_MCS_NSS_POS_V1);
+       } else if (rate & RATE_MCS_VHT_MSK_V1) {
+               mvm->drv_rx_stats.vht_frames++;
+               nss = 1 + FIELD_GET(RATE_MCS_NSS_MSK, rate);
+       } else {
+               mvm->drv_rx_stats.legacy_frames++;
+               nss = 0;
+       }
+
+       switch (rate & RATE_MCS_CHAN_WIDTH_MSK_V1) {
+       case RATE_MCS_CHAN_WIDTH_20:
+               mvm->drv_rx_stats.bw_20_frames++;
+               break;
+       case RATE_MCS_CHAN_WIDTH_40:
+               mvm->drv_rx_stats.bw_40_frames++;
+               break;
+       case RATE_MCS_CHAN_WIDTH_80:
+               mvm->drv_rx_stats.bw_80_frames++;
+               break;
+       case RATE_MCS_CHAN_WIDTH_160:
+               mvm->drv_rx_stats.bw_160_frames++;
+               break;
+       }
+
+       if ((rate & RATE_MCS_CCK_MSK_V1) == 0 &&
+           (rate & RATE_MCS_SGI_MSK_V1) != 0)
+               mvm->drv_rx_stats.sgi_frames++;
+       else
+               mvm->drv_rx_stats.ngi_frames++;
+
+       switch (nss) {
+       case 1:
+               mvm->drv_rx_stats.siso_frames++;
+               break;
+       case 2:
+               mvm->drv_rx_stats.mimo2_frames++;
+               break;
+       }
+
+       if (agg)
+               mvm->drv_rx_stats.agg_frames++;
+
+       /* ampdu_count? */
+       /* fail_frames? */
+
+       mvm->drv_rx_stats.last_rates[mvm->drv_rx_stats.last_frame_idx] = rate;
+       mvm->drv_rx_stats.last_frame_idx++;
+       mvm->drv_rx_stats.last_frame_idx %=
+           ARRAY_SIZE(mvm->drv_rx_stats.last_rates);
+
+       spin_unlock_bh(&mvm->drv_stats_lock);
 }
 
 void
 iwl_mvm_reset_frame_stats(struct iwl_mvm *mvm)
 {
-
+       /* Apply same locking rx.c does; debugfs seems to read unloked? */
+       spin_lock_bh(&mvm->drv_stats_lock);
+       memset(&mvm->drv_rx_stats, 0, sizeof(mvm->drv_rx_stats));
+       spin_unlock_bh(&mvm->drv_stats_lock);
 }
 #endif
 
 int
 iwl_mvm_rate_control_register(void)
 {
-
+       TODO("This likely has to call into net80211 unless we gain compat code 
in LinuxKPI");
        return (0);
 }
 
-int
-iwl_mvm_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *sta, bool 
enable)
+void
+iwl_mvm_rate_control_unregister(void)
 {
+       TODO("This likely has to call into net80211 unless we gain compat code 
in LinuxKPI");
+}
 
-       return (0);
+int
+iwl_mvm_tx_protection(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta, bool 
enable)
+{
+       if (iwl_mvm_has_tlc_offload(mvm))
+               return (rs_fw_tx_protection(mvm, mvmsta, enable));
+        else {
+               TODO();
+               return (0);
+       }
 }
 
-void
-iwl_mvm_rate_control_unregister(void)
+static void
+iwl_mvm_rs_sw_rate_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
+    struct ieee80211_sta *sta,
+    struct ieee80211_bss_conf *link_conf, struct ieee80211_link_sta *link_sta,
+    enum nl80211_band band)
 {
+       TODO();
 }
 
 void
@@ -77,18 +158,28 @@ iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct 
ieee80211_vif *vif,
     struct ieee80211_bss_conf *link_conf, struct ieee80211_link_sta *link_sta,
     enum nl80211_band band)
 {
+       if (iwl_mvm_has_tlc_offload(mvm))
+               iwl_mvm_rs_fw_rate_init(mvm, vif, sta, link_conf, link_sta, 
band);
+       else
+               iwl_mvm_rs_sw_rate_init(mvm, vif, sta, link_conf, link_sta, 
band);
 }
 
 void
 iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta, int tid,
     struct ieee80211_tx_info *ba_info, bool t)
 {
+       TODO();
 }
 
 void
-rs_update_last_rssi(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
+rs_update_last_rssi(struct iwl_mvm *mvm __unused, struct iwl_mvm_sta *mvmsta,
     struct ieee80211_rx_status *rx_status)
 {
+       struct iwl_lq_sta *lq_sta;
+       int i;
+
+       if (mvmsta == NULL || rx_status == NULL)
+               return;
 
        /*
         * Assumption based on mvm/sta.h is that this should update
@@ -96,12 +187,28 @@ rs_update_last_rssi(struct iwl_mvm *mvm, struct 
iwl_mvm_sta *mvmsta,
         * access in that struct so nowhere to put rssi information.
         * So the only thing would be if this is required internally
         * to functions in this file.
+        * The "FW" version accesses more fields.  We assume they
+        * are the same for now.
         */
+
+       lq_sta = &mvmsta->deflink.lq_sta.rs_drv;
+
+       lq_sta->pers.last_rssi = S8_MIN;
+       lq_sta->pers.chains = rx_status->chains;
+
+       for (i = 0; i < nitems(lq_sta->pers.chain_signal); i++) {
+               if ((rx_status->chains & BIT(i)) == 0)
+                       continue;
+
+               lq_sta->pers.chain_signal[i] = rx_status->chain_signal[i];
+               if (rx_status->chain_signal[i] > lq_sta->pers.last_rssi)
+                       lq_sta->pers.last_rssi = rx_status->chain_signal[i];
+       }
 }
 
 int
 rs_pretty_print_rate_v1(char *buf, int bufsz, const u32 rate)
 {
-
+       TODO();
        return (0);
 }
diff --git a/sys/contrib/dev/iwlwifi/mvm/rs.h b/sys/contrib/dev/iwlwifi/mvm/rs.h
index a9b10b841f95..71c0744f017c 100644
--- a/sys/contrib/dev/iwlwifi/mvm/rs.h
+++ b/sys/contrib/dev/iwlwifi/mvm/rs.h
@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 2020-2021 The FreeBSD Foundation
+ * Copyright (c) 2020-2025 The FreeBSD Foundation
  *
  * This software was developed by Björn Zeeb under sponsorship from
  * the FreeBSD Foundation.
@@ -69,6 +69,13 @@ struct iwl_lq_sta {
        struct {
                spinlock_t      lock;
                uint16_t        max_agg_bufsize;
+               /*
+                * Based on the assumption that these are in "FW" too and
+                * there is a f() to set last_rssi add them here too.
+                */
+               uint8_t         chains;
+               uint8_t         chain_signal[IEEE80211_MAX_CHAINS];
+               uint8_t         last_rssi;
        } pers;
 };
 

Reply via email to