예제 #1
0
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;
}
예제 #2
0
static int 
afd_close(struct disk *dp)
{
    device_t dev = dp->d_drv1;

    afd_prevent_allow(dev, 0); 
    return 0;
}
예제 #3
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;
}
예제 #4
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;
}