summaryrefslogtreecommitdiffstats
path: root/sys/dev/aic7xxx
diff options
context:
space:
mode:
authorgibbs <gibbs@FreeBSD.org>1996-11-11 05:16:41 +0000
committergibbs <gibbs@FreeBSD.org>1996-11-11 05:16:41 +0000
commit73aa471bccd6d07b3ba7ede3285861195fde9928 (patch)
treec311939b5b9c317aa98dc9edd83007c85bd4ad1c /sys/dev/aic7xxx
parent51fa6f0e6c383037d81db2731606bf56378e1128 (diff)
downloadFreeBSD-src-73aa471bccd6d07b3ba7ede3285861195fde9928.zip
FreeBSD-src-73aa471bccd6d07b3ba7ede3285861195fde9928.tar.gz
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-)
Diffstat (limited to 'sys/dev/aic7xxx')
-rw-r--r--sys/dev/aic7xxx/aic7xxx.seq57
-rw-r--r--sys/dev/aic7xxx/aic7xxx_reg.h8
2 files changed, 29 insertions, 36 deletions
diff --git a/sys/dev/aic7xxx/aic7xxx.seq b/sys/dev/aic7xxx/aic7xxx.seq
index 5ebb435..76d57f1 100644
--- a/sys/dev/aic7xxx/aic7xxx.seq
+++ b/sys/dev/aic7xxx/aic7xxx.seq
@@ -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
diff --git a/sys/dev/aic7xxx/aic7xxx_reg.h b/sys/dev/aic7xxx/aic7xxx_reg.h
index cd91c9e..bb03989 100644
--- a/sys/dev/aic7xxx/aic7xxx_reg.h
+++ b/sys/dev/aic7xxx/aic7xxx_reg.h
@@ -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.
OpenPOWER on IntegriCloud