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