[1683] in NetBSD-Development
Re: netbsd: 12Gig IDE drive
daemon@ATHENA.MIT.EDU (Charles M. Hannum)
Mon May 4 19:49:43 1998
To: Rafael H Schloming <rhs@MIT.EDU>
Cc: netbsd-dev@MIT.EDU
From: mycroft@MIT.EDU (Charles M. Hannum)
Date: 04 May 1998 19:50:50 -0400
In-Reply-To: Rafael H Schloming's message of Sat, 04 Apr 1998 03:40:08 EST
Apologies for the delay. The person who was supposed to test my patch
for 1.3.1 has been rather lame about it. *sigh*
Anyway, here's an *untested* patch for 1.3.1, which does the same
thing as what I committed in -current.
Index: wd.c
===================================================================
RCS file: /cvsroot/src/sys/dev/isa/Attic/wd.c,v
retrieving revision 1.166
diff -c -2 -r1.166 wd.c
*** wd.c 1997/10/13 00:47:33 1.166
--- wd.c 1998/04/26 06:19:06
***************
*** 2,6 ****
/*
! * Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
*
* DMA and multi-sector PIO handling are derived from code contributed by
--- 2,6 ----
/*
! * Copyright (c) 1994, 1995, 1998 Charles M. Hannum. All rights reserved.
*
* DMA and multi-sector PIO handling are derived from code contributed by
***************
*** 183,202 ****
*q++ = '\0';
! printf(": <%s>\n%s: %dMB, %d cyl, %d head, %d sec, %d bytes/sec\n",
! buf, self->dv_xname,
! d_link->sc_params.wdp_cylinders *
! (d_link->sc_params.wdp_heads * d_link->sc_params.wdp_sectors) /
! (1048576 / DEV_BSIZE),
! d_link->sc_params.wdp_cylinders,
! d_link->sc_params.wdp_heads,
! d_link->sc_params.wdp_sectors,
! DEV_BSIZE);
! if ((d_link->sc_params.wdp_capabilities & WD_CAP_DMA) != 0 &&
d_link->sc_mode == WDM_DMA) {
d_link->sc_mode = WDM_DMA;
! } else if (d_link->sc_params.wdp_maxmulti > 1) {
d_link->sc_mode = WDM_PIOMULTI;
! d_link->sc_multiple = min(d_link->sc_params.wdp_maxmulti, 16);
} else {
d_link->sc_mode = WDM_PIOSINGLE;
--- 183,195 ----
*q++ = '\0';
! printf(": <%s>\n", buf);
! if ((d_link->sc_params.wdp_capabilities1 & WD_CAP_DMA) != 0 &&
d_link->sc_mode == WDM_DMA) {
d_link->sc_mode = WDM_DMA;
! } else if ((d_link->sc_params.wdp_multi & 0xff) > 1) {
d_link->sc_mode = WDM_PIOMULTI;
! d_link->sc_multiple =
! min(d_link->sc_params.wdp_multi & 0xff, 16);
} else {
d_link->sc_mode = WDM_PIOSINGLE;
***************
*** 211,218 ****
d_link->sc_multiple,
(d_link->sc_flags & WDF_32BIT) == 0 ? 16 : 32);
! if ((d_link->sc_params.wdp_capabilities & WD_CAP_LBA) != 0)
! printf(" lba addressing\n");
! else
! printf(" chs addressing\n");
#if NRND > 0
--- 204,238 ----
d_link->sc_multiple,
(d_link->sc_flags & WDF_32BIT) == 0 ? 16 : 32);
!
! /* Prior to ATA-4, LBA was optional. */
! if ((d_link->sc_params.wdp_capabilities1 & WD_CAP_LBA) != 0)
! d_link->sc_flags |= WDF_LBA;
! /* ATA-4 requires LBA. */
! if (d_link->sc_params.wdp_ataversion != 0xffff &&
! d_link->sc_params.wdp_ataversion >= WD_VER_ATA4)
! d_link->sc_flags |= WDF_LBA;
!
! if ((d_link->sc_flags & WDF_LBA) != 0) {
! printf(" lba mode\n");
! d_link->sc_capacity =
! (d_link->sc_params.wdp_capacity[1] << 16) |
! d_link->sc_params.wdp_capacity[0];
! printf("%s: %dMB, %d sec, %d bytes/sec\n",
! self->dv_xname,
! d_link->sc_capacity / (1048576 / DEV_BSIZE),
! d_link->sc_capacity, DEV_BSIZE);
! } else {
! printf(" chs mode\n");
! d_link->sc_capacity =
! d_link->sc_params.wdp_cylinders *
! d_link->sc_params.wdp_heads *
! d_link->sc_params.wdp_sectors;
! printf("%s: %dMB, %d cyl, %d head, %d sec, %d bytes/sec\n",
! self->dv_xname,
! d_link->sc_capacity / (1048576 / DEV_BSIZE),
! d_link->sc_params.wdp_cylinders,
! d_link->sc_params.wdp_heads,
! d_link->sc_params.wdp_sectors, DEV_BSIZE);
! }
#if NRND > 0
***************
*** 530,534 ****
#endif
strncpy(lp->d_packname, d_link->sc_params.wdp_model, 16);
! lp->d_secperunit = lp->d_secpercyl * lp->d_ncylinders;
lp->d_rpm = 3600;
lp->d_interleave = 1;
--- 550,554 ----
#endif
strncpy(lp->d_packname, d_link->sc_params.wdp_model, 16);
! lp->d_secperunit = d_link->sc_capacity;
lp->d_rpm = 3600;
lp->d_interleave = 1;
***************
*** 865,869 ****
}
! if ((d_link->sc_params.wdp_capabilities & WD_CAP_LBA) != 0) {
sector = (xlt_blkno >> 0) & 0xff;
cylin = (xlt_blkno >> 8) & 0xffff;
--- 885,889 ----
}
! if ((d_link->sc_flags & WDF_LBA) != 0) {
sector = (xlt_blkno >> 0) & 0xff;
cylin = (xlt_blkno >> 8) & 0xffff;
Index: wdc.c
===================================================================
RCS file: /cvsroot/src/sys/dev/isa/Attic/wdc.c,v
retrieving revision 1.6.2.3
diff -c -2 -r1.6.2.3 wdc.c
*** wdc.c 1997/12/24 06:03:24 1.6.2.3
--- wdc.c 1998/04/26 06:19:06
***************
*** 2,6 ****
/*
! * Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
*
* DMA and multi-sector PIO handling are derived from code contributed by
--- 2,6 ----
/*
! * Copyright (c) 1994, 1995, 1998 Charles M. Hannum. All rights reserved.
*
* DMA and multi-sector PIO handling are derived from code contributed by
***************
*** 501,505 ****
}
! if ((d_link->sc_params.wdp_capabilities & WD_CAP_LBA) != 0) {
sector = (blkno >> 0) & 0xff;
cylin = (blkno >> 8) & 0xffff;
--- 501,505 ----
}
! if ((d_link->sc_flags & WDF_LBA) != 0) {
sector = (blkno >> 0) & 0xff;
cylin = (blkno >> 8) & 0xffff;
***************
*** 812,818 ****
d_link->sc_params.wdp_heads = 8;
d_link->sc_params.wdp_sectors = 17;
! d_link->sc_params.wdp_maxmulti = 0;
! d_link->sc_params.wdp_usedmovsd = 0;
! d_link->sc_params.wdp_capabilities = 0;
} else {
strncpy(d_link->sc_lp->d_typename, "ESDI/IDE",
--- 812,819 ----
d_link->sc_params.wdp_heads = 8;
d_link->sc_params.wdp_sectors = 17;
! d_link->sc_params.wdp_multi = 0x0000;
! d_link->sc_params.wdp_capabilities1 = 0x0000;
! d_link->sc_params.wdp_capabilities2 = 0x0000;
! d_link->sc_params.wdp_ataversion = 0x0000;
} else {
strncpy(d_link->sc_lp->d_typename, "ESDI/IDE",
***************
*** 873,877 ****
case GEOMETRY:
! if ((d_link->sc_params.wdp_capabilities & WD_CAP_LBA) != 0)
goto multimode;
if (wdsetctlr(d_link) != 0) {
--- 874,878 ----
case GEOMETRY:
! if ((d_link->sc_flags & WDF_LBA) != 0)
goto multimode;
if (wdsetctlr(d_link) != 0) {
Index: wdlink.h
===================================================================
RCS file: /cvsroot/src/sys/dev/isa/Attic/wdlink.h,v
retrieving revision 1.3
diff -c -2 -r1.3 wdlink.h
*** wdlink.h 1997/09/03 07:57:53 1.3
--- wdlink.h 1998/04/26 06:19:06
***************
*** 2,6 ****
/*
! * Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
*
* DMA and multi-sector PIO handling are derived from code contributed by
--- 2,6 ----
/*
! * Copyright (c) 1994, 1995, 1998 Charles M. Hannum. All rights reserved.
*
* DMA and multi-sector PIO handling are derived from code contributed by
***************
*** 91,102 ****
#define WDF_WLABEL 0x04 /* label is writable */
#define WDF_LABELLING 0x08 /* writing label */
-
/*
! * XXX Nothing resets this yet, but disk change sensing will when ATAPI is
! * implemented.
*/
#define WDF_LOADED 0x10 /* parameters loaded */
#define WDF_32BIT 0x20 /* can do 32-bit transfer */
! #define WDF_WAIT 0x40 /* waiting for resourses */
daddr_t sc_badsect[127]; /* 126 plus trailing -1 marker */
--- 91,103 ----
#define WDF_WLABEL 0x04 /* label is writable */
#define WDF_LABELLING 0x08 /* writing label */
/*
! * XXX Nothing resets this yet, but disk change sensing will when ATA-4 is
! * more fully implemented.
*/
#define WDF_LOADED 0x10 /* parameters loaded */
#define WDF_32BIT 0x20 /* can do 32-bit transfer */
! #define WDF_WAIT 0x40 /* waiting for resources */
! #define WDF_LBA 0x80 /* using LBA mode */
! int sc_capacity;
daddr_t sc_badsect[127]; /* 126 plus trailing -1 marker */
Index: wdreg.h
===================================================================
RCS file: /cvsroot/src/sys/dev/isa/Attic/wdreg.h,v
retrieving revision 1.14
diff -c -2 -r1.14 wdreg.h
*** wdreg.h 1997/08/27 11:25:18 1.14
--- wdreg.h 1998/04/26 06:19:06
***************
*** 150,185 ****
struct wdparams {
/* drive info */
! short wdp_config; /* general configuration */
#define WD_CFG_REMOVABLE 0x0080
#define WD_CFG_FIXED 0x0040
! short wdp_cylinders; /* number of non-removable cylinders */
! char __reserved1[2];
! short wdp_heads; /* number of heads */
! short wdp_unfbytespertrk; /* number of unformatted bytes/track */
! short wdp_unfbytespersec; /* number of unformatted bytes/sector */
! short wdp_sectors; /* number of sectors */
! char wdp_vendor1[6];
! /* controller info */
char wdp_serial[20]; /* serial number */
! short wdp_buftype; /* buffer type */
! #define WD_BUF_SINGLEPORTSECTOR 1 /* single port, single sector buffer */
! #define WD_BUF_DUALPORTMULTI 2 /* dual port, multiple sector buffer */
! #define WD_BUF_DUALPORTMULTICACHE 3 /* above plus track cache */
! short wdp_bufsize; /* buffer size, in 512-byte units */
! short wdp_eccbytes; /* ecc bytes appended */
char wdp_revision[8]; /* firmware revision */
char wdp_model[40]; /* model name */
! u_char wdp_maxmulti; /* maximum sectors per interrupt */
! char wdp_vendor2[1];
! short wdp_usedmovsd; /* can use double word read/write? */
! char wdp_vendor3[1];
! char wdp_capabilities; /* capability flags */
! #define WD_CAP_LBA 0x02
! #define WD_CAP_DMA 0x01
! char __reserved2[2];
! char wdp_vendor4[1];
! char wdp_piotiming; /* PIO timing mode */
! char wdp_vendor5[1];
! char wdp_dmatiming; /* DMA timing mode */
};
#endif /* _KERNEL */
--- 150,197 ----
struct wdparams {
/* drive info */
! u_short wdp_config; /* general configuration */
#define WD_CFG_REMOVABLE 0x0080
#define WD_CFG_FIXED 0x0040
! u_short wdp_cylinders; /* number of non-removable cylinders */
! u_short __reserved1;
! u_short wdp_heads; /* number of heads */
! u_short __retired1[2]; /* number of unformatted bytes/track */
! u_short wdp_sectors; /* number of sectors */
! u_short __retired2[3];
char wdp_serial[20]; /* serial number */
! u_short __retired3[2];
! u_short __obsolete1;
char wdp_revision[8]; /* firmware revision */
char wdp_model[40]; /* model name */
! u_short wdp_multi; /* maximum sectors per interrupt */
! u_short __reserved2;
! u_short wdp_capabilities1; /* capability flags */
! #define WD_CAP_LBA 0x0200
! #define WD_CAP_DMA 0x0100
! u_short wdp_capabilities2;
! char __junk2;
! char wdp_oldpiotiming; /* PIO timing mode */
! char __junk3;
! char wdp_olddmatiming; /* DMA timing mode */
! u_short wdp_extensions;
! u_short wdp_curcylinders;
! u_short wdp_curheads;
! u_short wdp_cursectors;
! u_short wdp_curcapacity[2];
! u_short wdp_curmulti;
! u_short wdp_capacity[2];
! u_short __retired4;
! u_short wdp_dmamode;
! u_short wdp_piomode;
! u_short wdp_dmatiming[2];
! u_short wdp_piotiming[2];
! u_short __reserved3[6];
! u_short wdp_queuedepth;
! u_short __reserved4[4];
! u_short wdp_ataversion;
! #define WD_VER_ATA1 0x0002
! #define WD_VER_ATA2 0x0004
! #define WD_VER_ATA3 0x0008
! #define WD_VER_ATA4 0x0010
};
#endif /* _KERNEL */