Commit Graph

82 Commits

Author SHA1 Message Date
Justin T. Gibbs
0262313ddc Merge in changes for NetBSD/OpenBSD.
Add a panic for attempts to page in a non paged out SCB.

Re-order some of the interrupt routine for better performance.

NetBSD/OpenBSD support Submitted by:Noriyuki Soda <soda@sra.co.jp>,
				    Pete Bentley <pete@demon.net>,
				    Charles M. Hannum <mycroft@mit.edu>,
				    Theo de Raadt <deraadt@theos.com>
1996-05-30 07:19:59 +00:00
Justin T. Gibbs
087b79e649 Correct a botched commit from yesturday. It helps to bring over the
right patch file.<sigh>
1996-05-23 15:02:18 +00:00
Justin T. Gibbs
393ca4686c Setup ULTRAEN in SXFRCTL0 to match the syncrate we are using during the
call of ahc_scsirate.  Otherwise, the proper setting may not get set until
the next reconnection/selection.

The saved_queue used to re-order the QINFIFO during error recovery or
certain SCB paging operations should be an array of u_chars not ints.

saved_queue type error pointed out by: Noriyuki Soda <soda@sra.co.jp>
1996-05-22 15:32:28 +00:00
Dima Ruban
2dfdc2cd79 "board not responding" -> "board is not responding"
Reviewed by:	gibbs
1996-05-22 00:04:12 +00:00
Justin T. Gibbs
f6ca14f03c Enable/Disable Ultra mode on a per target basis. This allows the driver
to use the full range of settings from 3.6-20MHz on any target.

Remove all Ultra settings except for the top three that are documented
to work.  This fixes some problem reports with the last revision of the
driver since at least the 5.7MHz entry doesn't work in Ultra mode.
1996-05-21 18:37:25 +00:00
Justin T. Gibbs
efaafa27d3 Honor the CHANNEL_B_PRIMARY bit of the BIOSCTRL register and probe
channel B first as approriate.

Only reset the SCSI bus if the RESET_SCSI bit of SCSICONF is set.  This
makes the aic7xxx driver honor all of the configuration settings availible
in SCSI-Select or the ECU.

Fix a benign bug in the reset code that caused us to always wait a full
second after the chip reset.  This should shave some time off the probe.
Bug found by pedrosal@nce.ufrj.br (Pedro Salenbauch)

It seems that only the top three sync rates are doubled when in ultra mode,
so update the syncrates table as appropriate.
Found by "Dan Willis" <dan@plutotech.com> and his SCSI bus analyzer
1996-05-10 16:21:05 +00:00
Justin T. Gibbs
a515c85818 Fix the abort code in the BUS DEVICE RESET case. Needed to set cmdlen to 0.
Ensure that queued commands are not touched by the abort code by setting
the SCB status to indicate what queue it is in.

Fix deadlocks when using SCB paging by using SCBs from the assigned_scbs
queue or an SCB that completed during the same interrupt if needed.

Don't ever use insl to pull SCBs from any of the controllers.  You can
only do 8bit PIO reads.  This only affected SCB paging.

With this checkin, SCB paging works quite a bit better, but I still have
some problems with it that may be caused by a firmware problem in my
PD1800s.  It seems that using a tag number higher than the maximum number
of tags allowed by the device, confuses it.  For example, if I queue
two commands, tagged 3 and 36, it never reconnects for tag 36.
1996-04-28 19:21:20 +00:00
Justin T. Gibbs
c0eccc00c8 Fix second instance of the inb type when getting the current sequencer address.
Submitted by:	Nate Williams <nate@sri.MT.net>
1996-04-23 04:47:02 +00:00
Justin T. Gibbs
ff3f23849e Fix a typo in the RESTART_SEQUENCER macro that could have caused
strange results.  This  bug has been in here for a loooong time.
Many thanks to Pedro Salenbauch for finding this.

