Don't rely on fixed padding to longword align the buffer used for non-aligned
transfers - compute aligned address when interface is attached. Fixes PR#4258.
This commit is contained in:
parent
9bec32eefe
commit
5b2fd76fd3
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: flsc.c,v 1.16 1997/10/04 04:01:31 mhitch Exp $ */
|
/* $NetBSD: flsc.c,v 1.17 1997/10/24 01:50:03 mhitch Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997 Michael L. Hitch
|
* Copyright (c) 1997 Michael L. Hitch
|
||||||
|
@ -212,6 +212,8 @@ flscattach(parent, self, aux)
|
||||||
fsc->sc_portbits = 0xa0 | FLSC_PB_EDI | FLSC_PB_ESI;
|
fsc->sc_portbits = 0xa0 | FLSC_PB_EDI | FLSC_PB_ESI;
|
||||||
fsc->sc_hardbits = fsc->sc_reg[0x40];
|
fsc->sc_hardbits = fsc->sc_reg[0x40];
|
||||||
|
|
||||||
|
fsc->sc_alignbuf = (char *)((u_long)fsc->sc_unalignbuf & -4);
|
||||||
|
|
||||||
sc->sc_dev.dv_cfdata->cf_flags |= (scsi_nosync >> shift_nosync) & 0xffff;
|
sc->sc_dev.dv_cfdata->cf_flags |= (scsi_nosync >> shift_nosync) & 0xffff;
|
||||||
shift_nosync += 16;
|
shift_nosync += 16;
|
||||||
ncr53c9x_debug |= (scsi_nosync >> shift_nosync) & 0xffff;
|
ncr53c9x_debug |= (scsi_nosync >> shift_nosync) & 0xffff;
|
||||||
|
@ -584,8 +586,8 @@ flsc_dma_setup(sc, addr, len, datain, dmasize)
|
||||||
* If unaligned address, read unaligned bytes into alignment buffer
|
* If unaligned address, read unaligned bytes into alignment buffer
|
||||||
*/
|
*/
|
||||||
else if ((int)ptr & 3 || xfer & 3) {
|
else if ((int)ptr & 3 || xfer & 3) {
|
||||||
pa = kvtop((caddr_t)&fsc->sc_alignbuf);
|
pa = kvtop((caddr_t)fsc->sc_alignbuf);
|
||||||
xfer = fsc->sc_dmasize = min(xfer, sizeof (fsc->sc_alignbuf));
|
xfer = fsc->sc_dmasize = min(xfer, sizeof (fsc->sc_unalignbuf));
|
||||||
NCR_DMA(("flsc_dma_setup: align read by %d bytes\n", xfer));
|
NCR_DMA(("flsc_dma_setup: align read by %d bytes\n", xfer));
|
||||||
fsc->sc_xfr_align = 1;
|
fsc->sc_xfr_align = 1;
|
||||||
}
|
}
|
||||||
|
@ -596,7 +598,7 @@ flsc_dma_setup(sc, addr, len, datain, dmasize)
|
||||||
else if (fsc->sc_dmasize < 4) {
|
else if (fsc->sc_dmasize < 4) {
|
||||||
NCR_DMA(("flsc_dma_setup: read remaining %d bytes\n",
|
NCR_DMA(("flsc_dma_setup: read remaining %d bytes\n",
|
||||||
fsc->sc_dmasize));
|
fsc->sc_dmasize));
|
||||||
pa = kvtop((caddr_t)&fsc->sc_alignbuf);
|
pa = kvtop((caddr_t)fsc->sc_alignbuf);
|
||||||
fsc->sc_xfr_align = 1;
|
fsc->sc_xfr_align = 1;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -623,10 +625,10 @@ flsc_dma_setup(sc, addr, len, datain, dmasize)
|
||||||
if (mmutype == MMU_68040) {
|
if (mmutype == MMU_68040) {
|
||||||
if (fsc->sc_xfr_align) {
|
if (fsc->sc_xfr_align) {
|
||||||
int n;
|
int n;
|
||||||
for (n = 0; n < sizeof (fsc->sc_alignbuf); ++n)
|
for (n = 0; n < sizeof (fsc->sc_unalignbuf); ++n)
|
||||||
fsc->sc_alignbuf[n] = n | 0x80;
|
fsc->sc_alignbuf[n] = n | 0x80;
|
||||||
dma_cachectl(fsc->sc_alignbuf,
|
dma_cachectl(fsc->sc_alignbuf,
|
||||||
sizeof(fsc->sc_alignbuf));
|
sizeof(fsc->sc_unalignbuf));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
dma_cachectl(*fsc->sc_dmaaddr, fsc->sc_dmasize);
|
dma_cachectl(*fsc->sc_dmaaddr, fsc->sc_dmasize);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: flscvar.h,v 1.3 1997/10/04 04:01:33 mhitch Exp $ */
|
/* $NetBSD: flscvar.h,v 1.4 1997/10/24 01:50:08 mhitch Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 1997 Michael L. Hitch.
|
* Copyright (c) 1997 Michael L. Hitch.
|
||||||
|
@ -49,8 +49,9 @@ struct flsc_softc {
|
||||||
size_t *sc_pdmalen;
|
size_t *sc_pdmalen;
|
||||||
vm_offset_t sc_pa;
|
vm_offset_t sc_pa;
|
||||||
|
|
||||||
u_char sc_pad1[18]; /* XXX */
|
char *sc_alignbuf;
|
||||||
u_char sc_alignbuf[256];
|
u_char sc_pad1[2]; /* XXX */
|
||||||
|
u_char sc_unalignbuf[256];
|
||||||
u_char sc_pad2[16];
|
u_char sc_pad2[16];
|
||||||
u_char sc_hardbits;
|
u_char sc_hardbits;
|
||||||
u_char sc_portbits;
|
u_char sc_portbits;
|
||||||
|
|
Loading…
Reference in New Issue