Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26d1d8b9 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "wil6210: update statistics for suspend"

parents ec6bda76 b6ca4db6
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -1804,9 +1804,8 @@ static int wil_cfg80211_suspend(struct wiphy *wiphy,
	wil_dbg_pm(wil, "suspending\n");

	mutex_lock(&wil->mutex);
	wil_p2p_stop_discovery(wil);

	mutex_lock(&wil->p2p_wdev_mutex);
	wil_p2p_stop_radio_operations(wil);
	wil_abort_scan(wil, true);
	mutex_unlock(&wil->p2p_wdev_mutex);
	mutex_unlock(&wil->mutex);
+29 −25
Original line number Diff line number Diff line
@@ -1677,8 +1677,6 @@ static ssize_t wil_write_suspend_stats(struct file *file,
	struct wil6210_priv *wil = file->private_data;

	memset(&wil->suspend_stats, 0, sizeof(wil->suspend_stats));
	wil->suspend_stats.min_suspend_time = ULONG_MAX;
	wil->suspend_stats.collection_start = ktime_get();

	return len;
}
@@ -1688,33 +1686,41 @@ static ssize_t wil_read_suspend_stats(struct file *file,
				      size_t count, loff_t *ppos)
{
	struct wil6210_priv *wil = file->private_data;
	static char text[400];
	int n;
	unsigned long long stats_collection_time =
		ktime_to_us(ktime_sub(ktime_get(),
				      wil->suspend_stats.collection_start));
	char *text;
	int n, ret, text_size = 500;

	n = snprintf(text, sizeof(text),
		     "Suspend statistics:\n"
	text = kmalloc(text_size, GFP_KERNEL);
	if (!text)
		return -ENOMEM;

	n = snprintf(text, text_size,
		     "Radio on suspend statistics:\n"
		     "successful suspends:%ld failed suspends:%ld\n"
		     "successful resumes:%ld failed resumes:%ld\n"
		     "rejected by device:%ld\n"
		     "Radio off suspend statistics:\n"
		     "successful suspends:%ld failed suspends:%ld\n"
		     "successful resumes:%ld failed resumes:%ld\n"
		     "rejected by host:%ld rejected by device:%ld\n"
		     "total suspend time:%lld min suspend time:%lld\n"
		     "max suspend time:%lld stats collection time: %lld\n",
		     wil->suspend_stats.successful_suspends,
		     wil->suspend_stats.failed_suspends,
		     wil->suspend_stats.successful_resumes,
		     wil->suspend_stats.failed_resumes,
		     wil->suspend_stats.rejected_by_host,
		     "General statistics:\n"
		     "rejected by host:%ld\n",
		     wil->suspend_stats.r_on.successful_suspends,
		     wil->suspend_stats.r_on.failed_suspends,
		     wil->suspend_stats.r_on.successful_resumes,
		     wil->suspend_stats.r_on.failed_resumes,
		     wil->suspend_stats.rejected_by_device,
		     wil->suspend_stats.total_suspend_time,
		     wil->suspend_stats.min_suspend_time,
		     wil->suspend_stats.max_suspend_time,
		     stats_collection_time);
		     wil->suspend_stats.r_off.successful_suspends,
		     wil->suspend_stats.r_off.failed_suspends,
		     wil->suspend_stats.r_off.successful_resumes,
		     wil->suspend_stats.r_off.failed_resumes,
		     wil->suspend_stats.rejected_by_host);

	n = min_t(int, n, text_size);

	ret = simple_read_from_buffer(user_buf, count, ppos, text, n);

	n = min_t(int, n, sizeof(text));
	kfree(text);

	return simple_read_from_buffer(user_buf, count, ppos, text, n);
	return ret;
}

static const struct file_operations fops_suspend_stats = {
@@ -1883,8 +1889,6 @@ int wil6210_debugfs_init(struct wil6210_priv *wil)

	wil6210_debugfs_create_ITR_CNT(wil, dbg);

	wil->suspend_stats.collection_start = ktime_get();

	return 0;
}

+0 −1
Original line number Diff line number Diff line
@@ -583,7 +583,6 @@ int wil_priv_init(struct wil6210_priv *wil)
	wil->wakeup_trigger = WMI_WAKEUP_TRIGGER_UCAST |
			      WMI_WAKEUP_TRIGGER_BCAST;
	memset(&wil->suspend_stats, 0, sizeof(wil->suspend_stats));
	wil->suspend_stats.min_suspend_time = ULONG_MAX;
	wil->vring_idle_trsh = 16;

	return 0;
+27 −13
Original line number Diff line number Diff line
@@ -398,6 +398,9 @@ static int wil6210_suspend(struct device *dev, bool is_runtime)
	int rc = 0;
	struct pci_dev *pdev = to_pci_dev(dev);
	struct wil6210_priv *wil = pci_get_drvdata(pdev);
	struct net_device *ndev = wil_to_ndev(wil);
	bool keep_radio_on = ndev->flags & IFF_UP &&
			     wil->keep_radio_on_during_sleep;

	wil_dbg_pm(wil, "suspend: %s\n", is_runtime ? "runtime" : "system");

@@ -405,16 +408,18 @@ static int wil6210_suspend(struct device *dev, bool is_runtime)
	if (rc)
		goto out;

	rc = wil_suspend(wil, is_runtime);
	rc = wil_suspend(wil, is_runtime, keep_radio_on);
	if (!rc) {
		wil->suspend_stats.successful_suspends++;

		/* If platform device supports keep_radio_on_during_sleep
		 * it will control PCIe master
		/* In case radio stays on, platform device will control
		 * PCIe master
		 */
		if (!wil->keep_radio_on_during_sleep)
		if (!keep_radio_on) {
			/* disable bus mastering */
			pci_clear_master(pdev);
			wil->suspend_stats.r_off.successful_suspends++;
		} else {
			wil->suspend_stats.r_on.successful_suspends++;
		}
	}
out:
	return rc;
@@ -425,23 +430,32 @@ static int wil6210_resume(struct device *dev, bool is_runtime)
	int rc = 0;
	struct pci_dev *pdev = to_pci_dev(dev);
	struct wil6210_priv *wil = pci_get_drvdata(pdev);
	struct net_device *ndev = wil_to_ndev(wil);
	bool keep_radio_on = ndev->flags & IFF_UP &&
			     wil->keep_radio_on_during_sleep;

	wil_dbg_pm(wil, "resume: %s\n", is_runtime ? "runtime" : "system");

	/* If platform device supports keep_radio_on_during_sleep it will
	 * control PCIe master
	/* In case radio stays on, platform device will control
	 * PCIe master
	 */
	if (!wil->keep_radio_on_during_sleep)
	if (!keep_radio_on)
		/* allow master */
		pci_set_master(pdev);
	rc = wil_resume(wil, is_runtime);
	rc = wil_resume(wil, is_runtime, keep_radio_on);
	if (rc) {
		wil_err(wil, "device failed to resume (%d)\n", rc);
		wil->suspend_stats.failed_resumes++;
		if (!wil->keep_radio_on_during_sleep)
		if (!keep_radio_on) {
			pci_clear_master(pdev);
			wil->suspend_stats.r_off.failed_resumes++;
		} else {
			wil->suspend_stats.r_on.failed_resumes++;
		}
	} else {
		wil->suspend_stats.successful_resumes++;
		if (keep_radio_on)
			wil->suspend_stats.r_on.successful_resumes++;
		else
			wil->suspend_stats.r_off.successful_resumes++;
	}

	return rc;
+9 −29
Original line number Diff line number Diff line
@@ -186,7 +186,7 @@ static int wil_suspend_keep_radio_on(struct wil6210_priv *wil)
					break;
				wil_err(wil,
					"TO waiting for idle RX, suspend failed\n");
				wil->suspend_stats.failed_suspends++;
				wil->suspend_stats.r_on.failed_suspends++;
				goto resume_after_fail;
			}
			wil_dbg_ratelimited(wil, "rx vring is not empty -> NAPI\n");
