Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/pmax/tc - Take care of dm_segs[].dm_len value whene...



details:   https://anonhg.NetBSD.org/src/rev/bdbe8278a244
branches:  trunk
changeset: 487404:bdbe8278a244
user:      nisimura <nisimura%NetBSD.org@localhost>
date:      Wed Jun 07 10:09:19 2000 +0000

description:
- Take care of dm_segs[].dm_len value whenever the offset is adjusted.
  Known not working well for 4MAX+ this moment.
- White spacing.

diffstat:

 sys/arch/pmax/tc/asc_ioasic.c |  121 ++++++++++++++++++-----------------------
 1 files changed, 53 insertions(+), 68 deletions(-)

diffs (179 lines):

diff -r a9f8a2256e1a -r bdbe8278a244 sys/arch/pmax/tc/asc_ioasic.c
--- a/sys/arch/pmax/tc/asc_ioasic.c     Wed Jun 07 09:55:22 2000 +0000
+++ b/sys/arch/pmax/tc/asc_ioasic.c     Wed Jun 07 10:09:19 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: asc_ioasic.c,v 1.8 2000/06/05 07:59:52 nisimura Exp $ */
+/* $NetBSD: asc_ioasic.c,v 1.9 2000/06/07 10:09:19 nisimura Exp $ */
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: asc_ioasic.c,v 1.8 2000/06/05 07:59:52 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: asc_ioasic.c,v 1.9 2000/06/07 10:09:19 nisimura Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -224,18 +224,17 @@
        u_int32_t ssr, scr, *p;
        size_t size;
        vaddr_t cp;
-       paddr_t ptr0, ptr1;
 
-        NCR_DMA(("%s: start %d@%p,%s\n", sc->sc_dev.dv_xname,
+       NCR_DMA(("%s: start %d@%p,%s\n", sc->sc_dev.dv_xname,
                *asc->sc_dmalen, *asc->sc_dmaaddr, ispullup ? "IN" : "OUT"));
 
        /* upto two 4KB pages */
-        size = min(*dmasize, TWOPAGE((size_t)*addr));
-        asc->sc_dmaaddr = addr;
-        asc->sc_dmalen = len;
-        asc->sc_dmasize = size;
-        asc->sc_flags = (ispullup) ? ASC_ISPULLUP : 0;
-        *dmasize = size; /* return trimmed transfer size */
+       size = min(*dmasize, TWOPAGE((size_t)*addr));
+       asc->sc_dmaaddr = addr;
+       asc->sc_dmalen = len;
+       asc->sc_dmasize = size;
+       asc->sc_flags = (ispullup) ? ASC_ISPULLUP : 0;
+       *dmasize = size; /* return trimmed transfer size */
 
        /* stop DMA engine first */
        ssr = bus_space_read_4(asc->sc_bst, asc->sc_bsh, IOASIC_CSR);
@@ -248,47 +247,46 @@
                        NULL /* kernel address */, BUS_DMA_NOWAIT))
                panic("%s: cannot allocate DMA address", sc->sc_dev.dv_xname);
 
