* [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).