예제 #1
0
static void
xllfifo_intr_handler(struct xemac_s *xemac)
{
	xaxiemacif_s *xaxiemacif = (xaxiemacif_s *)(xemac->state);
	XLlFifo *llfifo = &xaxiemacif->axififo;

	u32_t pending_fifo_intr = XLlFifo_IntPending(llfifo);

#ifdef OS_IS_FREERTOS
	xInsideISR++;
#endif

	while (pending_fifo_intr) {
		if (pending_fifo_intr & XLLF_INT_RC_MASK) {
			/* receive interrupt */
			XLlFifo_IntClear(llfifo, XLLF_INT_RC_MASK);
			xllfifo_recv_handler(xemac);
		} else if (pending_fifo_intr & XLLF_INT_TC_MASK) {
			/* tx intr */
			XLlFifo_IntClear(llfifo, XLLF_INT_TC_MASK);
		} else {
			XLlFifo_IntClear(llfifo, XLLF_INT_ALL_MASK &
					 ~(XLLF_INT_RC_MASK |
					   XLLF_INT_TC_MASK));
			fifo_error_handler(xaxiemacif, pending_fifo_intr);
		}
		pending_fifo_intr = XLlFifo_IntPending(llfifo);
	}

#ifdef OS_IS_FREERTOS
	xInsideISR--;
#endif

}
예제 #2
0
static void
xllfifo_intr_handler(struct xemac_s *xemac)
{
    xlltemacif_s *xlltemacif = (xlltemacif_s *)(xemac->state);
    XLlFifo *llfifo = &xlltemacif->llfifo;

    u32_t pending_fifo_intr = XLlFifo_IntPending(llfifo);

    while (pending_fifo_intr) {
        if (pending_fifo_intr & XLLF_INT_RC_MASK) {
            /* receive interrupt */
            XLlFifo_IntClear(llfifo, XLLF_INT_RC_MASK);
            xllfifo_recv_handler(xlltemacif);
        } else if (pending_fifo_intr & XLLF_INT_TC_MASK) {
            /* tx intr */
            XLlFifo_IntClear(llfifo, XLLF_INT_TC_MASK);
        } else {
            XLlFifo_IntClear(llfifo, XLLF_INT_ALL_MASK &
                             ~(XLLF_INT_RC_MASK |
                               XLLF_INT_TC_MASK));
            fifo_error_handler(xlltemacif, pending_fifo_intr);
        }
        pending_fifo_intr = XLlFifo_IntPending(llfifo);
    }
}