Linux-MIPS Archive on lore.kernel.org
 help / color / Atom feed
* [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls
@ 2019-11-04 10:45 Thomas Bogendoerfer
  2019-11-04 10:45 ` [net v3 2/5] net: sgi: ioc3-eth: fix usage of GFP_* flags Thomas Bogendoerfer
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Thomas Bogendoerfer @ 2019-11-04 10:45 UTC (permalink / raw)
  To: Ralf Baechle, David S. Miller, linux-mips, netdev, linux-kernel
  Cc: Christoph Hellwig

From: Christoph Hellwig <hch@lst.de>

dma_direct_ is a low-level API that must never be used by drivers
directly.  Switch to use the proper DMA API instead.

Fixes: ed870f6a7aa2 ("net: sgi: ioc3-eth: use dma-direct for dma allocations")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
 drivers/net/ethernet/sgi/ioc3-eth.c | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)

diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c
index deb636d653f3..477af82bf8a9 100644
--- a/drivers/net/ethernet/sgi/ioc3-eth.c
+++ b/drivers/net/ethernet/sgi/ioc3-eth.c
@@ -48,7 +48,7 @@
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 #include <linux/skbuff.h>
-#include <linux/dma-direct.h>
+#include <linux/dma-mapping.h>
 
 #include <net/ip.h>
 
@@ -1242,8 +1242,8 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	ioc3_stop(ip);
 
 	/* Allocate rx ring.  4kb = 512 entries, must be 4kb aligned */
-	ip->rxr = dma_direct_alloc_pages(ip->dma_dev, RX_RING_SIZE,
-					 &ip->rxr_dma, GFP_ATOMIC, 0);
+	ip->rxr = dma_alloc_coherent(ip->dma_dev, RX_RING_SIZE, &ip->rxr_dma,
+				     GFP_ATOMIC);
 	if (!ip->rxr) {
 		pr_err("ioc3-eth: rx ring allocation failed\n");
 		err = -ENOMEM;
@@ -1251,9 +1251,8 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	}
 
 	/* Allocate tx rings.  16kb = 128 bufs, must be 16kb aligned  */
-	ip->txr = dma_direct_alloc_pages(ip->dma_dev, TX_RING_SIZE,
-					 &ip->txr_dma,
-					 GFP_KERNEL | __GFP_ZERO, 0);
+	ip->txr = dma_alloc_coherent(ip->dma_dev, TX_RING_SIZE, &ip->txr_dma,
+				     GFP_KERNEL | __GFP_ZERO);
 	if (!ip->txr) {
 		pr_err("ioc3-eth: tx ring allocation failed\n");
 		err = -ENOMEM;
@@ -1313,11 +1312,11 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 out_stop:
 	del_timer_sync(&ip->ioc3_timer);
 	if (ip->rxr)
-		dma_direct_free_pages(ip->dma_dev, RX_RING_SIZE, ip->rxr,
-				      ip->rxr_dma, 0);
+		dma_free_coherent(ip->dma_dev, RX_RING_SIZE, ip->rxr,
+				  ip->rxr_dma);
 	if (ip->txr)
-		dma_direct_free_pages(ip->dma_dev, TX_RING_SIZE, ip->txr,
-				      ip->txr_dma, 0);
+		dma_free_coherent(ip->dma_dev, TX_RING_SIZE, ip->txr,
+				  ip->txr_dma);
 out_res:
 	pci_release_regions(pdev);
 out_free:
@@ -1335,10 +1334,8 @@ static void ioc3_remove_one(struct pci_dev *pdev)
 	struct net_device *dev = pci_get_drvdata(pdev);
 	struct ioc3_private *ip = netdev_priv(dev);
 
-	dma_direct_free_pages(ip->dma_dev, RX_RING_SIZE, ip->rxr,
-			      ip->rxr_dma, 0);
-	dma_direct_free_pages(ip->dma_dev, TX_RING_SIZE, ip->txr,
-			      ip->txr_dma, 0);
+	dma_free_coherent(ip->dma_dev, RX_RING_SIZE, ip->rxr, ip->rxr_dma);
+	dma_free_coherent(ip->dma_dev, TX_RING_SIZE, ip->txr, ip->txr_dma);
 
 	unregister_netdev(dev);
 	del_timer_sync(&ip->ioc3_timer);
-- 
2.16.4


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [net v3 2/5] net: sgi: ioc3-eth: fix usage of GFP_* flags
  2019-11-04 10:45 [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls Thomas Bogendoerfer
@ 2019-11-04 10:45 ` Thomas Bogendoerfer
  2019-11-04 10:45 ` [net v3 3/5] net: sgi: ioc3-eth: simplify setting the DMA mask Thomas Bogendoerfer
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Thomas Bogendoerfer @ 2019-11-04 10:45 UTC (permalink / raw)
  To: Ralf Baechle, David S. Miller, linux-mips, netdev, linux-kernel
  Cc: Christoph Hellwig

From: Christoph Hellwig <hch@lst.de>

dma_alloc_coherent always zeroes memory, there is no need for
__GFP_ZERO.  Also doing a GFP_ATOMIC allocation just before a GFP_KERNEL
one is clearly bogus.

Fixes: ed870f6a7aa2 ("net: sgi: ioc3-eth: use dma-direct for dma allocations")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
 drivers/net/ethernet/sgi/ioc3-eth.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c
index 477af82bf8a9..8a684d882e63 100644
--- a/drivers/net/ethernet/sgi/ioc3-eth.c
+++ b/drivers/net/ethernet/sgi/ioc3-eth.c
@@ -1243,7 +1243,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	/* Allocate rx ring.  4kb = 512 entries, must be 4kb aligned */
 	ip->rxr = dma_alloc_coherent(ip->dma_dev, RX_RING_SIZE, &ip->rxr_dma,
-				     GFP_ATOMIC);
+				     GFP_KERNEL);
 	if (!ip->rxr) {
 		pr_err("ioc3-eth: rx ring allocation failed\n");
 		err = -ENOMEM;
@@ -1252,7 +1252,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	/* Allocate tx rings.  16kb = 128 bufs, must be 16kb aligned  */
 	ip->txr = dma_alloc_coherent(ip->dma_dev, TX_RING_SIZE, &ip->txr_dma,
-				     GFP_KERNEL | __GFP_ZERO);
+				     GFP_KERNEL);
 	if (!ip->txr) {
 		pr_err("ioc3-eth: tx ring allocation failed\n");
 		err = -ENOMEM;
-- 
2.16.4


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [net v3 3/5] net: sgi: ioc3-eth: simplify setting the DMA mask
  2019-11-04 10:45 [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls Thomas Bogendoerfer
  2019-11-04 10:45 ` [net v3 2/5] net: sgi: ioc3-eth: fix usage of GFP_* flags Thomas Bogendoerfer
@ 2019-11-04 10:45 ` Thomas Bogendoerfer
  2019-11-04 10:45 ` [net v3 4/5] net: sgi: ioc3-eth: fix setting NETIF_F_HIGHDMA Thomas Bogendoerfer
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Thomas Bogendoerfer @ 2019-11-04 10:45 UTC (permalink / raw)
  To: Ralf Baechle, David S. Miller, linux-mips, netdev, linux-kernel
  Cc: Christoph Hellwig

From: Christoph Hellwig <hch@lst.de>

There is no need to fall back to a lower mask these days, the DMA mask
just communicates the hardware supported features.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
 drivers/net/ethernet/sgi/ioc3-eth.c | 27 +++++++--------------------
 1 file changed, 7 insertions(+), 20 deletions(-)

diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c
index 8a684d882e63..dc2e22652b55 100644
--- a/drivers/net/ethernet/sgi/ioc3-eth.c
+++ b/drivers/net/ethernet/sgi/ioc3-eth.c
@@ -1173,26 +1173,14 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	struct ioc3 *ioc3;
 	unsigned long ioc3_base, ioc3_size;
 	u32 vendor, model, rev;
-	int err, pci_using_dac;
+	int err;
 
 	/* Configure DMA attributes. */
-	err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
-	if (!err) {
-		pci_using_dac = 1;
-		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
-		if (err < 0) {
-			pr_err("%s: Unable to obtain 64 bit DMA for consistent allocations\n",
-			       pci_name(pdev));
-			goto out;
-		}
-	} else {
-		err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
-		if (err) {
-			pr_err("%s: No usable DMA configuration, aborting.\n",
-			       pci_name(pdev));
-			goto out;
-		}
-		pci_using_dac = 0;
+	err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
+	if (err) {
+		pr_err("%s: No usable DMA configuration, aborting.\n",
+		       pci_name(pdev));
+		goto out;
 	}
 
 	if (pci_enable_device(pdev))
@@ -1204,8 +1192,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 		goto out_disable;
 	}
 
-	if (pci_using_dac)
-		dev->features |= NETIF_F_HIGHDMA;
+	dev->features |= NETIF_F_HIGHDMA;
 
 	err = pci_request_regions(pdev, "ioc3");
 	if (err)
-- 
2.16.4


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [net v3 4/5] net: sgi: ioc3-eth: fix setting NETIF_F_HIGHDMA
  2019-11-04 10:45 [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls Thomas Bogendoerfer
  2019-11-04 10:45 ` [net v3 2/5] net: sgi: ioc3-eth: fix usage of GFP_* flags Thomas Bogendoerfer
  2019-11-04 10:45 ` [net v3 3/5] net: sgi: ioc3-eth: simplify setting the DMA mask Thomas Bogendoerfer
@ 2019-11-04 10:45 ` Thomas Bogendoerfer
  2019-11-04 10:45 ` [net v3 5/5] net: sgi: ioc3-eth: ensure tx ring is 16k aligned Thomas Bogendoerfer
  2019-11-04 19:30 ` [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: Thomas Bogendoerfer @ 2019-11-04 10:45 UTC (permalink / raw)
  To: Ralf Baechle, David S. Miller, linux-mips, netdev, linux-kernel
  Cc: Christoph Hellwig

From: Christoph Hellwig <hch@lst.de>

Set NETIF_F_HIGHDMA together with the NETIF_F_IP_CSUM flag instead of
letting the second assignment overwrite it.  Probably doesn't matter
in practice as none of the systems an IOC3 is usually found in has
highmem to start with.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
 drivers/net/ethernet/sgi/ioc3-eth.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c
index dc2e22652b55..1af68826810a 100644
--- a/drivers/net/ethernet/sgi/ioc3-eth.c
+++ b/drivers/net/ethernet/sgi/ioc3-eth.c
@@ -1192,8 +1192,6 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 		goto out_disable;
 	}
 
-	dev->features |= NETIF_F_HIGHDMA;
-
 	err = pci_request_regions(pdev, "ioc3");
 	if (err)
 		goto out_free;
@@ -1274,7 +1272,7 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	dev->netdev_ops		= &ioc3_netdev_ops;
 	dev->ethtool_ops	= &ioc3_ethtool_ops;
 	dev->hw_features	= NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
-	dev->features		= NETIF_F_IP_CSUM;
+	dev->features		= NETIF_F_IP_CSUM | NETIF_F_HIGHDMA;
 
 	sw_physid1 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID1);
 	sw_physid2 = ioc3_mdio_read(dev, ip->mii.phy_id, MII_PHYSID2);
-- 
2.16.4


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [net v3 5/5] net: sgi: ioc3-eth: ensure tx ring is 16k aligned.
  2019-11-04 10:45 [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls Thomas Bogendoerfer
                   ` (2 preceding siblings ...)
  2019-11-04 10:45 ` [net v3 4/5] net: sgi: ioc3-eth: fix setting NETIF_F_HIGHDMA Thomas Bogendoerfer
@ 2019-11-04 10:45 ` Thomas Bogendoerfer
  2019-11-04 19:30 ` [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: Thomas Bogendoerfer @ 2019-11-04 10:45 UTC (permalink / raw)
  To: Ralf Baechle, David S. Miller, linux-mips, netdev, linux-kernel

IOC3 hardware needs a 16k aligned TX ring.

Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
 drivers/net/ethernet/sgi/ioc3-eth.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/sgi/ioc3-eth.c b/drivers/net/ethernet/sgi/ioc3-eth.c
index 1af68826810a..d242906ae233 100644
--- a/drivers/net/ethernet/sgi/ioc3-eth.c
+++ b/drivers/net/ethernet/sgi/ioc3-eth.c
@@ -89,6 +89,7 @@ struct ioc3_private {
 	struct device *dma_dev;
 	u32 *ssram;
 	unsigned long *rxr;		/* pointer to receiver ring */
+	void *tx_ring;
 	struct ioc3_etxd *txr;
 	dma_addr_t rxr_dma;
 	dma_addr_t txr_dma;
@@ -1236,13 +1237,16 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	}
 
 	/* Allocate tx rings.  16kb = 128 bufs, must be 16kb aligned  */
-	ip->txr = dma_alloc_coherent(ip->dma_dev, TX_RING_SIZE, &ip->txr_dma,
-				     GFP_KERNEL);
-	if (!ip->txr) {
+	ip->tx_ring = dma_alloc_coherent(ip->dma_dev, TX_RING_SIZE + SZ_16K - 1,
+					 &ip->txr_dma, GFP_KERNEL);
+	if (!ip->tx_ring) {
 		pr_err("ioc3-eth: tx ring allocation failed\n");
 		err = -ENOMEM;
 		goto out_stop;
 	}
+	/* Align TX ring */
+	ip->txr = PTR_ALIGN(ip->tx_ring, SZ_16K);
+	ip->txr_dma = ALIGN(ip->txr_dma, SZ_16K);
 
 	ioc3_init(dev);
 
@@ -1299,8 +1303,8 @@ static int ioc3_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 	if (ip->rxr)
 		dma_free_coherent(ip->dma_dev, RX_RING_SIZE, ip->rxr,
 				  ip->rxr_dma);
-	if (ip->txr)
-		dma_free_coherent(ip->dma_dev, TX_RING_SIZE, ip->txr,
+	if (ip->tx_ring)
+		dma_free_coherent(ip->dma_dev, TX_RING_SIZE, ip->tx_ring,
 				  ip->txr_dma);
 out_res:
 	pci_release_regions(pdev);
@@ -1320,7 +1324,7 @@ static void ioc3_remove_one(struct pci_dev *pdev)
 	struct ioc3_private *ip = netdev_priv(dev);
 
 	dma_free_coherent(ip->dma_dev, RX_RING_SIZE, ip->rxr, ip->rxr_dma);
-	dma_free_coherent(ip->dma_dev, TX_RING_SIZE, ip->txr, ip->txr_dma);
+	dma_free_coherent(ip->dma_dev, TX_RING_SIZE, ip->tx_ring, ip->txr_dma);
 
 	unregister_netdev(dev);
 	del_timer_sync(&ip->ioc3_timer);
-- 
2.16.4


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls
  2019-11-04 10:45 [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls Thomas Bogendoerfer
                   ` (3 preceding siblings ...)
  2019-11-04 10:45 ` [net v3 5/5] net: sgi: ioc3-eth: ensure tx ring is 16k aligned Thomas Bogendoerfer
@ 2019-11-04 19:30 ` David Miller
  4 siblings, 0 replies; 6+ messages in thread
From: David Miller @ 2019-11-04 19:30 UTC (permalink / raw)
  To: tbogendoerfer; +Cc: ralf, linux-mips, netdev, linux-kernel, hch

From: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Date: Mon,  4 Nov 2019 11:45:11 +0100

> From: Christoph Hellwig <hch@lst.de>
> 
> dma_direct_ is a low-level API that must never be used by drivers
> directly.  Switch to use the proper DMA API instead.
> 
> Fixes: ed870f6a7aa2 ("net: sgi: ioc3-eth: use dma-direct for dma allocations")
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>

Series applied to net-next.

Please provide a proper "[PATCH v3 0/5] ..." header posting next time when you
post a patch series.

Thank you.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, back to index

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-11-04 10:45 [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls Thomas Bogendoerfer
2019-11-04 10:45 ` [net v3 2/5] net: sgi: ioc3-eth: fix usage of GFP_* flags Thomas Bogendoerfer
2019-11-04 10:45 ` [net v3 3/5] net: sgi: ioc3-eth: simplify setting the DMA mask Thomas Bogendoerfer
2019-11-04 10:45 ` [net v3 4/5] net: sgi: ioc3-eth: fix setting NETIF_F_HIGHDMA Thomas Bogendoerfer
2019-11-04 10:45 ` [net v3 5/5] net: sgi: ioc3-eth: ensure tx ring is 16k aligned Thomas Bogendoerfer
2019-11-04 19:30 ` [net v3 1/5] net: sgi: ioc3-eth: don't abuse dma_direct_* calls David Miller

Linux-MIPS Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-mips/0 linux-mips/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-mips linux-mips/ https://lore.kernel.org/linux-mips \
		linux-mips@vger.kernel.org
	public-inbox-index linux-mips

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-mips


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git