summaryrefslogtreecommitdiffstats
path: root/r8169-fix-dma-allocations.patch
diff options
context:
space:
mode:
Diffstat (limited to 'r8169-fix-dma-allocations.patch')
-rw-r--r--r8169-fix-dma-allocations.patch199
1 files changed, 199 insertions, 0 deletions
diff --git a/r8169-fix-dma-allocations.patch b/r8169-fix-dma-allocations.patch
new file mode 100644
index 0000000..aa1e52d
--- /dev/null
+++ b/r8169-fix-dma-allocations.patch
@@ -0,0 +1,199 @@
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 62e784a..6608094 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -1201,7 +1201,8 @@ static void rtl8169_update_counters(struct net_device *dev)
+ if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
+ return;
+
+- counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
++ counters = dma_alloc_coherent(&tp->pci_dev->dev, sizeof(*counters),
++ &paddr, GFP_KERNEL);
+ if (!counters)
+ return;
+
+@@ -1222,7 +1223,8 @@ static void rtl8169_update_counters(struct net_device *dev)
+ RTL_W32(CounterAddrLow, 0);
+ RTL_W32(CounterAddrHigh, 0);
+
+- pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
++ dma_free_coherent(&tp->pci_dev->dev, sizeof(*counters), counters,
++ paddr);
+ }
+
+ static void rtl8169_get_ethtool_stats(struct net_device *dev,
+@@ -3300,13 +3302,13 @@ static int rtl8169_open(struct net_device *dev)
+ * Rx and Tx desscriptors needs 256 bytes alignment.
+ * pci_alloc_consistent provides more.
+ */
+- tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES,
+- &tp->TxPhyAddr);
++ tp->TxDescArray = dma_alloc_coherent(&pdev->dev, R8169_TX_RING_BYTES,
++ &tp->TxPhyAddr, GFP_KERNEL);
+ if (!tp->TxDescArray)
+ goto out;
+
+- tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES,
+- &tp->RxPhyAddr);
++ tp->RxDescArray = dma_alloc_coherent(&pdev->dev, R8169_RX_RING_BYTES,
++ &tp->RxPhyAddr, GFP_KERNEL);
+ if (!tp->RxDescArray)
+ goto err_free_tx_0;
+
+@@ -3337,11 +3339,11 @@ out:
+ err_release_ring_2:
+ rtl8169_rx_clear(tp);
+ err_free_rx_1:
+- pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
+- tp->RxPhyAddr);
++ dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
++ tp->RxPhyAddr);
+ err_free_tx_0:
+- pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
+- tp->TxPhyAddr);
++ dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
++ tp->TxPhyAddr);
+ goto out;
+ }
+
+@@ -3974,7 +3976,7 @@ static void rtl8169_free_rx_skb(struct rtl8169_private *tp,
+ {
+ struct pci_dev *pdev = tp->pci_dev;
+
+- pci_unmap_single(pdev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
++ dma_unmap_single(&pdev->dev, le64_to_cpu(desc->addr), tp->rx_buf_sz,
+ PCI_DMA_FROMDEVICE);
+ dev_kfree_skb(*sk_buff);
+ *sk_buff = NULL;
+@@ -3999,7 +4001,7 @@ static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping,
+ static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
+ struct net_device *dev,
+ struct RxDesc *desc, int rx_buf_sz,
+- unsigned int align)
++ unsigned int align, gfp_t gfp)
+ {
+ struct sk_buff *skb;
+ dma_addr_t mapping;
+@@ -4007,13 +4009,13 @@ static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev,
+
+ pad = align ? align : NET_IP_ALIGN;
+
+- skb = netdev_alloc_skb(dev, rx_buf_sz + pad);
++ skb = __netdev_alloc_skb(dev, rx_buf_sz + pad, gfp);
+ if (!skb)
+ goto err_out;
+
+ skb_reserve(skb, align ? ((pad - 1) & (unsigned long)skb->data) : pad);
+
+- mapping = pci_map_single(pdev, skb->data, rx_buf_sz,
++ mapping = dma_map_single(&pdev->dev, skb->data, rx_buf_sz,
+ PCI_DMA_FROMDEVICE);
+
+ rtl8169_map_to_asic(desc, mapping, rx_buf_sz);
+@@ -4038,7 +4040,7 @@ static void rtl8169_rx_clear(struct rtl8169_private *tp)
+ }
+
+ static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
+- u32 start, u32 end)
++ u32 start, u32 end, gfp_t gfp)
+ {
+ u32 cur;
+
+@@ -4053,7 +4055,7 @@ static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev,
+
+ skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev,
+ tp->RxDescArray + i,
+- tp->rx_buf_sz, tp->align);
++ tp->rx_buf_sz, tp->align, gfp);
+ if (!skb)
+ break;
+
+@@ -4081,7 +4083,7 @@ static int rtl8169_init_ring(struct net_device *dev)
+ memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info));
+ memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *));
+
+- if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC)
++ if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC, GFP_KERNEL) != NUM_RX_DESC)
+ goto err_out;
+
+ rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1);
+@@ -4098,7 +4100,8 @@ static void rtl8169_unmap_tx_skb(struct pci_dev *pdev, struct ring_info *tx_skb,
+ {
+ unsigned int len = tx_skb->len;
+
+- pci_unmap_single(pdev, le64_to_cpu(desc->addr), len, PCI_DMA_TODEVICE);
++ dma_unmap_single(&pdev->dev, le64_to_cpu(desc->addr), len,
++ PCI_DMA_TODEVICE);
+ desc->opts1 = 0x00;
+ desc->opts2 = 0x00;
+ desc->addr = 0x00;
+@@ -4244,7 +4247,8 @@ static int rtl8169_xmit_frags(struct rtl8169_private *tp, struct sk_buff *skb,
+ txd = tp->TxDescArray + entry;
+ len = frag->size;
+ addr = ((void *) page_address(frag->page)) + frag->page_offset;
+- mapping = pci_map_single(tp->pci_dev, addr, len, PCI_DMA_TODEVICE);
++ mapping = dma_map_single(&tp->pci_dev->dev, addr, len,
++ PCI_DMA_TODEVICE);
+
+ /* anti gcc 2.95.3 bugware (sic) */
+ status = opts1 | len | (RingEnd * !((entry + 1) % NUM_TX_DESC));
+@@ -4318,7 +4322,8 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
+ tp->tx_skb[entry].skb = skb;
+ }
+
+- mapping = pci_map_single(tp->pci_dev, skb->data, len, PCI_DMA_TODEVICE);
++ mapping = dma_map_single(&tp->pci_dev->dev, skb->data, len,
++ PCI_DMA_TODEVICE);
+
+ tp->tx_skb[entry].len = len;
+ txd->addr = cpu_to_le64(mapping);
+@@ -4486,8 +4491,9 @@ static inline bool rtl8169_try_rx_copy(struct sk_buff **sk_buff,
+ if (!skb)
+ goto out;
+
+- pci_dma_sync_single_for_cpu(tp->pci_dev, addr, pkt_size,
+- PCI_DMA_FROMDEVICE);
++
++ dma_sync_single_for_cpu(&tp->pci_dev->dev, addr, pkt_size,
++ PCI_DMA_FROMDEVICE);
+ skb_reserve(skb, NET_IP_ALIGN);
+ skb_copy_from_linear_data(*sk_buff, skb->data, pkt_size);
+ *sk_buff = skb;
+@@ -4554,11 +4560,11 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
+ rtl8169_rx_csum(skb, desc);
+
+ if (rtl8169_try_rx_copy(&skb, tp, pkt_size, addr)) {
+- pci_dma_sync_single_for_device(pdev, addr,
++ dma_sync_single_for_device(&pdev->dev, addr,
+ pkt_size, PCI_DMA_FROMDEVICE);
+ rtl8169_mark_to_asic(desc, tp->rx_buf_sz);
+ } else {
+- pci_unmap_single(pdev, addr, tp->rx_buf_sz,
++ dma_unmap_single(&pdev->dev, addr, tp->rx_buf_sz,
+ PCI_DMA_FROMDEVICE);
+ tp->Rx_skbuff[entry] = NULL;
+ }
+@@ -4584,7 +4590,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev,
+ count = cur_rx - tp->cur_rx;
+ tp->cur_rx = cur_rx;
+
+- delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx);
++ delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx, GFP_ATOMIC);
+ if (!delta && count && netif_msg_intr(tp))
+ printk(KERN_INFO "%s: no Rx buffer allocated\n", dev->name);
+ tp->dirty_rx += delta;
+@@ -4770,10 +4776,10 @@ static int rtl8169_close(struct net_device *dev)
+
+ free_irq(dev->irq, dev);
+
+- pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray,
+- tp->RxPhyAddr);
+- pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray,
+- tp->TxPhyAddr);
++ dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
++ tp->RxPhyAddr);
++ dma_free_coherent(&pdev->dev, R8169_TX_RING_BYTES, tp->TxDescArray,
++ tp->TxPhyAddr);
+ tp->TxDescArray = NULL;
+ tp->RxDescArray = NULL;
+