Index: atapi-all.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/atapi-all.c,v retrieving revision 1.46.2.13.2.1 diff -u -r1.46.2.13.2.1 atapi-all.c --- atapi-all.c 18 Jul 2002 11:13:27 -0000 1.46.2.13.2.1 +++ atapi-all.c 29 Jul 2002 10:11:12 -0000 @@ -283,7 +283,9 @@ /* if DMA enabled setup DMA hardware */ request->flags &= ~ATPR_F_DMA_USED; if ((atadev->mode >= ATA_DMA) && - (request->ccb[0] == ATAPI_READ || request->ccb[0] == ATAPI_READ_BIG || + (request->ccb[0] == ATAPI_READ || + request->ccb[0] == ATAPI_READ_BIG || + request->ccb[0] == ATAPI_READ_CD || ((request->ccb[0] == ATAPI_WRITE || request->ccb[0] == ATAPI_WRITE_BIG) && !(atadev->channel->flags & ATA_ATAPI_DMA_RO))) && @@ -293,7 +295,8 @@ } /* start ATAPI operation */ - if (ata_command(atadev, ATA_C_PACKET_CMD, (request->bytecount << 8), 0, + if (ata_command(atadev, ATA_C_PACKET_CMD, + min(request->bytecount, 65534) << 8, 0, (request->flags & ATPR_F_DMA_USED) ? ATA_F_DMA : 0, ATA_IMMEDIATE)) ata_prtdev(atadev, "failure to send ATAPI packet command\n"); @@ -672,6 +675,7 @@ case 0x1a: return ("MODE_SENSE"); case 0x1b: return ("START_STOP"); case 0x1e: return ("PREVENT_ALLOW"); + case 0x23: return ("ATAPI_READ_FORMAT_CAPACITIES"); case 0x25: return ("READ_CAPACITY"); case 0x28: return ("READ_BIG"); case 0x2a: return ("WRITE_BIG"); Index: atapi-cd.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/atapi-cd.c,v retrieving revision 1.48.2.16 diff -u -r1.48.2.16 atapi-cd.c --- atapi-cd.c 27 Mar 2002 19:48:37 -0000 1.48.2.16 +++ atapi-cd.c 29 Jul 2002 10:11:12 -0000 @@ -73,6 +73,7 @@ /* prototypes */ static struct acd_softc *acd_init_lun(struct ata_device *); static void acd_make_dev(struct acd_softc *); +static void acd_set_ioparm(struct acd_softc *); static void acd_describe(struct acd_softc *); static void lba2msf(u_int32_t, u_int8_t *, u_int8_t *, u_int8_t *); static u_int32_t msf2lba(u_int8_t, u_int8_t, u_int8_t); @@ -266,10 +267,16 @@ dev = make_dev(&acd_cdevsw, dkmakeminor(cdp->lun, 0, 0), UID_ROOT, GID_OPERATOR, 0644, "acd%d", cdp->lun); dev->si_drv1 = cdp; - dev->si_iosize_max = 252 * DEV_BSIZE; - dev->si_bsize_phys = 2048; /* XXX SOS */ cdp->dev = dev; cdp->device->flags |= ATA_D_MEDIA_CHANGED; + acd_set_ioparm(cdp); +} + +static void +acd_set_ioparm(struct acd_softc *cdp) +{ + cdp->dev->si_iosize_max = ((256*DEV_BSIZE)/cdp->block_size)*cdp->block_size; + cdp->dev->si_bsize_phys = cdp->block_size; } static void @@ -994,6 +1001,7 @@ case CDRIOCSETBLOCKSIZE: cdp->block_size = *(int *)addr; + acd_set_ioparm(cdp); break; case CDRIOCGETPROGRESS: @@ -1256,6 +1264,7 @@ cdp->toc.hdr.len = ntohs(cdp->toc.hdr.len); cdp->block_size = (cdp->toc.tab[0].control & 4) ? 2048 : 2352; + acd_set_ioparm(cdp); bzero(ccb, sizeof(ccb)); ccb[0] = ATAPI_READ_CAPACITY; if (atapi_queue_cmd(cdp->device, ccb, (caddr_t)sizes, sizeof(sizes), @@ -1516,7 +1525,7 @@ param.session_format = CDR_SESS_CDROM_XA; break; } - + acd_set_ioparm(cdp); return acd_mode_select(cdp, (caddr_t)¶m, param.page_length + 10); } Index: atapi-fd.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/atapi-fd.c,v retrieving revision 1.44.2.8 diff -u -r1.44.2.8 atapi-fd.c --- atapi-fd.c 26 Mar 2002 09:36:43 -0000 1.44.2.8 +++ atapi-fd.c 29 Jul 2002 10:11:12 -0000 @@ -109,7 +109,7 @@ DEVSTAT_PRIORITY_WFD); dev = disk_create(fdp->lun, &fdp->disk, 0, &afd_cdevsw, &afddisk_cdevsw); dev->si_drv1 = fdp; - dev->si_iosize_max = 252 * DEV_BSIZE; + dev->si_iosize_max = 256 * DEV_BSIZE; fdp->dev = dev; afd_describe(fdp); atadev->flags |= ATA_D_MEDIA_CHANGED; Index: atapi-tape.c =================================================================== RCS file: /home/ncvs/src/sys/dev/ata/atapi-tape.c,v retrieving revision 1.36.2.11 diff -u -r1.36.2.11 atapi-tape.c --- atapi-tape.c 26 Mar 2002 09:36:43 -0000 1.36.2.11 +++ atapi-tape.c 29 Jul 2002 10:11:12 -0000 @@ -131,12 +131,12 @@ dev = make_dev(&ast_cdevsw, dkmakeminor(stp->lun, 0, 0), UID_ROOT, GID_OPERATOR, 0640, "ast%d", stp->lun); dev->si_drv1 = stp; - dev->si_iosize_max = 252 * DEV_BSIZE; + dev->si_iosize_max = 256 * DEV_BSIZE; stp->dev1 = dev; dev = make_dev(&ast_cdevsw, dkmakeminor(stp->lun, 0, 1), UID_ROOT, GID_OPERATOR, 0640, "nast%d", stp->lun); dev->si_drv1 = stp; - dev->si_iosize_max = 252 * DEV_BSIZE; + dev->si_iosize_max = 256 * DEV_BSIZE; stp->dev2 = dev; stp->device->flags |= ATA_D_MEDIA_CHANGED; ast_describe(stp);