ソースを参照

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
Amar Singhal 9 年 前
コミット
046eb8a260

+ 7 - 0
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 */

+ 32 - 0
core/cds/src/cds_reg_service.c

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

+ 2 - 2
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);
 

+ 2 - 3
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;

+ 85 - 66
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;
 }
 

+ 2 - 2
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;

+ 1 - 4
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) ?