qcacmn: Add max peer count and peer count support to pdev

Max peer count includes self peer/bss peer as well
Fixed issue in max peer check

Change-Id: I72fd7af1b99760631467ee6bcf92af6a63ee38e1
CRs-Fixed: 2078904
diff --git a/umac/cmn_services/inc/wlan_cmn.h b/umac/cmn_services/inc/wlan_cmn.h
index 36ba1cc..50e54c2 100644
--- a/umac/cmn_services/inc/wlan_cmn.h
+++ b/umac/cmn_services/inc/wlan_cmn.h
@@ -41,8 +41,6 @@
 /* Max sequence number */
 #define WLAN_MAX_SEQ_NUM    4096
 
-/* Max no. of Stations can be associated to VDEV*/
-#define WLAN_UMAC_MAX_AP_PEERS WLAN_UMAC_PSOC_MAX_PEERS
 /* Max no. of peers for STA vap */
 #define WLAN_UMAC_MAX_STA_PEERS 2
 /* Max vdev_id */
diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h
index d73e971..feeaca3 100644
--- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h
+++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_pdev_obj.h
@@ -144,6 +144,8 @@
  * @wlan_vdev_list:    List maintains the VDEVs created on this PDEV
  * @wlan_vdev_count:   VDEVs count
  * @max_vdev_count:    Max no. of VDEVs supported by this PDEV
+ * @wlan_peer_count:   Peer count
+ * @max_peer_count:    Max Peer count
  * @wlan_psoc:         back pointer to PSOC, its attached to
  * @ref_cnt:           Ref count
  * @ref_id_dbg:        Array to track Ref count
@@ -154,6 +156,8 @@
 	qdf_list_t wlan_vdev_list;
 	uint8_t wlan_vdev_count;
 	uint8_t max_vdev_count;
+	uint16_t wlan_peer_count;
+	uint16_t max_peer_count;
 	struct wlan_objmgr_psoc *wlan_psoc;
 	qdf_atomic_t ref_cnt;
 	qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX];
@@ -780,4 +784,72 @@
 
 	return pdev->tgt_if_handle;
 }
+
+/**
+ * wlan_pdev_set_max_peer_count() - set max peer count
+ * @vdev: PDEV object
+ * @count: Max peer count
+ *
+ * API to set max peer count of PDEV
+ *
+ * Return: void
+ */
+static inline void wlan_pdev_set_max_peer_count(struct wlan_objmgr_pdev *pdev,
+						uint16_t count)
+{
+	pdev->pdev_objmgr.max_peer_count = count;
+}
+
+/**
+ * wlan_pdev_get_max_peer_count() - get max peer count
+ * @pdev: PDEV object
+ *
+ * API to get max peer count of PDEV
+ *
+ * Return: max peer count
+ */
+static inline uint16_t wlan_pdev_get_max_peer_count(
+						struct wlan_objmgr_pdev *pdev)
+{
+	return pdev->pdev_objmgr.max_peer_count;
+}
+
+/**
+ * wlan_pdev_get_peer_count() - get pdev peer count
+ * @pdev: PDEV object
+ *
+ * API to get peer count from PDEV
+ *
+ * Return: peer_count - pdev's peer count
+ */
+static inline uint16_t wlan_pdev_get_peer_count(struct wlan_objmgr_pdev *pdev)
+{
+	return pdev->pdev_objmgr.wlan_peer_count;
+}
+
+/**
+ * wlan_pdev_incr_peer_count() - increment pdev peer count
+ * @pdev: PDEV object
+ *
+ * API to increment peer count of PDEV by 1
+ *
+ * Return: void
+ */
+static inline void wlan_pdev_incr_peer_count(struct wlan_objmgr_pdev *pdev)
+{
+	pdev->pdev_objmgr.wlan_peer_count++;
+}
+
+/**
+ * wlan_pdev_decr_peer_count() - decrement pdev peer count
+ * @pdev: PDEV object
+ *
+ * API to decrement peer count of PDEV by 1
+ *
+ * Return: void
+ */
+static inline void wlan_pdev_decr_peer_count(struct wlan_objmgr_pdev *pdev)
+{
+	pdev->pdev_objmgr.wlan_peer_count--;
+}
 #endif /* _WLAN_OBJMGR_PDEV_H_*/
diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h
index 35a1644..581c130 100644
--- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h
+++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h
@@ -1342,7 +1342,7 @@
  * wlan_vdev_get_peer_count() - get vdev peer count
  * @vdev: VDEV object
  *
