[comp.bugs.4bsd] 4.3 BSD only supports 4 tape drives of the same type

rick@seismo.CSS.GOV (Rick Adams) (03/18/87)

Subject: 4.3 BSD only supports 4 tape drives of the same type
Index:	sys/vaxuba/tm.c 4.3BSD

Description:
	4.3 BSD only supports a maximum of 4 tape drives of the same type.
	This is because it only allows 2 bits in the minor device to specify the
	unit number.
	It also doesn't support tri-density tape drives with the ht driver
	(e.g. Emulex TC7000 with STC 1963)
Repeat-By:
	Try and configure 7 tape drives
Fix:
	Apply the following patch. Basically, all we are doing is
	moving the norewind bit from 04 to 040 so we can have up to 8 units
	per driver.

	You should also recompile /usr/src/bin/mt.c because /sys/h/mtio.h
	has changed.

	You will also need to remake the tape devices in /dev.

*** /tmp/,RCSt1026450	Tue Mar 17 15:47:20 1987
--- /sys/vaxuba/tmscp.c	Wed Feb 25 15:24:59 1987
***************
*** 209,216 ****
  					/* filled in by the slave routine */
  
  /* Bits in minor device */
! #define	TMSUNIT(dev)	(minor(dev)&03)
! #define	T_NOREWIND	04
  #define	T_HIDENSITY	010
  
  /* Slave unit to controller mapping */
--- 209,216 ----
  					/* filled in by the slave routine */
  
  /* Bits in minor device */
! #define	TMSUNIT(dev)	(minor(dev)&07)
! #define	T_NOREWIND	040
  #define	T_HIDENSITY	010
  
  /* Slave unit to controller mapping */

*** /tmp/,RCSt1026450	Tue Mar 17 15:47:29 1987
--- /sys/vaxuba/ut.c	Wed Feb 25 15:25:19 1987
***************
*** 52,59 ****
  #define	MASKREG(reg)	((reg)&0xffff)
  
  /* bits in minor device */
! #define	TJUNIT(dev)	(minor(dev)&03)
! #define	T_NOREWIND	04
  #define	T_1600BPI	010
  #define	T_6250BPI	020
  short	utdens[] = { UT_NRZI, UT_PE, UT_GCR, UT_NRZI };
--- 52,59 ----
  #define	MASKREG(reg)	((reg)&0xffff)
  
  /* bits in minor device */
! #define	TJUNIT(dev)	(minor(dev)&07)
! #define	T_NOREWIND	040
  #define	T_1600BPI	010
  #define	T_6250BPI	020
  short	utdens[] = { UT_NRZI, UT_PE, UT_GCR, UT_NRZI };

*** /tmp/,RCSt1026506	Tue Mar 17 15:48:55 1987
--- /sys/vaxuba/ts.c	Tue Mar 17 15:45:36 1987
***************
*** 67,74 ****
   { tsprobe, tsslave, tsattach, tsdgo, tsstd, "ts", tsdinfo, "zs", tsminfo, 0 };
  
  /* bits in minor device */
! #define	TSUNIT(dev)	(minor(dev)&03)
! #define	T_NOREWIND	04
  
  #define	INF	(daddr_t)1000000L
  
--- 67,74 ----
   { tsprobe, tsslave, tsattach, tsdgo, tsstd, "ts", tsdinfo, "zs", tsminfo, 0 };
  
  /* bits in minor device */
! #define	TSUNIT(dev)	(minor(dev)&07)
! #define	T_NOREWIND	040
  
  #define	INF	(daddr_t)1000000L
  
*** /tmp/,RCSt1026524	Tue Mar 17 15:49:50 1987
--- /sys/vaxuba/tm.c	Tue Mar 17 15:49:29 1987
***************
*** 74,82 ****
   { tmprobe, tmslave, tmattach, tmdgo, tmstd, "te", tedinfo, "tm", tmminfo, 0 };
  
  /* bits in minor device */
! #define	TEUNIT(dev)	(minor(dev)&03)
  #define	TMUNIT(dev)	(tetotm[TEUNIT(dev)])
! #define	T_NOREWIND	04
  #define	T_1600BPI	0x8
  
  #define	INF	(daddr_t)1000000L
--- 74,82 ----
   { tmprobe, tmslave, tmattach, tmdgo, tmstd, "te", tedinfo, "tm", tmminfo, 0 };
  
  /* bits in minor device */
! #define	TEUNIT(dev)	(minor(dev)&07)
  #define	TMUNIT(dev)	(tetotm[TEUNIT(dev)])
! #define	T_NOREWIND	040
  #define	T_1600BPI	0x8
  
  #define	INF	(daddr_t)1000000L

*** /tmp/,RCSt1026579	Tue Mar 17 15:53:34 1987
--- /sys/vaxmba/mt.c	Wed Feb 25 15:20:31 1987
***************
*** 56,63 ****
  
  /* Bits in minor device */
  
! #define	MUUNIT(dev)	(minor(dev)&03)
! #define	H_NOREWIND	04
  #define	H_6250BPI	010
  
  #define MTUNIT(dev)	(mutomt[MUUNIT(dev)])
--- 56,63 ----
  
  /* Bits in minor device */
  
! #define	MUUNIT(dev)	(minor(dev)&07)
! #define	H_NOREWIND	040
  #define	H_6250BPI	010
  
  #define MTUNIT(dev)	(mutomt[MUUNIT(dev)])

