ce09894398
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 47287
314 lines
8.4 KiB
Diff
314 lines
8.4 KiB
Diff
From: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
|
|
Date: Tue, 27 Oct 2015 17:51:13 +0530
|
|
Subject: [PATCH] ath10k: move static HT/VHT capability setup functions
|
|
|
|
Move HT and VHT capabiltity setup static functions to avoid
|
|
forward declaration.
|
|
|
|
Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
|
|
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
|
|
---
|
|
|
|
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
|
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
|
@@ -3757,6 +3757,146 @@ static void ath10k_check_chain_mask(stru
|
|
dbg, cm);
|
|
}
|
|
|
|
+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_get_vht_cap_bf_sound_dim(struct ath10k *ar)
|
|
+{
|
|
+ int sound_dim = ar->vht_cap_info;
|
|
+
|
|
+ sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
|
|
+ sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
|
|
+
|
|
+ /* If the sounding dimension is not advertised by the firmware,
|
|
+ * let's use a default value of 1
|
|
+ */
|
|
+ if (sound_dim == 0)
|
|
+ return 1;
|
|
+
|
|
+ return sound_dim;
|
|
+}
|
|
+
|
|
+static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
|
|
+{
|
|
+ struct ieee80211_sta_vht_cap vht_cap = {0};
|
|
+ u16 mcs_map;
|
|
+ u32 val;
|
|
+ int i;
|
|
+
|
|
+ vht_cap.vht_supported = 1;
|
|
+ vht_cap.cap = ar->vht_cap_info;
|
|
+
|
|
+ if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
|
|
+ IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
|
|
+ val = ath10k_mac_get_vht_cap_bf_sts(ar);
|
|
+ val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
|
|
+ val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
|
|
+
|
|
+ vht_cap.cap |= val;
|
|
+ }
|
|
+
|
|
+ if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
|
|
+ IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
|
|
+ val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
|
|
+ val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
|
|
+ val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
|
|
+
|
|
+ vht_cap.cap |= val;
|
|
+ }
|
|
+
|
|
+ mcs_map = 0;
|
|
+ for (i = 0; i < 8; i++) {
|
|
+ if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
|
|
+ mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i * 2);
|
|
+ else
|
|
+ mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i * 2);
|
|
+ }
|
|
+
|
|
+ vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
|
|
+ vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
|
|
+
|
|
+ return vht_cap;
|
|
+}
|
|
+
|
|
+static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
|
|
+{
|
|
+ int i;
|
|
+ struct ieee80211_sta_ht_cap ht_cap = {0};
|
|
+
|
|
+ if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
|
|
+ return ht_cap;
|
|
+
|
|
+ ht_cap.ht_supported = 1;
|
|
+ ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
|
|
+ ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
|
|
+ ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
|
+ ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
|
|
+ ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
|
|
+
|
|
+ if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
|
|
+ ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
|
|
+
|
|
+ if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
|
|
+ ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
|
|
+
|
|
+ if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
|
|
+ u32 smps;
|
|
+
|
|
+ smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
|
|
+ smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
|
|
+
|
|
+ ht_cap.cap |= smps;
|
|
+ }
|
|
+
|
|
+ if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
|
|
+ ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
|
|
+
|
|
+ if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
|
|
+ u32 stbc;
|
|
+
|
|
+ stbc = ar->ht_cap_info;
|
|
+ stbc &= WMI_HT_CAP_RX_STBC;
|
|
+ stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
|
|
+ stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
|
|
+ stbc &= IEEE80211_HT_CAP_RX_STBC;
|
|
+
|
|
+ ht_cap.cap |= stbc;
|
|
+ }
|
|
+
|
|
+ if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
|
|
+ ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
|
|
+
|
|
+ if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
|
|
+ ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
|
|
+
|
|
+ /* max AMSDU is implicitly taken from vht_cap_info */
|
|
+ if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
|
|
+ ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
|
|
+
|
|
+ for (i = 0; i < ar->num_rf_chains; i++) {
|
|
+ if (ar->cfg_rx_chainmask & BIT(i))
|
|
+ ht_cap.mcs.rx_mask[i] = 0xFF;
|
|
+ }
|
|
+
|
|
+ ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
|
|
+
|
|
+ return ht_cap;
|
|
+}
|
|
+
|
|
static int __ath10k_set_antenna(struct ath10k *ar, u32 tx_ant, u32 rx_ant)
|
|
{
|
|
int ret;
|
|
@@ -4068,39 +4208,6 @@ static u32 get_nss_from_chainmask(u16 ch
|
|
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_get_vht_cap_bf_sound_dim(struct ath10k *ar)
|
|
-{
|
|
- int sound_dim = ar->vht_cap_info;
|
|
-
|
|
- sound_dim &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
|
|
- sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
|
|
-
|
|
- /* If the sounding dimension is not advertised by the firmware,
|
|
- * let's use a default value of 1
|
|
- */
|
|
- if (sound_dim == 0)
|
|
- return 1;
|
|
-
|
|
- return sound_dim;
|
|
-}
|
|
-
|
|
static int ath10k_mac_set_txbf_conf(struct ath10k_vif *arvif)
|
|
{
|
|
u32 value = 0;
|
|
@@ -6954,113 +7061,6 @@ static const struct ieee80211_iface_comb
|
|
},
|
|
};
|
|
|
|
-static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
|
|
-{
|
|
- struct ieee80211_sta_vht_cap vht_cap = {0};
|
|
- u16 mcs_map;
|
|
- u32 val;
|
|
- int i;
|
|
-
|
|
- vht_cap.vht_supported = 1;
|
|
- vht_cap.cap = ar->vht_cap_info;
|
|
-
|
|
- if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
|
|
- IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
|
|
- val = ath10k_mac_get_vht_cap_bf_sts(ar);
|
|
- val <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
|
|
- val &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
|
|
-
|
|
- vht_cap.cap |= val;
|
|
- }
|
|
-
|
|
- if (ar->vht_cap_info & (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
|
|
- IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
|
|
- val = ath10k_mac_get_vht_cap_bf_sound_dim(ar);
|
|
- val <<= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
|
|
- val &= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
|
|
-
|
|
- vht_cap.cap |= val;
|
|
- }
|
|
-
|
|
- mcs_map = 0;
|
|
- for (i = 0; i < 8; i++) {
|
|
- if ((i < ar->num_rf_chains) && (ar->cfg_tx_chainmask & BIT(i)))
|
|
- mcs_map |= IEEE80211_VHT_MCS_SUPPORT_0_9 << (i*2);
|
|
- else
|
|
- mcs_map |= IEEE80211_VHT_MCS_NOT_SUPPORTED << (i*2);
|
|
- }
|
|
-
|
|
- vht_cap.vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
|
|
- vht_cap.vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
|
|
-
|
|
- return vht_cap;
|
|
-}
|
|
-
|
|
-static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
|
|
-{
|
|
- int i;
|
|
- struct ieee80211_sta_ht_cap ht_cap = {0};
|
|
-
|
|
- if (!(ar->ht_cap_info & WMI_HT_CAP_ENABLED))
|
|
- return ht_cap;
|
|
-
|
|
- ht_cap.ht_supported = 1;
|
|
- ht_cap.ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
|
|
- ht_cap.ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
|
|
- ht_cap.cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
|
- ht_cap.cap |= IEEE80211_HT_CAP_DSSSCCK40;
|
|
- ht_cap.cap |= WLAN_HT_CAP_SM_PS_STATIC << IEEE80211_HT_CAP_SM_PS_SHIFT;
|
|
-
|
|
- if (ar->ht_cap_info & WMI_HT_CAP_HT20_SGI)
|
|
- ht_cap.cap |= IEEE80211_HT_CAP_SGI_20;
|
|
-
|
|
- if (ar->ht_cap_info & WMI_HT_CAP_HT40_SGI)
|
|
- ht_cap.cap |= IEEE80211_HT_CAP_SGI_40;
|
|
-
|
|
- if (ar->ht_cap_info & WMI_HT_CAP_DYNAMIC_SMPS) {
|
|
- u32 smps;
|
|
-
|
|
- smps = WLAN_HT_CAP_SM_PS_DYNAMIC;
|
|
- smps <<= IEEE80211_HT_CAP_SM_PS_SHIFT;
|
|
-
|
|
- ht_cap.cap |= smps;
|
|
- }
|
|
-
|
|
- if (ar->ht_cap_info & WMI_HT_CAP_TX_STBC)
|
|
- ht_cap.cap |= IEEE80211_HT_CAP_TX_STBC;
|
|
-
|
|
- if (ar->ht_cap_info & WMI_HT_CAP_RX_STBC) {
|
|
- u32 stbc;
|
|
-
|
|
- stbc = ar->ht_cap_info;
|
|
- stbc &= WMI_HT_CAP_RX_STBC;
|
|
- stbc >>= WMI_HT_CAP_RX_STBC_MASK_SHIFT;
|
|
- stbc <<= IEEE80211_HT_CAP_RX_STBC_SHIFT;
|
|
- stbc &= IEEE80211_HT_CAP_RX_STBC;
|
|
-
|
|
- ht_cap.cap |= stbc;
|
|
- }
|
|
-
|
|
- if (ar->ht_cap_info & WMI_HT_CAP_LDPC)
|
|
- ht_cap.cap |= IEEE80211_HT_CAP_LDPC_CODING;
|
|
-
|
|
- if (ar->ht_cap_info & WMI_HT_CAP_L_SIG_TXOP_PROT)
|
|
- ht_cap.cap |= IEEE80211_HT_CAP_LSIG_TXOP_PROT;
|
|
-
|
|
- /* max AMSDU is implicitly taken from vht_cap_info */
|
|
- if (ar->vht_cap_info & WMI_VHT_CAP_MAX_MPDU_LEN_MASK)
|
|
- ht_cap.cap |= IEEE80211_HT_CAP_MAX_AMSDU;
|
|
-
|
|
- for (i = 0; i < ar->num_rf_chains; i++) {
|
|
- if (ar->cfg_rx_chainmask & BIT(i))
|
|
- ht_cap.mcs.rx_mask[i] = 0xFF;
|
|
- }
|
|
-
|
|
- ht_cap.mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
|
|
-
|
|
- return ht_cap;
|
|
-}
|
|
-
|
|
static void ath10k_get_arvif_iter(void *data, u8 *mac,
|
|
struct ieee80211_vif *vif)
|
|
{
|