@@ -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