Commit 3a3def8d authored by Vladimir Kondratiev's avatar Vladimir Kondratiev Committed by Kalle Valo

wil6210: allow to configure ADDBA request

For manual ADDBA configuration, allow to set desired window size or
disable automatic mechanism.

Introduce module parameter (int) agg_wsize. It can be changed on run time,
will be taken into account on the next connect. Interpretation:
- <0 - disable automatic ADDBA; intended for manual testing through debugfs
- 0 - use automatically calculated window size
- >0 - use this for window size. Clipped by maximum supported by the hardware
with current environment.
Signed-off-by: default avatarVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 3a124ed6
...@@ -437,7 +437,7 @@ void wil_back_tx_flush(struct wil6210_priv *wil) ...@@ -437,7 +437,7 @@ void wil_back_tx_flush(struct wil6210_priv *wil)
mutex_unlock(&wil->back_tx_mutex); mutex_unlock(&wil->back_tx_mutex);
} }
int wil_addba_tx_request(struct wil6210_priv *wil, u8 ringid) int wil_addba_tx_request(struct wil6210_priv *wil, u8 ringid, u16 wsize)
{ {
struct wil_back_tx *req = kzalloc(sizeof(*req), GFP_KERNEL); struct wil_back_tx *req = kzalloc(sizeof(*req), GFP_KERNEL);
...@@ -445,7 +445,7 @@ int wil_addba_tx_request(struct wil6210_priv *wil, u8 ringid) ...@@ -445,7 +445,7 @@ int wil_addba_tx_request(struct wil6210_priv *wil, u8 ringid)
return -ENOMEM; return -ENOMEM;
req->ringid = ringid; req->ringid = ringid;
req->agg_wsize = wil_agg_size(wil, 0); req->agg_wsize = wil_agg_size(wil, wsize);
req->agg_timeout = 0; req->agg_timeout = 0;
mutex_lock(&wil->back_tx_mutex); mutex_lock(&wil->back_tx_mutex);
......
...@@ -701,8 +701,8 @@ int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size, ...@@ -701,8 +701,8 @@ int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size,
vring->hwtail = le32_to_cpu(reply.cmd.tx_vring_tail_ptr); vring->hwtail = le32_to_cpu(reply.cmd.tx_vring_tail_ptr);
txdata->enabled = 1; txdata->enabled = 1;
if (wil->sta[cid].data_port_open) if (wil->sta[cid].data_port_open && (agg_wsize >= 0))
wil_addba_tx_request(wil, id); wil_addba_tx_request(wil, id, agg_wsize);
return 0; return 0;
out_free: out_free:
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
extern bool no_fw_recovery; extern bool no_fw_recovery;
extern unsigned int mtu_max; extern unsigned int mtu_max;
extern int agg_wsize;
#define WIL_NAME "wil6210" #define WIL_NAME "wil6210"
#define WIL_FW_NAME "wil6210.fw" #define WIL_FW_NAME "wil6210.fw"
...@@ -613,7 +614,7 @@ int wil_addba_rx_request(struct wil6210_priv *wil, u8 cidxtid, ...@@ -613,7 +614,7 @@ int wil_addba_rx_request(struct wil6210_priv *wil, u8 cidxtid,
__le16 ba_timeout, __le16 ba_seq_ctrl); __le16 ba_timeout, __le16 ba_seq_ctrl);
void wil_back_rx_worker(struct work_struct *work); void wil_back_rx_worker(struct work_struct *work);
void wil_back_rx_flush(struct wil6210_priv *wil); void wil_back_rx_flush(struct wil6210_priv *wil);
int wil_addba_tx_request(struct wil6210_priv *wil, u8 ringid); int wil_addba_tx_request(struct wil6210_priv *wil, u8 ringid, u16 wsize);
void wil_back_tx_worker(struct work_struct *work); void wil_back_tx_worker(struct work_struct *work);
void wil_back_tx_flush(struct wil6210_priv *wil); void wil_back_tx_flush(struct wil6210_priv *wil);
......
...@@ -27,6 +27,11 @@ static uint max_assoc_sta = 1; ...@@ -27,6 +27,11 @@ static uint max_assoc_sta = 1;
module_param(max_assoc_sta, uint, S_IRUGO | S_IWUSR); module_param(max_assoc_sta, uint, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(max_assoc_sta, " Max number of stations associated to the AP"); MODULE_PARM_DESC(max_assoc_sta, " Max number of stations associated to the AP");
int agg_wsize; /* = 0; */
module_param(agg_wsize, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(agg_wsize, " Window size for Tx Block Ack after connect;"
" 0 - use default; < 0 - don't auto-establish");
/** /**
* WMI event receiving - theory of operations * WMI event receiving - theory of operations
* *
...@@ -544,7 +549,7 @@ static void wmi_evt_eapol_rx(struct wil6210_priv *wil, int id, ...@@ -544,7 +549,7 @@ static void wmi_evt_eapol_rx(struct wil6210_priv *wil, int id,
} }
} }
static void wil_addba_tx_cid(struct wil6210_priv *wil, u8 cid) static void wil_addba_tx_cid(struct wil6210_priv *wil, u8 cid, u16 wsize)
{ {
struct vring_tx_data *t; struct vring_tx_data *t;
int i; int i;
...@@ -556,7 +561,7 @@ static void wil_addba_tx_cid(struct wil6210_priv *wil, u8 cid) ...@@ -556,7 +561,7 @@ static void wil_addba_tx_cid(struct wil6210_priv *wil, u8 cid)
if (!t->enabled) if (!t->enabled)
continue; continue;
wil_addba_tx_request(wil, i); wil_addba_tx_request(wil, i, wsize);
} }
} }
...@@ -574,7 +579,8 @@ static void wmi_evt_linkup(struct wil6210_priv *wil, int id, void *d, int len) ...@@ -574,7 +579,8 @@ static void wmi_evt_linkup(struct wil6210_priv *wil, int id, void *d, int len)
} }
wil->sta[cid].data_port_open = true; wil->sta[cid].data_port_open = true;
wil_addba_tx_cid(wil, cid); if (agg_wsize >= 0)
wil_addba_tx_cid(wil, cid, agg_wsize);
netif_carrier_on(ndev); netif_carrier_on(ndev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment