Bladeren bron

qcacmn: Support for ADD/DEL of AST for MLO peer

Support for addition of AST entries for MLO peer event.
Deletion is handled implicitly

Change-Id: Id1caa85370fac847d18dc3bcbecad726bf927d0f
CRs-Fixed: 3251691
Santosh Anbu 3 jaren geleden
bovenliggende
commit
c49d6a32c8
2 gewijzigde bestanden met toevoegingen van 23 en 2 verwijderingen
  1. 1 0
      dp/inc/cdp_txrx_cmn_struct.h
  2. 22 2
      dp/wifi3.0/dp_peer.c

+ 1 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -446,6 +446,7 @@ enum cdp_txrx_ast_entry_type {
 	CDP_TXRX_AST_TYPE_STA_BSS,	 /* BSS entry(STA mode) */
 	CDP_TXRX_AST_TYPE_DA,	/* AST entry based on Destination address */
 	CDP_TXRX_AST_TYPE_WDS_HM_SEC, /* HM WDS entry for secondary radio */
+	CDP_TXRX_AST_TYPE_MLD, /* AST entry type for MLD peer */
 	CDP_TXRX_AST_TYPE_MAX
 };
 

+ 22 - 2
dp/wifi3.0/dp_peer.c

@@ -1459,6 +1459,9 @@ QDF_STATUS dp_peer_host_add_map_ast(struct dp_soc *soc, uint16_t peer_id,
 		return QDF_STATUS_E_INVAL;
 	}
 
+	if (!is_wds && IS_MLO_DP_MLD_PEER(peer))
+		type = CDP_TXRX_AST_TYPE_MLD;
+
 	vdev = peer->vdev;
 	if (!vdev) {
 		dp_peer_err("%pK: Peers vdev is NULL", soc);
@@ -1468,6 +1471,7 @@ QDF_STATUS dp_peer_host_add_map_ast(struct dp_soc *soc, uint16_t peer_id,
 
 	if (!dp_peer_state_cmp(peer, DP_PEER_STATE_ACTIVE)) {
 		if (type != CDP_TXRX_AST_TYPE_STATIC &&
+		    type != CDP_TXRX_AST_TYPE_MLD &&
 		    type != CDP_TXRX_AST_TYPE_SELF) {
 			status = QDF_STATUS_E_BUSY;
 			goto fail;
@@ -1479,10 +1483,14 @@ QDF_STATUS dp_peer_host_add_map_ast(struct dp_soc *soc, uint16_t peer_id,
 		      QDF_MAC_ADDR_REF(peer->mac_addr.raw), peer,
 		      QDF_MAC_ADDR_REF(mac_addr));
 
+	/*
+	 * In MLO scenario, there is possibility for same mac address
+	 * on both link mac address and MLD mac address.
+	 * Duplicate AST map needs to be handled for non-mld type.
+	 */
 	qdf_spin_lock_bh(&soc->ast_lock);
-
 	ast_entry = dp_peer_ast_hash_find_soc(soc, mac_addr);
-	if (ast_entry) {
+	if (ast_entry && type != CDP_TXRX_AST_TYPE_MLD) {
 		dp_peer_debug("AST present ID %d vid %d mac " QDF_MAC_ADDR_FMT,
 			      hw_peer_id, vdev_id,
 			      QDF_MAC_ADDR_REF(mac_addr));
@@ -1530,6 +1538,8 @@ QDF_STATUS dp_peer_host_add_map_ast(struct dp_soc *soc, uint16_t peer_id,
 	case CDP_TXRX_AST_TYPE_WDS:
 		ast_entry->next_hop = 1;
 		break;
+	case CDP_TXRX_AST_TYPE_MLD:
+		break;
 	default:
 		dp_peer_alert("%pK: Incorrect AST entry type", soc);
 	}
@@ -2975,6 +2985,16 @@ dp_rx_mlo_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
 	err = dp_peer_map_ast(soc, peer, peer_mac_addr, hw_peer_id,
 			      vdev_id, ast_hash, is_wds);
 
+	/*
+	 * If AST offload and host AST DB is enabled, populate AST entries on
+	 * host based on mlo peer map event from FW
+	 */
+	if (soc->ast_offload_support && soc->host_ast_db_enable) {
+		dp_peer_host_add_map_ast(soc, ml_peer_id, peer_mac_addr,
+					 hw_peer_id, vdev_id,
+					 ast_hash, is_wds);
+	}
+
 	return err;
 }
 #endif