summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/atapi-cd.c
diff options
context:
space:
mode:
authorsos <sos@FreeBSD.org>2001-09-06 17:44:04 +0000
committersos <sos@FreeBSD.org>2001-09-06 17:44:04 +0000
commit7ebc549651b07749b907b3a6007d74c5ea1eb202 (patch)
treeebf3abac3b9c570a461e98b38b61d1f906b52ff3 /sys/dev/ata/atapi-cd.c
parent126bc821c030ab0e45e4f95e69fe9441e21a2902 (diff)
downloadFreeBSD-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/ata/atapi-cd.c')
-rw-r--r--sys/dev/ata/atapi-cd.c15
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, " ",
OpenPOWER on IntegriCloud