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

qcacmn: Add APIs to get AST entry with pdev_id

With HKv1 WAR to handle DBDC backhaul SON cases a AST
entry for same mac can exist on different radio added
CDP APIs to support the same

Change-Id: I374b8af3fe5e34f62eeb5b09819e331fdeda602a
Chaithanya Garrepalli 6 лет назад
Родитель
Сommit
cf347d1686
7 измененных файлов с 141 добавлено и 30 удалено
  1. 61 4
      dp/inc/cdp_txrx_cmn.h
  2. 11 2
      dp/inc/cdp_txrx_ops.h
  3. 45 9
      dp/wifi3.0/dp_main.c
  4. 13 9
      dp/wifi3.0/dp_peer.c
  5. 2 2
      dp/wifi3.0/dp_peer.h
  6. 1 2
      dp/wifi3.0/dp_rx_err.c
  7. 8 2
      dp/wifi3.0/dp_tx.c

+ 61 - 4
dp/inc/cdp_txrx_cmn.h

@@ -310,7 +310,7 @@ static inline void cdp_peer_setup
 			peer);
 }
 
-static inline void *cdp_peer_ast_hash_find
+static inline void *cdp_peer_ast_hash_find_soc
 	(ol_txrx_soc_handle soc, uint8_t *ast_mac_addr)
 {
 	if (!soc || !soc->ops) {
@@ -321,11 +321,32 @@ static inline void *cdp_peer_ast_hash_find
 	}
 
 	if (!soc->ops->cmn_drv_ops ||
-	    !soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find)
+	    !soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find_soc)
 		return NULL;
 
-	return soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find(soc,
-								ast_mac_addr);
+	return soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find_soc(soc,
+								  ast_mac_addr);
+}
+
+static inline void *cdp_peer_ast_hash_find_by_pdevid
+	(ol_txrx_soc_handle soc, uint8_t *ast_mac_addr,
+	 uint8_t pdev_id)
+{
+	if (!soc || !soc->ops) {
+		QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Invalid Instance:", __func__);
+		QDF_BUG(0);
+		return NULL;
+	}
+
+	if (!soc->ops->cmn_drv_ops ||
+	    !soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find_by_pdevid)
+		return NULL;
+
+	return soc->ops->cmn_drv_ops->txrx_peer_ast_hash_find_by_pdevid
+					(soc,
+					 ast_mac_addr,
+					 pdev_id);
 }
 
 static inline int cdp_peer_add_ast
@@ -594,6 +615,42 @@ void cdp_peer_ast_free_entry(struct cdp_soc_t *soc,
 }
 #endif
 
