diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 3e17e09a38..29d4506fd5 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -1474,9 +1474,11 @@ int wma_csa_offload_handler(void *handle, uint8_t *event, uint32_t len) struct csa_offload_params *csa_offload_event; struct ieee80211_extendedchannelswitch_ie *xcsa_ie; struct ieee80211_ie_wide_bw_switch *wb_ie; - struct wma_txrx_node *intr = wma->interfaces; + struct wlan_objmgr_peer *peer; + struct wlan_objmgr_vdev *vdev; QDF_STATUS status; uint8_t tlv_len; + struct wlan_channel *chan; param_buf = (WMI_CSA_HANDLING_EVENTID_param_tlvs *) event; @@ -1488,20 +1490,31 @@ int wma_csa_offload_handler(void *handle, uint8_t *event, uint32_t len) csa_event = param_buf->fixed_param; WMI_MAC_ADDR_TO_CHAR_ARRAY(&csa_event->i_addr2, &bssid[0]); - if (wma_find_vdev_id_by_bssid(wma, bssid, &vdev_id)) { - wma_err("Invalid bssid received"); + peer = wlan_objmgr_get_peer_by_mac(wma->psoc, + bssid, WLAN_LEGACY_WMA_ID); + if (!peer) { + wma_err("Invalid peer"); return -EINVAL; } - csa_offload_event = qdf_mem_malloc(sizeof(*csa_offload_event)); - if (!csa_offload_event) + vdev_id = wlan_vdev_get_id(wlan_peer_get_vdev(peer)); + wlan_objmgr_peer_release_ref(peer, WLAN_LEGACY_WMA_ID); + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, + vdev_id, + WLAN_LEGACY_WMA_ID); + if (!vdev) return -EINVAL; - if (intr[vdev_id].vdev && - wlan_cm_is_vdev_roaming(intr[vdev_id].vdev)) { + csa_offload_event = qdf_mem_malloc(sizeof(*csa_offload_event)); + if (!csa_offload_event) { + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); + return -EINVAL; + } + if (wlan_cm_is_vdev_roaming(vdev)) { wma_err("Roaming in progress for vdev %d, ignore csa event", vdev_id); qdf_mem_free(csa_offload_event); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); return -EINVAL; } @@ -1538,6 +1551,7 @@ int wma_csa_offload_handler(void *handle, uint8_t *event, uint32_t len) } else { wma_err("CSA Event error: No CSA IE present"); qdf_mem_free(csa_offload_event); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); return -EINVAL; } @@ -1601,7 +1615,15 @@ got_chan: csa_offload_event->new_ch_freq_seg2, csa_offload_event->new_op_class); - cur_chan = cds_freq_to_chan(intr[vdev_id].ch_freq); + chan = wlan_vdev_get_active_channel(vdev); + if (!chan) { + wmi_err("failed to get active channel"); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); + qdf_mem_free(csa_offload_event); + return false; + } + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); + cur_chan = cds_freq_to_chan(chan->ch_freq); /* * basic sanity check: requested channel should not be 0 * and equal to home channel