lkml.org 
[lkml]   [2019]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 205/276] wil6210: fix return code of wmi_mgmt_tx and wmi_mgmt_tx_ext
    Date
    [ Upstream commit 49122ec42634f73babb1dc96f170023e5228d080 ]

    The functions that send management TX frame have 3 possible
    results: success and other side acknowledged receive (ACK=1),
    success and other side did not acknowledge receive(ACK=0) and
    failure to send the frame. The current implementation
    incorrectly reports the ACK=0 case as failure.

    Signed-off-by: Lior David <liord@codeaurora.org>
    Signed-off-by: Maya Erez <merez@codeaurora.org>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/ath/wil6210/cfg80211.c | 5 +++++
    drivers/net/wireless/ath/wil6210/wmi.c | 11 ++++++-----
    2 files changed, 11 insertions(+), 5 deletions(-)

    diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c
    index 2daf33342b23d..1fc2bf66845c7 100644
    --- a/drivers/net/wireless/ath/wil6210/cfg80211.c
    +++ b/drivers/net/wireless/ath/wil6210/cfg80211.c
    @@ -1131,7 +1131,12 @@ int wil_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
    params->wait);

    out:
    + /* when the sent packet was not acked by receiver(ACK=0), rc will
    + * be -EAGAIN. In this case this function needs to return success,
    + * the ACK=0 will be reflected in tx_status.
    + */
    tx_status = (rc == 0);
    + rc = (rc == -EAGAIN) ? 0 : rc;
    cfg80211_mgmt_tx_status(wdev, cookie ? *cookie : 0, buf, len,
    tx_status, GFP_KERNEL);

    diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c
    index 42c02a20ec97c..6e3b3031f29bd 100644
    --- a/drivers/net/wireless/ath/wil6210/wmi.c
    +++ b/drivers/net/wireless/ath/wil6210/wmi.c
    @@ -3107,8 +3107,9 @@ int wmi_mgmt_tx(struct wil6210_vif *vif, const u8 *buf, size_t len)
    rc = wmi_call(wil, WMI_SW_TX_REQ_CMDID, vif->mid, cmd, total,
    WMI_SW_TX_COMPLETE_EVENTID, &evt, sizeof(evt), 2000);
    if (!rc && evt.evt.status != WMI_FW_STATUS_SUCCESS) {
    - wil_err(wil, "mgmt_tx failed with status %d\n", evt.evt.status);
    - rc = -EINVAL;
    + wil_dbg_wmi(wil, "mgmt_tx failed with status %d\n",
    + evt.evt.status);
    + rc = -EAGAIN;
    }

    kfree(cmd);
    @@ -3160,9 +3161,9 @@ int wmi_mgmt_tx_ext(struct wil6210_vif *vif, const u8 *buf, size_t len,
    rc = wmi_call(wil, WMI_SW_TX_REQ_EXT_CMDID, vif->mid, cmd, total,
    WMI_SW_TX_COMPLETE_EVENTID, &evt, sizeof(evt), 2000);
    if (!rc && evt.evt.status != WMI_FW_STATUS_SUCCESS) {
    - wil_err(wil, "mgmt_tx_ext failed with status %d\n",
    - evt.evt.status);
    - rc = -EINVAL;
    + wil_dbg_wmi(wil, "mgmt_tx_ext failed with status %d\n",
    + evt.evt.status);
    + rc = -EAGAIN;
    }

    kfree(cmd);
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-05-30 06:06    [W:5.734 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site