mirror of
https://github.com/espressif/esp-idf.git
synced 2026-09-22 13:01:16 +03:00
Merge branch 'bugfix/fixed_ble_deinit_crash_issue' into 'master'
Bugfix/fixed ble deinit crash issue Closes BLECRT-623, BLECRT-624, and BT-4481 See merge request espressif/esp-idf!52103
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
#include "btdm_lp.h"
|
||||
#include "btdm_log.h"
|
||||
#include "btdm_external.h"
|
||||
#include "btdm_mempool.h"
|
||||
|
||||
/*
|
||||
***************************************************************************************************
|
||||
@@ -95,6 +96,8 @@ bt_controller_deinit(void)
|
||||
{
|
||||
s_btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
|
||||
|
||||
btdm_mempool_deinit_all(true);
|
||||
|
||||
hci_transport_deinit();
|
||||
|
||||
#if UC_BT_CTRL_BR_EDR_IS_ENABLE
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "btdm_lp.h"
|
||||
#include "btdm_log.h"
|
||||
#include "btdm_external.h"
|
||||
#include "btdm_mempool.h"
|
||||
|
||||
/*
|
||||
***************************************************************************************************
|
||||
@@ -95,6 +96,8 @@ bt_controller_deinit(void)
|
||||
{
|
||||
s_btdm_controller_status = ESP_BT_CONTROLLER_STATUS_IDLE;
|
||||
|
||||
btdm_mempool_deinit_all(true);
|
||||
|
||||
hci_transport_deinit();
|
||||
|
||||
#if UC_BT_CTRL_BR_EDR_IS_ENABLE
|
||||
|
||||
Submodule components/bt/controller/lib_esp32h4/esp32h4-bt-lib updated: 1d421a2a04...3bf30d20a7
Submodule components/bt/controller/lib_esp32s31/esp32s31-bt-lib updated: f8b5deaeda...1b99d182e6
Submodule components/bt/host/nimble/nimble updated: 68a6539cc2...916be244a9
@@ -374,6 +374,29 @@ void os_mempool_flags_set(struct os_mempool *mp, uint8_t flags);
|
||||
*/
|
||||
void os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags);
|
||||
|
||||
/**
|
||||
* @brief Deinitialize a memory pool.
|
||||
*
|
||||
* @param mp Pointer to memory pool
|
||||
*/
|
||||
void os_mempool_deinit(struct os_mempool *mp);
|
||||
|
||||
/**
|
||||
* @brief Deinitialize all of memory pools.
|
||||
*
|
||||
* @param is_controller Whether called from controller.
|
||||
*
|
||||
* @return OS_OK on success; OS_INVALID_PARM if not found corresponding memory pools.
|
||||
*/
|
||||
os_error_t os_mempool_deinit_all(bool is_controller);
|
||||
|
||||
/**
|
||||
* @brief Check if there are any live memory pools.
|
||||
*
|
||||
* @return true if there are any live memory pools; false otherwise.
|
||||
*/
|
||||
bool os_mempool_has_live_pool(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -735,6 +735,11 @@ os_mempool_module_init(void)
|
||||
static os_error_t
|
||||
os_mempool_mem_free(struct os_mempool *mp)
|
||||
{
|
||||
/* Extended mempool has its own free logic */
|
||||
if (mp->mp_flags & OS_MEMPOOL_F_EXT) {
|
||||
return OS_OK;
|
||||
}
|
||||
|
||||
/* For runtime allocation mode, check whether all blocks have been freed */
|
||||
if (!(mp->mp_flags & OS_MEMPOOL_F_RUNTIME)) {
|
||||
return OS_EINVAL;
|
||||
@@ -767,8 +772,15 @@ os_mempool_mem_free(struct os_mempool *mp)
|
||||
#endif
|
||||
|
||||
void
|
||||
os_mempool_deinit(bool is_controller)
|
||||
os_mempool_deinit(struct os_mempool *mp)
|
||||
{
|
||||
os_mempool_unregister(mp);
|
||||
}
|
||||
|
||||
os_error_t
|
||||
os_mempool_deinit_all(bool is_controller)
|
||||
{
|
||||
os_error_t err = OS_INVALID_PARM;
|
||||
struct os_mempool *mp = NULL;
|
||||
struct os_mempool *next = NULL;
|
||||
|
||||
@@ -780,8 +792,17 @@ os_mempool_deinit(bool is_controller)
|
||||
next = STAILQ_NEXT(mp, mp_list);
|
||||
os_mempool_unregister(mp);
|
||||
mp = next;
|
||||
err = OS_OK;
|
||||
} else {
|
||||
mp = STAILQ_NEXT(mp, mp_list);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
bool
|
||||
os_mempool_has_live_pool(void)
|
||||
{
|
||||
return !STAILQ_EMPTY(&g_os_mempool_list);
|
||||
}
|
||||
|
||||
@@ -28,7 +28,8 @@ config BT_CTRL_TASK_STACK_SIZE
|
||||
This configures stack size of NimBLE controller task
|
||||
|
||||
config BT_CTRL_ALLOW_MALLOC_FROM_SPIRAM
|
||||
bool "Allow allocating BT memory from SPIRAM"
|
||||
depends on SOC_SPIRAM_SUPPORTED
|
||||
bool "Allow allocating controller memory from SPIRAM (EXPERIMENTAL)"
|
||||
default n
|
||||
help
|
||||
Allocate part of memory from SPIRAM. Need to enable CONFIG_SPIRAM first.
|
||||
|
||||
@@ -355,6 +355,22 @@ void os_mempool_flags_set(struct os_mempool *mp, uint8_t flags);
|
||||
*/
|
||||
void os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags);
|
||||
|
||||
/**
|
||||
* @brief Deinitialize a memory pool.
|
||||
*
|
||||
* @param mp Pointer to memory pool
|
||||
*/
|
||||
void os_mempool_deinit(struct os_mempool *mp);
|
||||
|
||||
/**
|
||||
* @brief Deinitialize all of memory pools.
|
||||
*
|
||||
* @param is_controller Whether called from controller.
|
||||
*
|
||||
* @return OS_OK on success; OS_INVALID_PARM if not found corresponding memory pools.
|
||||
*/
|
||||
os_error_t os_mempool_deinit_all(bool is_controller);
|
||||
|
||||
#else /* !CONFIG_BT_DUAL_MODE_ARCH */
|
||||
#include "btdm_mempool.h"
|
||||
|
||||
@@ -446,6 +462,18 @@ os_mempool_flags_clear(struct os_mempool *mp, uint8_t flags)
|
||||
btdm_mempool_flags_clear((struct btdm_mempool *)mp, flags);
|
||||
}
|
||||
|
||||
static inline void
|
||||
os_mempool_deinit(struct os_mempool *mp)
|
||||
{
|
||||
btdm_mempool_deinit((struct btdm_mempool *)mp);
|
||||
}
|
||||
|
||||
static inline os_error_t
|
||||
os_mempool_deinit_all(bool is_controller)
|
||||
{
|
||||
return (os_error_t)btdm_mempool_deinit_all(is_controller);
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_BT_DUAL_MODE_ARCH */
|
||||
|
||||
|
||||
|
||||
@@ -330,12 +330,30 @@ void e_btdm_mempool_module_init(void);
|
||||
#define btdm_mempool_module_init BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_module_init)
|
||||
|
||||
/**
|
||||
* Deinitialize the memory pool module.
|
||||
* Deinitialize a memory pool.
|
||||
*
|
||||
* @param mp Pointer to memory pool
|
||||
*/
|
||||
void e_btdm_mempool_deinit(struct btdm_mempool *mp);
|
||||
#define btdm_mempool_deinit BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_deinit)
|
||||
|
||||
/**
|
||||
* Deinitialize all of memory pools.
|
||||
*
|
||||
* @param is_controller Whether called from controller.
|
||||
*
|
||||
* @return BTDM_OSAL_OK on success; BTDM_OSAL_INVALID_PARM if not found corresponding memory pools.
|
||||
*/
|
||||
void e_btdm_mempool_deinit(bool is_controller);
|
||||
#define btdm_mempool_deinit BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_deinit)
|
||||
btdm_osal_error_t e_btdm_mempool_deinit_all(bool is_controller);
|
||||
#define btdm_mempool_deinit_all BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_deinit_all)
|
||||
|
||||
/**
|
||||
* Check if there are any live memory pools.
|
||||
*
|
||||
* @return true if there are any live memory pools; false otherwise.
|
||||
*/
|
||||
bool e_btdm_mempool_has_live_pool(void);
|
||||
#define btdm_mempool_has_live_pool BTDM_MEMPOOL_EXT_FUNC(btdm_mempool_has_live_pool)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
@@ -18,6 +18,11 @@ static STAILQ_HEAD(, btdm_mempool) s_btdm_osal_mempool_list = STAILQ_HEAD_INITIA
|
||||
static btdm_osal_error_t
|
||||
e_btdm_mempool_mem_free(struct btdm_mempool *mp)
|
||||
{
|
||||
/* Extended mempool has its own free logic */
|
||||
if (mp->mp_flags & BTDM_MEMPOOL_F_EXT) {
|
||||
return BTDM_OSAL_OK;
|
||||
}
|
||||
|
||||
/* For runtime allocation mode, check whether all blocks have been freed */
|
||||
if (!(mp->mp_flags & BTDM_MEMPOOL_F_RUNTIME)) {
|
||||
return BTDM_OSAL_EINVAL;
|
||||
@@ -588,8 +593,15 @@ e_btdm_mempool_module_init(void)
|
||||
}
|
||||
|
||||
void
|
||||
e_btdm_mempool_deinit(bool is_controller)
|
||||
e_btdm_mempool_deinit(struct btdm_mempool *mp)
|
||||
{
|
||||
btdm_mempool_unregister(mp);
|
||||
}
|
||||
|
||||
btdm_osal_error_t
|
||||
e_btdm_mempool_deinit_all(bool is_controller)
|
||||
{
|
||||
btdm_osal_error_t err = BTDM_OSAL_INVALID_PARM;
|
||||
struct btdm_mempool *mp = NULL;
|
||||
struct btdm_mempool *next = NULL;
|
||||
|
||||
@@ -601,8 +613,17 @@ e_btdm_mempool_deinit(bool is_controller)
|
||||
next = STAILQ_NEXT(mp, mp_list);
|
||||
btdm_mempool_unregister(mp);
|
||||
mp = next;
|
||||
err = BTDM_OSAL_OK;
|
||||
} else {
|
||||
mp = STAILQ_NEXT(mp, mp_list);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
bool
|
||||
e_btdm_mempool_has_live_pool(void)
|
||||
{
|
||||
return !STAILQ_EMPTY(&s_btdm_osal_mempool_list);
|
||||
}
|
||||
|
||||
@@ -1174,6 +1174,7 @@ btdm_osal_elem_mempool_init(btdm_osal_elem_num_t *elem_num)
|
||||
if (rc) {
|
||||
return -2;
|
||||
}
|
||||
btdm_mempool_flags_set(&s_btdm_osal_ev_pool, BTDM_MEMPOOL_F_CONTROLLER);
|
||||
}
|
||||
|
||||
if (elem_num->co_count) {
|
||||
@@ -1190,6 +1191,7 @@ btdm_osal_elem_mempool_init(btdm_osal_elem_num_t *elem_num)
|
||||
if (rc) {
|
||||
return -4;
|
||||
}
|
||||
btdm_mempool_flags_set(&s_btdm_osal_co_pool, BTDM_MEMPOOL_F_CONTROLLER);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1200,12 +1202,15 @@ btdm_osal_elem_mempool_deinit(void)
|
||||
{
|
||||
if (s_btdm_osal_ev_buf) {
|
||||
BTDM_OSAL_ASSERT(s_btdm_osal_ev_pool.mp_num_free == s_btdm_osal_ev_pool.mp_num_blocks);
|
||||
btdm_mempool_deinit(&s_btdm_osal_ev_pool);
|
||||
btdm_osal_free(s_btdm_osal_ev_buf);
|
||||
s_btdm_osal_ev_buf = NULL;
|
||||
}
|
||||
|
||||
|
||||
if (s_btdm_osal_co_buf) {
|
||||
BTDM_OSAL_ASSERT(s_btdm_osal_co_pool.mp_num_free == s_btdm_osal_co_pool.mp_num_blocks);
|
||||
btdm_mempool_deinit(&s_btdm_osal_co_pool);
|
||||
btdm_osal_free(s_btdm_osal_co_buf);
|
||||
s_btdm_osal_co_buf = NULL;
|
||||
}
|
||||
|
||||
@@ -102,6 +102,7 @@ hci_driver_util_memory_init(void)
|
||||
ESP_LOGE(TAG, "Failed to initialize tx pool");
|
||||
goto init_err;
|
||||
}
|
||||
btdm_mempool_flags_set(s_hci_driver_util_env.tx_entry_pool, BTDM_MEMPOOL_F_CONTROLLER);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user