summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/ata/atascsi.c6
-rw-r--r--sys/dev/ata/atascsi.h60
-rw-r--r--sys/dev/pci/ahci.c36
3 files changed, 64 insertions, 38 deletions
diff --git a/sys/dev/ata/atascsi.c b/sys/dev/ata/atascsi.c
index 0bc0d856652..2a2c902ddcb 100644
--- a/sys/dev/ata/atascsi.c
+++ b/sys/dev/ata/atascsi.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: atascsi.c,v 1.16 2007/03/20 04:38:11 pascoe Exp $ */
+/* $OpenBSD: atascsi.c,v 1.17 2007/03/20 05:33:02 pascoe Exp $ */
/*
* Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
@@ -272,7 +272,9 @@ ata_setup_identify(struct ata_port *ap, int nosleep)
bzero(xa->data, 512);
xa->datalen = 512;
- xa->cmd.command = ATA_C_IDENTIFY;
+ xa->cmd.tx->regs[H2D_DEVCTL_OR_COMMAND] = H2D_DEVCTL_OR_COMMAND_COMMAND;
+ xa->cmd.tx->regs[H2D_COMMAND] = ATA_C_IDENTIFY;
+
xa->cmd.st_bmask = 0x40; /* XXX magic WDCS_DRDY */;
xa->cmd.st_pmask = 0x00;
diff --git a/sys/dev/ata/atascsi.h b/sys/dev/ata/atascsi.h
index 91ee6e2dfae..33c624435f6 100644
--- a/sys/dev/ata/atascsi.h
+++ b/sys/dev/ata/atascsi.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: atascsi.h,v 1.9 2007/03/20 04:38:11 pascoe Exp $ */
+/* $OpenBSD: atascsi.h,v 1.10 2007/03/20 05:33:02 pascoe Exp $ */
/*
* Copyright (c) 2007 David Gwynne <dlg@openbsd.org>
@@ -43,16 +43,60 @@ struct ata_port {
#define ATA_PORT_T_ATAPI 2
};
+/* These offsets correspond with the layout of the SATA Host to Device
+ * and Device to Host FISes. Do not change them. */
+enum ata_register_map {
+ REGS_TYPE = 0,
+ FIS_TYPE = 0,
+#define REGS_TYPE_REG_H2D 0x27
+#define REGS_TYPE_REG_D2H 0x34
+#define REGS_TYPE_SDB_D2H 0xA1
+ H2D_DEVCTL_OR_COMMAND = 1,
+#define H2D_DEVCTL_OR_COMMAND_DEVCTL 0x00
+#define H2D_DEVCTL_OR_COMMAND_COMMAND 0x80
+#define H2D_DEVCTL_OR_COMMAND_PMULT_MSK 0x0f
+ D2H_INTERRUPT = 1,
+#define D2H_INTERRUPT_INTERRUPT 0x40
+ H2D_COMMAND = 2,
+ D2H_STATUS = 2,
+ H2D_FEATURES = 3,
+ D2H_ERROR = 3,
+ SECTOR_NUM = 4,
+ LBA_LOW = 4,
+ CYL_LOW = 5,
+ LBA_MID = 5,
+ CYL_HIGH = 6,
+ LBA_HIGH = 6,
+ DEVICE_HEAD = 7,
+ DEVICE = 7,
+ SECTOR_NUM_EXP = 8,
+ LBA_LOW_EXP = 8,
+ CYL_LOW_EXP = 9,
+ LBA_MID_EXP = 9,
+ CYL_HIGH_EXP = 10,
+ LBA_HIGH_EXP = 10,
+ FEATURES_EXP = 11,
+ SECTOR_COUNT = 12,
+ SECTOR_COUNT_EXP = 13,
+ RESERVED_14 = 14,
+ CONTROL = 15,
+ RESERVED_16 = 16,
+ RESERVED_17 = 17,
+ RESERVED_18 = 18,
+ RESERVED_19 = 19,
+ MAX_ATA_REGS = 20
+};
+
+struct ata_regs {
+ u_int8_t regs[MAX_ATA_REGS];
+};
+
struct ata_cmd {
- u_int8_t command;
- u_int8_t head;
- u_int16_t cyl;
- u_int8_t sector;
- u_int8_t count;
- u_int8_t features;
+ struct ata_regs *tx;
+ struct ata_regs rx_err;
+
u_int8_t st_bmask;
u_int8_t st_pmask;
- u_int8_t error;
};
struct ata_xfer {
diff --git a/sys/dev/pci/ahci.c b/sys/dev/pci/ahci.c
index ce3f28f8992..93d65c6d096 100644
--- a/sys/dev/pci/ahci.c
+++ b/sys/dev/pci/ahci.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ahci.c,v 1.78 2007/03/20 04:38:11 pascoe Exp $ */
+/* $OpenBSD: ahci.c,v 1.79 2007/03/20 05:33:02 pascoe Exp $ */
/*
* Copyright (c) 2006 David Gwynne <dlg@openbsd.org>
@@ -859,6 +859,8 @@ nomem:
ccb->ccb_cmd_hdr->ctba_hi = htole32((u_int32_t)(dva >> 32));
ccb->ccb_cmd_hdr->ctba_lo = htole32((u_int32_t)dva);
+ ccb->ccb_xa.cmd.tx = (struct ata_regs *)ccb->ccb_cmd_table->cfis;
+
ccb->ccb_xa.ata_put_xfer = ahci_ata_put_xfer;
ahci_put_ccb(ccb);
@@ -1633,42 +1635,20 @@ ahci_ata_cmd(struct ata_xfer *xa)
{
struct ahci_ccb *ccb = (struct ahci_ccb *)xa;
struct ahci_cmd_hdr *cmd_slot;
- u_int8_t *fis;
int s;
ccb->ccb_done = ahci_ata_cmd_done;
+ ccb->ccb_cmd_table->cfis[0] = REGS_TYPE_REG_H2D;
+
cmd_slot = ccb->ccb_cmd_hdr;
- bzero(ccb->ccb_cmd_table, sizeof(struct ahci_cmd_table));
+ cmd_slot->flags = htole16(5); /* FIS length (in DWORDs) */
- fis = ccb->ccb_cmd_table->cfis;
- fis[0] = 0x27;
- fis[1] = 0x80;
- fis[2] = xa->cmd.command;
- fis[3] = xa->cmd.features;
- fis[4] = xa->cmd.sector;
- fis[5] = (xa->cmd.cyl & 0xff);
- fis[6] = (xa->cmd.cyl >> 8) & 0xff;
- fis[7] = xa->cmd.head & 0x0f;
- fis[8] = 0;
- fis[9] = 0;
- fis[10] = 0;
- fis[11] = 0;
- fis[12] = xa->cmd.count;
- fis[13] = 0;
- fis[14] = 0;
- fis[15] = 0x08;
- fis[16] = 0;
- fis[17] = 0;
- fis[18] = 0;
- fis[19] = 0;
+ if (xa->flags & ATA_F_WRITE)
+ cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_W);
if (ahci_load_prdt(ccb) != 0)
goto failcmd;
- cmd_slot->flags = htole16(5); /* FIS length (in DWORDs) */
- if (xa->flags & ATA_F_WRITE)
- cmd_slot->flags |= htole16(AHCI_CMD_LIST_FLAG_W);
-
xa->state = ATA_S_PENDING;
if (xa->flags & ATA_F_POLL) {