linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [2.6.22.y][PATCH] atl1: disable broken 64-bit DMA
@ 2007-11-24 19:15 Jay Cliburn
  2007-11-26 16:52 ` Chris Snook
  0 siblings, 1 reply; 2+ messages in thread
From: Jay Cliburn @ 2007-11-24 19:15 UTC (permalink / raw)
  To: greg, chrisw; +Cc: csnook, kronos.it, linux-kernel, stable

atl1: disable broken 64-bit DMA

[ Upstream commit: 5f08e46b621a769e52a9545a23ab1d5fb2aec1d4 ]

The L1 network chip can DMA to 64-bit addresses, but multiple descriptor
rings share a single register for the high 32 bits of their address, so
only a single, aligned, 4 GB physical address range can be used at a time.
As a result, we need to confine the driver to a 32-bit DMA mask, otherwise
we see occasional data corruption errors in systems containing 4 or more
gigabytes of RAM.

Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net>
Cc: Luca Tettamanti <kronos.it@gmail.com>
Cc: Chris Snook <csnook@redhat.com>
---
 drivers/net/atl1/atl1_main.c |   25 +++++++++++++------------
 1 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c
index 6862c11..1b7a5a8 100644
--- a/drivers/net/atl1/atl1_main.c
+++ b/drivers/net/atl1/atl1_main.c
@@ -2097,21 +2097,26 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
 	struct net_device *netdev;
 	struct atl1_adapter *adapter;
 	static int cards_found = 0;
-	bool pci_using_64 = true;
 	int err;
 
 	err = pci_enable_device(pdev);
 	if (err)
 		return err;
 
-	err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
+	/*
+	 * The atl1 chip can DMA to 64-bit addresses, but it uses a single
+	 * shared register for the high 32 bits, so only a single, aligned,
+	 * 4 GB physical address range can be used at a time.
+	 *
+	 * Supporting 64-bit DMA on this hardware is more trouble than it's
+	 * worth.  It is far easier to limit to 32-bit DMA than update
+	 * various kernel subsystems to support the mechanics required by a
+	 * fixed-high-32-bit system.
+	 */
+	err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
 	if (err) {
-		err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-		if (err) {
-			dev_err(&pdev->dev, "no usable DMA configuration\n");
-			goto err_dma;
-		}
-		pci_using_64 = false;
+		dev_err(&pdev->dev, "no usable DMA configuration\n");
+		goto err_dma;
 	}
 	/* Mark all PCI regions associated with PCI device
 	 * pdev as being reserved by owner atl1_driver_name
@@ -2176,7 +2181,6 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
 
 	netdev->ethtool_ops = &atl1_ethtool_ops;
 	adapter->bd_number = cards_found;
-	adapter->pci_using_64 = pci_using_64;
 
 	/* setup the private structure */
 	err = atl1_sw_init(adapter);
@@ -2193,9 +2197,6 @@ static int __devinit atl1_probe(struct pci_dev *pdev,
 	 */
 	/* netdev->features |= NETIF_F_TSO; */
 
-	if (pci_using_64)
-		netdev->features |= NETIF_F_HIGHDMA;
-
 	netdev->features |= NETIF_F_LLTX;
 
 	/*
-- 
1.5.3.3


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

* Re: [2.6.22.y][PATCH] atl1: disable broken 64-bit DMA
  2007-11-24 19:15 [2.6.22.y][PATCH] atl1: disable broken 64-bit DMA Jay Cliburn
@ 2007-11-26 16:52 ` Chris Snook
  0 siblings, 0 replies; 2+ messages in thread
From: Chris Snook @ 2007-11-26 16:52 UTC (permalink / raw)
  To: Jay Cliburn; +Cc: greg, chrisw, kronos.it, linux-kernel, stable

Jay Cliburn wrote:
> atl1: disable broken 64-bit DMA
> 
> [ Upstream commit: 5f08e46b621a769e52a9545a23ab1d5fb2aec1d4 ]
> 
> The L1 network chip can DMA to 64-bit addresses, but multiple descriptor
> rings share a single register for the high 32 bits of their address, so
> only a single, aligned, 4 GB physical address range can be used at a time.
> As a result, we need to confine the driver to a 32-bit DMA mask, otherwise
> we see occasional data corruption errors in systems containing 4 or more
> gigabytes of RAM.
> 
> Signed-off-by: Jay Cliburn <jacliburn@bellsouth.net>
> Cc: Luca Tettamanti <kronos.it@gmail.com>
> Cc: Chris Snook <csnook@redhat.com>

Acked-By: Chris Snook <csnook@redhat.com>

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

end of thread, other threads:[~2007-11-26 16:58 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-11-24 19:15 [2.6.22.y][PATCH] atl1: disable broken 64-bit DMA Jay Cliburn
2007-11-26 16:52 ` Chris Snook

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).