diff options
author | sos <sos@FreeBSD.org> | 2003-04-28 08:10:27 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2003-04-28 08:10:27 +0000 |
commit | e4d0be5799de5eb1f1f39497ae6f59ba0be217f7 (patch) | |
tree | 5898bc19a4e88c6f75e85b4d29759a242d7ce1ff /sys/dev/pst/pst-raid.c | |
parent | 1b6624b99947fc439495bb677aefb00a9b89872f (diff) | |
download | FreeBSD-src-e4d0be5799de5eb1f1f39497ae6f59ba0be217f7.zip FreeBSD-src-e4d0be5799de5eb1f1f39497ae6f59ba0be217f7.tar.gz |
Pull the pst driver out from under GAINT.
Diffstat (limited to 'sys/dev/pst/pst-raid.c')
-rw-r--r-- | sys/dev/pst/pst-raid.c | 93 |
1 files changed, 46 insertions, 47 deletions
diff --git a/sys/dev/pst/pst-raid.c b/sys/dev/pst/pst-raid.c index b7c96de..957d3b7 100644 --- a/sys/dev/pst/pst-raid.c +++ b/sys/dev/pst/pst-raid.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2001,2002 Søren Schmidt <sos@FreeBSD.org> + * Copyright (c) 2001,2002,2003 Søren Schmidt <sos@FreeBSD.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -57,8 +57,6 @@ struct pst_softc { struct i2o_bsa_device *info; struct disk disk; struct bio_queue_head queue; - struct mtx mtx; - int outstanding; }; struct pst_request { @@ -149,13 +147,12 @@ pst_attach(device_t dev) contigfree(reply, PAGE_SIZE, M_PSTRAID); bioq_init(&psc->queue); - mtx_init(&psc->mtx, "pst lock", MTX_DEF, 0); psc->disk.d_name = "pst"; psc->disk.d_strategy = pststrategy; psc->disk.d_maxsize = 64 * 1024; /*I2O_SGL_MAX_SEGS * PAGE_SIZE;*/ psc->disk.d_drv1 = psc; - disk_create(lun, &psc->disk, 0, NULL, NULL); + disk_create(lun, &psc->disk, DISKFLAG_NOGIANT, NULL, NULL); psc->disk.d_sectorsize = psc->info->block_size; psc->disk.d_mediasize = psc->info->capacity; @@ -199,10 +196,10 @@ pststrategy(struct bio *bp) { struct pst_softc *psc = bp->bio_disk->d_drv1; - mtx_lock(&psc->mtx); + mtx_lock(&psc->iop->mtx); bioq_disksort(&psc->queue, bp); pst_start(psc); - mtx_unlock(&psc->mtx); + mtx_unlock(&psc->iop->mtx); } static void @@ -212,7 +209,7 @@ pst_start(struct pst_softc *psc) struct bio *bp; u_int32_t mfa; - if (psc->outstanding < (I2O_IOP_OUTBOUND_FRAME_COUNT - 1) && + 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); @@ -223,19 +220,14 @@ pst_start(struct pst_softc *psc) iop_free_mfa(psc->iop, mfa); return; } - psc->outstanding++; + psc->iop->outstanding++; request->psc = psc; request->mfa = mfa; request->bp = bp; - if (dumping) - request->timeout_handle.callout = NULL; - else - request->timeout_handle = - timeout((timeout_t*)pst_timeout, request, 10 * hz); if (pst_rw(request)) { biofinish(request->bp, NULL, EIO); iop_free_mfa(request->psc->iop, request->mfa); - psc->outstanding--; + psc->iop->outstanding--; free(request, M_PSTRAID); } } @@ -253,38 +245,9 @@ pst_done(struct iop_softc *sc, u_int32_t mfa, struct i2o_single_reply *reply) request->bp->bio_resid = request->bp->bio_bcount - reply->donecount; biofinish(request->bp, NULL, reply->status ? EIO : 0); free(request, M_PSTRAID); - mtx_lock(&psc->mtx); psc->iop->reg->oqueue = mfa; - psc->outstanding--; + psc->iop->outstanding--; pst_start(psc); - mtx_unlock(&psc->mtx); -} - -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->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->outstanding--; - mtx_unlock(&request->psc->mtx); - return; - } - if (dumping) - request->timeout_handle.callout = NULL; - else - request->timeout_handle = - timeout((timeout_t*)pst_timeout, request, 10 * hz); - if (pst_rw(request)) { - iop_free_mfa(request->psc->iop, request->mfa); - biofinish(request->bp, NULL, EIO); - request->psc->outstanding--; - } - mtx_unlock(&request->psc->mtx); } int @@ -315,7 +278,7 @@ pst_rw(struct pst_request *request) sgl_flag = I2O_SGL_DIR; break; default: - printf("pst: unknown command type\n"); + printf("pst: unknown command type 0x%02x\n", request->bp->bio_cmd); return -1; } msg->initiator_context = (u_int32_t)pst_done; @@ -323,21 +286,57 @@ pst_rw(struct pst_request *request) msg->time_multiplier = 1; msg->bytecount = request->bp->bio_bcount; msg->lba = ((u_int64_t)request->bp->bio_pblkno) * (DEV_BSIZE * 1LL); + if (!iop_create_sgl((struct i2o_basic_message *)msg, request->bp->bio_data, request->bp->bio_bcount, sgl_flag)) return -1; + request->psc->iop->reg->iqueue = request->mfa; + + if (dumping) + request->timeout_handle.callout = NULL; + else + request->timeout_handle = + timeout((timeout_t*)pst_timeout, request, 10 * hz); return 0; } 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 (dumping) + request->timeout_handle.callout = NULL; + else + request->timeout_handle = + timeout((timeout_t*)pst_timeout, request, 10 * hz); + 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 bpack(int8_t *src, int8_t *dst, int len) { int i, j, blank; int8_t *ptr, *buf = dst; for (i = j = blank = 0 ; i < len; i++) { - if (blank && src[i] == ' ') continue; + if (blank && src[i] == ' ') + continue; if (blank && src[i] != ' ') { dst[j++] = src[i]; blank = 0; |