diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 3352b690a431..f7cbc0362b22 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -12911,6 +12911,23 @@ static inline int hdd_state_query_cb(void) return !!wlan_hdd_validate_context(cds_get_context(QDF_MODULE_ID_HDD)); } +static int __hdd_op_protect_cb(void **out_sync, const char *func) +{ + struct hdd_context *hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD); + + if (!hdd_ctx) + return -EAGAIN; + + return __osif_psoc_sync_op_start(hdd_ctx->parent_dev, + (struct osif_psoc_sync **)out_sync, + func); +} + +static void __hdd_op_unprotect_cb(void *sync, const char *func) +{ + __osif_psoc_sync_op_stop(sync, func); +} + /** * hdd_init() - Initialize Driver * @@ -12930,6 +12947,7 @@ int hdd_init(void) return -ENOMEM; } + qdf_op_callbacks_register(__hdd_op_protect_cb, __hdd_op_unprotect_cb); qdf_register_module_state_query_callback(hdd_state_query_cb); wlan_init_bug_report_lock(); @@ -12961,6 +12979,7 @@ void hdd_deinit(void) #endif wlan_destroy_bug_report_lock(); + qdf_op_callbacks_register(NULL, NULL); cds_deinit(); } diff --git a/os_if/sync/src/osif_psoc_sync.c b/os_if/sync/src/osif_psoc_sync.c index 2a2164f99433..e2a0e2707cb8 100644 --- a/os_if/sync/src/osif_psoc_sync.c +++ b/os_if/sync/src/osif_psoc_sync.c @@ -58,6 +58,9 @@ static struct osif_psoc_sync *osif_psoc_sync_lookup(struct device *dev) for (i = 0; i < QDF_ARRAY_SIZE(__osif_psoc_sync_arr); i++) { struct osif_psoc_sync *psoc_sync = __osif_psoc_sync_arr + i; + if (!psoc_sync->in_use) + continue; + if (psoc_sync->dev == dev) return psoc_sync; } diff --git a/os_if/sync/src/osif_vdev_sync.c b/os_if/sync/src/osif_vdev_sync.c index 0b5416d5433a..171f84c2b9f3 100644 --- a/os_if/sync/src/osif_vdev_sync.c +++ b/os_if/sync/src/osif_vdev_sync.c @@ -57,6 +57,9 @@ static struct osif_vdev_sync *osif_vdev_sync_lookup(struct net_device *net_dev) for (i = 0; i < QDF_ARRAY_SIZE(__osif_vdev_sync_arr); i++) { struct osif_vdev_sync *vdev_sync = __osif_vdev_sync_arr + i; + if (!vdev_sync->in_use) + continue; + if (vdev_sync->net_dev == net_dev) return vdev_sync; }