lkml.org 
[lkml]   [2020]   [Jul]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 12/13] staging: wfx: add a debugfs entry to force ps_timeout
    Date
    From: Jérôme Pouiller <jerome.pouiller@silabs.com>

    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>
    ---
    drivers/staging/wfx/debug.c | 23 +++++++++++++++++++++++
    drivers/staging/wfx/main.c | 1 +
    drivers/staging/wfx/sta.c | 10 +++++++---
    drivers/staging/wfx/sta.h | 1 +
    drivers/staging/wfx/wfx.h | 1 +
    5 files changed, 33 insertions(+), 3 deletions(-)

    diff --git a/drivers/staging/wfx/debug.c b/drivers/staging/wfx/debug.c
    index 10d649985696a..3f1712b7c919d 100644
    --- a/drivers/staging/wfx/debug.c
    +++ b/drivers/staging/wfx/debug.c
    @@ -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;
    }
    diff --git a/drivers/staging/wfx/main.c b/drivers/staging/wfx/main.c
    index 80e4474cc3314..62e3634556ec0 100644
    --- a/drivers/staging/wfx/main.c
    +++ b/drivers/staging/wfx/main.c
    @@ -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;
    diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
    index 2c0ab51fc92da..fdf4f48ddc2ce 100644
    --- a/drivers/staging/wfx/sta.c
    +++ b/drivers/staging/wfx/sta.c
    @@ -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;
    diff --git a/drivers/staging/wfx/sta.h b/drivers/staging/wfx/sta.h
    index 43808cef4785c..6b15a64ac9e28 100644
    --- a/drivers/staging/wfx/sta.h
    +++ b/drivers/staging/wfx/sta.h
    @@ -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);
    diff --git a/drivers/staging/wfx/wfx.h b/drivers/staging/wfx/wfx.h
    index 0c44b733ef6fe..477c08fc713fa 100644
    --- a/drivers/staging/wfx/wfx.h
    +++ b/drivers/staging/wfx/wfx.h
    @@ -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 {
    --
    2.27.0
    \
     
     \ /
      Last update: 2020-07-01 17:08    [W:4.484 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site