lantiq: atm: Use a tasklet to handle incoming packets. Fix #12917.

Incoming packets are now processes in a tasklet instead of in the
irq handler; this should improve latency.

This patch is based on a previous version of ltq-atm driver, which
did implement a tasklet.

It has been tested on a arv4518pw with a
Lantiq Danube for about a month and it seems to work well.

Signed-off-by: Luca Dariz <luca.dariz@gmail.com>
Tested-by: Luca Dariz <luca.dariz@gmail.com>

SVN-Revision: 36902
This commit is contained in:
John Crispin 2013-06-10 08:25:17 +00:00
parent 76c79f50d7
commit e40f830383

View file

@ -199,6 +199,8 @@ static inline void mailbox_oam_rx_handler(void);
static inline void mailbox_aal_rx_handler(void); static inline void mailbox_aal_rx_handler(void);
static irqreturn_t mailbox_irq_handler(int, void *); static irqreturn_t mailbox_irq_handler(int, void *);
static inline void mailbox_signal(unsigned int, int); static inline void mailbox_signal(unsigned int, int);
static void do_ppe_tasklet(unsigned long);
DECLARE_TASKLET(g_dma_tasklet, do_ppe_tasklet, 0);
/* /*
* QSB & HTU setting functions * QSB & HTU setting functions
@ -491,6 +493,9 @@ static void ppe_close(struct atm_vcc *vcc)
break; break;
} }
/* wait for incoming packets to be processed by upper layers */
tasklet_unlock_wait(&g_dma_tasklet);
PPE_CLOSE_EXIT: PPE_CLOSE_EXIT:
return; return;
} }
@ -1039,14 +1044,25 @@ static inline void mailbox_aal_rx_handler(void)
} }
} }
static void do_ppe_tasklet(unsigned long data)
{
*MBOX_IGU1_ISRC = *MBOX_IGU1_ISR;
mailbox_oam_rx_handler();
mailbox_aal_rx_handler();
if ((*MBOX_IGU1_ISR & ((1 << RX_DMA_CH_AAL) | (1 << RX_DMA_CH_OAM))) != 0)
tasklet_schedule(&g_dma_tasklet);
else
enable_irq(PPE_MAILBOX_IGU1_INT);
}
static irqreturn_t mailbox_irq_handler(int irq, void *dev_id) static irqreturn_t mailbox_irq_handler(int irq, void *dev_id)
{ {
if ( !*MBOX_IGU1_ISR ) if ( !*MBOX_IGU1_ISR )
return IRQ_HANDLED; return IRQ_HANDLED;
*MBOX_IGU1_ISRC = *MBOX_IGU1_ISR; disable_irq_nosync(PPE_MAILBOX_IGU1_INT);
mailbox_oam_rx_handler(); tasklet_schedule(&g_dma_tasklet);
mailbox_aal_rx_handler();
return IRQ_HANDLED; return IRQ_HANDLED;
} }