*BSD News Article 2106


Return to BSD News archive

Newsgroups: comp.unix.bsd
Path: sserve!manuel!munnari.oz.au!uunet!news.univie.ac.at!news.tu-graz.ac.at!fstgds01!chmr
From: chmr@fstgds01.tu-graz.ac.at (Christoph Robitschko)
Subject: Re: second disk on 0.1
Message-ID: <1992Jul20.164920.9319@news.tu-graz.ac.at>
Keywords: wd1
Sender: news@news.tu-graz.ac.at (USENET News System)
Nntp-Posting-Host: fstgds01
Organization: Technical University of Graz, Austria
References: <1992Jul19.035222.639@chinet.chi.il.us>
Date: Mon, 20 Jul 92 16:49:20 GMT
Lines: 254

In article <1992Jul19.035222.639@chinet.chi.il.us> randy@chinet.chi.il.us (Randy Suess) writes:
>
>What is the magic incantation to get a second disk availble under
>0.1?  I have 2 IDE drives, first being a 110 meg and the second being
>a 40 meg.  Doing a "disklabel -r -w wd1 st351" (with st351 added to
>/etc/disktab) just hangs the system.
>Thanks for any info..
>
>-- 
>	I am created Shiva the Destroyer; Death, the shatterer of worlds!
>	Who is this dog meat who stands before me now?
>	That's the biz, sweetheart.
>Randy Suess					 randy@chinet.chi.il.us


I have hacked /sys/i386/isa/wd.c to support two (or any number) hard disks.
It now prints the device description for each configured disk on boot time
and even doesn't break if it cannot find a configured disk.
Your configuration file should contain something like this:

	controller wd0 at isa? ...
	disk wd0 at wd0 disk0
	disk wd1 at wd0 disk1

Enjoy ! (But at your own risk !)

							Christoph


diff -p wd.c.ori wd.c

--- CUT HERE ---

*** wd.c.ori	Wed Jul 15 02:55:21 1992
--- wd.c	Sun Jul 19 14:48:53 1992
***************
*** 60,65 ****
--- 60,68 ----
  #include "syslog.h"
  #include "vm/vm.h"
  
+ #define _NWD	(NWD - 1)	/* One is for the controller */
+ 
+ 
  #define	RETRIES		5	/* number of retries before giving up */
  #define	MAXTRANSFER	32	/* max size of transfer in page clusters */
  
*************** struct	disk {
*** 113,123 ****
  	struct	dkbad	dk_bad;	/* bad sector table */
  };
  
! struct	disk	*wddrives[NWD];		/* table of units */
  struct	buf	wdtab;
! struct	buf	wdutab[NWD];		/* head of queue per drive */
! struct	buf	rwdbuf[NWD];		/* buffers for raw IO */
! long	wdxfer[NWD];			/* count of transfers */
  #ifdef	WDDEBUG
  int	wddebug;
  #endif
--- 116,126 ----
  	struct	dkbad	dk_bad;	/* bad sector table */
  };
  
! struct	disk	*wddrives[_NWD];		/* table of units */
  struct	buf	wdtab;
! struct	buf	wdutab[_NWD];		/* head of queue per drive */
! struct	buf	rwdbuf[_NWD];		/* buffers for raw IO */
! long	wdxfer[_NWD];			/* count of transfers */
  #ifdef	WDDEBUG
  int	wddebug;
  #endif
*************** wdprobe(struct isa_device *dvp)
*** 143,149 ****
  	struct disk *du;
  	int wdc;
  
