Anyone still using ioprbs(4)? If so, please test the diff below and report back to me.
Index: dev/i2o/ioprbs.c =================================================================== RCS file: /cvs/src/sys/dev/i2o/ioprbs.c,v retrieving revision 1.20 diff -u -p dev/i2o/ioprbs.c --- dev/i2o/ioprbs.c 23 Mar 2010 01:57:19 -0000 1.20 +++ dev/i2o/ioprbs.c 28 Jun 2010 19:59:33 -0000 @@ -544,7 +544,7 @@ ioprbs_intr(struct device *dv, struct iop_msg *im, voi { struct i2o_rbs_reply *rb = reply; struct ioprbs_ccb *ccb = im->im_dvcontext; - struct buf *bp = ccb->ic_xs->bp; + struct scsi_xfer *xs = ccb->ic_xs; struct ioprbs_softc *sc = (struct ioprbs_softc *)dv; struct iop_softc *iop = (struct iop_softc *)dv->dv_parent; int err, detail; @@ -554,7 +554,7 @@ ioprbs_intr(struct device *dv, struct iop_msg *im, voi DPRINTF(("ioprbs_intr(%p, %p, %p) ", dv, im, reply)); - timeout_del(&ccb->ic_xs->stimeout); + timeout_del(&xs->stimeout); err = ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0); @@ -572,18 +572,14 @@ ioprbs_intr(struct device *dv, struct iop_msg *im, voi err = 1; } - if (bp) { - if (err) { - bp->b_flags |= B_ERROR; - bp->b_error = EIO; - bp->b_resid = bp->b_bcount; - } else - bp->b_resid = bp->b_bcount - letoh32(rb->transfercount); - } + if (err) + xs->error = XS_DRIVER_STUFFUP; + else + xs->resid = xs->datalen - letoh32(rb->transfercount); iop_msg_unmap(iop, im); iop_msg_free(iop, im); - scsi_done(ccb->ic_xs); + scsi_done(xs); ioprbs_free_ccb(sc, ccb); }