wctc4xxp: Make sure csm_encaps commands are sent before RTP.

Otherwise, if there are many RTP commands queued on the command list, some of
the CSM_ENCAP packets, like ACKS, weren't being sent to the firmware within the
timeout value.

Signed-off-by: Shaun Ruffell <sruffell@digium.com>
Signed-off-by: Russ Meyerriecks <rmeyerriecks@digium.com>
This commit is contained in:
Shaun Ruffell 2014-05-09 09:46:26 -05:00 committed by Russ Meyerriecks
parent 67e422c1ef
commit 0efce00a09

View File

@ -1548,6 +1548,12 @@ static void wctc4xxp_cleanup_command_list(struct wcdte *wc)
}
}
static inline bool is_rtp_packet(const struct tcb *cmd)
{
const struct ethhdr *ethhdr = cmd->data;
return (cpu_to_be16(ETH_P_IP) == ethhdr->h_proto);
}
static void
wctc4xxp_transmit_cmd(struct wcdte *wc, struct tcb *cmd)
{
@ -1591,6 +1597,14 @@ wctc4xxp_transmit_cmd(struct wcdte *wc, struct tcb *cmd)
list_add_tail(&cmd->node, &wc->waiting_for_response_list);
mod_timer(&wc->watchdog, jiffies + HZ/2);
}
if (!list_empty(&wc->cmd_list)) {
if (is_rtp_packet(cmd))
list_add_tail(&cmd->node, &wc->cmd_list);
else
list_move(&cmd->node, &wc->cmd_list);
spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
return;
}
res = wctc4xxp_submit(wc->txd, cmd);
if (-EBUSY == res) {
/* Looks like we're out of room in the descriptor
@ -2482,6 +2496,7 @@ static void service_tx_ring(struct wcdte *wc)
struct tcb *cmd;
unsigned long flags;
while ((cmd = wctc4xxp_retrieve(wc->txd))) {
spin_lock_irqsave(&wc->cmd_list_lock, flags);
cmd->flags |= TX_COMPLETE;
if (!(cmd->flags & (WAIT_FOR_ACK | WAIT_FOR_RESPONSE))) {
/* If we're not waiting for an ACK or Response from
@ -2499,17 +2514,16 @@ static void service_tx_ring(struct wcdte *wc)
/* We've freed up a spot in the hardware ring buffer. If
* another packet is queued up, let's submit it to the
* hardware. */
spin_lock_irqsave(&wc->cmd_list_lock, flags);
if (!list_empty(&wc->cmd_list)) {
cmd = list_entry(wc->cmd_list.next, struct tcb, node);
list_del_init(&cmd->node);
} else {
cmd = NULL;
if (cmd->flags & (WAIT_FOR_ACK | WAIT_FOR_RESPONSE)) {
list_add_tail(&cmd->node,
&wc->waiting_for_response_list);
}
wctc4xxp_submit(wc->txd, cmd);
}
spin_unlock_irqrestore(&wc->cmd_list_lock, flags);
if (cmd)
wctc4xxp_transmit_cmd(wc, cmd);
}
}