! 	if (unit > NWD)
  		return(0);
  
  	if ((du = wddrives[unit]) == 0) {
--- 146,152 ----
  	struct disk *du;
  	int wdc;
  
! 	if (unit > _NWD)
  		return(0);
  
  	if ((du = wddrives[unit]) == 0) {
*************** nodevice:
*** 186,218 ****
  int
  wdattach(struct isa_device *dvp)
  {
! 	int unit = dvp->id_unit;
! 	struct disk *du = wddrives[unit];
  
! 	if(wdgetctlr(unit, du) == 0)  {
! 		int i, blank;
! 		char c;
! 
! 		printf(" <");
! 		for (i = blank = 0 ; i < sizeof(du->dk_params.wdp_model); i++) {
! 			char c = du->dk_params.wdp_model[i];
! 
! 			if (blank && c == ' ') continue;
! 			if (blank && c != ' ') {
! 				printf(" %c", c);
! 				blank = 0;
! 				continue;
! 			} 
! 			if (c == ' ')
! 				blank = 1;
! 			else
! 				printf("%c", c);
! 		}
! 		printf(">");
  	}
- /* check for index pulses from each drive. if present, report and
-    allocate a bios drive position to it, which will be used by read disklabel */
- 	du->dk_unit = unit;
  	return(1);
  }
  
--- 189,234 ----
  int
  wdattach(struct isa_device *dvp)
  {
! 	int unit;
! /* 	int unit = dvp->id_unit; */
  
! 	for (unit=0; unit< _NWD; unit++) {
! 	    struct disk *du;
! 	    if ((du = wddrives[unit]) == 0) {
! 		    du = wddrives[unit] = (struct disk *)
! 			    malloc (sizeof(struct disk), M_TEMP, M_NOWAIT);
! 		    du->dk_unit = unit;
! 		    du->dk_port = dvp->id_iobase;
! 	    }
! 
! 
! /* print out description of drive, suppressing multiple blanks	*/
! 	    if(wdgetctlr(unit, du) == 0)  {
! 		    int i, blank;
! 		    char c;
! 		    printf(" %d:<", unit);
! 		    for (i = blank = 0 ; i < sizeof(du->dk_params.wdp_model); i++) {
! 			    char c = du->dk_params.wdp_model[i];
! 
! 			    if (blank && c == ' ') continue;
! 			    if (blank && c != ' ') {
! 				    printf(" %c", c);
! 				    blank = 0;
! 				    continue;
! 			    } 
! 			    if (c == ' ')
! 				    blank = 1;
! 			    else
! 				    printf("%c", c);
! 		    }
! 		    printf(">");
! 		    du->dk_unit = unit;
! 	    }
! 	    else {
! 		free(du, M_TEMP);
! 		wddrives[unit] = 0;
! 	    }
  	}
  	return(1);
  }
  
*************** wdstrategy(register struct buf *bp)
*** 233,239 ****
  	int	s;
  
  	/* valid unit, controller, and request?  */
! 	if (unit >= NWD || bp->b_blkno < 0 || (du = wddrives[unit]) == 0) {
  		bp->b_error = EINVAL;
  		bp->b_flags |= B_ERROR;
  		goto done;
--- 249,255 ----
  	int	s;
  
  	/* valid unit, controller, and request?  */
! 	if (unit >= _NWD || bp->b_blkno < 0 || (du = wddrives[unit]) == 0) {
  		bp->b_error = EINVAL;
  		bp->b_flags |= B_ERROR;
  		goto done;
*************** wdopen(dev_t dev, int flags, int fmt, st
*** 642,655 ****
  	char *msg;
  
  	unit = wdunit(dev);
! 	if (unit >= NWD) return (ENXIO) ;
  
  	du = wddrives[unit];
- 	if (du == 0 && (unit&1) && wddrives[unit&~1]) {			/*XXX*/
- 		du = wddrives[unit] = (struct disk *)			/*XXX*/
- 			malloc (sizeof(struct disk), M_TEMP, M_NOWAIT);	/*XXX*/
- 		du->dk_port = wddrives[unit&~1]->dk_port;		/*XXX*/
- 	}								/*XXX*/
  	if (du == 0) return (ENXIO) ;
  
  	if ((du->dk_flags & DKFL_BSDLABEL) == 0) {
--- 658,666 ----
  	char *msg;
  
  	unit = wdunit(dev);
! 	if (unit >= _NWD) return (ENXIO) ;
  
  	du = wddrives[unit];
  	if (du == 0) return (ENXIO) ;
  
  	if ((du->dk_flags & DKFL_BSDLABEL) == 0) {
*************** wdsize(dev_t dev)
*** 1089,1095 ****
  	int unit = wdunit(dev), part = wdpart(dev), val;
  	struct disk *du;
  
! 	if (unit >= NWD)
  		return(-1);
  
  	du = wddrives[unit];
--- 1100,1106 ----
  	int unit = wdunit(dev), part = wdpart(dev), val;
  	struct disk *du;
  
! 	if (unit >= _NWD)
  		return(-1);
  
  	du = wddrives[unit];
*************** wddump(dev_t dev)			/* dump core after a
*** 1129,1135 ****
  	unit = wdunit(dev);		/* eventually support floppies? */
  	part = wdpart(dev);		/* file system */
  	/* check for acceptable drive number */
! 	if (unit >= NWD) return(ENXIO);
  
  	du = wddrives[unit];
  	if (du == 0) return(ENXIO);
--- 1140,1146 ----
  	unit = wdunit(dev);		/* eventually support floppies? */
  	part = wdpart(dev);		/* file system */
  	/* check for acceptable drive number */
! 	if (unit >= _NWD) return(ENXIO);
  
  	du = wddrives[unit];
  	if (du == 0) return(ENXIO);

--- CUT HERE ---
-- 
------------------------------------------------------------------------
Christoph M. Robitschko  | "the only man who got his work done by Friday
chmr@edvz.tu-graz.ac.at  |             was Robinson Crusoe."