Fix two problems with SCB Paging.

1) get_free_or_disc_scb was not being passed its argument correctly
   in one case

2) Add protection in the form of the QOUTQCNT variable to prevent
   overflowing the QOUTFIFO.

This should make SCB Paging work.  Really, I mean it now. 8-)
This commit is contained in:
Justin T. Gibbs 1996-11-11 05:16:41 +00:00
parent 82c23eba89
commit 8220b8706a
2 changed files with 29 additions and 36 deletions

View File

@ -39,7 +39,7 @@
*
*-M************************************************************************/
VERSION AIC7XXX_SEQ_VER "$Id: aic7xxx.seq,v 1.46 1996/10/28 17:00:24 gibbs Exp $"
VERSION AIC7XXX_SEQ_VER "$Id: aic7xxx.seq,v 1.47 1996/11/05 07:51:29 gibbs Exp $"
#if defined(__NetBSD__)
#include "../../../../dev/ic/aic7xxxreg.h"
@ -127,7 +127,7 @@ test_queue:
* and get to work on it.
*/
test FLAGS, PAGESCBS jz dequeue_scb
call get_free_or_disc_scb
mov ALLZEROS call get_free_or_disc_scb
cmp SINDEX, SCB_LIST_NULL je poll_for_work
dequeue_scb:
mov CUR_SCBID,QINFIFO
@ -534,14 +534,13 @@ p_mesgout_start:
* a MESSAGE REJECT.
*/
p_mesgout_loop:
test SSTAT1,PHASEMIS jnz p_mesgout_phasemis
test SSTAT0,SPIORDY jz p_mesgout_loop
test SSTAT1,REQINIT jz p_mesgout_loop
test SSTAT1,PHASEMIS jnz p_mesgout_phasemis
cmp DINDEX,1 jne p_mesgout_outb /* last byte? */
mvi CLRSINT1,CLRATNO /* drop ATN */
p_mesgout_outb:
dec DINDEX
or CLRSINT0, CLRSPIORDY
or CLRSINT1, CLRREQINIT
mov SCSIDATL,SINDIR
p_mesgout4:
@ -588,7 +587,6 @@ rej_mesgin:
* and hope for the best. In any case, rejection should be a rare
* occurrence - signal the driver when it happens.
*/
or SCSISIGO,ATNO /* turn on ATNO */
mvi INTSTAT,SEND_REJECT /* let driver know */
mvi MSG_MESSAGE_REJECT call mk_mesg
@ -656,6 +654,12 @@ test_immediate:
mvi INTSTAT,IMMEDDONE
jmp dma_next_scb
complete:
test FLAGS, PAGESCBS jz complete_post
mov A, QFULLCNT
complete_poll:
cmp QOUTQCNT, A je complete_poll
inc QOUTQCNT
complete_post:
/* Post the SCB and issue an interrupt */
mov QOUTFIFO,SCB_TAG
mvi INTSTAT,CMDCMPLT
@ -812,7 +816,6 @@ index_by_tag:
not_found:
mvi INTSTAT, NO_MATCH
send_abort_msg:
or SCSISIGO,ATNO /* turn on ATNO */
test FLAGS, TAGGED_SCB jnz abort_tag_msg
mvi MSG_ABORT call mk_mesg
jmp mesgin_done
@ -876,6 +879,7 @@ mk_mesg:
mvi INTSTAT,MSG_BUFFER_BUSY
mk_mesg1:
or SCSISIGO,ATNO /* turn on ATNO */
mvi MSG_LEN,1 /* length = 1 */
mov MSG0,SINDEX /* 1-byte message */
mvi SEQCTL,0x10 ret /* !PAUSEDIS|FASTMODE */
@ -897,16 +901,16 @@ mk_mesg1:
*/
inb_next:
or CLRSINT0, CLRSPIORDY
or CLRSINT1, CLRREQINIT
mov NONE,SCSIDATL /*dummy read from latch to ACK*/
inb_next_wait:
test SSTAT1,PHASEMIS jnz mesgin_phasemis
test SSTAT0,SPIORDY jz inb_next_wait /* wait for next byte */
test SSTAT1,REQINIT jz inb_next_wait /* wait for next byte */
inb_first:
mov DINDEX,SINDEX
test SSTAT1,PHASEMIS jnz mesgin_phasemis
mov DINDEX,SINDEX
mov DINDIR,SCSIBUSL ret /*read byte directly from bus*/
inb_last:
or CLRSINT1, CLRREQINIT
mov NONE,SCSIDATL ret /*dummy read from latch to ACK*/
mesgin_phasemis:
@ -997,7 +1001,7 @@ findSCB1:
* abort flag set, return not found.
*/
test FLAGS, PAGESCBS jz find_error
call get_free_or_disc_scb
mov ALLZEROS call get_free_or_disc_scb
cmp ARG_1, SCB_LIST_NULL jne find_dma_scb
mov SAVED_TCL call index_untagged_scb
mov ARG_1, SINDIR /* SCBID of SCB to fetch */
@ -1129,17 +1133,12 @@ index_untagged_scb2:
get_free_or_disc_scb:
mov SINDEX, ALLZEROS
cmp FREE_SCBH, SCB_LIST_NULL jne get_free_scb
cmp DISCONNECTED_SCBH, SCB_LIST_NULL je return_error
mov SCBPTR, DISCONNECTED_SCBH
/*
* If we are starting a new transaction, we have to ensure that
* there is at least one SCB left in case a reselection wins out.
*/
test FLAGS, RESELECTED jnz dequeue_disc_scb
cmp SCB_NEXT, SCB_LIST_NULL je return_error
cmp FREE_SCBH, SCB_LIST_NULL jne dequeue_free_scb
cmp DISCONNECTED_SCBH, SCB_LIST_NULL jne dequeue_disc_scb
return_error:
mvi SINDEX, SCB_LIST_NULL ret
dequeue_disc_scb:
mov SCBPTR, DISCONNECTED_SCBH
/*
* If we have a residual, then we are in the middle of some I/O
* and we have to send this SCB back up to the kernel so that the
@ -1149,21 +1148,11 @@ dequeue_disc_scb:
mvi DMAPARAMS, 0x9 /* HDMAEN | FIFORESET*/
mov SCB_TAG call dma_scb
unlink_disc_scb:
call rem_scb_from_disc_list
ret
get_free_scb:
/*
* If we are starting a new transaction, we have to ensure that
* there is at least one SCB left in case a reselection wins out.
*/
test FLAGS, RESELECTED jnz dequeue_free_scb
cmp SCB_NEXT, SCB_LIST_NULL jne dequeue_free_scb
cmp DISCONNECTED_SCBH, SCB_LIST_NULL je return_error
/* jmp instead of call since we want to return anyway */
mov SCBPTR jmp rem_scb_from_disc_list
dequeue_free_scb:
mov SCBPTR, FREE_SCBH
mov FREE_SCBH, SCB_NEXT ret
return_error:
mvi SINDEX, SCB_LIST_NULL ret
add_scb_to_free_list:
mov SCB_NEXT, FREE_SCBH

View File

@ -28,7 +28,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: aic7xxx_reg.h,v 1.14 1996/10/25 06:34:59 gibbs Exp $
* $Id: aic7xxx_reg.h,v 1.15 1996/10/28 06:01:08 gibbs Exp $
*/
/*
@ -653,7 +653,11 @@
* we can see what is getting thrown away.
*/
#define REJBYTE 0x030
#define TARGID_MASK 0x031
/*
* Since the sequencer cannot read QOUTCNT, we use this memory location
* to make sure that we don't overflow the QOUTFIFO when doing SCB Paging.
*/
#define QOUTQCNT 0x031
/*
* Bit vector of targets that have disconnection disabled.