diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index fb069098ef38..babd2c0fdc3a 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -3051,7 +3051,7 @@ ol_txrx_remove_peers_for_vdev(struct cdp_vdev *pvdev, if (temp) { qdf_spin_unlock_bh(&vdev->pdev->peer_ref_mutex); callback(callback_context, temp->mac_addr.raw, - vdev->vdev_id, temp, false); + vdev->vdev_id, temp); qdf_spin_lock_bh(&vdev->pdev->peer_ref_mutex); } /* self peer is deleted last */ @@ -3072,7 +3072,7 @@ ol_txrx_remove_peers_for_vdev(struct cdp_vdev *pvdev, /* remove IBSS bss peer last */ peer = TAILQ_FIRST(&vdev->peer_list); callback(callback_context, (uint8_t *) &vdev->mac_addr, - vdev->vdev_id, peer, false); + vdev->vdev_id, peer); } } @@ -3091,13 +3091,14 @@ ol_txrx_remove_peers_for_vdev_no_lock(struct cdp_vdev *pvdev, { struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev; ol_txrx_peer_handle peer = NULL; + ol_txrx_peer_handle tmp_peer = NULL; - TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) { + TAILQ_FOREACH_SAFE(peer, &vdev->peer_list, peer_list_elem, tmp_peer) { ol_txrx_info_high( "%s: peer found for vdev id %d. deleting the peer", __func__, vdev->vdev_id); callback(callback_context, (uint8_t *)&vdev->mac_addr, - vdev->vdev_id, peer, false); + vdev->vdev_id, peer); } } diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 40c1a7236895..3326f6de0725 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -648,6 +648,23 @@ out: return status; } +/** + * wma_peer_remove_for_vdev_callback() - remove peer for vdev when SSR + * @handle: wma handle + * @bssid: mac address + * @vdev_id: vdev id + * @peer: peer ptr + * + * Wapper wma_remove_peer for callback, this function will remove peer + * without waiting for peer unmap event. + * Return: none + */ +static void wma_peer_remove_for_vdev_callback(void *handle, uint8_t *bssid, + uint8_t vdev_id, void *peer) +{ + wma_remove_peer(handle, bssid, vdev_id, peer, true); +} + /** * wma_force_vdev_cleanup() - Cleanup vdev resource when SSR * @wma_handle: WMA handle @@ -659,9 +676,30 @@ static void wma_force_vdev_cleanup(tp_wma_handle wma_handle, uint8_t vdev_id) { void *soc = cds_get_context(QDF_MODULE_ID_SOC); struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id]; + struct cdp_pdev *pdev; + struct cdp_vdev *vdev; WMA_LOGE("SSR: force cleanup vdev(%d) resouce", vdev_id); iface->vdev_active = false; + + pdev = cds_get_context(QDF_MODULE_ID_TXRX); + if (!pdev) { + WMA_LOGE("%s: Failed to get pdev", __func__); + goto VDEV_DETACH; + } + + vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id); + if (!vdev) { + WMA_LOGE("%s: Failed to get vdev (%d)", __func__, vdev_id); + goto VDEV_DETACH; + } + + /* force remove all peer for vdev */ + cdp_peer_remove_for_vdev_no_lock(soc, vdev, + wma_peer_remove_for_vdev_callback, + wma_handle); + +VDEV_DETACH: wma_cdp_vdev_detach(soc, wma_handle, vdev_id); }