I would like to thank all of the people that have been testing out these patches for me. This verion represents what is very nearly a "finished" work (if that can be acheived). Here is a run down of this patch: Note: this patch applies against kernel 2.0.31-pre-7 Changes: aic7xxx_abort(): Totally re-written from the ground up. I think the only original code remaining is the prototye, the open and close brace, and a few variable definitions. aic7xxx_reset(): See above. Internal helper functions for aic7xxx_{abort,reset}: In some cases, these are totally re-written as well, in others, they are just modified to fit the new abort/reset schema. aic7xxx_handle_seqint(): Modified to handle new abort/reset code as well as improving the QUEUE_FULL and BUSY condition error handling. Corrected handling of CHECK_CONDITION when we are sending an SDTR or WDTR message to the target. aic7xxx_handle_scsiint(): Modifications to the BUS_FREE handler as part of abort/reset fixes. aic7xxx_handle_device_reset(): Modified for new reset schema. aic7xxx_bus_device_reset(): Modified for new schema, simplified due to a a reduced set of conditions under which this function can be called. aic7xxx_isr(): Slight modifications to the CMDOUTCNT variable handling to avoid some race conditions that were causing problems. aic7xxx_queue(): Modified to handle devices with delayed SCB queues. aic7xxx_run_waiting_queues(): See above. aic7xxx_timer(): New function added as part of QUEUE_FULL and BUSY handling. aic7xxx_detect(): Added a boot time message, fixed an off by one memory scribble, and added some new initialization code for new variables. aic7xxx_proc.c: New file from Heinz Mauelshagen incorporated to fix a serious memory overflow error, then later modified by me to remove the need to make two passes through our structures and calls to sprintf in order to determine buffer size. aic7xxx_done(): Modified for new handling of abort/reset scbs and the added variables brought out by QUEUE_FULL and BUSY handling. aic7xxx_search_qinfifo(): Modified to allow an arbitrary destination queue for SCBs that need to be requeued. Also modified to preserve the SCB_RECOVERY_SCB flag regardless of passed in SCB flags. aic7xxx_buildscb(): Modified to create fake SCSI commands to perform negotiation with if the real SCSI command is not a TEST_UNIT_READY command. aic7xxx_fake_scsi_done(): Used to free the fake commands we created in aic7xxx_buildscb(). aic7xxx.c: Increased MAX_SG from 27 to 122 for performance reasons. Changes to printk's throughout in order to better organize messages according to the selected aic7xxx=verbose level. Incremented version level in order to differentiate this code from the stock aic7xxx driver. aic7xxx.h: Added back our support for the aic7xxx_abort function. Config.in: Changed the default settings for the aic7xxx driver to reflect things that used to be broken but now work reliably. Configure.help: Added help items for the aic7xxx config options. Probably others that I can't remember right now, and I don't want to go looking through the diff file just to list them here. Problems fixed: 1. Abort/reset loops and machine lockups should be greatly reduced with this patch. Actually, loops should be gone, but it is still possible to hang a machine if the drive simply goes away (not really a driver issue). 2. QUEUE_FULL handling should work much better now. No more drives simply refusing to live any longer because we slammed them with commands so quickly that they could never finish they ones they already had in their full queues. 3. BUSY condition handling, see above. 4. Driver blows up on certain devices during negotiation. Shouldn't happen any more. Also shouldn't matter any more if a person enables wide negotiation with early devices that don't know what wide busses are. The analogous situation for synchronous transfers should also be true. 5. Memory overflows from aic7xxx_proc.c should be gone. 6. Memory scribble during init is gone. 7. We no longer show transfer stats on devices that don't exist when proc statistics is enabled. 8. aic7xxx=verbose setting is no longer on/off, but is instead cumulative such that higher verbosity levels result in more printed messages. I recommend the setting aic7xxx=verbose:1 for general use and aic7xxx=verbose:2 or 3 for debugging. 9. Spurious CMDCMPLT with no CMD for SCB messages should be gone. Known bugs: 1. A rare command underflow bug with certain brand/model of drives. This most likely won't get fixed without a SCSI bus analyzer. 2. A rare condition with certain brand/model drives that can cause an outgoing command to fail with an unexpected BUSFREE condition. We handle this in the driver, but would need to change the sequencer to actually solve the problem. I've only seen this one once in about 30 days of hard testing, so it may not even be worth fixing.