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:
parent
084bd6c7a2
commit
6f307fa496
@ -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 ! */
|
||||||
|
Loading…
Reference in New Issue
Block a user