|
@@ -872,32 +872,23 @@ QDF_STATUS wlan_objmgr_psoc_vdev_attach(struct wlan_objmgr_psoc *psoc,
|
|
{
|
|
{
|
|
struct wlan_objmgr_psoc_objmgr *objmgr;
|
|
struct wlan_objmgr_psoc_objmgr *objmgr;
|
|
uint8_t id = 0;
|
|
uint8_t id = 0;
|
|
- uint8_t map_index = 0;
|
|
|
|
- uint8_t map_entry_size = 32;
|
|
|
|
- uint8_t adjust_ix = 0;
|
|
|
|
QDF_STATUS status;
|
|
QDF_STATUS status;
|
|
|
|
|
|
wlan_psoc_obj_lock(psoc);
|
|
wlan_psoc_obj_lock(psoc);
|
|
objmgr = &psoc->soc_objmgr;
|
|
objmgr = &psoc->soc_objmgr;
|
|
/* Find first free vdev id */
|
|
/* 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 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 */
|
|
/* 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 */
|
|
/* store vdev pointer in vdev list */
|
|
objmgr->wlan_vdev_list[id] = vdev;
|
|
objmgr->wlan_vdev_list[id] = vdev;
|
|
/* increment vdev counter */
|
|
/* increment vdev counter */
|
|
@@ -905,6 +896,8 @@ QDF_STATUS wlan_objmgr_psoc_vdev_attach(struct wlan_objmgr_psoc *psoc,
|
|
/* save vdev id */
|
|
/* save vdev id */
|
|
vdev->vdev_objmgr.vdev_id = id;
|
|
vdev->vdev_objmgr.vdev_id = id;
|
|
status = QDF_STATUS_SUCCESS;
|
|
status = QDF_STATUS_SUCCESS;
|
|
|
|
+ } else {
|
|
|
|
+ status = QDF_STATUS_E_FAILURE;
|
|
}
|
|
}
|
|
wlan_psoc_obj_unlock(psoc);
|
|
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;
|
|
struct wlan_objmgr_psoc_objmgr *objmgr;
|
|
uint8_t id = 0;
|
|
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;
|
|
id = vdev->vdev_objmgr.vdev_id;
|
|
/* Invalid vdev id */
|
|
/* Invalid vdev id */
|
|
if (id >= wlan_psoc_get_max_vdev_count(psoc))
|
|
if (id >= wlan_psoc_get_max_vdev_count(psoc))
|
|
return QDF_STATUS_E_FAILURE;
|
|
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);
|
|
wlan_psoc_obj_lock(psoc);
|
|
objmgr = &psoc->soc_objmgr;
|
|
objmgr = &psoc->soc_objmgr;
|
|
/* unset bit, to free the slot */
|
|
/* 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 */
|
|
/* reset VDEV pointer to NULL in VDEV list array */
|
|
objmgr->wlan_vdev_list[id] = NULL;
|
|
objmgr->wlan_vdev_list[id] = NULL;
|
|
/* decrement vdev count */
|
|
/* 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("ref_cnt: %d", qdf_atomic_read(&psoc_objmgr->ref_cnt));
|
|
obj_mgr_debug("qdf_dev: %pK", psoc_objmgr->qdf_dev);
|
|
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) {
|
|
wlan_objmgr_for_each_psoc_pdev(psoc, index, pdev) {
|
|
obj_mgr_debug("wlan_pdev_list[%d]: %pK", index, pdev);
|
|
obj_mgr_debug("wlan_pdev_list[%d]: %pK", index, pdev);
|