|
@@ -4064,17 +4064,35 @@ static u32 get_nss_from_chainmask(u16 chain_mask)
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int ath10k_mac_get_vht_cap_bf_sts(struct ath10k *ar)
|
|
|
|
+{
|
|
|
|
+ int nsts = ar->vht_cap_info;
|
|
|
|
+ nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
|
|
|
|
+ nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
|
|
|
|
+
|
|
|
|
+ /* If firmware does not deliver to host number of space-time
|
|
|
|
+ * streams supported, assume it support up to 4 BF STS and return
|
|
|
|
+ * the value for VHT CAP: nsts-1)
|
|
|
|
+ * */
|
|
|
|
+ if (nsts == 0)
|
|
|
|
+ return 3;
|
|
|
|
+
|
|
|
|
+ return nsts;
|
|
|
|
+}
|
|
|
|
+
|
|
static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
|
|
static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
|
|
{
|
|
{
|
|
u32 value = 0;
|
|
u32 value = 0;
|
|
struct ath10k *ar = arvif->ar;
|
|
struct ath10k *ar = arvif->ar;
|
|
|
|
+ int nsts;
|
|
|
|
|
|
if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
|
|
if (ath10k_wmi_get_txbf_conf_scheme(ar) != WMI_TXBF_CONF_BEFORE_ASSOC)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+ nsts = ath10k_mac_get_vht_cap_bf_sts(ar);
|
|
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
|
|
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
|
|
IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
|
|
IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE))
|
|
- value |= SM((ar->num_rf_chains - 1), WMI_TXBF_STS_CAP_OFFSET);
|
|
|
|
|
|
+ value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
|
|
|
|
|
|
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
|
|
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
|
|
IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
|
|
IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE))
|
|
@@ -6804,7 +6822,7 @@ static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
|
|
|
|
|
|
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
|
|
if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
|
|
IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
|
|
IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
|
|
- val = ar->num_rf_chains - 1;
|
|
|
|
|
|
+ val = ath10k_mac_get_vht_cap_bf_sts(ar);
|
|
val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
|
|
val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
|
|
val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
|
|
val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
|
|
|
|
|