Module Name: src Committed By: jdolecek Date: Mon Sep 17 19:30:26 UTC 2018
Modified Files: src/sys/dev/ata [jdolecek-ncqfixes]: atavar.h src/sys/dev/ic [jdolecek-ncqfixes]: ahcisata_core.c mvsata.c siisata.c src/sys/dev/scsipi [jdolecek-ncqfixes]: atapi_wdc.c Log Message: move ATAPI-only members of ata_xfer to an union struct to further save space To generate a diff of this commit: cvs rdiff -u -r1.99.2.3 -r1.99.2.4 src/sys/dev/ata/atavar.h cvs rdiff -u -r1.62.2.3 -r1.62.2.4 src/sys/dev/ic/ahcisata_core.c cvs rdiff -u -r1.41.2.2 -r1.41.2.3 src/sys/dev/ic/mvsata.c cvs rdiff -u -r1.35.6.3 -r1.35.6.4 src/sys/dev/ic/siisata.c cvs rdiff -u -r1.129.6.2 -r1.129.6.3 src/sys/dev/scsipi/atapi_wdc.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/atavar.h diff -u src/sys/dev/ata/atavar.h:1.99.2.3 src/sys/dev/ata/atavar.h:1.99.2.4 --- src/sys/dev/ata/atavar.h:1.99.2.3 Mon Sep 17 19:00:43 2018 +++ src/sys/dev/ata/atavar.h Mon Sep 17 19:30:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: atavar.h,v 1.99.2.3 2018/09/17 19:00:43 jdolecek Exp $ */ +/* $NetBSD: atavar.h,v 1.99.2.4 2018/09/17 19:30:25 jdolecek Exp $ */ /* * Copyright (c) 1998, 2001 Manuel Bouyer. @@ -144,8 +144,6 @@ struct ata_xfer { void *c_databuf; /* pointer to data buffer */ int c_bcount; /* byte count left */ int c_skip; /* bytes already transferred */ - int c_dscpoll; /* counter for dsc polling (ATAPI) */ - int c_lenoff; /* offset to c_bcount (ATAPI) */ #define ATACH_ERR_ST(error, status) ((error) << 8 | (status)) #define ATACH_ERR(val) (((val) >> 8) & 0xff) #define ATACH_ST(val) (((val) >> 0) & 0xff) @@ -153,11 +151,16 @@ struct ata_xfer { union { struct ata_bio c_bio; /* ATA transfer */ struct ata_command c_ata_c; /* ATA command */ - struct scsipi_xfer *c_scsipi; /* SCSI transfer */ + struct { + struct scsipi_xfer *c_scsipi; /* SCSI transfer */ + int c_dscpoll; /* counter for dsc polling (ATAPI) */ + int c_lenoff; /* offset to c_bcount (ATAPI) */ + } atapi; } u; #define c_bio u.c_bio #define c_ata_c u.c_ata_c -#define c_scsipi u.c_scsipi +#define c_atapi u.atapi +#define c_scsipi c_atapi.c_scsipi /* Link on the command queue. */ SIMPLEQ_ENTRY(ata_xfer) c_xferchain; Index: src/sys/dev/ic/ahcisata_core.c diff -u src/sys/dev/ic/ahcisata_core.c:1.62.2.3 src/sys/dev/ic/ahcisata_core.c:1.62.2.4 --- src/sys/dev/ic/ahcisata_core.c:1.62.2.3 Mon Sep 17 18:36:13 2018 +++ src/sys/dev/ic/ahcisata_core.c Mon Sep 17 19:30:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: ahcisata_core.c,v 1.62.2.3 2018/09/17 18:36:13 jdolecek Exp $ */ +/* $NetBSD: ahcisata_core.c,v 1.62.2.4 2018/09/17 19:30:25 jdolecek Exp $ */ /* * Copyright (c) 2006 Manuel Bouyer. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.62.2.3 2018/09/17 18:36:13 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ahcisata_core.c,v 1.62.2.4 2018/09/17 19:30:25 jdolecek Exp $"); #include <sys/types.h> #include <sys/malloc.h> @@ -1877,11 +1877,11 @@ ahci_atapi_scsipi_request(struct scsipi_ xfer->c_flags |= C_POLL; xfer->c_drive = drive; xfer->c_flags |= C_ATAPI; - xfer->c_scsipi = sc_xfer; xfer->c_databuf = sc_xfer->data; xfer->c_bcount = sc_xfer->datalen; xfer->ops = &ahci_atapi_xfer_ops; - xfer->c_dscpoll = 0; + xfer->c_scsipi = sc_xfer; + xfer->c_atapi.c_dscpoll = 0; s = splbio(); ata_exec_xfer(atac->atac_channels[channel], xfer); #ifdef DIAGNOSTIC Index: src/sys/dev/ic/mvsata.c diff -u src/sys/dev/ic/mvsata.c:1.41.2.2 src/sys/dev/ic/mvsata.c:1.41.2.3 --- src/sys/dev/ic/mvsata.c:1.41.2.2 Mon Sep 17 18:36:14 2018 +++ src/sys/dev/ic/mvsata.c Mon Sep 17 19:30:25 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: mvsata.c,v 1.41.2.2 2018/09/17 18:36:14 jdolecek Exp $ */ +/* $NetBSD: mvsata.c,v 1.41.2.3 2018/09/17 19:30:25 jdolecek 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.41.2.2 2018/09/17 18:36:14 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mvsata.c,v 1.41.2.3 2018/09/17 19:30:25 jdolecek Exp $"); #include "opt_mvsata.h" @@ -2092,11 +2092,11 @@ mvsata_atapi_scsipi_request(struct scsip xfer->c_flags |= C_POLL; xfer->c_drive = drive; xfer->c_flags |= C_ATAPI; - xfer->c_scsipi = sc_xfer; xfer->c_databuf = sc_xfer->data; xfer->c_bcount = sc_xfer->datalen; xfer->ops = &mvsata_atapi_xfer_ops; - xfer->c_dscpoll = 0; + xfer->c_scsipi = sc_xfer; + xfer->c_atapi.c_dscpoll = 0; s = splbio(); ata_exec_xfer(chp, xfer); #ifdef DIAGNOSTIC @@ -2444,7 +2444,7 @@ again: mvsata_atapi_reset(chp, xfer); return 1; } - xfer->c_lenoff = len - xfer->c_bcount; + xfer->c_atapi.c_lenoff = len - xfer->c_bcount; if (xfer->c_bcount < len) { aprint_error_dev(atac->atac_dev, "channel %d drive %d:" " warning: write only %d of %d requested bytes\n", @@ -2456,7 +2456,7 @@ again: wdc->dataout_pio(chp, drvp->drive_flags, (char *)xfer->c_databuf + xfer->c_skip, len); - for (i = xfer->c_lenoff; i > 0; i -= 2) + for (i = xfer->c_atapi.c_lenoff; i > 0; i -= 2) MVSATA_WDC_WRITE_2(mvport, SRB_PIOD, 0); xfer->c_skip += len; @@ -2480,7 +2480,7 @@ again: mvsata_atapi_reset(chp, xfer); return 1; } - xfer->c_lenoff = len - xfer->c_bcount; + xfer->c_atapi.c_lenoff = len - xfer->c_bcount; if (xfer->c_bcount < len) { aprint_error_dev(atac->atac_dev, "channel %d drive %d:" " warning: reading only %d of %d bytes\n", @@ -2492,7 +2492,7 @@ again: wdc->datain_pio(chp, drvp->drive_flags, (char *)xfer->c_databuf + xfer->c_skip, len); - if (xfer->c_lenoff > 0) + if (xfer->c_atapi.c_lenoff > 0) wdcbit_bucket(chp, len - xfer->c_bcount); xfer->c_skip += len; @@ -2625,14 +2625,15 @@ mvsata_atapi_phase_complete(struct ata_x DPRINTF(DEBUG_XFERS, ("%s:%d:%d: mvsata_atapi_phase_complete: polldsc %d\n", device_xname(atac->atac_dev), chp->ch_channel, - xfer->c_drive, xfer->c_dscpoll)); + xfer->c_drive, xfer->c_atapi.c_dscpoll)); if (cold) panic("mvsata_atapi_phase_complete: cold"); if (wdcwait(chp, WDCS_DSC, WDCS_DSC, 10, AT_POLL, &tfd) == WDCWAIT_TOUT) { /* 10ms not enough, try again in 1 tick */ - if (xfer->c_dscpoll++ > mstohz(sc_xfer->timeout)) { + if (xfer->c_atapi.c_dscpoll++ > + mstohz(sc_xfer->timeout)) { aprint_error_dev(atac->atac_dev, "channel %d: wait_for_dsc failed\n", chp->ch_channel); Index: src/sys/dev/ic/siisata.c diff -u src/sys/dev/ic/siisata.c:1.35.6.3 src/sys/dev/ic/siisata.c:1.35.6.4 --- src/sys/dev/ic/siisata.c:1.35.6.3 Mon Sep 17 18:36:14 2018 +++ src/sys/dev/ic/siisata.c Mon Sep 17 19:30:26 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: siisata.c,v 1.35.6.3 2018/09/17 18:36:14 jdolecek Exp $ */ +/* $NetBSD: siisata.c,v 1.35.6.4 2018/09/17 19:30:26 jdolecek Exp $ */ /* from ahcisata_core.c */ @@ -79,7 +79,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: siisata.c,v 1.35.6.3 2018/09/17 18:36:14 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: siisata.c,v 1.35.6.4 2018/09/17 19:30:26 jdolecek Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -1837,11 +1837,11 @@ siisata_atapi_scsipi_request(struct scsi xfer->c_flags |= C_POLL; xfer->c_drive = drive; xfer->c_flags |= C_ATAPI; - xfer->c_scsipi = sc_xfer; xfer->c_databuf = sc_xfer->data; xfer->c_bcount = sc_xfer->datalen; xfer->ops = &siisata_atapi_xfer_ops; - xfer->c_dscpoll = 0; + xfer->c_scsipi = sc_xfer; + xfer->c_atapi.c_dscpoll = 0; s = splbio(); ata_exec_xfer(atac->atac_channels[channel], xfer); #ifdef DIAGNOSTIC Index: src/sys/dev/scsipi/atapi_wdc.c diff -u src/sys/dev/scsipi/atapi_wdc.c:1.129.6.2 src/sys/dev/scsipi/atapi_wdc.c:1.129.6.3 --- src/sys/dev/scsipi/atapi_wdc.c:1.129.6.2 Mon Sep 17 18:36:14 2018 +++ src/sys/dev/scsipi/atapi_wdc.c Mon Sep 17 19:30:26 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: atapi_wdc.c,v 1.129.6.2 2018/09/17 18:36:14 jdolecek Exp $ */ +/* $NetBSD: atapi_wdc.c,v 1.129.6.3 2018/09/17 19:30:26 jdolecek Exp $ */ /* * Copyright (c) 1998, 2001 Manuel Bouyer. @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: atapi_wdc.c,v 1.129.6.2 2018/09/17 18:36:14 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: atapi_wdc.c,v 1.129.6.3 2018/09/17 19:30:26 jdolecek Exp $"); #ifndef ATADEBUG #define ATADEBUG @@ -457,11 +457,11 @@ wdc_atapi_scsipi_request(struct scsipi_c xfer->c_flags &= ~C_DMA; #endif /* NATA_DMA */ - xfer->c_scsipi = sc_xfer; xfer->c_databuf = sc_xfer->data; xfer->c_bcount = sc_xfer->datalen; xfer->ops = &wdc_atapi_xfer_ops; - xfer->c_dscpoll = 0; + xfer->c_scsipi = sc_xfer; + xfer->c_atapi.c_dscpoll = 0; s = splbio(); ata_exec_xfer(atac->atac_channels[channel], xfer); #ifdef DIAGNOSTIC @@ -781,8 +781,8 @@ wdc_atapi_intr(struct ata_channel *chp, /* restore transfer length */ len = xfer->c_bcount; - if (xfer->c_lenoff < 0) - len += xfer->c_lenoff; + if (xfer->c_atapi.c_lenoff < 0) + len += xfer->c_atapi.c_lenoff; if (sc_xfer->xs_control & XS_CTL_DATA_IN) goto end_piobm_datain; @@ -915,7 +915,7 @@ again: return 1; } #endif - xfer->c_lenoff = len - xfer->c_bcount; + xfer->c_atapi.c_lenoff = len - xfer->c_bcount; if (xfer->c_bcount < len) { printf("wdc_atapi_intr: warning: write only " "%d of %d requested bytes\n", xfer->c_bcount, len); @@ -940,7 +940,7 @@ again: #if NATA_PIOBM end_piobm_dataout: #endif - for (i = xfer->c_lenoff; i > 0; i -= 2) + for (i = xfer->c_atapi.c_lenoff; i > 0; i -= 2) bus_space_write_2(wdr->cmd_iot, wdr->cmd_iohs[wd_data], 0, 0); @@ -969,7 +969,7 @@ again: return 1; } #endif - xfer->c_lenoff = len - xfer->c_bcount; + xfer->c_atapi.c_lenoff = len - xfer->c_bcount; if (xfer->c_bcount < len) { printf("wdc_atapi_intr: warning: reading only " "%d of %d bytes\n", xfer->c_bcount, len); @@ -994,8 +994,8 @@ again: #if NATA_PIOBM end_piobm_datain: #endif - if (xfer->c_lenoff > 0) - wdcbit_bucket(chp, xfer->c_lenoff); + if (xfer->c_atapi.c_lenoff > 0) + wdcbit_bucket(chp, xfer->c_atapi.c_lenoff); xfer->c_skip += len; xfer->c_bcount -= len; @@ -1073,7 +1073,7 @@ wdc_atapi_phase_complete(struct ata_xfer ATADEBUG_PRINT(("wdc_atapi_phase_complete(%s:%d:%d) " "polldsc %d\n", device_xname(atac->atac_dev), chp->ch_channel, - xfer->c_drive, xfer->c_dscpoll), DEBUG_XFERS); + xfer->c_drive, xfer->c_atapi.c_dscpoll), DEBUG_XFERS); #if 1 if (cold) panic("wdc_atapi_phase_complete: cold"); @@ -1081,7 +1081,7 @@ wdc_atapi_phase_complete(struct ata_xfer if (wdcwait(chp, WDCS_DSC, WDCS_DSC, 10, AT_POLL, &tfd) == WDCWAIT_TOUT) { /* 10ms not enough, try again in 1 tick */ - if (xfer->c_dscpoll++ > + if (xfer->c_atapi.c_dscpoll++ > mstohz(sc_xfer->timeout)) { printf("%s:%d:%d: wait_for_dsc " "failed\n",