From: vdlinden@fwi.uva.nl (Frank van der Linden)
Subject: patches for fd.c
Summary: this works for me
Keywords: additional fix for fd.c
Organization: FWI, University of Amsterdam
Date: Sat, 12 Dec 1992 19:27:54 GMT


 Hi,

 There was a message recently in comp.unix.bsd about the floppy driver
not being able to read 720K disks (Message by Jordan Hubbard I think).
A reply by terry@icarus.weber.edu said that a patch for this already existed
and would be part of the 386BSD interim release. (Patch by Per Ander Olausson).
 This patch fixes all problems except reading 360K floppies in 1.2M drives.
This can be fixed by reading the value for 'double stepping' from the right
place.Look around line 245:the old statement is between /* */.
I fixed this problem and append the diffs for fd.c and mtools at the end of
this message.

Onno van der Linden          c/o           vdlinden@fwi.uva.nl

# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	fd.dif
#	mtools.dif
#
echo x - fd.dif
sed 's/^X//' >fd.dif << 'END-of-fd.dif'
X*** fd.c.orig	Mon Jun 29 06:25:24 1992
X--- fd.c	Sat Dec 12 16:07:17 1992
X***************
X*** 60,66 ****
X  #define b_cylin b_resid
X  #define b_step b_resid
X  #define FDBLK 512
X! #define NUMTYPES 4
X  
X  struct fd_type {
X  	int	sectrac;		/* sectors per track         */
X--- 60,66 ----
X  #define b_cylin b_resid
X  #define b_step b_resid
X  #define FDBLK 512
X! #define NUMTYPES 5
X  
X  struct fd_type {
X  	int	sectrac;		/* sectors per track         */
X***************
X*** 76,81 ****
X--- 76,82 ----
X  struct fd_type fd_types[NUMTYPES] = {
X   	{ 18,2,0xFF,0x1B,80,2880,1,0 },	/* 1.44 meg HD 3.5in floppy    */
X  	{ 15,2,0xFF,0x1B,80,2400,1,0 },	/* 1.2 meg HD floppy           */
X+ 	{ 9,2,0xFF,0x20,80,1440,1,2  }, /* 720k floppy in HD drive     */
X  	{ 9,2,0xFF,0x23,40,720,2,1 },	/* 360k floppy in 1.2meg drive */
X  	{ 9,2,0xFF,0x2A,40,720,1,1 },	/* 360k floppy in DD drive     */
X  };
X***************
X*** 211,218 ****
X   	int	unit, type, s;
X  
X   	unit = FDUNIT(minor(bp->b_dev));
X!  	/*type = FDTYPE(minor(bp->b_dev));*/
X! 	type = fd_unit[unit].type;
X  
X  #ifdef FDTEST
X  printf("fdstrat%d, blk = %d, bcount = %d, addr = %x|",
X--- 212,219 ----
X   	int	unit, type, s;
X  
X   	unit = FDUNIT(minor(bp->b_dev));
X!  	type = FDTYPE(minor(bp->b_dev));
X! 	/*type = fd_unit[unit].type;*/
X  
X  #ifdef FDTEST
X  printf("fdstrat%d, blk = %d, bcount = %d, addr = %x|",
X***************
X*** 242,248 ****
X  	}
X   	bp->b_cylin = blknum / (fd_types[type].sectrac * 2);
X  	dp = &fd_unit[unit].head;
X! 	dp->b_step = (fd_types[fd_unit[unit].type].steptrac);
X  	s = splbio();
X  	disksort(dp, bp);
X  	if (dp->b_active == 0) {
X--- 243,250 ----
X  	}
X   	bp->b_cylin = blknum / (fd_types[type].sectrac * 2);
X  	dp = &fd_unit[unit].head;
X! /*	dp->b_step = (fd_types[fd_unit[unit].type].steptrac); */
X! 	dp->b_step = (fd_types[type].steptrac);
X  	s = splbio();
X  	disksort(dp, bp);
X  	if (dp->b_active == 0) {
X***************
X*** 281,288 ****
X  int unit;
X  {
X  	fd_unit[unit].motor = 0;
X! 	if (unit) set_motor(0,0);
X! 	else set_motor(1,0);
X  }
X  
X  fd_turnon(unit)
X--- 283,289 ----
X  int unit;
X  {
X  	fd_unit[unit].motor = 0;
X! 	set_motor(unit,0);
X  }
X  
X  fd_turnon(unit)
X***************
X*** 327,339 ****
X  	int	flags;
X  {
X   	int unit = FDUNIT(minor(dev));
X!  	/*int type = FDTYPE(minor(dev));*/
X  	int s;
X  
X  	fdopenf = 1;
X  	/* check bounds */
X  	if (unit >= NFD) return(ENXIO);
X! 	/*if (type >= NUMTYPES) return(ENXIO);*/
X  
X  	/* Set proper disk type, only allow one type */
X  	return 0;
X--- 328,340 ----
X  	int	flags;
X  {
X   	int unit = FDUNIT(minor(dev));
X!  	int type = FDTYPE(minor(dev));
X  	int s;
X  
X  	fdopenf = 1;
X  	/* check bounds */
X  	if (unit >= NFD) return(ENXIO);
X! 	if (type >= NUMTYPES) return(ENXIO);
X  
X  	/* Set proper disk type, only allow one type */
X  	return 0;
X***************
X*** 442,449 ****
X  	dp = &fd_unit[fd_drive].head;
X  	bp = dp->b_actf;
X  	read = bp->b_flags & B_READ;
X!  	/*ft = &fd_types[FDTYPE(bp->b_dev)];*/
X!  	ft = &fd_types[fd_unit[fd_drive].type];
X  
X  	switch (fd_state) {
X  	case 1 : /* SEEK DONE, START DMA */
X--- 443,450 ----
X  	dp = &fd_unit[fd_drive].head;
X  	bp = dp->b_actf;
X  	read = bp->b_flags & B_READ;
X!  	ft = &fd_types[FDTYPE(bp->b_dev)];
X!  	/*ft = &fd_types[fd_unit[fd_drive].type];*/
X  
X  	switch (fd_state) {
X  	case 1 : /* SEEK DONE, START DMA */
X***************
X*** 470,476 ****
X  		sec = blknum %  (sectrac * 2);
X  		head = sec / sectrac;
X  		sec = sec % sectrac + 1;
X! fd_hddrv = ((head&1)<<2)+fd_drive;
X  
X  		if (read)  out_fdc(NE7CMD_READ);	/* READ */
X  		else out_fdc(NE7CMD_WRITE);		/* WRITE */
X--- 471,478 ----
X  		sec = blknum %  (sectrac * 2);
X  		head = sec / sectrac;
X  		sec = sec % sectrac + 1;
X! 
X! 		fd_hddrv = ((head&1)<<2)+fd_drive;
X  
X  		if (read)  out_fdc(NE7CMD_READ);	/* READ */
X  		else out_fdc(NE7CMD_WRITE);		/* WRITE */
END-of-fd.dif
echo x - mtools.dif
sed 's/^X//' >mtools.dif << 'END-of-mtools.dif'
X*** devices.c.0_1	Sat Jun 27 23:05:01 1992
X--- devices.c	Sat Aug 29 18:59:22 1992
X***************
X*** 20,34 ****
X  #ifdef __386BSD__
X  struct device devices[] = {
X  	{'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18}, /* 1.44m */
X! 	{'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15}, /* 1.2m */
X! 	{'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},  /* 720k */
X! 	{'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
X! 	{'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8},  /* 320k */
X  	{'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18}, /* 1.44m */
X! 	{'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15}, /* 1.2m */
X! 	{'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},  /* 720k */
X! 	{'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
X! 	{'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8},  /* 320k */
X  	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
X  };
X  #endif /* __386BSD__ */
X--- 20,36 ----
X  #ifdef __386BSD__
X  struct device devices[] = {
X  	{'A', "/dev/rfd0a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18}, /* 1.44m */
X! 	{'A', "/dev/rfd0b", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15}, /* 1.2m */
X! 	{'A', "/dev/rfd0c", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},  /* 720k */
X! 	{'A', "/dev/rfd0d", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
X! 	{'A', "/dev/rfd0e", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
X! 	{'A', "/dev/rfd0f", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8},  /* 320k */
X  	{'B', "/dev/rfd1a", 0L, 12, 0, (int (*) ()) 0, 80, 2, 18}, /* 1.44m */
X! 	{'B', "/dev/rfd1b", 0L, 12, 0, (int (*) ()) 0, 80, 2, 15}, /* 1.2m */
X! 	{'B', "/dev/rfd1c", 0L, 12, 0, (int (*) ()) 0, 80, 2, 9},  /* 720k */
X! 	{'B', "/dev/rfd1d", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
X! 	{'B', "/dev/rfd1e", 0L, 12, 0, (int (*) ()) 0, 40, 2, 9},  /* 360k */
X! 	{'B', "/dev/rfd1f", 0L, 12, 0, (int (*) ()) 0, 40, 2, 8},  /* 320k */
X  	{'\0', (char *) NULL, 0L, 0, 0, (int (*) ()) 0, 0, 0, 0}
X  };
X  #endif /* __386BSD__ */
END-of-mtools.dif
exit

-- 
  Frank van der Linden.                        Internet : vdlinden@fwi.uva.nl
* WARNING ---- The author of this message has once seen some AT&T Unix source *
* code, so now this message is probably copyrighted by them! You have been    *
* reading this entirely at your own risk..                                    *