|
@@ -1187,8 +1187,14 @@ sis900_init_rx_ring(struct net_device *net_dev)
|
|
|
}
|
|
|
sis_priv->rx_skbuff[i] = skb;
|
|
|
sis_priv->rx_ring[i].cmdsts = RX_BUF_SIZE;
|
|
|
- sis_priv->rx_ring[i].bufptr = pci_map_single(sis_priv->pci_dev,
|
|
|
- skb->data, RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
|
|
|
+ sis_priv->rx_ring[i].bufptr = pci_map_single(sis_priv->pci_dev,
|
|
|
+ skb->data, RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
|
|
|
+ if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
|
|
|
+ sis_priv->rx_ring[i].bufptr))) {
|
|
|
+ dev_kfree_skb(skb);
|
|
|
+ sis_priv->rx_skbuff[i] = NULL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
sis_priv->dirty_rx = (unsigned int) (i - NUM_RX_DESC);
|
|
|
|
|
@@ -1621,6 +1627,14 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
|
|
|
/* set the transmit buffer descriptor and enable Transmit State Machine */
|
|
|
sis_priv->tx_ring[entry].bufptr = pci_map_single(sis_priv->pci_dev,
|
|
|
skb->data, skb->len, PCI_DMA_TODEVICE);
|
|
|
+ if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
|
|
|
+ sis_priv->tx_ring[entry].bufptr))) {
|
|
|
+ dev_kfree_skb(skb);
|
|
|
+ sis_priv->tx_skbuff[entry] = NULL;
|
|
|
+ net_dev->stats.tx_dropped++;
|
|
|
+ spin_unlock_irqrestore(&sis_priv->lock, flags);
|
|
|
+ return NETDEV_TX_OK;
|
|
|
+ }
|
|
|
sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len);
|
|
|
sw32(cr, TxENA | sr32(cr));
|
|
|
|
|
@@ -1824,9 +1838,15 @@ static int sis900_rx(struct net_device *net_dev)
|
|
|
refill_rx_ring:
|
|
|
sis_priv->rx_skbuff[entry] = skb;
|
|
|
sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE;
|
|
|
- sis_priv->rx_ring[entry].bufptr =
|
|
|
+ sis_priv->rx_ring[entry].bufptr =
|
|
|
pci_map_single(sis_priv->pci_dev, skb->data,
|
|
|
RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
|
|
|
+ if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
|
|
|
+ sis_priv->rx_ring[entry].bufptr))) {
|
|
|
+ dev_kfree_skb_irq(skb);
|
|
|
+ sis_priv->rx_skbuff[entry] = NULL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
sis_priv->cur_rx++;
|
|
|
entry = sis_priv->cur_rx % NUM_RX_DESC;
|
|
@@ -1852,9 +1872,15 @@ refill_rx_ring:
|
|
|
}
|
|
|
sis_priv->rx_skbuff[entry] = skb;
|
|
|
sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE;
|
|
|
- sis_priv->rx_ring[entry].bufptr =
|
|
|
+ sis_priv->rx_ring[entry].bufptr =
|
|
|
pci_map_single(sis_priv->pci_dev, skb->data,
|
|
|
RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
|
|
|
+ if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
|
|
|
+ sis_priv->rx_ring[entry].bufptr))) {
|
|
|
+ dev_kfree_skb_irq(skb);
|
|
|
+ sis_priv->rx_skbuff[entry] = NULL;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
/* re-enable the potentially idle receive state matchine */
|