+static inline struct cdp_peer *cdp_peer_ast_get_peer
+	(ol_txrx_soc_handle soc, void *ast_handle)
+{
+	if (!soc || !soc->ops) {
+		QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Invalid Instance:", __func__);
+		QDF_BUG(0);
+		return NULL;
+	}
+
+	if (!soc->ops->cmn_drv_ops ||
+	    !soc->ops->cmn_drv_ops->txrx_peer_ast_get_peer)
+		return NULL;
+
+	return soc->ops->cmn_drv_ops->txrx_peer_ast_get_peer(soc, ast_handle);
+}
+
+static inline uint32_t cdp_peer_ast_get_nexthop_peer_id
+	(ol_txrx_soc_handle soc, void *ast_handle)
+{
+	if (!soc || !soc->ops) {
+		QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Invalid Instance:", __func__);
+		QDF_BUG(0);
+		return CDP_INVALID_PEER;
+	}
+
+	if (!soc->ops->cmn_drv_ops ||
+	    !soc->ops->cmn_drv_ops->txrx_peer_ast_get_nexthop_peer_id)
+		return CDP_INVALID_PEER;
+
+	return soc->ops->cmn_drv_ops->txrx_peer_ast_get_nexthop_peer_id
+					(soc,
+					 ast_handle);
+}
+
 static inline void cdp_peer_teardown
 	(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, void *peer)
 {

+ 11 - 2
dp/inc/cdp_txrx_ops.h

@@ -105,10 +105,13 @@ struct cdp_cmn_ops {
 		(ol_txrx_soc_handle soc, struct cdp_peer *peer_hdl,
 		uint8_t *mac_addr, uint32_t flags);
 
-
-	void *(*txrx_peer_ast_hash_find)
+	void *(*txrx_peer_ast_hash_find_soc)
 		(ol_txrx_soc_handle soc, uint8_t *ast_mac_addr);
 
+	void *(*txrx_peer_ast_hash_find_by_pdevid)
+		(ol_txrx_soc_handle soc, uint8_t *ast_mac_addr,
+		 uint8_t pdev_id);
+
 	uint8_t (*txrx_peer_ast_get_pdev_id)
 		(ol_txrx_soc_handle soc, void *ast_hdl);
 
@@ -136,6 +139,12 @@ struct cdp_cmn_ops {
 	enum cdp_txrx_ast_entry_type (*txrx_peer_ast_get_type)
 		(ol_txrx_soc_handle soc, void *ast_hdl);
 
+	struct cdp_peer* (*txrx_peer_ast_get_peer)
+		(ol_txrx_soc_handle soc, void *ast_hdl);
+
+	uint32_t (*txrx_peer_ast_get_nexthop_peer_id)
+		(ol_txrx_soc_handle soc, void *ast_hdl);
+
 	void (*txrx_peer_delete)(void *peer, uint32_t bitmap);
 
 	int (*txrx_set_monitor_mode)(struct cdp_vdev *vdev,

+ 45 - 9
dp/wifi3.0/dp_main.c

@@ -485,14 +485,16 @@ static int dp_peer_update_ast_wifi3(struct cdp_soc_t *soc_hdl,
 	int status = -1;
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
 	struct dp_ast_entry  *ast_entry = NULL;
+	struct dp_peer *peer = (struct dp_peer *)peer_hdl;
 
 	qdf_spin_lock_bh(&soc->ast_lock);
-	ast_entry = dp_peer_ast_hash_find(soc, wds_macaddr);
+	ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, wds_macaddr,
+						    peer->vdev->pdev->pdev_id);
 
 	if (ast_entry) {
 		status = dp_peer_update_ast(soc,
-					    (struct dp_peer *)peer_hdl,
-					   ast_entry, flags);
+					    peer,
+					    ast_entry, flags);
 	}
 
 	qdf_spin_unlock_bh(&soc->ast_lock);
@@ -511,9 +513,11 @@ static void dp_wds_reset_ast_wifi3(struct cdp_soc_t *soc_hdl,
 {
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
 	struct dp_ast_entry *ast_entry = NULL;
+	struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
 
 	qdf_spin_lock_bh(&soc->ast_lock);
-	ast_entry = dp_peer_ast_hash_find(soc, wds_macaddr);
+	ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, wds_macaddr,
+						    vdev->pdev->pdev_id);
 
 	if (ast_entry) {
 		if ((ast_entry->type != CDP_TXRX_AST_TYPE_STATIC) &&
@@ -607,13 +611,27 @@ static void dp_wds_flush_ast_table_wifi3(struct cdp_soc_t  *soc_hdl)
 	qdf_spin_unlock_bh(&soc->ast_lock);
 }
 
-static void *dp_peer_ast_hash_find_wifi3(struct cdp_soc_t *soc_hdl,
-						uint8_t *ast_mac_addr)
+static void *dp_peer_ast_hash_find_soc_wifi3(struct cdp_soc_t *soc_hdl,
+					     uint8_t *ast_mac_addr)
 {
 	struct dp_ast_entry *ast_entry;
 	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
+
 	qdf_spin_lock_bh(&soc->ast_lock);
-	ast_entry = dp_peer_ast_hash_find(soc, ast_mac_addr);
+	ast_entry = dp_peer_ast_hash_find_soc(soc, ast_mac_addr);
+	qdf_spin_unlock_bh(&soc->ast_lock);
+	return (void *)ast_entry;
+}
+
+static void *dp_peer_ast_hash_find_by_pdevid_wifi3(struct cdp_soc_t *soc_hdl,
+						   uint8_t *ast_mac_addr,
+						   uint8_t pdev_id)
+{
+	struct dp_ast_entry *ast_entry;
+	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
+
+	qdf_spin_lock_bh(&soc->ast_lock);
+	ast_entry = dp_peer_ast_hash_find_by_pdevid(soc, ast_mac_addr, pdev_id);
 	qdf_spin_unlock_bh(&soc->ast_lock);
 	return (void *)ast_entry;
 }
@@ -701,6 +719,19 @@ void dp_peer_ast_free_entry_wifi3(struct cdp_soc_t *soc_handle,
 }
 #endif
 
+static struct cdp_peer *dp_peer_ast_get_peer_wifi3(
+					struct cdp_soc_t *soc_hdl,
+					void *ast_entry_hdl)
+{
+	return (struct cdp_peer *)((struct dp_ast_entry *)ast_entry_hdl)->peer;
+}
+
+static uint32_t dp_peer_ast_get_nexhop_peer_id_wifi3(
+					struct cdp_soc_t *soc_hdl,
+					void *ast_entry_hdl)
+{
+	return ((struct dp_ast_entry *)ast_entry_hdl)->peer->peer_ids[0];
+}
 /**
  * dp_srng_find_ring_in_mask() - find which ext_group a ring belongs
  * @ring_num: ring num of the ring being queried
@@ -4016,7 +4047,7 @@ static void *dp_peer_create_wifi3(struct cdp_vdev *vdev_handle,
 		 * MAC addresses, we could deduce it as a WDS entry
 		 */
 		qdf_spin_lock_bh(&soc->ast_lock);
-		ast_entry = dp_peer_ast_hash_find(soc, peer_mac_addr);
+		ast_entry = dp_peer_ast_hash_find_soc(soc, peer_mac_addr);
 		if (ast_entry)
 			dp_peer_del_ast(soc, ast_entry);
 		qdf_spin_unlock_bh(&soc->ast_lock);
@@ -7833,11 +7864,16 @@ static struct cdp_cmn_ops dp_ops_cmn = {
 	.txrx_peer_add_ast = dp_peer_add_ast_wifi3,
 	.txrx_peer_del_ast = dp_peer_del_ast_wifi3,
 	.txrx_peer_update_ast = dp_peer_update_ast_wifi3,
-	.txrx_peer_ast_hash_find = dp_peer_ast_hash_find_wifi3,
+	.txrx_peer_ast_hash_find_soc = dp_peer_ast_hash_find_soc_wifi3,
+	.txrx_peer_ast_hash_find_by_pdevid =
+		dp_peer_ast_hash_find_by_pdevid_wifi3,
 	.txrx_peer_ast_get_pdev_id = dp_peer_ast_get_pdev_id_wifi3,
 	.txrx_peer_ast_get_next_hop = dp_peer_ast_get_next_hop_wifi3,
 	.txrx_peer_ast_set_type = dp_peer_ast_set_type_wifi3,
 	.txrx_peer_ast_get_type = dp_peer_ast_get_type_wifi3,
+	.txrx_peer_ast_get_peer = dp_peer_ast_get_peer_wifi3,
+	.txrx_peer_ast_get_nexthop_peer_id =
+		dp_peer_ast_get_nexhop_peer_id_wifi3,
 #if defined(FEATURE_AST) && defined(AST_HKV1_WORKAROUND)
 	.txrx_peer_ast_set_cp_ctx = dp_peer_ast_set_cp_ctx_wifi3,
 	.txrx_peer_ast_get_cp_ctx = dp_peer_ast_get_cp_ctx_wifi3,

+ 13 - 9
dp/wifi3.0/dp_peer.c

@@ -368,10 +368,7 @@ struct dp_ast_entry *dp_peer_ast_list_find(struct dp_soc *soc,
 
 /*
  * dp_peer_ast_hash_find_by_pdevid() - Find AST entry by MAC address
- *				       and pdev id
  * @soc: SoC handle
- * @ast_mac_addr: mac address
- * @pdev_id: pdev_id
  *
  * It assumes caller has taken the ast lock to protect the access to
  * AST hash table
@@ -402,7 +399,7 @@ struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc,
 }
 
 /*
- * dp_peer_ast_hash_find() - Find AST entry by MAC address
+ * dp_peer_ast_hash_find_soc() - Find AST entry by MAC address
  * @soc: SoC handle
  *
  * It assumes caller has taken the ast lock to protect the access to
@@ -410,8 +407,8 @@ struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc,
  *
  * Return: AST entry
  */
-struct dp_ast_entry *dp_peer_ast_hash_find(struct dp_soc *soc,
-						uint8_t *ast_mac_addr)
+struct dp_ast_entry *dp_peer_ast_hash_find_soc(struct dp_soc *soc,
+					       uint8_t *ast_mac_addr)
 {
 	union dp_align_mac_addr local_mac_addr_aligned, *mac_addr;
 	unsigned index;
@@ -550,7 +547,7 @@ int dp_peer_add_ast(struct dp_soc *soc,
 			return 0;
 		}
 	} else {
-		ast_entry = dp_peer_ast_hash_find(soc, mac_addr);
+		ast_entry = dp_peer_ast_hash_find_soc(soc, mac_addr);
 
 		if (ast_entry) {
 			if (ast_entry->type == CDP_TXRX_AST_TYPE_MEC) {
@@ -826,8 +823,15 @@ int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer,
 	return 1;
 }
 
-struct dp_ast_entry *dp_peer_ast_hash_find(struct dp_soc *soc,
-						uint8_t *ast_mac_addr)
+struct dp_ast_entry *dp_peer_ast_hash_find_soc(struct dp_soc *soc,
+					       uint8_t *ast_mac_addr)
+{
+	return NULL;
+}
+
+struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc,
+						     uint8_t *ast_mac_addr,
+						     uint8_t pdev_id)
 {
 	return NULL;
 }

+ 2 - 2
dp/wifi3.0/dp_peer.h

@@ -116,8 +116,8 @@ struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc,
 						     uint8_t *ast_mac_addr,
 						     uint8_t pdev_id);
 
-struct dp_ast_entry *dp_peer_ast_hash_find(struct dp_soc *soc,
-						uint8_t *ast_mac_addr);
+struct dp_ast_entry *dp_peer_ast_hash_find_soc(struct dp_soc *soc,
+					       uint8_t *ast_mac_addr);
 
 struct dp_ast_entry *dp_peer_ast_list_find(struct dp_soc *soc,
 					   struct dp_peer *peer,

+ 1 - 2
dp/wifi3.0/dp_rx_err.c

@@ -127,7 +127,6 @@ static inline bool dp_rx_mcast_echo_check(struct dp_soc *soc,
 			 * ast is not in ast_table, we use the below API to get
 			 * AST entry for STA's own mac_address.
 			 */
-
 			ase = dp_peer_ast_list_find(soc, peer,
 						    &data[DP_MAC_ADDR_LEN]);
 			if (ase) {
@@ -136,7 +135,7 @@ static inline bool dp_rx_mcast_echo_check(struct dp_soc *soc,
 			}
 		}
 	} else
-		ase = dp_peer_ast_hash_find(soc, &data[DP_MAC_ADDR_LEN]);
+		ase = dp_peer_ast_hash_find_soc(soc, &data[DP_MAC_ADDR_LEN]);
 
 	if (ase) {
 

+ 8 - 2
dp/wifi3.0/dp_tx.c

@@ -1722,7 +1722,10 @@ static qdf_nbuf_t dp_tx_prepare_nawds(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
 	qdf_nbuf_t nbuf_copy;
 
 	qdf_spin_lock_bh(&(soc->ast_lock));
-	ast_entry = dp_peer_ast_hash_find(soc, (uint8_t *)(eh->ether_shost));
+	ast_entry = dp_peer_ast_hash_find_by_pdevid
+				(soc,
+				 (uint8_t *)(eh->ether_shost),
+				 vdev->pdev->pdev_id);
 
 	if (ast_entry)
 		sa_peer = ast_entry->peer;
@@ -2157,7 +2160,10 @@ void dp_tx_reinject_handler(struct dp_tx_desc_s *tx_desc, uint8_t *status)
 
 	qdf_spin_lock_bh(&(soc->ast_lock));
 
-	ast_entry = dp_peer_ast_hash_find(soc, (uint8_t *)(eh->ether_shost));
+	ast_entry = dp_peer_ast_hash_find_by_pdevid
+				(soc,
+				 (uint8_t *)(eh->ether_shost),
+				 vdev->pdev->pdev_id);
 
 	if (ast_entry)
 		sa_peer = ast_entry->peer;