Просмотр исходного кода

qcacmn: Add API to update DP rx tid BA window size

Currently, in case where AP advertizes BA window size
which is different than our max supported BA window size,
the HW gets configured for BA window size advertized by
the AP, whereas the ADDBA response indicates the window
size of the STA, which is less than the AP.
This mismatch leads to the BA bitmap to be incorrect.

Fix this by exposing an API from datapath for the update
of the final BA window size which is populated in the
ADDBA response.

Change-Id: I81a039f47a775990b426e9aca1daaaa9bdb6e88f
CRs-Fixed: 3187941
Rakesh Pillai 3 лет назад
Родитель
Сommit
f74f73dc68
5 измененных файлов с 79 добавлено и 0 удалено
  1. 30 0
      dp/inc/cdp_txrx_cmn.h
  2. 4 0
      dp/inc/cdp_txrx_ops.h
  3. 15 0
      dp/wifi3.0/dp_internal.h
  4. 1 0
      dp/wifi3.0/dp_main.c
  5. 29 0
      dp/wifi3.0/dp_peer.c

+ 30 - 0
dp/inc/cdp_txrx_cmn.h

@@ -1307,6 +1307,36 @@ cdp_tso_soc_detach(ol_txrx_soc_handle soc)
 	return soc->ops->cmn_drv_ops->txrx_tso_soc_detach(soc);
 }
 
+/**
+ * cdp_tid_update_ba_win_size() - Update the DP tid BA window size
+ * @soc: soc handle
+ * @peer_mac: mac address of peer handle
+ * @vdev_id: id of vdev handle
+ * @tid: tid
+ * @buffersize: BA window size
+ *
+ * Return: success/failure of tid update
+ */
+static inline QDF_STATUS
+cdp_tid_update_ba_win_size(ol_txrx_soc_handle soc,
+			   uint8_t *peer_mac, uint16_t vdev_id, uint8_t tid,
+			   uint16_t buffersize)
+{
+	if (!soc || !soc->ops) {
+		dp_cdp_debug("Invalid Instance:");
+		QDF_BUG(0);
+		return 0;
+	}
+
+	if (!soc->ops->cmn_drv_ops ||
+	    !soc->ops->cmn_drv_ops->tid_update_ba_win_size)
+		return 0;
+
+	return soc->ops->cmn_drv_ops->tid_update_ba_win_size(soc, peer_mac,
+							     vdev_id, tid,
+							     buffersize);
+}
+
 /**
  * cdp_addba_resp_tx_completion() - Indicate addba response tx
  * completion to dp to change tid state.

+ 4 - 0
dp/inc/cdp_txrx_ops.h

@@ -440,6 +440,10 @@ struct cdp_cmn_ops {
 	int (*delba_process)(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
 			     uint16_t vdev_id, int tid, uint16_t reasoncode);
 
+	QDF_STATUS (*tid_update_ba_win_size)(ol_txrx_soc_handle soc,
+					     uint8_t *peer_mac,
+					     uint16_t vdev_id, uint8_t tid,
+					     uint16_t buffersize);
 	/**
 	 * delba_tx_completion() - Indicate delba tx status
 	 * @cdp_soc: soc handle

+ 15 - 0
dp/wifi3.0/dp_internal.h

@@ -2002,6 +2002,21 @@ QDF_STATUS dp_set_addba_response(struct cdp_soc_t *cdp_soc,
 int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
 			   uint16_t vdev_id, int tid,
 			   uint16_t reasoncode);
+
+/**
+ * dp_rx_tid_update_ba_win_size() - Update the DP tid BA window size
+ * @soc: soc handle
+ * @peer_mac: mac address of peer handle
+ * @vdev_id: id of vdev handle
+ * @tid: tid
+ * @buffersize: BA window size
+ *
+ * Return: success/failure of tid update
+ */
+QDF_STATUS dp_rx_tid_update_ba_win_size(struct cdp_soc_t *cdp_soc,
+					uint8_t *peer_mac, uint16_t vdev_id,
+					uint8_t tid, uint16_t buffersize);
+
 /*
  * dp_delba_tx_completion_wifi3() -  Handle delba tx completion
  *

+ 1 - 0
dp/wifi3.0/dp_main.c

@@ -12469,6 +12469,7 @@ static struct cdp_cmn_ops dp_ops_cmn = {
 	.delba_process = dp_delba_process_wifi3,
 	.set_addba_response = dp_set_addba_response,
 	.flush_cache_rx_queue = NULL,
+	.tid_update_ba_win_size = dp_rx_tid_update_ba_win_size,
 	/* TODO: get API's for dscp-tid need to be added*/
 	.set_vdev_dscp_tid_map = dp_set_vdev_dscp_tid_map_wifi3,
 	.set_pdev_dscp_tid_map = dp_set_pdev_dscp_tid_map_wifi3,

+ 29 - 0
dp/wifi3.0/dp_peer.c

@@ -4299,6 +4299,35 @@ static void dp_check_ba_buffersize(struct dp_peer *peer,
 	}
 }
 
+QDF_STATUS dp_rx_tid_update_ba_win_size(struct cdp_soc_t *cdp_soc,
+					uint8_t *peer_mac, uint16_t vdev_id,
+					uint8_t tid, uint16_t buffersize)
+{
+	struct dp_rx_tid *rx_tid = NULL;
+	struct dp_peer *peer;
+
+	peer = dp_peer_get_tgt_peer_hash_find((struct dp_soc *)cdp_soc,
+					      peer_mac, 0, vdev_id,
+					      DP_MOD_ID_CDP);
+	if (!peer) {
+		dp_peer_debug("%pK: Peer is NULL!\n", cdp_soc);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	rx_tid = &peer->rx_tid[tid];
+
+	qdf_spin_lock_bh(&rx_tid->tid_lock);
+	rx_tid->ba_win_size = buffersize;
+	qdf_spin_unlock_bh(&rx_tid->tid_lock);
+
+	dp_info("peer "QDF_MAC_ADDR_FMT", tid %d, update BA win size to %d",
+		QDF_MAC_ADDR_REF(peer->mac_addr.raw), tid, buffersize);
+
+	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
+
+	return QDF_STATUS_SUCCESS;
+}
+
 #define DP_RX_BA_SESSION_DISABLE  1
 
 /*