]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
staging: wfx: add a debugfs entry to force ps_timeout
authorJérôme Pouiller <jerome.pouiller@silabs.com>
Wed, 1 Jul 2020 15:07:06 +0000 (17:07 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 3 Jul 2020 08:33:08 +0000 (10:33 +0200)
In some advanced usage or debug scenarios, it could interesting to
change the value of ps_timeout or eventually to force use of PS-Poll
frames.

The wext API (used by iwconfig) provide a way to change ps_timeout.
However, this API is obsolete and it seems a little weird to use (it
seems it does apply the change, so the user have to disable then
re-enable de power save)

On side of nl80211, there is no way to change the ps_timeout.

This patch provides a file in debugfs to change the value of ps_timeout.

Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
Link: https://lore.kernel.org/r/20200701150707.222985-13-Jerome.Pouiller@silabs.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/wfx/debug.c
drivers/staging/wfx/main.c
drivers/staging/wfx/sta.c
drivers/staging/wfx/sta.h
drivers/staging/wfx/wfx.h

index 10d649985696a3bf6d702fee11bd35641b46e5e2..3f1712b7c919d8e170f5716807b279647bf8a53f 100644 (file)
@@ -334,6 +334,28 @@ static const struct file_operations wfx_send_hif_msg_fops = {
        .read = wfx_send_hif_msg_read,
 };
 
+static int wfx_ps_timeout_set(void *data, u64 val)
+{
+       struct wfx_dev *wdev = (struct wfx_dev *)data;
+       struct wfx_vif *wvif;
+
+       wdev->force_ps_timeout = val;
+       wvif = NULL;
+       while ((wvif = wvif_iterate(wdev, wvif)) != NULL)
+               wfx_update_pm(wvif);
+       return 0;
+}
+
+static int wfx_ps_timeout_get(void *data, u64 *val)
+{
+       struct wfx_dev *wdev = (struct wfx_dev *)data;
+
+       *val = wdev->force_ps_timeout;
+       return 0;
+}
+
+DEFINE_DEBUGFS_ATTRIBUTE(wfx_ps_timeout_fops, wfx_ps_timeout_get, wfx_ps_timeout_set, "%lld\n");
+
 int wfx_debug_init(struct wfx_dev *wdev)
 {
        struct dentry *d;
@@ -348,6 +370,7 @@ int wfx_debug_init(struct wfx_dev *wdev)
                            &wfx_burn_slk_key_fops);
        debugfs_create_file("send_hif_msg", 0600, d, wdev,
                            &wfx_send_hif_msg_fops);
+       debugfs_create_file("ps_timeout", 0600, d, wdev, &wfx_ps_timeout_fops);
 
        return 0;
 }
index 80e4474cc3314fc01915d4bf2444a958d12878df..62e3634556ec05d9f0627b51e1d116203f7429ab 100644 (file)
@@ -352,6 +352,7 @@ struct wfx_dev *wfx_init_common(struct device *dev,
        skb_queue_head_init(&wdev->tx_pending);
        init_waitqueue_head(&wdev->tx_dequeue);
        wfx_init_hif_cmd(&wdev->hif_cmd);
+       wdev->force_ps_timeout = -1;
 
        if (devm_add_action_or_reset(dev, wfx_free_common, wdev))
                return NULL;
index 2c0ab51fc92da8b0bb6dace27c95239e67f60ca9..fdf4f48ddc2ce647b939d7620cfe6864504f7086 100644 (file)
@@ -217,20 +217,24 @@ static int wfx_get_ps_timeout(struct wfx_vif *wvif, bool *enable_ps)
                // are differents.
                if (enable_ps)
                        *enable_ps = true;
-               if (wvif->bss_not_support_ps_poll)
+               if (wvif->wdev->force_ps_timeout > -1)
+                       return wvif->wdev->force_ps_timeout;
+               else if (wvif->bss_not_support_ps_poll)
                        return 30;
                else
                        return 0;
        }
        if (enable_ps)
                *enable_ps = wvif->vif->bss_conf.ps;
-       if (wvif->vif->bss_conf.assoc && wvif->vif->bss_conf.ps)
+       if (wvif->wdev->force_ps_timeout > -1)
+               return wvif->wdev->force_ps_timeout;
+       else if (wvif->vif->bss_conf.assoc && wvif->vif->bss_conf.ps)
                return conf->dynamic_ps_timeout;
        else
                return -1;
 }
 
-static int wfx_update_pm(struct wfx_vif *wvif)
+int wfx_update_pm(struct wfx_vif *wvif)
 {
        int ps_timeout;
        bool ps;
index 43808cef4785c9f67a394ebc052fc56db9d348ec..6b15a64ac9e28e251cf9a75314cafeca72c81419 100644 (file)
@@ -66,6 +66,7 @@ void wfx_cooling_timeout_work(struct work_struct *work);
 void wfx_suspend_hot_dev(struct wfx_dev *wdev, enum sta_notify_cmd cmd);
 void wfx_suspend_resume_mc(struct wfx_vif *wvif, enum sta_notify_cmd cmd);
 void wfx_event_report_rssi(struct wfx_vif *wvif, u8 raw_rcpi_rssi);
+int wfx_update_pm(struct wfx_vif *wvif);
 
 // Other Helpers
 void wfx_reset(struct wfx_vif *wvif);
index 0c44b733ef6fe54c2bc481afe3294a4c7c703ff8..477c08fc713fa92ebfe1755444c4b9323742bb87 100644 (file)
@@ -59,6 +59,7 @@ struct wfx_dev {
        struct mutex            rx_stats_lock;
        struct hif_tx_power_loop_info tx_power_loop_info;
        struct mutex            tx_power_loop_info_lock;
+       int                     force_ps_timeout;
 };
 
 struct wfx_vif {