ath11k: enable 6G channels for WCN6855
authorWen Gong <wgong@codeaurora.org>
Tue, 28 Sep 2021 11:00:43 +0000 (14:00 +0300)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 28 Sep 2021 13:22:21 +0000 (16:22 +0300)
For some chips such as WCN6855, single_pdev_only is set in struct
ath11k_hw_params which means ath11k calls ieee80211_register_hw() only
once and create only one device interface, and that device interface
supports all 2G/5G/6G channels.

ath11k_mac_setup_channels_rates() sets up the channels and it is called
for each device interface. It is called only once for single_pdev_only,
and then set up all channels for 2G/5G/6G. The logic of
ath11k_mac_setup_channels_rates() is not suitable for single_pdev_only,
it leads to all 6G channels being disabled for the device interface
which is single_pdev_only such as WCN6855.

Add channel frequency checks for the 6G band and enable the 6G channels
properly based on what is supported by the chip.

Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1

Signed-off-by: Wen Gong <wgong@codeaurora.org>
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20210804181217.88751-3-jouni@codeaurora.org
drivers/net/wireless/ath/ath11k/mac.c

index f7f76a3606c6e094366cf5b08e02854b8d39d27c..6e6da0c1bafece427dc20ce1546975eecf811680 100644 (file)
@@ -7312,7 +7312,7 @@ static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
                                           u32 supported_bands)
 {
        struct ieee80211_supported_band *band;
-       struct ath11k_hal_reg_capabilities_ext *reg_cap;
+       struct ath11k_hal_reg_capabilities_ext *reg_cap, *temp_reg_cap;
        void *channels;
        u32 phy_id;
 
@@ -7322,6 +7322,7 @@ static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
                     ATH11K_NUM_CHANS);
 
        reg_cap = &ar->ab->hal_reg_cap[ar->pdev_idx];
+       temp_reg_cap = reg_cap;
 
        if (supported_bands & WMI_HOST_WLAN_2G_CAP) {
                channels = kmemdup(ath11k_2ghz_channels,
@@ -7340,11 +7341,11 @@ static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
 
                if (ar->ab->hw_params.single_pdev_only) {
                        phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
-                       reg_cap = &ar->ab->hal_reg_cap[phy_id];
+                       temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
                }
                ath11k_mac_update_ch_list(ar, band,
-                                         reg_cap->low_2ghz_chan,
-                                         reg_cap->high_2ghz_chan);
+                                         temp_reg_cap->low_2ghz_chan,
+                                         temp_reg_cap->high_2ghz_chan);
        }
 
        if (supported_bands & WMI_HOST_WLAN_5G_CAP) {
@@ -7364,9 +7365,15 @@ static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
                        band->n_bitrates = ath11k_a_rates_size;
                        band->bitrates = ath11k_a_rates;
                        ar->hw->wiphy->bands[NL80211_BAND_6GHZ] = band;
+
+                       if (ar->ab->hw_params.single_pdev_only) {
+                               phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
+                               temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
+                       }
+
                        ath11k_mac_update_ch_list(ar, band,
-                                                 reg_cap->low_5ghz_chan,
-                                                 reg_cap->high_5ghz_chan);
+                                                 temp_reg_cap->low_5ghz_chan,
+                                                 temp_reg_cap->high_5ghz_chan);
                }
 
                if (reg_cap->low_5ghz_chan < ATH11K_MIN_6G_FREQ) {
@@ -7389,12 +7396,12 @@ static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
 
                        if (ar->ab->hw_params.single_pdev_only) {
                                phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
-                               reg_cap = &ar->ab->hal_reg_cap[phy_id];
+                               temp_reg_cap = &ar->ab->hal_reg_cap[phy_id];
                        }
 
                        ath11k_mac_update_ch_list(ar, band,
-                                                 reg_cap->low_5ghz_chan,
-                                                 reg_cap->high_5ghz_chan);
+                                                 temp_reg_cap->low_5ghz_chan,
+                                                 temp_reg_cap->high_5ghz_chan);
                }
        }