mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-25 06:03:36 -04:00
qcacld-3.0: Refactor __wlan_hdd_cfg80211_get_station
__wlan_hdd_cfg80211_get_station() is notoriously overly complicated. Begin refactoring this function by factoring out some of the conditional compilation. Change-Id: I8a0e66a8dc4bf320080f417b196ead6df06d0995 CRs-Fixed: 2071619
This commit is contained in:
parent
0f5260dc35
commit
32cb479206
3 changed files with 129 additions and 100 deletions
|
|
@ -17919,6 +17919,67 @@ void wlan_hdd_deinit_chan_info(hdd_context_t *hdd_ctx)
|
|||
qdf_mem_free(chan);
|
||||
}
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) || defined(WITH_BACKPORTS)
|
||||
static enum rate_info_bw hdd_map_hdd_bw_to_os(enum hdd_rate_info_bw hdd_bw)
|
||||
{
|
||||
switch (hdd_bw) {
|
||||
case HDD_RATE_BW_5:
|
||||
return RATE_INFO_BW_5;
|
||||
case HDD_RATE_BW_10:
|
||||
return RATE_INFO_BW_10;
|
||||
case HDD_RATE_BW_20:
|
||||
return RATE_INFO_BW_20;
|
||||
case HDD_RATE_BW_40:
|
||||
return RATE_INFO_BW_40;
|
||||
case HDD_RATE_BW_80:
|
||||
return RATE_INFO_BW_80;
|
||||
case HDD_RATE_BW_160:
|
||||
return RATE_INFO_BW_160;
|
||||
}
|
||||
|
||||
hdd_err("Unhandled HDD_RATE_BW: %d", hdd_bw);
|
||||
|
||||
return RATE_INFO_BW_20;
|
||||
}
|
||||
|
||||
void hdd_set_rate_bw(struct rate_info *info, enum hdd_rate_info_bw hdd_bw)
|
||||
{
|
||||
info->bw = hdd_map_hdd_bw_to_os(hdd_bw);
|
||||
}
|
||||
#else
|
||||
static enum rate_info_flags hdd_map_hdd_bw_to_os(enum hdd_rate_info_bw hdd_bw)
|
||||
{
|
||||
switch (hdd_bw) {
|
||||
case HDD_RATE_BW_5:
|
||||
case HDD_RATE_BW_10:
|
||||
case HDD_RATE_BW_20:
|
||||
return (enum rate_info_flags)0;
|
||||
case HDD_RATE_BW_40:
|
||||
return RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
case HDD_RATE_BW_80:
|
||||
return RATE_INFO_FLAGS_80_MHZ_WIDTH;
|
||||
case HDD_RATE_BW_160:
|
||||
return RATE_INFO_FLAGS_160_MHZ_WIDTH;
|
||||
}
|
||||
|
||||
hdd_err("Unhandled HDD_RATE_BW: %d", hdd_bw);
|
||||
|
||||
return (enum rate_info_flags)0;
|
||||
}
|
||||
|
||||
void hdd_set_rate_bw(struct rate_info *info, enum hdd_rate_info_bw hdd_bw)
|
||||
{
|
||||
const enum rate_info_flags all_bws =
|
||||
RATE_INFO_FLAGS_40_MHZ_WIDTH |
|
||||
RATE_INFO_FLAGS_80_MHZ_WIDTH |
|
||||
RATE_INFO_FLAGS_80P80_MHZ_WIDTH |
|
||||
RATE_INFO_FLAGS_160_MHZ_WIDTH;
|
||||
|
||||
info->flags &= ~all_bws;
|
||||
info->flags |= hdd_map_hdd_bw_to_os(hdd_bw);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* struct cfg80211_ops - cfg80211_ops
|
||||
*
|
||||
|
|
|
|||
|
|
@ -407,6 +407,31 @@ struct cfg80211_bss *wlan_hdd_cfg80211_inform_bss_frame(hdd_adapter_t *pAdapter,
|
|||
#define NUM_NL80211_BANDS ((enum nl80211_band)IEEE80211_NUM_BANDS)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* hdd_rate_info_bw: an HDD internal rate bandwidth representation
|
||||
* @HDD_RATE_BW_5: 5MHz
|
||||
* @HDD_RATE_BW_10: 10MHz
|
||||
* @HDD_RATE_BW_20: 20MHz
|
||||
* @HDD_RATE_BW_40: 40MHz
|
||||
* @HDD_RATE_BW_80: 80MHz
|
||||
* @HDD_RATE_BW_160: 160 MHz
|
||||
*/
|
||||
enum hdd_rate_info_bw {
|
||||
HDD_RATE_BW_5,
|
||||
HDD_RATE_BW_10,
|
||||
HDD_RATE_BW_20,
|
||||
HDD_RATE_BW_40,
|
||||
HDD_RATE_BW_80,
|
||||
HDD_RATE_BW_160,
|
||||
};
|
||||
|
||||
/**
|
||||
* hdd_set_rate_bw(): Set the bandwidth for the given rate_info
|
||||
* @info: The rate info for which the bandwidth should be set
|
||||
* @hdd_bw: HDD representation of a rate info bandwidth
|
||||
*/
|
||||
void hdd_set_rate_bw(struct rate_info *info, enum hdd_rate_info_bw hdd_bw);
|
||||
|
||||
/**
|
||||
* hdd_lost_link_info_cb() - callback function to get lost link information
|
||||
* @context: HDD context
|
||||
|
|
|
|||
|
|
@ -3001,6 +3001,12 @@ static inline void wlan_hdd_fill_station_info_signal(struct station_info
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef LINKSPEED_DEBUG_ENABLED
|
||||
#define linkspeed_dbg(format, args...) pr_info(format, ## args)
|
||||
#else
|
||||
#define linkspeed_dbg(format, args...)
|
||||
#endif /* LINKSPEED_DEBUG_ENABLED */
|
||||
|
||||
/**
|
||||
* __wlan_hdd_cfg80211_get_station() - get station statistics
|
||||
* @wiphy: Pointer to wiphy
|
||||
|
|
@ -3129,10 +3135,8 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
|
|||
(int)pCfg->linkSpeedRssiHigh, (int)pCfg->linkSpeedRssiMid,
|
||||
(int)pCfg->linkSpeedRssiLow, (int)rate_flags, (int)mcs_index);
|
||||
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) || defined(WITH_BACKPORTS)
|
||||
/* assume basic BW. anything else will override this later */
|
||||
sinfo->txrate.bw = RATE_INFO_BW_20;
|
||||
#endif
|
||||
hdd_set_rate_bw(&sinfo->txrate, HDD_RATE_BW_20);
|
||||
|
||||
if (eHDD_LINK_SPEED_REPORT_ACTUAL != pCfg->reportMaxLinkSpeed) {
|
||||
/* we do not want to necessarily report the current speed */
|
||||
|
|
@ -3257,26 +3261,13 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
|
|||
(vht_mcs_map & DATA_RATE_11AC_MCS_MASK);
|
||||
if (rate_flags & eHAL_TX_RATE_SGI)
|
||||
rateFlag |= 1;
|
||||
|
||||
if (DATA_RATE_11AC_MAX_MCS_7 == vhtMaxMcs)
|
||||
maxMCSIdx = 7;
|
||||
else if (DATA_RATE_11AC_MAX_MCS_8 ==
|
||||
vhtMaxMcs)
|
||||
else if (DATA_RATE_11AC_MAX_MCS_8 == vhtMaxMcs)
|
||||
maxMCSIdx = 8;
|
||||
else if (DATA_RATE_11AC_MAX_MCS_9 ==
|
||||
vhtMaxMcs) {
|
||||
/*
|
||||
* IEEE_P802.11ac_2013.pdf page 325, 326
|
||||
* - MCS9 is valid for VHT20 when
|
||||
* Nss = 3 or Nss = 6
|
||||
* - MCS9 is not valid for VHT20 when
|
||||
* Nss = 1,2,4,5,7,8
|
||||
*/
|
||||
if ((rate_flags & eHAL_TX_RATE_VHT20) &&
|
||||
(nss != 3 && nss != 6))
|
||||
maxMCSIdx = 8;
|
||||
else
|
||||
maxMCSIdx = 9;
|
||||
}
|
||||
else if (DATA_RATE_11AC_MAX_MCS_9 == vhtMaxMcs)
|
||||
maxMCSIdx = 9;
|
||||
|
||||
if (rssidx != 0) {
|
||||
for (i = 0; i <= maxMCSIdx; i++) {
|
||||
|
|
@ -3376,62 +3367,31 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
|
|||
} else {
|
||||
maxSpeedMCS = 1;
|
||||
maxMCSIdx = mcs_index;
|
||||
/*
|
||||
* IEEE_P802.11ac_2013.pdf page 325, 326
|
||||
* - MCS9 is valid for VHT20 when
|
||||
* Nss = 3 or Nss = 6
|
||||
* - MCS9 is not valid for VHT20 when
|
||||
* Nss = 1,2,4,5,7,8
|
||||
*/
|
||||
if ((rate_flags & eHAL_TX_RATE_VHT20) &&
|
||||
(maxMCSIdx > 8) &&
|
||||
(nss != 3 && nss != 6)) {
|
||||
maxMCSIdx = 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (rate_flags & eHAL_TX_RATE_LEGACY) {
|
||||
sinfo->txrate.legacy = maxRate;
|
||||
#ifdef LINKSPEED_DEBUG_ENABLED
|
||||
pr_info("Reporting legacy rate %d\n",
|
||||
sinfo->txrate.legacy);
|
||||
#endif /* LINKSPEED_DEBUG_ENABLED */
|
||||
linkspeed_dbg("Reporting legacy rate %d\n",
|
||||
sinfo->txrate.legacy);
|
||||
} else {
|
||||
sinfo->txrate.mcs = maxMCSIdx;
|
||||
sinfo->txrate.nss = nss;
|
||||
if (rate_flags & eHAL_TX_RATE_VHT80) {
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_VHT_MCS;
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) || defined(WITH_BACKPORTS)
|
||||
sinfo->txrate.bw = RATE_INFO_BW_80;
|
||||
#else
|
||||
sinfo->txrate.flags |=
|
||||
RATE_INFO_FLAGS_80_MHZ_WIDTH;
|
||||
#endif
|
||||
} else if (rate_flags & eHAL_TX_RATE_VHT40) {
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_VHT_MCS;
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) || defined(WITH_BACKPORTS)
|
||||
sinfo->txrate.bw = RATE_INFO_BW_40;
|
||||
#else
|
||||
sinfo->txrate.flags |=
|
||||
RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
#endif
|
||||
} else if (rate_flags & eHAL_TX_RATE_VHT20) {
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_VHT_MCS;
|
||||
} else
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_VHT_MCS;
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_VHT_MCS;
|
||||
|
||||
if (rate_flags & eHAL_TX_RATE_VHT80)
|
||||
hdd_set_rate_bw(&sinfo->txrate, HDD_RATE_BW_80);
|
||||
else if (rate_flags & eHAL_TX_RATE_VHT40)
|
||||
hdd_set_rate_bw(&sinfo->txrate, HDD_RATE_BW_40);
|
||||
|
||||
if (rate_flags &
|
||||
(eHAL_TX_RATE_HT20 | eHAL_TX_RATE_HT40)) {
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
|
||||
if (rate_flags & eHAL_TX_RATE_HT40) {
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) || defined(WITH_BACKPORTS)
|
||||
sinfo->txrate.bw = RATE_INFO_BW_40;
|
||||
#else
|
||||
sinfo->txrate.flags |=
|
||||
RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
#endif
|
||||
}
|
||||
if (rate_flags & eHAL_TX_RATE_HT40)
|
||||
hdd_set_rate_bw(&sinfo->txrate,
|
||||
HDD_RATE_BW_40);
|
||||
}
|
||||
|
||||
if (rate_flags & eHAL_TX_RATE_SGI) {
|
||||
if (!
|
||||
(sinfo->txrate.
|
||||
|
|
@ -3440,10 +3400,8 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
|
|||
RATE_INFO_FLAGS_MCS;
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
}
|
||||
#ifdef LINKSPEED_DEBUG_ENABLED
|
||||
pr_info("Reporting MCS rate %d flags %x\n",
|
||||
sinfo->txrate.mcs, sinfo->txrate.flags);
|
||||
#endif /* LINKSPEED_DEBUG_ENABLED */
|
||||
linkspeed_dbg("Reporting MCS rate %d flags %x\n",
|
||||
sinfo->txrate.mcs, sinfo->txrate.flags);
|
||||
}
|
||||
} else {
|
||||
/* report current rate instead of max rate */
|
||||
|
|
@ -3451,50 +3409,34 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
|
|||
if (rate_flags & eHAL_TX_RATE_LEGACY) {
|
||||
/* provide to the UI in units of 100kbps */
|
||||
sinfo->txrate.legacy = myRate;
|
||||
#ifdef LINKSPEED_DEBUG_ENABLED
|
||||
pr_info("Reporting actual legacy rate %d\n",
|
||||
sinfo->txrate.legacy);
|
||||
#endif /* LINKSPEED_DEBUG_ENABLED */
|
||||
linkspeed_dbg("Reporting actual legacy rate %d\n",
|
||||
sinfo->txrate.legacy);
|
||||
} else {
|
||||
/* must be MCS */
|
||||
sinfo->txrate.mcs = mcs_index;
|
||||
sinfo->txrate.nss = nss;
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_VHT_MCS;
|
||||
if (rate_flags & eHAL_TX_RATE_VHT80) {
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) || defined(WITH_BACKPORTS)
|
||||
sinfo->txrate.bw = RATE_INFO_BW_80;
|
||||
#else
|
||||
sinfo->txrate.flags |=
|
||||
RATE_INFO_FLAGS_80_MHZ_WIDTH;
|
||||
#endif
|
||||
} else if (rate_flags & eHAL_TX_RATE_VHT40) {
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) || defined(WITH_BACKPORTS)
|
||||
sinfo->txrate.bw = RATE_INFO_BW_40;
|
||||
#else
|
||||
sinfo->txrate.flags |=
|
||||
RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
#endif
|
||||
}
|
||||
|
||||
if (rate_flags & eHAL_TX_RATE_VHT80)
|
||||
hdd_set_rate_bw(&sinfo->txrate, HDD_RATE_BW_80);
|
||||
else if (rate_flags & eHAL_TX_RATE_VHT40)
|
||||
hdd_set_rate_bw(&sinfo->txrate, HDD_RATE_BW_40);
|
||||
|
||||
if (rate_flags &
|
||||
(eHAL_TX_RATE_HT20 | eHAL_TX_RATE_HT40)) {
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
|
||||
if (rate_flags & eHAL_TX_RATE_HT40) {
|
||||
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)) || defined(WITH_BACKPORTS)
|
||||
sinfo->txrate.bw = RATE_INFO_BW_40;
|
||||
#else
|
||||
sinfo->txrate.flags |=
|
||||
RATE_INFO_FLAGS_40_MHZ_WIDTH;
|
||||
#endif
|
||||
}
|
||||
if (rate_flags & eHAL_TX_RATE_HT40)
|
||||
hdd_set_rate_bw(&sinfo->txrate,
|
||||
HDD_RATE_BW_40);
|
||||
}
|
||||
|
||||
if (rate_flags & eHAL_TX_RATE_SGI) {
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
|
||||
sinfo->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI;
|
||||
}
|
||||
#ifdef LINKSPEED_DEBUG_ENABLED
|
||||
pr_info("Reporting actual MCS rate %d flags %x\n",
|
||||
sinfo->txrate.mcs, sinfo->txrate.flags);
|
||||
#endif /* LINKSPEED_DEBUG_ENABLED */
|
||||
|
||||
linkspeed_dbg("Reporting actual MCS rate %d flags %x\n",
|
||||
sinfo->txrate.mcs, sinfo->txrate.flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3579,11 +3521,12 @@ static int __wlan_hdd_cfg80211_get_station(struct wiphy *wiphy,
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
MTRACE(qdf_trace(QDF_MODULE_ID_HDD,
|
||||
TRACE_CODE_HDD_CFG80211_GET_STA,
|
||||
pAdapter->sessionId, maxRate));
|
||||
|
||||
EXIT();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue