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>
This commit is contained in:
parent
e667aef54f
commit
da30c277c4
2 changed files with 11 additions and 5 deletions
|
@ -1131,7 +1131,12 @@ int wil_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||||
params->wait);
|
params->wait);
|
||||||
|
|
||||||
out:
|
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);
|
tx_status = (rc == 0);
|
||||||
|
rc = (rc == -EAGAIN) ? 0 : rc;
|
||||||
cfg80211_mgmt_tx_status(wdev, cookie ? *cookie : 0, buf, len,
|
cfg80211_mgmt_tx_status(wdev, cookie ? *cookie : 0, buf, len,
|
||||||
tx_status, GFP_KERNEL);
|
tx_status, GFP_KERNEL);
|
||||||
|
|
||||||
|
|
|
@ -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,
|
rc = wmi_call(wil, WMI_SW_TX_REQ_CMDID, vif->mid, cmd, total,
|
||||||
WMI_SW_TX_COMPLETE_EVENTID, &evt, sizeof(evt), 2000);
|
WMI_SW_TX_COMPLETE_EVENTID, &evt, sizeof(evt), 2000);
|
||||||
if (!rc && evt.evt.status != WMI_FW_STATUS_SUCCESS) {
|
if (!rc && evt.evt.status != WMI_FW_STATUS_SUCCESS) {
|
||||||
wil_err(wil, "mgmt_tx failed with status %d\n", evt.evt.status);
|
wil_dbg_wmi(wil, "mgmt_tx failed with status %d\n",
|
||||||
rc = -EINVAL;
|
evt.evt.status);
|
||||||
|
rc = -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(cmd);
|
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,
|
rc = wmi_call(wil, WMI_SW_TX_REQ_EXT_CMDID, vif->mid, cmd, total,
|
||||||
WMI_SW_TX_COMPLETE_EVENTID, &evt, sizeof(evt), 2000);
|
WMI_SW_TX_COMPLETE_EVENTID, &evt, sizeof(evt), 2000);
|
||||||
if (!rc && evt.evt.status != WMI_FW_STATUS_SUCCESS) {
|
if (!rc && evt.evt.status != WMI_FW_STATUS_SUCCESS) {
|
||||||
wil_err(wil, "mgmt_tx_ext failed with status %d\n",
|
wil_dbg_wmi(wil, "mgmt_tx_ext failed with status %d\n",
|
||||||
evt.evt.status);
|
evt.evt.status);
|
||||||
rc = -EINVAL;
|
rc = -EAGAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(cmd);
|
kfree(cmd);
|
||||||
|
|
Loading…
Reference in a new issue