]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: mwifiex: configure BSSID consistently when starting AP
authorDavid Lin <yu-hao.lin@nxp.com>
Fri, 15 Dec 2023 00:51:18 +0000 (08:51 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Jan 2024 22:52:49 +0000 (14:52 -0800)
commit f0dd488e11e71ac095df7638d892209c629d9af2 upstream.

AP BSSID configuration is missing at AP start.  Without this fix, FW returns
STA interface MAC address after first init.  When hostapd restarts, it gets MAC
address from netdev before driver sets STA MAC to netdev again. Now MAC address
between hostapd and net interface are different causes STA cannot connect to
AP.  After that MAC address of uap0 mlan0 become the same. And issue disappears
after following hostapd restart (another issue is AP/STA MAC address become the
same).

This patch fixes the issue cleanly.

Signed-off-by: David Lin <yu-hao.lin@nxp.com>
Fixes: 12190c5d80bd ("mwifiex: add cfg80211 start_ap and stop_ap handlers")
Cc: stable@vger.kernel.org
Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com>
Tested-by: Rafael Beims <rafael.beims@toradex.com> # Verdin iMX8MP/SD8997 SD
Acked-by: Brian Norris <briannorris@chromium.org>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://msgid.link/20231215005118.17031-1-yu-hao.lin@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/wireless/marvell/mwifiex/cfg80211.c
drivers/net/wireless/marvell/mwifiex/fw.h
drivers/net/wireless/marvell/mwifiex/ioctl.h
drivers/net/wireless/marvell/mwifiex/uap_cmd.c

index 97f0f39364d67c513842fd0c8a99d7ae21bbabec..109b1bef4c707dcb7710380c133174291f011f3a 100644 (file)
@@ -1980,6 +1980,8 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy,
 
        mwifiex_set_sys_config_invalid_data(bss_cfg);
 
+       memcpy(bss_cfg->mac_addr, priv->curr_addr, ETH_ALEN);
+
        if (params->beacon_interval)
                bss_cfg->beacon_period = params->beacon_interval;
        if (params->dtim_period)
index 2ff23ab259ab38d1049d6c7c6a1e1b9a0f378142..29140949c01caeefcff10c3aeb1df31ec073c5d8 100644 (file)
@@ -177,6 +177,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
 #define TLV_TYPE_STA_MAC_ADDR       (PROPRIETARY_TLV_BASE_ID + 32)
 #define TLV_TYPE_BSSID              (PROPRIETARY_TLV_BASE_ID + 35)
 #define TLV_TYPE_CHANNELBANDLIST    (PROPRIETARY_TLV_BASE_ID + 42)
+#define TLV_TYPE_UAP_MAC_ADDRESS    (PROPRIETARY_TLV_BASE_ID + 43)
 #define TLV_TYPE_UAP_BEACON_PERIOD  (PROPRIETARY_TLV_BASE_ID + 44)
 #define TLV_TYPE_UAP_DTIM_PERIOD    (PROPRIETARY_TLV_BASE_ID + 45)
 #define TLV_TYPE_UAP_BCAST_SSID     (PROPRIETARY_TLV_BASE_ID + 48)
index 3db449efa167cbbd61026eebe2e88fb73fa2a5ba..cdb5b3881782ff2a00c28e582c3a9865efebd851 100644 (file)
@@ -119,6 +119,7 @@ struct mwifiex_uap_bss_param {
        u8 qos_info;
        u8 power_constraint;
        struct mwifiex_types_wmm_info wmm_info;
+       u8 mac_addr[ETH_ALEN];
 };
 
 enum {
index 18e89777b78412cd0e431ab292fce8df50753855..82aa6f0469a1b3a9a15908e9f754788e371f3311 100644 (file)
@@ -480,6 +480,7 @@ void mwifiex_config_uap_11d(struct mwifiex_private *priv,
 static int
 mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size)
 {
+       struct host_cmd_tlv_mac_addr *mac_tlv;
        struct host_cmd_tlv_dtim_period *dtim_period;
        struct host_cmd_tlv_beacon_period *beacon_period;
        struct host_cmd_tlv_ssid *ssid;
@@ -499,6 +500,13 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size)
        int i;
        u16 cmd_size = *param_size;
 
+       mac_tlv = (struct host_cmd_tlv_mac_addr *)tlv;
+       mac_tlv->header.type = cpu_to_le16(TLV_TYPE_UAP_MAC_ADDRESS);
+       mac_tlv->header.len = cpu_to_le16(ETH_ALEN);
+       memcpy(mac_tlv->mac_addr, bss_cfg->mac_addr, ETH_ALEN);
+       cmd_size += sizeof(struct host_cmd_tlv_mac_addr);
+       tlv += sizeof(struct host_cmd_tlv_mac_addr);
+
        if (bss_cfg->ssid.ssid_len) {
                ssid = (struct host_cmd_tlv_ssid *)tlv;
                ssid->header.type = cpu_to_le16(TLV_TYPE_UAP_SSID);