]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
wifi: mwifiex: keep mwifiex_cfg80211_ops constant
authorSascha Hauer <s.hauer@pengutronix.de>
Fri, 9 Aug 2024 09:51:48 +0000 (11:51 +0200)
committerKalle Valo <kvalo@kernel.org>
Fri, 16 Aug 2024 10:07:03 +0000 (13:07 +0300)
With host_mlme support being added mwifiex_cfg80211_ops is no longer
constant, but supplemented with the host_mlme related ops when host_mlme
support is enabled. This doesn't work with multiple adapters when only
few of then have host_mlme support. Duplicate mwifiex_cfg80211_ops
before using it and keep the original constant.

While at it mark mwifiex_cfg80211_ops const to prevent people from
changing it again during runtime.

Fixes: 36995892c271c ("wifi: mwifiex: add host mlme for client mode")
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com>
Acked-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://patch.msgid.link/20240809-mwifiex-duplicate-mwifiex_cfg80211_ops-v1-1-23e0e6290ace@pengutronix.de
drivers/net/wireless/marvell/mwifiex/cfg80211.c

index 722ead51e9123cfbccc180404c4e130b78d3457f..e36ef075fe053a4db98272800ace3878aa3e738c 100644 (file)
@@ -4570,7 +4570,7 @@ mwifiex_cfg80211_probe_client(struct wiphy *wiphy,
 }
 
 /* station cfg80211 operations */
-static struct cfg80211_ops mwifiex_cfg80211_ops = {
+static const struct cfg80211_ops mwifiex_cfg80211_ops = {
        .add_virtual_intf = mwifiex_add_virtual_intf,
        .del_virtual_intf = mwifiex_del_virtual_intf,
        .change_virtual_intf = mwifiex_cfg80211_change_virtual_intf,
@@ -4705,24 +4705,28 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
        struct mwifiex_private *priv = adapter->priv[MWIFIEX_BSS_TYPE_STA];
        u8 *country_code;
        u32 thr, retry;
+       struct cfg80211_ops *ops;
+
+       ops = devm_kmemdup(adapter->dev, &mwifiex_cfg80211_ops,
+                          sizeof(mwifiex_cfg80211_ops), GFP_KERNEL);
+       if (!ops)
+               return -ENOMEM;
 
        /* create a new wiphy for use with cfg80211 */
-       wiphy = wiphy_new(&mwifiex_cfg80211_ops,
-                         sizeof(struct mwifiex_adapter *));
+       wiphy = wiphy_new(ops, sizeof(struct mwifiex_adapter *));
        if (!wiphy) {
                mwifiex_dbg(adapter, ERROR,
                            "%s: creating new wiphy\n", __func__);
                return -ENOMEM;
        }
        if (adapter->host_mlme_enabled) {
-               mwifiex_cfg80211_ops.auth = mwifiex_cfg80211_authenticate;
-               mwifiex_cfg80211_ops.assoc = mwifiex_cfg80211_associate;
-               mwifiex_cfg80211_ops.deauth = mwifiex_cfg80211_deauthenticate;
-               mwifiex_cfg80211_ops.disassoc = mwifiex_cfg80211_disassociate;
-               mwifiex_cfg80211_ops.disconnect = NULL;
-               mwifiex_cfg80211_ops.connect = NULL;
-               mwifiex_cfg80211_ops.probe_client =
-                       mwifiex_cfg80211_probe_client;
+               ops->auth = mwifiex_cfg80211_authenticate;
+               ops->assoc = mwifiex_cfg80211_associate;
+               ops->deauth = mwifiex_cfg80211_deauthenticate;
+               ops->disassoc = mwifiex_cfg80211_disassociate;
+               ops->disconnect = NULL;
+               ops->connect = NULL;
+               ops->probe_client = mwifiex_cfg80211_probe_client;
        }
        wiphy->max_scan_ssids = MWIFIEX_MAX_SSID_LIST_LENGTH;
        wiphy->max_scan_ie_len = MWIFIEX_MAX_VSIE_LEN;