mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
Merge branch 'fix/sdio_slave_reset_infloop_leak' into 'master'
sdio_slave: fix the send_flush infinite loop issue See merge request idf/esp-idf!5365
This commit is contained in:
commit
3ff01d60a4
@ -360,19 +360,39 @@ static inline bool sdio_ringbuf_empty(sdio_ringbuf_t* buf)
|
|||||||
}
|
}
|
||||||
/**************** End of Ring buffer for SDIO *****************/
|
/**************** End of Ring buffer for SDIO *****************/
|
||||||
|
|
||||||
static inline void show_ll(buf_desc_t *item)
|
static inline void show_queue_item(buf_desc_t *item)
|
||||||
{
|
{
|
||||||
ESP_EARLY_LOGD(TAG, "=> %p: size: %d(%d), eof: %d, owner: %d", item, item->size, item->length, item->eof, item->owner);
|
ESP_EARLY_LOGI(TAG, "=> %p: size: %d(%d), eof: %d, owner: %d", item, item->size, item->length, item->eof, item->owner);
|
||||||
ESP_EARLY_LOGD(TAG, " buf: %p, stqe_next: %p, tqe-prev: %p", item->buf, item->qe.stqe_next, item->te.tqe_prev);
|
ESP_EARLY_LOGI(TAG, " buf: %p, stqe_next: %p, tqe-prev: %p", item->buf, item->qe.stqe_next, item->te.tqe_prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __attribute((unused)) dump_ll(buf_stailq_t *queue)
|
static void __attribute((unused)) dump_queue(buf_stailq_t *queue)
|
||||||
{
|
{
|
||||||
|
int cnt = 0;
|
||||||
buf_desc_t *item = NULL;
|
buf_desc_t *item = NULL;
|
||||||
ESP_EARLY_LOGD(TAG, ">>>>> first: %p, last: %p <<<<<", queue->stqh_first, queue->stqh_last);
|
ESP_EARLY_LOGI(TAG, ">>>>> first: %p, last: %p <<<<<", queue->stqh_first, queue->stqh_last);
|
||||||
STAILQ_FOREACH(item, queue, qe) {
|
STAILQ_FOREACH(item, queue, qe) {
|
||||||
show_ll(item);
|
cnt++;
|
||||||
|
show_queue_item(item);
|
||||||
}
|
}
|
||||||
|
ESP_EARLY_LOGI(TAG, "total: %d", cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void show_ll(lldesc_t *item)
|
||||||
|
{
|
||||||
|
ESP_EARLY_LOGI(TAG, "=> %p: size: %d(%d), eof: %d, owner: %d", item, item->size, item->length, item->eof, item->owner);
|
||||||
|
ESP_EARLY_LOGI(TAG, " buf: %p, stqe_next: %p", item->buf, item->qe.stqe_next);
|
||||||
|
}
|
||||||
|
static void __attribute((unused)) dump_ll(lldesc_t *queue)
|
||||||
|
{
|
||||||
|
int cnt = 0;
|
||||||
|
lldesc_t *item = queue;
|
||||||
|
while (item != NULL) {
|
||||||
|
cnt++;
|
||||||
|
show_ll(item);
|
||||||
|
item = STAILQ_NEXT(item, qe);
|
||||||
|
}
|
||||||
|
ESP_EARLY_LOGI(TAG, "total: %d", cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void deinit_context()
|
static inline void deinit_context()
|
||||||
@ -964,7 +984,7 @@ static esp_err_t send_flush_data()
|
|||||||
buf_desc_t *last = NULL;
|
buf_desc_t *last = NULL;
|
||||||
if (context.in_flight) {
|
if (context.in_flight) {
|
||||||
buf_desc_t *desc = context.in_flight;
|
buf_desc_t *desc = context.in_flight;
|
||||||
while(desc != NULL) {
|
while (desc != NULL) {
|
||||||
xQueueSend(context.ret_queue, &desc->arg, portMAX_DELAY);
|
xQueueSend(context.ret_queue, &desc->arg, portMAX_DELAY);
|
||||||
last = desc;
|
last = desc;
|
||||||
desc = STAILQ_NEXT(desc, qe);
|
desc = STAILQ_NEXT(desc, qe);
|
||||||
@ -975,13 +995,14 @@ static esp_err_t send_flush_data()
|
|||||||
context.in_flight_end = NULL;
|
context.in_flight_end = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf_desc_t *head;
|
buf_desc_t *head, *tail;
|
||||||
esp_err_t ret = sdio_ringbuf_recv(&context.sendbuf, (uint8_t**)&head, NULL, RINGBUF_GET_ALL, 0);
|
esp_err_t ret = sdio_ringbuf_recv(&context.sendbuf, (uint8_t**)&head, (uint8_t**)&tail, RINGBUF_GET_ALL, 0);
|
||||||
if (ret == ESP_OK) {
|
if (ret == ESP_OK) {
|
||||||
buf_desc_t *desc = head;
|
buf_desc_t *desc = head;
|
||||||
while(desc != NULL) {
|
while (1) {
|
||||||
xQueueSend(context.ret_queue, &desc->arg, portMAX_DELAY);
|
xQueueSend(context.ret_queue, &desc->arg, portMAX_DELAY);
|
||||||
last = desc;
|
last = desc;
|
||||||
|
if (desc == tail) break;
|
||||||
desc = STAILQ_NEXT(desc, qe);
|
desc = STAILQ_NEXT(desc, qe);
|
||||||
}
|
}
|
||||||
sdio_ringbuf_return(&context.sendbuf, (uint8_t*)head);
|
sdio_ringbuf_return(&context.sendbuf, (uint8_t*)head);
|
||||||
@ -1162,6 +1183,7 @@ esp_err_t sdio_slave_recv_load_buf(sdio_slave_buf_handle_t handle)
|
|||||||
buf_stailq_t *const queue = &context.recv_link_list;
|
buf_stailq_t *const queue = &context.recv_link_list;
|
||||||
|
|
||||||
critical_enter_recv();
|
critical_enter_recv();
|
||||||
|
assert(desc->not_receiving);
|
||||||
TAILQ_REMOVE(&context.recv_reg_list, desc, te);
|
TAILQ_REMOVE(&context.recv_reg_list, desc, te);
|
||||||
desc->owner = 1;
|
desc->owner = 1;
|
||||||
desc->not_receiving = 0; //manually remove the prev link (by set not_receiving=0), to indicate this is in the queue
|
desc->not_receiving = 0; //manually remove the prev link (by set not_receiving=0), to indicate this is in the queue
|
||||||
@ -1253,3 +1275,9 @@ uint8_t* sdio_slave_recv_get_buf(sdio_slave_buf_handle_t handle, size_t *len_o)
|
|||||||
if (len_o!= NULL) *len_o= desc->length;
|
if (len_o!= NULL) *len_o= desc->length;
|
||||||
return desc->buf;
|
return desc->buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __attribute((unused)) sdio_slave_recv_get_loaded_buffer_num()
|
||||||
|
{
|
||||||
|
buf_stailq_t *const queue = &context.recv_link_list;
|
||||||
|
dump_queue(queue);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user