aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/sis/sis900.c34
1 files changed, 30 insertions, 4 deletions
diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c
index e45829628d5f..eb4aea3fe793 100644
--- a/drivers/net/ethernet/sis/sis900.c
+++ b/drivers/net/ethernet/sis/sis900.c
@@ -1187,8 +1187,14 @@ sis900_init_rx_ring(struct net_device *net_dev)
1187 } 1187 }
1188 sis_priv->rx_skbuff[i] = skb; 1188 sis_priv->rx_skbuff[i] = skb;
1189 sis_priv->rx_ring[i].cmdsts = RX_BUF_SIZE; 1189 sis_priv->rx_ring[i].cmdsts = RX_BUF_SIZE;
1190 sis_priv->rx_ring[i].bufptr = pci_map_single(sis_priv->pci_dev, 1190 sis_priv->rx_ring[i].bufptr = pci_map_single(sis_priv->pci_dev,
1191 skb->data, RX_BUF_SIZE, PCI_DMA_FROMDEVICE); 1191 skb->data, RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
1192 if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
1193 sis_priv->rx_ring[i].bufptr))) {
1194 dev_kfree_skb(skb);
1195 sis_priv->rx_skbuff[i] = NULL;
1196 break;
1197 }
1192 } 1198 }
1193 sis_priv->dirty_rx = (unsigned int) (i - NUM_RX_DESC); 1199 sis_priv->dirty_rx = (unsigned int) (i - NUM_RX_DESC);
1194 1200
@@ -1621,6 +1627,14 @@ sis900_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
1621 /* set the transmit buffer descriptor and enable Transmit State Machine */ 1627 /* set the transmit buffer descriptor and enable Transmit State Machine */
1622 sis_priv->tx_ring[entry].bufptr = pci_map_single(sis_priv->pci_dev, 1628 sis_priv->tx_ring[entry].bufptr = pci_map_single(sis_priv->pci_dev,
1623 skb->data, skb->len, PCI_DMA_TODEVICE); 1629 skb->data, skb->len, PCI_DMA_TODEVICE);
1630 if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
1631 sis_priv->tx_ring[entry].bufptr))) {
1632 dev_kfree_skb(skb);
1633 sis_priv->tx_skbuff[entry] = NULL;
1634 net_dev->stats.tx_dropped++;
1635 spin_unlock_irqrestore(&sis_priv->lock, flags);
1636 return NETDEV_TX_OK;
1637 }
1624 sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len); 1638 sis_priv->tx_ring[entry].cmdsts = (OWN | skb->len);
1625 sw32(cr, TxENA | sr32(cr)); 1639 sw32(cr, TxENA | sr32(cr));
1626 1640
@@ -1824,9 +1838,15 @@ static int sis900_rx(struct net_device *net_dev)
1824refill_rx_ring: 1838refill_rx_ring:
1825 sis_priv->rx_skbuff[entry] = skb; 1839 sis_priv->rx_skbuff[entry] = skb;
1826 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; 1840 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE;
1827 sis_priv->rx_ring[entry].bufptr = 1841 sis_priv->rx_ring[entry].bufptr =
1828 pci_map_single(sis_priv->pci_dev, skb->data, 1842 pci_map_single(sis_priv->pci_dev, skb->data,
1829 RX_BUF_SIZE, PCI_DMA_FROMDEVICE); 1843 RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
1844 if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
1845 sis_priv->rx_ring[entry].bufptr))) {
1846 dev_kfree_skb_irq(skb);
1847 sis_priv->rx_skbuff[entry] = NULL;
1848 break;
1849 }
1830 } 1850 }
1831 sis_priv->cur_rx++; 1851 sis_priv->cur_rx++;
1832 entry = sis_priv->cur_rx % NUM_RX_DESC; 1852 entry = sis_priv->cur_rx % NUM_RX_DESC;
@@ -1852,9 +1872,15 @@ refill_rx_ring:
1852 } 1872 }
1853 sis_priv->rx_skbuff[entry] = skb; 1873 sis_priv->rx_skbuff[entry] = skb;
1854 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE; 1874 sis_priv->rx_ring[entry].cmdsts = RX_BUF_SIZE;
1855 sis_priv->rx_ring[entry].bufptr = 1875 sis_priv->rx_ring[entry].bufptr =
1856 pci_map_single(sis_priv->pci_dev, skb->data, 1876 pci_map_single(sis_priv->pci_dev, skb->data,
1857 RX_BUF_SIZE, PCI_DMA_FROMDEVICE); 1877 RX_BUF_SIZE, PCI_DMA_FROMDEVICE);
1878 if (unlikely(pci_dma_mapping_error(sis_priv->pci_dev,
1879 sis_priv->rx_ring[entry].bufptr))) {
1880 dev_kfree_skb_irq(skb);
1881 sis_priv->rx_skbuff[entry] = NULL;
1882 break;
1883 }
1858 } 1884 }
1859 } 1885 }
1860 /* re-enable the potentially idle receive state matchine */ 1886 /* re-enable the potentially idle receive state matchine */