*** /tmp/,RCSt1026603	Tue Mar 17 15:54:20 1987
--- /sys/vaxmba/ht.c	Wed Feb 25 15:19:26 1987
***************
*** 52,60 ****
  #define MASKREG(r)	((r) & 0xffff)
  
  /* bits in minor device */
! #define	TUUNIT(dev)	(minor(dev)&03)
! #define	H_NOREWIND	04
! #define	H_1600BPI	08
  
  #define HTUNIT(dev)	(tutoht[TUUNIT(dev)])
  
--- 52,61 ----
  #define MASKREG(r)	((r) & 0xffff)
  
  /* bits in minor device */
! #define	TUUNIT(dev)	(minor(dev)&07)
! #define	H_NOREWIND	040
! #define	H_1600BPI	010
! #define	H_6250BPI	020
  
  #define HTUNIT(dev)	(tutoht[TUUNIT(dev)])
  
***************
*** 127,134 ****
  		return (EBUSY);
  	olddens = sc->sc_dens;
  	dens = sc->sc_dens =
! 	    ((minor(dev)&H_1600BPI)?HTTC_1600BPI:HTTC_800BPI)|
! 		HTTC_PDP11|sc->sc_slave;
  	htcommand(dev, HT_SENSE, 1);
  	sc->sc_dens = olddens;
  	if ((sc->sc_dsreg & HTDS_MOL) == 0) {
--- 128,136 ----
  		return (EBUSY);
  	olddens = sc->sc_dens;
  	dens = sc->sc_dens =
! 	    ((minor(dev)&H_6250BPI) ? HTTC_6250BPI :
! 	    ((minor(dev)&H_1600BPI) ? HTTC_1600BPI : HTTC_800BPI))
! 		| HTTC_PDP11 | sc->sc_slave;
  	htcommand(dev, HT_SENSE, 1);
  	sc->sc_dens = olddens;
  	if ((sc->sc_dsreg & HTDS_MOL) == 0) {

*** /tmp/,RCSt1026615	Tue Mar 17 15:54:36 1987
--- /sys/vaxmba/htreg.h	Wed Feb 25 15:19:41 1987
***************
*** 103,108 ****
--- 103,109 ----
  /* bits 8-10 are density select */
  #define	HTTC_800BPI	0001400		/* in bits 8-10, dens=1600 */
  #define	HTTC_1600BPI	0002000		/* in bits 8-10, dens=800 */
+ #define	HTTC_6250BPI	0003400		/* in bits 8-10, dens=800 */
  /* bits 4-7 are format select */
  #define	HTTC_PDP11	0000300		/* in bits 4-7, pdp11 normal format */
  #define	HTTC_EVEN	0000010		/* select even parity */

*** /tmp/,RCSt1026659	Tue Mar 17 15:56:15 1987
--- /sys/h/mtio.h	Fri Aug  8 15:11:05 1986
***************
*** 63,67 ****
  #define MTIOCEEOT	_IO(m, 4)			/* enable EOT error */
  
  #ifndef KERNEL
! #define	DEFTAPE	"/dev/rmt12"
  #endif
--- 63,67 ----
  #define MTIOCEEOT	_IO(m, 4)			/* enable EOT error */
  
  #ifndef KERNEL
! #define	DEFTAPE	"/dev/nrmt8"
  #endif

*** /dev/MAKEDEV.4.3	Wed May 14 22:11:18 1986
--- /dev/MAKEDEV	Thu Jul 17 20:33:25 1986
***************
*** 75,98 ****
  	esac
  	case $unit in
  	0|1|2|3|4|5|6|7)
! 		four=`expr $unit + 4` ; eight=`expr $unit + 8`
! 		twelve=`expr $unit + 12`; twenty=`expr $unit + 20`
  		/etc/mknod mt$unit	b $blk $unit
- 		/etc/mknod mt$four	b $blk $four
  		/etc/mknod mt$eight	b $blk $eight
! 		/etc/mknod mt$twelve	b $blk $twelve
! 		/etc/mknod nmt$unit	b $blk $four ;: sanity w/pdp11 v7
! 		/etc/mknod nmt$eight	b $blk $twelve ;: ditto
! 		/etc/mknod nrmt$unit	c $chr $four ;: sanity w/pdp11 v7
! 		/etc/mknod nrmt$eight	c $chr $twelve ;: ditto
  		/etc/mknod rmt$unit	c $chr $unit
- 		/etc/mknod rmt$four	c $chr $four
  		/etc/mknod rmt$eight	c $chr $eight
- 		/etc/mknod rmt$twelve	c $chr $twelve
  		if [ $i = ut ] 
  		then
  			/etc/mknod mt$twenty	b $blk $twenty
! 			/etc/mknod rmt$twenty	c $chr $twenty
  		fi
  		;;
  	*)
--- 75,92 ----
  	esac
  	case $unit in
  	0|1|2|3|4|5|6|7)
! 		nrew=`expr $unit + 32` ; eight=`expr $unit + 8`
! 		twelve=`expr $unit + 12`; nrew8=`expr $unit + 40`
  		/etc/mknod mt$unit	b $blk $unit
  		/etc/mknod mt$eight	b $blk $eight
! 		/etc/mknod nrmt$unit	c $chr $nrew ;: sanity w/pdp11 v7
! 		/etc/mknod nrmt$eight	c $chr $nrew8 ;: ditto
  		/etc/mknod rmt$unit	c $chr $unit
  		/etc/mknod rmt$eight	c $chr $eight
  		if [ $i = ut ] 
  		then
  			/etc/mknod mt$twenty	b $blk $twenty
! 			/etc/mknod rmt$nrew8	c $chr $twenty
  		fi
  		;;
  	*)