git: b71805e991fb - main - rtwn: add APIs for setting transmit power
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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;