mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 02:37:19 +02:00
ethernet: handle early rx interrupt
This commit is contained in:
@ -515,3 +515,15 @@ IRAM_ATTR void emac_hal_rx_unavail_cb(void *arg)
|
|||||||
emac->isr_need_yield = true;
|
emac->isr_need_yield = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IRAM_ATTR void emac_hal_rx_early_cb(void *arg)
|
||||||
|
{
|
||||||
|
emac_hal_context_t *hal = (emac_hal_context_t *)arg;
|
||||||
|
emac_esp32_t *emac = __containerof(hal, emac_esp32_t, hal);
|
||||||
|
BaseType_t high_task_wakeup;
|
||||||
|
/* notify receive task */
|
||||||
|
vTaskNotifyGiveFromISR(emac->rx_task_hdl, &high_task_wakeup);
|
||||||
|
if (high_task_wakeup == pdTRUE) {
|
||||||
|
emac->isr_need_yield = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -562,70 +562,56 @@ IRAM_ATTR void emac_hal_isr(void *arg)
|
|||||||
{
|
{
|
||||||
emac_hal_context_t *hal = (emac_hal_context_t *)arg;
|
emac_hal_context_t *hal = (emac_hal_context_t *)arg;
|
||||||
typeof(hal->dma_regs->dmastatus) dma_status = hal->dma_regs->dmastatus;
|
typeof(hal->dma_regs->dmastatus) dma_status = hal->dma_regs->dmastatus;
|
||||||
|
hal->dma_regs->dmastatus.val = dma_status.val;
|
||||||
/* DMA Normal Interrupt */
|
/* DMA Normal Interrupt */
|
||||||
if (dma_status.norm_int_summ) {
|
if (dma_status.norm_int_summ) {
|
||||||
/* Transmit Interrupt */
|
/* Transmit Interrupt */
|
||||||
if (dma_status.trans_int) {
|
if (dma_status.trans_int) {
|
||||||
emac_hal_tx_complete_cb(arg);
|
emac_hal_tx_complete_cb(arg);
|
||||||
hal->dma_regs->dmastatus.trans_int = 1;
|
|
||||||
}
|
}
|
||||||
/* Transmit Buffer Unavailable */
|
/* Transmit Buffer Unavailable */
|
||||||
if (dma_status.trans_buf_unavail) {
|
if (dma_status.trans_buf_unavail) {
|
||||||
emac_hal_tx_unavail_cb(arg);
|
emac_hal_tx_unavail_cb(arg);
|
||||||
hal->dma_regs->dmastatus.trans_buf_unavail = 1;
|
|
||||||
}
|
}
|
||||||
/* Receive Interrupt */
|
/* Receive Interrupt */
|
||||||
if (dma_status.recv_int) {
|
if (dma_status.recv_int) {
|
||||||
emac_hal_rx_complete_cb(arg);
|
emac_hal_rx_complete_cb(arg);
|
||||||
hal->dma_regs->dmastatus.recv_int = 1;
|
|
||||||
}
|
}
|
||||||
/* Early Receive Interrupt */
|
/* Early Receive Interrupt */
|
||||||
if (dma_status.early_recv_int) {
|
if (dma_status.early_recv_int) {
|
||||||
emac_hal_rx_early_cb(arg);
|
emac_hal_rx_early_cb(arg);
|
||||||
hal->dma_regs->dmastatus.early_recv_int = 1;
|
|
||||||
}
|
}
|
||||||
hal->dma_regs->dmastatus.norm_int_summ = 1;
|
|
||||||
}
|
}
|
||||||
/* DMA Abnormal Interrupt */
|
/* DMA Abnormal Interrupt */
|
||||||
if (dma_status.abn_int_summ) {
|
if (dma_status.abn_int_summ) {
|
||||||
/* Transmit Process Stopped */
|
/* Transmit Process Stopped */
|
||||||
if (dma_status.trans_proc_stop) {
|
if (dma_status.trans_proc_stop) {
|
||||||
hal->dma_regs->dmastatus.trans_proc_stop = 1;
|
|
||||||
}
|
}
|
||||||
/* Transmit Jabber Timeout */
|
/* Transmit Jabber Timeout */
|
||||||
if (dma_status.trans_jabber_to) {
|
if (dma_status.trans_jabber_to) {
|
||||||
hal->dma_regs->dmastatus.trans_jabber_to = 1;
|
|
||||||
}
|
}
|
||||||
/* Receive FIFO Overflow */
|
/* Receive FIFO Overflow */
|
||||||
if (dma_status.recv_ovflow) {
|
if (dma_status.recv_ovflow) {
|
||||||
hal->dma_regs->dmastatus.recv_ovflow = 1;
|
|
||||||
}
|
}
|
||||||
/* Transmit Underflow */
|
/* Transmit Underflow */
|
||||||
if (dma_status.trans_undflow) {
|
if (dma_status.trans_undflow) {
|
||||||
hal->dma_regs->dmastatus.trans_undflow = 1;
|
|
||||||
}
|
}
|
||||||
/* Receive Buffer Unavailable */
|
/* Receive Buffer Unavailable */
|
||||||
if (dma_status.recv_buf_unavail) {
|
if (dma_status.recv_buf_unavail) {
|
||||||
emac_hal_rx_unavail_cb(arg);
|
emac_hal_rx_unavail_cb(arg);
|
||||||
hal->dma_regs->dmastatus.recv_buf_unavail = 1;
|
|
||||||
}
|
}
|
||||||
/* Receive Process Stopped */
|
/* Receive Process Stopped */
|
||||||
if (dma_status.recv_proc_stop) {
|
if (dma_status.recv_proc_stop) {
|
||||||
hal->dma_regs->dmastatus.recv_proc_stop = 1;
|
|
||||||
}
|
}
|
||||||
/* Receive Watchdog Timeout */
|
/* Receive Watchdog Timeout */
|
||||||
if (dma_status.recv_wdt_to) {
|
if (dma_status.recv_wdt_to) {
|
||||||
hal->dma_regs->dmastatus.recv_wdt_to = 1;
|
|
||||||
}
|
}
|
||||||
/* Early Transmit Interrupt */
|
/* Early Transmit Interrupt */
|
||||||
if (dma_status.early_trans_int) {
|
if (dma_status.early_trans_int) {
|
||||||
hal->dma_regs->dmastatus.early_trans_int = 1;
|
|
||||||
}
|
}
|
||||||
/* Fatal Bus Error */
|
/* Fatal Bus Error */
|
||||||
if (dma_status.fatal_bus_err_int) {
|
if (dma_status.fatal_bus_err_int) {
|
||||||
hal->dma_regs->dmastatus.fatal_bus_err_int = 1;
|
|
||||||
}
|
}
|
||||||
hal->dma_regs->dmastatus.abn_int_summ = 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user