diff --git a/core/hdd/src/wlan_hdd_object_manager.c b/core/hdd/src/wlan_hdd_object_manager.c index 942bdb6649ee..81d6510d7de3 100644 --- a/core/hdd/src/wlan_hdd_object_manager.c +++ b/core/hdd/src/wlan_hdd_object_manager.c @@ -34,7 +34,7 @@ #include #ifdef NAPIER_SCAN -static void hdd_init_os_priv(hdd_context_t *hdd_ctx, +static void hdd_init_pdev_os_priv(hdd_context_t *hdd_ctx, struct pdev_osif_priv *os_priv) { /* Initialize the OS private structure*/ @@ -43,6 +43,13 @@ static void hdd_init_os_priv(hdd_context_t *hdd_ctx, } #endif +static void hdd_init_vdev_os_priv(hdd_adapter_t *adapter, + struct vdev_osif_priv *os_priv) +{ + /* Initialize the vdev OS private structure*/ + os_priv->wdev = adapter->dev->ieee80211_ptr; +} + int hdd_create_and_store_psoc(hdd_context_t *hdd_ctx, uint8_t psoc_id) { struct wlan_objmgr_psoc *psoc; @@ -92,7 +99,7 @@ int hdd_create_and_store_pdev(hdd_context_t *hdd_ctx) } hdd_ctx->hdd_pdev = pdev; #ifdef NAPIER_SCAN - hdd_init_os_priv(hdd_ctx, priv); + hdd_init_pdev_os_priv(hdd_ctx, priv); #endif return 0; } @@ -118,6 +125,7 @@ int hdd_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, { struct wlan_objmgr_vdev *vdev; struct wlan_objmgr_peer *peer; + struct vdev_osif_priv *osif_priv; struct wlan_vdev_create_params vdev_params; vdev_params.opmode = adapter->device_mode; @@ -128,6 +136,15 @@ int hdd_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, return -EINVAL; } + osif_priv = qdf_mem_malloc(sizeof(*osif_priv)); + if (!osif_priv) { + hdd_err("vdev os obj create failed"); + return -ENOMEM; + } + + hdd_init_vdev_os_priv(adapter, osif_priv); + vdev_params.osifp = osif_priv; + vdev = wlan_objmgr_vdev_obj_create(pdev, &vdev_params); if (!vdev) { hdd_err("vdev obj create fails"); @@ -158,11 +175,16 @@ int hdd_create_and_store_vdev(struct wlan_objmgr_pdev *pdev, int hdd_release_and_destroy_vdev(hdd_adapter_t *adapter) { struct wlan_objmgr_vdev *vdev = adapter->hdd_vdev; + struct vdev_osif_priv *osif_priv; adapter->hdd_vdev = NULL; if (!vdev) return -EFAULT; + osif_priv = wlan_vdev_get_ospriv(vdev); + vdev->vdev_nif.osdev = NULL; + qdf_mem_free(osif_priv); + if (hdd_remove_peer_object(vdev, wlan_vdev_mlme_get_macaddr(vdev))) { hdd_err("Self peer delete fails");