From 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 13 May 2024 10:30:14 +0000
Subject: [PATCH] modify sin led gpio

---
 kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgscan.c |  119 +++++++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 103 insertions(+), 16 deletions(-)

diff --git a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgscan.c b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgscan.c
old mode 100644
new mode 100755
index 606f327..d2a2bf1
--- a/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgscan.c
+++ b/kernel/drivers/net/wireless/rockchip_wlan/rkwifi/bcmdhd/wl_cfgscan.c
@@ -135,6 +135,10 @@
 void wl_cfgscan_scan_abort(struct bcm_cfg80211 *cfg);
 static void _wl_cfgscan_cancel_scan(struct bcm_cfg80211 *cfg);
 
+#if defined (WL_SCHED_SCAN) && defined (SCHED_SCAN_DELAYED_WORK)
+void wl_cfg80211_stop_pno(struct bcm_cfg80211 *cfg, struct net_device *dev);
+#endif /* WL_SCHED_SCAN */
+
 #ifdef ESCAN_CHANNEL_CACHE
 void reset_roam_cache(struct bcm_cfg80211 *cfg);
 void add_roam_cache(struct bcm_cfg80211 *cfg, wl_bss_info_t *bi);
@@ -640,10 +644,10 @@
 
 	if (cfg->autochannel && ndev) {
 #if defined(BSSCACHE)
-		wl_ext_get_best_channel(ndev, &cfg->g_bss_cache_ctrl,
+		wl_ext_get_best_channel(ndev, &cfg->g_bss_cache_ctrl, ioctl_version,
 			&cfg->best_2g_ch, &cfg->best_5g_ch, &cfg->best_6g_ch);
 #else
-		wl_ext_get_best_channel(ndev, bss_list,
+		wl_ext_get_best_channel(ndev, bss_list, ioctl_version,
 			&cfg->best_2g_ch, &cfg->best_5g_ch, &cfg->best_6g_ch);
 #endif
 	}
@@ -2640,14 +2644,8 @@
 	}
 
 #ifdef WL_EXT_IAPSTA
-	err = wl_ext_in4way_sync(ndev, STA_FAKE_SCAN_IN_CONNECT, WL_EXT_STATUS_SCANNING, NULL);
-	if (err) {
-		wl_event_msg_t msg;
+	if (wl_ext_in4way_sync(ndev, STA_FAKE_SCAN_IN_CONNECT, WL_EXT_STATUS_SCANNING, NULL)) {
 		mutex_lock(&cfg->scan_sync);
-		bzero(&msg, sizeof(wl_event_msg_t));
-		msg.event_type = hton32(WLC_E_ESCAN_RESULT);
-		msg.status = hton32(WLC_E_STATUS_SUCCESS);
-		wl_cfg80211_event(ndev, &msg, NULL);
 		goto scan_success;
 	}
 #endif
@@ -2987,11 +2985,19 @@
 
 		if (cfg->bss_list && (cfg->bss_list->count == 0)) {
 			WL_INFORM_MEM(("bss list empty. report sched_scan_stop\n"));
+
+#if defined (WL_SCHED_SCAN) && defined (SCHED_SCAN_DELAYED_WORK)
+			wl_cfg80211_stop_pno(cfg,  bcmcfg_to_prmry_ndev(cfg));
+			/* schedule the work to indicate sched scan stop to cfg layer */
+			schedule_delayed_work(&cfg->sched_scan_stop_work, 0);
+#else
 			/* Indicated sched scan stopped so that user space
 			 * can do a full scan incase found match is empty.
 			 */
 			CFG80211_SCHED_SCAN_STOPPED(wiphy, cfg->sched_scan_req);
 			cfg->sched_scan_req = NULL;
+#endif
+
 		}
 	}
 #endif /* WL_SCHED_SCAN */
@@ -3932,10 +3938,23 @@
 #endif /* LINUX_VER > 4.11 */
 {
 	struct bcm_cfg80211 *cfg = wiphy_priv(wiphy);
+#if defined (WL_SCHED_SCAN) && !defined (SCHED_SCAN_DELAYED_WORK)
 	dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
+#endif
+
+#if defined (WL_SCHED_SCAN) && defined (SCHED_SCAN_DELAYED_WORK)
+	struct net_device *pri_ndev;
+#endif
 
 	WL_DBG(("Enter \n"));
 	WL_PNO((">>> SCHED SCAN STOP\n"));
+
+#if defined (WL_SCHED_SCAN) && defined (SCHED_SCAN_DELAYED_WORK)
+	pri_ndev = bcmcfg_to_prmry_ndev(cfg);
+	wl_cfg80211_stop_pno(cfg, dev);
+
+	cancel_delayed_work(&cfg->sched_scan_stop_work);
+#else
 
 #if defined(BCMDONGLEHOST)
 	if (dhd_dev_pno_stop_for_ssid(dev) < 0) {
@@ -3949,16 +3968,81 @@
 	}
 #endif /* BCMDONGLEHOST */
 
+#endif
+
 	mutex_lock(&cfg->scan_sync);
 	if (cfg->sched_scan_req) {
+#if defined (WL_SCHED_SCAN) && defined (SCHED_SCAN_DELAYED_WORK)
+		if (cfg->sched_scan_running && wl_get_drv_status(cfg, SCANNING, pri_ndev)) {
+			/* If targetted escan for PNO is running, abort it */
+			WL_INFORM_MEM(("abort targetted escan\n"));
+			_wl_cfgscan_cancel_scan(cfg);
+			wl_clr_drv_status(cfg, SCANNING, pri_ndev);
+		} else {
+			WL_INFORM_MEM(("pno escan state:%d\n",
+				cfg->sched_scan_running));
+		}
+#else
 		WL_PNO((">>> Sched scan running. Aborting it..\n"));
 		_wl_cfgscan_cancel_scan(cfg);
+#endif
 	}
 	cfg->sched_scan_req = NULL;
 	cfg->sched_scan_running = FALSE;
 	mutex_unlock(&cfg->scan_sync);
 
 	return 0;
+}
+#if defined (WL_SCHED_SCAN) && defined (SCHED_SCAN_DELAYED_WORK)
+void
+wl_cfgscan_sched_scan_stop_work(struct work_struct *work)
+{
+	struct bcm_cfg80211 *cfg = NULL;
+	struct wiphy *wiphy = NULL;
+	struct delayed_work *dw = to_delayed_work(work);
+
+	GCC_DIAGNOSTIC_PUSH_SUPPRESS_CAST();
+	cfg = container_of(dw, struct bcm_cfg80211, sched_scan_stop_work);
+	GCC_DIAGNOSTIC_POP();
+
+	/* Hold rtnl_lock -> scan_sync lock to be in sync with cfg80211_ops path */
+	rtnl_lock();
+	mutex_lock(&cfg->scan_sync);
+	if (cfg->sched_scan_req) {
+		wiphy = cfg->sched_scan_req->wiphy;
+		/* Indicate sched scan stopped so that user space
+		 * can do a full scan incase found match is empty.
+		 */
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0))
+		cfg80211_sched_scan_stopped_rtnl(wiphy, cfg->sched_scan_req->reqid);
+#else
+		cfg80211_sched_scan_stopped_rtnl(wiphy);
+#endif /* KERNEL > 4.12.0 */
+		cfg->sched_scan_req = NULL;
+	}
+	mutex_unlock(&cfg->scan_sync);
+	rtnl_unlock();
+}
+#endif
+#endif /* WL_SCHED_SCAN */
+
+#if defined (WL_SCHED_SCAN) && defined (SCHED_SCAN_DELAYED_WORK)
+void
+wl_cfg80211_stop_pno(struct bcm_cfg80211 *cfg, struct net_device *dev)
+{
+#if defined(BCMDONGLEHOST)
+	dhd_pub_t *dhdp = (dhd_pub_t *)(cfg->pub);
+
+	if (dhd_dev_pno_stop_for_ssid(dev) < 0) {
+		WL_ERR(("PNO Stop for SSID failed"));
+	} else {
+		/*
+		 * purposefully logging here to make sure that
+		 * firmware configuration was successful
+		 */
+		DBG_EVENT_LOG(dhdp, WIFI_EVENT_DRIVER_PNO_REMOVE);
+	}
+#endif /* BCMDONGLEHOST */
 }
 #endif /* WL_SCHED_SCAN */
 
