diff options
Diffstat (limited to 'package/kernel/mac80211/patches/312-ath10k-move-static-HT-VHT-capability-setup-functions.patch')
-rw-r--r-- | package/kernel/mac80211/patches/312-ath10k-move-static-HT-VHT-capability-setup-functions.patch | 314 |
1 files changed, 314 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/312-ath10k-move-static-HT-VHT-capability-setup-functions.patch b/package/kernel/mac80211/patches/312-ath10k-move-static-HT-VHT-capability-setup-functions.patch new file mode 100644 index 0000000..ea79b1a --- /dev/null +++ b/package/kernel/mac80211/patches/312-ath10k-move-static-HT-VHT-capability-setup-functions.patch @@ -0,0 +1,314 @@ +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) + { |