diff -cur ata.ORG/ata-chipset.c ata/ata-chipset.c --- ata.ORG/ata-chipset.c 2007-11-09 10:12:31.000000000 +0900 +++ ata/ata-chipset.c 2007-11-15 15:27:54.000000000 +0900 @@ -1255,6 +1255,8 @@ { ATA_ATI_IXP300_S1, 0x00, SIIMEMIO, 0, ATA_SA150, "IXP300" }, { ATA_ATI_IXP400_S1, 0x00, SIIMEMIO, 0, ATA_SA150, "IXP400" }, { ATA_ATI_IXP400_S2, 0x00, SIIMEMIO, 0, ATA_SA150, "IXP400" }, + { ATA_ATI_IXP600, 0x00, 0, 0, ATA_UDMA6, "IXP600" }, + { ATA_ATI_IXP600_S1, 0x00, 0, 0, ATA_SA300, "IXP600" }, { 0, 0, 0, 0, 0, 0}}; char buffer[64]; @@ -1282,7 +1284,20 @@ if (ata_setup_interrupt(dev)) return ENXIO; - ctlr->setmode = ata_ati_setmode; + /* ATI IXP SB600 Serial ATA is actually an AHCI compatible controller */ + if (ctlr->chip->chipid == ATA_ATI_IXP600_S1) { + ctlr->r_type2 = SYS_RES_MEMORY; + ctlr->r_rid2 = PCIR_BAR(5); + if ((ctlr->r_res2 = bus_alloc_resource_any(dev, ctlr->r_type2, + &ctlr->r_rid2, RF_ACTIVE))) { + return ata_ahci_chipinit(dev); + } + else + return ENXIO; + } + else + ctlr->setmode = ata_ati_setmode; + return 0; } diff -cur ata.ORG/ata-pci.h ata/ata-pci.h --- ata.ORG/ata-pci.h 2007-11-09 10:12:31.000000000 +0900 +++ ata/ata-pci.h 2007-11-15 15:23:00.000000000 +0900 @@ -103,6 +103,8 @@ #define ATA_ATI_IXP300_S1 0x436e1002 #define ATA_ATI_IXP400_S1 0x43791002 #define ATA_ATI_IXP400_S2 0x437a1002 +#define ATA_ATI_IXP600_S1 0x43801002 +#define ATA_ATI_IXP600 0x438c1002 #define ATA_CENATEK_ID 0x16ca #define ATA_CENATEK_ROCKET 0x000116ca