1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-23 11:18:54 +00:00

Fix a race condition in p_mesgout* and inb* code that could allow a

phasemiss to sneak by without detection.  This should fix the
Wide/Narrow boot problems that have been reported since this bug
caused the driver ignore a narrow target rejecting wide negotiation.
This commit is contained in:
Justin T. Gibbs 1996-05-27 23:16:55 +00:00
parent 187f8e98f5
commit 070d32b1a9
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=15951

View File

@ -39,7 +39,7 @@
* *
*-M************************************************************************/ *-M************************************************************************/
VERSION AIC7XXX_SEQ_VER "$Id: aic7xxx.seq,v 1.35 1996/05/21 18:32:22 gibbs Exp $" VERSION AIC7XXX_SEQ_VER "$Id: aic7xxx.seq,v 1.36 1996/05/23 15:01:47 gibbs Exp $"
#include "../../dev/aic7xxx/aic7xxx_reg.h" #include "../../dev/aic7xxx/aic7xxx_reg.h"
@ -495,11 +495,11 @@ p_mesgout_start:
* a MESSAGE REJECT. * a MESSAGE REJECT.
*/ */
p_mesgout_loop: p_mesgout_loop:
test SSTAT1,PHASEMIS jnz p_mesgout_phasemis
test SSTAT0,SPIORDY jz p_mesgout_loop test SSTAT0,SPIORDY jz p_mesgout_loop
cmp DINDEX,1 jne p_mesgout_outb /* last byte? */ cmp DINDEX,1 jne p_mesgout_outb /* last byte? */
mvi CLRSINT1,CLRATNO /* drop ATN */ mvi CLRSINT1,CLRATNO /* drop ATN */
p_mesgout_outb: p_mesgout_outb:
test SSTAT1,PHASEMIS jnz p_mesgout_phasemis
dec DINDEX dec DINDEX
or CLRSINT0, CLRSPIORDY or CLRSINT0, CLRSPIORDY
mov SCSIDATL,SINDIR mov SCSIDATL,SINDIR
@ -862,8 +862,8 @@ inb_next:
or CLRSINT0, CLRSPIORDY or CLRSINT0, CLRSPIORDY
mov NONE,SCSIDATL /*dummy read from latch to ACK*/ mov NONE,SCSIDATL /*dummy read from latch to ACK*/
inb_next_wait: inb_next_wait:
test SSTAT1,PHASEMIS jnz mesgin_phasemis
test SSTAT0,SPIORDY jz inb_next_wait /* wait for next byte */ test SSTAT0,SPIORDY jz inb_next_wait /* wait for next byte */
test SSTAT1,PHASEMIS jnz mesgin_phasemis
inb_first: inb_first:
mov DINDEX,SINDEX mov DINDEX,SINDEX
mov DINDIR,SCSIBUSL ret /*read byte directly from bus*/ mov DINDIR,SCSIBUSL ret /*read byte directly from bus*/