diff --git a/drivers/block/ahci.c b/drivers/block/ahci.c
index 7f78c0030144e7431e5f248e984dba7b2faaf69c..8cc9379b82c406ff4245a800c26520c2f79bff64 100644
--- a/drivers/block/ahci.c
+++ b/drivers/block/ahci.c
@@ -16,14 +16,14 @@
 #include <asm/io.h>
 #include <malloc.h>
 #include <scsi.h>
-#include <ata.h>
+#include <libata.h>
 #include <linux/ctype.h>
 #include <ahci.h>
 
 static int ata_io_flush(u8 port);
 
 struct ahci_probe_ent *probe_ent = NULL;
-hd_driveid_t *ataid[AHCI_MAX_PORTS];
+u16 *ataid[AHCI_MAX_PORTS];
 
 #define writel_with_flush(a,b)	do { writel(a,b); readl(b); } while (0)
 
@@ -240,7 +240,7 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
 		j = 0;
 		while (j < WAIT_MS_SPINUP) {
 			tmp = readl(port_mmio + PORT_TFDATA);
-			if (!(tmp & (ATA_STAT_BUSY | ATA_STAT_DRQ)))
+			if (!(tmp & (ATA_BUSY | ATA_DRQ)))
 				break;
 			udelay(1000);
 			tmp = readl(port_mmio + PORT_SCR_STAT);
@@ -378,8 +378,6 @@ static int ahci_init_one(pci_dev_t pdev)
 	u16 vendor;
 	int rc;
 
-	memset((void *)ataid, 0, sizeof(hd_driveid_t *) * AHCI_MAX_PORTS);
-
 	probe_ent = malloc(sizeof(struct ahci_probe_ent));
 	memset(probe_ent, 0, sizeof(struct ahci_probe_ent));
 	probe_ent->dev = pdev;
@@ -469,7 +467,7 @@ static void ahci_set_feature(u8 port)
 	memset(fis, 0, sizeof(fis));
 	fis[0] = 0x27;
 	fis[1] = 1 << 7;
-	fis[2] = ATA_CMD_SETF;
+	fis[2] = ATA_CMD_SET_FEATURES;
 	fis[3] = SETFEATURES_XFER;
 	fis[12] = __ilog2(probe_ent->udma_mask + 1) + 0x40 - 0x01;
 
@@ -607,27 +605,6 @@ static char *ata_id_strcpy(u16 *target, u16 *src, int len)
 	return (char *)target;
 }
 
-
-static void dump_ataid(hd_driveid_t *ataid)
-{
-	debug("(49)ataid->capability = 0x%x\n", ataid->capability);
-	debug("(53)ataid->field_valid =0x%x\n", ataid->field_valid);
-	debug("(63)ataid->dma_mword = 0x%x\n", ataid->dma_mword);
-	debug("(64)ataid->eide_pio_modes = 0x%x\n", ataid->eide_pio_modes);
-	debug("(75)ataid->queue_depth = 0x%x\n", ataid->queue_depth);
-	debug("(80)ataid->major_rev_num = 0x%x\n", ataid->major_rev_num);
-	debug("(81)ataid->minor_rev_num = 0x%x\n", ataid->minor_rev_num);
-	debug("(82)ataid->command_set_1 = 0x%x\n", ataid->command_set_1);
-	debug("(83)ataid->command_set_2 = 0x%x\n", ataid->command_set_2);
-	debug("(84)ataid->cfsse = 0x%x\n", ataid->cfsse);
-	debug("(85)ataid->cfs_enable_1 = 0x%x\n", ataid->cfs_enable_1);
-	debug("(86)ataid->cfs_enable_2 = 0x%x\n", ataid->cfs_enable_2);
-	debug("(87)ataid->csf_default = 0x%x\n", ataid->csf_default);
-	debug("(88)ataid->dma_ultra = 0x%x\n", ataid->dma_ultra);
-	debug("(93)ataid->hw_config = 0x%x\n", ataid->hw_config);
-}
-
-
 /*
  * SCSI INQUIRY command operation.
  */
@@ -641,7 +618,7 @@ static int ata_scsiop_inquiry(ccb *pccb)
 		95 - 4,
 	};
 	u8 fis[20];
-	u8 *tmpid;
+	u16 *tmpid;
 	u8 port;
 
 	/* Clean ccb data buffer */
@@ -656,15 +633,16 @@ static int ata_scsiop_inquiry(ccb *pccb)
 	/* Construct the FIS */
 	fis[0] = 0x27;		/* Host to device FIS. */
 	fis[1] = 1 << 7;	/* Command FIS. */
-	fis[2] = ATA_CMD_IDENT;	/* Command byte. */
+	fis[2] = ATA_CMD_ID_ATA; /* Command byte. */
 
 	/* Read id from sata */
 	port = pccb->target;
-	if (!(tmpid = malloc(sizeof(hd_driveid_t))))
+	tmpid = malloc(ATA_ID_WORDS * 2);
+	if (!tmpid)
 		return -ENOMEM;
 
