git: b71805e991fb - main - rtwn: add APIs for setting transmit power

From: Adrian Chadd <adrian_at_FreeBSD.org>
Date: Wed, 18 Dec 2024 23:48:57 UTC
The branch main has been updated by adrian:

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

commit b71805e991fb955005640bdec81618e37d3af47c
Author:     Adrian Chadd <adrian@FreeBSD.org>
AuthorDate: 2024-12-07 16:32:04 +0000
Commit:     Adrian Chadd <adrian@FreeBSD.org>
CommitDate: 2024-12-18 23:45:24 +0000

    rtwn: add APIs for setting transmit power
    
    The RTL8188/RTL8192/RTL8821/RTL8812 NICs all seem happy to have
    their transmit power changed at runtime - and it does seem to do
    what's expected - the transmit power level does change.
    
    So, add the API call here, even though it's all currently no-ops.
    A follow-up commit will land changes for the chipsets to both
    limit transmit power to the configured / regulatory limit AND
    allow reconfiguration at runtime.
    
    Differential Revision:  https://reviews.freebsd.org/D47979
    Reviewed by:    bz, imp
---
 sys/dev/rtwn/if_rtwn.c                   | 9 +++++++++
 sys/dev/rtwn/if_rtwn_nop.h               | 6 ++++++
 sys/dev/rtwn/if_rtwnvar.h                | 4 ++++
 sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c | 1 +
 sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c | 1 +
 sys/dev/rtwn/rtl8192c/pci/r92ce_attach.c | 1 +
 sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c | 1 +
 sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c | 1 +
 sys/dev/rtwn/rtl8812a/usb/r12au_attach.c | 1 +
 sys/dev/rtwn/rtl8821a/usb/r21au_attach.c | 1 +
 10 files changed, 26 insertions(+)

diff --git a/sys/dev/rtwn/if_rtwn.c b/sys/dev/rtwn/if_rtwn.c
index d4b45aa9eea7..fdf44467680b 100644
--- a/sys/dev/rtwn/if_rtwn.c
+++ b/sys/dev/rtwn/if_rtwn.c
@@ -232,6 +232,7 @@ rtwn_attach(struct rtwn_softc *sc)
 		| IEEE80211_C_WME		/* 802.11e */
 		| IEEE80211_C_SWAMSDUTX		/* Do software A-MSDU TX */
 		| IEEE80211_C_FF		/* Atheros fast-frames */
