Merge "qcacmn: Check NAN iface with same name before creating another one"
diff --git a/os_if/linux/nan/src/os_if_nan.c b/os_if/linux/nan/src/os_if_nan.c
index 03feae8..7820c83 100644
--- a/os_if/linux/nan/src/os_if_nan.c
+++ b/os_if/linux/nan/src/os_if_nan.c
@@ -32,6 +32,7 @@
 #include "wlan_objmgr_psoc_obj.h"
 #include "wlan_objmgr_pdev_obj.h"
 #include "wlan_objmgr_vdev_obj.h"
+#include "wlan_utility.h"
 
 /* NLA policy */
 static const struct nla_policy
@@ -87,6 +88,14 @@
 	}
 	iface_name = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR]);
 
+	nan_vdev = wlan_util_get_vdev_by_ifname(psoc, iface_name, WLAN_NAN_ID);
+	if (nan_vdev) {
+		cfg80211_err("NAN data interface %s is already present",
+			     iface_name);
+		wlan_objmgr_vdev_release_ref(nan_vdev, WLAN_NAN_ID);
+		return -EEXIST;
+	}
+
 	if (!tb[QCA_WLAN_VENDOR_ATTR_NDP_TRANSACTION_ID]) {
 		cfg80211_err("transaction id is unavailable");
 		return -EINVAL;
@@ -140,7 +149,7 @@
 		return -EINVAL;
 	}
 
-	nan_vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID);
+	nan_vdev = wlan_util_get_vdev_by_ifname(psoc, iface_name, WLAN_NAN_ID);
 	if (!nan_vdev) {
 		cfg80211_err("Nan datapath interface is not present");
 		return -EINVAL;
@@ -151,9 +160,8 @@
 	vdev_id = wlan_vdev_get_id(nan_vdev);
 	num_peers = ucfg_nan_get_active_peers(nan_vdev);
 	/*
-	 * wlan_objmgr_get_vdev_by_opmode_from_psoc API will have incremented
-	 * ref count - decrement here since vdev returned by that api is not
-	 * used any more
+	 * wlan_util_get_vdev_by_ifname increments ref count
+	 * decrement here since vdev returned by that api is not used any more
 	 */
 	wlan_objmgr_vdev_release_ref(nan_vdev, WLAN_NAN_ID);
 
@@ -270,12 +278,17 @@
 	}
 
 	iface_name = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR]);
-	nan_vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID);
+	nan_vdev = wlan_util_get_vdev_by_ifname(psoc, iface_name, WLAN_NAN_ID);
 	if (!nan_vdev) {
 		cfg80211_err("NAN data interface %s not available", iface_name);
 		return -EINVAL;
 	}
 
+	if (nan_vdev->vdev_mlme.vdev_opmode != QDF_NDI_MODE) {
+		cfg80211_err("Interface found is not NDI");
+		return -EINVAL;
+	}
+
 	state = ucfg_nan_get_ndi_state(nan_vdev);
 	if (state == NAN_DATA_NDI_DELETED_STATE ||
 	    state == NAN_DATA_NDI_DELETING_STATE ||
@@ -399,12 +412,17 @@
 
 	iface_name = nla_data(tb[QCA_WLAN_VENDOR_ATTR_NDP_IFACE_STR]);
 	/* Check if there is already an existing NAN interface */
-	nan_vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID);
+	nan_vdev = wlan_util_get_vdev_by_ifname(psoc, iface_name, WLAN_NAN_ID);
 	if (!nan_vdev) {
 		cfg80211_err("NAN data interface %s not available", iface_name);
 		return -EINVAL;
 	}
 
