Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/thorpej_scsipi]: src/sys/arch/arm32/podulebus Sync with HEAD and correct...
details: https://anonhg.NetBSD.org/src/rev/57d62ac98720
branches: thorpej_scsipi
changeset: 477495:57d62ac98720
user: bouyer <bouyer%NetBSD.org@localhost>
date: Tue Apr 24 08:22:42 2001 +0000
description:
Sync with HEAD and correct previous merge errors.
diffstat:
sys/arch/arm32/podulebus/sbic.c | 185 +++++++++++++++++--------------------
sys/arch/arm32/podulebus/sbicvar.h | 6 +-
2 files changed, 88 insertions(+), 103 deletions(-)
diffs (truncated from 507 to 300 lines):
diff -r 4f5c5128d611 -r 57d62ac98720 sys/arch/arm32/podulebus/sbic.c
--- a/sys/arch/arm32/podulebus/sbic.c Tue Apr 24 07:29:31 2001 +0000
+++ b/sys/arch/arm32/podulebus/sbic.c Tue Apr 24 08:22:42 2001 +0000
@@ -1,6 +1,7 @@
-/* $NetBSD: sbic.c,v 1.13.2.6 2001/04/23 09:41:38 bouyer Exp $ */
+/* $NetBSD: sbic.c,v 1.13.2.7 2001/04/24 08:22:42 bouyer Exp $ */
/*
+ * Copyright (c) 2001 Richard Earnshaw
* Copyright (c) 1994 Christian E. Hopps
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
@@ -93,8 +94,8 @@
extern u_int kvtop();
-static int sbicicmd (struct sbic_softc *, int, int, void *,
- int, void *, int);
+static int sbicicmd (struct sbic_softc *, int, int,
+ struct sbic_acb *);
static int sbicgo (struct sbic_softc *, struct scsipi_xfer *);
static int sbicdmaok (struct sbic_softc *, struct scsipi_xfer *);
static int sbicwait (sbic_regmap_p, char, int , int);
@@ -278,8 +279,8 @@
acb->sc_dmacmd, asr), data_pointer_debug == -1);
/* Fixup partial xfers */
- acb->sc_kv.dc_addr += (dev->sc_tcnt - count);
- acb->sc_kv.dc_count -= (dev->sc_tcnt - count);
+ acb->data += (dev->sc_tcnt - count);
+ acb->datalen -= (dev->sc_tcnt - count);
acb->sc_pa.dc_addr += (dev->sc_tcnt - count);
acb->sc_pa.dc_count -= ((dev->sc_tcnt - count)>>1);
@@ -307,7 +308,7 @@
SBIC_TRACE(dev);
acb = dev->sc_nexus;
- if (!acb->sc_kv.dc_count) {
+ if (!acb->datalen) {
/* No data to xfer */
SBIC_TRACE(dev);
return;
@@ -327,19 +328,19 @@
/* do kvm to pa mappings */
#if 0 /* mark */
paddr = acb->sc_pa.dc_addr =
- (char *) kvtop(acb->sc_kv.dc_addr);
+ (char *) kvtop(acb->data);
#endif
- vaddr = acb->sc_kv.dc_addr;
- count = acb->sc_kv.dc_count;
+ vaddr = acb->data;
+ count = acb->datalen;
#if 0 /* mark */
for (count = (NBPG - ((int)vaddr & PGOFSET));
- count < acb->sc_kv.dc_count
+ count < acb->datalen
&& (char*)kvtop(vaddr + count + 4) == paddr + count + 4;
count += NBPG);
#endif
/* If it's all contiguous... */
- if (count > acb->sc_kv.dc_count) {
- count = acb->sc_kv.dc_count;
+ if (count > acb->datalen) {
+ count = acb->datalen;
DBG(sbicdma_hits++);
} else {
@@ -349,7 +350,7 @@
acb->sc_pa.dc_count = count >> 1;
DBGPRINTF(("DMA recalc:kv(%p,%x)pa(%p,%lx)\n",
- acb->sc_kv.dc_addr, acb->sc_kv.dc_count,
+ acb->data, acb->datalen,
acb->sc_pa.dc_addr, acb->sc_tcnt),
data_pointer_debug);
}
@@ -369,7 +370,7 @@
* so I will too. I could plug it in, however so could they
* in scsi_scsi_cmd().
*/
-static void
+void
sbic_scsi_request(struct scsipi_channel *chan,
scsipi_adapter_req_t req, void *arg)
{
@@ -416,12 +417,13 @@
acb->xs = xs;
bcopy(xs->cmd, &acb->cmd, xs->cmdlen);
acb->clen = xs->cmdlen;
- acb->sc_kv.dc_addr = xs->data;
- acb->sc_kv.dc_count = xs->datalen;
+ acb->data = xs->data;
+ acb->datalen = xs->datalen;
if (flags & XS_CTL_POLL) {
s = splbio();
/*
- * This has major side effects -- it locks up the machine
+ * This has major side effects -- it locks up the
+ * machine
*/
dev->sc_flags |= SBICF_ICMD;
@@ -430,13 +432,10 @@
sbicpoll(dev);
dev->sc_nexus = acb;
dev->sc_stat[0] = -1;
- dev->sc_xs = xs;
dev->target = periph->periph_target;
dev->lun = periph->periph_lun;
- stat = sbicicmd(dev,
- periph->periph_target, periph->periph_lun,
- &acb->cmd, acb->clen,
- acb->sc_kv.dc_addr, acb->sc_kv.dc_count);
+ stat = sbicicmd(dev, periph->periph_target,
+ periph->periph_lun, acb);
} while (dev->sc_nexus != acb);
sbic_scsidone(acb, stat);
splx(s);
@@ -444,22 +443,23 @@
return;
}
- acb->flags = ACB_ACTIVE;
- if (flags & XS_CTL_DATA_IN)
- acb->flags |= ACB_DATAIN;
- acb->xs = xs;
- memcpy(&acb->cmd, xs->cmd, xs->cmdlen);
- acb->clen = xs->cmdlen;
- acb->sc_kv.dc_addr = xs->data;
- acb->sc_kv.dc_count = xs->datalen;
-
- if (flags & XS_CTL_POLL) {
+ s = splbio();
+ TAILQ_INSERT_TAIL(&dev->ready_list, acb, chain);
+ if (dev->sc_nexus) {
+ splx(s);
+ SBIC_TRACE(dev);
+ return;
+ }
+ /*
+ * nothing is active, try to start it now.
+ */
sbic_sched(dev);
splx(s);
SBIC_TRACE(dev);
/* TODO: add sbic_poll to do XS_CTL_POLL operations */
return;
+
case ADAPTER_REQ_GROW_RESOURCES:
case ADAPTER_REQ_SET_XFER_MODE:
/* XXX Not supported. */
@@ -503,7 +503,7 @@
if (acb == NULL)
return; /* did not find an available command */
- dev->sc_xs = xs = acb->xs;
+ xs = acb->xs;
periph = xs->xs_periph;
flags = xs->xs_control;
@@ -515,11 +515,10 @@
dev->sc_stat[0] = -1;
dev->target = periph->periph_target;
dev->lun = periph->periph_lun;
- if ((flags & XS_CTL_POLL) || ( !sbic_parallel_operations
- && (sbicdmaok(dev, xs) == 0) ) )
+ if ((flags & XS_CTL_POLL) ||
+ ( !sbic_parallel_operations && (sbicdmaok(dev, xs) == 0) ) )
stat = sbicicmd(dev, periph->periph_target,
- periph->periph_lun, &acb->cmd, acb->clen,
- acb->sc_kv.dc_addr, acb->sc_kv.dc_count);
+ periph->periph_lun, acb);
else if (sbicgo(dev, xs) == 0 && xs->error != XS_SELTIMEOUT) {
SBIC_TRACE(dev);
return;
@@ -557,7 +556,8 @@
if( data_pointer_debug > 1 )
DBGPRINTF(("scsidone: (%d,%d)->(%d,%d)%02x\n",
periph->periph_target, periph->periph_lun,
- dev->target, dev->lun, stat), data_pointer_debug > 1);
+ dev->target, dev->lun, stat),
+ data_pointer_debug > 1);
DBG(if( xs->xs_periph->periph_target == dev->sc_channel.chan_id )
panic("target == hostid"));
@@ -577,8 +577,8 @@
*/
if (acb == dev->sc_nexus) {
dev->sc_nexus = NULL;
- dev->sc_xs = NULL;
- dev->sc_tinfo[periph->periph_target].lubusy &= ~(1<<periph->periph_lun);
+ dev->sc_tinfo[periph->periph_target].lubusy &=
+ ~(1<<periph->periph_lun);
if (dev->ready_list.tqh_first)
dosched = 1; /* start next command */
} else if (dev->ready_list.tqh_last == &acb->chain.tqe_next) {
@@ -791,7 +791,6 @@
TAILQ_INIT(&dev->free_list);
callout_init(&dev->sc_timo_ch);
dev->sc_nexus = NULL;
- dev->sc_xs = NULL;
acb = dev->sc_acb;
memset(acb, 0, sizeof(dev->sc_acb));
@@ -914,7 +913,6 @@
TAILQ_INIT(&dev->nexus_list);
TAILQ_INIT(&dev->free_list);
dev->sc_nexus = NULL;
- dev->sc_xs = NULL;
acb = dev->sc_acb;
memset(acb, 0, sizeof(dev->sc_acb));
for (i = 0; i < sizeof(dev->sc_acb) / sizeof(*acb); i++) {
@@ -941,15 +939,11 @@
static void
sbicerror(struct sbic_softc *dev, sbic_regmap_p regs, u_char csr)
{
- struct scsipi_xfer *xs;
-
- xs = dev->sc_xs;
-
#ifdef DIAGNOSTIC
- if (xs == NULL)
+ if (dev->sc_nexus == NULL)
panic("sbicerror");
#endif
- if (xs->xs_control & XS_CTL_SILENT)
+ if (dev->sc_nexus->xs->xs_control & XS_CTL_SILENT)
return;
printf("%s: ", dev->sc_dev.dv_xname);
@@ -1085,7 +1079,7 @@
if (dev->sc_sync[id].state != SYNC_START){
- if ((dev->sc_xs->xs_control & XS_CTL_POLL)
+ if ((dev->sc_nexus->xs->xs_control & XS_CTL_POLL)
|| (dev->sc_flags & SBICF_ICMD)
|| !sbic_enable_reselect)
SEND_BYTE(regs, MSG_IDENTIFY | lun);
@@ -1134,7 +1128,7 @@
dev->sc_flags |= SBICF_SELECTED;
}
if (csr == SBIC_CSR_SEL_TIMEO)
- dev->sc_xs->error = XS_SELTIMEOUT;
+ dev->sc_nexus->xs->error = XS_SELTIMEOUT;
QPRINTF(("\n"));
@@ -1308,18 +1302,19 @@
* command must supply no data.
*/
static int
-sbicicmd(struct sbic_softc *dev, int target, int lun, void *cbuf, int clen,
- void *buf, int len)
+sbicicmd(struct sbic_softc *dev, int target, int lun, struct sbic_acb *acb)
{
sbic_regmap_p regs;
u_char phase, csr, asr;
int wait;
/* int newtarget, cmd_sent, parity_err;*/
- struct sbic_acb *acb;
/* int discon;*/
int i;
+ void *cbuf, *buf;
+ int clen, len;
+
#define CSR_LOG_BUF_SIZE 0
#if CSR_LOG_BUF_SIZE
int bufptr;
@@ -1327,20 +1322,22 @@
bufptr=0;
#endif
+ cbuf = &acb->cmd;
+ clen = acb->clen;
+ buf = acb->data;
+ len = acb->datalen;
+
SBIC_TRACE(dev);
regs = &dev->sc_sbicp;
- acb = dev->sc_nexus;
/* Make sure pointers are OK */
dev->sc_last = dev->sc_cur = &acb->sc_pa;
dev->sc_tcnt = acb->sc_tcnt = 0;
acb->sc_pa.dc_count = 0; /* No DMA */
- acb->sc_kv.dc_addr = buf;
- acb->sc_kv.dc_count = len;
DBG(routine = 3);
DBG(debug_sbic_regs = regs); /* store this to allow debug calls */
- DBGPRINTF(("sbicicmd(%d,%d):%d\n", target, lun, acb->sc_kv.dc_count),
+ DBGPRINTF(("sbicicmd(%d,%d):%d\n", target, lun, len),
data_pointer_debug > 1);
Home |
Main Index |
Thread Index |
Old Index