Module Name: src Committed By: jakllsch Date: Wed Jun 17 03:55:04 UTC 2009
Modified Files: src/sys/dev/ata: satafis_subr.c src/sys/dev/ic: ahcisata_core.c Log Message: Use abstracted FIS code for ahcisata(4). Have the FIS code pre-zero the FIS. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/dev/ata/satafis_subr.c cvs rdiff -u -r1.19 -r1.20 src/sys/dev/ic/ahcisata_core.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ata/satafis_subr.c diff -u src/sys/dev/ata/satafis_subr.c:1.1 src/sys/dev/ata/satafis_subr.c:1.2 --- src/sys/dev/ata/satafis_subr.c:1.1 Wed Jun 17 03:07:51 2009 +++ src/sys/dev/ata/satafis_subr.c Wed Jun 17 03:55:04 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: satafis_subr.c,v 1.1 2009/06/17 03:07:51 jakllsch Exp $ */ +/* $NetBSD: satafis_subr.c,v 1.2 2009/06/17 03:55:04 jakllsch Exp $ */ /*- * Copyright (c) 2009 Jonathan A. Kollasch. @@ -56,9 +56,10 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: satafis_subr.c,v 1.1 2009/06/17 03:07:51 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: satafis_subr.c,v 1.2 2009/06/17 03:55:04 jakllsch Exp $"); #include <sys/param.h> +#include <sys/systm.h> #include <sys/disklabel.h> @@ -75,6 +76,8 @@ void satafis_rhd_construct_cmd(struct ata_command *ata_c, uint8_t *fis) { + memset(fis, 0, RHD_FISLEN); + fis[fis_type] = RHD_FISTYPE; fis[rhd_cdpmp] = 0x80; /* xxx magic */ fis[rhd_command] = ata_c->r_command; @@ -97,6 +100,8 @@ nblks = xfer->c_bcount / ata_bio->lp->d_secsize; + memset(fis, 0, RHD_FISLEN); + fis[fis_type] = RHD_FISTYPE; fis[rhd_cdpmp] = 0x80; /* xxx magic */ if (ata_bio->flags & ATA_LBA48) { @@ -128,6 +133,8 @@ void satafis_rhd_construct_atapi(struct ata_xfer *xfer, uint8_t *fis) { + memset(fis, 0, RHD_FISLEN); + fis[fis_type] = RHD_FISTYPE; fis[rhd_cdpmp] = 0x80; /* xxx magic */ fis[rhd_command] = ATAPI_PKT_CMD; Index: src/sys/dev/ic/ahcisata_core.c diff -u src/sys/dev/ic/ahcisata_core.c:1.19 src/sys/dev/ic/ahcisata_core.c:1.20 --- src/sys/dev/ic/ahcisata_core.c:1.19 Thu Feb 12 11:44:11 2009 +++ src/sys/dev/ic/ahcisata_core.c Wed Jun 17 03:55:04 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: ahcisata_core.c,v 1.19 2009/02/12 11:44:11 bouyer Exp $ */ +/* $NetBSD: ahcisata_core.c,v 1.20 2009/06/17 03:55:04 jakllsch Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.19 2009/02/12 11:44:11 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.20 2009/06/17 03:55:04 jakllsch Exp $"); #include <sys/types.h> #include <sys/malloc.h> @@ -48,6 +48,8 @@ #include <dev/ata/atareg.h> #include <dev/ata/satavar.h> #include <dev/ata/satareg.h> +#include <dev/ata/satafisreg.h> +#include <dev/ata/satafisvar.h> #include <dev/ic/ahcisatavar.h> #include <dev/scsipi/scsi_all.h> /* for SCSI status */ @@ -679,7 +681,6 @@ int slot = 0 /* XXX slot */; struct ahci_cmd_tbl *cmd_tbl; struct ahci_cmd_header *cmd_h; - u_int8_t *fis; int i; int channel = chp->ch_channel; @@ -689,28 +690,8 @@ cmd_tbl = achp->ahcic_cmd_tbl[slot]; AHCIDEBUG_PRINT(("%s port %d tbl %p\n", AHCINAME(sc), chp->ch_channel, cmd_tbl), DEBUG_XFERS); - fis = cmd_tbl->cmdt_cfis; - fis[0] = 0x27; /* host to device */ - fis[1] = 0x80; /* command FIS */ - fis[2] = ata_c->r_command; - fis[3] = ata_c->r_features; - fis[4] = ata_c->r_sector; - fis[5] = ata_c->r_cyl & 0xff; - fis[6] = (ata_c->r_cyl >> 8) & 0xff; - fis[7] = ata_c->r_head & 0x0f; - fis[8] = 0; - fis[9] = 0; - fis[10] = 0; - fis[11] = 0; - fis[12] = ata_c->r_count; - fis[13] = 0; - fis[14] = 0; - fis[15] = WDCTL_4BIT; - fis[16] = 0; - fis[17] = 0; - fis[18] = 0; - fis[19] = 0; + satafis_rhd_construct_cmd(ata_c, cmd_tbl->cmdt_cfis); cmd_h = &achp->ahcic_cmdh[slot]; AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc), @@ -725,7 +706,7 @@ } cmd_h->cmdh_flags = htole16( ((ata_c->flags & AT_WRITE) ? AHCI_CMDH_F_WR : 0) | - 20 /* fis lenght */ / 4); + RHD_FISLEN / 4); cmd_h->cmdh_prdbc = 0; AHCI_CMDH_SYNC(sc, achp, slot, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); @@ -909,54 +890,17 @@ int slot = 0 /* XXX slot */; struct ahci_cmd_tbl *cmd_tbl; struct ahci_cmd_header *cmd_h; - u_int8_t *fis; - int i, nblks; + int i; int channel = chp->ch_channel; AHCIDEBUG_PRINT(("ahci_bio_start CI 0x%x\n", AHCI_READ(sc, AHCI_P_CI(chp->ch_channel))), DEBUG_XFERS); - nblks = xfer->c_bcount / ata_bio->lp->d_secsize; - cmd_tbl = achp->ahcic_cmd_tbl[slot]; AHCIDEBUG_PRINT(("%s port %d tbl %p\n", AHCINAME(sc), chp->ch_channel, cmd_tbl), DEBUG_XFERS); - fis = cmd_tbl->cmdt_cfis; - fis[0] = 0x27; /* host to device */ - fis[1] = 0x80; /* command FIS */ - if (ata_bio->flags & ATA_LBA48) { - fis[2] = (ata_bio->flags & ATA_READ) ? - WDCC_READDMA_EXT : WDCC_WRITEDMA_EXT; - } else { - fis[2] = - (ata_bio->flags & ATA_READ) ? WDCC_READDMA : WDCC_WRITEDMA; - } - fis[3] = 0; /* features */ - fis[4] = ata_bio->blkno & 0xff; - fis[5] = (ata_bio->blkno >> 8) & 0xff; - fis[6] = (ata_bio->blkno >> 16) & 0xff; - if (ata_bio->flags & ATA_LBA48) { - fis[7] = WDSD_LBA; - fis[8] = (ata_bio->blkno >> 24) & 0xff; - fis[9] = (ata_bio->blkno >> 32) & 0xff; - fis[10] = (ata_bio->blkno >> 40) & 0xff; - } else { - fis[7] = ((ata_bio->blkno >> 24) & 0x0f) | WDSD_LBA; - fis[8] = 0; - fis[9] = 0; - fis[10] = 0; - } - fis[11] = 0; /* ext features */ - fis[12] = nblks & 0xff; - fis[13] = (ata_bio->flags & ATA_LBA48) ? - ((nblks >> 8) & 0xff) : 0; - fis[14] = 0; - fis[15] = WDCTL_4BIT; - fis[16] = 0; - fis[17] = 0; - fis[18] = 0; - fis[19] = 0; + satafis_rhd_construct_bio(xfer, cmd_tbl->cmdt_cfis); cmd_h = &achp->ahcic_cmdh[slot]; AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc), @@ -970,7 +914,7 @@ } cmd_h->cmdh_flags = htole16( ((ata_bio->flags & ATA_READ) ? 0 : AHCI_CMDH_F_WR) | - 20 /* fis lenght */ / 4); + RHD_FISLEN / 4); cmd_h->cmdh_prdbc = 0; AHCI_CMDH_SYNC(sc, achp, slot, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE); @@ -1326,7 +1270,6 @@ int slot = 0 /* XXX slot */; struct ahci_cmd_tbl *cmd_tbl; struct ahci_cmd_header *cmd_h; - u_int8_t *fis; int i; int channel = chp->ch_channel; @@ -1336,30 +1279,10 @@ cmd_tbl = achp->ahcic_cmd_tbl[slot]; AHCIDEBUG_PRINT(("%s port %d tbl %p\n", AHCINAME(sc), chp->ch_channel, cmd_tbl), DEBUG_XFERS); - fis = cmd_tbl->cmdt_cfis; - fis[0] = 0x27; /* host to device */ - fis[1] = 0x80; /* command FIS */ - fis[2] = ATAPI_PKT_CMD; + satafis_rhd_construct_atapi(xfer, cmd_tbl->cmdt_cfis); memset(&cmd_tbl->cmdt_acmd, 0, sizeof(cmd_tbl->cmdt_acmd)); memcpy(cmd_tbl->cmdt_acmd, sc_xfer->cmd, sc_xfer->cmdlen); - fis[3] = (sc_xfer->datalen ? ATAPI_PKT_CMD_FTRE_DMA : 0); - fis[4] = 0; - fis[5] = 0; - fis[6] = 0; - fis[7] = WDSD_LBA; - fis[8] = 0; - fis[9] = 0; - fis[10] = 0; - fis[11] = 0; /* ext features */ - fis[12] = 0; - fis[13] = 0; - fis[14] = 0; - fis[15] = WDCTL_4BIT; - fis[16] = 0; - fis[17] = 0; - fis[18] = 0; - fis[19] = 0; cmd_h = &achp->ahcic_cmdh[slot]; AHCIDEBUG_PRINT(("%s port %d header %p\n", AHCINAME(sc), @@ -1374,7 +1297,7 @@ } cmd_h->cmdh_flags = htole16( ((sc_xfer->xs_control & XS_CTL_DATA_OUT) ? AHCI_CMDH_F_WR : 0) | - 20 /* fis lenght */ / 4 | AHCI_CMDH_F_A); + RHD_FISLEN / 4 | AHCI_CMDH_F_A); cmd_h->cmdh_prdbc = 0; AHCI_CMDH_SYNC(sc, achp, slot, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);