diff --git a/umac/cmn_services/inc/wlan_cmn.h b/umac/cmn_services/inc/wlan_cmn.h index 36ba1ccfeb21..50e54c210782 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 d73e9715eec4..feeaca3552c2 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 @@ struct wlan_objmgr_pdev_mlme { * @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 @@ struct wlan_objmgr_pdev_objmgr { 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 @@ static inline void *wlan_pdev_get_tgt_if_handle(struct wlan_objmgr_pdev *pdev) 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 35a16447ef27..581c1306467d 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 @@ static inline void wlan_vdev_reset_ospriv(struct wlan_objmgr_vdev *vdev) * 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 c87a75d3a65a..6a9a1d146943 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 @@ struct wlan_objmgr_pdev *wlan_objmgr_pdev_obj_create( 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 1a54207ce31b..cc45ad82205c 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 @@ QDF_STATUS wlan_objmgr_psoc_peer_attach(struct wlan_objmgr_psoc *psoc, 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 549b8d5e66f2..70c5bcd9a5a8 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 @@ static QDF_STATUS wlan_objmgr_vdev_obj_free(struct wlan_objmgr_vdev *vdev) 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 @@ struct wlan_objmgr_vdev *wlan_objmgr_vdev_obj_create( 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 @@ QDF_STATUS wlan_objmgr_vdev_peer_attach(struct wlan_objmgr_vdev *vdev, 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 @@ QDF_STATUS wlan_objmgr_vdev_peer_detach(struct wlan_objmgr_vdev *vdev, } /* 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);