Search Linux Wireless

Re: [PATCH v6 2/5] mt76: mt76x02: split beaconing

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

 



On Wed, Nov 20, 2019 at 11:27:55PM +0100, Markus Theil wrote:
> >> -	}
> >> -
> >> -	for (i = bcn_idx; i < ARRAY_SIZE(dev->beacons); i++) {
> >> -		if (!(dev->beacon_data_mask & BIT(i)))
> >> -			break;
> >> -
> >> -		__mt76x02_mac_set_beacon(dev, i, NULL);
> >> -	}
> >>  
> >>  	mt76_rmw_field(dev, MT_MAC_BSSID_DW1, MT_MAC_BSSID_DW1_MBEACON_N,
> >>  		       bcn_idx - 1);
> >> +
> >> +	mt76_wr(dev, MT_BCN_BYPASS_MASK, 0xff00 | ~dev->beacon_data_mask);
> > I'm not sure if this is correct for multi bss.
> >
> > In MT7620 manual BCM_BAYPASS_MASK is described as below:
> >
> > "
> > Directly bypasses the Tx Beacon frame with the  specified 
> > Beacon number. Bit0=Nth Beacon, bit1=(N- 1)th Beacon,... etc.
> > N is the number of  Beacons defined in the  MULTI_BCN_NUM field in the 
> > MAC_BSSID_DW1(offset: 0x1014) register.
> > 0: Disable
> > 1: Enable
> > "
> >
> > Assuming manual is correct (it could be wrong) bypass mask should be
> > calculated differently.
> >
> > Stanislaw
> >
> I tested the updated code with my usb nic and an mbss with 2 ap vifs.
> Both beacons were transmitted. Maybe the manual is wrong in this place.

If MAC_BSSID_DW1_MBEACON_N is set to 1 (2 beacons) according to manual
bit0 is for second beacon slot and bit1 is for first beacon slot.
Those bits are both marked at once, so no problem will happen.

Problem may happen when you remove first vif/beacon. Then you will
have bit1 marked in ->beacon_data_mask . But bit0 will be expect
in BCM_BAYPASS_MASK by hardware (when MAC_BSSID_DW1_MBEACON_N=0)

This scenarios can be extended to more vifs. So if you no longer 
use bcn_idx and use vif_idx directly to point beacon slot/address.
(ie. before for vif_idx 0,4,6, bcn_idx were 0,1,2 now there
will be 0,4,6). You need to specify 7 (8 beacons) in
MT_MAC_BSSID_DW1_MBEACON_N, and set bypass mask accordingly.
For example:

	mt76_rmw_field(dev, MT_MAC_BSSID_DW1, MT_MAC_BSSID_DW1_MBEACON_N, 7);
	mask = 0;
	for (i = 0; i < 8; i++)
		if (dev->beacons[i])
			mask |= BIT(7 - i);

	mt76_wr(dev, MT_BCN_BYPASS_MASK, 0xff00 | ~mask);

But again, this have to be tested. Ideally on mmio hardware which
support more bssid's or on usb hardware with temporally increased
num of bss limitation.

Stanislaw





[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