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);