diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/i2o/iop.c | 49 | ||||
-rw-r--r-- | sys/dev/i2o/iopvar.h | 13 |
2 files changed, 34 insertions, 28 deletions
diff --git a/sys/dev/i2o/iop.c b/sys/dev/i2o/iop.c index 66202f78140..d4f1d2999c5 100644 --- a/sys/dev/i2o/iop.c +++ b/sys/dev/i2o/iop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: iop.c,v 1.10 2001/06/26 12:06:31 mickey Exp $ */ +/* $OpenBSD: iop.c,v 1.11 2001/06/26 20:05:21 niklas Exp $ */ /* $NetBSD: iop.c,v 1.12 2001/03/21 14:27:05 ad Exp $ */ /*- @@ -222,15 +222,14 @@ void iop_adjqparam(struct iop_softc *, int); void iop_create_reconf_thread(void *); int iop_handle_reply(struct iop_softc *, u_int32_t); int iop_hrt_get(struct iop_softc *); -int iop_hrt_get0(struct iop_softc *, struct i2o_hrt *, int); +int iop_hrt_get0(struct iop_softc *, struct i2o_hrt *, size_t); void iop_intr_event(struct device *, struct iop_msg *, void *); -int iop_lct_get0(struct iop_softc *, struct i2o_lct *, int, - u_int32_t); +int iop_lct_get0(struct iop_softc *, struct i2o_lct *, size_t, u_int32_t); void iop_msg_poll(struct iop_softc *, struct iop_msg *, int); void iop_msg_wait(struct iop_softc *, struct iop_msg *, int); int iop_ofifo_init(struct iop_softc *); int iop_passthrough(struct iop_softc *, struct ioppt *); -int iop_post(struct iop_softc *, u_int32_t *, int size); +int iop_post(struct iop_softc *, u_int32_t *); void iop_reconf_thread(void *); void iop_release_mfa(struct iop_softc *, u_int32_t); int iop_reset(struct iop_softc *); @@ -922,7 +921,7 @@ iop_status_get(struct iop_softc *sc, int nosleep) bzero(st, sizeof(*st)); bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, BUS_DMASYNC_PREREAD); - if ((rv = iop_post(sc, (u_int32_t *)&mf, sizeof(mf)))) + if ((rv = iop_post(sc, (u_int32_t *)&mf))) return (rv); /* XXX */ @@ -960,6 +959,7 @@ iop_ofifo_init(struct iop_softc *sc) mb[sizeof(*mf) / sizeof(u_int32_t) + 0] = sizeof(*sw) | I2O_SGL_SIMPLE | I2O_SGL_END_BUFFER | I2O_SGL_END; mb[sizeof(*mf) / sizeof(u_int32_t) + 1] = sc->sc_scr_seg->ds_addr; + mb[0] += 2 << 16; *sw = 0; bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, BUS_DMASYNC_PREREAD); @@ -970,7 +970,7 @@ iop_ofifo_init(struct iop_softc *sc) * that if you don't want to get the list of MFAs, an IGNORE SGL is * necessary; this isn't the case (and is in fact a bad thing). */ - if ((rv = iop_post(sc, mb, sizeof(*mf) + 2 * sizeof(*mb)))) + if ((rv = iop_post(sc, mb))) return (rv); /* XXX */ @@ -1034,7 +1034,7 @@ iop_ofifo_init(struct iop_softc *sc) * Read the specified number of bytes from the IOP's hardware resource table. */ int -iop_hrt_get0(struct iop_softc *sc, struct i2o_hrt *hrt, int size) +iop_hrt_get0(struct iop_softc *sc, struct i2o_hrt *hrt, size_t size) { struct iop_msg *im; struct i2o_exec_hrt_get *mf; @@ -1062,7 +1062,8 @@ int iop_hrt_get(struct iop_softc *sc) { struct i2o_hrt hrthdr, *hrt; - int size, rv; + size_t size; + int rv; PHOLD(curproc); rv = iop_hrt_get0(sc, &hrthdr, sizeof(hrthdr)); @@ -1097,7 +1098,7 @@ iop_hrt_get(struct iop_softc *sc) * to wait indefinitely. */ int -iop_lct_get0(struct iop_softc *sc, struct i2o_lct *lct, int size, +iop_lct_get0(struct iop_softc *sc, struct i2o_lct *lct, size_t size, u_int32_t chgind) { struct iop_msg *im; @@ -1136,7 +1137,8 @@ iop_lct_get0(struct iop_softc *sc, struct i2o_lct *lct, int size, int iop_lct_get(struct iop_softc *sc) { - int esize, size, rv; + size_t esize, size; + int rv; struct i2o_lct *lct; esize = letoh32(sc->sc_status.expectedlctsize); @@ -1180,7 +1182,7 @@ iop_lct_get(struct iop_softc *sc) */ int iop_param_op(struct iop_softc *sc, int tid, struct iop_initiator *ii, - int write, int group, void *buf, int size) + int write, int group, void *buf, size_t size) { struct iop_msg *im; struct i2o_util_params_op *mf; @@ -1372,7 +1374,7 @@ iop_reset(struct iop_softc *sc) *sw = 0; bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, BUS_DMASYNC_PREREAD); - if ((rv = iop_post(sc, (u_int32_t *)&mf, sizeof(mf)))) + if ((rv = iop_post(sc, (u_int32_t *)&mf))) return (rv); /* XXX */ @@ -1689,7 +1691,7 @@ iop_msg_free(struct iop_softc *sc, struct iop_msg *im) */ int iop_msg_map(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb, - void *xferaddr, int xfersize, int out) + void *xferaddr, size_t xfersize, int out) { bus_dmamap_t dm; bus_dma_segment_t *ds; @@ -1731,7 +1733,7 @@ iop_msg_map(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb, */ off = mb[0] >> 16; p = mb + off; - nsegs = ((IOP_MAX_MSG_SIZE / 4) - off) >> 1; + nsegs = ((IOP_MAX_MSG_SIZE / sizeof *mb) - off) >> 1; if (dm->dm_nsegs > nsegs) { bus_dmamap_unload(sc->sc_dmat, ix->ix_map); @@ -1914,13 +1916,14 @@ iop_msg_unmap(struct iop_softc *sc, struct iop_msg *im) * Post a message frame to the IOP's inbound queue. */ int -iop_post(struct iop_softc *sc, u_int32_t *mb, int size) +iop_post(struct iop_softc *sc, u_int32_t *mb) { u_int32_t mfa; int s; + size_t size = mb[0] >> 14 & ~3; /* ZZZ */ - if (size > IOP_MAX_MSG_SIZE) + if (size > IOP_MAX_MSG_SIZE) panic("iop_post: frame too large"); #ifdef I2ODEBUG @@ -1928,7 +1931,7 @@ iop_post(struct iop_softc *sc, u_int32_t *mb, int size) int i; printf("\niop_post\n"); - for (i = 0; i < size / 4; i++) + for (i = 0; i < size / sizeof *mb; i++) printf("%4d %08x\n", i, mb[i]); } #endif @@ -1954,8 +1957,9 @@ iop_post(struct iop_softc *sc, u_int32_t *mb, int size) BUS_DMASYNC_PREREAD); /* Copy out the message frame. */ - bus_space_write_region_4(sc->sc_iot, sc->sc_ioh, mfa, mb, size / 4); - bus_space_barrier(sc->sc_iot, sc->sc_ioh, mfa, size & ~3, + bus_space_write_region_4(sc->sc_iot, sc->sc_ioh, mfa, mb, + size / sizeof *mb); + bus_space_barrier(sc->sc_iot, sc->sc_ioh, mfa, size, BUS_SPACE_BARRIER_WRITE); /* Post the MFA back to the IOP. */ @@ -1972,13 +1976,14 @@ int iop_msg_post(struct iop_softc *sc, struct iop_msg *im, void *xmb, int timo) { u_int32_t *mb = xmb; - int rv, s, size = mb[0] >> 16; + int rv, s; + size_t size = mb[0] >> 14 & 3; /* Terminate the scatter/gather list chain. */ if ((im->im_flags & IM_SGLOFFADJ) != 0) mb[size - 2] |= I2O_SGL_END; - if ((rv = iop_post(sc, mb, size)) != 0) + if ((rv = iop_post(sc, mb)) != 0) return (rv); if ((im->im_flags & IM_DISCARD) != 0) diff --git a/sys/dev/i2o/iopvar.h b/sys/dev/i2o/iopvar.h index ecc7899a2d2..0d44688ad6f 100644 --- a/sys/dev/i2o/iopvar.h +++ b/sys/dev/i2o/iopvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: iopvar.h,v 1.5 2001/06/26 12:06:31 mickey Exp $ */ +/* $OpenBSD: iopvar.h,v 1.6 2001/06/26 20:05:22 niklas Exp $ */ /* $NetBSD: iopvar.h,v 1.5 2001/03/20 13:01:49 ad Exp $ */ /*- @@ -168,7 +168,7 @@ void iop_init(struct iop_softc *, const char *); int iop_intr __P((void *)); int iop_lct_get(struct iop_softc *); int iop_param_op(struct iop_softc *, int, struct iop_initiator *, int, - int, void *, int); + int, void *, size_t); int iop_print_ident(struct iop_softc *, int); int iop_simple_cmd(struct iop_softc *, int, int, int, int, int); void iop_strvis(struct iop_softc *, const char *, int, char *, int); @@ -176,17 +176,18 @@ void iop_strvis(struct iop_softc *, const char *, int, char *, int); void iop_initiator_register(struct iop_softc *, struct iop_initiator *); void iop_initiator_unregister(struct iop_softc *, struct iop_initiator *); -struct iop_msg *iop_msg_alloc(struct iop_softc *, struct iop_initiator *, int); +struct iop_msg *iop_msg_alloc(struct iop_softc *, struct iop_initiator *, + int); void iop_msg_free(struct iop_softc *, struct iop_msg *); int iop_msg_map(struct iop_softc *, struct iop_msg *, u_int32_t *, void *, - int, int); + size_t, int); int iop_msg_map_bio(struct iop_softc *, struct iop_msg *, u_int32_t *, - void *, int, int); + void *, int, int); int iop_msg_post(struct iop_softc *, struct iop_msg *, void *, int); void iop_msg_unmap(struct iop_softc *, struct iop_msg *); int iop_util_abort(struct iop_softc *, struct iop_initiator *, int, int, - int); + int); int iop_util_claim(struct iop_softc *, struct iop_initiator *, int, int); int iop_util_eventreg(struct iop_softc *, struct iop_initiator *, int); |