aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>2014-02-27 09:20:47 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-02-28 14:33:32 -0500
commit7b05b0ab89e692eb45b011169afb2359d5d92c6c (patch)
tree17b0c353f7af26c2aab84da1b13ee34ffad68183
parentfb3cac572657fccf4e4406bd9737a0b3aaf54458 (diff)
wil6210: fix BACK status processing
When FW notifies about BACK status change, it provides ring ID. Process BA status for requested connection only. As for now, FW don't report Rx BACK status, it reports Tx one instead. As per current algorithm used in the firmware, imply Rx BACK state is in sync with Tx one Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/ath/wil6210/wmi.c47
1 files changed, 31 insertions, 16 deletions
diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c
index dfbc239b149d..635aa322608c 100644
--- a/drivers/net/wireless/ath/wil6210/wmi.c
+++ b/drivers/net/wireless/ath/wil6210/wmi.c
@@ -563,27 +563,42 @@ static void wmi_evt_ba_status(struct wil6210_priv *wil, int id, void *d,
563 int len) 563 int len)
564{ 564{
565 struct wmi_vring_ba_status_event *evt = d; 565 struct wmi_vring_ba_status_event *evt = d;
566 uint cid, i; 566 struct wil_sta_info *sta;
567 uint i, cid;
568
569 /* TODO: use Rx BA status, not Tx one */
567 570
568 wil_dbg_wmi(wil, "BACK[%d] %s {%d} timeout %d\n", 571 wil_dbg_wmi(wil, "BACK[%d] %s {%d} timeout %d\n",
569 evt->ringid, evt->status == WMI_BA_AGREED ? "OK" : "N/A", 572 evt->ringid,
573 evt->status == WMI_BA_AGREED ? "OK" : "N/A",
570 evt->agg_wsize, __le16_to_cpu(evt->ba_timeout)); 574 evt->agg_wsize, __le16_to_cpu(evt->ba_timeout));
571 for (cid = 0; cid < WIL6210_MAX_CID; cid++) { 575
572 struct wil_sta_info *sta = &wil->sta[cid]; 576 if (evt->ringid >= WIL6210_MAX_TX_RINGS) {
573 577 wil_err(wil, "invalid ring id %d\n", evt->ringid);
574 if (sta->status == wil_sta_unused) 578 return;
575 continue;
576 wil_dbg_wmi(wil, "Init BACK for CID %d %pM\n", cid, sta->addr);
577 for (i = 0; i < WIL_STA_TID_NUM; i++) {
578 struct wil_tid_ampdu_rx *r = sta->tid_rx[i];
579 sta->tid_rx[i] = NULL;
580 wil_tid_ampdu_rx_free(wil, r);
581 if ((evt->status == WMI_BA_AGREED) && evt->agg_wsize)
582 sta->tid_rx[i] = wil_tid_ampdu_rx_alloc(wil,
583 evt->agg_wsize, 0);
584 }
585 } 579 }
586 580
581 cid = wil->vring2cid_tid[evt->ringid][0];
582 if (cid >= WIL6210_MAX_CID) {
583 wil_err(wil, "invalid CID %d for vring %d\n", cid, evt->ringid);
584 return;
585 }
586
587 sta = &wil->sta[cid];
588 if (sta->status == wil_sta_unused) {
589 wil_err(wil, "CID %d unused\n", cid);
590 return;
591 }
592
593 wil_dbg_wmi(wil, "BACK for CID %d %pM\n", cid, sta->addr);
594 for (i = 0; i < WIL_STA_TID_NUM; i++) {
595 struct wil_tid_ampdu_rx *r = sta->tid_rx[i];
596 sta->tid_rx[i] = NULL;
597 wil_tid_ampdu_rx_free(wil, r);
598 if ((evt->status == WMI_BA_AGREED) && evt->agg_wsize)
599 sta->tid_rx[i] = wil_tid_ampdu_rx_alloc(wil,
600 evt->agg_wsize, 0);
601 }
587} 602}
588 603
589static const struct { 604static const struct {