Prechádzať zdrojové kódy

qcacld-3.0: Set wlan phy mode in OEM channel info response

qcacld-2.0 to qcacld-3.0 propagation

Calculate and add wlan phy mode for each channel in OEM channel
info response.
Also send ANI_MSG_PEER_STATUS_IND indication for STA mode when
STA gets connected.

Change-Id: I91363e90698cabda72028135eb7fe9adeb1fbc86
CRs-Fixed: 1007004
Abhishek Singh 9 rokov pred
rodič
commit
1c67622020

+ 2 - 1
core/hdd/inc/wlan_hdd_oemdata.h

@@ -178,7 +178,8 @@ void hdd_send_peer_status_ind_to_oem_app(struct qdf_mac_addr *peerMac,
 					 uint8_t peerStatus,
 					 uint8_t peerTimingMeasCap,
 					 uint8_t sessionId,
-					 tSirSmeChanInfo *chan_info);
+					 tSirSmeChanInfo * chan_info,
+					 enum tQDF_ADAPTER_MODE dev_mode);
 
 int iw_get_oem_data_cap(struct net_device *dev, struct iw_request_info *info,
 			union iwreq_data *wrqu, char *extra);

+ 29 - 27
core/hdd/src/wlan_hdd_assoc.c

@@ -781,6 +781,8 @@ static void hdd_send_association_event(struct net_device *dev,
 			hddLog(LOG4, "LFR3:hdd_send_association_event");
 #endif
 	if (eConnectionState_Associated == pHddStaCtx->conn_info.connState) {
+		tSirSmeChanInfo chan_info;
+
 		if (!pCsrRoamInfo) {
 			hddLog(LOGE, FL("STA in associated state but pCsrRoamInfo is null"));
 			return;
@@ -834,30 +836,28 @@ static void hdd_send_association_event(struct net_device *dev,
 		    ) {
 			hdd_send_ft_assoc_response(dev, pAdapter, pCsrRoamInfo);
 		}
-		if (pAdapter->device_mode == QDF_P2P_CLIENT_MODE) {
-			tSirSmeChanInfo chan_info;
-			qdf_copy_macaddr(&peerMacAddr,
-					 &pHddStaCtx->conn_info.bssId);
-			chan_info.chan_id = pCsrRoamInfo->chan_info.chan_id;
-			chan_info.mhz = pCsrRoamInfo->chan_info.mhz;
-			chan_info.info = pCsrRoamInfo->chan_info.info;
-			chan_info.band_center_freq1 =
-				pCsrRoamInfo->chan_info.band_center_freq1;
-			chan_info.band_center_freq2 =
-				pCsrRoamInfo->chan_info.band_center_freq2;
-			chan_info.reg_info_1 =
-				pCsrRoamInfo->chan_info.reg_info_1;
-			chan_info.reg_info_2 =
-				pCsrRoamInfo->chan_info.reg_info_2;
+		qdf_copy_macaddr(&peerMacAddr,
+				 &pHddStaCtx->conn_info.bssId);
+		chan_info.chan_id = pCsrRoamInfo->chan_info.chan_id;
+		chan_info.mhz = pCsrRoamInfo->chan_info.mhz;
+		chan_info.info = pCsrRoamInfo->chan_info.info;
+		chan_info.band_center_freq1 =
+			pCsrRoamInfo->chan_info.band_center_freq1;
+		chan_info.band_center_freq2 =
+			pCsrRoamInfo->chan_info.band_center_freq2;
+		chan_info.reg_info_1 =
+			pCsrRoamInfo->chan_info.reg_info_1;
+		chan_info.reg_info_2 =
+			pCsrRoamInfo->chan_info.reg_info_2;
+		/* send peer status indication to oem app */
+		hdd_send_peer_status_ind_to_oem_app(&peerMacAddr,
+							ePeerConnected,
+							pCsrRoamInfo->
+							timingMeasCap,
+							pAdapter->sessionId,
+							&chan_info,
+							pAdapter->device_mode);
 
-			/* send peer status indication to oem app */
-			hdd_send_peer_status_ind_to_oem_app(&peerMacAddr,
-							    ePeerConnected,
-							    pCsrRoamInfo->
-							    timingMeasCap,
-							    pAdapter->sessionId,
-							    &chan_info);
-		}
 #ifdef MSM_PLATFORM
 #ifdef CONFIG_CNSS
 		/* start timer in sta/p2p_cli */
@@ -890,15 +890,17 @@ static void hdd_send_association_event(struct net_device *dev,
 		wlan_hdd_auto_shutdown_enable(pHddCtx, true);
 #endif
 
-		if (pAdapter->device_mode == QDF_P2P_CLIENT_MODE) {
+		if ((pAdapter->device_mode == QDF_STA_MODE) ||
+			(pAdapter->device_mode == QDF_P2P_CLIENT_MODE)) {
 			qdf_copy_macaddr(&peerMacAddr,
 					 &pHddStaCtx->conn_info.bssId);
 
 			/* send peer status indication to oem app */
 			hdd_send_peer_status_ind_to_oem_app(&peerMacAddr,
-							   ePeerDisconnected, 0,
-							   pAdapter->sessionId,
-							   NULL);
+							ePeerDisconnected, 0,
+							pAdapter->sessionId,
+							NULL,
+							pAdapter->device_mode);
 		}
 #ifdef WLAN_FEATURE_LPSS
 		pAdapter->rssi_send = false;

+ 16 - 15
core/hdd/src/wlan_hdd_hostapd.c

@@ -1384,16 +1384,16 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
 		if (pHostapdAdapter->device_mode == QDF_P2P_GO_MODE) {
 			/* send peer status indication to oem app */
 			hdd_send_peer_status_ind_to_oem_app(&pSapEvent->sapevt.
-							    sapStationAssocReassocCompleteEvent.
-							    staMac, ePeerConnected,
-							    pSapEvent->sapevt.
-							    sapStationAssocReassocCompleteEvent.
-							    timingMeasCap,
-							    pHostapdAdapter->
-							    sessionId,
-							    &pSapEvent->sapevt.
-							    sapStationAssocReassocCompleteEvent.
-							    chan_info);
+					sapStationAssocReassocCompleteEvent.
+					staMac, ePeerConnected,
+					pSapEvent->sapevt.
+					sapStationAssocReassocCompleteEvent.
+					timingMeasCap,
+					pHostapdAdapter->sessionId,
+					&pSapEvent->sapevt.
+					sapStationAssocReassocCompleteEvent.
+					chan_info,
+					pHostapdAdapter->device_mode);
 		}
 		hdd_wlan_green_ap_add_sta(pHddCtx);
 		break;
@@ -1502,11 +1502,12 @@ QDF_STATUS hdd_hostapd_sap_event_cb(tpSap_Event pSapEvent,
 		if (pHostapdAdapter->device_mode == QDF_P2P_GO_MODE) {
 			/* send peer status indication to oem app */
 			hdd_send_peer_status_ind_to_oem_app(&pSapEvent->sapevt.
-							    sapStationDisassocCompleteEvent.
-							    staMac, ePeerDisconnected,
-							    0,
-							    pHostapdAdapter->
-							    sessionId, NULL);
+						sapStationDisassocCompleteEvent.
+						staMac, ePeerDisconnected,
+						0,
+						pHostapdAdapter->sessionId,
+						NULL,
+						pHostapdAdapter->device_mode);
 		}
 #ifdef MSM_PLATFORM
 		/*stop timer in sap/p2p_go */

+ 49 - 2
core/hdd/src/wlan_hdd_oemdata.c

@@ -414,6 +414,45 @@ static QDF_STATUS oem_process_data_req_msg(int oemDataLen, char *oemData)
 	return status;
 }
 
+/**
+ * update_channel_bw_info() - set bandwidth info for the chan
+ * @hdd_ctx: hdd context
+ * @chan: channel for which info are required
+ * @hdd_chan_info: struct where the bandwidth info is filled
+ *
+ * This function find the maximum bandwidth allowed, secondary
+ * channel offset and center freq for the channel as per regulatory
+ * domain and using these info calculate the phy mode for the
+ * channel.
+ *
+ * Return: void
+ */
+static void hdd_update_channel_bw_info(hdd_context_t *hdd_ctx,
+	uint16_t chan, tHddChannelInfo *hdd_chan_info)
+{
+	struct ch_params_s ch_params = {0};
+	uint16_t sec_ch_2g = 0;
+	WLAN_PHY_MODE phy_mode;
+	uint32_t wni_dot11_mode;
+
+	wni_dot11_mode = sme_get_wni_dot11_mode(hdd_ctx->hHal);
+
+	/* Passing CH_WIDTH_MAX will give the max bandwidth supported */
+	ch_params.ch_width = CH_WIDTH_MAX;
+
+	cds_set_channel_params(chan, sec_ch_2g, &ch_params);
+	if (ch_params.center_freq_seg0)
+		hdd_chan_info->band_center_freq1 =
+			cds_chan_to_freq(ch_params.center_freq_seg0);
+
+	hdd_info("chan %d dot11_mode %d ch_width %d sec offset %d freq_seg0 %d",
+		chan, wni_dot11_mode, ch_params.ch_width,
+		ch_params.sec_ch_offset, hdd_chan_info->band_center_freq1);
+
+	phy_mode = wma_chan_phy_mode(chan, ch_params.ch_width, wni_dot11_mode);
+	WMI_SET_CHANNEL_MODE(hdd_chan_info, phy_mode);
+}
+
 /**
  * oem_process_channel_info_req_msg() - process oem channel_info request
  * @numOfChannels: number of channels
@@ -494,6 +533,9 @@ static int oem_process_channel_info_req_msg(int numOfChannels, char *chanList)
 			    cds_get_channel_state(chanId))
 				WMI_SET_CHANNEL_FLAG(&hddChanInfo,
 						     WMI_CHAN_FLAG_DFS);
+
+			hdd_update_channel_bw_info(p_hdd_ctx,
+						chanId, &hddChanInfo);
 			hddChanInfo.reg_info_1 = reg_info_1;
 			hddChanInfo.reg_info_2 = reg_info_2;
 		} else {
@@ -655,12 +697,13 @@ static int oem_process_get_cap_req_msg(void)
 
 /**
  * hdd_send_peer_status_ind_to_oem_app() -
- *	Function to send peer status to a registered application
+ * Function to send peer status to a registered application
  * @peerMac: MAC address of peer
  * @peerStatus: ePeerConnected or ePeerDisconnected
  * @peerTimingMeasCap: 0: RTT/RTT2, 1: RTT3. Default is 0
  * @sessionId: SME session id, i.e. vdev_id
  * @chan_info: operating channel information
+ * @dev_mode: dev mode for which indication is sent
  *
  * Return: none
  */
@@ -668,7 +711,8 @@ void hdd_send_peer_status_ind_to_oem_app(struct qdf_mac_addr *peerMac,
 					 uint8_t peerStatus,
 					 uint8_t peerTimingMeasCap,
 					 uint8_t sessionId,
-					 tSirSmeChanInfo *chan_info)
+					 tSirSmeChanInfo *chan_info,
+					 enum tQDF_ADAPTER_MODE dev_mode)
 {
 	struct sk_buff *skb;
 	struct nlmsghdr *nlh;
@@ -719,6 +763,9 @@ void hdd_send_peer_status_ind_to_oem_app(struct qdf_mac_addr *peerMac,
 	pPeerInfo->vdev_id = sessionId;
 	pPeerInfo->peer_capability = peerTimingMeasCap;
 	pPeerInfo->reserved0 = 0;
+	/* Set 0th bit of reserved0 for STA mode */
+	if (QDF_STA_MODE == dev_mode)
+		pPeerInfo->reserved0 |= 0x01;
 
 	if (chan_info) {
 		pPeerInfo->peer_chan_info.chan_id = chan_info->chan_id;

+ 1 - 1
core/sme/inc/sme_api.h

@@ -1126,7 +1126,7 @@ QDF_STATUS sme_bpf_offload_register_callback(tHalHandle hal,
 QDF_STATUS sme_get_bpf_offload_capabilities(tHalHandle hal);
 QDF_STATUS sme_set_bpf_instructions(tHalHandle hal,
 				struct sir_bpf_set_offload *);
-
+uint32_t sme_get_wni_dot11_mode(tHalHandle hal);
 QDF_STATUS sme_create_mon_session(tHalHandle hal_handle, uint8_t *bssid);
 QDF_STATUS sme_set_adaptive_dwelltime_config(tHalHandle hal,
 			struct adaptive_dwelltime_params *dwelltime_params);

+ 14 - 0
core/sme/src/common/sme_api.c

@@ -15747,6 +15747,20 @@ QDF_STATUS sme_bpf_offload_register_callback(tHalHandle hal,
 	return status;
 }
 
+/**
+ * sme_get_wni_dot11_mode() - return configured wni dot11mode
+ * @hal: hal pointer
+ *
+ * Return: wni dot11 mode.
+ */
+uint32_t sme_get_wni_dot11_mode(tHalHandle hal)
+{
+	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+
+	return csr_translate_to_wni_cfg_dot11_mode(mac_ctx,
+		mac_ctx->roam.configParam.uCfgDot11Mode);
+}
+
 /**
  * sme_create_mon_session() - post message to create PE session for monitormode
  * operation

+ 2 - 0
core/wma/inc/wma.h

@@ -2060,3 +2060,5 @@ QDF_STATUS wma_set_bpf_instructions(tp_wma_handle wma,
 			struct sir_bpf_set_offload *bpf_set_offload);
 #endif
 struct wma_ini_config *wma_get_ini_handle(tp_wma_handle wma_handle);
+WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width,
+	u8 dot11_mode);

+ 0 - 3
core/wma/inc/wma_internal.h

@@ -893,9 +893,6 @@ 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_phy_mode(u8 chan, enum phy_ch_width chan_width,
-				u8 dot11_mode);
-
 QDF_STATUS wma_get_link_speed(WMA_HANDLE handle, tSirLinkSpeedInfo *pLinkSpeed);
 
 int wma_profile_data_report_event_handler(void *handle, uint8_t *event_buf,