Use si_iosize_max to tell the upper layers not to use more

than 32K chunks on ZIP drives instead of deblocking it in
the driver.
This commit is contained in:
sos 2002-06-19 12:41:05 +00:00
parent 15dd5289b1
commit d4bc2d8833
2 changed files with 18 additions and 44 deletions

View File

@ -69,7 +69,6 @@ static struct cdevsw afddisk_cdevsw;
/* prototypes */
static int afd_sense(struct afd_softc *);
static void afd_describe(struct afd_softc *);
static int afd_partial_done(struct atapi_request *);
static int afd_done(struct atapi_request *);
static int afd_eject(struct afd_softc *, int);
static int afd_start_stop(struct afd_softc *, int);
@ -101,17 +100,20 @@ afdattach(struct ata_device *atadev)
return 0;
}
if (!strncmp(atadev->param->model, "IOMEGA ZIP", 10))
fdp->transfersize = 64;
devstat_add_entry(&fdp->stats, "afd", fdp->lun, DEV_BSIZE,
DEVSTAT_NO_ORDERED_TAGS,
DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_IDE,
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;
fdp->dev = dev;
if (!strncmp(atadev->param->model, "IOMEGA ZIP", 10) ||
!strncmp(atadev->param->model, "IOMEGA Clik!", 12))
fdp->dev->si_iosize_max = 64 * DEV_BSIZE;
else
fdp->dev->si_iosize_max = 252 * DEV_BSIZE;
afd_describe(fdp);
atadev->flags |= ATA_D_MEDIA_CHANGED;
atadev->driver = fdp;
@ -147,7 +149,6 @@ afd_sense(struct afd_softc *fdp)
/* The IOMEGA Clik! doesn't support reading the cap page, fake it */
if (!strncmp(fdp->device->param->model, "IOMEGA Clik!", 12)) {
fdp->transfersize = 64;
fdp->cap.transfer_rate = 500;
fdp->cap.heads = 1;
fdp->cap.sectors = 2;
@ -189,8 +190,6 @@ afd_describe(struct afd_softc *fdp)
fdp->cap.cylinders, fdp->cap.heads, fdp->cap.sectors,
fdp->cap.sector_size);
ata_prtdev(fdp->device, "%dKB/s,", fdp->cap.transfer_rate / 8);
if (fdp->transfersize)
printf(" transfer limit %d blks,", fdp->transfersize);
printf(" %s\n", ata_mode2str(fdp->device->mode));
if (fdp->cap.medium_type) {
ata_prtdev(fdp->device, "Medium: ");
@ -294,6 +293,13 @@ afdstrategy(struct bio *bp)
return;
}
/* if it's a null transfer, return immediatly. */
if (bp->bio_bcount == 0) {
bp->bio_resid = 0;
biodone(bp);
return;
}
s = splbio();
bioqdisksort(&fdp->queue, bp);
splx(s);
@ -324,7 +330,7 @@ afd_start(struct ata_device *atadev)
lba = bp->bio_pblkno;
count = bp->bio_bcount / fdp->cap.sector_size;
data_ptr = bp->bio_data;
bp->bio_resid = 0;
bp->bio_resid = bp->bio_bcount;
bzero(ccb, sizeof(ccb));
@ -333,26 +339,6 @@ afd_start(struct ata_device *atadev)
else
ccb[0] = ATAPI_WRITE_BIG;
devstat_start_transaction(&fdp->stats);
while (fdp->transfersize && (count > fdp->transfersize)) {
ccb[2] = lba>>24;
ccb[3] = lba>>16;
ccb[4] = lba>>8;
ccb[5] = lba;
ccb[7] = fdp->transfersize>>8;
ccb[8] = fdp->transfersize;
atapi_queue_cmd(fdp->device, ccb, data_ptr,
fdp->transfersize * fdp->cap.sector_size,
(bp->bio_cmd == BIO_READ) ? ATPR_F_READ : 0, 30,
afd_partial_done, bp);
count -= fdp->transfersize;
lba += fdp->transfersize;
data_ptr += fdp->transfersize * fdp->cap.sector_size;
}
ccb[2] = lba>>24;
ccb[3] = lba>>16;
ccb[4] = lba>>8;
@ -360,24 +346,13 @@ afd_start(struct ata_device *atadev)
ccb[7] = count>>8;
ccb[8] = count;
devstat_start_transaction(&fdp->stats);
atapi_queue_cmd(fdp->device, ccb, data_ptr, count * fdp->cap.sector_size,
(bp->bio_cmd == BIO_READ) ? ATPR_F_READ : 0, 30,
afd_done, bp);
}
static int
afd_partial_done(struct atapi_request *request)
{
struct bio *bp = request->driver;
if (request->error) {
bp->bio_error = request->error;
bp->bio_flags |= BIO_ERROR;
}
bp->bio_resid += request->bytecount;
return 0;
}
static int
afd_done(struct atapi_request *request)
{
@ -389,7 +364,7 @@ afd_done(struct atapi_request *request)
bp->bio_flags |= BIO_ERROR;
}
else
bp->bio_resid += (bp->bio_bcount - request->donecount);
bp->bio_resid = bp->bio_bcount - request->donecount;
biofinish(bp, &fdp->stats, 0);
return 0;
}

View File

@ -71,7 +71,6 @@ struct afd_cappage {
struct afd_softc {
struct ata_device *device; /* device softc */
int lun; /* logical device unit */
int transfersize; /* max size of each transfer */
struct bio_queue_head queue; /* queue of i/o requests */
struct afd_cappage cap; /* capabilities page info */
struct disk disk; /* virtual drives */