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
This commit is contained in:
Amar Singhal 2016-05-05 12:50:15 -07:00 • committed by Gerrit - the friendly Code Review server
commit 046eb8a260
7 changed files with 131 additions and 77 deletions

View file

@ -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 */

View file

@ -665,6 +665,38 @@ QDF_STATUS cds_put_default_country(uint8_t *def_country)
return QDF_STATUS_SUCCESS;
}
/**
* 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

View file

@ -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);

View file

@ -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;

View file

@ -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;
uint16_t bw_val = cds_bw_value(chan_width);
/* 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
*/
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;
}
}
/* 5.9 GHz Band */
if ((chan >= WMA_11P_CHANNEL_BEGIN) && (chan <= WMA_11P_CHANNEL_END))
/* Only Legacy Modulation Schemes are supported */
} 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;
}
}
}
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;
}

View file

@ -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;

View file

@ -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) ?