-	if (ahci_device_data_io(port, (u8 *) &fis, sizeof(fis), tmpid,
-				sizeof(hd_driveid_t), 0)) {
+	if (ahci_device_data_io(port, (u8 *) &fis, sizeof(fis), (u8 *)tmpid,
+				ATA_ID_WORDS * 2, 0)) {
 		debug("scsi_ahci: SCSI inquiry command failure.\n");
 		free(tmpid);
 		return -EIO;
@@ -672,13 +650,16 @@ static int ata_scsiop_inquiry(ccb *pccb)
 
 	if (ataid[port])
 		free(ataid[port]);
-	ataid[port] = (hd_driveid_t *) tmpid;
+	ataid[port] = tmpid;
+	ata_swap_buf_le16(tmpid, ATA_ID_WORDS);
 
 	memcpy(&pccb->pdata[8], "ATA     ", 8);
-	ata_id_strcpy((u16 *) &pccb->pdata[16], (u16 *)ataid[port]->model, 16);
-	ata_id_strcpy((u16 *) &pccb->pdata[32], (u16 *)ataid[port]->fw_rev, 4);
+	ata_id_strcpy((u16 *) &pccb->pdata[16], &tmpid[ATA_ID_PROD], 16);
+	ata_id_strcpy((u16 *) &pccb->pdata[32], &tmpid[ATA_ID_FW_REV], 4);
 
-	dump_ataid(ataid[port]);
+#ifdef DEBUG
+	ata_dump_id(tmpid);
+#endif
 	return 0;
 }
 
@@ -726,7 +707,7 @@ static int ata_scsiop_read_write(ccb *pccb, u8 is_write)
 
 		now_blocks = min(MAX_SATA_BLOCKS_READ_WRITE, blocks);
 
-		transfer_size = ATA_BLOCKSIZE * now_blocks;
+		transfer_size = ATA_SECT_SIZE * now_blocks;
 		if (transfer_size > user_buffer_size) {
 			printf("scsi_ahci: Error: buffer too small.\n");
 			return -EIO;
@@ -781,6 +762,7 @@ static int ata_scsiop_read_write(ccb *pccb, u8 is_write)
 static int ata_scsiop_read_capacity10(ccb *pccb)
 {
 	u32 cap;
+	u64 cap64;
 	u32 block_size;
 
 	if (!ataid[pccb->target]) {
@@ -790,18 +772,11 @@ static int ata_scsiop_read_capacity10(ccb *pccb)
 		return -EPERM;
 	}
 
-	cap = le32_to_cpu(ataid[pccb->target]->lba_capacity);
-	if (cap == 0xfffffff) {
-		unsigned short *cap48 = ataid[pccb->target]->lba48_capacity;
-		if (cap48[2] || cap48[3]) {
-			cap = 0xffffffff;
-		} else {
-			cap = (le16_to_cpu(cap48[1]) << 16) |
-			      (le16_to_cpu(cap48[0]));
-		}
-	}
+	cap64 = ata_id_n_sectors(ataid[pccb->target]);
+	if (cap64 > 0x100000000ULL)
+		cap64 = 0xffffffff;
 
-	cap = cpu_to_be32(cap);
+	cap = cpu_to_be32(cap64);
 	memcpy(pccb->pdata, &cap, sizeof(cap));
 
 	block_size = cpu_to_be32((u32)512);
@@ -826,12 +801,7 @@ static int ata_scsiop_read_capacity16(ccb *pccb)
 		return -EPERM;
 	}
 
-	cap = le32_to_cpu(ataid[pccb->target]->lba_capacity);
-	if (cap == 0xfffffff) {
-		memcpy(&cap, ataid[pccb->target]->lba48_capacity, sizeof(cap));
-		cap = le64_to_cpu(cap);
-	}
-
+	cap = ata_id_n_sectors(ataid[pccb->target]);
 	cap = cpu_to_be64(cap);
 	memcpy(pccb->pdata, &cap, sizeof(cap));
 
@@ -918,8 +888,6 @@ int ahci_init(u32 base)
 	int i, rc = 0;
 	u32 linkmap;
 
-	memset(ataid, 0, sizeof(ataid));
-
 	probe_ent = malloc(sizeof(struct ahci_probe_ent));
 	memset(probe_ent, 0, sizeof(struct ahci_probe_ent));
 
diff --git a/include/ahci.h b/include/ahci.h
index d76993ca2a2880e02aeb8f4e0c86a9cc08b63b0e..90e850929b7d4c625dee3baeb7ed4307af2fe0cc 100644
--- a/include/ahci.h
+++ b/include/ahci.h
@@ -108,29 +108,6 @@
 
 #define AHCI_MAX_PORTS		32
 
-/* SETFEATURES stuff */
-#define SETFEATURES_XFER	0x03
-#define XFER_UDMA_7		0x47
-#define XFER_UDMA_6		0x46
-#define XFER_UDMA_5		0x45
-#define XFER_UDMA_4		0x44
-#define XFER_UDMA_3		0x43
-#define XFER_UDMA_2		0x42
-#define XFER_UDMA_1		0x41
-#define XFER_UDMA_0		0x40
-#define XFER_MW_DMA_2		0x22
-#define XFER_MW_DMA_1		0x21
-#define XFER_MW_DMA_0		0x20
-#define XFER_SW_DMA_2		0x12
-#define XFER_SW_DMA_1		0x11
-#define XFER_SW_DMA_0		0x10
-#define XFER_PIO_4		0x0C
-#define XFER_PIO_3		0x0B
-#define XFER_PIO_2		0x0A
-#define XFER_PIO_1		0x09
-#define XFER_PIO_0		0x08
-#define XFER_PIO_SLOW		0x00
-
 #define ATA_FLAG_SATA		(1 << 3)
 #define ATA_FLAG_NO_LEGACY	(1 << 4) /* no legacy mode check */
 #define ATA_FLAG_MMIO		(1 << 6) /* use MMIO, not PIO */
diff --git a/include/configs/MPC8544DS.h b/include/configs/MPC8544DS.h
index 2a5e5d4ed9df39546ace24152f49dd3dc4fcc153..7f1628592fd09c5105ba5539db3bd99419d81e50 100644
--- a/include/configs/MPC8544DS.h
+++ b/include/configs/MPC8544DS.h
@@ -318,6 +318,7 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID	4
 #define CONFIG_SYS_SCSI_MAX_LUN	1
diff --git a/include/configs/MPC8572DS.h b/include/configs/MPC8572DS.h
index 05d887050046eeb23f46c3fcda43837f44f29551..acd39816bea4d8c2db0aff2bce969f9af6aab57a 100644
--- a/include/configs/MPC8572DS.h
+++ b/include/configs/MPC8572DS.h
@@ -539,6 +539,7 @@
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID	4
 #define CONFIG_SYS_SCSI_MAX_LUN	1
diff --git a/include/configs/MPC8610HPCD.h b/include/configs/MPC8610HPCD.h
index 1553a746c8a55b3d54ffb3fc20bbf81a476ead46..0b2cf87016ddcb905feb19188e980536dc82a6c3 100644
--- a/include/configs/MPC8610HPCD.h
+++ b/include/configs/MPC8610HPCD.h
@@ -326,6 +326,7 @@
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID	4
 #define CONFIG_SYS_SCSI_MAX_LUN	1
diff --git a/include/configs/MPC8641HPCN.h b/include/configs/MPC8641HPCN.h
index 6ca6f6b807e2e960959cf0808ba9d7ead0fd71a8..0945ae155d4ba7c4bc35759c43e018bdf4188583 100644
--- a/include/configs/MPC8641HPCN.h
+++ b/include/configs/MPC8641HPCN.h
@@ -412,6 +412,7 @@ extern unsigned long get_board_sys_clk(unsigned long dummy);
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID	4
 #define CONFIG_SYS_SCSI_MAX_LUN	1
diff --git a/include/configs/P2020DS.h b/include/configs/P2020DS.h
index b5078cdb524e991c43715daa7f7c52132760b2e6..785e497f20ff69e3f97287e9bc7215fa69c5b6aa 100644
--- a/include/configs/P2020DS.h
+++ b/include/configs/P2020DS.h
@@ -513,6 +513,7 @@
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SATA_ULI5288
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID	4
 #define CONFIG_SYS_SCSI_MAX_LUN	1
diff --git a/include/configs/coreboot.h b/include/configs/coreboot.h
index c2dcef89c6e526c70a14d69d9cc444a0d7606355..47215e59aa8983d6a5bec75533816f6db5124b6f 100644
--- a/include/configs/coreboot.h
+++ b/include/configs/coreboot.h
@@ -56,6 +56,7 @@
 #define CONFIG_SCSI_AHCI
 
 #ifdef CONFIG_SCSI_AHCI
+#define CONFIG_LIBATA
 #define CONFIG_SYS_64BIT_LBA
 #define CONFIG_SATA_INTEL		1
 #define CONFIG_SCSI_DEV_LIST		{PCI_VENDOR_ID_INTEL, \
diff --git a/include/configs/highbank.h b/include/configs/highbank.h
index a5743d63df5174f8e9baceb0c7f2df45993a276a..afb6e64e1b0464c6d9ec521a8b701e1711b766aa 100644
--- a/include/configs/highbank.h
+++ b/include/configs/highbank.h
@@ -39,6 +39,7 @@
 #define CONFIG_SYS_BOOTCOUNT_ADDR	0xfff3cf0c
 
 #define CONFIG_MISC_INIT_R
+#define CONFIG_LIBATA
 #define CONFIG_SCSI_AHCI
 #define CONFIG_SCSI_AHCI_PLAT
 #define CONFIG_SYS_SCSI_MAX_SCSI_ID	5