qcacld-3.0: Fix race condition in peer attach and map
Fix a race condition where the HTT peer map event is received before the peer object is allocated in the data path. CRs-Fixed: 1089662 Change-Id: I3931e6dbae3ec3a68d446c245432549fa635a97e
This commit is contained in:

committed by
qcabuildsw

parent
fc2ed78279
commit
272fd23190
@@ -5133,8 +5133,10 @@ static struct cdp_cmn_ops ol_ops_cmn = {
|
||||
.txrx_pdev_attach_target = ol_txrx_pdev_attach_target,
|
||||
.txrx_pdev_post_attach = ol_txrx_pdev_post_attach,
|
||||
.txrx_pdev_detach = ol_txrx_pdev_detach,
|
||||
.txrx_peer_attach = ol_txrx_peer_attach,
|
||||
.txrx_peer_detach = ol_txrx_peer_detach,
|
||||
.txrx_peer_create = ol_txrx_peer_attach,
|
||||
.txrx_peer_setup = NULL,
|
||||
.txrx_peer_teardown = NULL,
|
||||
.txrx_peer_delete = ol_txrx_peer_detach,
|
||||
.txrx_vdev_register = ol_txrx_vdev_register,
|
||||
.txrx_soc_detach = ol_txrx_soc_detach,
|
||||
.txrx_get_vdev_mac_addr = ol_txrx_get_vdev_mac_addr,
|
||||
|
@@ -77,32 +77,6 @@
|
||||
#include "wma_nan_datapath.h"
|
||||
#include "wlan_tgt_def_config.h"
|
||||
|
||||
#ifdef QCA_WIFI_QCA8074
|
||||
#define PEER_ATTACH_WIFI3(peer, soc, vdev, peer_addr) \
|
||||
do { \
|
||||
peer = cdp_peer_attach(soc, vdev, peer_addr); \
|
||||
if (!peer) { \
|
||||
WMA_LOGE("%s : Unable to attach peer %pM", \
|
||||
__func__, peer_addr); \
|
||||
goto err; \
|
||||
} \
|
||||
} while (0)
|
||||
/* Do Nothing */
|
||||
#define PEER_ATTACH_LEGACY(peer, soc, vdev, peer_addr) {}
|
||||
#else
|
||||
/* Do Nothing */
|
||||
#define PEER_ATTACH_WIFI3(peer, soc, vdev, peer_addr) {}
|
||||
#define PEER_ATTACH_LEGACY(peer, soc, vdev, peer_addr) \
|
||||
do { \
|
||||
peer = cdp_peer_attach(soc, vdev, peer_addr); \
|
||||
if (!peer) { \
|
||||
WMA_LOGE("%s : Unable to attach peer %pM", \
|
||||
__func__, peer_addr); \
|
||||
goto err; \
|
||||
} \
|
||||
} while (0)
|
||||
#endif /* CONFIG_LITHIUM */
|
||||
|
||||
/**
|
||||
* wma_find_vdev_by_addr() - find vdev_id from mac address
|
||||
* @wma: wma handle
|
||||
@@ -1111,7 +1085,7 @@ void wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
|
||||
if (roam_synch_in_progress)
|
||||
cdp_peer_detach_force_delete(soc, peer);
|
||||
else
|
||||
cdp_peer_detach(soc, peer);
|
||||
cdp_peer_delete(soc, peer);
|
||||
}
|
||||
peer_mac_addr = cdp_peer_get_peer_mac_addr(soc, peer);
|
||||
if (peer_mac_addr == NULL) {
|
||||
@@ -1174,7 +1148,17 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, void *pdev, void *vdev,
|
||||
goto err;
|
||||
}
|
||||
|
||||
PEER_ATTACH_LEGACY(peer, soc, vdev, peer_addr);
|
||||
/* The peer object should be created before sending the WMI peer
|
||||
* create command to firmware. This is to prevent a race condition
|
||||
* where the HTT peer map event is received before the peer object
|
||||
* is created in the data path
|
||||
*/
|
||||
peer = cdp_peer_create(soc, vdev, peer_addr);
|
||||
if (!peer) {
|
||||
WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (roam_synch_in_progress) {
|
||||
WMA_LOGE("%s: LFR3: Created peer %p with peer_addr %pM vdev_id %d,"
|
||||
"peer_count - %d",
|
||||
@@ -1188,14 +1172,19 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, void *pdev, void *vdev,
|
||||
if (wmi_unified_peer_create_send(wma->wmi_handle,
|
||||
¶m) != QDF_STATUS_SUCCESS) {
|
||||
WMA_LOGP("%s : Unable to create peer in Target", __func__);
|
||||
cdp_peer_detach(soc, peer);
|
||||
cdp_peer_delete(soc, peer);
|
||||
goto err;
|
||||
}
|
||||
|
||||
WMA_LOGE("%s: Created peer %p with peer_addr %pM vdev_id %d, peer_count - %d",
|
||||
__func__, peer, peer_addr, vdev_id,
|
||||
wma->interfaces[vdev_id].peer_count);
|
||||
|
||||
PEER_ATTACH_WIFI3(peer, soc, vdev, peer_addr);
|
||||
cdp_peer_setup(soc, vdev, peer);
|
||||
|
||||
WMA_LOGE("%s: Initialized peer with peer_addr %pM vdev_id %d",
|
||||
__func__, peer_addr, vdev_id);
|
||||
|
||||
mac_addr_raw = cdp_get_vdev_mac_addr(soc, vdev);
|
||||
if (mac_addr_raw == NULL) {
|
||||
WMA_LOGE("%s: peer mac addr is NULL", __func__);
|
||||
@@ -4384,7 +4373,7 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
|
||||
}
|
||||
|
||||
if (peer)
|
||||
cdp_peer_detach(soc, peer);
|
||||
cdp_peer_delete(soc, peer);
|
||||
iface->peer_count--;
|
||||
WMA_LOGE("%s: Removed peer %p with peer_addr %pM vdevid %d peer_count %d",
|
||||
__func__, peer, params->bssid, params->smesessionId,
|
||||
|
Reference in New Issue
Block a user