-        /* take care of 8B constraint on starting address */
-        cp = (vaddr_t)*addr;
-        if ((cp & 7) == 0) {
-                /* comfortably aligned to 8B boundary */
-                bus_space_write_4(asc->sc_bst, asc->sc_bsh, IOASIC_SCSI_SCR, 0);
-        }
-        else {
-                /* truncate to the boundary */
-                p = (u_int32_t *)(cp & ~7);
-                /* how many 16bit quantities in subject */
-                scr = (cp >> 1) & 3;
-                /* trim down physical address too */
-                asc->sc_dmamap->dm_segs[0].ds_addr &= ~7;
-                if ((asc->sc_flags & ASC_ISPULLUP) == 0) {
+       /* take care of 8B constraint on starting address */
+       cp = (vaddr_t)*addr;
+       if ((cp & 7) == 0) {
+               /* comfortably aligned to 8B boundary */
+               scr = 0;
+       }
+       else {
+               /* truncate to the boundary */
+               p = (u_int32_t *)(cp & ~7);
+               /* how many 16bit quantities in subject */
+               scr = (cp & 7) >> 1;
+               /* trim down physical address too */
+               asc->sc_dmamap->dm_segs[0].ds_addr &= ~7;
+               asc->sc_dmamap->dm_segs[0].ds_len += (cp & 6);
+               if ((asc->sc_flags & ASC_ISPULLUP) == 0) {
                        /* push down to SCSI device */
-                        scr |= 4;
-                        /* round up physical address in this case */
-                        asc->sc_dmamap->dm_segs[0].ds_addr += 8;
-                }
-                /* pack fixup data in SDR0/SDR1 pair and instruct SCR */
-                bus_space_write_4(asc->sc_bst, asc->sc_bsh,
-                        IOASIC_SCSI_SDR0, p[0]);
-                bus_space_write_4(asc->sc_bst, asc->sc_bsh,
-                        IOASIC_SCSI_SDR1, p[1]);
-                bus_space_write_4(asc->sc_bst, asc->sc_bsh,
-                        IOASIC_SCSI_SCR, scr);
-        }
-        ptr0 = asc->sc_dmamap->dm_segs[0].ds_addr;
-        ptr1 = (asc->sc_dmamap->dm_nsegs > 1)
-               ? asc->sc_dmamap->dm_segs[1].ds_addr : ~0;
-        bus_space_write_4(asc->sc_bst, asc->sc_bsh,
-                IOASIC_SCSI_DMAPTR,
-                IOASIC_DMA_ADDR(ptr0));
-        bus_space_write_4(asc->sc_bst, asc->sc_bsh,
-                IOASIC_SCSI_NEXTPTR,
-                IOASIC_DMA_ADDR(ptr1));
+                       scr |= 4;
+                       /* round up physical address in this case */
+                       asc->sc_dmamap->dm_segs[0].ds_addr += 8;
+                       /* don't care excess cache flush */
+               }
+               /* pack fixup data in SDR0/SDR1 pair and instruct SCR */
+               bus_space_write_4(asc->sc_bst, asc->sc_bsh,
+                       IOASIC_SCSI_SDR0, p[0]);
+               bus_space_write_4(asc->sc_bst, asc->sc_bsh,
+                       IOASIC_SCSI_SDR1, p[1]);
+       }
+       bus_space_write_4(asc->sc_bst, asc->sc_bsh,
+               IOASIC_SCSI_DMAPTR,
+               IOASIC_DMA_ADDR(asc->sc_dmamap->dm_segs[0].ds_addr));
+       bus_space_write_4(asc->sc_bst, asc->sc_bsh,
+               IOASIC_SCSI_NEXTPTR,
+               (asc->sc_dmamap->dm_nsegs == 1)
+               ? ~0 : IOASIC_DMA_ADDR(asc->sc_dmamap->dm_segs[1].ds_addr));
+       bus_space_write_4(asc->sc_bst, asc->sc_bsh, IOASIC_SCSI_SCR, scr);
 
        /* synchronize dmamap contents with memory image */
-        bus_dmamap_sync(asc->sc_dmat, asc->sc_dmamap,
+       bus_dmamap_sync(asc->sc_dmat, asc->sc_dmamap,
                0, size,
-                (ispullup) ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
+               (ispullup) ? BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
 
        asc->sc_flags |= ASC_MAPLOADED;
        return 0;
@@ -315,8 +313,6 @@
        asc->sc_flags |= ASC_DMAACTIVE;
 }
 
-#define        SCRDEBUG(x)
-
 static int
 asc_ioasic_intr(sc)
        struct ncr53c9x_softc *sc;
@@ -385,33 +381,22 @@
 
        scr = bus_space_read_4(asc->sc_bst, asc->sc_bsh, IOASIC_SCSI_SCR);
        if ((asc->sc_flags & ASC_ISPULLUP) && scr != 0) {
-               u_int32_t ptr;
-               u_int16_t *p;
-               union {
-                       u_int32_t sdr[2];
-                       u_int16_t half[4];
-               } scratch;
-               scratch.sdr[0] = bus_space_read_4(asc->sc_bst, asc->sc_bsh,
+               u_int32_t sdr[2], ptr;
+
+               sdr[0] = bus_space_read_4(asc->sc_bst, asc->sc_bsh,
                                                IOASIC_SCSI_SDR0);
-               scratch.sdr[1] = bus_space_read_4(asc->sc_bst, asc->sc_bsh,
+               sdr[1] = bus_space_read_4(asc->sc_bst, asc->sc_bsh,
                                                IOASIC_SCSI_SDR1);
                ptr = bus_space_read_4(asc->sc_bst, asc->sc_bsh,
                                                IOASIC_SCSI_DMAPTR);
                ptr = (ptr >> 3) & 0x1ffffffc;
-SCRDEBUG(("SCSI_SCR -> %x, DMAPTR: %p\n", scr, (void *)ptr));
-               p = (u_int16_t *)MIPS_PHYS_TO_KSEG0(ptr);
                /*
-                * scr
-                *      1 -> half[0]
-                *      2 -> half[0] + half[1]
-                *      3 -> half[0] + half[1] + half[2]
+                * scr: 1 -> short[0]
+                *      2 -> short[0] + short[1]
+                *      3 -> short[0] + short[1] + short[2]
                 */
                scr &= IOASIC_SCR_WORD;
-               p[0] = scratch.half[0];
-               if (scr > 1)
-                       p[1] = scratch.half[1];
-               if (scr > 2)
-                       p[2] = scratch.half[2];
+               memcpy((void *)MIPS_PHYS_TO_KSEG0(ptr), sdr, scr << 1);
        }
 
        bus_dmamap_unload(asc->sc_dmat, asc->sc_dmamap);



Home | Main Index | Thread Index | Old Index