|
@@ -1,5 +1,6 @@
|
|
|
/*
|
|
|
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
|
|
|
+ * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
|
|
|
*
|
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
@@ -44,6 +45,7 @@ static uint16_t wlan_mlo_peer_alloc_aid(
|
|
|
uint16_t i, j;
|
|
|
struct wlan_vdev_aid_mgr *vdev_aid_mgr;
|
|
|
uint16_t first_aid = 0;
|
|
|
+ uint16_t start_aid;
|
|
|
struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
|
|
|
|
|
|
if (!mlo_mgr_ctx)
|
|
@@ -54,7 +56,8 @@ static uint16_t wlan_mlo_peer_alloc_aid(
|
|
|
/* TODO check locking strategy */
|
|
|
ml_aid_lock_acquire(mlo_mgr_ctx);
|
|
|
|
|
|
- for (i = 0; i < ml_aid_mgr->max_aid; i++) {
|
|
|
+ start_aid = ml_aid_mgr->start_aid;
|
|
|
+ for (i = start_aid; i < ml_aid_mgr->max_aid; i++) {
|
|
|
if (qdf_test_bit(i, ml_aid_mgr->aid_bitmap))
|
|
|
continue;
|
|
|
|
|
@@ -77,7 +80,7 @@ static uint16_t wlan_mlo_peer_alloc_aid(
|
|
|
}
|
|
|
} else {
|
|
|
vdev_aid_mgr = ml_aid_mgr->aid_mgr[link_ix];
|
|
|
- if (vdev_aid_mgr)
|
|
|
+ if (!vdev_aid_mgr)
|
|
|
break;
|
|
|
|
|
|
if (qdf_test_bit(i, vdev_aid_mgr->aid_bitmap))
|
|
@@ -89,7 +92,9 @@ static uint16_t wlan_mlo_peer_alloc_aid(
|
|
|
for (j = 0; j < WLAN_UMAC_MLO_MAX_VDEVS; j++) {
|
|
|
if (j == link_ix)
|
|
|
continue;
|
|
|
-
|
|
|
+ /* Check whether this bit used by other VDEV
|
|
|
+ * Non-MLO peers
|
|
|
+ */
|
|
|
vdev_aid_mgr = ml_aid_mgr->aid_mgr[j];
|
|
|
if (vdev_aid_mgr &&
|
|
|
qdf_test_bit(i, vdev_aid_mgr->aid_bitmap)) {
|
|
@@ -97,6 +102,9 @@ static uint16_t wlan_mlo_peer_alloc_aid(
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
+ /* Assoc ID is used by other link, return this aid
|
|
|
+ * to caller
|
|
|
+ */
|
|
|
if (assoc_id == i + 1) {
|
|
|
vdev_aid_mgr = ml_aid_mgr->aid_mgr[link_ix];
|
|
|
qdf_set_bit(i, vdev_aid_mgr->aid_bitmap);
|
|
@@ -108,10 +116,13 @@ static uint16_t wlan_mlo_peer_alloc_aid(
|
|
|
|
|
|
if ((!is_mlo_peer) && first_aid) {
|
|
|
vdev_aid_mgr = ml_aid_mgr->aid_mgr[link_ix];
|
|
|
- qdf_set_bit(first_aid, vdev_aid_mgr->aid_bitmap);
|
|
|
+ qdf_set_bit(first_aid - 1, vdev_aid_mgr->aid_bitmap);
|
|
|
assoc_id = first_aid;
|
|
|
}
|
|
|
|
|
|
+ if ((assoc_id == (uint16_t)-1) && (i == ml_aid_mgr->max_aid))
|
|
|
+ mlo_err("MLO aid allocation failed (reached max)");
|
|
|
+
|
|
|
ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
|
|
|
return assoc_id;
|
|
@@ -123,6 +134,7 @@ static uint16_t wlan_mlme_peer_alloc_aid(
|
|
|
{
|
|
|
uint16_t assoc_id = (uint16_t)-1;
|
|
|
uint16_t i;
|
|
|
+ uint16_t start_aid;
|
|
|
struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
|
|
|
|
|
|
if (!mlo_mgr_ctx)
|
|
@@ -131,20 +143,108 @@ static uint16_t wlan_mlme_peer_alloc_aid(
|
|
|
if (!no_lock)
|
|
|
ml_aid_lock_acquire(mlo_mgr_ctx);
|
|
|
|
|
|
- for (i = 0; i < vdev_aid_mgr->max_aid; i++) {
|
|
|
+ start_aid = vdev_aid_mgr->start_aid;
|
|
|
+ for (i = start_aid; i < vdev_aid_mgr->max_aid; i++) {
|
|
|
if (qdf_test_bit(i, vdev_aid_mgr->aid_bitmap))
|
|
|
continue;
|
|
|
|
|
|
assoc_id = i + 1;
|
|
|
qdf_set_bit(i, vdev_aid_mgr->aid_bitmap);
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
if (!no_lock)
|
|
|
ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
|
|
|
+ if (i == vdev_aid_mgr->max_aid)
|
|
|
+ return (uint16_t)-1;
|
|
|
+
|
|
|
return assoc_id;
|
|
|
}
|
|
|
|
|
|
+static QDF_STATUS wlan_mlo_peer_set_aid(
|
|
|
+ struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
|
|
|
+ bool is_mlo_peer,
|
|
|
+ uint8_t link_ix,
|
|
|
+ uint16_t assoc_id)
|
|
|
+{
|
|
|
+ uint16_t j;
|
|
|
+ struct wlan_vdev_aid_mgr *vdev_aid_mgr;
|
|
|
+ struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
|
|
|
+
|
|
|
+ if (!mlo_mgr_ctx)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ if (!is_mlo_peer && link_ix == 0xff)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ /* TODO check locking strategy */
|
|
|
+ ml_aid_lock_acquire(mlo_mgr_ctx);
|
|
|
+
|
|
|
+ if (qdf_test_bit(WLAN_AID(assoc_id) - 1, ml_aid_mgr->aid_bitmap)) {
|
|
|
+ ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (is_mlo_peer) {
|
|
|
+ for (j = 0; j < WLAN_UMAC_MLO_MAX_VDEVS; j++) {
|
|
|
+ vdev_aid_mgr = ml_aid_mgr->aid_mgr[j];
|
|
|
+ if (vdev_aid_mgr &&
|
|
|
+ qdf_test_bit(WLAN_AID(assoc_id) - 1,
|
|
|
+ vdev_aid_mgr->aid_bitmap)) {
|
|
|
+ ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+ /* AID is free */
|
|
|
+ if (j == WLAN_UMAC_MLO_MAX_VDEVS - 1)
|
|
|
+ mlo_peer_set_aid_bit(ml_aid_mgr,
|
|
|
+ WLAN_AID(assoc_id) - 1);
|
|
|
+ }
|
|
|
+ qdf_set_bit(WLAN_AID(assoc_id) - 1, ml_aid_mgr->aid_bitmap);
|
|
|
+ } else {
|
|
|
+ vdev_aid_mgr = ml_aid_mgr->aid_mgr[link_ix];
|
|
|
+ if (!vdev_aid_mgr) {
|
|
|
+ ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (qdf_test_bit(WLAN_AID(assoc_id) - 1,
|
|
|
+ vdev_aid_mgr->aid_bitmap)) {
|
|
|
+ ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ qdf_set_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap);
|
|
|
+ }
|
|
|
+
|
|
|
+ ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+static QDF_STATUS wlan_mlme_peer_set_aid(
|
|
|
+ struct wlan_vdev_aid_mgr *vdev_aid_mgr,
|
|
|
+ bool no_lock, uint16_t assoc_id)
|
|
|
+{
|
|
|
+ struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
|
|
|
+ QDF_STATUS status = QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ if (!mlo_mgr_ctx)
|
|
|
+ return status;
|
|
|
+
|
|
|
+ if (!no_lock)
|
|
|
+ ml_aid_lock_acquire(mlo_mgr_ctx);
|
|
|
+
|
|
|
+ if (!qdf_test_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap)) {
|
|
|
+ qdf_set_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap);
|
|
|
+ status = QDF_STATUS_SUCCESS;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!no_lock)
|
|
|
+ ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
+
|
|
|
+ return status;
|
|
|
+}
|
|
|
+
|
|
|
QDF_STATUS wlan_mlo_peer_free_aid(
|
|
|
struct wlan_ml_vdev_aid_mgr *ml_aid_mgr,
|
|
|
uint8_t link_ix,
|
|
@@ -160,7 +260,7 @@ QDF_STATUS wlan_mlo_peer_free_aid(
|
|
|
|
|
|
/* TODO check locking strategy */
|
|
|
ml_aid_lock_acquire(mlo_mgr_ctx);
|
|
|
- assoc_id_ix = assoc_id - 1;
|
|
|
+ assoc_id_ix = WLAN_AID(assoc_id) - 1;
|
|
|
if (qdf_test_bit(assoc_id_ix, ml_aid_mgr->aid_bitmap)) {
|
|
|
qdf_clear_bit(assoc_id_ix, ml_aid_mgr->aid_bitmap);
|
|
|
for (j = 0; j < WLAN_UMAC_MLO_MAX_VDEVS; j++) {
|
|
@@ -183,6 +283,26 @@ QDF_STATUS wlan_mlo_peer_free_aid(
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
+static int wlan_mlme_peer_aid_is_set(struct wlan_vdev_aid_mgr *vdev_aid_mgr,
|
|
|
+ bool no_lock, uint16_t assoc_id)
|
|
|
+{
|
|
|
+ struct mlo_mgr_context *mlo_mgr_ctx = wlan_objmgr_get_mlo_ctx();
|
|
|
+ int isset = 0;
|
|
|
+
|
|
|
+ if (!mlo_mgr_ctx)
|
|
|
+ return isset;
|
|
|
+
|
|
|
+ if (!no_lock)
|
|
|
+ ml_aid_lock_acquire(mlo_mgr_ctx);
|
|
|
+
|
|
|
+ isset = qdf_test_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap);
|
|
|
+
|
|
|
+ if (!no_lock)
|
|
|
+ ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
+
|
|
|
+ return isset;
|
|
|
+}
|
|
|
+
|
|
|
void wlan_mlme_peer_free_aid(
|
|
|
struct wlan_vdev_aid_mgr *vdev_aid_mgr,
|
|
|
bool no_lock, uint16_t assoc_id)
|
|
@@ -195,12 +315,30 @@ void wlan_mlme_peer_free_aid(
|
|
|
if (!no_lock)
|
|
|
ml_aid_lock_acquire(mlo_mgr_ctx);
|
|
|
|
|
|
- qdf_clear_bit(assoc_id - 1, vdev_aid_mgr->aid_bitmap);
|
|
|
+ qdf_clear_bit(WLAN_AID(assoc_id) - 1, vdev_aid_mgr->aid_bitmap);
|
|
|
|
|
|
if (!no_lock)
|
|
|
ml_aid_lock_release(mlo_mgr_ctx);
|
|
|
}
|
|
|
|
|
|
+uint16_t wlan_mlme_get_aid_count(struct wlan_objmgr_vdev *vdev)
|
|
|
+{
|
|
|
+ uint16_t i;
|
|
|
+ uint16_t aid_count = 0;
|
|
|
+ struct wlan_vdev_aid_mgr *vdev_aid_mgr;
|
|
|
+
|
|
|
+ vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
|
|
|
+ if (!vdev_aid_mgr)
|
|
|
+ return (uint16_t)-1;
|
|
|
+
|
|
|
+ for (i = 0; i < vdev_aid_mgr->max_aid; i++) {
|
|
|
+ if (qdf_test_bit(i, vdev_aid_mgr->aid_bitmap))
|
|
|
+ aid_count++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return aid_count;
|
|
|
+}
|
|
|
+
|
|
|
QDF_STATUS mlo_peer_allocate_aid(
|
|
|
struct wlan_mlo_dev_context *ml_dev,
|
|
|
struct wlan_mlo_peer_context *ml_peer)
|
|
@@ -268,17 +406,71 @@ QDF_STATUS mlo_free_aid(struct wlan_objmgr_vdev *vdev, uint16_t assoc_id)
|
|
|
{
|
|
|
struct wlan_mlo_dev_context *ml_dev;
|
|
|
struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
|
|
|
+ struct wlan_mlo_ap *ap_ctx;
|
|
|
|
|
|
ml_dev = vdev->mlo_dev_ctx;
|
|
|
|
|
|
if (!ml_dev)
|
|
|
return QDF_STATUS_E_INVAL;
|
|
|
|
|
|
- ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
|
|
|
+ ap_ctx = ml_dev->ap_ctx;
|
|
|
+ if (!ap_ctx)
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+
|
|
|
+ ml_aid_mgr = ap_ctx->ml_aid_mgr;
|
|
|
if (!ml_aid_mgr)
|
|
|
return QDF_STATUS_E_INVAL;
|
|
|
|
|
|
- return wlan_mlo_peer_free_aid(ml_aid_mgr, true, assoc_id);
|
|
|
+ return wlan_mlo_peer_free_aid(ml_aid_mgr, 0xff, assoc_id);
|
|
|
+}
|
|
|
+
|
|
|
+static QDF_STATUS mlo_peer_set_aid(struct wlan_mlo_dev_context *ml_dev,
|
|
|
+ uint16_t assoc_id)
|
|
|
+{
|
|
|
+ struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
|
|
|
+ QDF_STATUS status;
|
|
|
+ struct wlan_mlo_ap *ap_ctx;
|
|
|
+
|
|
|
+ ap_ctx = ml_dev->ap_ctx;
|
|
|
+ if (!ap_ctx)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ ml_aid_mgr = ap_ctx->ml_aid_mgr;
|
|
|
+ if (!ml_aid_mgr)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ status = wlan_mlo_peer_set_aid(ml_aid_mgr, true, 0xff, assoc_id);
|
|
|
+
|
|
|
+ return status;
|
|
|
+}
|
|
|
+
|
|
|
+QDF_STATUS mlo_set_aid(struct wlan_objmgr_vdev *vdev, uint16_t assoc_id)
|
|
|
+{
|
|
|
+ struct wlan_mlo_dev_context *ml_dev;
|
|
|
+
|
|
|
+ ml_dev = vdev->mlo_dev_ctx;
|
|
|
+
|
|
|
+ if (!ml_dev)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ return mlo_peer_set_aid(ml_dev, assoc_id);
|
|
|
+}
|
|
|
+
|
|
|
+int mlme_is_aid_set(struct wlan_objmgr_vdev *vdev, uint16_t assoc_id)
|
|
|
+{
|
|
|
+ struct wlan_vdev_aid_mgr *vdev_aid_mgr;
|
|
|
+ bool no_lock = true;
|
|
|
+
|
|
|
+ vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
|
|
|
+ if (vdev_aid_mgr) {
|
|
|
+ if (qdf_atomic_read(&vdev_aid_mgr->ref_cnt) > 1)
|
|
|
+ no_lock = false;
|
|
|
+
|
|
|
+ return wlan_mlme_peer_aid_is_set(vdev_aid_mgr, no_lock,
|
|
|
+ assoc_id);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
uint16_t mlme_get_aid(struct wlan_objmgr_vdev *vdev)
|
|
@@ -313,6 +505,39 @@ uint16_t mlme_get_aid(struct wlan_objmgr_vdev *vdev)
|
|
|
return assoc_id;
|
|
|
}
|
|
|
|
|
|
+QDF_STATUS mlme_set_aid(struct wlan_objmgr_vdev *vdev,
|
|
|
+ uint16_t assoc_id)
|
|
|
+{
|
|
|
+ struct wlan_mlo_dev_context *ml_dev;
|
|
|
+ struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
|
|
|
+ struct wlan_vdev_aid_mgr *vdev_aid_mgr;
|
|
|
+ bool no_lock = true;
|
|
|
+ uint8_t link_id;
|
|
|
+
|
|
|
+ ml_dev = vdev->mlo_dev_ctx;
|
|
|
+
|
|
|
+ if (!ml_dev) {
|
|
|
+ vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
|
|
|
+ if (vdev_aid_mgr) {
|
|
|
+ if (qdf_atomic_read(&vdev_aid_mgr->ref_cnt) > 1)
|
|
|
+ no_lock = false;
|
|
|
+
|
|
|
+ return wlan_mlme_peer_set_aid(vdev_aid_mgr, no_lock,
|
|
|
+ assoc_id);
|
|
|
+ } else {
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
|
|
|
+ if (!ml_aid_mgr)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ link_id = mlo_get_link_vdev_ix(ml_dev, vdev);
|
|
|
+
|
|
|
+ return wlan_mlo_peer_set_aid(ml_aid_mgr, false, link_id, assoc_id);
|
|
|
+}
|
|
|
+
|
|
|
void mlme_free_aid(struct wlan_objmgr_vdev *vdev, uint16_t assoc_id)
|
|
|
{
|
|
|
struct wlan_mlo_dev_context *ml_dev;
|
|
@@ -344,6 +569,54 @@ void mlme_free_aid(struct wlan_objmgr_vdev *vdev, uint16_t assoc_id)
|
|
|
wlan_mlo_peer_free_aid(ml_aid_mgr, link_id, assoc_id);
|
|
|
}
|
|
|
|
|
|
+void wlan_vdev_mlme_aid_mgr_max_aid_set(struct wlan_objmgr_vdev *vdev,
|
|
|
+ uint16_t max_aid)
|
|
|
+{
|
|
|
+ struct wlan_vdev_aid_mgr *aid_mgr;
|
|
|
+
|
|
|
+ aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
|
|
|
+ if (!aid_mgr)
|
|
|
+ return;
|
|
|
+
|
|
|
+ aid_mgr->max_aid = max_aid;
|
|
|
+}
|
|
|
+
|
|
|
+QDF_STATUS wlan_vdev_mlme_set_start_aid(struct wlan_objmgr_vdev *vdev,
|
|
|
+ uint16_t start_aid)
|
|
|
+{
|
|
|
+ struct wlan_vdev_aid_mgr *vdev_aid_mgr;
|
|
|
+ struct wlan_ml_vdev_aid_mgr *ml_aid_mgr;
|
|
|
+ struct wlan_mlo_dev_context *ml_dev;
|
|
|
+ uint16_t j, max_aid_start = 0;
|
|
|
+
|
|
|
+ vdev_aid_mgr = wlan_vdev_mlme_get_aid_mgr(vdev);
|
|
|
+ if (!vdev_aid_mgr)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ vdev_aid_mgr->start_aid = start_aid;
|
|
|
+
|
|
|
+ ml_dev = vdev->mlo_dev_ctx;
|
|
|
+ if (ml_dev) {
|
|
|
+ ml_aid_mgr = ml_dev->ap_ctx->ml_aid_mgr;
|
|
|
+ if (!ml_aid_mgr)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ /* Derive higher start_aid */
|
|
|
+ for (j = 0; j < WLAN_UMAC_MLO_MAX_VDEVS; j++) {
|
|
|
+ vdev_aid_mgr = ml_aid_mgr->aid_mgr[j];
|
|
|
+ if (!vdev_aid_mgr)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (max_aid_start < vdev_aid_mgr->start_aid)
|
|
|
+ max_aid_start = vdev_aid_mgr->start_aid;
|
|
|
+ }
|
|
|
+
|
|
|
+ ml_aid_mgr->start_aid = max_aid_start;
|
|
|
+ }
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
struct wlan_vdev_aid_mgr *wlan_vdev_aid_mgr_init(uint16_t max_aid)
|
|
|
{
|
|
|
struct wlan_vdev_aid_mgr *aid_mgr;
|
|
@@ -352,6 +625,7 @@ struct wlan_vdev_aid_mgr *wlan_vdev_aid_mgr_init(uint16_t max_aid)
|
|
|
if (!aid_mgr)
|
|
|
return NULL;
|
|
|
|
|
|
+ aid_mgr->start_aid = 0;
|
|
|
aid_mgr->max_aid = max_aid;
|
|
|
qdf_atomic_init(&aid_mgr->ref_cnt);
|
|
|
/* Take reference before returning */
|
|
@@ -482,6 +756,7 @@ QDF_STATUS wlan_mlo_vdev_aid_mgr_init(struct wlan_mlo_dev_context *ml_dev)
|
|
|
return QDF_STATUS_E_NOMEM;
|
|
|
}
|
|
|
|
|
|
+ ml_aidmgr->start_aid = 0;
|
|
|
ml_aidmgr->max_aid = max_aid;
|
|
|
ml_dev->ap_ctx->ml_aid_mgr = ml_aidmgr;
|
|
|
|