@@ -4750,12 +4834,18 @@
 		 */
 		if (cfg->sched_scan_req) {
 			WL_ERR(("sched_scan stopped\n"));
+#if defined (WL_SCHED_SCAN) && defined (SCHED_SCAN_DELAYED_WORK)
+			wl_cfg80211_stop_pno(cfg,  bcmcfg_to_prmry_ndev(cfg));
+			/* schedule the work to indicate sched scan stop to cfg layer */
+			schedule_delayed_work(&cfg->sched_scan_stop_work, 0);
+#else
 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0))
 			cfg80211_sched_scan_stopped(wiphy, cfg->sched_scan_req->reqid);
 #else
 			cfg80211_sched_scan_stopped(wiphy);
 #endif /* KERNEL > 4.11.0 */
 			cfg->sched_scan_req = NULL;
+#endif
 		} else {
 			WL_ERR(("sched scan req null!\n"));
 		}
@@ -5564,7 +5654,7 @@
 	}
 #endif /* ESCAN_CHANNEL_CACHE */
 
-	WL_SCAN(("channel cnt:%d\n", info->chan_cnt));
+	WL_DBG_MEM(("channel cnt:%d\n", info->chan_cnt));
 	return BCME_OK;
 }
 
@@ -5586,7 +5676,7 @@
 
 s32
 wl_cfgscan_get_band_freq_list(struct bcm_cfg80211 *cfg, int band,
-	uint32 *list, uint32 *num_channels)
+	uint16 *list, uint32 *num_channels)
 {
 	s32 err = BCME_OK;
 	uint32 i, freq, list_count, count = 0;
@@ -5608,16 +5698,13 @@
 	list_count = ((wl_chanspec_list_v1_t *)list)->count;
 	for (i = 0; i < list_count; i++) {
 		chspec = dtoh32(((wl_chanspec_list_v1_t *)list)->chspecs[i].chanspec);
-		if (!CHSPEC_IS20(chspec)) {
-			continue;
-		}
 		chaninfo = dtoh32(((wl_chanspec_list_v1_t *)list)->chspecs[i].chaninfo);
 		freq = wl_channel_to_frequency(wf_chspec_ctlchan(chspec),
 			CHSPEC_BAND(chspec));
 		if (((band & WIFI_BAND_BG) && CHSPEC_IS2G(chspec)) ||
 				((band & WIFI_BAND_6GHZ) && CHSPEC_IS6G(chspec))) {
 			/* add 2g/6g channels */
-			list[count] = freq;
+			list[i] = freq;
 			count++;
 		}
 		/* handle 5g separately */
@@ -5632,7 +5719,7 @@
 				continue;
 			}
 
-			list[count] = freq;
+			list[i] = freq;
 			count++;
 		}
 	}

--
Gitblit v1.6.2