Lines Matching refs:fs

209 #define swim3_err(fmt, arg...)	dev_err(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg)
210 #define swim3_warn(fmt, arg...) dev_warn(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg)
211 #define swim3_info(fmt, arg...) dev_info(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg)
214 #define swim3_dbg(fmt, arg...) dev_dbg(&fs->mdev->ofdev.dev, "[fd%d] " fmt, fs->index, arg)
237 static void seek_track(struct floppy_state *fs, int n);
238 static void act(struct floppy_state *fs);
245 static int grab_drive(struct floppy_state *fs, enum swim_state state,
247 static void release_drive(struct floppy_state *fs);
248 static int fd_eject(struct floppy_state *fs);
257 static bool swim3_end_request(struct floppy_state *fs, blk_status_t err, unsigned int nr_bytes) in swim3_end_request() argument
259 struct request *req = fs->cur_req; in swim3_end_request()
269 fs->cur_req = NULL; in swim3_end_request()
273 static void swim3_select(struct floppy_state *fs, int sel) in swim3_select() argument
275 struct swim3 __iomem *sw = fs->swim3; in swim3_select()
285 static void swim3_action(struct floppy_state *fs, int action) in swim3_action() argument
287 struct swim3 __iomem *sw = fs->swim3; in swim3_action()
289 swim3_select(fs, action); in swim3_action()
297 static int swim3_readbit(struct floppy_state *fs, int bit) in swim3_readbit() argument
299 struct swim3 __iomem *sw = fs->swim3; in swim3_readbit()
302 swim3_select(fs, bit); in swim3_readbit()
311 struct floppy_state *fs = hctx->queue->queuedata; in swim3_queue_rq() local
316 if (fs->cur_req || fs->state != idle) { in swim3_queue_rq()
321 fs->cur_req = req; in swim3_queue_rq()
322 if (fs->mdev->media_bay && in swim3_queue_rq()
323 check_media_bay(fs->mdev->media_bay) != MB_FD) { in swim3_queue_rq()
325 swim3_end_request(fs, BLK_STS_IOERR, 0); in swim3_queue_rq()
328 if (fs->ejected) { in swim3_queue_rq()
330 swim3_end_request(fs, BLK_STS_IOERR, 0); in swim3_queue_rq()
334 if (fs->write_prot < 0) in swim3_queue_rq()
335 fs->write_prot = swim3_readbit(fs, WRITE_PROT); in swim3_queue_rq()
336 if (fs->write_prot) { in swim3_queue_rq()
338 swim3_end_request(fs, BLK_STS_IOERR, 0); in swim3_queue_rq()
348 fs->req_cyl = ((long)blk_rq_pos(req)) / fs->secpercyl; in swim3_queue_rq()
349 x = ((long)blk_rq_pos(req)) % fs->secpercyl; in swim3_queue_rq()
350 fs->head = x / fs->secpertrack; in swim3_queue_rq()
351 fs->req_sector = x % fs->secpertrack + 1; in swim3_queue_rq()
352 fs->state = do_transfer; in swim3_queue_rq()
353 fs->retries = 0; in swim3_queue_rq()
355 act(fs); in swim3_queue_rq()
362 static void set_timeout(struct floppy_state *fs, int nticks, in set_timeout() argument
365 if (fs->timeout_pending) in set_timeout()
366 del_timer(&fs->timeout); in set_timeout()
367 fs->timeout.expires = jiffies + nticks; in set_timeout()
368 fs->timeout.function = proc; in set_timeout()
369 add_timer(&fs->timeout); in set_timeout()
370 fs->timeout_pending = 1; in set_timeout()
373 static inline void scan_track(struct floppy_state *fs) in scan_track() argument
375 struct swim3 __iomem *sw = fs->swim3; in scan_track()
377 swim3_select(fs, READ_DATA_0); in scan_track()
383 set_timeout(fs, HZ, scan_timeout); /* enable timeout */ in scan_track()
386 static inline void seek_track(struct floppy_state *fs, int n) in seek_track() argument
388 struct swim3 __iomem *sw = fs->swim3; in seek_track()
391 swim3_action(fs, SEEK_POSITIVE); in seek_track()
394 swim3_action(fs, SEEK_NEGATIVE); in seek_track()
397 fs->expect_cyl = (fs->cur_cyl >= 0)? fs->cur_cyl + n: -1; in seek_track()
398 swim3_select(fs, STEP); in seek_track()
403 set_timeout(fs, 3*HZ, seek_timeout); /* enable timeout */ in seek_track()
404 fs->settle_time = 0; in seek_track()
432 static inline void setup_transfer(struct floppy_state *fs) in setup_transfer() argument
435 struct swim3 __iomem *sw = fs->swim3; in setup_transfer()
436 struct dbdma_cmd *cp = fs->dma_cmd; in setup_transfer()
437 struct dbdma_regs __iomem *dr = fs->dma; in setup_transfer()
438 struct request *req = fs->cur_req; in setup_transfer()
447 n = fs->secpertrack - fs->req_sector + 1; in setup_transfer()
453 fs->req_sector, fs->secpertrack, fs->head, n); in setup_transfer()
455 fs->scount = n; in setup_transfer()
456 swim3_select(fs, fs->head? READ_DATA_1: READ_DATA_0); in setup_transfer()
457 out_8(&sw->sector, fs->req_sector); in setup_transfer()
485 set_timeout(fs, 2*HZ, xfer_timeout); /* enable timeout */ in setup_transfer()
488 static void act(struct floppy_state *fs) in act() argument
492 fs->state, fs->req_cyl, fs->cur_cyl); in act()
494 switch (fs->state) { in act()
499 if (swim3_readbit(fs, TRACK_ZERO)) { in act()
501 fs->cur_cyl = 0; in act()
502 if (fs->req_cyl == 0) in act()
503 fs->state = do_transfer; in act()
505 fs->state = seeking; in act()
508 scan_track(fs); in act()
512 if (fs->cur_cyl < 0) { in act()
513 fs->expect_cyl = -1; in act()
514 fs->state = locating; in act()
517 if (fs->req_cyl == fs->cur_cyl) { in act()
519 fs->state = do_transfer; in act()
522 seek_track(fs, fs->req_cyl - fs->cur_cyl); in act()
527 fs->settle_time = (HZ + 32) / 33; in act()
528 set_timeout(fs, fs->settle_time, settle_timeout); in act()
532 if (fs->cur_cyl != fs->req_cyl) { in act()
533 if (fs->retries > 5) { in act()
535 fs->req_cyl, fs->cur_cyl); in act()
536 swim3_end_request(fs, BLK_STS_IOERR, 0); in act()
537 fs->state = idle; in act()
540 fs->state = seeking; in act()
543 setup_transfer(fs); in act()
547 seek_track(fs, -5); in act()
551 swim3_err("Unknown state %d\n", fs->state); in act()
559 struct floppy_state *fs = from_timer(fs, t, timeout); in scan_timeout() local
560 struct swim3 __iomem *sw = fs->swim3; in scan_timeout()
563 swim3_dbg("* scan timeout, state=%d\n", fs->state); in scan_timeout()
566 fs->timeout_pending = 0; in scan_timeout()
570 fs->cur_cyl = -1; in scan_timeout()
571 if (fs->retries > 5) { in scan_timeout()
572 swim3_end_request(fs, BLK_STS_IOERR, 0); in scan_timeout()
573 fs->state = idle; in scan_timeout()
575 fs->state = jogging; in scan_timeout()
576 act(fs); in scan_timeout()
583 struct floppy_state *fs = from_timer(fs, t, timeout); in seek_timeout() local
584 struct swim3 __iomem *sw = fs->swim3; in seek_timeout()
587 swim3_dbg("* seek timeout, state=%d\n", fs->state); in seek_timeout()
590 fs->timeout_pending = 0; in seek_timeout()
595 swim3_end_request(fs, BLK_STS_IOERR, 0); in seek_timeout()
596 fs->state = idle; in seek_timeout()
602 struct floppy_state *fs = from_timer(fs, t, timeout); in settle_timeout() local
603 struct swim3 __iomem *sw = fs->swim3; in settle_timeout()
606 swim3_dbg("* settle timeout, state=%d\n", fs->state); in settle_timeout()
609 fs->timeout_pending = 0; in settle_timeout()
610 if (swim3_readbit(fs, SEEK_COMPLETE)) { in settle_timeout()
612 fs->state = locating; in settle_timeout()
613 act(fs); in settle_timeout()
617 if (fs->settle_time < 2*HZ) { in settle_timeout()
618 ++fs->settle_time; in settle_timeout()
619 set_timeout(fs, 1, settle_timeout); in settle_timeout()
623 swim3_end_request(fs, BLK_STS_IOERR, 0); in settle_timeout()
624 fs->state = idle; in settle_timeout()
631 struct floppy_state *fs = from_timer(fs, t, timeout); in xfer_timeout() local
632 struct swim3 __iomem *sw = fs->swim3; in xfer_timeout()
633 struct dbdma_regs __iomem *dr = fs->dma; in xfer_timeout()
637 swim3_dbg("* xfer timeout, state=%d\n", fs->state); in xfer_timeout()
640 fs->timeout_pending = 0; in xfer_timeout()
649 (rq_data_dir(fs->cur_req)==WRITE? "writ": "read"), in xfer_timeout()
650 (long)blk_rq_pos(fs->cur_req)); in xfer_timeout()
651 swim3_end_request(fs, BLK_STS_IOERR, 0); in xfer_timeout()
652 fs->state = idle; in xfer_timeout()
658 struct floppy_state *fs = (struct floppy_state *) dev_id; in swim3_interrupt() local
659 struct swim3 __iomem *sw = fs->swim3; in swim3_interrupt()
665 struct request *req = fs->cur_req; in swim3_interrupt()
667 swim3_dbg("* interrupt, state=%d\n", fs->state); in swim3_interrupt()
672 if ((intr & ERROR_INTR) && fs->state != do_transfer) in swim3_interrupt()
674 fs->state, rq_data_dir(req), intr, err); in swim3_interrupt()
675 switch (fs->state) { in swim3_interrupt()
681 del_timer(&fs->timeout); in swim3_interrupt()
682 fs->timeout_pending = 0; in swim3_interrupt()
685 fs->cur_cyl = -1; in swim3_interrupt()
686 if (fs->retries > 5) { in swim3_interrupt()
687 swim3_end_request(fs, BLK_STS_IOERR, 0); in swim3_interrupt()
688 fs->state = idle; in swim3_interrupt()
690 fs->state = jogging; in swim3_interrupt()
691 act(fs); in swim3_interrupt()
695 fs->cur_cyl = sw->ctrack; in swim3_interrupt()
696 fs->cur_sector = sw->csect; in swim3_interrupt()
697 if (fs->expect_cyl != -1 && fs->expect_cyl != fs->cur_cyl) in swim3_interrupt()
699 fs->expect_cyl, fs->cur_cyl); in swim3_interrupt()
700 fs->state = do_transfer; in swim3_interrupt()
701 act(fs); in swim3_interrupt()
710 del_timer(&fs->timeout); in swim3_interrupt()
711 fs->timeout_pending = 0; in swim3_interrupt()
712 if (fs->state == seeking) in swim3_interrupt()
713 ++fs->retries; in swim3_interrupt()
714 fs->state = settling; in swim3_interrupt()
715 act(fs); in swim3_interrupt()
720 del_timer(&fs->timeout); in swim3_interrupt()
721 fs->timeout_pending = 0; in swim3_interrupt()
722 act(fs); in swim3_interrupt()
730 del_timer(&fs->timeout); in swim3_interrupt()
731 fs->timeout_pending = 0; in swim3_interrupt()
732 dr = fs->dma; in swim3_interrupt()
733 cp = fs->dma_cmd; in swim3_interrupt()
757 n = fs->scount - 1 - resid / 512; in swim3_interrupt()
760 fs->req_sector += n; in swim3_interrupt()
762 if (fs->retries < 5) { in swim3_interrupt()
763 ++fs->retries; in swim3_interrupt()
764 act(fs); in swim3_interrupt()
769 swim3_end_request(fs, BLK_STS_IOERR, 0); in swim3_interrupt()
770 fs->state = idle; in swim3_interrupt()
777 fs->state, rq_data_dir(req), intr, err); in swim3_interrupt()
778 swim3_end_request(fs, BLK_STS_IOERR, 0); in swim3_interrupt()
779 fs->state = idle; in swim3_interrupt()
782 fs->retries = 0; in swim3_interrupt()
783 if (swim3_end_request(fs, 0, fs->scount << 9)) { in swim3_interrupt()
784 fs->req_sector += fs->scount; in swim3_interrupt()
785 if (fs->req_sector > fs->secpertrack) { in swim3_interrupt()
786 fs->req_sector -= fs->secpertrack; in swim3_interrupt()
787 if (++fs->head > 1) { in swim3_interrupt()
788 fs->head = 0; in swim3_interrupt()
789 ++fs->req_cyl; in swim3_interrupt()
792 act(fs); in swim3_interrupt()
794 fs->state = idle; in swim3_interrupt()
798 swim3_err("Don't know what to do in state %d\n", fs->state); in swim3_interrupt()
811 static int grab_drive(struct floppy_state *fs, enum swim_state state, in grab_drive() argument
819 if (fs->state != idle && fs->state != available) { in grab_drive()
820 ++fs->wanted; in grab_drive()
823 wait_event_lock_irq(fs->wait, in grab_drive()
824 fs->state == available, in grab_drive()
826 else if (wait_event_interruptible_lock_irq(fs->wait, in grab_drive()
827 fs->state == available, in grab_drive()
829 --fs->wanted; in grab_drive()
833 --fs->wanted; in grab_drive()
835 fs->state = state; in grab_drive()
841 static void release_drive(struct floppy_state *fs) in release_drive() argument
843 struct request_queue *q = disks[fs->index]->queue; in release_drive()
849 fs->state = idle; in release_drive()
858 static int fd_eject(struct floppy_state *fs) in fd_eject() argument
862 err = grab_drive(fs, ejecting, 1); in fd_eject()
865 swim3_action(fs, EJECT); in fd_eject()
871 swim3_select(fs, RELAX); in fd_eject()
873 if (swim3_readbit(fs, DISK_IN) == 0) in fd_eject()
876 swim3_select(fs, RELAX); in fd_eject()
878 fs->ejected = 1; in fd_eject()
879 release_drive(fs); in fd_eject()
889 struct floppy_state *fs = bdev->bd_disk->private_data; in floppy_locked_ioctl() local
895 if (fs->mdev->media_bay && in floppy_locked_ioctl()
896 check_media_bay(fs->mdev->media_bay) != MB_FD) in floppy_locked_ioctl()
901 if (fs->ref_count != 1) in floppy_locked_ioctl()
903 err = fd_eject(fs); in floppy_locked_ioctl()
928 struct floppy_state *fs = bdev->bd_disk->private_data; in floppy_open() local
929 struct swim3 __iomem *sw = fs->swim3; in floppy_open()
932 if (fs->ref_count == 0) { in floppy_open()
933 if (fs->mdev->media_bay && in floppy_open()
934 check_media_bay(fs->mdev->media_bay) != MB_FD) in floppy_open()
942 swim3_action(fs, MOTOR_ON); in floppy_open()
943 fs->write_prot = -1; in floppy_open()
944 fs->cur_cyl = -1; in floppy_open()
946 if (n >= HZ/30 && swim3_readbit(fs, SEEK_COMPLETE)) in floppy_open()
952 swim3_select(fs, RELAX); in floppy_open()
955 if (err == 0 && (swim3_readbit(fs, SEEK_COMPLETE) == 0 in floppy_open()
956 || swim3_readbit(fs, DISK_IN) == 0)) in floppy_open()
958 swim3_action(fs, SETMFM); in floppy_open()
959 swim3_select(fs, RELAX); in floppy_open()
961 } else if (fs->ref_count == -1 || mode & FMODE_EXCL) in floppy_open()
968 if (fs->ejected) in floppy_open()
973 if (fs->write_prot < 0) in floppy_open()
974 fs->write_prot = swim3_readbit(fs, WRITE_PROT); in floppy_open()
975 if (fs->write_prot) in floppy_open()
980 if (fs->ref_count == 0) { in floppy_open()
981 swim3_action(fs, MOTOR_OFF); in floppy_open()
983 swim3_select(fs, RELAX); in floppy_open()
989 fs->ref_count = -1; in floppy_open()
991 ++fs->ref_count; in floppy_open()
1009 struct floppy_state *fs = disk->private_data; in floppy_release() local
1010 struct swim3 __iomem *sw = fs->swim3; in floppy_release()
1013 if (fs->ref_count > 0) in floppy_release()
1014 --fs->ref_count; in floppy_release()
1015 else if (fs->ref_count == -1) in floppy_release()
1016 fs->ref_count = 0; in floppy_release()
1017 if (fs->ref_count == 0) { in floppy_release()
1018 swim3_action(fs, MOTOR_OFF); in floppy_release()
1020 swim3_select(fs, RELAX); in floppy_release()
1028 struct floppy_state *fs = disk->private_data; in floppy_check_events() local
1029 return fs->ejected ? DISK_EVENT_MEDIA_CHANGE : 0; in floppy_check_events()
1034 struct floppy_state *fs = disk->private_data; in floppy_revalidate() local
1038 if (fs->mdev->media_bay && in floppy_revalidate()
1039 check_media_bay(fs->mdev->media_bay) != MB_FD) in floppy_revalidate()
1042 sw = fs->swim3; in floppy_revalidate()
1043 grab_drive(fs, revalidating, 0); in floppy_revalidate()
1046 swim3_action(fs, MOTOR_ON); /* necessary? */ in floppy_revalidate()
1047 fs->write_prot = -1; in floppy_revalidate()
1048 fs->cur_cyl = -1; in floppy_revalidate()
1051 if (swim3_readbit(fs, SEEK_COMPLETE)) in floppy_revalidate()
1055 swim3_select(fs, RELAX); in floppy_revalidate()
1058 ret = swim3_readbit(fs, SEEK_COMPLETE) == 0 in floppy_revalidate()
1059 || swim3_readbit(fs, DISK_IN) == 0; in floppy_revalidate()
1061 swim3_action(fs, MOTOR_OFF); in floppy_revalidate()
1063 fs->ejected = 0; in floppy_revalidate()
1064 swim3_action(fs, SETMFM); in floppy_revalidate()
1066 swim3_select(fs, RELAX); in floppy_revalidate()
1068 release_drive(fs); in floppy_revalidate()
1085 struct floppy_state *fs = macio_get_drvdata(mdev); in swim3_mb_event() local
1088 if (!fs) in swim3_mb_event()
1091 sw = fs->swim3; in swim3_mb_event()
1105 struct floppy_state *fs = &floppy_states[index]; in swim3_add_device() local
1108 fs->mdev = mdev; in swim3_add_device()
1109 fs->index = index; in swim3_add_device()
1129 dev_set_drvdata(&mdev->ofdev.dev, fs); in swim3_add_device()
1134 fs->state = idle; in swim3_add_device()
1135 fs->swim3 = (struct swim3 __iomem *) in swim3_add_device()
1137 if (fs->swim3 == NULL) { in swim3_add_device()
1142 fs->dma = (struct dbdma_regs __iomem *) in swim3_add_device()
1144 if (fs->dma == NULL) { in swim3_add_device()
1146 iounmap(fs->swim3); in swim3_add_device()
1150 fs->swim3_intr = macio_irq(mdev, 0); in swim3_add_device()
1151 fs->dma_intr = macio_irq(mdev, 1); in swim3_add_device()
1152 fs->cur_cyl = -1; in swim3_add_device()
1153 fs->cur_sector = -1; in swim3_add_device()
1154 fs->secpercyl = 36; in swim3_add_device()
1155 fs->secpertrack = 18; in swim3_add_device()
1156 fs->total_secs = 2880; in swim3_add_device()
1157 init_waitqueue_head(&fs->wait); in swim3_add_device()
1159 fs->dma_cmd = (struct dbdma_cmd *) DBDMA_ALIGN(fs->dbdma_cmd_space); in swim3_add_device()
1160 memset(fs->dma_cmd, 0, 2 * sizeof(struct dbdma_cmd)); in swim3_add_device()
1161 fs->dma_cmd[1].command = cpu_to_le16(DBDMA_STOP); in swim3_add_device()
1166 if (request_irq(fs->swim3_intr, swim3_interrupt, 0, "SWIM3", fs)) { in swim3_add_device()
1172 timer_setup(&fs->timeout, NULL, 0); in swim3_add_device()
1180 iounmap(fs->dma); in swim3_add_device()
1181 iounmap(fs->swim3); in swim3_add_device()
1193 struct floppy_state *fs; in swim3_attach() local
1206 fs = &floppy_states[floppy_count]; in swim3_attach()
1207 memset(fs, 0, sizeof(*fs)); in swim3_attach()
1209 rc = blk_mq_alloc_sq_tag_set(&fs->tag_set, &swim3_mq_ops, 2, in swim3_attach()
1214 disk = blk_mq_alloc_disk(&fs->tag_set, fs); in swim3_attach()
1228 disk->private_data = fs; in swim3_attach()
1243 blk_mq_free_tag_set(&fs->tag_set); in swim3_attach()