summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/i386/scsi/advansys.c57
1 files changed, 21 insertions, 36 deletions
diff --git a/sys/i386/scsi/advansys.c b/sys/i386/scsi/advansys.c
index 27ff1d7..3bb5914 100644
--- a/sys/i386/scsi/advansys.c
+++ b/sys/i386/scsi/advansys.c
@@ -31,7 +31,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: advansys.c,v 1.1.1.1 1996/10/07 02:07:07 gibbs Exp $
*/
/*
* Ported from:
@@ -65,9 +65,6 @@
static void adv_scsi_cmd __P((struct scsi_xfer *xs));
static void advminphys __P((struct buf *bp));
-static void * adv_get_cdb __P((void *adapter_softc, struct scsi_queue *sq));
-static void adv_free_cdb __P((void *adapter_softc, struct scsi_queue *sq,
- void *cdb));
static timeout_t
adv_timeout;
static int adv_qdone __P((struct adv_softc *adv));
@@ -79,13 +76,11 @@ struct adv_softc *advsoftcs[NADV]; /* XXX Config should handle this */
static struct scsi_adapter adv_switch =
{
- adv_scsi_cmd,
- advminphys,
- 0,
- 0,
- adv_get_cdb,
- adv_free_cdb,
- "adv"
+ adv_scsi_cmd,
+ advminphys,
+ NULL,
+ NULL,
+ "adv"
};
static void
@@ -121,7 +116,7 @@ adv_scsi_cmd(xs)
scsiq.q2.tag_code = xs->tag_type;
scsiq.q2.vm_id = 0;
scsiq.sg_head = NULL;
- scsiq.cdbptr = &xs->cmdstore;
+ scsiq.cdbptr = &xs->cmd;
if (xs->datalen) {
/*
@@ -190,10 +185,8 @@ adv_scsi_cmd(xs)
}
if (adv_execute_scsi_queue(adv, &scsiq) != 0) {
- /* XXX Add freeze queue functionality */
- xs->error = XS_BUSY;
+ xs->error = XS_QUEUE_RESOURCE_SHORTAGE;
scsi_done(xs);
- DELAY(20 * 1000 * 1000);
} else if ((xs->flags & SCSI_POLL) != 0) {
/*
* If we can't use interrupts, poll for completion
@@ -219,22 +212,6 @@ advminphys(bp)
bp->b_bcount = ((ADV_MAX_SG_LIST - 1) * PAGE_SIZE);
}
-static void *
-adv_get_cdb(adapter_softc, sq)
- void *adapter_softc;
- struct scsi_queue *sq;
-{
- return ((void *)1);
-}
-
-static void
-adv_free_cdb(adapter_softc, sq, cdb)
- void *adapter_softc;
- struct scsi_queue *sq;
- void *cdb;
-{
-}
-
static void
adv_timeout(arg)
void *arg;
@@ -691,8 +668,10 @@ adv_done(adv, qdonep)
break;
default:
/* QHSTA error occurred */
+#if 0
/* XXX Can I get more explicit information here? */
xs->error = XS_DRIVER_STUFFUP;
+#endif
break;
}
break;
@@ -700,7 +679,8 @@ adv_done(adv, qdonep)
case QD_WITH_ERROR:
switch (qdonep->d3.host_stat) {
case QHSTA_NO_ERROR:
- if (qdonep->d3.scsi_stat == SCSI_CHECK) {
+ if ((qdonep->d3.scsi_stat == STATUS_CHECK_CONDITION)
+ || (qdonep->d3.scsi_stat == STATUS_COMMAND_TERMINATED)) {
/* We have valid sense information to return */
xs->error = XS_SENSE;
if (adv->sense_buffers != NULL)
@@ -712,23 +692,28 @@ adv_done(adv, qdonep)
xs->error = XS_SELTIMEOUT;
break;
default:
+#if 0
/* XXX Can I get more explicit information here? */
xs->error = XS_DRIVER_STUFFUP;
+#endif
break;
}
break;
case QD_ABORTED_BY_HOST:
/* XXX Should have an explicit ABORTED error code */
- xs->error = XS_DRIVER_STUFFUP;
+ xs->error = XS_ABORTED;
break;
default:
- printf("adv_done: Unknown done status 0x%x\n", qdonep->d3.done_stat);
+#if 0
+ printf("adv_done: Unknown done status 0x%x\n",
+ qdonep->d3.done_stat);
xs->error = XS_DRIVER_STUFFUP;
+#endif
break;
}
- xs->flags |= ITSDONE;
+ xs->flags |= SCSI_ITSDONE;
scsi_done(xs);
return;
}
@@ -748,7 +733,7 @@ adv_poll(adv, xs)
do {
DELAY(1000);
adv_intr((void *)adv);
- } while (--wait && ((xs->flags & ITSDONE) == 0));
+ } while (--wait && ((xs->flags & SCSI_ITSDONE) == 0));
if (wait == 0) {
printf("adv%d: board is not responding\n", adv->unit);
return (EIO);
OpenPOWER on IntegriCloud