diff options
| author | Amar Singhal <asinghal@codeaurora.org> | 2016-05-05 12:50:15 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-06-01 10:45:19 -0700 |
| commit | 046eb8a26062c0b88eb1c3fb40f1634d36bbbf2b (patch) | |
| tree | 73cff080d75e93872454a75c608c2ea20f5f4ef6 | |
| parent | df35f3ef5e57571324860126d4e8158a52b51a79 (diff) | |
qcacld-3.0: Fix calculation of WLAN_PHY_MODE
Fix the calculation of WLAN_PHY_MODE from dot11mode and channel width.
Take care of all possible values of dot11mode and channel width.
Remove the usage of vht_capable parameter. Also remove the
un-necessary usage of CONFIG_160MHZ_SUPPORT.
Change-Id: Ibc263aed99b0b948f60ac6f1bfe72d16fda5c20e
CRs-Fixed: 1009720
| -rw-r--r-- | core/cds/inc/cds_reg_service.h | 7 | ||||
| -rw-r--r-- | core/cds/src/cds_reg_service.c | 32 | ||||
| -rw-r--r-- | core/wma/inc/wma_internal.h | 4 | ||||
| -rw-r--r-- | core/wma/src/wma_dev_if.c | 5 | ||||
| -rw-r--r-- | core/wma/src/wma_features.c | 151 | ||||
| -rw-r--r-- | core/wma/src/wma_scan_roam.c | 4 | ||||
| -rw-r--r-- | core/wma/src/wma_utils.c | 5 |
7 files changed, 131 insertions, 77 deletions
diff --git a/core/cds/inc/cds_reg_service.h b/core/cds/inc/cds_reg_service.h index a0d90db88e82..c91e2d2119ef 100644 --- a/core/cds/inc/cds_reg_service.h +++ b/core/cds/inc/cds_reg_service.h @@ -52,9 +52,15 @@ #define CDS_MIN_24GHZ_CHANNEL_NUMBER chan_mapping[MIN_24GHZ_CHANNEL].chan_num #define CDS_MAX_24GHZ_CHANNEL_NUMBER chan_mapping[MAX_24GHZ_CHANNEL].chan_num +#define CDS_MIN_59GHZ_CHANNEL_NUMBER chan_mapping[MIN_59GHZ_CHANNEL].chan_num +#define CDS_MAX_59GHZ_CHANNEL_NUMBER chan_mapping[MAX_59GHZ_CHANNEL].chan_num #define CDS_MIN_5GHZ_CHANNEL_NUMBER chan_mapping[MIN_5GHZ_CHANNEL].chan_num #define CDS_MAX_5GHZ_CHANNEL_NUMBER chan_mapping[MAX_5GHZ_CHANNEL].chan_num +#define CDS_IS_CHANNEL_DSRC(chan_num) \ + ((chan_num >= CDS_MIN_59GHZ_CHANNEL_NUMBER) && \ + (chan_num <= CDS_MAX_59GHZ_CHANNEL_NUMBER)) + #define CDS_IS_CHANNEL_5GHZ(chan_num) \ ((chan_num >= CDS_MIN_5GHZ_CHANNEL_NUMBER) && \ (chan_num <= CDS_MAX_5GHZ_CHANNEL_NUMBER)) @@ -367,5 +373,6 @@ void cds_set_channel_params(uint16_t oper_ch, uint16_t ht_offset_2g, QDF_STATUS cds_set_reg_domain(void *client_ctxt, v_REGDOMAIN_t reg_domain); QDF_STATUS cds_put_default_country(uint8_t *def_country); +uint16_t cds_bw_value(enum phy_ch_width bw); #endif /* __CDS_REG_SERVICE_H */ diff --git a/core/cds/src/cds_reg_service.c b/core/cds/src/cds_reg_service.c index dcdc20031e6c..42cde31fe19f 100644 --- a/core/cds/src/cds_reg_service.c +++ b/core/cds/src/cds_reg_service.c @@ -666,6 +666,38 @@ QDF_STATUS cds_put_default_country(uint8_t *def_country) } /** + * cds_bw_value() - give bandwidth value + * bw: bandwidth enum + * + * Return: uint16_t + */ +uint16_t cds_bw_value(enum phy_ch_width bw) +{ + switch (bw) { + case CH_WIDTH_20MHZ: + return 20; + case CH_WIDTH_40MHZ: + return 40; + case CH_WIDTH_80MHZ: + return 80; + case CH_WIDTH_160MHZ: + return 160; + case CH_WIDTH_80P80MHZ: + return 160; + case CH_WIDTH_INVALID: + return 0; + case CH_WIDTH_5MHZ: + return 10; + case CH_WIDTH_10MHZ: + return 5; + case CH_WIDTH_MAX: + return 160; + default: + return 0; + } +} + +/** * cds_set_ch_params() - set channel parameters * @ch: channel * @phy_mode: physical mode diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index 7cdcd9c1c7a9..1a403e63d9a8 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -893,8 +893,8 @@ QDF_STATUS wma_process_lphb_conf_req(tp_wma_handle wma_handle, QDF_STATUS wma_process_dhcp_ind(tp_wma_handle wma_handle, tAniDHCPInd *ta_dhcp_ind); -WLAN_PHY_MODE wma_chan_to_mode(u8 chan, enum phy_ch_width chan_width, - u8 vht_capable, u8 dot11_mode); +WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width, + u8 dot11_mode); QDF_STATUS wma_get_link_speed(WMA_HANDLE handle, tSirLinkSpeedInfo *pLinkSpeed); diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index c0ebf22a7339..6e69b56070ed 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1741,9 +1741,8 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma, /* Fill channel info */ params.chan_freq = cds_chan_to_freq(req->chan); - params.chan_mode = wma_chan_to_mode(req->chan, req->chan_width, - req->vht_capable, req->dot11_mode); - /* save channel mode */ + params.chan_mode = wma_chan_phy_mode(req->chan, req->chan_width, + req->dot11_mode); intr[params.vdev_id].chanmode = params.chan_mode; intr[params.vdev_id].ht_capable = req->ht_capable; intr[params.vdev_id].vht_capable = req->vht_capable; diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index c0c98d53e3d2..a814a42533e7 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -906,93 +906,112 @@ QDF_STATUS wma_process_dhcp_ind(tp_wma_handle wma_handle, } /** - * wma_chan_to_mode() - convert channel to phy mode + * wma_chan_phy__mode() - get WLAN_PHY_MODE for channel * @chan: channel number - * @chan_width: channel width - * @vht_capable: vht capable - * @dot11_mode: 802.11 mode + * @chan_width: maximum channel width possible + * @dot11_mode: maximum phy_mode possible * - * Return: return phy mode + * Return: return WLAN_PHY_MODE */ -WLAN_PHY_MODE wma_chan_to_mode(u8 chan, enum phy_ch_width chan_width, - u8 vht_capable, u8 dot11_mode) +WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width, + u8 dot11_mode) { WLAN_PHY_MODE phymode = MODE_UNKNOWN; - - /* 2.4 GHz band */ - if ((chan >= WMA_11G_CHANNEL_BEGIN) && (chan <= WMA_11G_CHANNEL_END)) { - switch (chan_width) { - case CH_WIDTH_20MHZ: - /* In case of no channel bonding, use dot11_mode - * to set phy mode - */ + uint16_t bw_val = cds_bw_value(chan_width); + + if (CDS_IS_CHANNEL_24GHZ(chan)) { + if (((CH_WIDTH_5MHZ == chan_width) || + (CH_WIDTH_10MHZ == chan_width)) && + ((WNI_CFG_DOT11_MODE_11B == dot11_mode) || + (WNI_CFG_DOT11_MODE_11G == dot11_mode) || + (WNI_CFG_DOT11_MODE_11N == dot11_mode) || + (WNI_CFG_DOT11_MODE_ALL == dot11_mode) || + (WNI_CFG_DOT11_MODE_11AC == dot11_mode))) + phymode = MODE_11G; + else { switch (dot11_mode) { - case WNI_CFG_DOT11_MODE_11A: - phymode = MODE_11A; - break; case WNI_CFG_DOT11_MODE_11B: - phymode = MODE_11B; + if ((20 == bw_val) || + (40 == bw_val)) + phymode = MODE_11B; break; case WNI_CFG_DOT11_MODE_11G: - phymode = MODE_11G; + if ((20 == bw_val) || + (40 == bw_val)) + phymode = MODE_11G; break; case WNI_CFG_DOT11_MODE_11G_ONLY: - phymode = MODE_11GONLY; + if ((20 == bw_val) || + (40 == bw_val)) + phymode = MODE_11GONLY; + break; + case WNI_CFG_DOT11_MODE_11N: + case WNI_CFG_DOT11_MODE_11N_ONLY: + if (20 == bw_val) + phymode = MODE_11NG_HT20; + else if (40 == bw_val) + phymode = MODE_11NG_HT40; + break; + case WNI_CFG_DOT11_MODE_ALL: + case WNI_CFG_DOT11_MODE_11AC: + case WNI_CFG_DOT11_MODE_11AC_ONLY: + if (20 == bw_val) + phymode = MODE_11AC_VHT20_2G; + else if (40 == bw_val) + phymode = MODE_11AC_VHT40_2G; break; default: - /* Configure MODE_11NG_HT20 for - * self vdev(for vht too) - */ - phymode = MODE_11NG_HT20; break; } - break; - case CH_WIDTH_40MHZ: - phymode = vht_capable ? MODE_11AC_VHT40 : - MODE_11NG_HT40; - break; - default: - break; } - } - - /* 5 GHz band */ - if ((chan >= WMA_11A_CHANNEL_BEGIN) && (chan <= WMA_11A_CHANNEL_END)) { - switch (chan_width) { - case CH_WIDTH_20MHZ: - phymode = vht_capable ? MODE_11AC_VHT20 : - MODE_11NA_HT20; - break; - case CH_WIDTH_40MHZ: - phymode = vht_capable ? MODE_11AC_VHT40 : - MODE_11NA_HT40; - break; - case CH_WIDTH_80MHZ: - phymode = MODE_11AC_VHT80; - break; -#if CONFIG_160MHZ_SUPPORT != 0 - case CH_WIDTH_160MHZ: - phymode = MODE_11AC_VHT160; - break; - case CH_WIDTH_80P80MHZ: - phymode = MODE_11AC_VHT80_80; - break; -#endif - - default: - break; + } else if (CDS_IS_CHANNEL_DSRC(chan)) + phymode = MODE_11A; + else { + if (((CH_WIDTH_5MHZ == chan_width) || + (CH_WIDTH_10MHZ == chan_width)) && + ((WNI_CFG_DOT11_MODE_11A == dot11_mode) || + (WNI_CFG_DOT11_MODE_11N == dot11_mode) || + (WNI_CFG_DOT11_MODE_ALL == dot11_mode) || + (WNI_CFG_DOT11_MODE_11AC == dot11_mode))) + phymode = MODE_11A; + else { + switch (dot11_mode) { + case WNI_CFG_DOT11_MODE_11A: + if (0 < bw_val) + phymode = MODE_11A; + break; + case WNI_CFG_DOT11_MODE_11N: + case WNI_CFG_DOT11_MODE_11N_ONLY: + if (20 == bw_val) + phymode = MODE_11NA_HT20; + else if (40 <= bw_val) + phymode = MODE_11NA_HT40; + break; + case WNI_CFG_DOT11_MODE_ALL: + case WNI_CFG_DOT11_MODE_11AC: + case WNI_CFG_DOT11_MODE_11AC_ONLY: + if (20 == bw_val) + phymode = MODE_11AC_VHT20; + else if (40 == bw_val) + phymode = MODE_11AC_VHT40; + else if (80 == bw_val) + phymode = MODE_11AC_VHT80; + else if (CH_WIDTH_160MHZ == chan_width) + phymode = MODE_11AC_VHT160; + else if (CH_WIDTH_80P80MHZ == chan_width) + phymode = MODE_11AC_VHT80_80; + break; + default: + break; + } } } - /* 5.9 GHz Band */ - if ((chan >= WMA_11P_CHANNEL_BEGIN) && (chan <= WMA_11P_CHANNEL_END)) - /* Only Legacy Modulation Schemes are supported */ - phymode = MODE_11A; - - WMA_LOGD("%s: phymode %d channel %d ch_width %d vht_capable %d " + WMA_LOGD("%s: phymode %d channel %d ch_width %d" "dot11_mode %d", __func__, phymode, chan, - chan_width, vht_capable, dot11_mode); + chan_width, dot11_mode); + QDF_ASSERT(MODE_UNKNOWN != phymode); return phymode; } diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 60f96ef06179..1d6b8c6ef717 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -2493,8 +2493,8 @@ QDF_STATUS wma_switch_channel(tp_wma_handle wma, struct wma_vdev_start_req *req) /* Fill channel info */ cmd->mhz = cds_chan_to_freq(req->chan); - chanmode = wma_chan_to_mode(req->chan, req->chan_width, - req->vht_capable, req->dot11_mode); + chanmode = wma_chan_phy_mode(req->chan, req->chan_width, + req->dot11_mode); intr[req->vdev_id].chanmode = chanmode; /* save channel mode */ intr[req->vdev_id].ht_capable = req->ht_capable; diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index b393471f4489..23abd574d9f5 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -1721,14 +1721,11 @@ WLAN_PHY_MODE wma_peer_phymode(tSirNwType nw_type, uint8_t sta_type, break; } if (is_vht) { -#if CONFIG_160MHZ_SUPPORT != 0 if (ch_width == CH_WIDTH_160MHZ) phymode = MODE_11AC_VHT160; else if (ch_width == CH_WIDTH_80P80MHZ) phymode = MODE_11AC_VHT80_80; - else -#endif - if (ch_width == CH_WIDTH_80MHZ) + else if (ch_width == CH_WIDTH_80MHZ) phymode = MODE_11AC_VHT80; else phymode = (ch_width) ? |