Submitted by:	pedrosal@nce.ufrj.br (Pedro Salenbauch)
1996-04-23 04:22:41 +00:00
Justin T. Gibbs
91e2481238 The default number of tags in the SCB paging case was supposed to be
8 not the 18 I was using during some of my own testing.  Ooops.

For those that want to change the number for experimentation, you can
set the value on line 1553 of this file.
1996-04-22 13:21:40 +00:00
Justin T. Gibbs
102d19a473 Implement SCB paging which allows up to 255 active commands on aic7770
(Rev E or greater), aic7850, aic7860, aic7870, and aic7880 controllers.
SCB paging is enabled with the option "AHC_SCBPAGING_ENABLE".  Full
comments on the algorithm are at the top of i386/scsi/aic7xxx.c.

options "AHC_TAGENABLE" and "AHC_QUEUE_FULL" have been removed.  The
default is 4 tags without SCB paging, 8 with.

Clear the SCSIRSTI bit after throwing a bus reset.  Some cards seem to get
confused otherwise.

Handle SCSIRSTI interrupts before checking to see if there is a valid
SCB in use since this can happen. (Clears PR# i386/1123)

Clean up the way we determine the number of SCBs on the card
(courtesy of Dan Eischen).

Guard against attempts to negotiate wide to a narrow controller.

Fix some comments.

Update my copyrights.
1996-04-20 21:29:27 +00:00
Bruce Evans
860ff32995 Moved declaration of bootverbose to a better place. Externs should
only be declared in headers.
1996-04-07 16:45:36 +00:00
Justin T. Gibbs
716a0bd94a Convert to use stdarg in bt_cmd. Use XS_SELTIMEOUT for selection timeouts.
Obtained from: stdarg fixes adapted from cgd's work on the NetBSD BT driver
1996-03-31 18:19:50 +00:00
Justin T. Gibbs
6e9d1d8bb6 Fix support for the aic7850 by looking only at the relavent bits of the
QINCNT.  The 7850 puts random garbage in the high bits and all my attempts
to determine the cause of this failed.  This approach does seem to work
around the problem.

Go back to relying on the SCSIPERR interrupt instead of having the sequencer
interrupt at the beginning of ITloop after a parity error occured.

Determine the number of SCBs on a card automatically and base the qcntmask
on the number of SCBs.

Add entries for 11.4MHz, 8.8MHz, 8.0MHz, and 7.2MHz to ULTRA portion of
the syncrate table.  They seem to work fine on the 2940UW I have here and
will allow more non-ultra devices (like my tape drive) to run sync while
the adapter is in ULTRA mode.

Return XS_SELTIMEOUT instead of XS_TIMEOUT for selection timeouts.  I was
getting sick of waiting for the SCSI code to retry each non-existant unit
multiple times during boot and XS_SELTIMEOUT bypasses all retries.

Use new SLIST queue macros.  This was inspired by NetBSD using TAILQs in
their SCSI drivers.  For optimum cache hits, the free scb list should
be LIFO which is what the old and new code does.  NetBSD implemented a
FIFO queue for some reason.

Spaces -> tabs.
1996-03-31 03:15:31 +00:00
Poul-Henning Kamp
cb82e804a5 Remove an unused #define.
Requested by: davidg
1996-03-23 11:29:20 +00:00
Justin T. Gibbs
8eb0f56311 Disable SCSI parity checking until we figure out why the aic78X0 generates
them incorrectly in some Wide scenarios.
1996-03-22 16:26:26 +00:00
Justin T. Gibbs
66792b2e44 Disable the selection hardware before acknowledging a SELTO interrupt.
It seems the 7880 gets confused if you don't do this.
1996-03-11 02:48:41 +00:00
Justin T. Gibbs
9dfa2063d5 bt.c, aic7xxx.c:
Cleanse the SCSI subsystem of its internally defined types
	u_int32, u_int16, u_int8, int32, int16, int8.
	Use the system defined *_t types instead.

aic7xxx.c:
	Fix the reset code.
	Instead of queing up all of the SCBs that timeout during timeout
	processing, we take the first and have it champion the effort.
	Any other scbs that timeout during timeout handling are given
	another lifetime to complete in the hopes that once timeout
	handing is finished, they will complete normally.  If one of
	these SCBs times out a second time, we panic and Justin tries
	again.

	The other major change is to queue flag aborted SCBs during timeout
	handling, and "ahc_done" them all at once as soon as we have the
	controller back into a sane state.  Calling ahc_done any earlier
	will cause the SCSI subsystem to toss the command right back at
	us and the attempt to queue the command will conflict with what
	the timeout routine is trying to accomplish.

	The aic7xxx driver will now respond to bus resets initiated by
	other devices.
1996-03-10 07:11:45 +00:00
Justin T. Gibbs
ef83c41f6d Return immediately in our interrupt handler if there is nothing to do.
This allows shared interrupts to work.

Submitted by: greg@greg.rim.or.jp
1996-02-18 07:45:36 +00:00
Justin T. Gibbs
34b72528fe Allow I/O port ranges above the standard ISA one so the PCI probe will succeed.
Reviewed by:  Richard J Kuhns <rjk@sparcmill.grauel.com>
1996-02-16 17:24:19 +00:00
Mike Pritchard
6c5e9bbdf5 Fix a bunch of spelling errors in the comment fields of
a bunch of system include files.
1996-01-30 23:02:38 +00:00
Justin T. Gibbs
4697fd511e Changes to support Performance enhancements in the sequencer.
Bring back the polling code (for dumps mostly), but protect it
with splbio() to make it safe for reprobes.
1996-01-29 03:17:39 +00:00
Joerg Wunsch
11b61c4563 Correctly initialize the `btprobing' variable. It's always been 0,
causing a bogus error message to appear if no board has been fond.
1996-01-25 23:03:07 +00:00
Stefan Eßer
dd7610fca4 Make PCI interrupt handlers return void like everybody else does.
Reviewed by:	davidg
1996-01-23 21:48:28 +00:00
Justin T. Gibbs
7faea34be2 Use the new adapter_softc field in the scsi_link structure so that
these drivers don't need to maintain an array of configured units.

The bt driver still needs to because ISA interrupt handlers take a
unit number. :(
1996-01-07 19:24:36 +00:00
Justin T. Gibbs
661104e49c The sequencer sets Intstat to REJECT_MSG, not MSG_REJECT.
Submitted by: "Daniel M. Eischen" <deischen@iworks.InterWorks.org>
1996-01-05 16:13:44 +00:00
Justin T. Gibbs
6cb248359e The long awaited stability patch set for the aic7xxx driver:
Simplify the initialization of adapters by pulling all card specific
initialization to the card specific modules.

Update comments and fix formating.

Pass struct ahc_data*'s to functions instead of unit numbers.

Take advantage of the quad word alignment of SCB fields.

Adapt to new sequencer changes:

	1) Waiting scb list no longer has a tail.

	2) Fill the message buffer as appropriate during a parity error.

	3) Count all of the SGs involved in a residual instead of just
	   the current one.

The reset/abort code still needs a lot of work.

Reviewed by:   David Greenman <davidg@FreeBSd.org>
1996-01-03 06:32:12 +00:00
Bruce Evans
82b945084b Completed function declarations and added prototypes. Sorted prototypes. 1995-12-15 23:49:42 +00:00
Peter Wemm
60f17fcd9f Change the generic "btintr" function's name to "bt_intr" - the same as
all the other bt_XXX() functions in i386/scsi/bt*.

This the important effect of forcing a link error if the user is
still using the old "vector btintr" which is dangerously wrong
after Justin's updates to the driver.

The correct isa vector line for the bt driver is "vector bt_isa_intr".
Justin mentioned this in the commit message and updated LINT and
GENERIC.  This change is to enforce that.. :-)
1995-12-14 14:19:19 +00:00
Bruce Evans
99406bcc38 Completed function declarations and added prototypes.
Fixed 3 serious type mismatches that were introduced when the driver
was split up.

Reviewed by:	gibbs
1995-12-13 14:32:59 +00:00
Justin T. Gibbs
c343bdc635 The core of the Buslogic SCSI driver that is shared for all models on
all buses.

Known problems:
-The PCI probe code has not been tested. Someone with a PCI Bt card will
 have to validate it, but even if it is broken all cards the earlier version
 of this driver found in ISA compatibility mode should still be found.
-Still missing the BT956 PCI ID, so it will be found as an ISA card until
 someone suplies it.
-PCI interrupts go through an interrupt stub that returns an int until
 we remove the edge-triggered PCI compatibiliity cruft.
-ISA interrupts go through an interrupt stub until they pass in (void *).
-The driver could support more mboxes and concurrent commands by allocating
 structures separately and hanging them off the bt_data struct to get around
 the 4K page limit. Someone with documentation should do this and also
 enable tagged queuing.
1995-12-12 08:57:22 +00:00
David Greenman
efeaf95a41 Untangled the vm.h include file spaghetti. 1995-12-07 12:48:31 +00:00
Bruce Evans
0310c19f5d Replaced #includes of <sys/user.h> by less gross headers, usually
<sys/vm.h>.  Many device drivers need only the definition of vtophys()
from vm.

Added nearby #includes of <sys/conf.h> where appropriate.
1995-12-06 23:52:35 +00:00
Poul-Henning Kamp
78535df223 Remove unused var. 1995-11-20 12:14:40 +00:00
Poul-Henning Kamp
2a02fd2542 Staticize various private parts. 1995-11-14 09:58:47 +00:00
Justin T. Gibbs
b3538b9c15 Fix typo in QUEUE_FULL_SUPPORTED section.
Submitted by: Satoshi Asami <asami>
1995-11-07 07:01:05 +00:00
Justin T. Gibbs
319c75485a Properly print out the chip type again. ahc_init really needs a rewrite. 1995-11-07 05:32:47 +00:00
Justin T. Gibbs
6d32158f2b -Wall fixes. 1995-11-06 05:21:13 +00:00
Justin T. Gibbs
a43da20ce4 Move aic7xxx register definitions to sys/dev/aic7xxx/aic7xxx_reg.h.
Start the revamp of the initialiation process.  New routines include
ahc_alloc, ahc_free, and ahc_reset.  These help divide the work of staring
up a board more logically between probe and attach.

ahcintr now takes a (void *) and returns int.  The pci code uses it directly.
Until the PCI code for shared edged triggered interrupts is removed, the
eisa code uses a stub (ahc_eisa_intr) that throws away the int returned
by ahcintr.

Use MHz instead of MB/s for printing out sync rates.

Print out "aic7880" instead of "aic7870" for the new aic7880 chips.
1995-11-05 04:50:55 +00:00
Bruce Evans
2e8300f1f6 Fixed the type of ahcintr(). The type of an ISA interrupt handler is
incompatible with the type of a PCI interrupt handler.  A new entry
point `ahc_pci_intr()' is used for PCI.  ISA and PCI interrupts are
penalized equally (:-) by calling a common handler `ahc_intr()'.  This
should be reorganized.  Some strings now name the wrong function...
1995-11-04 14:43:30 +00:00
Poul-Henning Kamp
c227cb3456 Cleanup, make things static. 1995-10-31 18:41:49 +00:00
Justin T. Gibbs
25e55cecc6 Initialize SXFRCTL0 with DFON|SPIOEN|ULTRAEN. 1995-10-29 05:57:48 +00:00
Justin T. Gibbs
7ae20993a0 Fix incorrect bit definitions for SXFRCTL0 (typo). The affected bits
aren't referenced by the driver yet, so this error shouldn't have caused
any problems.

Submitted by:	Dan Eischen <deischen@iworks.InterWorks.org>
1995-10-28 17:27:21 +00:00
Justin T. Gibbs
396614a8b4 Properly deal with the Ultra series of adapters. We should now understand
the new seeprom format and negotiate up to 20MHz sync if set in SCSI-Select.

Reduce the complexity of the timeout code by running it at splhigh().  Fix
a bug that caused rescheduled timeouts at 0 clock ticks in the future causing
an infinite loop.

Obtained from: Timeout bug noticed by David Greenman and wcarchive.
1995-10-26 23:57:18 +00:00
Justin T. Gibbs
67f06b6142 Clean up a few nits in the aic7xxx driver:
1) Make the driver "quiet" by sticking most boot messages behind
	bootverbose conditionals.  This means that you won't see the
	sync and wide negotiation, but you will find out if they fail.

2) Add support to the 93cx6 serial eeprom code to read at an abitrary
	offset.  This is needed so that we can access the second half
	of the eeprom on 3940 cards where the second channel's config
	is stored.

3) Add flags argument to ahcprobe().  This is used by the pci probe code
	to tell the generic driver that an adapter should be treated
	as a channel B device as well as notify it of the presence of
	external SCB SRAM.  These are needed for some motherboard
	implementations of the aic7870 and for the 3940 controllers.

4) Print "Channel A"/"Channel B" instead of "Single Channel" for the
	two busses of the 3940.  I received many reports of confusion
	about how the 3940 was probed since most people belived that
	only one ahc entry was needed.  This will hopefully make it
	clearer.

5) Walk the SCBs to determine just how many their are if external SCB
	ram is detected.

6) Hard code that external SCB ram is present for the 3940 since it doesn't
	use the documented reporting facility for reporting the SRAM. :(
	255 commands per channel are supported on the 3940.

7) Read the seeprom starting at addres 32 for the second channel of the
	3940 so we get the right info for that channel.

8) Clean up printing of the "Disabling tagged queuing message".

9) Queue timeouts if they occur while we are handling a timeout.  The code
	was totally unprotected in this scenario.
Reviewed by: Timeout code reviewed by David Greenman <davidg>
1995-09-05 23:52:03 +00:00
Justin T. Gibbs
ea46ac014f Remove hard coded assumption that SCSI busses have 7 targets.
Change some leading spaces to tabs.

This change forces the controller drivers to allocate a scsibus_data struct
via a call to scsi_alloc_bus(), fill in the adapter_link field, and optionally
modify any other fields of the struct.  Scsi_alloc_bus() initializes all fields
to the default, so the changes in most drivers are very minimal.  For drivers
that support Wide controllers, the maxtarg field will have to be updated to
allow probing of all targets (for an example, look at the aic7xxx driver).

Scsi_attachdevs() now takes a scsibus_data* as its argument instead of an
sc_link*.  This allows us to expand the role of the scsibus_data struct for
other bus level configuration setings (max number of transactions, current
transaction opennings, etc for better tagged queuing support).

Reviewed by: Rodney Grimes <rgrimes>, Peter Dufault <dufault>, Julian Elischer <julian>
1995-08-23 23:03:17 +00:00
Justin T. Gibbs
a8f7c59522 Properly prototype the ahc_done routine, and pass the right number of
arguments to it in one call in the reset code. (doh!)
1995-08-15 08:54:21 +00:00
Justin T. Gibbs
7825f18854 Correctly timeout scb instead of active_scb which is carying the bus device
reset in this case.
1995-08-14 08:29:15 +00:00
Justin T. Gibbs
c83d01159a Update the SCB controll byte bit definitions to match new SCB_DISCENB bit.
Remove "#ifdef NOT_YET"s since the features they pertain too are committed
now.
1995-08-05 17:32:55 +00:00
Justin T. Gibbs
185363acb2 Long overdue, more complete, reset code. These changes implement a
BUS DEVICE RESET followed by BUS RESET failure recovery strategy including
the necesary renegotiation of sync/wide transfers after recovery completes.

Clean up debugging code to make it more finely selectable.  Reset code
debugging is enabled for now so I can get more feedback on how this
code behaves in real life.
1995-07-31 08:25:36 +00:00