summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth R Westerback <krw@cvs.openbsd.org>2002-03-14 00:04:10 +0000
committerKenneth R Westerback <krw@cvs.openbsd.org>2002-03-14 00:04:10 +0000
commit7d1793f23997004fe557332c9a5c09b56c813e9a (patch)
tree37f8685813fd0b265765c8a3a8daa0dd45df6b32
parentf7e2f30a6130c5e80f83bd285e655dac67823685 (diff)
Fix *some* problems with new ahc driver that were surfaced with
the recent changes to scsiconf.c. a) Restore marking of appropriate devices as tagged b) Fix an off-by-one error that sprayed bits around c) Use correct field (quirks) when setting SDEV_NOTAGS bit d) Use TAG_ENB define instead of MSG_SIMPLE_Q_TAG when manipulating hscb->control. Both were defined to the same value, but TAG_ENB is the define used to extract the bit later on. This leaves problems, most often seen as faults when accessing a CD drive and disk drive on the same bus. ok smurph@
-rw-r--r--sys/dev/ic/aic7xxx.h5
-rw-r--r--sys/dev/ic/aic7xxx_openbsd.c97
-rw-r--r--sys/dev/ic/aic7xxx_openbsd.h8
3 files changed, 46 insertions, 64 deletions
diff --git a/sys/dev/ic/aic7xxx.h b/sys/dev/ic/aic7xxx.h
index 61b8ca995bc..3982e54edc9 100644
--- a/sys/dev/ic/aic7xxx.h
+++ b/sys/dev/ic/aic7xxx.h
@@ -28,7 +28,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: aic7xxx.h,v 1.1 2002/02/16 05:12:39 smurph Exp $
+ * $Id: aic7xxx.h,v 1.2 2002/03/14 00:04:09 krw Exp $
*
* $FreeBSD: src/sys/dev/aic7xxx/aic7xxx.h,v 1.40 2001/07/18 21:39:47 gibbs Exp $
*/
@@ -686,9 +686,6 @@ struct ahc_tmode_tstate {
uint16_t ultraenb; /* Using ultra sync rate */
uint16_t discenable; /* Disconnection allowed */
uint16_t tagenable; /* Tagged Queuing allowed */
-#ifdef __OpenBSD__
- uint16_t tagdisable; /* Tagged Queuing NOT allowed */
-#endif
};
/*
diff --git a/sys/dev/ic/aic7xxx_openbsd.c b/sys/dev/ic/aic7xxx_openbsd.c
index 94497879228..d2a20e9af49 100644
--- a/sys/dev/ic/aic7xxx_openbsd.c
+++ b/sys/dev/ic/aic7xxx_openbsd.c
@@ -29,10 +29,10 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: aic7xxx_openbsd.c,v 1.1 2002/02/16 04:36:33 smurph Exp $
+ * $Id: aic7xxx_openbsd.c,v 1.2 2002/03/14 00:04:09 krw Exp $
*
* $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_freebsd.c,v 1.26 2001/07/18 21:39:47 gibbs Exp $
- * $OpenBSD: aic7xxx_openbsd.c,v 1.1 2002/02/16 04:36:33 smurph Exp $
+ * $OpenBSD: aic7xxx_openbsd.c,v 1.2 2002/03/14 00:04:09 krw Exp $
*/
#include <dev/ic/aic7xxx_openbsd.h>
@@ -95,10 +95,10 @@ void ahc_check_tags __P((struct ahc_softc *ahc,
struct scsi_xfer *xs));
/*
- * Routines to manage busy targets. The old driver didn't need to
- * pause the sequecer because no device registers were acessed. Now
- * busy targetes are controlled via the device registers and thus,
- * we have to pause the sequencer for chips that don't have the
+ * Routines to manage busy targets. The old driver didn't need to
+ * pause the sequencer because no device registers were accessed. Now
+ * busy targets are controlled via the device registers and thus, we
+ * have to pause the sequencer for chips that don't have the
* auto-pause feature. XXX smurph
*/
static __inline u_int ahc_pause_index_busy_tcl __P((struct ahc_softc *ahc,
@@ -158,13 +158,13 @@ void
ahc_force_neg(ahc)
struct ahc_softc *ahc;
{
- int max_targ = AHC_NUM_TARGETS;
+ int num_targets = AHC_NUM_TARGETS;
int i;
if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0)
- max_targ = 7;
+ num_targets = 8;
- for (i = 0; i <= max_targ; i++) {
+ for (i = 0; i < num_targets; i++) {
struct ahc_initiator_tinfo *tinfo;
struct ahc_tmode_tstate *tstate;
u_int our_id;
@@ -267,7 +267,6 @@ ahc_freedmamem(tag, size, map, vaddr, seg, nseg)
bus_dma_segment_t *seg;
int nseg;
{
-
bus_dmamap_unload(tag, map);
bus_dmamap_destroy(tag, map);
bus_dmamem_unmap(tag, vaddr, size);
@@ -719,7 +718,7 @@ ahc_done(ahc, scb)
/*
* We performed autosense retrieval.
*
- * bzero the sense data before having
+ * Zero the sense data before having
* the drive fill it. The SCSI spec mandates
* that any untransfered data should be
* assumed to be zero. Complete the 'bounce'
@@ -754,8 +753,11 @@ ahc_done(ahc, scb)
ahc_list_insert_head(ahc, xs);
ahc_unlock(ahc, &s);
} else {
+ if ((xs->sc_link->lun == 0) &&
+ (xs->flags & SCSI_POLL) &&
+ (xs->error == XS_NOERROR))
+ ahc_check_tags(ahc, xs);
xs->flags |= ITSDONE;
- ahc_check_tags(ahc, xs);
scsi_done(xs);
}
@@ -933,7 +935,7 @@ get_scb:
timeout_set(&xs->stimeout, ahc_timeout, scb);
if (ahc_istagged_device(ahc, xs, 0)){
- hscb->control |= MSG_SIMPLE_Q_TAG;
+ hscb->control |= TAG_ENB;
} else {
ahc_pause_busy_tcl(ahc, tcl, scb->hscb->tag);
}
@@ -1575,6 +1577,7 @@ ahc_platform_set_tags(ahc, devinfo, alg)
devinfo->our_scsiid,
devinfo->target,
&tstate);
+
switch (alg) {
case AHC_QUEUE_BASIC:
case AHC_QUEUE_TAGGED:
@@ -1582,7 +1585,6 @@ ahc_platform_set_tags(ahc, devinfo, alg)
break;
case AHC_QUEUE_NONE:
tstate->tagenable &= ~devinfo->target_mask;
- tstate->tagdisable |= devinfo->target_mask;
break;
}
}
@@ -1628,57 +1630,40 @@ ahc_check_tags(ahc, xs)
struct ahc_softc *ahc;
struct scsi_xfer *xs;
{
- struct scsi_inquiry_data *inq;
struct ahc_devinfo devinfo;
- struct ahc_tmode_tstate *tstate;
- int target_id, our_id;
- char channel;
- if (xs->cmd->opcode != INQUIRY || xs->error != XS_NOERROR)
+ if (xs->sc_link->quirks & SDEV_NOTAGS)
return;
- if (xs->sc_link->quirks & SDEV_NOTAGS)
+ if (ahc_istagged_device(ahc, xs, 1))
return;
- target_id = xs->sc_link->target;
- our_id = SCSI_SCSI_ID(ahc, xs->sc_link);
- channel = SCSI_CHANNEL(ahc, xs->sc_link);
+ ahc_compile_devinfo(&devinfo,
+ SCSI_SCSI_ID(ahc, xs->sc_link),
+ XS_SCSI_ID(xs),
+ XS_LUN(xs),
+ SCSI_CHANNEL(ahc, xs->sc_link),
+ ROLE_INITIATOR);
- (void)ahc_fetch_transinfo(ahc, channel, our_id, target_id, &tstate);
- ahc_compile_devinfo(&devinfo, our_id, target_id,
- xs->sc_link->lun, channel, ROLE_INITIATOR);
+ ahc_set_tags(ahc, &devinfo, AHC_QUEUE_TAGGED);
- if (tstate->tagdisable & devinfo.target_mask)
- return;
+ printf("%s: target %d using tagged queuing\n",
+ ahc_name(ahc), XS_SCSI_ID(xs));
- /*
- * Sneak a look at the results of the SCSI Inquiry
- * command and see if we can do Tagged queing. This
- * should really be done by the higher level drivers.
- */
- inq = (struct scsi_inquiry_data *)xs->data;
- if ((inq->flags & SID_CmdQue) && !(ahc_istagged_device(ahc, xs, 1))) {
-#ifdef AHC_DEBUG
- printf("%s: target %d using tagged queuing\n",
- ahc_name(ahc), xs->sc_link->target);
-#endif
- ahc_set_tags(ahc, &devinfo, AHC_QUEUE_TAGGED);
-
- if (ahc->scb_data->maxhscbs >= 16 ||
- (ahc->flags & AHC_PAGESCBS)) {
- /* Default to 16 tags */
- xs->sc_link->openings += 14;
- } else {
- /*
- * Default to 4 tags on whimpy
- * cards that don't have much SCB
- * space and can't page. This prevents
- * a single device from hogging all
- * slots. We should really have a better
- * way of providing fairness.
- */
- xs->sc_link->openings += 2;
- }
+ if (ahc->scb_data->maxhscbs >= 16 ||
+ (ahc->flags & AHC_PAGESCBS)) {
+ /* Default to 16 tags */
+ xs->sc_link->openings += 14;
+ } else {
+ /*
+ * Default to 4 tags on whimpy
+ * cards that don't have much SCB
+ * space and can't page. This prevents
+ * a single device from hogging all
+ * slots. We should really have a better
+ * way of providing fairness.
+ */
+ xs->sc_link->openings += 2;
}
}
diff --git a/sys/dev/ic/aic7xxx_openbsd.h b/sys/dev/ic/aic7xxx_openbsd.h
index 9cae4a48cd9..9cb04654d0c 100644
--- a/sys/dev/ic/aic7xxx_openbsd.h
+++ b/sys/dev/ic/aic7xxx_openbsd.h
@@ -30,10 +30,10 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: aic7xxx_openbsd.h,v 1.1 2002/02/16 04:36:33 smurph Exp $
+ * $Id: aic7xxx_openbsd.h,v 1.2 2002/03/14 00:04:09 krw Exp $
*
* $FreeBSD: src/sys/dev/aic7xxx/aic7xxx_freebsd.h,v 1.12 2001/07/18 21:39:47 gibbs Exp $
- * $OpenBSD: aic7xxx_openbsd.h,v 1.1 2002/02/16 04:36:33 smurph Exp $
+ * $OpenBSD: aic7xxx_openbsd.h,v 1.2 2002/03/14 00:04:09 krw Exp $
*/
#ifndef _AIC7XXX_OPENBSD_H_
@@ -486,9 +486,9 @@ void ahc_set_transaction_tag(scb, enabled, type)
switch (type) {
case MSG_SIMPLE_TASK:
if (enabled)
- xs->sc_link->flags &= ~SDEV_NOTAGS;
+ xs->sc_link->quirks &= ~SDEV_NOTAGS;
else
- xs->sc_link->flags |= SDEV_NOTAGS;
+ xs->sc_link->quirks |= SDEV_NOTAGS;
break;
}
}