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:

committed by
Rahul Choudhary

parent
90ccb561d3
commit
2ea2d30798
@@ -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,
|
||||
|
Reference in New Issue
Block a user