Extended Advertising Start Issue with PAwR Scanner Role

Hi.

Environment : nrf52833, ncs v3.1.1

I am developing device that has PAwR Scanner Role and Extended Advertising for connecting Mobile Phone(nRF Connect APP).

PAwR is Fine. However when connect/disconnect several Times, bt_le_ext_adv_start return -12.

under code is prj.conf

## USER Config
CONFIG_DTM_INCLUDE=y
CONFIG_USER_LOG_ENABLE=n


# LOG
CONFIG_LOG=y
CONFIG_RTT_CONSOLE=y
CONFIG_USE_SEGGER_RTT=y
CONFIG_LOG_DEFAULT_LEVEL=0
CONFIG_UART_CONSOLE=n
CONFIG_CBPRINTF_FP_SUPPORT=y
CONFIG_LOG_MODE_IMMEDIATE=y

CONFIG_LOG_TIMESTAMP_64BIT=y

## DEBUG
CONFIG_ASSERT=y
CONFIG_RESET_ON_FATAL_ERROR=n

CONFIG_DEBUG_THREAD_INFO=y
CONFIG_DEBUG_OPTIMIZATIONS=y



## WATCH DOG
CONFIG_WATCHDOG=y

CONFIG_REBOOT=y

## Power Management
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y


##FLASH
CONFIG_FLASH=y
CONFIG_SOC_FLASH_NRF_UICR=y
CONFIG_MPU_ALLOW_FLASH_WRITE=y


## UART
CONFIG_SERIAL=y
CONFIG_UART_ASYNC_API=y
CONFIG_UART_USE_RUNTIME_CONFIGURE=y
CONFIG_UART_CONSOLE=n

## AES
CONFIG_NRF_SECURITY=y
CONFIG_MBEDTLS_PSA_CRYPTO_C=y
CONFIG_MBEDTLS_PSA_STATIC_KEY_SLOTS=y
CONFIG_MBEDTLS_PSA_STATIC_KEY_SLOT_BUFFER_SIZE=32
CONFIG_PSA_WANT_GENERATE_RANDOM=y
CONFIG_PSA_WANT_KEY_TYPE_AES=y
CONFIG_PSA_WANT_ALG_CBC_PKCS7=y
CONFIG_PSA_WANT_ALG_CCM=y


## BLE
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_BUF_ACL_RX_SIZE=519
CONFIG_BT_BUF_ACL_TX_SIZE=519
CONFIG_BT_L2CAP_TX_MTU=512

CONFIG_BT_HCI_ERR_TO_STR=y
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
CONFIG_BT_RX_STACK_SIZE=4096

CONFIG_BT_ID_MAX=3
CONFIG_BT_MAX_CONN=7
CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT=7


CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n
CONFIG_BT_USER_DATA_LEN_UPDATE=y
CONFIG_BT_CTLR_TX_PWR_DYNAMIC_CONTROL=y

## PAWR
CONFIG_BT_OBSERVER=y
CONFIG_BT_BROADCASTER=y
CONFIG_BT_EXT_ADV=y
CONFIG_BT_EXT_ADV_MAX_ADV_SET=5
CONFIG_BT_PER_ADV_SYNC=y

CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER=y
CONFIG_BT_PER_ADV_SYNC_TRANSFER_RECEIVER=y

CONFIG_BT_PER_ADV_SYNC_RSP=y
CONFIG_BT_PER_ADV_SYNC_BUF_SIZE=255
CONFIG_BT_CTLR_ADV_DATA_LEN_MAX=255




# #### BLE DTM START
# #Configure assertions
CONFIG_ASSERT=y
CONFIG_ASSERT_NO_COND_INFO=y
CONFIG_ASSERT_NO_MSG_INFO=y
CONFIG_HW_STACK_PROTECTION=y

# # Use necessary peripherals
CONFIG_NRFX_TIMER0=y
CONFIG_NRFX_TIMER1=y
CONFIG_NRFX_TIMER2=y
CONFIG_CLOCK_CONTROL=y

CONFIG_FEM_AL_LIB=y

when increase  CONFIG_BT_CTLR_SDC_PERIPHERAL_COUNT and Max_Conn, can more connect. but is is not solution.

I use create one ext adv. and reuse it.
I try restart extended advertising on recycled callback. and it execute that delayed after 3 seconds. delay execute function use k_work_schedule.
I checked Log about conn Ref Count. Count is normally increase and reduce when connected and disconnected
could you advice any solution?
start code is below
static void advStartRaw()
{
    if (deviceInfo.advState)
        return;

    advParam.interval_min = deviceInfo.advInterval;
    advParam.interval_max = deviceInfo.advInterval + 32; // + 20ms

    int err = bt_le_ext_adv_set_data(extAdv, advData, ARRAY_SIZE(advData),
                                     NULL, 0);
    if (err)
    {
        LOG_INF("bt_le_ext_adv_set_data Fail %d", err);
        return;
    }

    err = bt_le_ext_adv_update_param(extAdv, &advParam);
    if (err)
    {
        LOG_INF("bt_le_ext_adv_update_param Fail %d", err);
        return;
    }

    err = bt_le_ext_adv_start(extAdv, &extraStartAdvParam);
    if (err)
    {
        LOG_INF("bt_le_ext_adv_start Fail %d", err);
        return;
    }

    deviceInfo.advState = true;
    LOG_INF("ADV Start");    
}
stop is below
static int advStopRaw()
{
    if (!deviceInfo.advState)
        return -1;

    int err = bt_le_ext_adv_stop(extAdv);
    if (err)
    {
        LOG_INF("BT ADV Stop Fail Code %d", err);
        return err;
    }

    deviceInfo.advState = false;
    LOG_INF("ADV Stop");
    return 0;
}
onConnected is Below
static void onConnected(struct bt_conn *conn, uint8_t err)
{
    if (err)
    {
        LOG_INF("Connection Error %d", err);
        return;
    }

    advStopRaw();
    connHandle = bt_conn_ref(conn);
    connectedState = true;
    deviceInfo.advState = false;
    mtuSize = (int)bt_gatt_get_mtu(conn);
    LOG_INF("Connected. Set MTU Size : %d", mtuSize);
	bt_conn_le_param_update(conn, &updateConnParam); 
}
onDisconnected
static void onDisconnected(struct bt_conn *conn, uint8_t reason)
{  
    bt_conn_unref(conn);
    connectedState = false;
    connHandle = NULL;
    //LOG_INF("Disconnected. Reason 0x%02X", reason);     
    // 0x19 Remote Term Conn
    // 0x22 Local Term Conn
    LOG_INF("Disconnected. Reason 0x%02x %s\n",reason, bt_hci_err_to_str(reason));
}
Related