in portable/NetworkInterface/STM32Hxx/stm32hxx_hal_eth.c [1551:1768]
void HAL_ETH_IRQHandler( ETH_HandleTypeDef * heth )
{
/* ETH interrupt. See heth->DMACSR for details.
*/
if( __HAL_ETH_DMA_GET_IT( heth, ETH_DMACSR_RI ) )
{
if( __HAL_ETH_DMA_GET_IT_SOURCE( heth, ETH_DMACIER_RIE ) )
{
#if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )
{
/*Call registered Receive complete callback*/
heth->RxCpltCallback( heth );
}
#else
{
/* Receive complete callback */
HAL_ETH_RxCpltCallback( heth );
}
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
/* Clear the Eth DMA Rx IT pending bits */
__HAL_ETH_DMA_CLEAR_IT( heth, ETH_DMACSR_RI | ETH_DMACSR_NIS );
}
}
/* Packet transmitted */
if( __HAL_ETH_DMA_GET_IT( heth, ETH_DMACSR_TI ) )
{
if( __HAL_ETH_DMA_GET_IT_SOURCE( heth, ETH_DMACIER_TIE ) )
{
#if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )
{
/*Call registered Transmit complete callback*/
heth->TxCpltCallback( heth );
}
#else
{
/* Transfer complete callback */
HAL_ETH_TxCpltCallback( heth );
}
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
/* Clear the Eth DMA Tx IT pending bits */
__HAL_ETH_DMA_CLEAR_IT( heth, ETH_DMACSR_TI | ETH_DMACSR_NIS );
}
}
/* ETH DMA Error */
if( __HAL_ETH_DMA_GET_IT( heth, ETH_DMACSR_AIS ) )
{
if( __HAL_ETH_DMA_GET_IT_SOURCE( heth, ETH_DMACIER_AIE ) )
{
heth->ErrorCode |= HAL_ETH_ERROR_DMA;
/* if fatal bus error occured */
if( __HAL_ETH_DMA_GET_IT( heth, ETH_DMACSR_FBE ) )
{
/* Get DMA error code */
heth->DMAErrorCode = READ_BIT( heth->Instance->DMACSR, ( ETH_DMACSR_FBE | ETH_DMACSR_TPS | ETH_DMACSR_RPS ) );
/* Disable all interrupts */
__HAL_ETH_DMA_DISABLE_IT( heth, ETH_DMACIER_NIE | ETH_DMACIER_AIE );
/* Set HAL state to ERROR */
set_error_state( heth, HAL_ETH_STATE_ERROR );
}
else
{
/* Get DMA error status */
heth->DMAErrorCode = READ_BIT( heth->Instance->DMACSR, ( ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT |
ETH_DMACSR_RBU | ETH_DMACSR_AIS ) );
/* Clear the interrupt summary flag */
__HAL_ETH_DMA_CLEAR_IT( heth, ( ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT |
ETH_DMACSR_RBU | ETH_DMACSR_AIS ) );
}
#if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )
{
/* Call registered DMA Error callback*/
heth->DMAErrorCallback( heth );
}
#else
{
/* Ethernet DMA Error callback */
HAL_ETH_DMAErrorCallback( heth );
}
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
}
}
/* ETH MAC Error IT */
if( __HAL_ETH_MAC_GET_IT( heth, ( ETH_MACIER_RXSTSIE | ETH_MACIER_TXSTSIE ) ) )
{
/* Get MAC Rx Tx status and clear Status register pending bit */
heth->MACErrorCode = READ_REG( heth->Instance->MACRXTXSR );
set_error_state( heth, HAL_ETH_STATE_ERROR );
#if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )
{
/* Call registered MAC Error callback*/
heth->DMAErrorCallback( heth );
}
#else
{
/* Ethernet MAC Error callback */
HAL_ETH_MACErrorCallback( heth );
}
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
heth->MACErrorCode = ( uint32_t ) ( 0x0U );
}
/* ETH PMT IT */
if( __HAL_ETH_MAC_GET_IT( heth, ETH_MAC_PMT_IT ) )
{
/* Get MAC Wake-up source and clear the status register pending bit */
heth->MACWakeUpEvent = READ_BIT( heth->Instance->MACPCSR, ( ETH_MACPCSR_RWKPRCVD | ETH_MACPCSR_MGKPRCVD ) );
#if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )
{
/* Call registered PMT callback*/
heth->PMTCallback( heth );
}
#else
{
/* Ethernet PMT callback */
HAL_ETH_PMTCallback( heth );
}
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
heth->MACWakeUpEvent = ( uint32_t ) ( 0x0U );
}
/* ETH EEE IT */
if( __HAL_ETH_MAC_GET_IT( heth, ETH_MAC_LPI_IT ) )
{
/* Get MAC LPI interrupt source and clear the status register pending bit */
heth->MACLPIEvent = READ_BIT( heth->Instance->MACPCSR, 0x0000000FU );
#if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )
{
/* Call registered EEE callback*/
heth->EEECallback( heth );
}
#else
{
/* Ethernet EEE callback */
HAL_ETH_EEECallback( heth );
}
#endif /* USE_HAL_ETH_REGISTER_CALLBACKS */
heth->MACLPIEvent = ( uint32_t ) ( 0x0U );
}
#if defined( DUAL_CORE )
if( HAL_GetCurrentCPUID() == CM7_CPUID )
{
/* check ETH WAKEUP exti flag */
if( __HAL_ETH_WAKEUP_EXTI_GET_FLAG( ETH_WAKEUP_EXTI_LINE ) != ( uint32_t ) RESET )
{
/* Clear ETH WAKEUP Exti pending bit */
__HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG( ETH_WAKEUP_EXTI_LINE );
#if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )
{
/* Call registered WakeUp callback*/
heth->WakeUpCallback( heth );
}
#else
{
/* ETH WAKEUP callback */
HAL_ETH_WakeUpCallback( heth );
}
#endif
}
}
else
{
/* check ETH WAKEUP exti flag */
if( __HAL_ETH_WAKEUP_EXTID2_GET_FLAG( ETH_WAKEUP_EXTI_LINE ) != ( uint32_t ) RESET )
{
/* Clear ETH WAKEUP Exti pending bit */
__HAL_ETH_WAKEUP_EXTID2_CLEAR_FLAG( ETH_WAKEUP_EXTI_LINE );
#if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )
{
/* Call registered WakeUp callback*/
heth->WakeUpCallback( heth );
}
#else
{
/* ETH WAKEUP callback */
HAL_ETH_WakeUpCallback( heth );
}
#endif
}
}
#else /* #if defined(DUAL_CORE) */
/* check ETH WAKEUP exti flag */
if( __HAL_ETH_WAKEUP_EXTI_GET_FLAG( ETH_WAKEUP_EXTI_LINE ) != ( uint32_t ) RESET )
{
/* Clear ETH WAKEUP Exti pending bit */
__HAL_ETH_WAKEUP_EXTI_CLEAR_FLAG( ETH_WAKEUP_EXTI_LINE );
#if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )
{
/* Call registered WakeUp callback*/
heth->WakeUpCallback( heth );
}
#else
{
/* ETH WAKEUP callback */
HAL_ETH_WakeUpCallback( heth );
}
#endif
}
#endif /* #if defined(DUAL_CORE) */
}