Przeglądaj źródła

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: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Vladimir Kondratiev 11 lat temu
rodzic
commit
cbcf58661b

+ 2 - 1
drivers/net/wireless/ath/wil6210/debugfs.c

@@ -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
drivers/net/wireless/ath/wil6210/wil6210.h

@@ -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
drivers/net/wireless/ath/wil6210/wmi.c

@@ -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
drivers/net/wireless/ath/wil6210/wmi.h

@@ -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;
 
 
 /*
 /*