wctc4xxp: Service tx ring in interrupt handler.
This helps to keep the tx descriptor ring at max capacity when the system is otherwise loaded. Now ready packets are moved from cmd_list to the transmit descriptor ring directly in the interrupt handler and not when the deferred function runs. Signed-off-by: Shaun Ruffell <sruffell@digium.com> Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
This commit is contained in:
parent
dc92bf05cd
commit
e10f740476
@ -2600,8 +2600,8 @@ static void service_tx_ring(struct wcdte *wc)
|
|||||||
{
|
{
|
||||||
struct tcb *cmd;
|
struct tcb *cmd;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
spin_lock_irqsave(&wc->cmd_list_lock, flags);
|
||||||
while ((cmd = wctc4xxp_retrieve(wc->txd))) {
|
while ((cmd = wctc4xxp_retrieve(wc->txd))) {
|
||||||
spin_lock_irqsave(&wc->cmd_list_lock, flags);
|
|
||||||
cmd->flags |= TX_COMPLETE;
|
cmd->flags |= TX_COMPLETE;
|
||||||
if (!(cmd->flags & (WAIT_FOR_ACK | WAIT_FOR_RESPONSE))) {
|
if (!(cmd->flags & (WAIT_FOR_ACK | WAIT_FOR_RESPONSE))) {
|
||||||
/* If we're not waiting for an ACK or Response from
|
/* If we're not waiting for an ACK or Response from
|
||||||
@ -2628,8 +2628,8 @@ static void service_tx_ring(struct wcdte *wc)
|
|||||||
}
|
}
|
||||||
wctc4xxp_submit(wc->txd, cmd);
|
wctc4xxp_submit(wc->txd, cmd);
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
|
|
||||||
}
|
}
|
||||||
|
spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void service_rx_ring(struct wcdte *wc)
|
static void service_rx_ring(struct wcdte *wc)
|
||||||
@ -2675,13 +2675,13 @@ static void deferred_work_func(struct work_struct *work)
|
|||||||
{
|
{
|
||||||
struct wcdte *wc = container_of(work, struct wcdte, deferred_work);
|
struct wcdte *wc = container_of(work, struct wcdte, deferred_work);
|
||||||
#endif
|
#endif
|
||||||
service_tx_ring(wc);
|
|
||||||
service_rx_ring(wc);
|
service_rx_ring(wc);
|
||||||
}
|
}
|
||||||
|
|
||||||
DAHDI_IRQ_HANDLER(wctc4xxp_interrupt)
|
DAHDI_IRQ_HANDLER(wctc4xxp_interrupt)
|
||||||
{
|
{
|
||||||
struct wcdte *wc = dev_id;
|
struct wcdte *wc = dev_id;
|
||||||
|
bool packets_to_process = false;
|
||||||
u32 ints;
|
u32 ints;
|
||||||
#define NORMAL_INTERRUPT_SUMMARY (1<<16)
|
#define NORMAL_INTERRUPT_SUMMARY (1<<16)
|
||||||
#define ABNORMAL_INTERRUPT_SUMMARY (1<<15)
|
#define ABNORMAL_INTERRUPT_SUMMARY (1<<15)
|
||||||
@ -2703,11 +2703,14 @@ DAHDI_IRQ_HANDLER(wctc4xxp_interrupt)
|
|||||||
|
|
||||||
if (likely(ints & NORMAL_INTERRUPTS)) {
|
if (likely(ints & NORMAL_INTERRUPTS)) {
|
||||||
|
|
||||||
if (ints & (RX_COMPLETE_INTERRUPT | TIMER_INTERRUPT))
|
if (ints & (RX_COMPLETE_INTERRUPT | TIMER_INTERRUPT)) {
|
||||||
wctc4xxp_handle_receive_ring(wc);
|
packets_to_process = !wctc4xxp_handle_receive_ring(wc);
|
||||||
|
service_tx_ring(wc);
|
||||||
|
}
|
||||||
|
|
||||||
#if DEFERRED_PROCESSING == WORKQUEUE
|
#if DEFERRED_PROCESSING == WORKQUEUE
|
||||||
schedule_work(&wc->deferred_work);
|
if (packets_to_process)
|
||||||
|
schedule_work(&wc->deferred_work);
|
||||||
#elif DEFERRED_PROCESSING == INTERRUPT
|
#elif DEFERRED_PROCESSING == INTERRUPT
|
||||||
#error "You will need to change the locks if you want to run the processing " \
|
#error "You will need to change the locks if you want to run the processing " \
|
||||||
"in the interrupt handler."
|
"in the interrupt handler."
|
||||||
|
Loading…
Reference in New Issue
Block a user