summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmar Singhal <asinghal@codeaurora.org>2016-05-05 12:50:15 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2016-06-01 10:45:19 -0700
commit046eb8a26062c0b88eb1c3fb40f1634d36bbbf2b (patch)
tree73cff080d75e93872454a75c608c2ea20f5f4ef6
parentdf35f3ef5e57571324860126d4e8158a52b51a79 (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.h7
-rw-r--r--core/cds/src/cds_reg_service.c32
-rw-r--r--core/wma/inc/wma_internal.h4
-rw-r--r--core/wma/src/wma_dev_if.c5
-rw-r--r--core/wma/src/wma_features.c151
-rw-r--r--core/wma/src/wma_scan_roam.c4
-rw-r--r--core/wma/src/wma_utils.c5
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) ?