Yes, I finally got it working! The explanation is in the patch, which I should not need to explain again :)
Brian Feldman _ __ ___ ____ ___ ___ ___ gr...@unixhelp.org _ __ ___ | _ ) __| \ FreeBSD: The Power to Serve! _ __ | _ \ _ \ |) | http://www.freebsd.org _ |___)___/___/ --- src/sys/dev/ata/atapi-fd.c.orig Mon May 17 20:28:16 1999 +++ src/sys/dev/ata/atapi-fd.c Mon May 17 20:42:37 1999 @@ -83,7 +83,7 @@ int32_t afdattach(struct atapi_softc *); static int32_t afd_sense(struct afd_softc *); -static void afd_describe(struct afd_softc *); +static void afd_describe(struct afd_softc *, int8_t *, int8_t *); static void afd_strategy(struct buf *); static void afd_start(struct afd_softc *); static void afd_done(struct atapi_request *); @@ -96,6 +96,8 @@ afdattach(struct atapi_softc *atp) { struct afd_softc *fdp; + int8_t model_buf[40+1]; + int8_t revision_buf[8+1]; if (afdnlun >= NUNIT) { printf("afd: too many units\n"); @@ -106,18 +108,22 @@ printf("afd: out of memory\n"); return -1; } + bzero(fdp, sizeof(struct afd_softc)); bufq_init(&fdp->buf_queue); fdp->atp = atp; fdp->lun = afdnlun; fdp->flags = F_MEDIA_CHANGED; + bpack(atp->atapi_parm->model, model_buf, sizeof(model_buf)); + bpack(atp->atapi_parm->revision, revision_buf, sizeof(revision_buf)); + fdp->maxblks = strcmp(model_buf, "IOMEGA ZIP 100 ATAPI") ? 0 : 64; if (afd_sense(fdp)) { free(fdp, M_TEMP); return -1; } - afd_describe(fdp); + afd_describe(fdp, model_buf, revision_buf); afdtab[afdnlun++] = fdp; devstat_add_entry(&fdp->stats, "afd", fdp->lun, DEV_BSIZE, DEVSTAT_NO_ORDERED_TAGS, @@ -166,15 +172,10 @@ } static void -afd_describe(struct afd_softc *fdp) +afd_describe(struct afd_softc *fdp, int8_t *model, int8_t *revision) { - int8_t model_buf[40+1]; - int8_t revision_buf[8+1]; - - bpack(fdp->atp->atapi_parm->model, model_buf, sizeof(model_buf)); - bpack(fdp->atp->atapi_parm->revision, revision_buf, sizeof(revision_buf)); printf("afd%d: <%s/%s> rewriteable drive at ata%d as %s\n", - fdp->lun, model_buf, revision_buf, + fdp->lun, model, revision, fdp->atp->controller->lun, (fdp->atp->unit == ATA_MASTER) ? "master" : "slave "); printf("afd%d: %luMB (%u sectors), %u cyls, %u heads, %u S/T, %u B/S\n", @@ -320,9 +321,14 @@ lba = bp->b_blkno / (fdp->cap.sector_size / DEV_BSIZE); count = (bp->b_bcount + (fdp->cap.sector_size - 1)) / fdp->cap.sector_size; - /* Should only be needed for ZIP drives, but better safe than sorry */ - if (count > 64) - count = 64; + /* + * This should only be needed for ZIP drives, since they lock up if a + * transfer of > 64 sectors is attempted. XXX TODO (for SOS): when + * this problem is to be worked around, multiple transfers will need + * to be queued! + */ + if (fdp->maxblks && count > fdp->maxblks) + count = fdp->maxblks; bzero(ccb, sizeof(ccb)); To Unsubscribe: send mail to majord...@freebsd.org with "unsubscribe freebsd-current" in the body of the message