Module Name: src Committed By: nat Date: Sat Oct 26 20:53:08 UTC 2024
Modified Files: src/sys/arch/mac68k/dev: sbc.c Log Message: Rework of previous. While here set the priority in sync witho pdma_in/out. Use sbc_ready same as pdma_in/out. To generate a diff of this commit: cvs rdiff -u -r1.60 -r1.61 src/sys/arch/mac68k/dev/sbc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/mac68k/dev/sbc.c diff -u src/sys/arch/mac68k/dev/sbc.c:1.60 src/sys/arch/mac68k/dev/sbc.c:1.61 --- src/sys/arch/mac68k/dev/sbc.c:1.60 Sat Sep 14 21:11:07 2024 +++ src/sys/arch/mac68k/dev/sbc.c Sat Oct 26 20:53:07 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: sbc.c,v 1.60 2024/09/14 21:11:07 nat Exp $ */ +/* $NetBSD: sbc.c,v 1.61 2024/10/26 20:53:07 nat Exp $ */ /* * Copyright (C) 1996 Scott Reynolds. All rights reserved. @@ -45,7 +45,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sbc.c,v 1.60 2024/09/14 21:11:07 nat Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sbc.c,v 1.61 2024/10/26 20:53:07 nat Exp $"); #include "opt_ddb.h" @@ -430,12 +430,12 @@ sbc_drq_intr(void *p) u_int32_t *long_data; volatile u_int8_t *drq = 0; /* XXX gcc4 -Wuninitialized */ u_int8_t *data; - int block, count, dcount, resid; + int count, dcount, s; /* * If we're not ready to xfer data, or have no more, just return. */ - if ((*ncr_sc->sci_csr & SCI_CSR_DREQ) == 0 || dh->dh_len == 0) + if (sbc_ready(ncr_sc) || dh->dh_len == 0) return; #ifdef SBC_DEBUG @@ -443,6 +443,7 @@ sbc_drq_intr(void *p) printf("%s: drq intr, dh_len=0x%x, dh_flags=0x%x\n", device_xname(ncr_sc->sc_dev), dh->dh_len, dh->dh_flags); #endif + s = splbio(); /* * Setup for a possible bus error caused by SCSI controller @@ -451,6 +452,7 @@ sbc_drq_intr(void *p) */ nofault = &faultbuf; + m68k_fault_addr = 0; if (setjmp(nofault)) { nofault = (label_t *)0; if ((dh->dh_flags & SBC_DH_DONE) == 0) { @@ -476,60 +478,61 @@ sbc_drq_intr(void *p) #endif m68k_fault_addr = 0; + splx(s); + return; } +#define CHECKMORE if (sbc_ready(ncr_sc)) { \ + dh->dh_len -= dcount - count; \ + dh->dh_addr += dcount - count; \ + if (dh->dh_len) \ + goto no_more; \ + } + if (dh->dh_flags & SBC_DH_OUT) { /* Data Out */ dcount = 0; /* * Get the source address aligned. */ - resid = + dcount = count = uimin(dh->dh_len, 4 - (((int)dh->dh_addr) & 0x3)); if (count && count < 4) { drq = (volatile u_int8_t *)sc->sc_drq_addr; data = (u_int8_t *)dh->dh_addr; -#define W1 *drq++ = *data++ +#define W1 CHECKMORE *drq++ = *data++ while (count) { W1; count--; } #undef W1 - dh->dh_addr += resid; - dh->dh_len -= resid; + dh->dh_addr += dcount; + dh->dh_len -= dcount; } /* * Start the transfer. */ while (dh->dh_len) { - if ((*ncr_sc->sci_csr & SCI_CSR_DREQ) == 0) - goto no_more; - - block = 512; - if (resid && resid != 4) - block -= 4; - resid = 0; +#define W4 CHECKMORE *long_drq++ = *long_data++; count -= 4 - dcount = count = uimin(dh->dh_len, block); + dcount = count = uimin(dh->dh_len, MAX_DMA_LEN); long_drq = (volatile u_int32_t *)sc->sc_drq_addr; long_data = (u_int32_t *)dh->dh_addr; -#define W4 *long_drq++ = *long_data++ while (count >= 64) { W4; W4; W4; W4; W4; W4; W4; W4; W4; W4; W4; W4; W4; W4; W4; W4; /* 64 */ - count -= 64; } while (count >= 4) { - W4; count -= 4; + W4; } #undef W4 data = (u_int8_t *)long_data; drq = (volatile u_int8_t *)long_drq; -#define W1 *drq++ = *data++ +#define W1 CHECKMORE *drq++ = *data++ while (count) { W1; count--; } @@ -538,6 +541,8 @@ sbc_drq_intr(void *p) dh->dh_addr += dcount; } dh->dh_flags |= SBC_DH_DONE; + if (dcount >= MAX_DMA_LEN) + drq = (volatile u_int8_t *)sc->sc_drq_addr; /* * XXX -- Read a byte from the SBC to trigger a /BERR. @@ -549,49 +554,40 @@ sbc_drq_intr(void *p) /* * Get the dest address aligned. */ - resid = + dcount = count = uimin(dh->dh_len, 4 - (((int)dh->dh_addr) & 0x3)); if (count && count < 4) { data = (u_int8_t *)dh->dh_addr; drq = (volatile u_int8_t *)sc->sc_drq_addr; while (count) { - *data++ = *drq++; + CHECKMORE *data++ = *drq++; count--; } - dh->dh_addr += resid; - dh->dh_len -= resid; + dh->dh_addr += dcount; + dh->dh_len -= dcount; } /* * Start the transfer. */ while (dh->dh_len) { - if ((*ncr_sc->sci_csr & SCI_CSR_DREQ) == 0) - goto no_more; - - block = 512; - if (resid && resid != 4) - block -= 4; - resid = 0; - - dcount = count = uimin(dh->dh_len, block); + dcount = count = uimin(dh->dh_len, MAX_DMA_LEN); long_data = (u_int32_t *)dh->dh_addr; long_drq = (volatile u_int32_t *)sc->sc_drq_addr; -#define R4 *long_data++ = *long_drq++ +#define R4 CHECKMORE *long_data++ = *long_drq++; count -= 4 while (count >= 64) { R4; R4; R4; R4; R4; R4; R4; R4; R4; R4; R4; R4; R4; R4; R4; R4; /* 64 */ - count -= 64; } while (count >= 4) { - R4; count -= 4; + R4; } #undef R4 data = (u_int8_t *)long_data; drq = (volatile u_int8_t *)long_drq; while (count) { - *data++ = *drq++; + CHECKMORE *data++ = *drq++; count--; } dh->dh_len -= dcount; @@ -599,6 +595,7 @@ sbc_drq_intr(void *p) } dh->dh_flags |= SBC_DH_DONE; } +#undef CHECKMORE no_more: /* @@ -607,6 +604,8 @@ no_more: */ nofault = (label_t *)0; + splx(s); + #ifdef SBC_DEBUG if (sbc_debug & (SBC_DB_REG | SBC_DB_INTR)) printf("%s: drq intr complete: csr=0x%x, bus_csr=0x%x\n",