- * API to get OS private pointer from VDEV
+ * API to get peer count from VDEV
  *
  * Return: peer_count - vdev's peer count
  */
diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c
index c87a75d..6a9a1d1 100644
--- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c
+++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_pdev_obj.c
@@ -126,6 +126,8 @@
 			WLAN_UMAC_PDEV_MAX_VDEVS);
 	pdev->pdev_objmgr.wlan_vdev_count = 0;
 	pdev->pdev_objmgr.max_vdev_count = WLAN_UMAC_PDEV_MAX_VDEVS;
+	pdev->pdev_objmgr.wlan_peer_count = 0;
+	pdev->pdev_objmgr.max_peer_count = WLAN_UMAC_PSOC_MAX_PEERS;
 	/* Save HDD/OSIF pointer */
 	pdev->pdev_nif.pdev_ospriv = osdev_priv;
 	qdf_atomic_init(&pdev->pdev_objmgr.ref_cnt);
diff --git a/umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c b/umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c
index 1a54207..cc45ad8 100644
--- a/umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c
+++ b/umac/cmn_services/obj_mgr/src/wlan_objmgr_psoc_obj.c
@@ -1355,7 +1355,7 @@
 	wlan_psoc_obj_lock(psoc);
 	objmgr = &psoc->soc_objmgr;
 	/* Max peer limit is reached, return failure */
-	if (objmgr->wlan_peer_count > WLAN_UMAC_PSOC_MAX_PEERS) {
+	if (objmgr->wlan_peer_count >= WLAN_UMAC_PSOC_MAX_PEERS) {
 		wlan_psoc_obj_unlock(psoc);
 		return QDF_STATUS_E_FAILURE;
 	}
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 549b8d5..70c5bcd 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
@@ -76,8 +76,8 @@
 	struct wlan_objmgr_pdev *pdev;
 
 	if (vdev == NULL) {
-			obj_mgr_err("vdev is NULL");
-			return QDF_STATUS_E_FAILURE;
+		obj_mgr_err("vdev is NULL");
+		return QDF_STATUS_E_FAILURE;
 	}
 	/* if PDEV is NULL, return */
 	pdev = wlan_vdev_get_pdev(vdev);
@@ -174,7 +174,8 @@
 	if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE)
 		vdev->vdev_objmgr.max_peer_count = WLAN_UMAC_MAX_STA_PEERS;
 	else
-		vdev->vdev_objmgr.max_peer_count = WLAN_UMAC_MAX_AP_PEERS;
+		vdev->vdev_objmgr.max_peer_count =
+				wlan_pdev_get_max_peer_count(pdev);
 
 	/* Initialize peer list */
 	qdf_list_create(&vdev->vdev_objmgr.wlan_peer_list,
@@ -597,16 +598,21 @@
 						struct wlan_objmgr_peer *peer)
 {
 	struct wlan_objmgr_vdev_objmgr *objmgr = &vdev->vdev_objmgr;
+	struct wlan_objmgr_pdev *pdev;
 
 	wlan_vdev_obj_lock(vdev);
+	pdev = wlan_vdev_get_pdev(vdev);
 	/* If Max peer count exceeds, return failure */
-	if (objmgr->wlan_peer_count > objmgr->max_peer_count) {
+	if ((objmgr->wlan_peer_count >= objmgr->max_peer_count) ||
+	     (wlan_pdev_get_peer_count(pdev) >=
+			wlan_pdev_get_max_peer_count(pdev))) {
 		wlan_vdev_obj_unlock(vdev);
 		return QDF_STATUS_E_FAILURE;
 	}
 	/* Add peer to vdev's peer list */
 	wlan_obj_vdev_peerlist_add_tail(&objmgr->wlan_peer_list, peer);
 	objmgr->wlan_peer_count++;
+	wlan_pdev_incr_peer_count(wlan_vdev_get_pdev(vdev));
 
 	if ((wlan_peer_get_peer_type(peer) == WLAN_PEER_AP) ||
 	    (wlan_peer_get_peer_type(peer) == WLAN_PEER_P2P_GO)) {
@@ -677,6 +683,7 @@
 	}
 	/* decrement peer count */
 	objmgr->wlan_peer_count--;
+	wlan_pdev_decr_peer_count(wlan_vdev_get_pdev(vdev));
 	wlan_vdev_obj_unlock(vdev);
 	/* decrement vdev ref count after peer released its reference */
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_OBJMGR_ID);