wifi: brcmfmac: add per-vendor feature detection callback
authorArend van Spriel <arend.vanspriel@broadcom.com>
Wed, 3 Jan 2024 09:57:02 +0000 (10:57 +0100)
committerKalle Valo <kvalo@kernel.org>
Fri, 19 Jan 2024 17:28:27 +0000 (19:28 +0200)
Adding a .feat_attach() callback allowing per-vendor overrides
of the driver feature flags. In this patch the callback is only
provided by BCA vendor to disable SAE feature as it has not been
confirmed yet. BCA chips generally do not have the in-driver
supplicant (idsup) feature so they rely on NL80211_CMD_EXTERNAL_AUTH
to trigger user-space authentication.

Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20240103095704.135651-3-arend.vanspriel@broadcom.com
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bca/core.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/feature.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwvid.h

index ac3a36fa3640ced10a25231bb1922b1782618df0..a5d9ac5e676384caae37acb27e7f735150becff4 100644 (file)
@@ -7,6 +7,7 @@
 #include <core.h>
 #include <bus.h>
 #include <fwvid.h>
+#include <feature.h>
 
 #include "vops.h"
 
@@ -21,7 +22,14 @@ static void brcmf_bca_detach(struct brcmf_pub *drvr)
        pr_err("%s: executing\n", __func__);
 }
 
+static void brcmf_bca_feat_attach(struct brcmf_if *ifp)
+{
+       /* SAE support not confirmed so disabling for now */
+       ifp->drvr->feat_flags &= ~BIT(BRCMF_FEAT_SAE);
+}
+
 const struct brcmf_fwvid_ops brcmf_bca_ops = {
        .attach = brcmf_bca_attach,
        .detach = brcmf_bca_detach,
+       .feat_attach = brcmf_bca_feat_attach,
 };
index 7348f73680d633a07750a373cc084f60ecb1143e..7fef93ede0fb30d2c230ae0032a8fe39ee5fe52c 100644 (file)
@@ -13,6 +13,7 @@
 #include "debug.h"
 #include "fwil.h"
 #include "fwil_types.h"
+#include "fwvid.h"
 #include "feature.h"
 #include "common.h"
 
@@ -339,6 +340,8 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
        brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_FWSUP, "sup_wpa");
        brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_SCAN_V2, "scan_ver");
 
+       brcmf_fwvid_feat_attach(ifp);
+
        if (drvr->settings->feature_disable) {
                brcmf_dbg(INFO, "Features: 0x%02x, disable: 0x%02x\n",
                          ifp->drvr->feat_flags,
index 43df58bb70ad33e3616f66eaa92ab2ef5161b929..17fbdbb76f51b729ed22d0ca2f295a66d3568042 100644 (file)
@@ -8,10 +8,12 @@
 #include "firmware.h"
 
 struct brcmf_pub;
+struct brcmf_if;
 
 struct brcmf_fwvid_ops {
        int (*attach)(struct brcmf_pub *drvr);
        void (*detach)(struct brcmf_pub *drvr);
+       void (*feat_attach)(struct brcmf_if *ifp);
 };
 
 /* exported functions */
@@ -44,4 +46,14 @@ static inline void brcmf_fwvid_detach(struct brcmf_pub *drvr)
        brcmf_fwvid_detach_ops(drvr);
 }
 
+static inline void brcmf_fwvid_feat_attach(struct brcmf_if *ifp)
+{
+       const struct brcmf_fwvid_ops *vops = ifp->drvr->vops;
+
+       if (!vops->feat_attach)
+               return;
+
+       vops->feat_attach(ifp);
+}
+
 #endif /* FWVID_H_ */