Loading drivers/net/wireless/ath/wil6210/cfg80211.c +1 −2 Original line number Diff line number Diff line Loading @@ -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); Loading drivers/net/wireless/ath/wil6210/debugfs.c +29 −25 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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 = { Loading Loading @@ -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; } Loading drivers/net/wireless/ath/wil6210/main.c +0 −1 Original line number Diff line number Diff line Loading @@ -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; Loading drivers/net/wireless/ath/wil6210/pcie_bus.c +27 −13 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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; Loading @@ -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; Loading drivers/net/wireless/ath/wil6210/pm.c +9 −29 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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; } } Loading @@ -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; } } Loading Loading @@ -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"); Loading @@ -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"); Loading @@ -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 Loading
drivers/net/wireless/ath/wil6210/cfg80211.c +1 −2 Original line number Diff line number Diff line Loading @@ -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); Loading
drivers/net/wireless/ath/wil6210/debugfs.c +29 −25 Original line number Diff line number Diff line Loading @@ -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; } Loading @@ -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 = { Loading Loading @@ -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; } Loading
drivers/net/wireless/ath/wil6210/main.c +0 −1 Original line number Diff line number Diff line Loading @@ -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; Loading
drivers/net/wireless/ath/wil6210/pcie_bus.c +27 −13 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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; Loading @@ -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; Loading
drivers/net/wireless/ath/wil6210/pm.c +9 −29 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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; } Loading @@ -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; Loading Loading @@ -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; } } Loading @@ -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; } } Loading Loading @@ -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"); Loading @@ -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"); Loading @@ -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