freebsd-skq/sys/dev/aic7xxx
Justin T. Gibbs 47c2d60f79 aic7xxx.c:
When restarting the sequencer, ensure that the SCBCNT register
	is 0.  A non-zero count will prevent the setting of the CCSCBDIR
	bit in any future dma operations.  The only time CCSCBCNT would
	be non-zero is if we happened to halt the dma during a reset,
	but even that should never happen.  Better safe than sorry.

	When a command completes before the target responds to an
	ATN for a recovery command, we now notify the kernel so that
	any recovery operation requeued in the qinfifo can be removed
	safely.  In the past, we did this in ahc_done(), but ahc_done()
	may be called without the card paused.  This also avoids a
	recursive call to ahc_search_qinifo() which could have occurred if
	ahc_search_qinififo() happened to be the routine to complete
	a recovery action.

	Fix 8bit math used for adjusting the qinfifo.  The index must
	be wrapped properly within the 256 entry array.  We rely on the
	fact that qinfifonext is a uint8_t in most cases to handle
	this wrap, but we missed a few spots where the resultant
	calculation was promoted to an int.

	Change the way that we deal with aborting the first or second
	entry from the qinfifo.  We now swap the first entry in the
	qinfifo with the "next queued scb" to force the sequencer
	to see an abort collision if we ever touch the qinififo while
	the sequencer is mid SCB dma.

aic7xxx.reg:
	Add new MKMSG_FAILED sequencer interrupt.  This displaced
	the BOGUS_TAG interrupt used in some previous sequencer code
	debugging.

aic7xxx.seq:
	Increment our position in the qinfifo only once the dma
	is complete and we have verified that the queue has not
	been changed during our DMA.  This simplifies code in the
	kernel.

	Protect against "instruction creep" when issuing a pausing
	sequencer interrupt.  On at least the 7890/91/96/97, the
	sequencer will coast after issuing the interrupt for up
	to two instructions.  In the past we delt with this by
	using carefully placed nops.  Now we call a routine to
	issue the interrupt followed by a nop and a ret.

	Tell the kernel should an SCB complete with the MK_MESSAGE
	flag still set.  This means the target ignored our ATN request.

	Clear the channel twice as we exit the data phase.  On the
	aic7890/91, the S/G preload logic may require the second
	clearing to get the last S/G out of the FIFO.

aic7xxx_freebsd.c:
	Don't bother searching the qinfifo for a doubly queued
	recovery scb in ahc_done.  This case is handled by the
	core driver now.

	Free the path used to issue async callbacks after the callback
	is complete.

aic7xxx_inline.h:
	Split the SCB queue routine into a routine that swaps
	the SCB with the "next queued SCB" and a routine that
	calls the swapping routine and notifies the card of
	the new SCB.  The swapping routine is now also used by
	ahc_search_qinfifo.
2000-11-06 20:05:38 +00:00
..
aicasm Generate bmov instructions for all move requests. The driver 2000-10-31 18:44:32 +00:00
ahc_eisa.c Move aicasm to its own subdirectory. 2000-09-16 20:02:28 +00:00
ahc_pci.c Add Perforce RCSIDs for easy revision correlation to my local tree. 2000-09-22 22:18:05 +00:00
aic7xxx_93cx6.c Add Perforce RCSIDs for easy revision correlation to my local tree. 2000-09-22 22:18:05 +00:00
aic7xxx_93cx6.h Add Perforce RCSIDs for easy revision correlation to my local tree. 2000-09-22 22:18:05 +00:00
aic7xxx_freebsd.c aic7xxx.c: 2000-11-06 20:05:38 +00:00
aic7xxx_freebsd.h Remove unneeded <stddef.h> #includes. 2000-10-29 16:57:42 +00:00
aic7xxx_inline.h aic7xxx.c: 2000-11-06 20:05:38 +00:00
aic7xxx_osm.c aic7xxx.c: 2000-11-06 20:05:38 +00:00
aic7xxx_osm.h Remove unneeded <stddef.h> #includes. 2000-10-29 16:57:42 +00:00
aic7xxx_pci.c aic7xxx.c: 2000-10-31 18:43:29 +00:00
aic7xxx.c aic7xxx.c: 2000-11-06 20:05:38 +00:00
aic7xxx.h aic7xxx.c: 2000-10-31 18:43:29 +00:00
aic7xxx.reg aic7xxx.c: 2000-11-06 20:05:38 +00:00
aic7xxx.seq aic7xxx.c: 2000-11-06 20:05:38 +00:00
aic7770.c Move aicasm to its own subdirectory. 2000-09-16 20:02:28 +00:00