From: Kirill A. Korinsky Subject: sys/qwx,sys/qwz: report RSSI as percentage To: OpenBSD tech Date: Wed, 20 May 2026 01:02:13 +0200 tech@, I think that Report RSSI as percentage, it is more user friendly than dBm. So, here I've used the same conversion logic as iwx for both qwz and qwx. Ok? Index: sys/dev/ic/qwx.c =================================================================== RCS file: /home/cvs/src/sys/dev/ic/qwx.c,v diff -u -p -r1.111 qwx.c --- sys/dev/ic/qwx.c 19 May 2026 10:36:02 -0000 1.111 +++ sys/dev/ic/qwx.c 19 May 2026 22:39:09 -0000 @@ -13534,6 +13534,7 @@ qwx_mgmt_rx_event(struct qwx_softc *sc, struct ieee80211_rxinfo rxi; struct ieee80211_frame *wh; struct ieee80211_node *ni; + int rssi, rssi_dbm; if (qwx_pull_mgmt_rx_params_tlv(sc, m, &rx_ev) != 0) { printf("%s: failed to extract mgmt rx event\n", @@ -13570,7 +13571,10 @@ qwx_mgmt_rx_event(struct qwx_softc *sc, } rxi.rxi_chan = rx_ev.channel; - rxi.rxi_rssi = rx_ev.snr + ATH11K_DEFAULT_NOISE_FLOOR; + rssi_dbm = rx_ev.snr + ATH11K_DEFAULT_NOISE_FLOOR; + rssi = (0 - QWX_MIN_DBM) + rssi_dbm; /* normalize */ + rssi = MIN(rssi, ic->ic_max_rssi); /* clip to max. 100% */ + rxi.rxi_rssi = rssi; #if 0 status->rate_idx = ath11k_mac_bitrate_to_idx(sband, rx_ev.rate / 100); #endif @@ -13627,7 +13631,7 @@ qwx_mgmt_rx_event(struct qwx_softc *sc, } tap->wr_rate = rx_ev.rate / 500; tap->wr_chan_flags = htole16(chan_flags); - tap->wr_dbm_antsignal = rxi.rxi_rssi; + tap->wr_dbm_antsignal = rssi_dbm; bpf_mtap_hdr(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m, BPF_DIRECTION_IN); @@ -16109,11 +16113,13 @@ qwx_dp_tx_complete_msdu(struct qwx_softc */ if (ts->status == HAL_WBM_TQM_REL_REASON_FRAME_ACKED && ts->ack_rssi != 0) { - int8_t rssi_dbm = (int8_t)ts->ack_rssi; + int rssi = (int8_t)ts->ack_rssi; if (!isset(sc->wmi.svc_map, WMI_TLV_SERVICE_HW_DB2DBM_CONVERSION_SUPPORT)) - rssi_dbm += ATH11K_DEFAULT_NOISE_FLOOR; - tx_data->ni->ni_rssi = rssi_dbm; + rssi += ATH11K_DEFAULT_NOISE_FLOOR; + rssi = (0 - QWX_MIN_DBM) + rssi; /* normalize */ + rssi = MIN(rssi, ic->ic_max_rssi); /* clip to max. 100% */ + tx_data->ni->ni_rssi = rssi; } ieee80211_release_node(ic, tx_data->ni); Index: sys/dev/ic/qwxreg.h =================================================================== RCS file: /home/cvs/src/sys/dev/ic/qwxreg.h,v diff -u -p -r1.12 qwxreg.h --- sys/dev/ic/qwxreg.h 4 Aug 2025 11:39:50 -0000 1.12 +++ sys/dev/ic/qwxreg.h 19 May 2026 22:28:22 -0000 @@ -89,6 +89,8 @@ enum ath11k_crypt_mode { /* Antenna noise floor */ #define ATH11K_DEFAULT_NOISE_FLOOR -95 +#define QWX_MIN_DBM -100 +#define QWX_MAX_DBM -33 /* realistic guess */ /* * wmi.h Index: sys/dev/ic/qwz.c =================================================================== RCS file: /home/cvs/src/sys/dev/ic/qwz.c,v diff -u -p -r1.33 qwz.c --- sys/dev/ic/qwz.c 19 May 2026 21:15:21 -0000 1.33 +++ sys/dev/ic/qwz.c 19 May 2026 22:36:42 -0000 @@ -11636,6 +11636,7 @@ qwz_mgmt_rx_event(struct qwz_softc *sc, struct ieee80211_rxinfo rxi; struct ieee80211_frame *wh; struct ieee80211_node *ni; + int rssi; if (qwz_pull_mgmt_rx_params_tlv(sc, m, &rx_ev) != 0) { printf("%s: failed to extract mgmt rx event\n", @@ -11672,7 +11673,10 @@ qwz_mgmt_rx_event(struct qwz_softc *sc, } rxi.rxi_chan = rx_ev.channel; - rxi.rxi_rssi = rx_ev.snr + ATH12K_DEFAULT_NOISE_FLOOR; + rssi = rx_ev.snr + ATH12K_DEFAULT_NOISE_FLOOR; + rssi = (0 - QWZ_MIN_DBM) + rssi; /* normalize */ + rssi = MIN(rssi, ic->ic_max_rssi); /* clip to max. 100% */ + rxi.rxi_rssi = rssi; #if 0 status->rate_idx = ath12k_mac_bitrate_to_idx(sband, rx_ev.rate / 100); #endif Index: sys/dev/ic/qwzreg.h =================================================================== RCS file: /home/cvs/src/sys/dev/ic/qwzreg.h,v diff -u -p -r1.15 qwzreg.h --- sys/dev/ic/qwzreg.h 18 May 2026 13:47:32 -0000 1.15 +++ sys/dev/ic/qwzreg.h 19 May 2026 22:28:22 -0000 @@ -83,6 +83,8 @@ enum ath12k_crypt_mode { /* Antenna noise floor */ #define ATH12K_DEFAULT_NOISE_FLOOR -95 +#define QWZ_MIN_DBM -100 +#define QWZ_MAX_DBM -33 /* realistic guess */ /* * wmi.h Index: sys/dev/pci/if_qwx_pci.c =================================================================== RCS file: /home/cvs/src/sys/dev/pci/if_qwx_pci.c,v diff -u -p -r1.33 if_qwx_pci.c --- sys/dev/pci/if_qwx_pci.c 19 May 2026 08:57:27 -0000 1.33 +++ sys/dev/pci/if_qwx_pci.c 19 May 2026 22:28:22 -0000 @@ -1105,6 +1105,8 @@ unsupported_wcn6855_soc: /* IBSS channel undefined for now. */ ic->ic_ibss_chan = &ic->ic_channels[1]; + ic->ic_max_rssi = QWX_MAX_DBM - QWX_MIN_DBM; + ifp->if_softc = sc; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = qwx_ioctl; Index: sys/dev/pci/if_qwz_pci.c =================================================================== RCS file: /home/cvs/src/sys/dev/pci/if_qwz_pci.c,v diff -u -p -r1.11 if_qwz_pci.c --- sys/dev/pci/if_qwz_pci.c 18 May 2026 13:47:32 -0000 1.11 +++ sys/dev/pci/if_qwz_pci.c 19 May 2026 22:28:22 -0000 @@ -983,6 +983,8 @@ qwz_pci_attach(struct device *parent, st /* IBSS channel undefined for now. */ ic->ic_ibss_chan = &ic->ic_channels[1]; + ic->ic_max_rssi = QWZ_MAX_DBM - QWZ_MIN_DBM; + ifp->if_softc = sc; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = qwz_ioctl; -- wbr, Kirill