Search Linux Wireless

Re: [PATCH 03/21] wil6210: support up to 20 stations in AP mode

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

 



Maya Erez <merez@xxxxxxxxxxxxxx> writes:

> From: Ahmad Masri <amasri@xxxxxxxxxxxxxx>
>
> New FW added support for upto 20 clients in AP mode. Change the driver
> to support this as well. FW reports it's max supported associations in
> WMI_READY_EVENT. Some WMI commands/events use cidxtid field which is
> limited to 16 cids. Use new cid/tid fields instead.
>
> For Rx packets cid from rx descriptor is limited to 3 bits (0..7),
> to find the real cid, compare transmitter address with the stored
> stations mac address in the driver sta array.
>
> EDMA FW still supports 8 stations. Extending the support to 20
> stations will come later.
>
> Signed-off-by: Ahmad Masri <amasri@xxxxxxxxxxxxxx>
> Signed-off-by: Maya Erez <merez@xxxxxxxxxxxxxx>

[...]


> --- a/drivers/net/wireless/ath/wil6210/wmi.c
> +++ b/drivers/net/wireless/ath/wil6210/wmi.c
> @@ -24,8 +24,9 @@
>  #include "wmi.h"
>  #include "trace.h"
>  
> -static uint max_assoc_sta = WIL6210_MAX_CID;
> -module_param(max_assoc_sta, uint, 0644);
> +/* set the default max assoc sta to max supported by driver */
> +uint max_assoc_sta = WIL6210_MAX_CID;
> +module_param(max_assoc_sta, uint, 0444);
>  MODULE_PARM_DESC(max_assoc_sta, " Max number of stations associated to the AP");
>  
>  int agg_wsize; /* = 0; */
> @@ -770,6 +771,7 @@ static void wmi_evt_ready(struct wil6210_vif *vif, int id, void *d, int len)
>  	struct wil6210_priv *wil = vif_to_wil(vif);
>  	struct wiphy *wiphy = wil_to_wiphy(wil);
>  	struct wmi_ready_event *evt = d;
> +	u8 fw_max_assoc_sta;
>  
>  	wil_info(wil, "FW ver. %s(SW %d); MAC %pM; %d MID's\n",
>  		 wil->fw_version, le32_to_cpu(evt->sw_version),
> @@ -787,6 +789,25 @@ static void wmi_evt_ready(struct wil6210_vif *vif, int id, void *d, int len)
>  			    evt->rfc_read_calib_result);
>  		wil->fw_calib_result = evt->rfc_read_calib_result;
>  	}
> +
> +	fw_max_assoc_sta = WIL6210_RX_DESC_MAX_CID;
> +	if (len > offsetof(struct wmi_ready_event, max_assoc_sta) &&
> +	    evt->max_assoc_sta > 0) {
> +		fw_max_assoc_sta = evt->max_assoc_sta;
> +		wil_dbg_wmi(wil, "fw reported max assoc sta %d\n",
> +			    fw_max_assoc_sta);
> +
> +		if (fw_max_assoc_sta > WIL6210_MAX_CID) {
> +			wil_dbg_wmi(wil,
> +				    "fw max assoc sta %d exceeds max driver supported %d\n",
> +				    fw_max_assoc_sta, WIL6210_MAX_CID);
> +			fw_max_assoc_sta = WIL6210_MAX_CID;
> +		}
> +	}
> +
> +	max_assoc_sta = min_t(uint, max_assoc_sta, fw_max_assoc_sta);

You shouldn't modify max_assoc_sta like this. If you have two wil6210
devices on the same host they will share that variable and there's a
race condition. Sure, I guess currently they will use the same firmware
so the values will be the same, but still this is a bug. I think you
should have wil->max_assoc_sta to make this device specific value.

I'll apply this anyway as it breaks all other patches if I remove this
patch. But please fix this in a follow up patch.

-- 
Kalle Valo



[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux