RE: [PATCH] wifi: mwifiex: fix STA cannot connect to AP

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Francesco,

	This is the second patch. Sorry, it still sent to stable@xxxxxxxxxxxxxxx. I will correct it next time.

Thanks,
David

> -----Original Message-----
> From: David Lin <yu-hao.lin@xxxxxxx>
> Sent: Thursday, December 7, 2023 4:39 PM
> To: francesco@xxxxxxxxxx
> Cc: Pete Hsieh <tsung-hsien.hsieh@xxxxxxx>; David Lin
> <yu-hao.lin@xxxxxxx>; stable@xxxxxxxxxxxxxxx
> Subject: [PATCH] wifi: mwifiex: fix STA cannot connect to AP
> 
> 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@xxxxxxx>
> Fixes: 277b024e5e3d ("mwifiex: move under marvell vendor directory")
> Cc: stable@xxxxxxxxxxxxxxx
> ---
>  drivers/net/wireless/marvell/mwifiex/cfg80211.c | 2 ++
>  drivers/net/wireless/marvell/mwifiex/fw.h       | 1 +
>  drivers/net/wireless/marvell/mwifiex/ioctl.h    | 1 +
>  drivers/net/wireless/marvell/mwifiex/uap_cmd.c  | 8 ++++++++
>  4 files changed, 12 insertions(+)
> 
> diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> index 7a15ea8072e6..3604abcbcff9 100644
> --- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> +++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
> @@ -2047,6 +2047,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)
> diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h
> b/drivers/net/wireless/marvell/mwifiex/fw.h
> index 8e6db904e5b2..62f3c9a52a1d 100644
> --- a/drivers/net/wireless/marvell/mwifiex/fw.h
> +++ b/drivers/net/wireless/marvell/mwifiex/fw.h
> @@ -165,6 +165,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)
> diff --git a/drivers/net/wireless/marvell/mwifiex/ioctl.h
> b/drivers/net/wireless/marvell/mwifiex/ioctl.h
> index 091e7ca79376..8be3a2714bf7 100644
> --- a/drivers/net/wireless/marvell/mwifiex/ioctl.h
> +++ b/drivers/net/wireless/marvell/mwifiex/ioctl.h
> @@ -83,6 +83,7 @@ struct wep_key {
>  #define MWIFIEX_OPERATING_CLASSES		16
> 
>  struct mwifiex_uap_bss_param {
> +	u8 mac_addr[ETH_ALEN];
>  	u8 channel;
>  	u8 band_cfg;
>  	u16 rts_threshold;
> diff --git a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c
> b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c
> index e78a201cd150..491e36611909 100644
> --- a/drivers/net/wireless/marvell/mwifiex/uap_cmd.c
> +++ b/drivers/net/wireless/marvell/mwifiex/uap_cmd.c
> @@ -468,6 +468,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;
> @@ -487,6 +488,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);
> 
> base-commit: 783004b6dbda2cfe9a552a4cc9c1d168a2068f6c
> --
> 2.25.1






[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux