Log ABORT_TAG messages to the console.

When attempting to abort a command, don't assume that just because the
sequecer happens to have SCBPTR pointing at the scb we want that it is
an active command.
This commit is contained in:
gibbs 1995-04-01 19:53:04 +00:00
parent 084bd6c7a2
commit 6f307fa496

View File

@ -24,7 +24,7 @@
* *
* commenced: Sun Sep 27 18:14:01 PDT 1992 * commenced: Sun Sep 27 18:14:01 PDT 1992
* *
* $Id: aic7xxx.c,v 1.17 1995/03/17 23:58:27 gibbs Exp $ * $Id: aic7xxx.c,v 1.18 1995/03/31 13:54:40 gibbs Exp $
*/ */
/* /*
* TODO: * TODO:
@ -355,6 +355,7 @@ struct scsi_device ahc_dev =
#define MSG_REJECT 0x60 #define MSG_REJECT 0x60
#define BAD_STATUS 0x70 #define BAD_STATUS 0x70
#define RESIDUAL 0x80 #define RESIDUAL 0x80
#define ABORT_TAG 0x90
#define BRKADRINT 0x08 #define BRKADRINT 0x08
#define SCSIINT 0x04 #define SCSIINT 0x04
#define CMDCMPLT 0x02 #define CMDCMPLT 0x02
@ -1131,6 +1132,26 @@ ahcintr(unit)
inb(iobase+SCBARRAY+15); inb(iobase+SCBARRAY+15);
break; break;
} }
case ABORT_TAG:
{
int scb_index;
scb_index = inb(SCBPTR + iobase);
scb = ahc->scbarray[scb_index];
/*
* We didn't recieve a valid tag back from
* the target on a reconnect.
*/
printf("ahc%d: invalid tag recieved on channel %c "
"target %d, lun %d -- sending ABORT_TAG\n",
unit,
((u_long)xs->sc_link->fordriver & 0x08)? 'B':'A',
xs->sc_link->target,
xs->sc_link->lun);
scb->xs->error = XS_DRIVER_STUFFUP;
untimeout(ahc_timeout, (caddr_t)scb);
ahc_done(unit, scb);
break;
}
default: default:
printf("ahc: seqint, " printf("ahc: seqint, "
"intstat == 0x%x, scsisigi = 0x%x\n", "intstat == 0x%x, scsisigi = 0x%x\n",
@ -1956,6 +1977,7 @@ ahc_abort_scb( unit, ahc, scb )
int found = 0; int found = 0;
int active_scb; int active_scb;
u_char flags; u_char flags;
u_char scb_control;
PAUSE_SEQUENCER(ahc); PAUSE_SEQUENCER(ahc);
/* /*
@ -1993,7 +2015,6 @@ ahc_abort_scb( unit, ahc, scb )
* the driver will then abort the command * the driver will then abort the command
* and notify us of the abort. * and notify us of the abort.
*/ */
int scb_control;
outb(SCBPTR + iobase, scb->position); outb(SCBPTR + iobase, scb->position);
scb_control = inb(SCBARRAY + iobase); scb_control = inb(SCBARRAY + iobase);
scb_control &= ~SCB_DIS; scb_control &= ~SCB_DIS;
@ -2001,6 +2022,13 @@ ahc_abort_scb( unit, ahc, scb )
outb(SCBPTR + iobase, active_scb); outb(SCBPTR + iobase, active_scb);
goto done; goto done;
} }
scb_control = inb(SCBARRAY + iobase);
scb_control &= ~SCB_DIS;
if( scb_control & SCB_DIS ) {
scb_control &= ~SCB_DIS;
outb(SCBARRAY + iobase, scb_control);
goto done;
}
/* /*
* Case 3: Currently active command * Case 3: Currently active command
*/ */
@ -2078,7 +2106,7 @@ ahc_timeout(void *arg1)
#endif /*AHC_DEBUG */ #endif /*AHC_DEBUG */
/* /*
* If it's immediate, don't try abort it * If it's immediate, don't try to abort it
*/ */
if (scb->flags & SCB_IMMED) { if (scb->flags & SCB_IMMED) {
scb->xs->retries = 0; /* I MEAN IT ! */ scb->xs->retries = 0; /* I MEAN IT ! */