lkml.org 
[lkml]   [2019]   [Dec]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 40/55] staging: wfx: simplify hif_set_pm() usage
    Date
    From: Jérôme Pouiller <jerome.pouiller@silabs.com>

    The struct hif_req_set_pm_mode comes from hardware API. It is not
    intended to be manipulated in upper layers of the driver. So, this patch
    relocate the handling of this struct to hif_set_pm() (the low level
    function).

    Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
    ---
    drivers/staging/wfx/hif_tx.c | 10 ++++++++--
    drivers/staging/wfx/hif_tx.h | 2 +-
    drivers/staging/wfx/sta.c | 25 +++++++++----------------
    3 files changed, 18 insertions(+), 19 deletions(-)

    diff --git a/drivers/staging/wfx/hif_tx.c b/drivers/staging/wfx/hif_tx.c
    index 6fb98ddbc0e2..9cbf9d916f5f 100644
    --- a/drivers/staging/wfx/hif_tx.c
    +++ b/drivers/staging/wfx/hif_tx.c
    @@ -360,13 +360,19 @@ int hif_set_edca_queue_params(struct wfx_vif *wvif,
    return ret;
    }

    -int hif_set_pm(struct wfx_vif *wvif, const struct hif_req_set_pm_mode *arg)
    +int hif_set_pm(struct wfx_vif *wvif, bool ps, int dynamic_ps_timeout)
    {
    int ret;
    struct hif_msg *hif;
    struct hif_req_set_pm_mode *body = wfx_alloc_hif(sizeof(*body), &hif);

    - memcpy(body, arg, sizeof(*body));
    + if (ps) {
    + body->pm_mode.enter_psm = 1;
    + // Firmware does not support more than 128ms
    + body->fast_psm_idle_period = min(dynamic_ps_timeout * 2, 255);
    + if (body->fast_psm_idle_period)
    + body->pm_mode.fast_psm = 1;
    + }
    wfx_fill_header(hif, wvif->id, HIF_REQ_ID_SET_PM_MODE, sizeof(*body));
    ret = wfx_cmd_send(wvif->wdev, hif, NULL, 0, false);
    kfree(hif);
    diff --git a/drivers/staging/wfx/hif_tx.h b/drivers/staging/wfx/hif_tx.h
    index f61ae7b0d41c..bb5860ee6542 100644
    --- a/drivers/staging/wfx/hif_tx.h
    +++ b/drivers/staging/wfx/hif_tx.h
    @@ -47,7 +47,7 @@ int hif_write_mib(struct wfx_dev *wdev, int vif_id, u16 mib_id,
    int hif_scan(struct wfx_vif *wvif, const struct wfx_scan_params *arg);
    int hif_stop_scan(struct wfx_vif *wvif);
    int hif_join(struct wfx_vif *wvif, const struct hif_req_join *arg);
    -int hif_set_pm(struct wfx_vif *wvif, const struct hif_req_set_pm_mode *arg);
    +int hif_set_pm(struct wfx_vif *wvif, bool ps, int dynamic_ps_timeout);
    int hif_set_bss_params(struct wfx_vif *wvif,
    const struct hif_req_set_bss_params *arg);
    int hif_add_key(struct wfx_dev *wdev, const struct hif_req_add_key *arg);
    diff --git a/drivers/staging/wfx/sta.c b/drivers/staging/wfx/sta.c
    index 9eca35d91ad3..b4007afcd0c6 100644
    --- a/drivers/staging/wfx/sta.c
    +++ b/drivers/staging/wfx/sta.c
    @@ -291,37 +291,30 @@ void wfx_configure_filter(struct ieee80211_hw *hw,
    static int wfx_update_pm(struct wfx_vif *wvif)
    {
    struct ieee80211_conf *conf = &wvif->wdev->hw->conf;
    - struct hif_req_set_pm_mode pm;
    + bool ps = conf->flags & IEEE80211_CONF_PS;
    + int ps_timeout = conf->dynamic_ps_timeout;

    + WARN_ON(conf->dynamic_ps_timeout < 0);
    if (wvif->state != WFX_STATE_STA || !wvif->bss_params.aid)
    return 0;
    -
    - memset(&pm, 0, sizeof(pm));
    - if (conf->flags & IEEE80211_CONF_PS) {
    - pm.pm_mode.enter_psm = 1;
    - // Firmware does not support more than 128ms
    - pm.fast_psm_idle_period =
    - min(conf->dynamic_ps_timeout * 2, 255);
    - if (pm.fast_psm_idle_period)
    - pm.pm_mode.fast_psm = 1;
    - }
    -
    + if (!ps)
    + ps_timeout = 0;
    if (wvif->edca.uapsd_mask)
    - pm.pm_mode.fast_psm = 0;
    + ps_timeout = 0;

    // Kernel disable PowerSave when multiple vifs are in use. In contrary,
    // it is absolutly necessary to enable PowerSave for WF200
    // FIXME: only if channel vif0 != channel vif1
    if (wvif_count(wvif->wdev) > 1) {
    - pm.pm_mode.enter_psm = 1;
    - pm.pm_mode.fast_psm = 0;
    + ps = true;
    + ps_timeout = 0;
    }

    if (!wait_for_completion_timeout(&wvif->set_pm_mode_complete,
    TU_TO_JIFFIES(512)))
    dev_warn(wvif->wdev->dev,
    "timeout while waiting of set_pm_mode_complete\n");
    - return hif_set_pm(wvif, &pm);
    + return hif_set_pm(wvif, ps, ps_timeout);
    }

    int wfx_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-12-16 18:08    [W:9.362 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site