aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/atheros/atl1e/atl1e_main.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
index 895f5377ad1b..6d1a62a84c9d 100644
--- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
+++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
@@ -1665,8 +1665,8 @@ check_sum:
1665 return 0; 1665 return 0;
1666} 1666}
1667 1667
1668static void atl1e_tx_map(struct atl1e_adapter *adapter, 1668static int atl1e_tx_map(struct atl1e_adapter *adapter,
1669 struct sk_buff *skb, struct atl1e_tpd_desc *tpd) 1669 struct sk_buff *skb, struct atl1e_tpd_desc *tpd)
1670{ 1670{
1671 struct atl1e_tpd_desc *use_tpd = NULL; 1671 struct atl1e_tpd_desc *use_tpd = NULL;
1672 struct atl1e_tx_buffer *tx_buffer = NULL; 1672 struct atl1e_tx_buffer *tx_buffer = NULL;
@@ -1677,6 +1677,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
1677 u16 nr_frags; 1677 u16 nr_frags;
1678 u16 f; 1678 u16 f;
1679 int segment; 1679 int segment;
1680 int ring_start = adapter->tx_ring.next_to_use;
1680 1681
1681 nr_frags = skb_shinfo(skb)->nr_frags; 1682 nr_frags = skb_shinfo(skb)->nr_frags;
1682 segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK; 1683 segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK;
@@ -1689,6 +1690,9 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
1689 tx_buffer->length = map_len; 1690 tx_buffer->length = map_len;
1690 tx_buffer->dma = pci_map_single(adapter->pdev, 1691 tx_buffer->dma = pci_map_single(adapter->pdev,
1691 skb->data, hdr_len, PCI_DMA_TODEVICE); 1692 skb->data, hdr_len, PCI_DMA_TODEVICE);
1693 if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma))
1694 return -ENOSPC;
1695
1692 ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE); 1696 ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
1693 mapped_len += map_len; 1697 mapped_len += map_len;
1694 use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma); 1698 use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
@@ -1715,6 +1719,13 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
1715 tx_buffer->dma = 1719 tx_buffer->dma =
1716 pci_map_single(adapter->pdev, skb->data + mapped_len, 1720 pci_map_single(adapter->pdev, skb->data + mapped_len,
1717 map_len, PCI_DMA_TODEVICE); 1721 map_len, PCI_DMA_TODEVICE);
1722
1723 if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) {
1724 /* Reset the tx rings next pointer */
1725 adapter->tx_ring.next_to_use = ring_start;
1726 return -ENOSPC;
1727 }
1728
1718 ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE); 1729 ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
1719 mapped_len += map_len; 1730 mapped_len += map_len;
1720 use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma); 1731 use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
@@ -1750,6 +1761,13 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
1750 (i * MAX_TX_BUF_LEN), 1761 (i * MAX_TX_BUF_LEN),
1751 tx_buffer->length, 1762 tx_buffer->length,
1752 DMA_TO_DEVICE); 1763 DMA_TO_DEVICE);
1764
1765 if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) {
1766 /* Reset the ring next to use pointer */
1767 adapter->tx_ring.next_to_use = ring_start;
1768 return -ENOSPC;
1769 }
1770
1753 ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_PAGE); 1771 ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_PAGE);
1754 use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma); 1772 use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
1755 use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) | 1773 use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
@@ -1767,6 +1785,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
1767 /* The last buffer info contain the skb address, 1785 /* The last buffer info contain the skb address,
1768 so it will be free after unmap */ 1786 so it will be free after unmap */
1769 tx_buffer->skb = skb; 1787 tx_buffer->skb = skb;
1788 return 0;
1770} 1789}
1771 1790
1772static void atl1e_tx_queue(struct atl1e_adapter *adapter, u16 count, 1791static void atl1e_tx_queue(struct atl1e_adapter *adapter, u16 count,
@@ -1834,10 +1853,13 @@ static netdev_tx_t atl1e_xmit_frame(struct sk_buff *skb,
1834 return NETDEV_TX_OK; 1853 return NETDEV_TX_OK;
1835 } 1854 }
1836 1855
1837 atl1e_tx_map(adapter, skb, tpd); 1856 if (atl1e_tx_map(adapter, skb, tpd))
1857 goto out;
1858
1838 atl1e_tx_queue(adapter, tpd_req, tpd); 1859 atl1e_tx_queue(adapter, tpd_req, tpd);
1839 1860
1840 netdev->trans_start = jiffies; /* NETIF_F_LLTX driver :( */ 1861 netdev->trans_start = jiffies; /* NETIF_F_LLTX driver :( */
1862out:
1841 spin_unlock_irqrestore(&adapter->tx_lock, flags); 1863 spin_unlock_irqrestore(&adapter->tx_lock, flags);
1842 return NETDEV_TX_OK; 1864 return NETDEV_TX_OK;
1843} 1865}