UPDATE NEWS: version 1.33 - 26 Aug 98 Interrupt management in this driver has become, over time, increasingly odd and difficult to explain - this has been mostly due to my own mental inadequacies. In recent kernels, it has failed to function at all when compiled for SMP. I've fixed that problem, and after taking a fresh look at interrupts in general, greatly reduced the number of places where they're fiddled with. Done some heavy testing and it looks very good. The driver now makes use of the __initfunc() and __initdata macros to save about 4k of kernel memory. Once again, the same code works for both 2.0.xx and 2.1.xx kernels. UPDATE NEWS: version 1.32 - 28 Mar 98 Removed the check for legal IN2000 hardware versions: It appears that the driver works fine with serial EPROMs (the 8-pin chip that defines hardware rev) as old as 2.1, so we'll assume that all cards are OK. UPDATE NEWS: version 1.31 - 6 Jul 97 Fixed a bug that caused incorrect SCSI status bytes to be returned from commands sent to LUNs greater than 0. This means that CDROM changers work now! Fixed a bug in the handling of command-line arguments when loaded as a module. Also put all the header data in in2000.h where it belongs. There are no longer any differences between this driver in the 2.1.xx source tree and the 2.0.xx tree, as of 2.0.31 and 2.1.45 (or is it .46?) - this makes things much easier for me... UPDATE NEWS: version 1.30 - 14 Oct 96 Fixed a bug in the code that sets the transfer direction bit (DESTID_DPD in the WD_DESTINATION_ID register). There are quite a few SCSI commands that do a write-to-device; now we deal with all of them correctly. Thanks to Joerg Dorchain for catching this one. UPDATE NEWS: version 1.29 - 24 Sep 96 The memory-mapped hardware on the card is now accessed via the 'readb()' and 'readl()' macros - required by the new memory management scheme in the 2.1.x kernel series. As suggested by Andries Brouwer, 'bios_param()' no longer forces an artificial 1023 track limit on drives. Also removed some kludge-code left over from struggles with older (buggy) compilers. UPDATE NEWS: version 1.28 - 07 May 96 Tightened up the "interrupts enabled/disabled" discipline in 'in2000_queuecommand()' and maybe 1 or 2 other places. I _think_ it may have been a little too lax, causing an occasional crash during full moon. A fully functional /proc interface is now in place - if you want to play with it, start by doing 'cat /proc/scsi/in2000/0'. You can also use it to change a few run-time parameters on the fly, but it's mostly for debugging. The curious should take a good look at 'in2000_proc_info()' in the in2000.c file to get an understanding of what it's all about; I figure that people who are really into it will want to add features suited to their own needs... Also, sync is now DISABLED by default. UPDATE NEWS: version 1.27 - 10 Apr 96 Fixed a well-hidden bug in the adaptive-disconnect code that would show up every now and then during extreme heavy loads involving 2 or more simultaneously active devices. Thanks to Joe Mack for keeping my nose to the grindstone on this one. UPDATE NEWS: version 1.26 - 07 Mar 96 1.25 had a nasty bug that bit people with swap partitions and tape drives. Also, in my attempt to guess my way through Intel assembly language, I made an error in the inline code for IO writes. Made a few other changes and repairs - this version (fingers crossed) should work well. UPDATE NEWS: version 1.25 - 05 Mar 96 Kernel 1.3.70 interrupt mods added; old kernels still OK. Big help from Bill Earnest and David Willmore on speed testing and optimizing: I think there's a real improvement in this area. New! User-friendly command-line interface for LILO and module loading - the old method is gone, so you'll need to read the comments for 'setup_strings' near the top of in2000.c. For people with CDROM's or other devices that have a tough time with sync negotiation, you can now selectively disable sync on individual devices - search for the 'nosync' keyword in the command-line comments. Some of you disable the BIOS on the card, which caused the auto-detect function to fail; there is now a command-line option to force detection of a ROM-less card. UPDATE NEWS: version 1.24a - 24 Feb 96 There was a bug in the synchronous transfer code. Only a few people downloaded before I caught it - could have been worse. UPDATE NEWS: version 1.24 - 23 Feb 96 Lots of good changes. Advice from Bill Earnest resulted in much better detection of cards, more efficient usage of the fifo, and (hopefully) faster data transfers. The jury is still out on speed - I hope it's improved some. One nifty new feature is a cool way of doing disconnect/ reselect. The driver defaults to what I'm calling 'adaptive disconnect' - meaning that each command is evaluated individually as to whether or not it should be run with the option to disconnect/reselect (if the device chooses), or as a "SCSI-bus-hog". When several devices are operating simultaneously, disconnects are usually an advantage. In a single device system, or if only 1 device is being accessed, transfers usually go faster if disconnects are not allowed. The default arguments (you get these when you don't give an 'in2000' command-line argument, or you give a blank argument) will cause the driver to do adaptive disconnect, synchronous transfers, and a minimum of debug messages. If you want to fool with the options, search for 'setup_strings' near the top of the in2000.c file and check the 'hostdata->args' section in in2000.h - but be warned! Not everything is working yet (some things will never work, probably). I believe that disabling disconnects (DIS_NEVER) will allow you to choose a LEVEL2 value higher than 'L2_BASIC', but I haven't spent a lot of time testing this. You might try 'ENABLE_CLUSTERING' to see what happens: my tests showed little difference either way. There's also a define called 'DEFAULT_SX_PER'; this sets the data transfer speed for the asynchronous mode. I've put it at 500 ns despite the fact that the card could handle settings of 376 or 252, because higher speeds may be a problem with poor quality cables or improper termination; 500 ns is a compromise. You can choose your own default through the command-line with the 'period' keyword. ------------------------------------------------ *********** DIP switch settings ************** ------------------------------------------------ sw1-1 sw1-2 BIOS address (hex) ----------------------------------------- off off C8000 - CBFF0 on off D8000 - DBFF0 off on D0000 - D3FF0 on on BIOS disabled sw1-3 sw1-4 IO port address (hex) ------------------------------------ off off 220 - 22F on off 200 - 20F off on 110 - 11F on on 100 - 10F sw1-5 sw1-6 sw1-7 Interrupt ------------------------------ off off off 15 off on off 14 off off on 11 off on on 10 on - - disabled sw1-8 function depends on BIOS version. In earlier versions this controlled synchronous data transfer support for MSDOS: off = disabled on = enabled In later ROMs (starting with 01.3 in April 1994) sw1-8 controls the "greater than 2 disk drive" feature that first appeared in MSDOS 5.0 (ignored by Linux): off = 2 drives maximum on = 7 drives maximum sw1-9 Floppy controller -------------------------- off disabled on enabled ------------------------------------------------ I should mention that Drew Eckhardt's 'Generic NCR5380' sources were my main inspiration, with lots of reference to the IN2000 driver currently distributed in the kernel source. I also owe much to a driver written by Hamish Macdonald for Linux-m68k(!). And to Eric Wright for being an ALPHA guinea pig. And to Bill Earnest for 2 tons of great input and information. And to David Willmore for extensive 'bonnie' testing. And to Joe Mack for continual testing and feedback. John Shifflett jshiffle@netcom.com