aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjoern A. Zeeb <bz@FreeBSD.org>2023-09-25 17:54:20 +0000
committerBjoern A. Zeeb <bz@FreeBSD.org>2023-10-09 23:14:53 +0000
commita99e7db072de1d50ba13ef917bf8f501eaf63834 (patch)
tree728f26a232cff5f9bf6f795c011b1209033191b9
parentf4f49fcba3c4258f30f1dc806e8610cbd43197cb (diff)
LinuxKPI: 802.11: fill regulatory_hint() with some life
Start implementing regulatory_hint() using a .c file based allocation helper function so we could change structures in the future with better chances to keep compatibility. This sets wiphy->regd needed by various LinuxKPI based WiFi drivers. Sponsored by: The FreeBSD Foundation Approved by: re (gjb) (cherry picked from commit 673d62fc359b0cb7a70af42c36d2fa54fb29452a) (cherry picked from commit a3e10c2b141879a68cff691f0176a2f6ac8ea04e)
-rw-r--r--sys/compat/linuxkpi/common/include/net/cfg80211.h20
-rw-r--r--sys/compat/linuxkpi/common/src/linux_80211.c10
2 files changed, 28 insertions, 2 deletions
diff --git a/sys/compat/linuxkpi/common/include/net/cfg80211.h b/sys/compat/linuxkpi/common/include/net/cfg80211.h
index 56ca9a231d2d..7e57ce67cc26 100644
--- a/sys/compat/linuxkpi/common/include/net/cfg80211.h
+++ b/sys/compat/linuxkpi/common/include/net/cfg80211.h
@@ -1260,6 +1260,8 @@ struct cfg80211_bss *linuxkpi_cfg80211_get_bss(struct wiphy *,
const uint8_t *, size_t, enum ieee80211_bss_type, enum ieee80211_privacy);
void linuxkpi_cfg80211_put_bss(struct wiphy *, struct cfg80211_bss *);
void linuxkpi_cfg80211_bss_flush(struct wiphy *);
+struct linuxkpi_ieee80211_regdomain *
+ lkpi_get_linuxkpi_ieee80211_regdomain(size_t);
/* -------------------------------------------------------------------------- */
@@ -1587,8 +1589,22 @@ regulatory_set_wiphy_regd(struct wiphy *wiphy,
static __inline int
regulatory_hint(struct wiphy *wiphy, const uint8_t *alpha2)
{
- TODO();
- return (-ENXIO);
+ struct linuxkpi_ieee80211_regdomain *regd;
+
+ if (wiphy->regd != NULL)
+ return (-EBUSY);
+
+ regd = lkpi_get_linuxkpi_ieee80211_regdomain(0);
+ if (regd == NULL)
+ return (-ENOMEM);
+
+ regd->alpha2[0] = alpha2[0];
+ regd->alpha2[1] = alpha2[1];
+ wiphy->regd = regd;
+
+ IMPROVE("are there flags who is managing? update net8011?");
+
+ return (0);
}
static __inline const char *
diff --git a/sys/compat/linuxkpi/common/src/linux_80211.c b/sys/compat/linuxkpi/common/src/linux_80211.c
index c8232e6f33cc..978a82ad2ceb 100644
--- a/sys/compat/linuxkpi/common/src/linux_80211.c
+++ b/sys/compat/linuxkpi/common/src/linux_80211.c
@@ -3954,6 +3954,16 @@ linuxkpi_ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
LKPI_80211_LHW_LVIF_UNLOCK(lhw);
}
+struct linuxkpi_ieee80211_regdomain *
+lkpi_get_linuxkpi_ieee80211_regdomain(size_t n)
+{
+ struct linuxkpi_ieee80211_regdomain *regd;
+
+ regd = kzalloc(sizeof(*regd) + n * sizeof(struct ieee80211_reg_rule),
+ GFP_KERNEL);
+ return (regd);
+}
+
int
linuxkpi_regulatory_set_wiphy_regd_sync(struct wiphy *wiphy,
struct linuxkpi_ieee80211_regdomain *regd)