diff options
| author | Søren Schmidt <sos@FreeBSD.org> | 2001-09-06 17:44:04 +0000 |
|---|---|---|
| committer | Søren Schmidt <sos@FreeBSD.org> | 2001-09-06 17:44:04 +0000 |
| commit | 67bc4ad9b65d12b791406f01e52e499de60aba31 (patch) | |
| tree | ebf3abac3b9c570a461e98b38b61d1f906b52ff3 | |
| parent | 5fc726168892afcf179c2d4afa6ce36d21428249 (diff) | |
Notes
| -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 02ff4b2079bb..2305580ef9f1 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, " ", |
