[patch 21/54] ahci: disable 64bit dma on sb600

Chris Wright
2007-06-08T07:47:45Z

[-- Attachment #1: ahci-disable-64bit-dma-on-sb600.patch --]
[-- Type: text/plain, Size: 1953 bytes --]

-stable review patch. If anyone has any objections, please let us know.
---------------------

From: Tejun Heo <htejun@gmail.com>

SB600 claims it can do 64bit DMA but it can't. Disable it.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
This is backport of commit c7a42156d99bcea7f8173ba7a6034bbaa2ecb77c.
Due to initialization changes in devel branch, it looks a bit
different but does the same thing. This problem makes sb600 ahci
controller malfunction if some memory is over 4G. Please consider for
-stable. Thanks.

drivers/ata/ahci.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)

--- linux-2.6.21.4.orig/drivers/ata/ahci.c
+++ linux-2.6.21.4/drivers/ata/ahci.c
@@ -170,6 +170,7 @@ enum {
AHCI_FLAG_IGN_IRQ_IF_ERR = (1 << 25), /* ignore IRQ_IF_ERR */
AHCI_FLAG_HONOR_PI = (1 << 26), /* honor PORTS_IMPL */
AHCI_FLAG_IGN_SERR_INTERNAL = (1 << 27), /* ignore SERR_INTERNAL */
+ AHCI_FLAG_32BIT_ONLY = (1 << 28), /* force 32bit */
};

struct ahci_cmd_hdr {
@@ -370,7 +371,8 @@ static const struct ata_port_info ahci_p
.flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA |
ATA_FLAG_SKIP_D2H_BSY |
- AHCI_FLAG_IGN_SERR_INTERNAL,
+ AHCI_FLAG_IGN_SERR_INTERNAL |
+ AHCI_FLAG_32BIT_ONLY,
.pio_mask = 0x1f, /* pio0-4 */
.udma_mask = 0x7f, /* udma0-6 ; FIXME */
.port_ops = &ahci_ops,
@@ -1579,6 +1581,12 @@ static int ahci_host_init(struct ata_pro
probe_ent->n_ports = cap_n_ports;

using_dac = hpriv->cap & HOST_CAP_64;
+ if (using_dac && (probe_ent->port_flags & AHCI_FLAG_32BIT_ONLY)) {
+ dev_printk(KERN_INFO, &pdev->dev,
+ "controller can't do 64bit DMA, forcing 32bit\n");
+ using_dac = 0;
+ }
+
if (using_dac &&
!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);

--