+	if (nan_vdev->vdev_mlme.vdev_opmode != QDF_NDI_MODE) {
+		cfg80211_err("Interface found is not NDI");
+		return -EINVAL;
+	}
+
 	state = ucfg_nan_get_ndi_state(nan_vdev);
 	if (state == NAN_DATA_NDI_DELETED_STATE ||
 	    state == NAN_DATA_NDI_DELETING_STATE ||
@@ -524,7 +542,8 @@
 	cfg80211_debug("sending ndp_end_req to SME, transaction_id: %d",
 		req.transaction_id);
 
-	nan_vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID);
+	nan_vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_NDI_MODE,
+							    WLAN_NAN_ID);
 	if (!nan_vdev) {
 		cfg80211_err("NAN data interface is not available");
 		return -EINVAL;
diff --git a/target_if/nan/src/target_if_nan.c b/target_if/nan/src/target_if_nan.c
index 2797a3f..4872e3c 100644
--- a/target_if/nan/src/target_if_nan.c
+++ b/target_if/nan/src/target_if_nan.c
@@ -927,7 +927,8 @@
 		 WMI_NDP_END_RSP_EVENTID, fixed_params->transaction_id,
 		 fixed_params->rsp_status, fixed_params->reason_code);
 
-	vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID);
+	vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_NDI_MODE,
+							WLAN_NAN_ID);
 	if (!vdev) {
 		target_if_err("vdev is null");
 		return -EINVAL;
@@ -993,7 +994,8 @@
 		return -EINVAL;
 	}
 
