+++ /dev/null
-From 09adf51b23cfdfc9a46840213eb75e0132a33420 Mon Sep 17 00:00:00 2001
-From: Roger Oksanen <roger.oksanen@cs.helsinki.fi>
-Date: Sun, 29 Nov 2009 17:17:29 -0800
-Subject: e100: Use pci pool to work around GFP_ATOMIC order 5 memory allocation failure
-
-
-From: Roger Oksanen <roger.oksanen@cs.helsinki.fi>
-
-[ Upstream commit 98468efddb101f8a29af974101c17ba513b07be1 ]
-
-pci_alloc_consistent uses GFP_ATOMIC allocation that may fail on some systems
-with limited memory (Bug #14265). pci_pool_alloc allows waiting with
-GFP_KERNEL.
-
-Tested-by: Karol Lewandowski <karol.k.lewandowski@gmail.com>
-Signed-off-by: Roger Oksanen <roger.oksanen@cs.helsinki.fi>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
----
- drivers/net/e100.c | 17 +++++++++++------
- 1 file changed, 11 insertions(+), 6 deletions(-)
-
---- a/drivers/net/e100.c
-+++ b/drivers/net/e100.c
-@@ -156,6 +156,7 @@
- #include <linux/init.h>
- #include <linux/pci.h>
- #include <linux/dma-mapping.h>
-+#include <linux/dmapool.h>
- #include <linux/netdevice.h>
- #include <linux/etherdevice.h>
- #include <linux/mii.h>
-@@ -601,6 +602,7 @@ struct nic {
- struct mem *mem;
- dma_addr_t dma_addr;
-
-+ struct pci_pool *cbs_pool;
- dma_addr_t cbs_dma_addr;
- u8 adaptive_ifs;
- u8 tx_threshold;
-@@ -1779,9 +1781,7 @@ static void e100_clean_cbs(struct nic *n
- nic->cb_to_clean = nic->cb_to_clean->next;
- nic->cbs_avail++;
- }
-- pci_free_consistent(nic->pdev,
-- sizeof(struct cb) * nic->params.cbs.count,
-- nic->cbs, nic->cbs_dma_addr);
-+ pci_pool_free(nic->cbs_pool, nic->cbs, nic->cbs_dma_addr);
- nic->cbs = NULL;
- nic->cbs_avail = 0;
- }
-@@ -1799,8 +1799,8 @@ static int e100_alloc_cbs(struct nic *ni
- nic->cb_to_use = nic->cb_to_send = nic->cb_to_clean = NULL;
- nic->cbs_avail = 0;
-
-- nic->cbs = pci_alloc_consistent(nic->pdev,
-- sizeof(struct cb) * count, &nic->cbs_dma_addr);
-+ nic->cbs = pci_pool_alloc(nic->cbs_pool, GFP_KERNEL,
-+ &nic->cbs_dma_addr);
- if (!nic->cbs)
- return -ENOMEM;
-
-@@ -2827,7 +2827,11 @@ static int __devinit e100_probe(struct p
- DPRINTK(PROBE, ERR, "Cannot register net device, aborting.\n");
- goto err_out_free;
- }
--
-+ nic->cbs_pool = pci_pool_create(netdev->name,
-+ nic->pdev,
-+ nic->params.cbs.count * sizeof(struct cb),
-+ sizeof(u32),
-+ 0);
- DPRINTK(PROBE, INFO, "addr 0x%llx, irq %d, MAC addr %pM\n",
- (unsigned long long)pci_resource_start(pdev, use_io ? 1 : 0),
- pdev->irq, netdev->dev_addr);
-@@ -2857,6 +2861,7 @@ static void __devexit e100_remove(struct
- unregister_netdev(netdev);
- e100_free(nic);
- pci_iounmap(pdev, nic->csr);
-+ pci_pool_destroy(nic->cbs_pool);
- free_netdev(netdev);
- pci_release_regions(pdev);
- pci_disable_device(pdev);