Merge "qcacld-3.0: Use try_get_ref API in hdd_vdev_create" into wlan-cld3.driver.lnx.2.0

This commit is contained in:
CNSS_WLAN Service 2017-12-01 13:53:44 -08:00 committed by Gerrit - the friendly Code Review server
commit 024fbc4a73

View File

@ -162,54 +162,75 @@ int hdd_objmgr_release_and_destroy_pdev(struct hdd_context *hdd_ctx)
int hdd_objmgr_create_and_store_vdev(struct wlan_objmgr_pdev *pdev,
struct hdd_adapter *adapter)
{
QDF_STATUS status;
int errno;
struct wlan_objmgr_vdev *vdev;
struct wlan_objmgr_peer *peer;
struct vdev_osif_priv *osif_priv;
struct wlan_vdev_create_params vdev_params;
struct wlan_vdev_create_params vdev_params = {0};
vdev_params.opmode = adapter->device_mode;
qdf_mem_copy(vdev_params.macaddr, adapter->mac_addr.bytes,
QDF_NET_MAC_ADDR_MAX_LEN);
QDF_BUG(pdev);
if (!pdev) {
hdd_err("pdev NULL");
hdd_err("pdev is null");
return -EINVAL;
}
osif_priv = qdf_mem_malloc(sizeof(*osif_priv));
if (!osif_priv) {
hdd_err("vdev os obj create failed");
hdd_err("Failed to allocate osif_priv; out of memory");
return -ENOMEM;
}
hdd_init_vdev_os_priv(adapter, osif_priv);
vdev_params.opmode = adapter->device_mode;
vdev_params.osifp = osif_priv;
qdf_mem_copy(vdev_params.macaddr,
adapter->mac_addr.bytes,
QDF_NET_MAC_ADDR_MAX_LEN);
vdev = wlan_objmgr_vdev_obj_create(pdev, &vdev_params);
if (!vdev) {
hdd_err("vdev obj create fails");
return -ENOMEM;
}
peer = wlan_objmgr_peer_obj_create(vdev, WLAN_PEER_SELF,
vdev_params.macaddr);
if (!peer) {
hdd_err("obj manager self peer create fails for adapter %d",
adapter->device_mode);
wlan_objmgr_vdev_obj_delete(vdev);
return -ENOMEM;
hdd_err("Failed to create vdev object");
errno = -ENOMEM;
goto osif_priv_free;
}
/*
* To enable legacy use cases, we need to delay physical vdev destroy
* until after the sme session has been closed. We accomplish this by
* getting an additional reference here.
* getting a reference here.
*/
wlan_objmgr_vdev_get_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
status = wlan_objmgr_vdev_try_get_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
if (QDF_IS_STATUS_ERROR(status)) {
hdd_err("Failed to acquire vdev ref; status:%d", status);
errno = qdf_status_to_os_return(status);
goto vdev_destroy;
}
peer = wlan_objmgr_peer_obj_create(vdev, WLAN_PEER_SELF,
vdev_params.macaddr);
if (!peer) {
hdd_err("Failed to create self peer for adapter mode %d",
adapter->device_mode);
errno = -ENOMEM;
goto vdev_put_ref;
}
adapter->hdd_vdev = vdev;
adapter->session_id = wlan_vdev_get_id(vdev);
return 0;
vdev_put_ref:
wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
vdev_destroy:
wlan_objmgr_vdev_obj_delete(vdev);
osif_priv_free:
qdf_mem_free(osif_priv);
return errno;
}
int hdd_objmgr_destroy_vdev(struct hdd_adapter *adapter)