Messages in this thread | | | Date | Tue, 15 Feb 2000 20:23:15 -0800 (PST) | From | Linux Lists <> | Subject | dev->tx_timeout not being called in 2.3.4[345] |
| |
Hello,
After changing the Cyclades-PC300 driver in order to be softnet-compliant, everything works fine, except for the timeout function.
In order to simulate the timeout, I configure the board to external clock and don't provide any external clock. In the previous (non-softnet) driver, I get the timeout warning, however in the new one, the dev->tx_timeout is never called!!
Below there are some excerpts of the PC300 driver src code related to the timeout call:
void cpc_tx_timeout(struct net_device *dev) { <variable initialization>
stats->tx_errors++; stats->tx_aborted_errors++; printk("%s: transmit timed out, restarting channel.\n", dev->name); CPC_LOCK(card, flags); tx_dma_stop(card, ch); if (d->tx_skb) { dev_kfree_skb(d->tx_skb); d->tx_skb = NULL; } dev->trans_start = jiffies; netif_wake_queue(dev); CPC_UNLOCK(card, flags); }
int cpc_queue_xmit(struct sk_buff *skb, struct net_device *dev) { <variable initialization>
/* Write buffer to DMA buffers */ if(dma_buf_write(card, ch, (ucchar *)skb->data, skb->len) != 0) { netif_wake_queue(dev); stats->tx_dropped++; return 1; }
d->tx_skb = skb; dev->trans_start = jiffies;
/* Start transmission */ CPC_LOCK(card, flags); tx_dma_start(card, ch); CPC_UNLOCK(card, flags);
return 0; }
static void cpc_intr(int irq, void *dev_id, struct pt_regs *regs) { <variable initialization>
<reality check (is this my interrupt, etc.)>
while ((status = cpc_readl(scabase + ISR0)) != 0) { for (ch = 0 ; ch < card->hw.nchan ; ch++) { <variable initialization>
/**** Transmission ****/ if (status & (IR0_DTX(IR0_DMIA, ch)| IR0_DTX(IR0_DMIB, ch))) { ucchar dtx_stat = cpc_readb(scabase + DSR_TX(ch));
/* Clear TX interrupts */ cpc_writeb(scabase + DSR_TX(ch), dtx_stat | DSR_DWE);
if (status & IR0_DTX(IR0_DMIA, ch)) { if (dtx_stat & DSR_BOF) { tx_dma_stop(card, ch); } } if (status & IR0_DTX(IR0_DMIB, ch)) { if (dtx_stat & (DSR_EOM | DSR_EOT)) { if (d->tx_skb) { struct sk_buff *skb = d->tx_skb;
dev_kfree_skb_irq(skb); d->tx_skb = NULL; d->stats.tx_bytes += skb->len; d->stats.tx_packets++; netif_wake_queue(dev); } } } } } } }
In cpc_init():
dev->tx_timeout = &cpc_tx_timeout; dev->watchdog_timeo = PC300_TX_TIMEOUT;
( PC300_TX_TIMEOUT = (2*HZ) )
Would you have any hints on why the dev->tx_timeout function is not being called when it should?? If positive, I'd really appreciate it if you could let me know your suggestions.
Thanks in advance.
Regards, Ivan
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |