mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-10-29 17:42:41 +00:00
177 lines
6.3 KiB
Diff
177 lines
6.3 KiB
Diff
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
|
@@ -5602,12 +5602,13 @@ static void ath11k_set_vht_txbf_cap(stru
|
|
}
|
|
|
|
static struct ieee80211_sta_vht_cap
|
|
-ath11k_create_vht_cap(struct ath11k *ar, u32 rate_cap_tx_chainmask,
|
|
- u32 rate_cap_rx_chainmask)
|
|
+ath11k_create_vht_cap(struct ath11k *ar, struct ath11k_pdev_cap *cap)
|
|
{
|
|
struct ieee80211_sta_vht_cap vht_cap = {0};
|
|
u16 txmcs_map, rxmcs_map;
|
|
int i;
|
|
+ u32 rate_cap_tx_chainmask;
|
|
+ u32 rate_cap_rx_chainmask;
|
|
|
|
vht_cap.vht_supported = 1;
|
|
vht_cap.cap = ar->pdev->cap.vht_cap;
|
|
@@ -5616,16 +5617,34 @@ ath11k_create_vht_cap(struct ath11k *ar,
|
|
|
|
rxmcs_map = 0;
|
|
txmcs_map = 0;
|
|
- for (i = 0; i < 8; i++) {
|
|
- if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
|
|
- txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
|
|
- else
|
|
- txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
|
|
-
|
|
- if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
|
|
- rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
|
|
- else
|
|
- rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
|
|
+
|
|
+ rate_cap_tx_chainmask = ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift;
|
|
+ rate_cap_rx_chainmask = ar->cfg_rx_chainmask >> cap->rx_chain_mask_shift;
|
|
+ if (cap->tx_chain_mask_shift == 4) {
|
|
+ for (i = 0; i < 8; i++) {
|
|
+ if (i < ar->num_tx_chains && ar->cfg_tx_chainmask & BIT(7 - i))
|
|
+ txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
|
|
+ else
|
|
+ txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
|
|
+
|
|
+ if (i < ar->num_rx_chains && ar->cfg_rx_chainmask & BIT(7 - i))
|
|
+ rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
|
|
+ else
|
|
+ rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
|
|
+ }
|
|
+ } else {
|
|
+ for (i = 0; i < 8; i++) {
|
|
+ if (i < ar->num_tx_chains && rate_cap_tx_chainmask & BIT(i))
|
|
+ txmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
|
|
+ else
|
|
+ txmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
|
|
+
|
|
+ if (i < ar->num_rx_chains && rate_cap_rx_chainmask & BIT(i))
|
|
+ rxmcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
|
|
+ else
|
|
+ rxmcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
|
|
+ }
|
|
+
|
|
}
|
|
|
|
if (rate_cap_tx_chainmask <= 1)
|
|
@@ -5634,6 +5653,9 @@ ath11k_create_vht_cap(struct ath11k *ar,
|
|
vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(rxmcs_map);
|
|
vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(txmcs_map);
|
|
|
|
+ if (ieee80211_hw_check(ar->hw, SUPPORTS_VHT_EXT_NSS_BW))
|
|
+ vht_cap.vht_mcs.tx_highest |= cpu_to_le16(IEEE80211_VHT_EXT_NSS_BW_CAPABLE);
|
|
+
|
|
/* Check if the HW supports 1:1 NSS ratio and reset
|
|
* EXT NSS BW Support field to 0 to indicate 1:1 ratio
|
|
*/
|
|
@@ -5663,8 +5685,7 @@ static void ath11k_mac_setup_ht_vht_cap(
|
|
band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
|
|
rate_cap_rx_chainmask);
|
|
|
|
- band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
|
|
- rate_cap_rx_chainmask);
|
|
+ band->vht_cap = ath11k_create_vht_cap(ar, cap);
|
|
}
|
|
|
|
if (cap->supported_bands & WMI_HOST_WLAN_5G_CAP && !ar->supports_6ghz) {
|
|
@@ -5674,8 +5695,7 @@ static void ath11k_mac_setup_ht_vht_cap(
|
|
*ht_cap_info = ht_cap;
|
|
band->ht_cap = ath11k_create_ht_cap(ar, ht_cap,
|
|
rate_cap_rx_chainmask);
|
|
- band->vht_cap = ath11k_create_vht_cap(ar, rate_cap_tx_chainmask,
|
|
- rate_cap_rx_chainmask);
|
|
+ band->vht_cap = ath11k_create_vht_cap(ar, cap);
|
|
}
|
|
}
|
|
|
|
@@ -5827,30 +5847,58 @@ static void ath11k_mac_set_hemcsmap(stru
|
|
u8 maxtxnss_160 = ath11k_get_nss_160MHz(ar, ar->num_tx_chains);
|
|
u8 maxrxnss_160 = ath11k_get_nss_160MHz(ar, ar->num_rx_chains);
|
|
|
|
- for (i = 0; i < 8; i++) {
|
|
- if (i < ar->num_tx_chains &&
|
|
- (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
|
- txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
- else
|
|
- txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
-
|
|
- if (i < ar->num_rx_chains &&
|
|
- (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
|
- rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
- else
|
|
- rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
-
|
|
- if (i < maxtxnss_160 &&
|
|
- (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
|
- txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
- else
|
|
- txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
-
|
|
- if (i < maxrxnss_160 &&
|
|
- (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
|
- rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
- else
|
|
- rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
+ if (cap->tx_chain_mask_shift == 4) {
|
|
+ for (i = 0; i < 8; i++) {
|
|
+ if (i < ar->num_tx_chains &&
|
|
+ (ar->cfg_tx_chainmask & BIT(7 - i)))
|
|
+ txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
+ else
|
|
+ txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
+
|
|
+ if (i < ar->num_rx_chains &&
|
|
+ (ar->cfg_rx_chainmask & BIT(7 - i)))
|
|
+ rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
+ else
|
|
+ rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
+
|
|
+ if (i < maxtxnss_160 &&
|
|
+ (ar->cfg_tx_chainmask & BIT(7 - i)))
|
|
+ txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
+ else
|
|
+ txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
+
|
|
+ if (i < maxrxnss_160 &&
|
|
+ (ar->cfg_rx_chainmask & BIT(7 - i)))
|
|
+ rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
+ else
|
|
+ rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
+ }
|
|
+ } else {
|
|
+ for (i = 0; i < 8; i++) {
|
|
+ if (i < ar->num_tx_chains &&
|
|
+ (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
|
+ txmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
+ else
|
|
+ txmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
+
|
|
+ if (i < ar->num_rx_chains &&
|
|
+ (ar->cfg_rx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
|
+ rxmcs_map |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
+ else
|
|
+ rxmcs_map |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
+
|
|
+ if (i < maxtxnss_160 &&
|
|
+ (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
|
+ txmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
+ else
|
|
+ txmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
+
|
|
+ if (i < maxrxnss_160 &&
|
|
+ (ar->cfg_tx_chainmask >> cap->tx_chain_mask_shift) & BIT(i))
|
|
+ rxmcs_map_160 |= IEEE80211_HE_MCS_SUPPORT_0_11 << (i * 2);
|
|
+ else
|
|
+ rxmcs_map_160 |= IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2);
|
|
+ }
|
|
}
|
|
he_cap->he_mcs_nss_supp.rx_mcs_80 =
|
|
cpu_to_le16(rxmcs_map & 0xffff);
|