wil6210: fix return code of wmi_mgmt_tx and wmi_mgmt_tx_ext
authorLior David <liord@codeaurora.org>
Thu, 28 Feb 2019 09:35:01 +0000 (11:35 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 31 May 2019 13:46:27 +0000 (06:46 -0700)
[ 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
drivers/net/wireless/ath/wil6210/wmi.c

index 2daf333..1fc2bf6 100644 (file)
@@ -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);
 
index 42c02a2..6e3b303 100644 (file)
@@ -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);