qcacmn: Add flexibility to flush MLO peers only
Add changes to support flushing of MLO peers only. This is required to support the mode-1 behavior of target recovery feature, where we delete MLO peers and retain legacy peers across SOCs which are not crashed. CRs-Fixed: 3243549 Change-Id: I5ae326bfffd1267768c83fd7f60fa1343ef305fe
This commit is contained in:

committed by
Madan Koyyalamudi

parent
21c6766062
commit
690e9eba92
@@ -254,7 +254,9 @@ cdp_vdev_detach(ol_txrx_soc_handle soc, uint8_t vdev_id,
|
|||||||
|
|
||||||
#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
|
#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
|
||||||
static inline void
|
static inline void
|
||||||
cdp_vdev_recovery_flush_peers(ol_txrx_soc_handle soc, uint8_t vdev_id)
|
cdp_vdev_recovery_flush_peers(ol_txrx_soc_handle soc,
|
||||||
|
uint8_t vdev_id,
|
||||||
|
bool mlo_peers_only)
|
||||||
{
|
{
|
||||||
if (!soc || !soc->ops) {
|
if (!soc || !soc->ops) {
|
||||||
dp_cdp_debug("Invalid Instance:");
|
dp_cdp_debug("Invalid Instance:");
|
||||||
@@ -266,7 +268,9 @@ cdp_vdev_recovery_flush_peers(ol_txrx_soc_handle soc, uint8_t vdev_id)
|
|||||||
!soc->ops->cmn_drv_ops->txrx_recovery_vdev_flush_peers)
|
!soc->ops->cmn_drv_ops->txrx_recovery_vdev_flush_peers)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
soc->ops->cmn_drv_ops->txrx_recovery_vdev_flush_peers(soc, vdev_id);
|
soc->ops->cmn_drv_ops->txrx_recovery_vdev_flush_peers(soc,
|
||||||
|
vdev_id,
|
||||||
|
mlo_peers_only);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -673,7 +673,8 @@ struct cdp_cmn_ops {
|
|||||||
|
|
||||||
#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
|
#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
|
||||||
void (*txrx_recovery_vdev_flush_peers)(struct cdp_soc_t *soc,
|
void (*txrx_recovery_vdev_flush_peers)(struct cdp_soc_t *soc,
|
||||||
uint8_t vdev_id);
|
uint8_t vdev_id,
|
||||||
|
bool mlo_peers_only);
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -242,7 +242,8 @@ static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc_hdl,
|
|||||||
uint8_t *peer_mac, uint32_t bitmap,
|
uint8_t *peer_mac, uint32_t bitmap,
|
||||||
enum cdp_peer_type peer_type);
|
enum cdp_peer_type peer_type);
|
||||||
static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle,
|
static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle,
|
||||||
bool unmap_only);
|
bool unmap_only,
|
||||||
|
bool mlo_peers_only);
|
||||||
#ifdef ENABLE_VERBOSE_DEBUG
|
#ifdef ENABLE_VERBOSE_DEBUG
|
||||||
bool is_dp_verbose_debug_enabled;
|
bool is_dp_verbose_debug_enabled;
|
||||||
#endif
|
#endif
|
||||||
@@ -5664,7 +5665,7 @@ static void dp_pdev_flush_pending_vdevs(struct dp_pdev *pdev)
|
|||||||
qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock);
|
qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock);
|
||||||
|
|
||||||
for (i = 0; i < num_vdevs; i++) {
|
for (i = 0; i < num_vdevs; i++) {
|
||||||
dp_vdev_flush_peers((struct cdp_vdev *)vdev_arr[i], 0);
|
dp_vdev_flush_peers((struct cdp_vdev *)vdev_arr[i], 0, 0);
|
||||||
dp_vdev_unref_delete(soc, vdev_arr[i], DP_MOD_ID_CDP);
|
dp_vdev_unref_delete(soc, vdev_arr[i], DP_MOD_ID_CDP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7007,6 +7008,22 @@ void dp_peer_delete(struct dp_soc *soc,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
|
||||||
|
void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg)
|
||||||
|
{
|
||||||
|
if (!peer->valid)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (IS_MLO_DP_LINK_PEER(peer))
|
||||||
|
dp_peer_delete_wifi3((struct cdp_soc_t *)soc,
|
||||||
|
peer->vdev->vdev_id,
|
||||||
|
peer->mac_addr.raw, 0);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/**
|
/**
|
||||||
* dp_vdev_flush_peers() - Forcibily Flush peers of vdev
|
* dp_vdev_flush_peers() - Forcibily Flush peers of vdev
|
||||||
* @vdev: Datapath VDEV handle
|
* @vdev: Datapath VDEV handle
|
||||||
@@ -7014,7 +7031,9 @@ void dp_peer_delete(struct dp_soc *soc,
|
|||||||
*
|
*
|
||||||
* Return: void
|
* Return: void
|
||||||
*/
|
*/
|
||||||
static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only)
|
static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle,
|
||||||
|
bool unmap_only,
|
||||||
|
bool mlo_peers_only)
|
||||||
{
|
{
|
||||||
struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
|
struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
|
||||||
struct dp_pdev *pdev = vdev->pdev;
|
struct dp_pdev *pdev = vdev->pdev;
|
||||||
@@ -7023,9 +7042,18 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only)
|
|||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
|
|
||||||
|
|
||||||
if (!unmap_only)
|
if (!unmap_only) {
|
||||||
dp_vdev_iterate_peer_lock_safe(vdev, dp_peer_delete, NULL,
|
if (!mlo_peers_only)
|
||||||
DP_MOD_ID_CDP);
|
dp_vdev_iterate_peer_lock_safe(vdev,
|
||||||
|
dp_peer_delete,
|
||||||
|
NULL,
|
||||||
|
DP_MOD_ID_CDP);
|
||||||
|
else
|
||||||
|
dp_vdev_iterate_peer_lock_safe(vdev,
|
||||||
|
dp_mlo_peer_delete,
|
||||||
|
NULL,
|
||||||
|
DP_MOD_ID_CDP);
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < soc->max_peer_id ; i++) {
|
for (i = 0; i < soc->max_peer_id ; i++) {
|
||||||
peer = __dp_peer_get_ref_by_id(soc, i, DP_MOD_ID_CDP);
|
peer = __dp_peer_get_ref_by_id(soc, i, DP_MOD_ID_CDP);
|
||||||
@@ -7038,17 +7066,27 @@ static void dp_vdev_flush_peers(struct cdp_vdev *vdev_handle, bool unmap_only)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
dp_info("peer: "QDF_MAC_ADDR_FMT" is getting unmap",
|
if (!mlo_peers_only) {
|
||||||
QDF_MAC_ADDR_REF(peer->mac_addr.raw));
|
dp_info("peer: " QDF_MAC_ADDR_FMT " is getting unmap",
|
||||||
|
QDF_MAC_ADDR_REF(peer->mac_addr.raw));
|
||||||
|
dp_rx_peer_unmap_handler(soc, i,
|
||||||
|
vdev->vdev_id,
|
||||||
|
peer->mac_addr.raw, 0,
|
||||||
|
DP_PEER_WDS_COUNT_INVALID);
|
||||||
|
SET_PEER_REF_CNT_ONE(peer);
|
||||||
|
} else if (IS_MLO_DP_LINK_PEER(peer) ||
|
||||||
|
IS_MLO_DP_MLD_PEER(peer)) {
|
||||||
|
dp_info("peer: " QDF_MAC_ADDR_FMT " is getting unmap",
|
||||||
|
QDF_MAC_ADDR_REF(peer->mac_addr.raw));
|
||||||
|
dp_rx_peer_unmap_handler(soc, i,
|
||||||
|
vdev->vdev_id,
|
||||||
|
peer->mac_addr.raw, 0,
|
||||||
|
DP_PEER_WDS_COUNT_INVALID);
|
||||||
|
SET_PEER_REF_CNT_ONE(peer);
|
||||||
|
}
|
||||||
|
|
||||||
dp_rx_peer_unmap_handler(soc, i,
|
|
||||||
vdev->vdev_id,
|
|
||||||
peer->mac_addr.raw, 0,
|
|
||||||
DP_PEER_WDS_COUNT_INVALID);
|
|
||||||
SET_PEER_REF_CNT_ONE(peer);
|
|
||||||
dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
|
dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
|
#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
|
||||||
@@ -7154,9 +7192,9 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc,
|
|||||||
* unmap commands from Target
|
* unmap commands from Target
|
||||||
*/
|
*/
|
||||||
if (!hif_is_target_ready(HIF_GET_SOFTC(soc->hif_handle)))
|
if (!hif_is_target_ready(HIF_GET_SOFTC(soc->hif_handle)))
|
||||||
dp_vdev_flush_peers((struct cdp_vdev *)vdev, false);
|
dp_vdev_flush_peers((struct cdp_vdev *)vdev, false, false);
|
||||||
else if (hif_get_target_status(soc->hif_handle) == TARGET_STATUS_RESET)
|
else if (hif_get_target_status(soc->hif_handle) == TARGET_STATUS_RESET)
|
||||||
dp_vdev_flush_peers((struct cdp_vdev *)vdev, true);
|
dp_vdev_flush_peers((struct cdp_vdev *)vdev, true, false);
|
||||||
|
|
||||||
/* indicate that the vdev needs to be deleted */
|
/* indicate that the vdev needs to be deleted */
|
||||||
vdev->delete.pending = 1;
|
vdev->delete.pending = 1;
|
||||||
@@ -12671,7 +12709,9 @@ dp_check_vdev_tx_delay_stats_enabled(struct cdp_soc_t *soc_hdl,
|
|||||||
|
|
||||||
#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
|
#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
|
||||||
static void
|
static void
|
||||||
dp_recovery_vdev_flush_peers(struct cdp_soc_t *cdp_soc, uint8_t vdev_id)
|
dp_recovery_vdev_flush_peers(struct cdp_soc_t *cdp_soc,
|
||||||
|
uint8_t vdev_id,
|
||||||
|
bool mlo_peers_only)
|
||||||
{
|
{
|
||||||
struct dp_soc *soc = (struct dp_soc *)cdp_soc;
|
struct dp_soc *soc = (struct dp_soc *)cdp_soc;
|
||||||
struct dp_vdev *vdev;
|
struct dp_vdev *vdev;
|
||||||
@@ -12681,7 +12721,7 @@ dp_recovery_vdev_flush_peers(struct cdp_soc_t *cdp_soc, uint8_t vdev_id)
|
|||||||
if (!vdev)
|
if (!vdev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
dp_vdev_flush_peers((struct cdp_vdev *)vdev, false);
|
dp_vdev_flush_peers((struct cdp_vdev *)vdev, false, mlo_peers_only);
|
||||||
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
|
dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1169,6 +1169,17 @@ void dp_peer_delete(struct dp_soc *soc,
|
|||||||
struct dp_peer *peer,
|
struct dp_peer *peer,
|
||||||
void *arg);
|
void *arg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dp_mlo_peer_delete() - delete MLO DP peer
|
||||||
|
*
|
||||||
|
* @soc: Datapath soc
|
||||||
|
* @peer: Datapath peer
|
||||||
|
* @arg: argument to iter function
|
||||||
|
*
|
||||||
|
* Return: void
|
||||||
|
*/
|
||||||
|
void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg);
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_11BE_MLO
|
#ifdef WLAN_FEATURE_11BE_MLO
|
||||||
|
|
||||||
/* is MLO connection mld peer */
|
/* is MLO connection mld peer */
|
||||||
|
Reference in New Issue
Block a user