Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbcf5866 authored by Vladimir Kondratiev's avatar Vladimir Kondratiev Committed by Kalle Valo
Browse files

wil6210: control AMSDU on Tx side of Block Ack



When establishing Block Ack as originator (Tx), control
AMSDU flag when sending ADDBA and update status upon
establishment flow completion. To be used in AMSDU flows

Signed-off-by: default avatarVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 995cdd0e
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -114,9 +114,10 @@ static int wil_vring_debugfs_show(struct seq_file *s, void *data)
			snprintf(name, sizeof(name), "tx_%2d", i);
			snprintf(name, sizeof(name), "tx_%2d", i);


			seq_printf(s,
			seq_printf(s,
				   "\n%pM CID %d TID %d BACK([%d] %d TU) [%3d|%3d] idle %3d%%\n",
				   "\n%pM CID %d TID %d BACK([%d] %d TU A%s) [%3d|%3d] idle %3d%%\n",
				   wil->sta[cid].addr, cid, tid,
				   wil->sta[cid].addr, cid, tid,
				   txdata->agg_wsize, txdata->agg_timeout,
				   txdata->agg_wsize, txdata->agg_timeout,
				   txdata->agg_amsdu ? "+" : "-",
				   used, avail, (int)idle);
				   used, avail, (int)idle);


			wil_print_vring(s, wil, name, vring, '_', 'H');
			wil_print_vring(s, wil, name, vring, '_', 'H');
+1 −0
Original line number Original line Diff line number Diff line
@@ -315,6 +315,7 @@ struct vring_tx_data {
	cycles_t idle, last_idle, begin;
	cycles_t idle, last_idle, begin;
	u8 agg_wsize; /* agreed aggregation window, 0 - no agg */
	u8 agg_wsize; /* agreed aggregation window, 0 - no agg */
	u16 agg_timeout;
	u16 agg_timeout;
	u8 agg_amsdu;
	bool addba_in_progress; /* if set, agg_xxx is for request in progress */
	bool addba_in_progress; /* if set, agg_xxx is for request in progress */
};
};


+6 −2
Original line number Original line Diff line number Diff line
@@ -608,10 +608,11 @@ static void wmi_evt_ba_status(struct wil6210_priv *wil, int id, void *d,
	struct wmi_vring_ba_status_event *evt = d;
	struct wmi_vring_ba_status_event *evt = d;
	struct vring_tx_data *txdata;
	struct vring_tx_data *txdata;


	wil_dbg_wmi(wil, "BACK[%d] %s {%d} timeout %d\n",
	wil_dbg_wmi(wil, "BACK[%d] %s {%d} timeout %d AMSDU%s\n",
		    evt->ringid,
		    evt->ringid,
		    evt->status == WMI_BA_AGREED ? "OK" : "N/A",
		    evt->status == WMI_BA_AGREED ? "OK" : "N/A",
		    evt->agg_wsize, __le16_to_cpu(evt->ba_timeout));
		    evt->agg_wsize, __le16_to_cpu(evt->ba_timeout),
		    evt->amsdu ? "+" : "-");


	if (evt->ringid >= WIL6210_MAX_TX_RINGS) {
	if (evt->ringid >= WIL6210_MAX_TX_RINGS) {
		wil_err(wil, "invalid ring id %d\n", evt->ringid);
		wil_err(wil, "invalid ring id %d\n", evt->ringid);
@@ -621,12 +622,14 @@ static void wmi_evt_ba_status(struct wil6210_priv *wil, int id, void *d,
	if (evt->status != WMI_BA_AGREED) {
	if (evt->status != WMI_BA_AGREED) {
		evt->ba_timeout = 0;
		evt->ba_timeout = 0;
		evt->agg_wsize = 0;
		evt->agg_wsize = 0;
		evt->amsdu = 0;
	}
	}


	txdata = &wil->vring_tx_data[evt->ringid];
	txdata = &wil->vring_tx_data[evt->ringid];


	txdata->agg_timeout = le16_to_cpu(evt->ba_timeout);
	txdata->agg_timeout = le16_to_cpu(evt->ba_timeout);
	txdata->agg_wsize = evt->agg_wsize;
	txdata->agg_wsize = evt->agg_wsize;
	txdata->agg_amsdu = evt->amsdu;
	txdata->addba_in_progress = false;
	txdata->addba_in_progress = false;
}
}


@@ -1172,6 +1175,7 @@ int wmi_addba(struct wil6210_priv *wil, u8 ringid, u8 size, u16 timeout)
		.ringid = ringid,
		.ringid = ringid,
		.agg_max_wsize = size,
		.agg_max_wsize = size,
		.ba_timeout = cpu_to_le16(timeout),
		.ba_timeout = cpu_to_le16(timeout),
		.amsdu = 0,
	};
	};


	wil_dbg_wmi(wil, "%s(ring %d size %d timeout %d)\n", __func__,
	wil_dbg_wmi(wil, "%s(ring %d size %d timeout %d)\n", __func__,
+11 −1
Original line number Original line Diff line number Diff line
@@ -586,6 +586,7 @@ struct wmi_vring_ba_en_cmd {
	u8 ringid;
	u8 ringid;
	u8 agg_max_wsize;
	u8 agg_max_wsize;
	__le16 ba_timeout;
	__le16 ba_timeout;
	u8 amsdu;
} __packed;
} __packed;


/*
/*
@@ -1052,14 +1053,23 @@ struct wmi_scan_complete_event {
enum wmi_vring_ba_status {
enum wmi_vring_ba_status {
	WMI_BA_AGREED			= 0,
	WMI_BA_AGREED			= 0,
	WMI_BA_NON_AGREED		= 1,
	WMI_BA_NON_AGREED		= 1,
	/* BA_EN in middle of teardown flow */
	WMI_BA_TD_WIP			= 2,
	/* BA_DIS or BA_EN in middle of BA SETUP flow */
	WMI_BA_SETUP_WIP		= 3,
	/* BA_EN when the BA session is already active */
	WMI_BA_SESSION_ACTIVE		= 4,
	/* BA_DIS when the BA session is not active */
	WMI_BA_SESSION_NOT_ACTIVE	= 5,
};
};


struct wmi_vring_ba_status_event {
struct wmi_vring_ba_status_event {
	__le16 status;
	__le16 status; /* enum wmi_vring_ba_status */
	u8 reserved[2];
	u8 reserved[2];
	u8 ringid;
	u8 ringid;
	u8 agg_wsize;
	u8 agg_wsize;
	__le16 ba_timeout;
	__le16 ba_timeout;
	u8 amsdu;
} __packed;
} __packed;


/*
/*