void emacps_error_handler(void *arg,u8 Direction, u32 ErrorWord) { struct xemac_s *xemac; xemacpsif_s *xemacpsif; struct xtopology_t *xtopologyp; XEmacPs *xemacps; XEmacPs_BdRing *rxring; XEmacPs_BdRing *txring; xemac = (struct xemac_s *)(arg); xemacpsif = (xemacpsif_s *)(xemac->state); rxring = &XEmacPs_GetRxRing(&xemacpsif->emacps); txring = &XEmacPs_GetRxRing(&xemacpsif->emacps); xtopologyp = &xtopology[xemac->topology_index]; xemacps = &xemacpsif->emacps; if (ErrorWord != 0) { switch (Direction) { case XEMACPS_RECV: if (ErrorWord & XEMACPS_RXSR_HRESPNOK_MASK) { LWIP_DEBUGF(NETIF_DEBUG, ("Receive DMA error\r\n")); HandleEmacPsError(xemac); } if (ErrorWord & XEMACPS_RXSR_RXOVR_MASK) { LWIP_DEBUGF(NETIF_DEBUG, ("Receive over run\r\n")); emacps_recv_handler(arg); setup_rx_bds(rxring); } if (ErrorWord & XEMACPS_RXSR_BUFFNA_MASK) { LWIP_DEBUGF(NETIF_DEBUG, ("Receive buffer not available\r\n")); emacps_recv_handler(arg); setup_rx_bds(rxring); } break; case XEMACPS_SEND: if (ErrorWord & XEMACPS_TXSR_HRESPNOK_MASK) { LWIP_DEBUGF(NETIF_DEBUG, ("Transmit DMA error\r\n")); HandleEmacPsError(xemac); } if (ErrorWord & XEMACPS_TXSR_URUN_MASK) { LWIP_DEBUGF(NETIF_DEBUG, ("Transmit under run\r\n")); HandleTxErrors(xemac); } if (ErrorWord & XEMACPS_TXSR_BUFEXH_MASK) { LWIP_DEBUGF(NETIF_DEBUG, ("Transmit buffer exhausted\r\n")); HandleTxErrors(xemac); } if (ErrorWord & XEMACPS_TXSR_RXOVR_MASK) { LWIP_DEBUGF(NETIF_DEBUG, ("Transmit retry excessed limits\r\n")); HandleTxErrors(xemac); } if (ErrorWord & XEMACPS_TXSR_FRAMERX_MASK) { LWIP_DEBUGF(NETIF_DEBUG, ("Transmit collision\r\n")); process_sent_bds(txring); } break; } } }
static void emacps_handle_error(void *arg, u8 Direction, u32 ErrorWord) { xemacpsif_s *xemacpsif; struct xtopology_t *xtopologyp; XEmacPs *xemacps; xemacpsif = (xemacpsif_s *)(arg); xtopologyp = &xXTopology; xemacps = &xemacpsif->emacps; /* Do not appear to be used. */ ( void ) xemacps; ( void ) xtopologyp; last_err_msg = NULL; if( ErrorWord != 0 ) { switch (Direction) { case XEMACPS_RECV: if( ( ErrorWord & XEMACPS_RXSR_HRESPNOK_MASK ) != 0 ) { last_err_msg = "Receive DMA error"; xNetworkInterfaceInitialise( ); } if( ( ErrorWord & XEMACPS_RXSR_RXOVR_MASK ) != 0 ) { last_err_msg = "Receive over run"; emacps_recv_handler(arg); emacps_set_rx_buffers( xemacpsif, 0 ); } if( ( ErrorWord & XEMACPS_RXSR_BUFFNA_MASK ) != 0 ) { last_err_msg = "Receive buffer not available"; emacps_recv_handler(arg); emacps_set_rx_buffers( xemacpsif, 0 ); } break; case XEMACPS_SEND: if( ( ErrorWord & XEMACPS_TXSR_HRESPNOK_MASK ) != 0 ) { last_err_msg = "Transmit DMA error"; xNetworkInterfaceInitialise( ); } if( ( ErrorWord & XEMACPS_TXSR_URUN_MASK ) != 0 ) { last_err_msg = "Transmit under run"; HandleTxErrors( xemacpsif ); } if( ( ErrorWord & XEMACPS_TXSR_BUFEXH_MASK ) != 0 ) { last_err_msg = "Transmit buffer exhausted"; HandleTxErrors( xemacpsif ); } if( ( ErrorWord & XEMACPS_TXSR_RXOVR_MASK ) != 0 ) { last_err_msg = "Transmit retry excessed limits"; HandleTxErrors( xemacpsif ); } if( ( ErrorWord & XEMACPS_TXSR_FRAMERX_MASK ) != 0 ) { last_err_msg = "Transmit collision"; emacps_check_tx( xemacpsif ); } break; } } // Break on this statement and inspect error_msg if you like if( last_err_msg != NULL ) { error_msg_count++; FreeRTOS_printf( ( "emacps_handle_error: %s\n", last_err_msg ) ); } }