-	vdev = ucfg_nan_get_ndi_vdev(psoc, WLAN_NAN_ID);
+	vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_NDI_MODE,
+							WLAN_NAN_ID);
 	if (!vdev) {
 		target_if_err("vdev is null");
 		return -EINVAL;
diff --git a/umac/nan/core/src/nan_api.c b/umac/nan/core/src/nan_api.c
index 23b0bae..fe251a9 100644
--- a/umac/nan/core/src/nan_api.c
+++ b/umac/nan/core/src/nan_api.c
@@ -88,37 +88,21 @@
 static QDF_STATUS nan_vdev_obj_created_notification(
 		struct wlan_objmgr_vdev *vdev, void *arg_list)
 {
-	struct wlan_objmgr_psoc *psoc;
 	struct nan_vdev_priv_obj *nan_obj;
-	struct nan_psoc_priv_obj *nan_psoc_obj;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
+	nan_debug("nan_vdev_create_notif called");
 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_NDI_MODE) {
 		nan_debug("not a ndi vdev. do nothing");
 		return QDF_STATUS_SUCCESS;
 	}
 
-	nan_debug("nan_vdev_create_notif called");
-
-	psoc = wlan_vdev_get_psoc(vdev);
-	if (!psoc) {
-		nan_err("psoc is null");
-		return QDF_STATUS_E_NULL_VALUE;
-	}
-
-	nan_psoc_obj = nan_get_psoc_priv_obj(psoc);
-	if (!nan_psoc_obj) {
-		nan_err("nan_psoc_obj is null");
-		return QDF_STATUS_E_NULL_VALUE;
-	}
-
 	nan_obj = qdf_mem_malloc(sizeof(*nan_obj));
 	if (!nan_obj) {
 		nan_err("malloc failed for nan prv obj");
 		return QDF_STATUS_E_NOMEM;
 	}
 
-	nan_psoc_obj->vdev = vdev;
 	qdf_spinlock_create(&nan_obj->lock);
 	status = wlan_objmgr_vdev_component_obj_attach(vdev,
 			WLAN_UMAC_COMP_NAN, (void *)nan_obj,
@@ -140,28 +124,15 @@
 static QDF_STATUS nan_vdev_obj_destroyed_notification(
 				struct wlan_objmgr_vdev *vdev, void *arg_list)
 {
-	struct wlan_objmgr_psoc *psoc;
 	struct nan_vdev_priv_obj *nan_obj;
-	struct nan_psoc_priv_obj *nan_psoc_obj;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
+	nan_debug("nan_vdev_delete_notif called");
 	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_NDI_MODE) {
 		nan_debug("not a ndi vdev. do nothing");
 		return QDF_STATUS_SUCCESS;
 	}
 
-	nan_debug("nan_vdev_delete_notif called");
-	psoc = wlan_vdev_get_psoc(vdev);
-	if (psoc) {
-		nan_psoc_obj = nan_get_psoc_priv_obj(psoc);
-		if (nan_psoc_obj)
-			nan_psoc_obj->vdev = NULL;
-		else
-			nan_err("nan_psoc_obj is null");
-	} else {
-		nan_err("psoc is null");
-	}
-
 	nan_obj = nan_get_vdev_priv_obj(vdev);
 	if (!nan_obj) {
 		nan_err("nan_obj is NULL");
diff --git a/umac/nan/core/src/nan_main_i.h b/umac/nan/core/src/nan_main_i.h
index ca467ef..7d2d770 100644
--- a/umac/nan/core/src/nan_main_i.h
+++ b/umac/nan/core/src/nan_main_i.h
@@ -59,12 +59,10 @@
  * struct nan_psoc_priv_obj - nan private psoc obj
  * @lock: lock to be acquired before reading or writing to object
  * @cb_obj: struct contaning callback pointers
- * @vdev: ndi vdev
  */
 struct nan_psoc_priv_obj {
 	qdf_spinlock_t lock;
 	struct nan_callbacks cb_obj;
-	struct wlan_objmgr_vdev *vdev;
 };
 
 /**
diff --git a/umac/nan/dispatcher/inc/nan_ucfg_api.h b/umac/nan/dispatcher/inc/nan_ucfg_api.h
index feb002f..7e9f16c 100644
--- a/umac/nan/dispatcher/inc/nan_ucfg_api.h
+++ b/umac/nan/dispatcher/inc/nan_ucfg_api.h
@@ -174,16 +174,6 @@
 				  struct nan_callbacks *cb_obj);
 
 /**
- * ucfg_nan_get_ndi_vdev: ucfg API get ndi vdev from psoc
- * @psoc: psoc obj pointer
- * @dbg_id: component id that will be owner of reference
- *
- * Return: vdev object pointer on success, null otherwise
- */
-struct wlan_objmgr_vdev *ucfg_nan_get_ndi_vdev(struct wlan_objmgr_psoc *psoc,
-						wlan_objmgr_ref_dbgid dbg_id);
-
-/**
  * ucfg_nan_req_processor: ucfg API to be called from HDD/OS_IF to
  * process nan datapath initiator request from userspace
  * @vdev: nan vdev pointer
diff --git a/umac/nan/dispatcher/src/nan_ucfg_api.c b/umac/nan/dispatcher/src/nan_ucfg_api.c
index 2e839b3..32d7e2f 100644
--- a/umac/nan/dispatcher/src/nan_ucfg_api.c
+++ b/umac/nan/dispatcher/src/nan_ucfg_api.c
@@ -302,26 +302,6 @@
 	return QDF_STATUS_SUCCESS;
 }
 
-struct wlan_objmgr_vdev *ucfg_nan_get_ndi_vdev(struct wlan_objmgr_psoc *psoc,
-						wlan_objmgr_ref_dbgid dbg_id)
-{
-	QDF_STATUS status;
-	struct nan_psoc_priv_obj *psoc_obj = nan_get_psoc_priv_obj(psoc);
-
-	if (!psoc_obj) {
-		nan_err("nan psoc priv object is NULL");
-		return NULL;
-	}
-
-	status = wlan_objmgr_vdev_try_get_ref(psoc_obj->vdev, dbg_id);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		nan_err("could not get vdev ref. vdev may have been deleted");
-		return NULL;
-	}
-
-	return psoc_obj->vdev;
-}
-
 static struct nan_datapath_initiator_req *ucfg_nan_copy_intiator_req(
 			struct wlan_objmgr_vdev *vdev,
 			struct nan_datapath_initiator_req *in_req)