+		| IEEE80211_C_TXPMGT		/* TX power control */
 		;
 
 	if (sc->sc_hwcrypto != RTWN_CRYPTO_SW) {
@@ -696,6 +697,14 @@ rtwn_ioctl_reset(struct ieee80211vap *vap, u_long cmd)
 	case IEEE80211_IOC_LDPC:
 		error = 0;
 		break;
+	case IEEE80211_IOC_TXPOWER:
+		{
+			struct rtwn_softc *sc = vap->iv_ic->ic_softc;
+			RTWN_LOCK(sc);
+			error = rtwn_set_tx_power(sc, vap);
+			RTWN_UNLOCK(sc);
+		}
+		break;
 	default:
 		error = ENETRESET;
 		break;
diff --git a/sys/dev/rtwn/if_rtwn_nop.h b/sys/dev/rtwn/if_rtwn_nop.h
index 4d7c63c87cd8..5e205617a12d 100644
--- a/sys/dev/rtwn/if_rtwn_nop.h
+++ b/sys/dev/rtwn/if_rtwn_nop.h
@@ -54,6 +54,12 @@ rtwn_nop_softc_vap(struct rtwn_softc *sc, struct ieee80211vap *vap)
 {
 }
 
+static __inline int
+rtwn_nop_int_softc_vap(struct rtwn_softc *sc, struct ieee80211vap *vap)
+{
+	return (0);
+}
+
 static __inline void
 rtwn_nop_softc_uint8_int(struct rtwn_softc *sc, uint8_t *buf, int len)
 {
diff --git a/sys/dev/rtwn/if_rtwnvar.h b/sys/dev/rtwn/if_rtwnvar.h
index 163ab6068ee6..3f14c05eb79d 100644
--- a/sys/dev/rtwn/if_rtwnvar.h
+++ b/sys/dev/rtwn/if_rtwnvar.h
@@ -366,6 +366,8 @@ struct rtwn_softc {
 	void		(*sc_init_antsel)(struct rtwn_softc *);
 	void		(*sc_post_init)(struct rtwn_softc *);
 	int		(*sc_init_bcnq1_boundary)(struct rtwn_softc *);
+	int		(*sc_set_tx_power)(struct rtwn_softc *,
+			    struct ieee80211vap *);
 
 	const uint8_t			*chan_list_5ghz[3];
 	int				chan_num_5ghz[3];
@@ -590,6 +592,8 @@ void	rtwn_suspend(struct rtwn_softc *);
 	(((_sc)->sc_post_init)((_sc)))
 #define rtwn_init_bcnq1_boundary(_sc) \
 	(((_sc)->sc_init_bcnq1_boundary)((_sc)))
+#define rtwn_set_tx_power(_sc, _vap) \
+	(((_sc)->sc_set_tx_power)((_sc), (_vap)))
 
 /*
  * Methods to access subfields in registers.
diff --git a/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c b/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c
index 060572f54800..e4c0027c39a5 100644
--- a/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c
+++ b/sys/dev/rtwn/rtl8188e/pci/r88ee_attach.c
@@ -191,6 +191,7 @@ r88ee_attach(struct rtwn_pci_softc *pc)
 	sc->sc_init_antsel		= rtwn_nop_softc;
 	sc->sc_post_init		= r88ee_post_init;
 	sc->sc_init_bcnq1_boundary	= rtwn_nop_int_softc;
+	sc->sc_set_tx_power		= rtwn_nop_int_softc_vap;
 
 	sc->mac_prog			= &rtl8188e_mac[0];
 	sc->mac_size			= nitems(rtl8188e_mac);
diff --git a/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c b/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c
index fcd26cd9a212..400c0a148f35 100644
--- a/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c
+++ b/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c
@@ -184,6 +184,7 @@ r88eu_attach(struct rtwn_usb_softc *uc)
 	sc->sc_init_antsel		= rtwn_nop_softc;
 	sc->sc_post_init		= r88eu_post_init;
 	sc->sc_init_bcnq1_boundary	= rtwn_nop_int_softc;
+	sc->sc_set_tx_power		= rtwn_nop_int_softc_vap;
 
 	sc->mac_prog			= &rtl8188e_mac[0];
 	sc->mac_size			= nitems(rtl8188e_mac);
diff --git a/sys/dev/rtwn/rtl8192c/pci/r92ce_attach.c b/sys/dev/rtwn/rtl8192c/pci/r92ce_attach.c
index 4c12403bf4fb..e992f1c50f26 100644
--- a/sys/dev/rtwn/rtl8192c/pci/r92ce_attach.c
+++ b/sys/dev/rtwn/rtl8192c/pci/r92ce_attach.c
@@ -221,6 +221,7 @@ r92ce_attach(struct rtwn_pci_softc *pc)
 	sc->sc_init_antsel		= rtwn_nop_softc;
 	sc->sc_post_init		= r92ce_post_init;
 	sc->sc_init_bcnq1_boundary	= rtwn_nop_int_softc;
+	sc->sc_set_tx_power		= rtwn_nop_int_softc_vap;
 
 	sc->mac_prog			= &rtl8192ce_mac[0];
 	sc->mac_size			= nitems(rtl8192ce_mac);
diff --git a/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c b/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c
index 8585333290bf..6482c933eec2 100644
--- a/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c
+++ b/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c
@@ -213,6 +213,7 @@ r92cu_attach(struct rtwn_usb_softc *uc)
 	sc->sc_init_antsel		= r92c_init_antsel;
 	sc->sc_post_init		= r92cu_post_init;
 	sc->sc_init_bcnq1_boundary	= rtwn_nop_int_softc;
+	sc->sc_set_tx_power		= rtwn_nop_int_softc_vap;
 
 	sc->mac_prog			= &rtl8192cu_mac[0];
 	sc->mac_size			= nitems(rtl8192cu_mac);
diff --git a/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c b/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c
index e0eadd72056b..c134ba22a430 100644
--- a/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c
+++ b/sys/dev/rtwn/rtl8192e/usb/r92eu_attach.c
@@ -164,6 +164,7 @@ r92eu_attach(struct rtwn_usb_softc *uc)
 	sc->sc_init_antsel		= rtwn_nop_softc;
 	sc->sc_post_init		= r92eu_post_init;
 	sc->sc_init_bcnq1_boundary	= rtwn_nop_int_softc;
+	sc->sc_set_tx_power		= rtwn_nop_int_softc_vap;
 
 	sc->mac_prog			= &rtl8192eu_mac[0];
 	sc->mac_size			= nitems(rtl8192eu_mac);
diff --git a/sys/dev/rtwn/rtl8812a/usb/r12au_attach.c b/sys/dev/rtwn/rtl8812a/usb/r12au_attach.c
index 70655092d1be..4b86461b2f25 100644
--- a/sys/dev/rtwn/rtl8812a/usb/r12au_attach.c
+++ b/sys/dev/rtwn/rtl8812a/usb/r12au_attach.c
@@ -251,6 +251,7 @@ r12au_attach(struct rtwn_usb_softc *uc)
 	sc->sc_init_antsel		= r12a_init_antsel;
 	sc->sc_post_init		= r12au_post_init;
 	sc->sc_init_bcnq1_boundary	= rtwn_nop_int_softc;
+	sc->sc_set_tx_power		= rtwn_nop_int_softc_vap;
 
 	sc->chan_list_5ghz[0]		= r12a_chan_5ghz_0;
 	sc->chan_list_5ghz[1]		= r12a_chan_5ghz_1;
diff --git a/sys/dev/rtwn/rtl8821a/usb/r21au_attach.c b/sys/dev/rtwn/rtl8821a/usb/r21au_attach.c
index 59fa183fd804..75d8f3669c12 100644
--- a/sys/dev/rtwn/rtl8821a/usb/r21au_attach.c
+++ b/sys/dev/rtwn/rtl8821a/usb/r21au_attach.c
@@ -237,6 +237,7 @@ r21au_attach(struct rtwn_usb_softc *uc)
 	sc->sc_init_antsel		= r12a_init_antsel;
 	sc->sc_post_init		= r12au_post_init;
 	sc->sc_init_bcnq1_boundary	= r21a_init_bcnq1_boundary;
+	sc->sc_set_tx_power		= rtwn_nop_int_softc_vap;
 
 	sc->chan_list_5ghz[0]		= r12a_chan_5ghz_0;
 	sc->chan_list_5ghz[1]		= r12a_chan_5ghz_1;