| From be0a21c5000c964195c6137c271eaf310725b906 Mon Sep 17 00:00:00 2001 |
| From: Lior David <liord@codeaurora.org> |
| Date: Thu, 28 Feb 2019 11:35:01 +0200 |
| Subject: wil6210: fix return code of wmi_mgmt_tx and wmi_mgmt_tx_ext |
| |
| [ 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 a1e226652b4ab..692730415d781 100644 |
| --- a/drivers/net/wireless/ath/wil6210/cfg80211.c |
| +++ b/drivers/net/wireless/ath/wil6210/cfg80211.c |
| @@ -1274,7 +1274,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 bda4a9712f91f..63116f4b62c7f 100644 |
| --- a/drivers/net/wireless/ath/wil6210/wmi.c |
| +++ b/drivers/net/wireless/ath/wil6210/wmi.c |
| @@ -3502,8 +3502,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); |
| @@ -3555,9 +3556,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 |
| |