Sven Eckelmann <sven@xxxxxxxxxxxxx> wrote: > Some ETSI countries have a small overlap in the wireless-regdb with an ETSI > channel (5590-5650). A good example is Australia: > > country AU: DFS-ETSI > (2400 - 2483.5 @ 40), (36) > (5150 - 5250 @ 80), (23), NO-OUTDOOR, AUTO-BW > (5250 - 5350 @ 80), (20), NO-OUTDOOR, AUTO-BW, DFS > (5470 - 5600 @ 80), (27), DFS > (5650 - 5730 @ 80), (27), DFS > (5730 - 5850 @ 80), (36) > (57000 - 66000 @ 2160), (43), NO-OUTDOOR > > If the firmware (or the BDF) is shipped with these rules then there is only > a 10 MHz overlap with the weather radar: > > * below: 5470 - 5590 > * weather radar: 5590 - 5600 > * above: (none for the rule "5470 - 5600 @ 80") > > There are several wrong assumption in the ath11k code: > > * there is always a valid range below the weather radar > (actually: there could be no range below the weather radar range OR range > could be smaller than 20 MHz) > * intersected range in the weather radar range is valid > (actually: the range could be smaller than 20 MHz) > * range above weather radar is either empty or valid > (actually: the range could be smaller than 20 MHz) > > These wrong assumption will lead in this example to a rule > > (5590 - 5600 @ 20), (N/A, 27), (600000 ms), DFS, AUTO-BW > > which is invalid according to is_valid_reg_rule() because the freq_diff is > only 10 MHz but the max_bandwidth is set to 20 MHz. Which results in a > rejection like: > > WARNING: at backports-20210222_001-4.4.60-b157d2276/net/wireless/reg.c:3984 > [...] > Call trace: > [<ffffffbffc3d2e50>] reg_get_max_bandwidth+0x300/0x3a8 [cfg80211] > [<ffffffbffc3d3d0c>] regulatory_set_wiphy_regd_sync+0x3c/0x98 [cfg80211] > [<ffffffbffc651598>] ath11k_regd_update+0x1a8/0x210 [ath11k] > [<ffffffbffc652108>] ath11k_regd_update_work+0x18/0x20 [ath11k] > [<ffffffc0000a93e0>] process_one_work+0x1f8/0x340 > [<ffffffc0000a9784>] worker_thread+0x25c/0x448 > [<ffffffc0000aedc8>] kthread+0xd0/0xd8 > [<ffffffc000085550>] ret_from_fork+0x10/0x40 > ath11k c000000.wifi: failed to perform regd update : -22 > Invalid regulatory domain detected > > To avoid this, the algorithm has to be changed slightly. Instead of > splitting a rule which overlaps with the weather radar range into 3 pieces > and accepting the first two parts blindly, it must actually be checked for > each piece whether it is a valid range. And only if it is valid, add it to > the output array. > > When these checks are in place, the processed rules for AU would end up as > > country AU: DFS-ETSI > (2400 - 2483 @ 40), (N/A, 36), (N/A) > (5150 - 5250 @ 80), (6, 23), (N/A), NO-OUTDOOR, AUTO-BW > (5250 - 5350 @ 80), (6, 20), (0 ms), NO-OUTDOOR, DFS, AUTO-BW > (5470 - 5590 @ 80), (6, 27), (0 ms), DFS, AUTO-BW > (5650 - 5730 @ 80), (6, 27), (0 ms), DFS, AUTO-BW > (5730 - 5850 @ 80), (6, 36), (N/A), AUTO-BW > > and will be accepted by the wireless regulatory code. > > Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices") > Signed-off-by: Sven Eckelmann <sven@xxxxxxxxxxxxx> > Signed-off-by: Kalle Valo <kvalo@xxxxxxxxxxxxxx> Patch applied to ath-next branch of ath.git, thanks. 086c921a3540 ath11k: Fix ETSI regd with weather radar overlap -- https://patchwork.kernel.org/project/linux-wireless/patch/20211112153116.1214421-1-sven@xxxxxxxxxxxxx/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches