diff options
Diffstat (limited to 'sys/dev/pci')
-rw-r--r-- | sys/dev/pci/ahci.c | 36 |
1 files changed, 8 insertions, 28 deletions
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) { |