Kaynağa Gözat

qcacld-3.0: Update BSS in cfg80211 database on channel switch

Currently, on channel switch, driver is updating only channel switch
not updating the BSS database of cfg80211.

For channel switch, update the BSS with inform_bss

Change-Id: If68b8c5ee7ab5b793a819a609ce5eeb022df75b8
CRs-Fixed: 1099452
Selvaraj, Sridhar 8 yıl önce
ebeveyn
işleme
9c47fef814
1 değiştirilmiş dosya ile 47 ekleme ve 22 silme
  1. 47 22
      core/hdd/src/wlan_hdd_assoc.c

+ 47 - 22
core/hdd/src/wlan_hdd_assoc.c

@@ -4548,6 +4548,51 @@ static inline bool hdd_is_8021x_sha256_auth_type(hdd_station_ctx_t *pHddStaCtx)
 }
 #endif
 
+/*
+ * hdd_roam_channel_switch_handler() - hdd channel switch handler
+ * @adapter: Pointer to adapter context
+ * @roam_info: Pointer to roam info
+ *
+ * Return: None
+ */
+static void hdd_roam_channel_switch_handler(hdd_adapter_t *adapter,
+				tCsrRoamInfo *roam_info)
+{
+	struct hdd_chan_change_params chan_change;
+	struct cfg80211_bss *bss;
+	struct net_device *dev = adapter->dev;
+	struct wireless_dev *wdev = dev->ieee80211_ptr;
+	struct wiphy *wiphy = wdev->wiphy;
+	QDF_STATUS status;
+
+	hdd_info("channel switch for session:%d to channel:%d",
+		adapter->sessionId, roam_info->chan_info.chan_id);
+
+	chan_change.chan = roam_info->chan_info.chan_id;
+	chan_change.chan_params.ch_width =
+		roam_info->chan_info.ch_width;
+	chan_change.chan_params.sec_ch_offset =
+		roam_info->chan_info.sec_ch_offset;
+	chan_change.chan_params.center_freq_seg0 =
+		roam_info->chan_info.band_center_freq1;
+	chan_change.chan_params.center_freq_seg1 =
+		roam_info->chan_info.band_center_freq2;
+
+	bss = wlan_hdd_cfg80211_update_bss_db(adapter, roam_info);
+	if (NULL == bss)
+		hdd_err("%s: unable to create BSS entry", adapter->dev->name);
+	else
+		cfg80211_put_bss(wiphy, bss);
+
+	status = hdd_chan_change_notify(adapter, adapter->dev, chan_change);
+	if (QDF_IS_STATUS_ERROR(status))
+		hdd_err("channel change notification failed");
+
+	status = cds_set_hw_mode_on_channel_switch(adapter->sessionId);
+	if (QDF_IS_STATUS_ERROR(status))
+		hdd_info("set hw mode change not done");
+}
+
 /**
  * hdd_sme_roam_callback() - hdd sme roam callback
  * @pContext: pointer to adapter context
@@ -4568,7 +4613,6 @@ hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo, uint32_t roamId,
 	hdd_station_ctx_t *pHddStaCtx = NULL;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	hdd_context_t *pHddCtx = NULL;
-	struct hdd_chan_change_params chan_change;
 	struct cfg80211_bss *bss_status;
 
 	hdd_info("CSR Callback: status= %d result= %d roamID=%d",
@@ -4889,28 +4933,9 @@ hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo, uint32_t roamId,
 	}
 #endif /* FEATURE_WLAN_ESE */
 	case eCSR_ROAM_STA_CHANNEL_SWITCH:
-		hdd_info("channel switch for session:%d to channel:%d",
-			pAdapter->sessionId, pRoamInfo->chan_info.chan_id);
-
-		chan_change.chan = pRoamInfo->chan_info.chan_id;
-		chan_change.chan_params.ch_width =
-					pRoamInfo->chan_info.ch_width;
-		chan_change.chan_params.sec_ch_offset =
-					pRoamInfo->chan_info.sec_ch_offset;
-		chan_change.chan_params.center_freq_seg0 =
-					pRoamInfo->chan_info.band_center_freq1;
-		chan_change.chan_params.center_freq_seg1 =
-					pRoamInfo->chan_info.band_center_freq2;
-
-		status = hdd_chan_change_notify(pAdapter, pAdapter->dev,
-					chan_change);
-		if (QDF_IS_STATUS_ERROR(status))
-			hdd_err("channel change notification failed");
-
-		status = cds_set_hw_mode_on_channel_switch(pAdapter->sessionId);
-		if (QDF_IS_STATUS_ERROR(status))
-			hdd_info("set hw mode change not done");
+		hdd_roam_channel_switch_handler(pAdapter, pRoamInfo);
 		break;
+
 	case eCSR_ROAM_UPDATE_SCAN_RESULT:
 		if ((NULL != pRoamInfo) && (NULL != pRoamInfo->pBssDesc)) {
 			bss_status = wlan_hdd_cfg80211_inform_bss_frame(