qcacld-3.0: Send vdev delete to firmware incase of mlme component failure

Incase of MLME component failure post vdev create the vdev_id
is freed up without sending the vdev delete to the firmware,
in this specific case of the issue post vdev create to firmware
a dp vdev attach failed because of memory allocation failure.

Send vdev delete to firmware incase of mlme component failure
post vdev create.

Change-Id: Ib5bf2a2a7f77a44a80b76bd7a243f2c286a19f8b
CRs-Fixed: 3623511
This commit is contained in:
Arun Kumar Khandavalli
2023-10-02 11:24:10 +05:30
committed by Rahul Choudhary
parent 90ccb561d3
commit 2ea2d30798

View File

@@ -1598,62 +1598,6 @@ static void mlme_ext_handler_destroy(struct vdev_mlme_obj *vdev_mlme)
qdf_mem_free(vdev_mlme->ext_vdev_ptr);
vdev_mlme->ext_vdev_ptr = NULL;
}
/**
* vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object
* @vdev_mlme: vdev mlme object
*
* Return: QDF_STATUS
*/
static
QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme)
{
QDF_STATUS status;
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
vdev_mlme->ext_vdev_ptr =
qdf_mem_malloc(sizeof(struct mlme_legacy_priv));
if (!vdev_mlme->ext_vdev_ptr)
return QDF_STATUS_E_NOMEM;
mlme_init_rate_config(vdev_mlme);
mlme_init_connect_chan_info_config(vdev_mlme);
mlme_cm_alloc_roam_stats_info(vdev_mlme);
vdev_mlme->ext_vdev_ptr->connect_info.fils_con_info = NULL;
mlme_init_wait_for_key_timer(vdev_mlme->vdev,
&vdev_mlme->ext_vdev_ptr->wait_key_timer);
qdf_wake_lock_create(
&vdev_mlme->ext_vdev_ptr->bss_color_change_wakelock,
"bss_color_change_wakelock");
qdf_runtime_lock_init(
&vdev_mlme->ext_vdev_ptr->bss_color_change_runtime_lock);
qdf_runtime_lock_init(
&vdev_mlme->ext_vdev_ptr->disconnect_runtime_lock);
sme_get_vdev_type_nss(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev),
&vdev_mlme->proto.generic.nss_2g,
&vdev_mlme->proto.generic.nss_5g);
status = mlme_get_vdev_types(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev),
&vdev_mlme->mgmt.generic.type,
&vdev_mlme->mgmt.generic.subtype);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("Get vdev type failed; status:%d", status);
mlme_ext_handler_destroy(vdev_mlme);
return status;
}
status = vdev_mgr_create_send(vdev_mlme);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("Failed to create vdev for vdev id %d",
wlan_vdev_get_id(vdev_mlme->vdev));
mlme_ext_handler_destroy(vdev_mlme);
return status;
}
return status;
}
static QDF_STATUS
mlme_wma_vdev_detach_post_cb(struct scheduler_msg *msg)
@@ -1718,6 +1662,63 @@ QDF_STATUS vdevmgr_mlme_ext_hdl_destroy(struct vdev_mlme_obj *vdev_mlme)
return QDF_STATUS_SUCCESS;
}
/**
* vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object
* @vdev_mlme: vdev mlme object
*
* Return: QDF_STATUS
*/
static
QDF_STATUS vdevmgr_mlme_ext_hdl_create(struct vdev_mlme_obj *vdev_mlme)
{
QDF_STATUS status;
mlme_legacy_debug("vdev id = %d ",
vdev_mlme->vdev->vdev_objmgr.vdev_id);
vdev_mlme->ext_vdev_ptr =
qdf_mem_malloc(sizeof(struct mlme_legacy_priv));
if (!vdev_mlme->ext_vdev_ptr)
return QDF_STATUS_E_NOMEM;
mlme_init_rate_config(vdev_mlme);
mlme_init_connect_chan_info_config(vdev_mlme);
mlme_cm_alloc_roam_stats_info(vdev_mlme);
vdev_mlme->ext_vdev_ptr->connect_info.fils_con_info = NULL;
mlme_init_wait_for_key_timer(vdev_mlme->vdev,
&vdev_mlme->ext_vdev_ptr->wait_key_timer);
qdf_wake_lock_create(
&vdev_mlme->ext_vdev_ptr->bss_color_change_wakelock,
"bss_color_change_wakelock");
qdf_runtime_lock_init(
&vdev_mlme->ext_vdev_ptr->bss_color_change_runtime_lock);
qdf_runtime_lock_init(
&vdev_mlme->ext_vdev_ptr->disconnect_runtime_lock);
sme_get_vdev_type_nss(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev),
&vdev_mlme->proto.generic.nss_2g,
&vdev_mlme->proto.generic.nss_5g);
status = mlme_get_vdev_types(wlan_vdev_mlme_get_opmode(vdev_mlme->vdev),
&vdev_mlme->mgmt.generic.type,
&vdev_mlme->mgmt.generic.subtype);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("Get vdev type failed; status:%d", status);
mlme_ext_handler_destroy(vdev_mlme);
return status;
}
status = vdev_mgr_create_send(vdev_mlme);
if (QDF_IS_STATUS_ERROR(status)) {
mlme_err("Failed to create vdev for vdev id %d",
wlan_vdev_get_id(vdev_mlme->vdev));
vdevmgr_mlme_ext_hdl_destroy(vdev_mlme);
return status;
}
return status;
}
#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
static
QDF_STATUS vdevmgr_mlme_vdev_send_set_mac_addr(struct qdf_mac_addr mac_addr,