diff --git a/os_if/linux/mlme/inc/wlan_cfg80211_cm_util.h b/os_if/linux/mlme/inc/wlan_cfg80211_cm_util.h index 7a4176f9d4..aaac931454 100644 --- a/os_if/linux/mlme/inc/wlan_cfg80211_cm_util.h +++ b/os_if/linux/mlme/inc/wlan_cfg80211_cm_util.h @@ -32,6 +32,23 @@ */ QDF_STATUS osif_cm_register_cb(void); +/** + * osif_cm_osif_priv_init() - API to init osif priv data for connection manager + * @vdev: vdev pointer + * + * Return: QDF_STATUS + */ +QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev); + +/** + * osif_cm_osif_priv_deinit() - API to deinit osif priv data for connection + * manager + * @vdev: vdev pointer + * + * Return: QDF_STATUS + */ +QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev); + /** * osif_cm_reset_id_and_src_no_lock() - Function to resets last * connection manager command id and source in osif diff --git a/os_if/linux/mlme/src/wlan_cfg80211_cm_connect_rsp.c b/os_if/linux/mlme/src/wlan_cfg80211_cm_connect_rsp.c index af93e8f42c..05f68028c8 100644 --- a/os_if/linux/mlme/src/wlan_cfg80211_cm_connect_rsp.c +++ b/os_if/linux/mlme/src/wlan_cfg80211_cm_connect_rsp.c @@ -51,20 +51,20 @@ osif_validate_connect_and_reset_src_id(struct vdev_osif_priv *osif_priv, * cookie match else drop. If cookie match reset the cookie * and source. */ - qdf_spinlock_acquire(&osif_priv->last_cmd_info.cmd_id_lock); - if (cm_id != osif_priv->last_cmd_info.last_id || - osif_priv->last_cmd_info.last_source != CM_OSIF_CONNECT) { + qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock); + if (cm_id != osif_priv->cm_info.last_id || + osif_priv->cm_info.last_source != CM_OSIF_CONNECT) { osif_debug("Ignore as cm_id(%d)/src(%d) didn't match stored cm_id(%d)/src(%d)", cm_id, CM_OSIF_CONNECT, - osif_priv->last_cmd_info.last_id, - osif_priv->last_cmd_info.last_source); + osif_priv->cm_info.last_id, + osif_priv->cm_info.last_source); status = QDF_STATUS_E_INVAL; goto rel_lock; } osif_cm_reset_id_and_src_no_lock(osif_priv); rel_lock: - qdf_spinlock_release(&osif_priv->last_cmd_info.cmd_id_lock); + qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock); return status; } diff --git a/os_if/linux/mlme/src/wlan_cfg80211_cm_disconnect_rsp.c b/os_if/linux/mlme/src/wlan_cfg80211_cm_disconnect_rsp.c index 426d5753e5..39c9bddecb 100644 --- a/os_if/linux/mlme/src/wlan_cfg80211_cm_disconnect_rsp.c +++ b/os_if/linux/mlme/src/wlan_cfg80211_cm_disconnect_rsp.c @@ -47,7 +47,7 @@ osif_validate_disconnect_and_reset_src_id(struct vdev_osif_priv *osif_priv, QDF_STATUS status = QDF_STATUS_SUCCESS; /* Always drop internal disconnect */ - qdf_spinlock_acquire(&osif_priv->last_cmd_info.cmd_id_lock); + qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock); if (rsp->req.req.source == CM_INTERNAL_DISCONNECT) { osif_debug("ignore internal disconnect"); status = QDF_STATUS_E_INVAL; @@ -59,19 +59,19 @@ osif_validate_disconnect_and_reset_src_id(struct vdev_osif_priv *osif_priv, * cookie match else drop. If cookie match reset the cookie * and source */ - if (rsp->req.cm_id != osif_priv->last_cmd_info.last_id || - rsp->req.req.source != osif_priv->last_cmd_info.last_source) { + if (rsp->req.cm_id != osif_priv->cm_info.last_id || + rsp->req.req.source != osif_priv->cm_info.last_source) { osif_debug("Ignore as cm_id(%d)/src(%d) didn't match stored cm_id(%d)/src(%d)", rsp->req.cm_id, rsp->req.req.source, - osif_priv->last_cmd_info.last_id, - osif_priv->last_cmd_info.last_source); + osif_priv->cm_info.last_id, + osif_priv->cm_info.last_source); status = QDF_STATUS_E_INVAL; goto rel_lock; } osif_cm_reset_id_and_src_no_lock(osif_priv); rel_lock: - qdf_spinlock_release(&osif_priv->last_cmd_info.cmd_id_lock); + qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock); return status; } diff --git a/os_if/linux/mlme/src/wlan_cfg80211_cm_util.c b/os_if/linux/mlme/src/wlan_cfg80211_cm_util.c index dd94ed5a98..056303486a 100644 --- a/os_if/linux/mlme/src/wlan_cfg80211_cm_util.c +++ b/os_if/linux/mlme/src/wlan_cfg80211_cm_util.c @@ -28,8 +28,8 @@ void osif_cm_reset_id_and_src_no_lock(struct vdev_osif_priv *osif_priv) { - osif_priv->last_cmd_info.last_id = CM_ID_INVALID; - osif_priv->last_cmd_info.last_source = CM_SOURCE_INVALID; + osif_priv->cm_info.last_id = CM_ID_INVALID; + osif_priv->cm_info.last_source = CM_SOURCE_INVALID; } QDF_STATUS osif_cm_reset_id_and_src(struct wlan_objmgr_vdev *vdev) @@ -40,9 +40,9 @@ QDF_STATUS osif_cm_reset_id_and_src(struct wlan_objmgr_vdev *vdev) osif_err("Invalid vdev osif priv"); return QDF_STATUS_E_INVAL; } - qdf_spinlock_acquire(&osif_priv->last_cmd_info.cmd_id_lock); + qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock); osif_cm_reset_id_and_src_no_lock(osif_priv); - qdf_spinlock_release(&osif_priv->last_cmd_info.cmd_id_lock); + qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock); return QDF_STATUS_SUCCESS; } @@ -96,10 +96,10 @@ osif_cm_update_id_and_src_cb(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_E_INVAL; } - qdf_spinlock_acquire(&osif_priv->last_cmd_info.cmd_id_lock); - osif_priv->last_cmd_info.last_id = cm_id; - osif_priv->last_cmd_info.last_source = source; - qdf_spinlock_release(&osif_priv->last_cmd_info.cmd_id_lock); + qdf_spinlock_acquire(&osif_priv->cm_info.cmd_id_lock); + osif_priv->cm_info.last_id = cm_id; + osif_priv->cm_info.last_source = source; + qdf_spinlock_release(&osif_priv->cm_info.cmd_id_lock); return QDF_STATUS_SUCCESS; } @@ -160,3 +160,38 @@ QDF_STATUS osif_cm_register_cb(void) return QDF_STATUS_SUCCESS; } +QDF_STATUS osif_cm_osif_priv_init(struct wlan_objmgr_vdev *vdev) +{ + struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); + enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev); + + if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE) + return QDF_STATUS_SUCCESS; + + if (!osif_priv) { + osif_err("Invalid vdev osif priv"); + return QDF_STATUS_E_INVAL; + } + + qdf_spinlock_create(&osif_priv->cm_info.cmd_id_lock); + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS osif_cm_osif_priv_deinit(struct wlan_objmgr_vdev *vdev) +{ + struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev); + enum QDF_OPMODE mode = wlan_vdev_mlme_get_opmode(vdev); + + if (mode != QDF_STA_MODE && mode != QDF_P2P_CLIENT_MODE) + return QDF_STATUS_SUCCESS; + + if (!osif_priv) { + osif_err("Invalid vdev osif priv"); + return QDF_STATUS_E_INVAL; + } + + qdf_spinlock_destroy(&osif_priv->cm_info.cmd_id_lock); + + return QDF_STATUS_SUCCESS; +} diff --git a/os_if/linux/wlan_osif_priv.h b/os_if/linux/wlan_osif_priv.h index 337f6e91e1..ff4bd6c2b1 100644 --- a/os_if/linux/wlan_osif_priv.h +++ b/os_if/linux/wlan_osif_priv.h @@ -22,6 +22,7 @@ #include "qdf_net_if.h" #include "wlan_cm_public_struct.h" +#include struct osif_scan_pdev; struct osif_tdls_vdev; @@ -40,19 +41,22 @@ struct pdev_osif_priv { struct qdf_net_if *nif; }; -/** - * struct osif_cm_command_info - osif connection manager command info - * @last_source: Last command request source - * @last_id: Cookie from connection manager - * @cmd_id_lock: lock to update and read last command source - * @legacy: legacy data structure. Big data etc for MCC - */ #ifdef FEATURE_CM_ENABLE -struct osif_cm_command_info { +/** + * struct osif_cm_info - osif connection manager info + * @last_source: Last command request source + * @last_id: Last command from connection manager + * @cmd_id_lock: lock to update and read last command source + * @last_disconnect_reason: last disconnect reason to be indicated in get + * station + * @ext_priv: legacy data pointer. + */ +struct osif_cm_info { enum wlan_cm_source last_source; wlan_cm_id last_id; struct qdf_spinlock cmd_id_lock; - void *legacy; + enum qca_disconnect_reason_codes last_disconnect_reason; + void *ext_priv; }; #endif @@ -60,14 +64,15 @@ struct osif_cm_command_info { * struct vdev_osif_priv - OS private structure of vdev * @wdev: wireless device handle * @legacy_osif_priv: legacy osif private handle - * @connect_info: osif connection manager command info + * @osif_tdls: osif tdls info + * @cm_info: osif connection manager info */ struct vdev_osif_priv { struct wireless_dev *wdev; void *legacy_osif_priv; struct osif_tdls_vdev *osif_tdls; #ifdef FEATURE_CM_ENABLE - struct osif_cm_command_info last_cmd_info; + struct osif_cm_info cm_info; #endif }; diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c index aa0e1be831..30a957e9f5 100644 --- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c +++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_vdev_obj.c @@ -75,50 +75,6 @@ static QDF_STATUS wlan_objmgr_vdev_object_status( return status; } -#ifdef FEATURE_CM_ENABLE -/** - * wlan_vdev_mlme_create_cmd_id_lock() - Function to create connection - * manager command id lock - * @osif_priv: Pointer to osif private data structure of vdev - * - * Context: Any context. - * Return: None - */ - -static void -wlan_vdev_mlme_create_cmd_id_lock(struct vdev_osif_priv *osif_priv) -{ - qdf_spinlock_create(&osif_priv->last_cmd_info.cmd_id_lock); -} - -/** - * wlan_vdev_mlme_destroy_cmd_id_lock() - Function to destroy connection - * manager command id lock - * @osif_priv: Pointer to osif private data structure of vdev - * - * Context: Any context. - * Return: None - */ -static void -wlan_vdev_mlme_destroy_cmd_id_lock(struct vdev_osif_priv *osif_priv) -{ - qdf_spinlock_destroy(&osif_priv->last_cmd_info.cmd_id_lock); -} - -#else - -static inline void -wlan_vdev_mlme_create_cmd_id_lock(struct vdev_osif_priv *osif_priv) -{ -} - -static inline void -wlan_vdev_mlme_destroy_cmd_id_lock(struct vdev_osif_priv *osif_priv) -{ -} - -#endif - static QDF_STATUS wlan_objmgr_vdev_obj_free(struct wlan_objmgr_vdev *vdev) { struct wlan_objmgr_pdev *pdev; @@ -141,10 +97,6 @@ static QDF_STATUS wlan_objmgr_vdev_obj_free(struct wlan_objmgr_vdev *vdev) return QDF_STATUS_E_FAILURE; } - if (vdev->vdev_mlme.vdev_opmode == QDF_STA_MODE || - vdev->vdev_mlme.vdev_opmode == QDF_P2P_CLIENT_MODE) - wlan_vdev_mlme_destroy_cmd_id_lock(wlan_vdev_get_ospriv(vdev)); - /* Detach VDEV from PDEV VDEV's list */ if (wlan_objmgr_pdev_vdev_detach(pdev, vdev) == QDF_STATUS_E_FAILURE) @@ -262,10 +214,6 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create( /* store os-specific pointer */ vdev->vdev_nif.osdev = wlan_objmgr_vdev_get_osif_priv(vdev); - if (vdev->vdev_mlme.vdev_opmode == QDF_STA_MODE || - vdev->vdev_mlme.vdev_opmode == QDF_P2P_CLIENT_MODE) - wlan_vdev_mlme_create_cmd_id_lock(vdev->vdev_nif.osdev); - /* peer count to 0 */ vdev->vdev_objmgr.wlan_peer_count = 0; qdf_atomic_init(&vdev->vdev_objmgr.ref_cnt);