Skip to content

Commit 5837179

Browse files
committed
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 <[email protected]>
1 parent 13f43cc commit 5837179

File tree

1 file changed

+13
-7
lines changed
  • connectivity/drivers/emac/TARGET_NUVOTON_EMAC/TARGET_M460

1 file changed

+13
-7
lines changed

connectivity/drivers/emac/TARGET_NUVOTON_EMAC/TARGET_M460/m460_eth.c

+13-7
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ void EMAC0_IRQHandler(void)
325325
uint32_t interrupt,dma_status_reg, mac_status_reg;
326326
int status;
327327
uint32_t dma_addr;
328+
uint32_t dma_ie = DmaIntEnable;
328329

329330
// Check GMAC interrupt
330331
mac_status_reg = synopGMACReadReg((u32 *)gmacdev->MacBase, GmacInterruptStatus);
@@ -401,6 +402,7 @@ void EMAC0_IRQHandler(void)
401402
if(interrupt & synopGMACDmaRxNormal) {
402403
//NU_RAW_Debug(("rx\n"));
403404
NU_RAW_Debug(("%s:: Rx Normal \r\n", __FUNCTION__));
405+
dma_ie &= ~DmaIntRxNormMask; // disable RX interrupt
404406
// to handle received data
405407
if (nu_eth_txrx_cb != NULL) {
406408
nu_eth_txrx_cb('R', nu_userData);
@@ -409,16 +411,17 @@ void EMAC0_IRQHandler(void)
409411

410412
if(interrupt & synopGMACDmaRxAbnormal) {
411413
mbed_error_printf("%s::Abnormal Rx Interrupt Seen \r\n",__FUNCTION__);
412-
gmacdev->synopGMACNetStats.rx_over_errors++;
413-
if(gmacdev->GMAC_Power_down == 0) { // If Mac is not in powerdown
414-
synopGMAC_resume_dma_rx(gmacdev);//To handle GBPS with 12 descriptors
414+
if(gmacdev->GMAC_Power_down == 0) { // If Mac is not in powerdown
415+
gmacdev->synopGMACNetStats.rx_over_errors++;
416+
dma_ie &= ~DmaIntRxAbnMask;
417+
synopGMAC_resume_dma_rx(gmacdev); //To handle GBPS with 12 descriptors
415418
}
416419
}
417420

418421
if(interrupt & synopGMACDmaRxStopped) {
419422
mbed_error_printf("%s::Receiver stopped seeing Rx interrupts \r\n",__FUNCTION__); //Receiver gone in to stopped state
420423
if(gmacdev->GMAC_Power_down == 0) { // If Mac is not in powerdown
421-
gmacdev->synopGMACNetStats.rx_over_errors++;
424+
gmacdev->synopGMACNetStats.rx_over_errors++;
422425
synopGMAC_enable_dma_rx(gmacdev);
423426
}
424427
}
@@ -450,13 +453,13 @@ void EMAC0_IRQHandler(void)
450453
synopGMAC_take_desc_ownership_tx(gmacdev);
451454

452455
synopGMAC_enable_dma_tx(gmacdev);
453-
mbed_error_printf("%s::Transmission Resumed\n",__FUNCTION__);
456+
mbed_error_printf("%s::Transmission Resumed\n", __FUNCTION__);
454457
}
455458
}
456459

457460
/* Enable the interrupt before returning from ISR*/
458461
// if( !(interrupt & synopGMACDmaRxNormal)) { /* RxNormal will enable INT in numaker_eth_trigger_rx */
459-
synopGMAC_enable_interrupt(gmacdev,DmaIntEnable);
462+
synopGMAC_enable_interrupt(gmacdev, dma_ie);
460463
// }
461464
return;
462465
}
@@ -515,7 +518,10 @@ int numaker_eth_get_rx_buf(uint16_t *len, uint8_t **buf)
515518
// synopGMAC_disable_dma_rx(gmacdev); // it will encounter DMA interrupt status as "Receiver stopped seeing Rx interrupts"
516519
*len = synop_handle_received_data(NU_M460_INTF, buf);
517520
dump_desc(gmacdev->RxBusyDesc);
518-
if( *len <= 0 ) return -1; /* No available RX frame */
521+
if( *len <= 0 ) {
522+
synopGMAC_enable_interrupt(gmacdev, DmaIntEnable);
523+
return -1; /* No available RX frame */
524+
}
519525

520526
// length of payload should be <= 1514
521527
if (*len > (NU_ETH_MAX_FLEN - 4)) {

0 commit comments

Comments
 (0)