static int afd_open(struct disk *dp) { device_t dev = dp->d_drv1; struct ata_device *atadev = device_get_softc(dev); struct afd_softc *fdp = device_get_ivars(dev); if (!fdp) return ENXIO; if (!device_is_attached(dev)) return EBUSY; afd_test_ready(dev); afd_prevent_allow(dev, 1); if (afd_sense(dev)) device_printf(dev, "sense media type failed\n"); atadev->flags &= ~ATA_D_MEDIA_CHANGED; if (!fdp->mediasize) return ENXIO; fdp->disk->d_sectorsize = fdp->sectorsize; fdp->disk->d_mediasize = fdp->mediasize; fdp->disk->d_fwsectors = fdp->sectors; fdp->disk->d_fwheads = fdp->heads; return 0; }
static int afd_close(struct disk *dp) { device_t dev = dp->d_drv1; afd_prevent_allow(dev, 0); return 0; }
static int afd_close(struct dev_close_args *ap) { device_t dev = ap->a_head.a_dev->si_drv1; struct afd_softc *fdp = device_get_ivars(dev); if (count_dev(fdp->cdev) == 1) afd_prevent_allow(dev, 0); return 0; }
static int afd_open(struct dev_open_args *ap) { device_t dev = ap->a_head.a_dev->si_drv1; struct ata_device *atadev = device_get_softc(dev); struct afd_softc *fdp = device_get_ivars(dev); struct disk_info info; if (!fdp) return ENXIO; if (!device_is_attached(dev)) return EBUSY; afd_test_ready(dev); afd_prevent_allow(dev, 1); if (afd_sense(dev)) device_printf(dev, "sense media type failed\n"); atadev->flags &= ~ATA_D_MEDIA_CHANGED; if (!fdp->mediasize) return ENXIO; bzero(&info, sizeof(info)); info.d_media_blksize = fdp->sectorsize; /* mandatory */ info.d_media_size = fdp->mediasize; /* (this is in bytes) */ info.d_secpertrack = fdp->sectors; /* optional */ info.d_nheads = fdp->heads; info.d_ncylinders = ((fdp->mediasize/fdp->sectorsize)/fdp->sectors)/fdp->heads; info.d_secpercyl = fdp->sectors * fdp->heads; disk_setdiskinfo(&fdp->disk, &info); return 0; }