diff -u --recursive --new-file v1.0.7/linux/CREDITS linux/CREDITS --- v1.0.7/linux/CREDITS Mon Mar 21 20:42:08 1994 +++ linux/CREDITS Thu Apr 7 08:14:56 1994 @@ -531,6 +531,14 @@ S: 97078 Wuerzburg S: Germany +N: Patrick Volkerding +E: volkerdi@ftp.cdrom.com +D: Produced the Slackware distribution, updated the SVGAlib +D: patches for ghostscript, worked on color 'ls', etc. +S: 301 15th Street S. +S: Moorhead, MN 56560 +S: USA + N: Juergen Weigert E: jnweiger@immd4.informatik.uni-erlangen.de D: The Linux Support Team Erlangen diff -u --recursive --new-file v1.0.7/linux/Makefile linux/Makefile --- v1.0.7/linux/Makefile Wed Apr 6 13:21:39 1994 +++ linux/Makefile Thu Apr 7 08:36:20 1994 @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 0 -SUBLEVEL = 7 +SUBLEVEL = 8 all: Version zImage diff -u --recursive --new-file v1.0.7/linux/drivers/scsi/fdomain.c linux/drivers/scsi/fdomain.c --- v1.0.7/linux/drivers/scsi/fdomain.c Sun Apr 3 14:58:23 1994 +++ linux/drivers/scsi/fdomain.c Thu Apr 7 07:50:25 1994 @@ -1,10 +1,10 @@ /* fdomain.c -- Future Domain TMC-16x0 SCSI driver * Created: Sun May 3 18:53:19 1992 by faith@cs.unc.edu - * Revised: Sun Jan 23 08:59:04 1994 by faith@cs.unc.edu + * Revised: Fri Apr 1 23:47:55 1994 by faith@cs.unc.edu * Author: Rickard E. Faith, faith@cs.unc.edu * Copyright 1992, 1993, 1994 Rickard E. Faith * - * $Id: fdomain.c,v 5.9 1994/01/23 13:59:14 root Exp $ + * $Id: fdomain.c,v 5.15 1994/04/02 04:48:04 root Exp $ * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,6 +16,10 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + ************************************************************************** DESCRIPTION: @@ -26,7 +30,7 @@ high-density external connector. The 1670 and 1680 have floppy disk controllers built in. - Future Domain's older boards are based on the TMC-1800 chip, and the + Future Domain's older boards are based on the TMC-1800 chip, and this driver was originally written for a TMC-1680 board with the TMC-1800 chip. More recently, boards are being produced with the TMC-18C50 chip. The latest and greatest board may not work with this driver. If you have @@ -34,6 +38,12 @@ signature, then the driver may fail to function after the board is detected. + The following BIOS versions are supported: 2.0, 3.0, 3.2, and 3.4. + The following chips are supported: TMC-1800, TMC-18C50. + Reports suggest that the driver will also work with the TMC-18C30 chip. + The support for the version 3.4 BIOS is new, as of March 1994, and may not + be stable. + If you have a TMC-8xx or TMC-9xx board, then this is not the driver for your board. Please refer to the Seagate driver for more information and possible support. @@ -60,6 +70,16 @@ Private communications, Drew Eckhardt (drew@cs.colorado.edu) and Eric Youngdale (eric@tantalus.nrl.navy.mil), 1992. + Private communication, Tuong Le (Future Domain Engineering department), + 1994. (Disk geometry computations for Future Domain BIOS version 3.4, and + TMC-18C30 detection.) + + Hogan, Thom. The Programmer's PC Sourcebook. Microsoft Press, 1988. Page + 60 (2.39: Disk Partition Table Layout). + + "18C30 Technical Reference Manual", Future Domain Corporation, 1993, page + 6-1. + NOTES ON REFERENCES: @@ -95,6 +115,9 @@ his 18C50-based card for debugging. He is the sole reason that this driver works with the 18C50 chip. + Thanks to Dave Newman (dnewman@crl.com) for providing initial patches for + the version 3.4 BIOS. + All of the alpha testers deserve much thanks. @@ -128,11 +151,12 @@ of the two race conditions which were introduced by multiple outstanding commands). The instability seems a very high price to pay just so that you don't have to wait for the tape to rewind. When I have time, I will - work on this again. In the interim, if anyone want to work on the code, I - can give them my latest version. + work on this again. In the interim, if anyone wants to work on the code, + I can give them my latest version. **************************************************************************/ +#include #include #include #include "../block/blk.h" @@ -144,7 +168,7 @@ #include #include -#define VERSION "$Revision: 5.9 $" +#define VERSION "$Revision: 5.15 $" /* START OF USER DEFINABLE OPTIONS */ @@ -189,6 +213,7 @@ unknown = 0x00, tmc1800 = 0x01, tmc18c50 = 0x02, + tmc18c30 = 0x03, }; enum { @@ -204,15 +229,15 @@ Read_SCSI_Data = 0, SCSI_Status = 1, TMC_Status = 2, - FIFO_Status = 3, /* tmc18c50 only */ - Interrupt_Cond = 4, /* tmc18c50 only */ + FIFO_Status = 3, /* tmc18c50/tmc18c30 only */ + Interrupt_Cond = 4, /* tmc18c50/tmc18c30 only */ LSB_ID_Code = 5, MSB_ID_Code = 6, Read_Loopback = 7, SCSI_Data_NoACK = 8, Interrupt_Status = 9, Configuration1 = 10, - Configuration2 = 11, /* tmc18c50 only */ + Configuration2 = 11, /* tmc18c50/tmc18c30 only */ Read_FIFO = 12, FIFO_Data_Count = 14 }; @@ -223,8 +248,9 @@ Interrupt_Cntl = 2, SCSI_Mode_Cntl = 3, TMC_Cntl = 4, - Memory_Cntl = 5, /* tmc18c50 only */ + Memory_Cntl = 5, /* tmc18c50/tmc18c30 only */ Write_Loopback = 7, + IO_Control = 11, /* tmc18c30 only */ Write_FIFO = 12 }; @@ -278,8 +304,9 @@ READ EVERY WORD, ESPECIALLY THE WORD *NOT* - This driver works *ONLY* for Future Domain cards using the TMC-1800 or - the TMC-18C50 chip. This includes models TMC-1650, 1660, 1670, and 1680. + This driver works *ONLY* for Future Domain cards using the TMC-1800, + TMC-18C50, or TMC-18C30 chip. This includes models TMC-1650, 1660, 1670, + and 1680. The following BIOS signature signatures are for boards which do *NOT* work with this driver (these TMC-8xx and TMC-9xx boards may work with the @@ -308,6 +335,7 @@ { "FUTURE DOMAIN CORP. (C) 1986-1990 1800-V1.07/28/89", 5, 50, 2, 0 }, { "FUTURE DOMAIN CORP. (C) 1992 V3.00.004/02/92", 5, 44, 3, 0 }, { "FUTURE DOMAIN TMC-18XX (C) 1993 V3.203/12/93", 5, 44, 3, 2 }, + { "Future Domain Corp. V1.0008/18/93", 5, 33, 3, 4 }, { "FUTURE DOMAIN TMC-18XX", 5, 22, -1, -1 }, /* READ NOTICE ABOVE *BEFORE* YOU WASTE YOUR TIME ADDING A SIGANTURE @@ -331,7 +359,8 @@ printk( "Future Domain: BIOS version %d.%d, %s\n", bios_major, bios_minor, chip == tmc1800 ? "TMC-1800" - : (chip == tmc18c50 ? "TMC-18C50" : "Unknown") ); + : (chip == tmc18c50 ? "TMC-18C50" + : (chip == tmc18c30 ? "TMC-18C30" : "Unknown")) ); if (interrupt_level) { printk( "Future Domain: BIOS at %x; port base at %x; using IRQ %d\n", @@ -353,7 +382,7 @@ { outb( 0, SCSI_Cntl_port ); outb( 0, SCSI_Mode_Cntl_port ); - if (chip == tmc18c50) + if (chip == tmc18c50 || chip == tmc18c30) outb( 0x21 | PARITY_MASK, TMC_Cntl_port ); /* Clear forced intr. */ else outb( 0x01 | PARITY_MASK, TMC_Cntl_port ); @@ -381,6 +410,28 @@ } else { /* test for 0xe960 id */ if (inb( port + MSB_ID_Code ) != 0x60) return 0; chip = tmc18c50; + +#if 0 + + /* Try to toggle 32-bit mode. This only + works on an 18c30 chip. (User reports + say that this doesn't work at all, so + we'll use the other method.) */ + + outb( 0x80, port + IO_Control ); + if (inb( port + Configuration2 ) & 0x80 == 0x80) { + outb( 0x00, port + IO_Control ); + if (inb( port + Configuration2 ) & 0x80 == 0x00) chip = tmc18c30; + } +#else + + /* That should have worked, but appears to + have problems. Lets assume it is an + 18c30 if the RAM is disabled. */ + + if (inb( port + Configuration2 ) & 0x02) chip = tmc18c30; +#endif + /* If that failed, we are an 18c50. */ } /* We have a valid MCA ID for a TMC-1660/TMC-1680 Future Domain board. @@ -395,9 +446,13 @@ printk( " Options = %x\n", options ); #endif - /* Check for board with lowest bios_base. */ - if (addresses[ (options & 0xc0) >> 6 ] != bios_base) + /* Check for board with lowest bios_base -- + this isn't valid for the 18c30, so just + assume we have the right board. */ + + if (chip != tmc18c30 && addresses[ (options & 0xc0) >> 6 ] != bios_base) return 0; + interrupt_level = ints[ (options & 0x0e) >> 1 ]; return 1; @@ -705,7 +760,7 @@ printk( "Arbitration failed, status = %x\n", status ); #endif #if ERRORS_ONLY - printk( "Future Domain: Arbitration failed, status = %x", status ); + printk( "Future Domain: Arbitration failed, status = %x\n", status ); #endif return 1; } @@ -723,7 +778,11 @@ /* Stop arbitration and enable parity */ outb( PARITY_MASK, TMC_Cntl_port ); +#if 0 timeout = jiffies + 25; /* 250mS */ +#else + timeout = jiffies + 35; /* 350mS -- because of timeouts */ +#endif while (jiffies < timeout) { status = inb( SCSI_Status_port ); /* Read adapter status */ if (status & 1) { /* Busy asserted */ @@ -738,7 +797,7 @@ if (!target) printk( "Selection failed\n" ); #endif #if ERRORS_ONLY - if (!target) printk( "Future Domain: Selection failed" ); + if (!target) printk( "Future Domain: Selection failed\n" ); #endif return 1; } @@ -858,13 +917,13 @@ current_SC->cmnd[ current_SC->SCp.sent_command - 1] ); #endif break; - case 0x00: /* DATA OUT -- tmc18c50 only */ + case 0x00: /* DATA OUT -- tmc18c50/tmc18c30 only */ if (chip != tmc1800 && !current_SC->SCp.have_data_in) { current_SC->SCp.have_data_in = -1; outb( 0xd0 | PARITY_MASK, TMC_Cntl_port ); } break; - case 0x04: /* DATA IN -- tmc18c50 only */ + case 0x04: /* DATA IN -- tmc18c50/tmc18c30 only */ if (chip != tmc1800 && !current_SC->SCp.have_data_in) { current_SC->SCp.have_data_in = 1; outb( 0x90 | PARITY_MASK, TMC_Cntl_port ); @@ -1315,13 +1374,13 @@ if (inb( Interrupt_Status_port ) & 0x08) printk( " (enabled)" ); printk( "\n" ); - if (chip == tmc18c50) { + if (chip == tmc18c50 || chip == tmc18c30) { printk( "FIFO Status = 0x%02x\n", inb( port_base + FIFO_Status ) ); printk( "Int. Condition = 0x%02x\n", inb( port_base + Interrupt_Cond ) ); } printk( "Configuration 1 = 0x%02x\n", inb( port_base + Configuration1 ) ); - if (chip == tmc18c50) + if (chip == tmc18c50 || chip == tmc18c30) printk( "Configuration 2 = 0x%02x\n", inb( port_base + Configuration2 ) ); } @@ -1396,9 +1455,20 @@ return 0; } +#ifdef CONFIG_BLK_DEV_SD + +#include "sd.h" +#include "scsi_ioctl.h" + int fdomain_16x0_biosparam( int size, int dev, int *info_array ) { - int drive; + int drive; + unsigned char buf[512 + sizeof( int ) * 2]; + int *sizes = (int *)buf; + unsigned char *data = (unsigned char *)(sizes + 2); + unsigned char do_read[] = { READ_6, 0, 0, 0, 1, 0 }; + int retcode; + Scsi_Device *disk; struct drive_info { unsigned short cylinders; unsigned char heads; @@ -1438,43 +1508,84 @@ */ drive = MINOR(dev) / 16; + disk = rscsi_disks[ drive ].device; if (bios_major == 2) { i = (struct drive_info *)( (char *)bios_base + 0x1f31 + drive * 25 ); info_array[0] = i->heads; info_array[1] = i->sectors; info_array[2] = i->cylinders; - } else if (bios_major == 3) { /* Appears to be the same for 3.0 and 3.2 */ - i = (struct drive_info *)( (char *)bios_base + 0x1f71 + drive * 10 ); - info_array[0] = i->heads + 1; - info_array[1] = i->sectors; - info_array[2] = i->cylinders; - } else { - /* How the data is stored in the RAM area is very BIOS-dependent. - Therefore, assume a version 3 layout, and check for validity. */ - + } else if (bios_major == 3 && bios_minor < 4) { /* 3.0 and 3.2 BIOS */ i = (struct drive_info *)( (char *)bios_base + 0x1f71 + drive * 10 ); info_array[0] = i->heads + 1; info_array[1] = i->sectors; info_array[2] = i->cylinders; + } else { /* 3.4 BIOS (and up?) */ + /* This algorithm was provided by Future Domain (much thanks!). */ - if (!info_array[0] - || !info_array[1] - || !info_array[2] - || info_array[2] > 1024 /* DOS uses only 10 bits. - Should this be changed - to support larger drives? - I.e., will the controller - "do the right thing"? - */ - ) { - - info_array[0] - = info_array[1] - = info_array[2] - = 0; + sizes[0] = 0; /* zero bytes out */ + sizes[1] = 512; /* one sector in */ + memcpy( data, do_read, sizeof( do_read ) ); + retcode = kernel_scsi_ioctl( disk, + SCSI_IOCTL_SEND_COMMAND, + (void *)buf ); + if (!retcode /* SCSI command ok */ + && data[511] == 0xaa && data[510] == 0x55 /* Partition table valid */ + && data[0x1c2]) { /* Partition type */ + + /* The partition table layout is as follows: + + Start: 0x1b3h + Offset: 0 = partition status + 1 = starting head + 2 = starting sector and cylinder (word, encoded) + 4 = partition type + 5 = ending head + 6 = ending sector and cylinder (word, encoded) + 8 = starting absolute sector (double word) + c = number of sectors (double word) + Signature: 0x1fe = 0x55aa + + So, this algorithm assumes: + 1) the first partition table is in use, + 2) the data in the first entry is correct, and + 3) partitions never divide cylinders + + Note that (1) may be FALSE for NetBSD (and other BSD flavors), + as well as for Linux. Note also, that Linux doesn't pay any + attention to the fields that are used by this algorithm -- it + only uses the absolute sector data. Recent versions of Linux's + fdisk(1) will fill this data in correctly, and forthcoming + versions will check for consistency. + + Checking for a non-zero partition type is not part of the + Future Domain algorithm, but it seemed to be a reasonable thing + to do, especially in the Linux and BSD worlds. */ + + info_array[0] = data[0x1c3] + 1; /* heads */ + info_array[1] = data[0x1c4] & 0x3f; /* sectors */ + } else { + + /* Note that this new method guarantees that there will always be + less than 1024 cylinders on a platter. This is good for drives + up to approximately 7.85GB (where 1GB = 1024 * 1024 kB). */ + + if ((unsigned int)size >= 0x7e0000U) { + info_array[0] = 0xff; /* heads = 255 */ + info_array[1] = 0x3f; /* sectors = 63 */ + } else if ((unsigned int)size >= 0x200000U) { + info_array[0] = 0x80; /* heads = 128 */ + info_array[1] = 0x3f; /* sectors = 63 */ + } else { + info_array[0] = 0x40; /* heads = 64 */ + info_array[1] = 0x20; /* sectors = 32 */ + } } + /* For both methods, compute the cylinders */ + info_array[2] = (unsigned int)size / (info_array[0] * info_array[1] ); } return 0; } + +#endif /* CONFIG_BLK_DEV_SD */ diff -u --recursive --new-file v1.0.7/linux/drivers/scsi/fdomain.h linux/drivers/scsi/fdomain.h --- v1.0.7/linux/drivers/scsi/fdomain.h Wed Jan 5 08:18:50 1994 +++ linux/drivers/scsi/fdomain.h Thu Apr 7 07:50:25 1994 @@ -1,10 +1,10 @@ /* fdomain.h -- Header for Future Domain TMC-16x0 driver * Created: Sun May 3 18:47:33 1992 by faith@cs.unc.edu - * Revised: Tue Jan 4 20:44:04 1994 by faith@cs.unc.edu + * Revised: Sat Mar 19 16:07:14 1994 by faith@cs.unc.edu * Author: Rickard E. Faith, faith@cs.unc.edu * Copyright 1992, 1993, 1994 Rickard E. Faith * - * $Id: fdomain.h,v 5.3 1994/01/05 01:44:16 root Exp $ + * $Id: fdomain.h,v 5.5 1994/03/19 21:07:38 root Exp $ * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -16,6 +16,10 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 675 Mass Ave, Cambridge, MA 02139, USA. + */ #ifndef _FDOMAIN_H @@ -27,7 +31,12 @@ const char *fdomain_16x0_info( void ); int fdomain_16x0_reset( Scsi_Cmnd * ); int fdomain_16x0_queue( Scsi_Cmnd *, void (*done)(Scsi_Cmnd *) ); + +#ifdef CONFIG_BLK_DEV_SD int fdomain_16x0_biosparam( int, int, int * ); +#else +#define fdomain_16x0_biosparam NULL +#endif #define FDOMAIN_16X0 { "Future Domain TMC-16x0", \ fdomain_16x0_detect, \ diff -u --recursive --new-file v1.0.7/linux/net/inet/tcp.c linux/net/inet/tcp.c --- v1.0.7/linux/net/inet/tcp.c Wed Apr 6 13:13:35 1994 +++ linux/net/inet/tcp.c Thu Apr 7 07:51:05 1994 @@ -3407,7 +3407,6 @@ case TCP_SYN_RECV: if (th->syn) { /* Probably a retransmitted syn */ - printk("syn while in TCP_SYN_RECV\n"); kfree_skb(skb, FREE_READ); release_sock(sk); return(0);