Sfoglia il codice sorgente

Merge "qcacld-3.0: Migrate unit-test suspend to HIF IRQ enable/disable" into wlan-cld3.driver.lnx.2.0-dev

Service qcabuildsw 8 anni fa
parent
commit
b5537991b4

+ 1 - 0
core/hdd/src/wlan_hdd_hostapd.c

@@ -2566,6 +2566,7 @@ static int __iw_softap_set_two_ints_getnone(struct net_device *dev,
 					WMI_WLAN_PROFILE_SET_HIST_INTVL_CMDID,
 					value[1], value[2], DBG_CMD);
 	case QCSAP_SET_WLAN_SUSPEND:
+		hdd_info("SAP unit-test suspend(%d, %d)", value[1], value[2]);
 		ret = hdd_wlan_fake_apps_suspend(hdd_ctx->wiphy, dev,
 						 value[1], value[2]);
 		break;

+ 54 - 42
core/hdd/src/wlan_hdd_power.c

@@ -2264,14 +2264,9 @@ int hdd_set_qpower_config(hdd_context_t *hddctx, hdd_adapter_t *adapter,
 
 
 #ifdef WLAN_SUSPEND_RESUME_TEST
-/*
- * On iHelium there are 12 CE irqs and #2 is the wake irq. This may not be
- * a valid assumption on future platforms.
- */
-#define CE_IRQ_COUNT 12
-#define CE_WAKE_IRQ 2
 static struct net_device *g_dev;
 static struct wiphy *g_wiphy;
+static enum wow_resume_trigger g_resume_trigger;
 
 #define HDD_FA_SUSPENDED_BIT (0)
 static unsigned long fake_apps_state;
@@ -2288,8 +2283,8 @@ static unsigned long fake_apps_state;
 static void __hdd_wlan_fake_apps_resume(struct wiphy *wiphy,
 					struct net_device *dev)
 {
+	struct hif_opaque_softc *hif_ctx;
 	qdf_device_t qdf_dev;
-	int i, resume_err;
 
 	hdd_info("Unit-test resume WLAN");
 
@@ -2300,26 +2295,31 @@ static void __hdd_wlan_fake_apps_resume(struct wiphy *wiphy,
 		return;
 	}
 
+	hif_ctx = cds_get_context(QDF_MODULE_ID_HIF);
+	if (!hif_ctx) {
+		hdd_err("Failed to get HIF context");
+		return;
+	}
+
 	if (!test_and_clear_bit(HDD_FA_SUSPENDED_BIT, &fake_apps_state)) {
 		hdd_info("Not unit-test suspended; Nothing to do");
 		return;
 	}
 
-	/* disable wake irq */
-	pld_disable_irq(qdf_dev->dev, CE_WAKE_IRQ);
+	/* simulate kernel disable irqs */
+	QDF_BUG(!hif_apps_wake_irq_disable(hif_ctx));
 
-	resume_err = wlan_hdd_bus_resume_noirq();
-	QDF_BUG(resume_err == 0);
+	QDF_BUG(!wlan_hdd_bus_resume_noirq());
 
 	/* simulate kernel enable irqs */
-	for (i = 0; i < CE_IRQ_COUNT; i++)
-		pld_enable_irq(qdf_dev->dev, i);
+	QDF_BUG(!hif_apps_irqs_enable(hif_ctx));
+
+	QDF_BUG(!wlan_hdd_bus_resume());
 
-	resume_err = wlan_hdd_bus_resume();
-	QDF_BUG(resume_err == 0);
+	QDF_BUG(!wlan_hdd_cfg80211_resume_wlan(wiphy));
 
-	resume_err = wlan_hdd_cfg80211_resume_wlan(wiphy);
-	QDF_BUG(resume_err == 0);
+	if (g_resume_trigger == WOW_RESUME_TRIGGER_HTC_WAKEUP)
+		hif_vote_link_down(hif_ctx);
 
 	dev->watchdog_timeo = HDD_TX_TIMEOUT;
 
@@ -2352,7 +2352,7 @@ int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy, struct net_device *dev,
 {
 	qdf_device_t qdf_dev;
 	struct hif_opaque_softc *hif_ctx;
-	int i, resume_err, suspend_err;
+	int errno;
 	struct wow_enable_params wow_params = {
 		.is_unit_test = true,
 		.interface_pause = pause_setting,
@@ -2392,30 +2392,38 @@ int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy, struct net_device *dev,
 		return 0;
 	}
 
-	suspend_err = wlan_hdd_cfg80211_suspend_wlan(wiphy, NULL);
-	if (suspend_err)
-		goto resume_done;
+	/* pci link is needed to wakeup from HTC wakeup trigger */
+	if (resume_setting == WOW_RESUME_TRIGGER_HTC_WAKEUP)
+		hif_vote_link_up(hif_ctx);
 
-	suspend_err = wlan_hdd_unit_test_bus_suspend(wow_params);
-	if (suspend_err)
+	errno = wlan_hdd_cfg80211_suspend_wlan(wiphy, NULL);
+	if (errno)
+		goto link_down;
+
+	errno = wlan_hdd_unit_test_bus_suspend(wow_params);
+	if (errno)
 		goto cfg80211_resume;
 
 	/* simulate kernel disabling irqs */
-	for (i = 0; i < CE_IRQ_COUNT; i++)
-		pld_disable_irq(qdf_dev->dev, i);
-
-	suspend_err = wlan_hdd_bus_suspend_noirq();
-	if (suspend_err)
-		goto enable_irqs_and_bus_resume;
+	errno = hif_apps_irqs_disable(hif_ctx);
+	if (errno)
+		goto bus_resume;
 
-	/* re-enable wake irq */
-	pld_enable_irq(qdf_dev->dev, CE_WAKE_IRQ);
+	errno = wlan_hdd_bus_suspend_noirq();
+	if (errno)
+		goto enable_irqs;
 
 	/* pass wiphy/dev to callback via global variables */
 	g_wiphy = wiphy;
 	g_dev = dev;
+	g_resume_trigger = resume_setting;
 	hif_fake_apps_suspend(hif_ctx, hdd_wlan_fake_apps_resume_irq_callback);
 
+	/* re-enable wake irq */
+	errno = hif_apps_wake_irq_enable(hif_ctx);
+	if (errno)
+		goto fake_apps_resume;
+
 	/*
 	 * Tell the kernel not to worry if TX queues aren't moving. This is
 	 * expected since we are suspending the wifi hardware, but not APPS
@@ -2423,24 +2431,28 @@ int hdd_wlan_fake_apps_suspend(struct wiphy *wiphy, struct net_device *dev,
 	dev->watchdog_timeo = INT_MAX;
 
 	hdd_info("Unit-test suspend succeeded");
+
 	return 0;
 
-enable_irqs_and_bus_resume:
-	/* re-enable irqs */
-	for (i = 0; i < CE_IRQ_COUNT; i++)
-		pld_enable_irq(qdf_dev->dev, i);
+fake_apps_resume:
+	hif_fake_apps_resume(hif_ctx);
+
+enable_irqs:
+	QDF_BUG(!hif_apps_irqs_enable(hif_ctx));
 
-	resume_err = wlan_hdd_bus_resume();
-	QDF_BUG(resume_err == 0);
+bus_resume:
+	QDF_BUG(!wlan_hdd_bus_resume());
 
 cfg80211_resume:
-	resume_err = wlan_hdd_cfg80211_resume_wlan(wiphy);
-	QDF_BUG(resume_err == 0);
+	QDF_BUG(!wlan_hdd_cfg80211_resume_wlan(wiphy));
+
+link_down:
+	hif_vote_link_down(hif_ctx);
 
-resume_done:
 	clear_bit(HDD_FA_SUSPENDED_BIT, &fake_apps_state);
-	hdd_err("Unit-test suspend failed: %d", suspend_err);
-	return suspend_err;
+	hdd_err("Unit-test suspend failed: %d", errno);
+
+	return errno;
 }
 
 int hdd_wlan_fake_apps_resume(struct wiphy *wiphy, struct net_device *dev)

+ 1 - 0
core/hdd/src/wlan_hdd_wext.c

@@ -12195,6 +12195,7 @@ static int __iw_set_two_ints_getnone(struct net_device *dev,
 		ret = wlan_hdd_set_mon_chan(pAdapter, value[1], value[2]);
 		break;
 	case WE_SET_WLAN_SUSPEND: {
+		hdd_info("STA unit-test suspend(%d, %d)", value[1], value[2]);
 		ret = hdd_wlan_fake_apps_suspend(hdd_ctx->wiphy, dev,
 						 value[1], value[2]);
 		break;