aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/wil6210/wmi.c
diff options
context:
space:
mode:
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>2014-12-23 02:47:04 -0500
committerKalle Valo <kvalo@codeaurora.org>2015-01-15 07:30:55 -0500
commit3a124ed6454a939277c6b51bea542464be43ef6f (patch)
tree58b2f34badd46c1e082761513c07ef453ce27e5f /drivers/net/wireless/ath/wil6210/wmi.c
parent3277213feb1b6625e4d7ad9eef1778dc88cdf46f (diff)
wil6210: simple ADDBA on originator (Tx) side
Upon Tx vring creation, initiate BACK establishment with maximum possible window size. When establishing secure connection, there is EAPOL data exchange between connection itself and "data port open", where security is done and non-EAPOL data may be transferred. It is better to send EAPOL frames using normal ACK because of firmware considerations. send ADDBA only is 2 conditions met: - data port open for the corresponded STA - vring created Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless/ath/wil6210/wmi.c')
-rw-r--r--drivers/net/wireless/ath/wil6210/wmi.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c
index e790c45c3c68..8a4f8b7243e0 100644
--- a/drivers/net/wireless/ath/wil6210/wmi.c
+++ b/drivers/net/wireless/ath/wil6210/wmi.c
@@ -544,6 +544,22 @@ static void wmi_evt_eapol_rx(struct wil6210_priv *wil, int id,
544 } 544 }
545} 545}
546 546
547static void wil_addba_tx_cid(struct wil6210_priv *wil, u8 cid)
548{
549 struct vring_tx_data *t;
550 int i;
551
552 for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) {
553 if (cid != wil->vring2cid_tid[i][0])
554 continue;
555 t = &wil->vring_tx_data[i];
556 if (!t->enabled)
557 continue;
558
559 wil_addba_tx_request(wil, i);
560 }
561}
562
547static void wmi_evt_linkup(struct wil6210_priv *wil, int id, void *d, int len) 563static void wmi_evt_linkup(struct wil6210_priv *wil, int id, void *d, int len)
548{ 564{
549 struct net_device *ndev = wil_to_ndev(wil); 565 struct net_device *ndev = wil_to_ndev(wil);
@@ -558,6 +574,7 @@ static void wmi_evt_linkup(struct wil6210_priv *wil, int id, void *d, int len)
558 } 574 }
559 575
560 wil->sta[cid].data_port_open = true; 576 wil->sta[cid].data_port_open = true;
577 wil_addba_tx_cid(wil, cid);
561 netif_carrier_on(ndev); 578 netif_carrier_on(ndev);
562} 579}
563 580
@@ -604,6 +621,7 @@ static void wmi_evt_ba_status(struct wil6210_priv *wil, int id, void *d,
604 621
605 txdata->agg_timeout = le16_to_cpu(evt->ba_timeout); 622 txdata->agg_timeout = le16_to_cpu(evt->ba_timeout);
606 txdata->agg_wsize = evt->agg_wsize; 623 txdata->agg_wsize = evt->agg_wsize;
624 txdata->addba_in_progress = false;
607} 625}
608 626
609static void wmi_evt_addba_rx_req(struct wil6210_priv *wil, int id, void *d, 627static void wmi_evt_addba_rx_req(struct wil6210_priv *wil, int id, void *d,
@@ -642,6 +660,7 @@ static void wmi_evt_delba(struct wil6210_priv *wil, int id, void *d, int len)
642 wil_dbg_wmi(wil, "DELBA Tx vring %d\n", i); 660 wil_dbg_wmi(wil, "DELBA Tx vring %d\n", i);
643 txdata->agg_timeout = 0; 661 txdata->agg_timeout = 0;
644 txdata->agg_wsize = 0; 662 txdata->agg_wsize = 0;
663 txdata->addba_in_progress = false;
645 664
646 break; /* max. 1 matching ring */ 665 break; /* max. 1 matching ring */
647 } 666 }