[2426] in linux-scsi channel archive

home help back first fref pref prev next nref lref last post

aic7xxx patch

daemon@ATHENA.MIT.EDU (Doug Ledford)
Sat Sep 6 04:57:26 1997

To: linux-kernel@vger.rutgers.edu
cc: linux-scsi@vger.rutgers.edu
Date: 	Fri, 05 Sep 1997 18:40:09 -0500
From: Doug Ledford <dledford@dialnet.net>


As many of you may recall, I've recently been working on a patch to the 
aic7xxx driver to improve several aspects of that driver's reliability.  At 
this point, I think I've reached a decent place to stop current development 
and only make changes to the driver as any bug reports in the current patch 
filter in.  The current version of the patch is aic7xxx-abort-Sep05, and a 
diffstat on the patch looks like this:

 Documentation/Configure.help |   78 +
 drivers/scsi/Config.in       |    4 
 drivers/scsi/aic7xxx.c       | 2273 ++++++++++++++++++++++++++-------------
 drivers/scsi/aic7xxx.h       |    5 
 drivers/scsi/aic7xxx_proc.c  |  224 +---
 5 files changed, 1663 insertions, 921 deletions

People interested in trying this patch can find it at ftp.dialnet.net in 
/pub/linux/aic7xxx.  Included here as well is the readme file associated 
with this patch to give an idea of what changes exactly have taken place, 
what problems were fixed, and a list of the current known bugs.

[ aic7xxx-abort-Sep05.README ]

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.







-- 
*****************************************************************************
* Doug Ledford                      *   Unix, Novell, Dos, Windows 3.x,     *
* dledford@dialnet.net    873-DIAL  *     WfW, Windows 95 & NT Technician   *
*   PPP access $14.95/month         *****************************************
*   Springfield, MO and surrounding * Usenet news, e-mail and shell account.*
*   communities.  Sign-up online at * Web page creation and hosting, other  *
*   873-9000 V.34                   * services available, call for info.    *
*****************************************************************************



home help back first fref pref prev next nref lref last post