connectivity: drivers: Update Nuvoton M467 EMAC DMA_IE ctl

In IRQ Handler, to disable some interrupt type of DMA error.
It could avoid unexpected repeated interrupt.The masked bit of
DMA_IE could be recovered in next EMAC IRQ event.

Signed-off-by: cyliang tw <cyliang@nuvoton.com>
pull/15438/head
cyliang tw 2023-07-13 16:21:38 +08:00
parent 13f43cce52
commit 5837179e78
1 changed files with 13 additions and 7 deletions

View File

@ -325,6 +325,7 @@ void EMAC0_IRQHandler(void)
uint32_t interrupt,dma_status_reg, mac_status_reg; uint32_t interrupt,dma_status_reg, mac_status_reg;
int status; int status;
uint32_t dma_addr; uint32_t dma_addr;
uint32_t dma_ie = DmaIntEnable;
// Check GMAC interrupt // Check GMAC interrupt
mac_status_reg = synopGMACReadReg((u32 *)gmacdev->MacBase, GmacInterruptStatus); mac_status_reg = synopGMACReadReg((u32 *)gmacdev->MacBase, GmacInterruptStatus);
@ -401,6 +402,7 @@ void EMAC0_IRQHandler(void)
if(interrupt & synopGMACDmaRxNormal) { if(interrupt & synopGMACDmaRxNormal) {
//NU_RAW_Debug(("rx\n")); //NU_RAW_Debug(("rx\n"));
NU_RAW_Debug(("%s:: Rx Normal \r\n", __FUNCTION__)); NU_RAW_Debug(("%s:: Rx Normal \r\n", __FUNCTION__));
dma_ie &= ~DmaIntRxNormMask; // disable RX interrupt
// to handle received data // to handle received data
if (nu_eth_txrx_cb != NULL) { if (nu_eth_txrx_cb != NULL) {
nu_eth_txrx_cb('R', nu_userData); nu_eth_txrx_cb('R', nu_userData);
@ -409,8 +411,9 @@ void EMAC0_IRQHandler(void)
if(interrupt & synopGMACDmaRxAbnormal) { if(interrupt & synopGMACDmaRxAbnormal) {
mbed_error_printf("%s::Abnormal Rx Interrupt Seen \r\n",__FUNCTION__); mbed_error_printf("%s::Abnormal Rx Interrupt Seen \r\n",__FUNCTION__);
gmacdev->synopGMACNetStats.rx_over_errors++;
if(gmacdev->GMAC_Power_down == 0) { // If Mac is not in powerdown if(gmacdev->GMAC_Power_down == 0) { // If Mac is not in powerdown
gmacdev->synopGMACNetStats.rx_over_errors++;
dma_ie &= ~DmaIntRxAbnMask;
synopGMAC_resume_dma_rx(gmacdev); //To handle GBPS with 12 descriptors synopGMAC_resume_dma_rx(gmacdev); //To handle GBPS with 12 descriptors
} }
} }
@ -456,7 +459,7 @@ void EMAC0_IRQHandler(void)
/* Enable the interrupt before returning from ISR*/ /* Enable the interrupt before returning from ISR*/
// if( !(interrupt & synopGMACDmaRxNormal)) { /* RxNormal will enable INT in numaker_eth_trigger_rx */ // if( !(interrupt & synopGMACDmaRxNormal)) { /* RxNormal will enable INT in numaker_eth_trigger_rx */
synopGMAC_enable_interrupt(gmacdev,DmaIntEnable); synopGMAC_enable_interrupt(gmacdev, dma_ie);
// } // }
return; return;
} }
@ -515,7 +518,10 @@ int numaker_eth_get_rx_buf(uint16_t *len, uint8_t **buf)
// synopGMAC_disable_dma_rx(gmacdev); // it will encounter DMA interrupt status as "Receiver stopped seeing Rx interrupts" // synopGMAC_disable_dma_rx(gmacdev); // it will encounter DMA interrupt status as "Receiver stopped seeing Rx interrupts"
*len = synop_handle_received_data(NU_M460_INTF, buf); *len = synop_handle_received_data(NU_M460_INTF, buf);
dump_desc(gmacdev->RxBusyDesc); dump_desc(gmacdev->RxBusyDesc);
if( *len <= 0 ) return -1; /* No available RX frame */ if( *len <= 0 ) {
synopGMAC_enable_interrupt(gmacdev, DmaIntEnable);
return -1; /* No available RX frame */
}
// length of payload should be <= 1514 // length of payload should be <= 1514
if (*len > (NU_ETH_MAX_FLEN - 4)) { if (*len > (NU_ETH_MAX_FLEN - 4)) {