Lines Matching refs:drv

188 #define NUM_SIDES(drv)      (drv->flags & FDISK_DBL_SIDES ? 2 : 1)
190 static void fd_init(fdrive_t *drv, bool fInit)
194 drv->drive = FDRIVE_DRV_NONE;
198 if (drv->pDrvBlock) {
199 PDMBLOCKTYPE enmType = drv->pDrvBlock->pfnGetType(drv->pDrvBlock);
203 drv->drive = FDRIVE_DRV_120;
207 drv->drive = FDRIVE_DRV_144;
212 drv->drive = FDRIVE_DRV_288;
215 drv->drive = FDRIVE_DRV_FAKE_15_6;
218 drv->drive = FDRIVE_DRV_FAKE_63_5;
222 drv->drive = FDRIVE_DRV_NONE;
227 drv->perpendicular = 0;
229 drv->last_sect = 0;
230 drv->max_track = 0;
240 static int fd_sector(fdrive_t *drv)
242 return fd_sector_calc(drv->head, drv->track, drv->sect, drv->last_sect, NUM_SIDES(drv));
252 static int fd_seek(fdrive_t *drv, uint8_t head, uint8_t track, uint8_t sect,
258 if (track > drv->max_track ||
259 (head != 0 && (drv->flags & FDISK_DBL_SIDES) == 0)) {
262 (drv->flags & FDISK_DBL_SIDES) == 0 ? 0 : 1,
263 drv->max_track, drv->last_sect);
266 if (sect > drv->last_sect || sect < 1) {
269 (drv->flags & FDISK_DBL_SIDES) == 0 ? 0 : 1,
270 drv->max_track, drv->last_sect);
273 sector = fd_sector_calc(head, track, sect, drv->last_sect, NUM_SIDES(drv));
275 if (sector != fd_sector(drv)) {
279 head, track, sect, 1, drv->max_track, drv->last_sect);
283 drv->head = head;
284 if (drv->track != track)
286 drv->track = track;
287 drv->sect = sect;
289 drv->ltrk = drv->track;
295 static void fd_recalibrate(fdrive_t *drv)
298 drv->head = 0;
299 drv->track = 0;
300 drv->ltrk = 0;
301 drv->sect = 1;
417 static void fd_revalidate(fdrive_t *drv)
426 if (drv->bs != NULL && bdrv_is_inserted(drv->bs)) {
427 ro = bdrv_is_read_only(drv->bs);
428 bdrv_get_geometry_hint(drv->bs, &nb_heads, &max_track, &last_sect);
430 if ( drv->pDrvBlock
431 && drv->pDrvMount
432 && drv->pDrvMount->pfnIsMounted (drv->pDrvMount)) {
433 ro = drv->pDrvBlock->pfnIsReadOnly (drv->pDrvBlock);
441 bdrv_get_geometry(drv->bs, &nb_sectors);
444 uint64_t size2 = drv->pDrvBlock->pfnGetSize (drv->pDrvBlock);
454 if (drv->drive == parse->drive ||
455 drv->drive == FDRIVE_DRV_NONE) {
476 drv->drive = parse->drive;
478 drv->media_rate = parse->rate;
486 drv->flags &= ~FDISK_DBL_SIDES;
488 drv->flags |= FDISK_DBL_SIDES;
490 drv->max_track = max_track;
491 drv->last_sect = last_sect;
492 drv->ro = ro;
495 drv->last_sect = 0;
496 drv->max_track = 0;
497 drv->flags &= ~FDISK_DBL_SIDES;
498 drv->dsk_chg = true; /* Disk change line active. */
1085 static int fdctrl_media_changed(fdrive_t *drv)
1088 return drv->dsk_chg;
1092 if (!drv->bs)
1094 ret = bdrv_media_changed(drv->bs);
1096 fd_revalidate(drv);
1471 static int blk_write(fdrive_t *drv, int64_t sector_num, const uint8_t *buf, int nb_sectors)
1475 drv->Led.Asserted.s.fWriting = drv->Led.Actual.s.fWriting = 1;
1477 rc = drv->pDrvBlock->pfnWrite(drv->pDrvBlock, sector_num * FD_SECTOR_LEN,
1480 drv->Led.Actual.s.fWriting = 0;
1487 static int blk_read(fdrive_t *drv, int64_t sector_num, uint8_t *buf, int nb_sectors)
1491 drv->Led.Asserted.s.fReading = drv->Led.Actual.s.fReading = 1;
1493 rc = drv->pDrvBlock->pfnRead(drv->pDrvBlock, sector_num * FD_SECTOR_LEN,
1496 drv->Led.Actual.s.fReading = 0;
2650 * @param drv The drive in question.
2654 static int fdConfig(fdrive_t *drv, PPDMDEVINS pDevIns, bool fInit)
2662 Assert (RT_ELEMENTS(s_apszDesc) > drv->iLUN);
2663 Assert (drv->Led.u32Magic == PDMLED_MAGIC);
2664 drv->Led.Actual.u32 = 0;
2665 drv->Led.Asserted.u32 = 0;
2670 rc = PDMDevHlpDriverAttach (pDevIns, drv->iLUN, &drv->IBase, &drv->pDrvBase, s_apszDesc[drv->iLUN]);
2672 drv->pDrvBlock = PDMIBASE_QUERY_INTERFACE(drv->pDrvBase, PDMIBLOCK);
2673 if (drv->pDrvBlock) {
2674 drv->pDrvBlockBios = PDMIBASE_QUERY_INTERFACE(drv->pDrvBase, PDMIBLOCKBIOS);
2675 if (drv->pDrvBlockBios) {
2676 drv->pDrvMount = PDMIBASE_QUERY_INTERFACE(drv->pDrvBase, PDMIMOUNT);
2677 if (drv->pDrvMount) {
2678 fd_init(drv, fInit);
2680 AssertMsgFailed (("Configuration error: LUN#%d without mountable interface!\n", drv->iLUN));
2685 AssertMsgFailed (("Configuration error: LUN#%d hasn't a block BIOS interface!\n", drv->iLUN));
2690 AssertMsgFailed (("Configuration error: LUN#%d hasn't a block interface!\n", drv->iLUN));
2695 ("Failed to attach LUN#%d. rc=%Rrc\n", drv->iLUN, rc));
2711 drv->pDrvBase = NULL;
2712 drv->pDrvBlock = NULL;
2713 drv->pDrvBlockBios = NULL;
2714 drv->pDrvMount = NULL;
2729 fdrive_t *drv;
2749 drv = &fdctrl->drives[iLUN];
2752 AssertRelease (!drv->pDrvBase);
2753 AssertRelease (!drv->pDrvBlock);
2754 AssertRelease (!drv->pDrvBlockBios);
2755 AssertRelease (!drv->pDrvMount);
2757 rc = fdConfig (drv, pDevIns, false /*fInit*/);
2761 fd_revalidate (drv);
2784 fdrive_t *drv = &pThis->drives[iLUN];
2785 drv->pDrvBase = NULL;
2786 drv->pDrvBlock = NULL;
2787 drv->pDrvBlockBios = NULL;
2788 drv->pDrvMount = NULL;