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);