diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 80970c6a93..b6ff5ef9ed 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -3085,4 +3085,20 @@ struct cdp_pdev_attach_params { uint8_t pdev_id; uint32_t mlo_link_id; }; + +/* + * cdp_txrx_peer_params_update + * + * @osif_vdev: Handle for OS shim virtual device + * @peer_mac: Peer mac address + * @chip_id: CHIP ID + * @pdev_id: PDEV ID + */ +struct cdp_txrx_peer_params_update { + void *osif_vdev; + uint8_t *peer_mac; + uint8_t chip_id; + uint8_t pdev_id; +}; + #endif diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 4458f88eaa..9f60e820a9 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -790,6 +790,12 @@ enum WDI_EVENT { #endif WDI_EVENT_LITE_MON_RX, WDI_EVENT_LITE_MON_TX, + WDI_EVENT_TXRX_PEER_CREATE, + WDI_EVENT_PEER_UNMAP, + WDI_EVENT_PEER_DELETE, + WDI_EVENT_PEER_PRIMARY_UMAC_UPDATE, + WDI_EVENT_MCAST_PRIMARY_UPDATE, + WDI_EVENT_STA_PRIMARY_UMAC_UPDATE, /* End of new event items */ WDI_EVENT_LAST }; diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index e6a070b629..1ffe633e15 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -2168,10 +2168,21 @@ static void dp_txrx_set_mlo_mcast_primary_vdev_param_be( HAL_TX_MCAST_CTRL_NO_SPECIAL); if (be_vdev->mcast_primary) { + struct cdp_txrx_peer_params_update params = {0}; + dp_mcast_mlo_iter_ptnr_vdev(be_soc, be_vdev, dp_mlo_mcast_reset_pri_mcast, (void *)&be_vdev->mcast_primary, DP_MOD_ID_TX_MCAST); + + params.chip_id = be_soc->mlo_chip_id; + params.pdev_id = vdev->pdev->pdev_id; + params.osif_vdev = vdev->osif_vdev; + dp_wdi_event_handler( + WDI_EVENT_MCAST_PRIMARY_UPDATE, + vdev->pdev->soc, + (void *)¶ms, CDP_INVALID_PEER, + WDI_NO_VAL, params.pdev_id); } } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 596c686cf5..b56daee9f4 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -7815,6 +7815,7 @@ static QDF_STATUS dp_txrx_peer_detach(struct dp_soc *soc, struct dp_peer *peer) { struct dp_txrx_peer *txrx_peer; struct dp_pdev *pdev; + struct cdp_txrx_peer_params_update params = {0}; /* dp_txrx_peer exists for mld peer and legacy peer */ if (peer->txrx_peer) { @@ -7822,6 +7823,13 @@ static QDF_STATUS dp_txrx_peer_detach(struct dp_soc *soc, struct dp_peer *peer) peer->txrx_peer = NULL; pdev = txrx_peer->vdev->pdev; + params.osif_vdev = (void *)peer->vdev->osif_vdev; + params.peer_mac = peer->mac_addr.raw; + + dp_wdi_event_handler(WDI_EVENT_PEER_DELETE, soc, + (void *)¶ms, peer->peer_id, + WDI_NO_VAL, pdev->pdev_id); + dp_peer_defrag_rx_tids_deinit(txrx_peer); /* * Deallocate the extended stats contenxt @@ -7841,6 +7849,7 @@ static QDF_STATUS dp_txrx_peer_attach(struct dp_soc *soc, struct dp_peer *peer) { struct dp_txrx_peer *txrx_peer; struct dp_pdev *pdev; + struct cdp_txrx_peer_params_update params = {0}; txrx_peer = (struct dp_txrx_peer *)qdf_mem_malloc(sizeof(*txrx_peer)); @@ -7884,6 +7893,15 @@ static QDF_STATUS dp_txrx_peer_attach(struct dp_soc *soc, struct dp_peer *peer) dp_txrx_peer_attach_add(soc, peer, txrx_peer); + params.peer_mac = peer->mac_addr.raw; + params.osif_vdev = (void *)peer->vdev->osif_vdev; + params.chip_id = dp_mlo_get_chip_id(soc); + params.pdev_id = peer->vdev->pdev->pdev_id; + + dp_wdi_event_handler(WDI_EVENT_TXRX_PEER_CREATE, soc, + (void *)¶ms, peer->peer_id, + WDI_NO_VAL, params.pdev_id); + return QDF_STATUS_SUCCESS; } @@ -8162,6 +8180,7 @@ QDF_STATUS dp_peer_mlo_setup( struct cdp_peer_setup_info *setup_info) { struct dp_peer *mld_peer = NULL; + struct cdp_txrx_peer_params_update params = {0}; /* Non-MLO connection, do nothing */ if (!setup_info || !setup_info->mld_peer_mac) @@ -8184,6 +8203,21 @@ QDF_STATUS dp_peer_mlo_setup( setup_info->mld_peer_mac, CDP_MLD_PEER_TYPE); + if (peer->vdev->opmode == wlan_op_mode_sta && + setup_info->is_primary_link) { + struct cdp_txrx_peer_params_update params = {0}; + + params.chip_id = dp_mlo_get_chip_id(soc); + params.pdev_id = peer->vdev->pdev->pdev_id; + params.osif_vdev = peer->vdev->osif_vdev; + + dp_wdi_event_handler( + WDI_EVENT_STA_PRIMARY_UMAC_UPDATE, + soc, + (void *)¶ms, peer->peer_id, + WDI_NO_VAL, params.pdev_id); + } + peer->first_link = setup_info->is_first_link; peer->primary_link = setup_info->is_primary_link; mld_peer = dp_mld_peer_find_hash_find(soc, @@ -8233,6 +8267,15 @@ QDF_STATUS dp_peer_mlo_setup( soc, mld_peer, prev_vdev, mld_peer->vdev); + params.osif_vdev = (void *)peer->vdev->osif_vdev; + params.peer_mac = peer->mac_addr.raw; + params.chip_id = dp_mlo_get_chip_id(soc); + params.pdev_id = peer->vdev->pdev->pdev_id; + + dp_wdi_event_handler( + WDI_EVENT_PEER_PRIMARY_UMAC_UPDATE, + soc, (void *)¶ms, peer->peer_id, + WDI_NO_VAL, params.pdev_id); } /* associate mld and link peer */ diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index c33969cde5..b278fa9271 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -3269,6 +3269,21 @@ dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id, return; } + vdev = peer->vdev; + + if (peer->txrx_peer) { + struct cdp_txrx_peer_params_update params = {0}; + + params.osif_vdev = (void *)vdev->osif_vdev; + params.peer_mac = peer->mac_addr.raw; + params.chip_id = dp_mlo_get_chip_id(soc); + params.pdev_id = vdev->pdev->pdev_id; + + dp_wdi_event_handler(WDI_EVENT_PEER_UNMAP, soc, + (void *)¶ms, peer_id, + WDI_NO_VAL, vdev->pdev->pdev_id); + } + /* If V2 Peer map messages are enabled AST entry has to be * freed here */