@@ -325,6 +325,7 @@ void EMAC0_IRQHandler(void)
325
325
uint32_t interrupt ,dma_status_reg , mac_status_reg ;
326
326
int status ;
327
327
uint32_t dma_addr ;
328
+ uint32_t dma_ie = DmaIntEnable ;
328
329
329
330
// Check GMAC interrupt
330
331
mac_status_reg = synopGMACReadReg ((u32 * )gmacdev -> MacBase , GmacInterruptStatus );
@@ -401,6 +402,7 @@ void EMAC0_IRQHandler(void)
401
402
if (interrupt & synopGMACDmaRxNormal ) {
402
403
//NU_RAW_Debug(("rx\n"));
403
404
NU_RAW_Debug (("%s:: Rx Normal \r\n" , __FUNCTION__ ));
405
+ dma_ie &= ~DmaIntRxNormMask ; // disable RX interrupt
404
406
// to handle received data
405
407
if (nu_eth_txrx_cb != NULL ) {
406
408
nu_eth_txrx_cb ('R' , nu_userData );
@@ -409,16 +411,17 @@ void EMAC0_IRQHandler(void)
409
411
410
412
if (interrupt & synopGMACDmaRxAbnormal ) {
411
413
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
415
418
}
416
419
}
417
420
418
421
if (interrupt & synopGMACDmaRxStopped ) {
419
422
mbed_error_printf ("%s::Receiver stopped seeing Rx interrupts \r\n" ,__FUNCTION__ ); //Receiver gone in to stopped state
420
423
if (gmacdev -> GMAC_Power_down == 0 ) { // If Mac is not in powerdown
421
- gmacdev -> synopGMACNetStats .rx_over_errors ++ ;
424
+ gmacdev -> synopGMACNetStats .rx_over_errors ++ ;
422
425
synopGMAC_enable_dma_rx (gmacdev );
423
426
}
424
427
}
@@ -450,13 +453,13 @@ void EMAC0_IRQHandler(void)
450
453
synopGMAC_take_desc_ownership_tx (gmacdev );
451
454
452
455
synopGMAC_enable_dma_tx (gmacdev );
453
- mbed_error_printf ("%s::Transmission Resumed\n" ,__FUNCTION__ );
456
+ mbed_error_printf ("%s::Transmission Resumed\n" , __FUNCTION__ );
454
457
}
455
458
}
456
459
457
460
/* Enable the interrupt before returning from ISR*/
458
461
// 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 );
460
463
// }
461
464
return ;
462
465
}
@@ -515,7 +518,10 @@ int numaker_eth_get_rx_buf(uint16_t *len, uint8_t **buf)
515
518
// synopGMAC_disable_dma_rx(gmacdev); // it will encounter DMA interrupt status as "Receiver stopped seeing Rx interrupts"
516
519
* len = synop_handle_received_data (NU_M460_INTF , buf );
517
520
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
+ }
519
525
520
526
// length of payload should be <= 1514
521
527
if (* len > (NU_ETH_MAX_FLEN - 4 )) {
0 commit comments