Module Name: src Committed By: jakllsch Date: Sun Feb 3 20:13:28 UTC 2013
Modified Files: src/sys/dev/ata: ata_wdc.c src/sys/dev/ic: mvsata.c wdc.c wdcvar.h Log Message: Add argument to wdccommandext() to allow the entire contents of the device/head register to be specified. Needed for upcoming port multipler support in mvsata(4). To generate a diff of this commit: cvs rdiff -u -r1.102 -r1.103 src/sys/dev/ata/ata_wdc.c cvs rdiff -u -r1.24 -r1.25 src/sys/dev/ic/mvsata.c cvs rdiff -u -r1.276 -r1.277 src/sys/dev/ic/wdc.c cvs rdiff -u -r1.96 -r1.97 src/sys/dev/ic/wdcvar.h 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/ata_wdc.c diff -u src/sys/dev/ata/ata_wdc.c:1.102 src/sys/dev/ata/ata_wdc.c:1.103 --- src/sys/dev/ata/ata_wdc.c:1.102 Mon Nov 19 22:22:56 2012 +++ src/sys/dev/ata/ata_wdc.c Sun Feb 3 20:13:27 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: ata_wdc.c,v 1.102 2012/11/19 22:22:56 rkujawa Exp $ */ +/* $NetBSD: ata_wdc.c,v 1.103 2013/02/03 20:13:27 jakllsch Exp $ */ /* * Copyright (c) 1998, 2001, 2003 Manuel Bouyer. @@ -54,7 +54,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ata_wdc.c,v 1.102 2012/11/19 22:22:56 rkujawa Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ata_wdc.c,v 1.103 2013/02/03 20:13:27 jakllsch Exp $"); #include "opt_ata.h" #include "opt_wdc.h" @@ -453,7 +453,7 @@ again: } if (ata_bio->flags & ATA_LBA48) { wdccommandext(chp, xfer->c_drive, atacmd_to48(cmd), - (u_int64_t)ata_bio->blkno, nblks, 0); + ata_bio->blkno, nblks, 0, WDSD_LBA); } else { wdccommand(chp, xfer->c_drive, cmd, cyl, head, sect, nblks, 0); @@ -527,7 +527,7 @@ again: } if (ata_bio->flags & ATA_LBA48) { wdccommandext(chp, xfer->c_drive, atacmd_to48(cmd), - (u_int64_t)ata_bio->blkno, nblks, 0); + ata_bio->blkno, nblks, 0, WDSD_LBA); } else { wdccommand(chp, xfer->c_drive, cmd, cyl, head, sect, nblks, Index: src/sys/dev/ic/mvsata.c diff -u src/sys/dev/ic/mvsata.c:1.24 src/sys/dev/ic/mvsata.c:1.25 --- src/sys/dev/ic/mvsata.c:1.24 Tue Jul 31 15:50:34 2012 +++ src/sys/dev/ic/mvsata.c Sun Feb 3 20:13:28 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: mvsata.c,v 1.24 2012/07/31 15:50:34 bouyer Exp $ */ +/* $NetBSD: mvsata.c,v 1.25 2013/02/03 20:13:28 jakllsch Exp $ */ /* * Copyright (c) 2008 KIYOHARA Takashi * All rights reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.24 2012/07/31 15:50:34 bouyer Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.25 2013/02/03 20:13:28 jakllsch Exp $"); #include "opt_mvsata.h" @@ -1174,7 +1174,7 @@ do_pio: } if (ata_bio->flags & ATA_LBA48) wdccommandext(chp, xfer->c_drive, atacmd_to48(cmd), - (uint64_t)ata_bio->blkno, nblks, 0); + ata_bio->blkno, nblks, 0, WDSD_LBA); else wdccommand(chp, xfer->c_drive, cmd, cyl, head, sect, nblks, @@ -1553,7 +1553,8 @@ mvsata_wdc_cmd_start(struct ata_channel MVSATA_WDC_WRITE_1(mvport, SRB_CAS, WDCTL_4BIT | WDCTL_IDS); if ((ata_c->flags & AT_LBA48) != 0) { wdccommandext(chp, drive, ata_c->r_command, - ata_c->r_lba, ata_c->r_count, ata_c->r_features); + ata_c->r_lba, ata_c->r_count, ata_c->r_features, + ata_c->r_device & ~0x10); } else { wdccommand(chp, drive, ata_c->r_command, (ata_c->r_lba >> 8) & 0xffff, Index: src/sys/dev/ic/wdc.c diff -u src/sys/dev/ic/wdc.c:1.276 src/sys/dev/ic/wdc.c:1.277 --- src/sys/dev/ic/wdc.c:1.276 Wed Dec 19 14:05:29 2012 +++ src/sys/dev/ic/wdc.c Sun Feb 3 20:13:28 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: wdc.c,v 1.276 2012/12/19 14:05:29 kiyohara Exp $ */ +/* $NetBSD: wdc.c,v 1.277 2013/02/03 20:13:28 jakllsch Exp $ */ /* * Copyright (c) 1998, 2001, 2003 Manuel Bouyer. All rights reserved. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wdc.c,v 1.276 2012/12/19 14:05:29 kiyohara Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wdc.c,v 1.277 2013/02/03 20:13:28 jakllsch Exp $"); #include "opt_ata.h" #include "opt_wdc.h" @@ -1472,7 +1472,8 @@ __wdccommand_start(struct ata_channel *c } if ((ata_c->flags & AT_LBA48) != 0) { wdccommandext(chp, drive, ata_c->r_command, - ata_c->r_lba, ata_c->r_count, ata_c->r_features); + ata_c->r_lba, ata_c->r_count, ata_c->r_features, + ata_c->r_device & ~0x10); } else { wdccommand(chp, drive, ata_c->r_command, (ata_c->r_lba >> 8) & 0xffff, @@ -1776,22 +1777,25 @@ wdccommand(struct ata_channel *chp, u_in */ void wdccommandext(struct ata_channel *chp, u_int8_t drive, u_int8_t command, - u_int64_t blkno, u_int16_t count, u_int16_t features) + u_int64_t blkno, u_int16_t count, u_int16_t features, u_int8_t device) { struct wdc_softc *wdc = CHAN_TO_WDC(chp); struct wdc_regs *wdr = &wdc->regs[chp->ch_channel]; - ATADEBUG_PRINT(("wdccommandext %s:%d:%d: command=0x%x blkno=%d " - "count=%d\n", device_xname(chp->ch_atac->atac_dev), - chp->ch_channel, drive, command, (u_int32_t) blkno, count), + ATADEBUG_PRINT(("wdccommandext %s:%d:%d: command=0x%02x " + "blkno=0x%012"PRIx64" count=0x%04x features=0x%04x " + "device=0x%02x\n", device_xname(chp->ch_atac->atac_dev), + chp->ch_channel, drive, command, blkno, count, features, device), DEBUG_FUNCS); + KASSERT(drive < wdc->wdc_maxdrives); + if (wdc->select) wdc->select(chp,drive); /* Select drive, head, and addressing mode. */ bus_space_write_1(wdr->cmd_iot, wdr->cmd_iohs[wd_sdh], 0, - (drive << 4) | WDSD_LBA); + (drive << 4) | device); if (wdc->cap & WDC_CAPABILITY_WIDEREGS) { bus_space_write_2(wdr->cmd_iot, wdr->cmd_iohs[wd_features], Index: src/sys/dev/ic/wdcvar.h diff -u src/sys/dev/ic/wdcvar.h:1.96 src/sys/dev/ic/wdcvar.h:1.97 --- src/sys/dev/ic/wdcvar.h:1.96 Mon Nov 19 22:22:56 2012 +++ src/sys/dev/ic/wdcvar.h Sun Feb 3 20:13:28 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: wdcvar.h,v 1.96 2012/11/19 22:22:56 rkujawa Exp $ */ +/* $NetBSD: wdcvar.h,v 1.97 2013/02/03 20:13:28 jakllsch Exp $ */ /*- * Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc. @@ -166,7 +166,7 @@ int wdc_dmawait(struct ata_channel *, st void wdccommand(struct ata_channel *, u_int8_t, u_int8_t, u_int16_t, u_int8_t, u_int8_t, u_int8_t, u_int8_t); void wdccommandext(struct ata_channel *, u_int8_t, u_int8_t, u_int64_t, - u_int16_t, u_int16_t); + u_int16_t, u_int16_t, u_int8_t); void wdccommandshort(struct ata_channel *, int, int); void wdctimeout(void *arg); void wdc_reset_drive(struct ata_drive_datas *, int, uint32_t *);