diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/ata/atascsi.c | 6 | ||||
-rw-r--r-- | sys/dev/ata/atascsi.h | 60 | ||||
-rw-r--r-- | sys/dev/pci/ahci.c | 36 |
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) { |