void HAL_ETH_IRQHandler()

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) */
        }