Lines Matching refs:drv

168 static FloppyDriveType get_fallback_drive_type(FDrive *drv);
179 static void fd_empty_seek_hack(FDrive *drv) in fd_empty_seek_hack() argument
181 drv->last_sect = 0xFF; in fd_empty_seek_hack()
182 drv->max_track = 0xFF; in fd_empty_seek_hack()
185 static void fd_init(FDrive *drv) in fd_init() argument
188 drv->perpendicular = 0; in fd_init()
190 drv->disk = FLOPPY_DRIVE_TYPE_NONE; in fd_init()
191 drv->last_sect = 0; in fd_init()
192 drv->max_track = 0; in fd_init()
193 drv->ro = true; in fd_init()
194 drv->media_changed = 1; in fd_init()
197 #define NUM_SIDES(drv) ((drv)->flags & FDISK_DBL_SIDES ? 2 : 1) argument
206 static int fd_sector(FDrive *drv) in fd_sector() argument
208 return fd_sector_calc(drv->head, drv->track, drv->sect, drv->last_sect, in fd_sector()
209 NUM_SIDES(drv)); in fd_sector()
213 static int fd_offset(FDrive *drv) in fd_offset() argument
215 g_assert(fd_sector(drv) < INT_MAX >> BDRV_SECTOR_BITS); in fd_offset()
216 return fd_sector(drv) << BDRV_SECTOR_BITS; in fd_offset()
226 static int fd_seek(FDrive *drv, uint8_t head, uint8_t track, uint8_t sect, in fd_seek() argument
232 if (track > drv->max_track || in fd_seek()
233 (head != 0 && (drv->flags & FDISK_DBL_SIDES) == 0)) { in fd_seek()
236 (drv->flags & FDISK_DBL_SIDES) == 0 ? 0 : 1, in fd_seek()
237 drv->max_track, drv->last_sect); in fd_seek()
240 if (sect > drv->last_sect) { in fd_seek()
243 (drv->flags & FDISK_DBL_SIDES) == 0 ? 0 : 1, in fd_seek()
244 drv->max_track, drv->last_sect); in fd_seek()
247 sector = fd_sector_calc(head, track, sect, drv->last_sect, NUM_SIDES(drv)); in fd_seek()
249 if (sector != fd_sector(drv)) { in fd_seek()
254 head, track, sect, 1, drv->max_track, in fd_seek()
255 drv->last_sect); in fd_seek()
259 drv->head = head; in fd_seek()
260 if (drv->track != track) { in fd_seek()
261 if (drv->blk != NULL && blk_is_inserted(drv->blk)) { in fd_seek()
262 drv->media_changed = 0; in fd_seek()
266 drv->track = track; in fd_seek()
267 drv->sect = sect; in fd_seek()
270 if (drv->blk == NULL || !blk_is_inserted(drv->blk)) { in fd_seek()
278 static void fd_recalibrate(FDrive *drv) in fd_recalibrate() argument
281 fd_seek(drv, 0, 0, 1, 1); in fd_recalibrate()
290 static int pick_geometry(FDrive *drv) in pick_geometry() argument
292 BlockBackend *blk = drv->blk; in pick_geometry()
297 bool magic = drv->drive == FLOPPY_DRIVE_TYPE_AUTO; in pick_geometry()
300 if (!drv->blk || !blk_is_inserted(drv->blk) || in pick_geometry()
301 drv->drive == FLOPPY_DRIVE_TYPE_NONE) in pick_geometry()
324 if (magic || parse->drive == drv->drive) { in pick_geometry()
327 } else if (drive_size(parse->drive) == drive_size(drv->drive)) { in pick_geometry()
335 if ((parse->drive == drv->drive) || in pick_geometry()
336 (magic && (parse->drive == get_fallback_drive_type(drv)))) { in pick_geometry()
352 FloppyDriveType_str(drv->drive), in pick_geometry()
363 drv->flags &= ~FDISK_DBL_SIDES; in pick_geometry()
365 drv->flags |= FDISK_DBL_SIDES; in pick_geometry()
367 drv->max_track = parse->max_track; in pick_geometry()
368 drv->last_sect = parse->last_sect; in pick_geometry()
369 drv->disk = parse->drive; in pick_geometry()
370 drv->media_rate = parse->rate; in pick_geometry()
374 static void pick_drive_type(FDrive *drv) in pick_drive_type() argument
376 if (drv->drive != FLOPPY_DRIVE_TYPE_AUTO) { in pick_drive_type()
380 if (pick_geometry(drv) == 0) { in pick_drive_type()
381 drv->drive = drv->disk; in pick_drive_type()
383 drv->drive = get_fallback_drive_type(drv); in pick_drive_type()
386 g_assert(drv->drive != FLOPPY_DRIVE_TYPE_AUTO); in pick_drive_type()
390 static void fd_revalidate(FDrive *drv) in fd_revalidate() argument
395 if (drv->blk != NULL) { in fd_revalidate()
396 drv->ro = !blk_is_writable(drv->blk); in fd_revalidate()
397 if (!blk_is_inserted(drv->blk)) { in fd_revalidate()
399 drv->disk = FLOPPY_DRIVE_TYPE_NONE; in fd_revalidate()
400 fd_empty_seek_hack(drv); in fd_revalidate()
401 } else if (!drv->media_validated) { in fd_revalidate()
402 rc = pick_geometry(drv); in fd_revalidate()
406 drv->media_validated = true; in fd_revalidate()
408 (drv->flags & FDISK_DBL_SIDES) ? 2 : 1, in fd_revalidate()
409 drv->max_track, drv->last_sect, in fd_revalidate()
410 drv->ro ? "ro" : "rw"); in fd_revalidate()
415 drv->last_sect = 0; in fd_revalidate()
416 drv->max_track = 0; in fd_revalidate()
417 drv->flags &= ~FDISK_DBL_SIDES; in fd_revalidate()
418 drv->drive = FLOPPY_DRIVE_TYPE_NONE; in fd_revalidate()
419 drv->disk = FLOPPY_DRIVE_TYPE_NONE; in fd_revalidate()
776 static FloppyDriveType get_fallback_drive_type(FDrive *drv) in get_fallback_drive_type() argument
778 return drv->fdctrl->fallback; in get_fallback_drive_type()
1329 static int fdctrl_media_changed(FDrive *drv) in fdctrl_media_changed() argument
1331 return drv->media_changed; in fdctrl_media_changed()