From 3c546f4f6be4ce4df523b87418ab0400f53a35b0 Mon Sep 17 00:00:00 2001 From: chuck Date: Sat, 3 Feb 1996 18:33:00 +0000 Subject: Ensure siop_acb alignment via malloc rather than let alignment depend on the size of MI data structures that come before it in the softc. Chip will not function properly if alignment is wrong. Detected and fixed by: Chuck Cranor and Michael L Hitch --- sys/arch/amiga/dev/siop.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'sys/arch/amiga/dev/siop.c') diff --git a/sys/arch/amiga/dev/siop.c b/sys/arch/amiga/dev/siop.c index ebbd360fbe8..a572aef9390 100644 --- a/sys/arch/amiga/dev/siop.c +++ b/sys/arch/amiga/dev/siop.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -531,11 +532,20 @@ siopinitialize(sc) /* * Need to check that scripts is on a long word boundary - * and that DS is on a long word boundary. * Also should verify that dev doesn't span non-contiguous * physical pages. */ sc->sc_scriptspa = kvtop(scripts); + + /* + * malloc sc_acb to ensure that DS is on a long word boundary. + */ + + MALLOC(sc->sc_acb, struct siop_acb *, + sizeof(struct siop_acb) * SIOP_NACB, M_DEVBUF, M_NOWAIT); + if (sc->sc_acb == NULL) + panic("siopinitialize: ACB malloc failed!"); + sc->sc_tcp[1] = 1000 / sc->sc_clock_freq; sc->sc_tcp[2] = 1500 / sc->sc_clock_freq; sc->sc_tcp[3] = 2000 / sc->sc_clock_freq; @@ -640,8 +650,8 @@ siopreset(sc) TAILQ_INIT(&sc->free_list); sc->sc_nexus = NULL; acb = sc->sc_acb; - bzero(acb, sizeof(sc->sc_acb)); - for (i = 0; i < sizeof(sc->sc_acb) / sizeof(*acb); i++) { + bzero(acb, sizeof(struct siop_acb) * SIOP_NACB); + for (i = 0; i < SIOP_NACB; i++) { TAILQ_INSERT_TAIL(&sc->free_list, acb, chain); acb++; } @@ -803,7 +813,7 @@ siop_start (sc, target, lun, cbuf, clen, buf, len) #endif /* push data cache for all data the 53c710 needs to access */ - dma_cachectl (sc, sizeof (struct siop_softc)); + dma_cachectl (acb, sizeof (struct siop_acb)); dma_cachectl (cbuf, clen); if (buf != NULL && len != 0) dma_cachectl (buf, len); -- cgit v1.2.3