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:
parent
76c79f50d7
commit
e40f830383
1 changed files with 19 additions and 3 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue