static void pst_start(struct pst_softc *psc) { struct pst_request *request; struct bio *bp; u_int32_t mfa; if (psc->iop->outstanding < (I2O_IOP_OUTBOUND_FRAME_COUNT - 1) && (bp = bioq_first(&psc->queue))) { if ((mfa = iop_get_mfa(psc->iop)) != 0xffffffff) { bioq_remove(&psc->queue, bp); if (!(request = malloc(sizeof(struct pst_request), M_PSTRAID, M_NOWAIT | M_ZERO))) { printf("pst: out of memory in start\n"); biofinish(request->bp, NULL, ENOMEM); iop_free_mfa(psc->iop, mfa); return; } psc->iop->outstanding++; request->psc = psc; request->mfa = mfa; request->bp = bp; if (pst_rw(request)) { biofinish(request->bp, NULL, EIO); iop_free_mfa(request->psc->iop, request->mfa); psc->iop->outstanding--; free(request, M_PSTRAID); } } } }
static void pst_timeout(struct pst_request *request) { printf("pst: timeout mfa=0x%08x cmd=0x%02x\n", request->mfa, request->bp->bio_cmd); mtx_lock(&request->psc->iop->mtx); iop_free_mfa(request->psc->iop, request->mfa); if ((request->mfa = iop_get_mfa(request->psc->iop)) == 0xffffffff) { printf("pst: timeout no mfa possible\n"); biofinish(request->bp, NULL, EIO); request->psc->iop->outstanding--; mtx_unlock(&request->psc->iop->mtx); return; } if (pst_rw(request)) { iop_free_mfa(request->psc->iop, request->mfa); biofinish(request->bp, NULL, EIO); request->psc->iop->outstanding--; } mtx_unlock(&request->psc->iop->mtx); }
static void pst_timeout(void *arg) { struct pst_request *request; request = arg; printf("pst: timeout mfa=0x%08x cmd=0x%02x\n", request->mfa, request->bp->bio_cmd); mtx_assert(&request->psc->iop->mtx, MA_OWNED); iop_free_mfa(request->psc->iop, request->mfa); if ((request->mfa = iop_get_mfa(request->psc->iop)) == 0xffffffff) { printf("pst: timeout no mfa possible\n"); biofinish(request->bp, NULL, EIO); request->psc->iop->outstanding--; return; } if (pst_rw(request)) { iop_free_mfa(request->psc->iop, request->mfa); biofinish(request->bp, NULL, EIO); request->psc->iop->outstanding--; } }