[1683] in NetBSD-Development

home help back first fref pref prev next nref lref last post

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 */

home help back first fref pref prev next nref lref last post