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; }
int afdattach(struct ata_device *atadev) { struct afd_softc *fdp; dev_t dev; fdp = malloc(sizeof(struct afd_softc), M_AFD, M_NOWAIT | M_ZERO); if (!fdp) { ata_prtdev(atadev, "out of memory\n"); return 0; } fdp->device = atadev; fdp->lun = ata_get_lun(&afd_lun_map); ata_set_name(atadev, "afd", fdp->lun); bufq_init(&fdp->queue); if (afd_sense(fdp)) { free(fdp, M_AFD); return 0; } 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; 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; return 1; }
static int afd_attach(device_t dev) { struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); struct afd_softc *fdp; if (!(fdp = malloc(sizeof(struct afd_softc), M_AFD, M_NOWAIT | M_ZERO))) { device_printf(dev, "out of memory\n"); return ENOMEM; } device_set_ivars(dev, fdp); ata_setmode(dev); if (afd_sense(dev)) { device_set_ivars(dev, NULL); free(fdp, M_AFD); return ENXIO; } atadev->flags |= ATA_D_MEDIA_CHANGED; /* announce we are here */ afd_describe(dev); /* create the disk device */ fdp->disk = disk_alloc(); fdp->disk->d_open = afd_open; fdp->disk->d_close = afd_close; fdp->disk->d_strategy = afd_strategy; fdp->disk->d_ioctl = afd_ioctl; fdp->disk->d_name = "afd"; fdp->disk->d_drv1 = dev; fdp->disk->d_maxsize = ch->dma.max_iosize ? ch->dma.max_iosize : DFLTPHYS; fdp->disk->d_unit = device_get_unit(dev); disk_create(fdp->disk, DISK_VERSION); return 0; }
static int afd_attach(device_t dev) { struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); struct afd_softc *fdp; cdev_t cdev; fdp = kmalloc(sizeof(struct afd_softc), M_AFD, M_WAITOK | M_ZERO); device_set_ivars(dev, fdp); ATA_SETMODE(device_get_parent(dev), dev); if (afd_sense(dev)) { device_set_ivars(dev, NULL); kfree(fdp, M_AFD); return ENXIO; } atadev->flags |= ATA_D_MEDIA_CHANGED; /* create the disk device */ devstat_add_entry(&fdp->stats, "afd", device_get_unit(dev), DEV_BSIZE, DEVSTAT_NO_ORDERED_TAGS, DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_IDE, DEVSTAT_PRIORITY_WFD); cdev = disk_create(device_get_unit(dev), &fdp->disk, &afd_ops); disk_setdisktype(&fdp->disk, "floppy"); cdev->si_drv1 = dev; if (ch->dma) cdev->si_iosize_max = ch->dma->max_iosize; else cdev->si_iosize_max = min(MAXPHYS,64*1024); fdp->cdev = cdev; /* announce we are here */ afd_describe(dev); 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; }