diff options
| author | Doug Rabson <dfr@FreeBSD.org> | 2000-10-12 14:29:24 +0000 |
|---|---|---|
| committer | Doug Rabson <dfr@FreeBSD.org> | 2000-10-12 14:29:24 +0000 |
| commit | 8034cac98a94cf2d016b06e9c09ffbaad021f344 (patch) | |
| tree | 59269b37f9992116d83b522a90a6b0b4b684f0eb | |
| parent | c332b0bc572c3c470cbc50bf2475faf9bfa6905d (diff) | |
Notes
| -rw-r--r-- | sys/ia64/ia64/sscdisk.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/sys/ia64/ia64/sscdisk.c b/sys/ia64/ia64/sscdisk.c index 5b85c2b5520b..63d0edb3f901 100644 --- a/sys/ia64/ia64/sscdisk.c +++ b/sys/ia64/ia64/sscdisk.c @@ -159,6 +159,7 @@ sscstrategy(struct bio *bp) unsigned sscop = 0; struct disk_req req; struct disk_stat stat; + u_long len, va, off; if (ssc_debug > 1) printf("sscstrategy(%p) %s %x, %d, %ld, %p)\n", @@ -197,12 +198,27 @@ sscstrategy(struct bio *bp) dop = DEVSTAT_WRITE; sscop = SSC_WRITE; } - req.len = bp->bio_bcount; - req.addr = (long) vtophys(bp->bio_data); - ssc(sc->fd, 1, ia64_tpa((long) &req), - (bp->bio_pblkno << DEV_BSHIFT), sscop); - stat.fd = sc->fd; - ssc(ia64_tpa((long)&stat), 0, 0, 0, SSC_WAIT_COMPLETION); + va = (u_long) bp->bio_data; + len = bp->bio_bcount; + off = bp->bio_pblkno << DEV_BSHIFT; + while (len > 0) { + u_int t; + if ((va & PAGE_MASK) + len > PAGE_SIZE) + t = PAGE_SIZE - (va & PAGE_MASK); + else + t = len; + req.len = t; + req.addr = ia64_tpa(va); + printf("sscstrategy: reading %ld bytes from 0x%ld into 0x%lx\n", + req.len, off, req.addr); + ssc(sc->fd, 1, ia64_tpa((long) &req), off, sscop); + stat.fd = sc->fd; + ssc(ia64_tpa((long)&stat), 0, 0, 0, + SSC_WAIT_COMPLETION); + va += t; + len -= t; + off += t; + } bp->bio_resid = 0; devstat_end_transaction_bio(&sc->stats, bp); biodone(bp); |
