mirror of
https://github.com/espressif/esp-idf
synced 2025-03-10 01:29:21 -04:00
fix(usb/host): Decode error flags in ISOC transfers
This commit is contained in:
parent
a2434a844c
commit
02fdd5f60e
@ -2456,13 +2456,28 @@ static inline void _buffer_parse_isoc(dma_buffer_block_t *buffer, bool is_in)
|
|||||||
int desc_status;
|
int desc_status;
|
||||||
usb_dwc_hal_xfer_desc_parse(buffer->xfer_desc_list, desc_idx, &rem_len, &desc_status);
|
usb_dwc_hal_xfer_desc_parse(buffer->xfer_desc_list, desc_idx, &rem_len, &desc_status);
|
||||||
usb_dwc_hal_xfer_desc_clear(buffer->xfer_desc_list, desc_idx);
|
usb_dwc_hal_xfer_desc_clear(buffer->xfer_desc_list, desc_idx);
|
||||||
assert(rem_len == 0 || is_in);
|
switch (desc_status) {
|
||||||
assert(desc_status == USB_DWC_HAL_XFER_DESC_STS_SUCCESS || desc_status == USB_DWC_HAL_XFER_DESC_STS_NOT_EXECUTED);
|
case USB_DWC_HAL_XFER_DESC_STS_SUCCESS:
|
||||||
|
transfer->isoc_packet_desc[pkt_idx].status = USB_TRANSFER_STATUS_COMPLETED;
|
||||||
|
break;
|
||||||
|
case USB_DWC_HAL_XFER_DESC_STS_NOT_EXECUTED:
|
||||||
|
transfer->isoc_packet_desc[pkt_idx].status = USB_TRANSFER_STATUS_SKIPPED;
|
||||||
|
break;
|
||||||
|
case USB_DWC_HAL_XFER_DESC_STS_PKTERR:
|
||||||
|
transfer->isoc_packet_desc[pkt_idx].status = USB_TRANSFER_STATUS_ERROR;
|
||||||
|
break;
|
||||||
|
case USB_DWC_HAL_XFER_DESC_STS_BUFFER_ERR:
|
||||||
|
transfer->isoc_packet_desc[pkt_idx].status = USB_TRANSFER_STATUS_ERROR;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(false);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
assert(rem_len <= transfer->isoc_packet_desc[pkt_idx].num_bytes); // Check for DMA errata
|
assert(rem_len <= transfer->isoc_packet_desc[pkt_idx].num_bytes); // Check for DMA errata
|
||||||
// Update ISO packet actual length and status
|
// Update ISO packet actual length and status
|
||||||
transfer->isoc_packet_desc[pkt_idx].actual_num_bytes = transfer->isoc_packet_desc[pkt_idx].num_bytes - rem_len;
|
transfer->isoc_packet_desc[pkt_idx].actual_num_bytes = transfer->isoc_packet_desc[pkt_idx].num_bytes - rem_len;
|
||||||
total_actual_num_bytes += transfer->isoc_packet_desc[pkt_idx].actual_num_bytes;
|
total_actual_num_bytes += transfer->isoc_packet_desc[pkt_idx].actual_num_bytes;
|
||||||
transfer->isoc_packet_desc[pkt_idx].status = (desc_status == USB_DWC_HAL_XFER_DESC_STS_NOT_EXECUTED) ? USB_TRANSFER_STATUS_SKIPPED : USB_TRANSFER_STATUS_COMPLETED;
|
|
||||||
// A descriptor is also allocated for unscheduled frames. We need to skip over them
|
// A descriptor is also allocated for unscheduled frames. We need to skip over them
|
||||||
desc_idx += buffer->flags.isoc.interval;
|
desc_idx += buffer->flags.isoc.interval;
|
||||||
if (desc_idx >= XFER_LIST_LEN_INTR) {
|
if (desc_idx >= XFER_LIST_LEN_INTR) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user