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
This commit is contained in:
Srinivas Pitla 2017-07-19 14:18:48 +05:30 • committed by snandini
commit 4a3f486e6e
6 changed files with 87 additions and 8 deletions

View file

@ -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 */

View file

@ -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_*/

View file

@ -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
*/

View file

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

View file

@ -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;
}

View file

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