diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 7300e2752e..a993601a66 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/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 }; diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index d0f5fa3165..459686fd91 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/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