diff options
author | sos <sos@FreeBSD.org> | 2001-09-06 17:44:04 +0000 |
---|---|---|
committer | sos <sos@FreeBSD.org> | 2001-09-06 17:44:04 +0000 |
commit | 7ebc549651b07749b907b3a6007d74c5ea1eb202 (patch) | |
tree | ebf3abac3b9c570a461e98b38b61d1f906b52ff3 /sys/dev | |
parent | 126bc821c030ab0e45e4f95e69fe9441e21a2902 (diff) | |
download | FreeBSD-src-7ebc549651b07749b907b3a6007d74c5ea1eb202.zip FreeBSD-src-7ebc549651b07749b907b3a6007d74c5ea1eb202.tar.gz |
Fix the size of medium code, the old one failed for DVD's.
This might introduce problems on normal CD's (again) sigh...
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/ata/atapi-cd.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c index 02ff4b2..2305580 100644 --- a/sys/dev/ata/atapi-cd.c +++ b/sys/dev/ata/atapi-cd.c @@ -1121,17 +1121,18 @@ acd_start(struct atapi_softc *atp) bzero(ccb, sizeof(ccb)); - lba = bp->bio_offset / cdp->block_size; track = (bp->bio_dev->si_udev & 0x00ff0000) >> 16; if (track) { blocksize = (cdp->toc.tab[track - 1].control & 4) ? 2048 : 2352; lastlba = ntohl(cdp->toc.tab[track].addr.lba); + lba = bp->bio_offset / blocksize; lba += ntohl(cdp->toc.tab[track - 1].addr.lba); } else { blocksize = cdp->block_size; lastlba = cdp->disk_size; + lba = bp->bio_offset / blocksize; } if (bp->bio_bcount % blocksize != 0) { @@ -1205,6 +1206,7 @@ acd_read_toc(struct acd_softc *cdp) { struct acd_devlist *entry; int track, ntracks, len; + u_int32_t sizes[2]; int8_t ccb[16]; bzero(&cdp->toc, sizeof(cdp->toc)); @@ -1243,7 +1245,18 @@ acd_read_toc(struct acd_softc *cdp) cdp->toc.hdr.len = ntohs(cdp->toc.hdr.len); cdp->block_size = (cdp->toc.tab[0].control & 4) ? 2048 : 2352; +#if 0 cdp->disk_size = ntohl(cdp->toc.tab[cdp->toc.hdr.ending_track].addr.lba); +#else + bzero(ccb, sizeof(ccb)); + ccb[0] = ATAPI_READ_CAPACITY; + if (atapi_queue_cmd(cdp->atp, ccb, (caddr_t)sizes, sizeof(sizes), + ATPR_F_READ, 30, NULL, NULL)) { + bzero(&cdp->toc, sizeof(cdp->toc)); + return; + } + cdp->disk_size = ntohl(sizes[0]) + 1; +#endif bzero(&cdp->disklabel, sizeof(struct disklabel)); strncpy(cdp->disklabel.d_typename, " ", |