When we perform an "automatic request sense", we issue an untagged command.

The sequencer expects untagged transactions to have the SCBID of the
transaction in the "busy target" array.  So, ensure that the busy entry
is up to date for the target in this case.  The new identify code in the
sequencer that performs additional sanity checking got caught up when a
tagged transaction created an untagged request sense.

In ahc_handle_seqint, ensure that the target ID is taken from the right
place.  In the case of a selection, the ID is in SCSIID.  In the case of
a reconnection it is found in SELID.
This commit is contained in:
Justin T. Gibbs 1997-03-01 06:50:41 +00:00
parent 50ac8e2f59
commit 8a709f7876
1 changed files with 44 additions and 5 deletions

View File

@ -32,7 +32,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: aic7xxx.c,v 1.103 1997/02/25 03:05:31 gibbs Exp $
* $Id: aic7xxx.c,v 1.104 1997/02/28 03:58:21 gibbs Exp $
*/
/*
* TODO:
@ -316,6 +316,9 @@ static timeout_t
static u_int8_t ahc_index_busy_target __P((struct ahc_softc *ahc, int target,
char channel, int unbusy));
static void ahc_busy_target __P((struct ahc_softc *ahc, int target,
char channel, u_int8_t scbid));
static void ahc_construct_sdtr __P((struct ahc_softc *ahc, int start_byte,
u_int8_t period, u_int8_t offset));
@ -853,10 +856,17 @@ ahc_handle_seqint(ahc, intstat)
{
struct scb *scb;
u_int16_t targ_mask;
u_int8_t target = (ahc_inb(ahc, SCSIID) >> 4) & 0x0f;
int scratch_offset = target;
char channel = ahc_inb(ahc, SBLKCTL) & SELBUSB ? 'B': 'A';
u_int8_t target;
int scratch_offset;
char channel;
if ((ahc_inb(ahc, FLAGS) & RESELECTED) != 0)
target = ahc_inb(ahc, SELID);
else
target = ahc_inb(ahc, SCSIID);
target = (target >> 4) & 0x0f;
scratch_offset = target;
channel = ahc_inb(ahc, SBLKCTL) & SELBUSB ? 'B': 'A';
if (channel == 'B')
scratch_offset += 8;
targ_mask = (0x01 << scratch_offset);
@ -1264,6 +1274,12 @@ ahc_handle_seqint(ahc, intstat)
hscb->cmdlen = sizeof(*sc);
scb->sg_count = hscb->SG_segment_count;
scb->flags |= SCB_SENSE;
/*
* Ensure the target is busy since this
* will be an untagged request.
*/
ahc_busy_target(ahc, target, channel,
hscb->tag);
ahc_outb(ahc, RETURN_1, SEND_SENSE);
/*
@ -1857,7 +1873,7 @@ ahc_done(ahc, scb)
if (ahc->scb_data->maxhscbs >= 16
|| (ahc->flags & AHC_PAGESCBS)) {
/* Default to 8 tags */
xs->sc_link->opennings += 6;
xs->sc_link->opennings += 13;
} else {
/*
* Default to 4 tags on whimpy
@ -3373,6 +3389,29 @@ ahc_index_busy_target(ahc, target, channel, unbusy)
return busy_scbid;
}
static void
ahc_busy_target(ahc, target, channel, scbid)
struct ahc_softc *ahc;
int target;
char channel;
u_int8_t scbid;
{
u_int8_t active_scb;
u_int8_t info_scb;
u_int8_t busy_scbid;
u_int32_t scb_offset;
info_scb = target / 4;
if (channel == 'B')
info_scb += 2;
active_scb = ahc_inb(ahc, SCBPTR);
ahc_outb(ahc, SCBPTR, info_scb);
scb_offset = SCB_ACTIVE0 + (target & 0x03);
ahc_outb(ahc, scb_offset, scbid);
ahc_outb(ahc, SCBPTR, active_scb);
return;
}
static void
ahc_clear_intstat(ahc)
struct ahc_softc *ahc;