From d73181f045c5ee66be31fb64a1221fa65c547429 Mon Sep 17 00:00:00 2001 From: Vivek Date: Tue, 5 May 2020 00:02:58 +0530 Subject: [PATCH] qcacmn: Use qdf_bitmap for vdev bitmap in psoc The current bitmap used for vdevs in psoc is a two element array of 32bit, thus supporting upto 64 bits bitmap. In certain feature of AP use cases, there could be more than 64 vdevs of multiple radios of a psoc, so the current bitmap would not suffice. Use the qdf_bitmap to define bitmap based on the max vdevs supported by a psoc, which could be defined to higher value than 64 if a given AP feature is enabled. CRs-Fixed: 2678131 Change-Id: Icd72f8dbe4654180dab993e3ce35d886c9e6ca43 --- .../obj_mgr/inc/wlan_objmgr_cmn.h | 4 ++ .../obj_mgr/inc/wlan_objmgr_pdev_obj.h | 3 ++ .../obj_mgr/inc/wlan_objmgr_psoc_obj.h | 8 ++- .../obj_mgr/src/wlan_objmgr_psoc_obj.c | 49 ++++++------------- 4 files changed, 29 insertions(+), 35 deletions(-) diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h index ad5abe3b3e8a..b214fabea1c1 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h @@ -67,6 +67,10 @@ #define objmgr_nofl_debug(params...) \ QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_OBJ_MGR, params) +#define obj_mgr_debug_hex(ptr, size) \ + qdf_trace_hex_dump(QDF_MODULE_ID_OBJ_MGR, \ + QDF_TRACE_LEVEL_DEBUG, ptr, size) + /** * enum WLAN_OBJ_STATE - State of Object * @WLAN_OBJ_STATE_ALLOCATED: Common object is allocated, but not 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 a03068192d48..a69688e03699 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 @@ -830,6 +830,9 @@ static inline void wlan_pdev_reset_ospriv(struct wlan_objmgr_pdev *pdev) static inline void wlan_pdev_set_max_vdev_count(struct wlan_objmgr_pdev *pdev, uint8_t max_vdev_count) { + if (max_vdev_count > WLAN_UMAC_PDEV_MAX_VDEVS) + QDF_BUG(0); + pdev->pdev_objmgr.max_vdev_count = max_vdev_count; } diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h index 25ce022ba13a..85890e9371ad 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h @@ -305,7 +305,7 @@ struct wlan_objmgr_psoc_objmgr { uint16_t temp_peer_count; struct wlan_objmgr_pdev *wlan_pdev_list[WLAN_UMAC_MAX_PDEVS]; struct wlan_objmgr_vdev *wlan_vdev_list[WLAN_UMAC_PSOC_MAX_VDEVS]; - uint32_t wlan_vdev_id_map[2]; + qdf_bitmap(wlan_vdev_id_map, WLAN_UMAC_PSOC_MAX_VDEVS); struct wlan_peer_list peer_list; qdf_atomic_t ref_cnt; qdf_atomic_t ref_id_dbg[WLAN_REF_ID_MAX]; @@ -1555,6 +1555,9 @@ static inline void wlan_psoc_set_qdf_dev( static inline void wlan_psoc_set_max_vdev_count(struct wlan_objmgr_psoc *psoc, uint8_t max_vdev_count) { + if (max_vdev_count > WLAN_UMAC_PSOC_MAX_VDEVS) + QDF_BUG(0); + psoc->soc_objmgr.max_vdev_count = max_vdev_count; } @@ -1584,6 +1587,9 @@ static inline uint8_t wlan_psoc_get_max_vdev_count( static inline void wlan_psoc_set_max_peer_count(struct wlan_objmgr_psoc *psoc, uint16_t max_peer_count) { + if (max_peer_count > WLAN_UMAC_PSOC_MAX_PEERS) + QDF_BUG(0); + psoc->soc_objmgr.max_peer_count = max_peer_count; } 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 410cec95bab2..47347b1ea810 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 @@ -872,32 +872,23 @@ QDF_STATUS wlan_objmgr_psoc_vdev_attach(struct wlan_objmgr_psoc *psoc, { struct wlan_objmgr_psoc_objmgr *objmgr; uint8_t id = 0; - uint8_t map_index = 0; - uint8_t map_entry_size = 32; - uint8_t adjust_ix = 0; QDF_STATUS status; wlan_psoc_obj_lock(psoc); objmgr = &psoc->soc_objmgr; /* Find first free vdev id */ - while ((id < objmgr->max_vdev_count) && - (objmgr->wlan_vdev_id_map[map_index] & (1<<(id - adjust_ix)))) { - id++; - /* - * The map is two DWORDS(32 bits), so, map_index - * adjust_ix derived based on the id value - */ - if (id == ((map_index + 1) * map_entry_size)) { - map_index++; - adjust_ix = map_index * map_entry_size; + while ((id < objmgr->max_vdev_count)) { + if (qdf_test_bit(id, objmgr->wlan_vdev_id_map)) { + id++; + continue; } + break; } + /* If no free slot, return failure */ - if (id == objmgr->max_vdev_count) { - status = QDF_STATUS_E_FAILURE; - } else { + if (id < objmgr->max_vdev_count) { /* set free vdev id index */ - objmgr->wlan_vdev_id_map[map_index] |= (1<<(id-adjust_ix)); + qdf_set_bit(id, objmgr->wlan_vdev_id_map); /* store vdev pointer in vdev list */ objmgr->wlan_vdev_list[id] = vdev; /* increment vdev counter */ @@ -905,6 +896,8 @@ QDF_STATUS wlan_objmgr_psoc_vdev_attach(struct wlan_objmgr_psoc *psoc, /* save vdev id */ vdev->vdev_objmgr.vdev_id = id; status = QDF_STATUS_SUCCESS; + } else { + status = QDF_STATUS_E_FAILURE; } wlan_psoc_obj_unlock(psoc); @@ -916,26 +909,16 @@ QDF_STATUS wlan_objmgr_psoc_vdev_detach(struct wlan_objmgr_psoc *psoc, { struct wlan_objmgr_psoc_objmgr *objmgr; uint8_t id = 0; - uint8_t map_index = 0; - uint8_t map_entry_size = 32; - uint8_t adjust_ix = 0; id = vdev->vdev_objmgr.vdev_id; /* Invalid vdev id */ if (id >= wlan_psoc_get_max_vdev_count(psoc)) return QDF_STATUS_E_FAILURE; - /* - * Derive map_index and adjust_ix to find actual DWORD - * the id map is present - */ - while ((id - adjust_ix) >= map_entry_size) { - map_index++; - adjust_ix = map_index * map_entry_size; - } + wlan_psoc_obj_lock(psoc); objmgr = &psoc->soc_objmgr; /* unset bit, to free the slot */ - objmgr->wlan_vdev_id_map[map_index] &= ~(1<<(id-adjust_ix)); + qdf_clear_bit(id, objmgr->wlan_vdev_id_map); /* reset VDEV pointer to NULL in VDEV list array */ objmgr->wlan_vdev_list[id] = NULL; /* decrement vdev count */ @@ -2999,11 +2982,9 @@ void wlan_print_psoc_info(struct wlan_objmgr_psoc *psoc) obj_mgr_debug("ref_cnt: %d", qdf_atomic_read(&psoc_objmgr->ref_cnt)); obj_mgr_debug("qdf_dev: %pK", psoc_objmgr->qdf_dev); - obj_mgr_debug("wlan_vdev_id_map[%d]: 0x%x", - index, psoc_objmgr->wlan_vdev_id_map[index]); - index++; - obj_mgr_debug("wlan_vdev_id_map[%d]: 0x%x", - index, psoc_objmgr->wlan_vdev_id_map[index]); + obj_mgr_debug("wlan_vdev_id_map:"); + obj_mgr_debug_hex(psoc_objmgr->wlan_vdev_id_map, + sizeof(psoc_objmgr->wlan_vdev_id_map)); wlan_objmgr_for_each_psoc_pdev(psoc, index, pdev) { obj_mgr_debug("wlan_pdev_list[%d]: %pK", index, pdev);