:OK, relevant lines from NATA and ATA follow.

    Ok.  Hmm.  It looks ok.

    (1) Is your ATA device on the PCI bus or is it a legacy ISA device?
        Do a normal ATA boot and run pciconf -l.

        I'm a bit worried that it just stopped working entirely with the most
        recent update to HEAD.  The Intel chipinit code basically didn't
        change at all.

    (2) Please try this patch.  I noticed that some bits in reg54
        were being improperly overwritten for UDMA2 mode.  If you look
        at the original code, the clause for UDMA5 overwrites the
        bits that were set or cleared for UDMA2.

                                                -Matt

Index: ata-chipset.c
===================================================================
RCS file: /cvs/src/sys/dev/disk/nata/ata-chipset.c,v
retrieving revision 1.4
diff -u -r1.4 ata-chipset.c
--- ata-chipset.c       1 Jun 2007 00:31:14 -0000       1.4
+++ ata-chipset.c       2 Jun 2007 19:31:03 -0000
@@ -1891,16 +1891,21 @@
        pci_write_config(gparent, 0x48, reg48 & ~(0x0001 << devno), 2);
        pci_write_config(gparent, 0x4a, (reg4a & ~(0x3 << (devno << 2))), 2);
     }
+
+    /*
+     * reg54
+     */
     reg54 |= 0x0400;
     if (mode >= ATA_UDMA2)
-       pci_write_config(gparent, 0x54, reg54 | (0x1 << devno), 2);
+       reg54 |= (0x1 << devno);
     else
-       pci_write_config(gparent, 0x54, reg54 & ~(0x1 << devno), 2);
+       reg54 &= ~(0x1 << devno);
 
     if (mode >= ATA_UDMA5)
-       pci_write_config(gparent, 0x54, reg54 | (0x1000 << devno), 2);
+       reg54 |= (0x1000 << devno);
     else 
-       pci_write_config(gparent, 0x54, reg54 & ~(0x1000 << devno), 2);
+       reg54 &= ~(0x1000 << devno);
+    pci_write_config(gparent, 0x54, reg54, 2);
 
     reg40 &= ~0x00ff00ff;
     reg40 |= 0x40774077;

Reply via email to