--- Tejun Heo <htejun@xxxxxxxxx> wrote: > Hello, Hello, > It just seems sb600 claims that it can do DMA above 4G while it actually > can't. Can you test the attached patch? Makes sense now. Gladly check the patch. Checking ... Great news: everything just works without any parameters :-)). True genious. With your patch, with 4 GB of RAM, all SATA drives are detected & working normally. For the record dmesg is attached. There's always a catch isn't it? Now no DMA over 32 bit memory space for SATA, right? CPU will have to work harder, I presume. Perhaps putting more pressure. While with 4 GB that might not be a problem, perhaps when I upgrade it to over 4 GB, it might be?? I see, even now, because a chunk of 512 MB is mapped over 4 GB (starting at 0x100000000), those are no good for the SATA's DMA access. If so, too sad :-(. > Thanks. Thank you. (I'll leave the patch for the poor souls stumble upon these emails some far future :-)) PS: if this turns out to a hardware limitation, then perhaps may I request this patch in better form (as not to impact on other ahci users) find its way to mainstream? Even to -stable if I'm lucky, such that Fedora 7 etc. might work out of the box for poor souls (not counting me; I'm used to quirky things) trying out Linux on this chipset. > -- > tejun > > --- > drivers/ata/ahci.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > Index: tree0/drivers/ata/ahci.c > =================================================================== > --- tree0.orig/drivers/ata/ahci.c > +++ tree0/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); > Send instant messages to your online friends http://au.messenger.yahoo.com - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html