patch-2.4.21 linux-2.4.21/drivers/net/yellowfin.c
Next file: linux-2.4.21/drivers/net/znet.c
Previous file: linux-2.4.21/drivers/net/wireless/orinoco_plx.c
Back to the patch index
Back to the overall index
- Lines: 61
- Date:
2003-06-13 07:51:35.000000000 -0700
- Orig file:
linux-2.4.20/drivers/net/yellowfin.c
- Orig date:
2002-11-28 15:53:14.000000000 -0800
diff -urN linux-2.4.20/drivers/net/yellowfin.c linux-2.4.21/drivers/net/yellowfin.c
@@ -857,6 +857,7 @@
{
struct yellowfin_private *yp = dev->priv;
unsigned entry;
+ int len = skb->len;
netif_stop_queue (dev);
@@ -872,27 +873,37 @@
int cacheline_end = ((unsigned long)skb->data + skb->len) % 32;
/* Fix GX chipset errata. */
if (cacheline_end > 24 || cacheline_end == 0)
- skb->len += 32 - cacheline_end + 1;
+ {
+ len = skb->len + 32 - cacheline_end + 1;
+ if(len != skb->len)
+ skb = skb_padto(skb, len);
+ }
+ if(skb == NULL)
+ {
+ yp->tx_skbuff[entry] = NULL;
+ netif_wake_queue(dev);
+ return 0;
+ }
}
#ifdef NO_TXSTATS
yp->tx_ring[entry].addr = cpu_to_le32(pci_map_single(yp->pci_dev,
- skb->data, skb->len, PCI_DMA_TODEVICE));
+ skb->data, len, PCI_DMA_TODEVICE));
yp->tx_ring[entry].result_status = 0;
if (entry >= TX_RING_SIZE-1) {
/* New stop command. */
yp->tx_ring[0].dbdma_cmd = cpu_to_le32(CMD_STOP);
yp->tx_ring[TX_RING_SIZE-1].dbdma_cmd =
- cpu_to_le32(CMD_TX_PKT|BRANCH_ALWAYS | skb->len);
+ cpu_to_le32(CMD_TX_PKT|BRANCH_ALWAYS | len);
} else {
yp->tx_ring[entry+1].dbdma_cmd = cpu_to_le32(CMD_STOP);
yp->tx_ring[entry].dbdma_cmd =
- cpu_to_le32(CMD_TX_PKT | BRANCH_IFTRUE | skb->len);
+ cpu_to_le32(CMD_TX_PKT | BRANCH_IFTRUE | len);
}
yp->cur_tx++;
#else
- yp->tx_ring[entry<<1].request_cnt = skb->len;
+ yp->tx_ring[entry<<1].request_cnt = len;
yp->tx_ring[entry<<1].addr = cpu_to_le32(pci_map_single(yp->pci_dev,
- skb->data, skb->len, PCI_DMA_TODEVICE));
+ skb->data, len, PCI_DMA_TODEVICE));
/* The input_last (status-write) command is constant, but we must
rewrite the subsequent 'stop' command. */
@@ -905,7 +916,7 @@
yp->tx_ring[entry<<1].dbdma_cmd =
cpu_to_le32( ((entry % 6) == 0 ? CMD_TX_PKT|INTR_ALWAYS|BRANCH_IFTRUE :
- CMD_TX_PKT | BRANCH_IFTRUE) | skb->len);
+ CMD_TX_PKT | BRANCH_IFTRUE) | len);
#endif
/* Non-x86 Todo: explicitly flush cache lines here. */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)