@@ -202,7 +202,7 @@ static int wil_suspend_keep_radio_on(struct wil6210_priv *wil)
	 */
	if (!wil_is_wmi_idle(wil)) {
		wil_err(wil, "suspend failed due to pending WMI events\n");
		wil->suspend_stats.failed_suspends++;
		wil->suspend_stats.r_on.failed_suspends++;
		goto resume_after_fail;
	}

@@ -216,7 +216,7 @@ static int wil_suspend_keep_radio_on(struct wil6210_priv *wil)
		if (rc) {
			wil_err(wil, "platform device failed to suspend (%d)\n",
				rc);
			wil->suspend_stats.failed_suspends++;
			wil->suspend_stats.r_on.failed_suspends++;
			wil_c(wil, RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD);
			wil_unmask_irq(wil);
			goto resume_after_fail;
@@ -272,6 +272,7 @@ static int wil_suspend_radio_off(struct wil6210_priv *wil)
		rc = wil_down(wil);
		if (rc) {
			wil_err(wil, "wil_down : %d\n", rc);
			wil->suspend_stats.r_off.failed_suspends++;
			goto out;
		}
	}
@@ -284,6 +285,7 @@ static int wil_suspend_radio_off(struct wil6210_priv *wil)
		rc = wil->platform_ops.suspend(wil->platform_handle, false);
		if (rc) {
			wil_enable_irq(wil);
			wil->suspend_stats.r_off.failed_suspends++;
			goto out;
		}
	}
@@ -317,12 +319,9 @@ static int wil_resume_radio_off(struct wil6210_priv *wil)
	return rc;
}

int wil_suspend(struct wil6210_priv *wil, bool is_runtime)
int wil_suspend(struct wil6210_priv *wil, bool is_runtime, bool keep_radio_on)
{
	int rc = 0;
	struct net_device *ndev = wil_to_ndev(wil);
	bool keep_radio_on = ndev->flags & IFF_UP &&
			     wil->keep_radio_on_during_sleep;

	wil_dbg_pm(wil, "suspend: %s\n", is_runtime ? "runtime" : "system");

@@ -339,19 +338,12 @@ int wil_suspend(struct wil6210_priv *wil, bool is_runtime)
	wil_dbg_pm(wil, "suspend: %s => %d\n",
		   is_runtime ? "runtime" : "system", rc);

	if (!rc)
		wil->suspend_stats.suspend_start_time = ktime_get();

	return rc;
}

int wil_resume(struct wil6210_priv *wil, bool is_runtime)
int wil_resume(struct wil6210_priv *wil, bool is_runtime, bool keep_radio_on)
{
	int rc = 0;
	struct net_device *ndev = wil_to_ndev(wil);
	bool keep_radio_on = ndev->flags & IFF_UP &&
			     wil->keep_radio_on_during_sleep;
	unsigned long long suspend_time_usec = 0;

	wil_dbg_pm(wil, "resume: %s\n", is_runtime ? "runtime" : "system");

@@ -369,21 +361,9 @@ int wil_resume(struct wil6210_priv *wil, bool is_runtime)
	else
		rc = wil_resume_radio_off(wil);

	if (rc)
		goto out;

	suspend_time_usec =
		ktime_to_us(ktime_sub(ktime_get(),
				      wil->suspend_stats.suspend_start_time));
	wil->suspend_stats.total_suspend_time += suspend_time_usec;
	if (suspend_time_usec < wil->suspend_stats.min_suspend_time)
		wil->suspend_stats.min_suspend_time = suspend_time_usec;
	if (suspend_time_usec > wil->suspend_stats.max_suspend_time)
		wil->suspend_stats.max_suspend_time = suspend_time_usec;

out:
	wil_dbg_pm(wil, "resume: %s => %d, suspend time %lld usec\n",
		   is_runtime ? "runtime" : "system", rc, suspend_time_usec);
	wil_dbg_pm(wil, "resume: %s => %d\n", is_runtime ? "runtime" : "system",
		   rc);
	return rc;
}

Loading