diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index b7820978760c..bcd2662cc39d 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -84,7 +84,7 @@ #include #include "wlan_pkt_capture_ucfg_api.h" #include "wlan_hdd_thermal.h" - +#include "wlan_hdd_object_manager.h" /* Preprocessor definitions and constants */ #ifdef QCA_WIFI_NAPIER_EMULATION #define HDD_SSR_BRING_UP_TIME 3000000 @@ -178,10 +178,18 @@ int wlan_hdd_rx_thread_suspend(struct hdd_context *hdd_ctx) static void hdd_enable_gtk_offload(struct hdd_adapter *adapter) { QDF_STATUS status; + struct wlan_objmgr_vdev *vdev; - status = ucfg_pmo_enable_gtk_offload_in_fwr(adapter->vdev); + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + return; + } + + status = ucfg_pmo_enable_gtk_offload_in_fwr(vdev); if (status != QDF_STATUS_SUCCESS) hdd_info("Failed to enable gtk offload"); + hdd_objmgr_put_vdev(vdev); } /** @@ -196,6 +204,7 @@ static void hdd_disable_gtk_offload(struct hdd_adapter *adapter) { struct pmo_gtk_rsp_req gtk_rsp_request; QDF_STATUS status; + struct wlan_objmgr_vdev *vdev; /* ensure to get gtk rsp first before disable it*/ gtk_rsp_request.callback = wlan_hdd_cfg80211_update_replay_counter_cb; @@ -203,16 +212,24 @@ static void hdd_disable_gtk_offload(struct hdd_adapter *adapter) /* Passing as void* as PMO does not know legacy HDD adapter type */ gtk_rsp_request.callback_context = (void *)adapter; - status = ucfg_pmo_get_gtk_rsp(adapter->vdev, >k_rsp_request); - if (status != QDF_STATUS_SUCCESS) { - hdd_err("Failed to send get gtk rsp status:%d", status); + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); return; } + status = ucfg_pmo_get_gtk_rsp(vdev, >k_rsp_request); + if (status != QDF_STATUS_SUCCESS) { + hdd_err("Failed to send get gtk rsp status:%d", status); + goto put_vdev; + } + hdd_debug("send get_gtk_rsp successful"); - status = ucfg_pmo_disable_gtk_offload_in_fwr(adapter->vdev); + status = ucfg_pmo_disable_gtk_offload_in_fwr(vdev); if (status != QDF_STATUS_SUCCESS) hdd_info("Failed to disable gtk offload"); +put_vdev: + hdd_objmgr_put_vdev(vdev); } #ifdef WLAN_NS_OFFLOAD @@ -379,6 +396,7 @@ void hdd_enable_ns_offload(struct hdd_adapter *adapter, { struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); struct wlan_objmgr_psoc *psoc = hdd_ctx->psoc; + struct wlan_objmgr_vdev *vdev; struct inet6_dev *in6_dev; struct pmo_ns_req *ns_req; QDF_STATUS status; @@ -440,15 +458,21 @@ void hdd_enable_ns_offload(struct hdd_adapter *adapter, goto free_req; } + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + goto free_req; + } /* enable ns request */ - status = ucfg_pmo_enable_ns_offload_in_fwr(adapter->vdev, trigger); + status = ucfg_pmo_enable_ns_offload_in_fwr(vdev, trigger); if (QDF_IS_STATUS_ERROR(status)) { hdd_err("Failed to enable ns offload; status:%d", status); - goto free_req; + goto put_vdev; } hdd_wlan_offload_event(SIR_IPV6_NS_OFFLOAD, SIR_OFFLOAD_ENABLE); - +put_vdev: + hdd_objmgr_put_vdev(vdev); free_req: qdf_mem_free(ns_req); @@ -461,6 +485,7 @@ void hdd_disable_ns_offload(struct hdd_adapter *adapter, { QDF_STATUS status; struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + struct wlan_objmgr_vdev *vdev; hdd_enter(); @@ -471,18 +496,26 @@ void hdd_disable_ns_offload(struct hdd_adapter *adapter, goto out; } - status = ucfg_pmo_flush_ns_offload_req(adapter->vdev); - if (status != QDF_STATUS_SUCCESS) { - hdd_err("Failed to flush NS Offload"); + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); goto out; } - status = ucfg_pmo_disable_ns_offload_in_fwr(adapter->vdev, trigger); + status = ucfg_pmo_flush_ns_offload_req(vdev); + if (status != QDF_STATUS_SUCCESS) { + hdd_err("Failed to flush NS Offload"); + goto put_vdev; + } + + status = ucfg_pmo_disable_ns_offload_in_fwr(vdev, trigger); if (status != QDF_STATUS_SUCCESS) hdd_err("Failed to disable NS Offload"); else hdd_wlan_offload_event(SIR_IPV6_NS_OFFLOAD, SIR_OFFLOAD_DISABLE); +put_vdev: + hdd_objmgr_put_vdev(vdev); out: hdd_exit(); @@ -539,70 +572,112 @@ void hdd_ipv6_notifier_work_queue(struct work_struct *work) static void hdd_enable_hw_filter(struct hdd_adapter *adapter) { QDF_STATUS status; + struct wlan_objmgr_vdev *vdev; hdd_enter(); - status = ucfg_pmo_enable_hw_filter_in_fwr(adapter->vdev); + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + return; + } + + status = ucfg_pmo_enable_hw_filter_in_fwr(vdev); if (status != QDF_STATUS_SUCCESS) hdd_info("Failed to enable hardware filter"); + hdd_objmgr_put_vdev(vdev); hdd_exit(); } static void hdd_disable_hw_filter(struct hdd_adapter *adapter) { QDF_STATUS status; + struct wlan_objmgr_vdev *vdev; hdd_enter(); - status = ucfg_pmo_disable_hw_filter_in_fwr(adapter->vdev); + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + return; + } + + status = ucfg_pmo_disable_hw_filter_in_fwr(vdev); if (status != QDF_STATUS_SUCCESS) hdd_info("Failed to disable hardware filter"); + hdd_objmgr_put_vdev(vdev); + hdd_exit(); } static void hdd_enable_action_frame_patterns(struct hdd_adapter *adapter) { QDF_STATUS status; - + struct wlan_objmgr_vdev *vdev; hdd_enter(); - status = ucfg_pmo_enable_action_frame_patterns(adapter->vdev, + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + return; + } + + status = ucfg_pmo_enable_action_frame_patterns(vdev, QDF_SYSTEM_SUSPEND); if (QDF_IS_STATUS_ERROR(status)) hdd_info("Failed to enable action frame patterns"); + hdd_objmgr_put_vdev(vdev); + hdd_exit(); } static void hdd_disable_action_frame_patterns(struct hdd_adapter *adapter) { QDF_STATUS status; + struct wlan_objmgr_vdev *vdev; hdd_enter(); - status = ucfg_pmo_disable_action_frame_patterns(adapter->vdev); + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + return; + } + + status = ucfg_pmo_disable_action_frame_patterns(vdev); if (QDF_IS_STATUS_ERROR(status)) hdd_info("Failed to disable action frame patterns"); + hdd_objmgr_put_vdev(vdev); + hdd_exit(); } void hdd_enable_host_offloads(struct hdd_adapter *adapter, enum pmo_offload_trigger trigger) { + struct wlan_objmgr_vdev *vdev; + hdd_enter(); - if (!ucfg_pmo_is_vdev_supports_offload(adapter->vdev)) { - hdd_debug("offload is not supported on vdev opmode %d", - adapter->device_mode); + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); goto out; } - if (!ucfg_pmo_is_vdev_connected(adapter->vdev)) { + if (!ucfg_pmo_is_vdev_supports_offload(vdev)) { + hdd_debug("offload is not supported on vdev opmode %d", + adapter->device_mode); + goto put_vdev; + } + + if (!ucfg_pmo_is_vdev_connected(vdev)) { hdd_debug("offload is not supported on disconnected vdevs"); - goto out; + goto put_vdev; } hdd_debug("enable offloads"); @@ -613,6 +688,8 @@ void hdd_enable_host_offloads(struct hdd_adapter *adapter, if (adapter->device_mode != QDF_NDI_MODE) hdd_enable_hw_filter(adapter); hdd_enable_action_frame_patterns(adapter); +put_vdev: + hdd_objmgr_put_vdev(vdev); out: hdd_exit(); @@ -621,17 +698,25 @@ out: void hdd_disable_host_offloads(struct hdd_adapter *adapter, enum pmo_offload_trigger trigger) { + struct wlan_objmgr_vdev *vdev; + hdd_enter(); - if (!ucfg_pmo_is_vdev_supports_offload(adapter->vdev)) { - hdd_info("offload is not supported on this vdev opmode: %d", - adapter->device_mode); - goto out; + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + goto out; } - if (!ucfg_pmo_is_vdev_connected(adapter->vdev)) { + if (!ucfg_pmo_is_vdev_supports_offload(vdev)) { + hdd_info("offload is not supported on this vdev opmode: %d", + adapter->device_mode); + goto put_vdev; + } + + if (!ucfg_pmo_is_vdev_connected(vdev)) { hdd_info("vdev is not connected"); - goto out; + goto put_vdev; } hdd_debug("disable offloads"); @@ -641,6 +726,9 @@ void hdd_disable_host_offloads(struct hdd_adapter *adapter, hdd_disable_mc_addr_filtering(adapter, trigger); hdd_disable_hw_filter(adapter); hdd_disable_action_frame_patterns(adapter); + +put_vdev: + hdd_objmgr_put_vdev(vdev); out: hdd_exit(); @@ -985,11 +1073,18 @@ void hdd_enable_arp_offload(struct hdd_adapter *adapter, QDF_STATUS status; struct pmo_arp_req *arp_req; struct in_ifaddr *ifa; + struct wlan_objmgr_vdev *vdev; arp_req = qdf_mem_malloc(sizeof(*arp_req)); if (!arp_req) return; + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + goto free_req; + } + arp_req->psoc = psoc; arp_req->vdev_id = adapter->vdev_id; arp_req->trigger = trigger; @@ -997,14 +1092,14 @@ void hdd_enable_arp_offload(struct hdd_adapter *adapter, status = ucfg_pmo_check_arp_offload(psoc, trigger, adapter->vdev_id); if (QDF_IS_STATUS_ERROR(status)) { hdd_debug("ARP offload not required"); - goto free_req; + goto put_vdev; } ifa = hdd_get_ipv4_local_interface(adapter); if (!ifa || !ifa->ifa_local) { hdd_info("IP Address is not assigned"); status = QDF_STATUS_NOT_INITIALIZED; - goto free_req; + goto put_vdev; } arp_req->ipv4_addr = (uint32_t)ifa->ifa_local; @@ -1012,17 +1107,19 @@ void hdd_enable_arp_offload(struct hdd_adapter *adapter, status = ucfg_pmo_cache_arp_offload_req(arp_req); if (QDF_IS_STATUS_ERROR(status)) { hdd_err("failed to cache arp offload req; status:%d", status); - goto free_req; + goto put_vdev; } - status = ucfg_pmo_enable_arp_offload_in_fwr(adapter->vdev, trigger); + status = ucfg_pmo_enable_arp_offload_in_fwr(vdev, trigger); if (QDF_IS_STATUS_ERROR(status)) { hdd_err("failed arp offload config in fw; status:%d", status); - goto free_req; + goto put_vdev; } hdd_wlan_offload_event(PMO_IPV4_ARP_REPLY_OFFLOAD, PMO_OFFLOAD_ENABLE); +put_vdev: + hdd_objmgr_put_vdev(vdev); free_req: qdf_mem_free(arp_req); } @@ -1032,6 +1129,7 @@ void hdd_disable_arp_offload(struct hdd_adapter *adapter, { QDF_STATUS status; struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + struct wlan_objmgr_vdev *vdev; status = ucfg_pmo_check_arp_offload(hdd_ctx->psoc, trigger, adapter->vdev_id); @@ -1040,19 +1138,26 @@ void hdd_disable_arp_offload(struct hdd_adapter *adapter, return; } - status = ucfg_pmo_flush_arp_offload_req(adapter->vdev); + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); + return; + } + + status = ucfg_pmo_flush_arp_offload_req(vdev); if (status != QDF_STATUS_SUCCESS) { + hdd_objmgr_put_vdev(vdev); hdd_err("Failed to flush arp Offload"); return; } - status = ucfg_pmo_disable_arp_offload_in_fwr(adapter->vdev, - trigger); + status = ucfg_pmo_disable_arp_offload_in_fwr(vdev, trigger); if (status == QDF_STATUS_SUCCESS) hdd_wlan_offload_event(PMO_IPV4_ARP_REPLY_OFFLOAD, PMO_OFFLOAD_DISABLE); else hdd_info("fail to disable arp offload"); + hdd_objmgr_put_vdev(vdev); } void hdd_enable_mc_addr_filtering(struct hdd_adapter *adapter, @@ -1308,6 +1413,7 @@ QDF_STATUS hdd_wlan_shutdown(void) { struct hdd_context *hdd_ctx; struct hdd_adapter *adapter; + struct wlan_objmgr_vdev *vdev; void *soc = cds_get_context(QDF_MODULE_ID_SOC); hdd_info("WLAN driver shutting down!"); @@ -1338,8 +1444,15 @@ QDF_STATUS hdd_wlan_shutdown(void) if (ucfg_pkt_capture_get_mode(hdd_ctx->psoc)) { adapter = hdd_get_adapter(hdd_ctx, QDF_MONITOR_MODE); - if (adapter) - ucfg_pkt_capture_resume_mon_thread(adapter->vdev); + if (adapter) { + vdev = hdd_objmgr_get_vdev(adapter); + if (vdev) { + ucfg_pkt_capture_resume_mon_thread(vdev); + hdd_objmgr_put_vdev(vdev); + } else { + hdd_err("vdev is NULL"); + } + } } /* @@ -1688,6 +1801,7 @@ static int __wlan_hdd_cfg80211_resume_wlan(struct wiphy *wiphy) struct hdd_context *hdd_ctx = wiphy_priv(wiphy); QDF_STATUS status = QDF_STATUS_SUCCESS; struct hdd_adapter *adapter; + struct wlan_objmgr_vdev *vdev; int exit_code; hdd_enter(); @@ -1743,8 +1857,15 @@ static int __wlan_hdd_cfg80211_resume_wlan(struct wiphy *wiphy) if (ucfg_pkt_capture_get_mode(hdd_ctx->psoc)) { adapter = hdd_get_adapter(hdd_ctx, QDF_MONITOR_MODE); - if (adapter) - ucfg_pkt_capture_resume_mon_thread(adapter->vdev); + if (adapter) { + vdev = hdd_objmgr_get_vdev(adapter); + if (vdev) { + ucfg_pkt_capture_resume_mon_thread(vdev); + hdd_objmgr_put_vdev(vdev); + } else { + hdd_err("vdev is NULL"); + } + } } qdf_mtrace(QDF_MODULE_ID_HDD, QDF_MODULE_ID_HDD, @@ -1830,6 +1951,7 @@ static int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy, struct hdd_context *hdd_ctx = wiphy_priv(wiphy); struct hdd_adapter *adapter; mac_handle_t mac_handle; + struct wlan_objmgr_vdev *vdev; int rc; hdd_enter(); @@ -1958,9 +2080,18 @@ static int __wlan_hdd_cfg80211_suspend_wlan(struct wiphy *wiphy, if (ucfg_pkt_capture_get_mode(hdd_ctx->psoc)) { adapter = hdd_get_adapter(hdd_ctx, QDF_MONITOR_MODE); - if (adapter) - if (ucfg_pkt_capture_suspend_mon_thread(adapter->vdev)) + if (adapter) { + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_err("vdev is NULL"); goto resume_dp_thread; + } + if (ucfg_pkt_capture_suspend_mon_thread(vdev)) { + hdd_objmgr_put_vdev(vdev); + goto resume_dp_thread; + } + hdd_objmgr_put_vdev(vdev); + } } qdf_mtrace(QDF_MODULE_ID_HDD, QDF_MODULE_ID_HDD, @@ -1984,8 +2115,15 @@ resume_dp_thread: /* Resume packet capture MON thread */ if (ucfg_pkt_capture_get_mode(hdd_ctx->psoc)) { adapter = hdd_get_adapter(hdd_ctx, QDF_MONITOR_MODE); - if (adapter) - ucfg_pkt_capture_resume_mon_thread(adapter->vdev); + if (adapter) { + vdev = hdd_objmgr_get_vdev(adapter); + if (vdev) { + ucfg_pkt_capture_resume_mon_thread(vdev); + hdd_objmgr_put_vdev(vdev); + } else { + hdd_err("vdev is NULL"); + } + } } resume_ol_rx: @@ -2312,7 +2450,16 @@ int wlan_hdd_cfg80211_set_txpower(struct wiphy *wiphy, static void wlan_hdd_get_tx_power(struct hdd_adapter *adapter, int *dbm) { - wlan_cfg80211_mc_cp_stats_get_tx_power(adapter->vdev, dbm); + struct wlan_objmgr_vdev *vdev; + + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) { + hdd_info("vdev is NULL"); + return; + } + + wlan_cfg80211_mc_cp_stats_get_tx_power(vdev, dbm); + hdd_objmgr_put_vdev(vdev); } #ifdef FEATURE_ANI_LEVEL_REQUEST