Lines Matching full:drive

53  * - added trackbuffer for each drive to speed things up
102 #define DSKSEL3 (0x1<<6) /* select drive 3 when low */
103 #define DSKSEL2 (0x1<<5) /* select drive 2 when low */
104 #define DSKSEL1 (0x1<<4) /* select drive 1 when low */
105 #define DSKSEL0 (0x1<<3) /* select drive 0 when low */
176 unsigned long code; /* code returned from drive */
177 char *name; /* description of drive */
199 int disk; /* disk in drive (-1 == unknown) */
201 int busy; /* true when drive is active */
227 #define FD_DD_3 0xffffffff /* double-density 3.5" (880K) drive */
228 #define FD_HD_3 0x55555555 /* high-density 3.5" (1760K) drive */
229 #define FD_DD_5 0xaaaaaaaa /* double-density 5.25" (440K) drive */
244 #define SELMASK(drive) (1 << (3 + (drive & 3))) argument
252 { FD_NODRIVE, "No Drive", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
281 static volatile int selected = -1; /* currently selected drive */
358 static inline int try_fdc(int drive) in try_fdc() argument
360 drive &= 3; in try_fdc()
361 return ((fdc_busy < 0) || (fdc_busy == drive)); in try_fdc()
364 static void get_fdc(int drive) in get_fdc() argument
368 drive &= 3; in get_fdc()
370 printk("get_fdc: drive %d fdc_busy %d fdc_nested %d\n",drive,fdc_busy,fdc_nested); in get_fdc()
373 wait_event(fdc_wait, try_fdc(drive)); in get_fdc()
374 fdc_busy = drive; in get_fdc()
393 static void fd_select (int drive) in fd_select() argument
397 drive&=3; in fd_select()
399 printk("selecting %d\n",drive); in fd_select()
401 if (drive == selected) in fd_select()
403 get_fdc(drive); in fd_select()
404 selected = drive; in fd_select()
406 if (unit[drive].track % 2 != 0) in fd_select()
408 if (unit[drive].motor == 1) in fd_select()
412 prb &= ~SELMASK(drive); in fd_select()
417 static void fd_deselect (int drive) in fd_deselect() argument
422 drive&=3; in fd_deselect()
424 printk("deselecting %d\n",drive); in fd_deselect()
426 if (drive != selected) { in fd_deselect()
427 printk(KERN_WARNING "Deselecting drive %d while %d was selected!\n",drive,selected); in fd_deselect()
431 get_fdc(drive); in fd_deselect()
480 …printk (KERN_WARNING "DSKRDY not set after 1.5 seconds - assuming drive is spinning notwithstandin… in fd_motor_on()
489 unsigned long drive = ((unsigned long)timer - in fd_motor_off() local
493 drive&=3; in fd_motor_off()
494 if (!try_fdc(drive)) { in fd_motor_off()
500 unit[drive].motor = 0; in fd_motor_off()
501 fd_select(drive); in fd_motor_off()
503 fd_deselect(drive); in fd_motor_off()
508 int drive; in floppy_off() local
510 drive = nr & 3; in floppy_off()
511 mod_timer(motor_off_timer + drive, jiffies + 3*HZ); in floppy_off()
514 static int fd_calibrate(int drive) in fd_calibrate() argument
519 drive &= 3; in fd_calibrate()
520 get_fdc(drive); in fd_calibrate()
521 if (!fd_motor_on (drive)) in fd_calibrate()
523 fd_select (drive); in fd_calibrate()
528 for (n = unit[drive].type->tracks/2; n != 0; --n) { in fd_calibrate()
536 ms_delay(unit[drive].type->step_delay); in fd_calibrate()
538 ms_delay (unit[drive].type->settle_time); in fd_calibrate()
540 n = unit[drive].type->tracks + 20; in fd_calibrate()
547 ms_delay(unit[drive].type->step_delay + 1); in fd_calibrate()
551 printk (KERN_ERR "fd%d: calibrate failed, turning motor off\n", drive); in fd_calibrate()
552 fd_motor_off (motor_off_timer + drive); in fd_calibrate()
553 unit[drive].track = -1; in fd_calibrate()
558 unit[drive].track = 0; in fd_calibrate()
559 ms_delay(unit[drive].type->settle_time); in fd_calibrate()
562 fd_deselect(drive); in fd_calibrate()
566 static int fd_seek(int drive, int track) in fd_seek() argument
572 printk("seeking drive %d to track %d\n",drive,track); in fd_seek()
574 drive &= 3; in fd_seek()
575 get_fdc(drive); in fd_seek()
576 if (unit[drive].track == track) { in fd_seek()
580 if (!fd_motor_on(drive)) { in fd_seek()
584 if (unit[drive].track < 0 && !fd_calibrate(drive)) { in fd_seek()
589 fd_select (drive); in fd_seek()
590 cnt = unit[drive].track/2 - track/2; in fd_seek()
600 if (track % 2 != unit[drive].track % 2) in fd_seek()
601 ms_delay (unit[drive].type->side_time); in fd_seek()
602 unit[drive].track = track; in fd_seek()
605 fd_deselect(drive); in fd_seek()
614 ms_delay (unit[drive].type->step_delay); in fd_seek()
616 ms_delay (unit[drive].type->settle_time); in fd_seek()
619 fd_deselect(drive); in fd_seek()
623 static unsigned long fd_get_drive_id(int drive) in fd_get_drive_id() argument
628 drive&=3; in fd_get_drive_id()
629 get_fdc(drive); in fd_get_drive_id()
633 SELECT(SELMASK(drive)); in fd_get_drive_id()
635 DESELECT(SELMASK(drive)); in fd_get_drive_id()
639 SELECT(SELMASK(drive)); in fd_get_drive_id()
641 DESELECT(SELMASK(drive)); in fd_get_drive_id()
646 SELECT(SELMASK(drive)); in fd_get_drive_id()
653 DESELECT(SELMASK(drive)); in fd_get_drive_id()
660 * As every (real) Amiga has at least a 3.5" DD drive as df0: in fd_get_drive_id()
664 if(drive == 0 && id == FD_NODRIVE) in fd_get_drive_id()
667 … printk(KERN_NOTICE "fd: drive 0 didn't identify, setting default %08lx\n", (ulong)fd_def_df0); in fd_get_drive_id()
691 static void raw_read(int drive) in raw_read() argument
693 drive&=3; in raw_read()
694 get_fdc(drive); in raw_read()
696 fd_select(drive); in raw_read()
705 custom.dsklen = unit[drive].type->read_size/sizeof(short) | DSKLEN_DMAEN; in raw_read()
706 custom.dsklen = unit[drive].type->read_size/sizeof(short) | DSKLEN_DMAEN; in raw_read()
713 fd_deselect(drive); in raw_read()
717 static int raw_write(int drive) in raw_write() argument
721 drive&=3; in raw_write()
722 get_fdc(drive); /* corresponds to rel_fdc() in post_write() */ in raw_write()
728 fd_select(drive); in raw_write()
733 if ((ulong)unit[drive].track >= unit[drive].type->precomp2) in raw_write()
735 else if ((ulong)unit[drive].track >= unit[drive].type->precomp1) in raw_write()
741 custom.dsklen = unit[drive].type->write_size/sizeof(short) | DSKLEN_DMAEN|DSKLEN_WRITE; in raw_write()
742 custom.dsklen = unit[drive].type->write_size/sizeof(short) | DSKLEN_DMAEN|DSKLEN_WRITE; in raw_write()
752 static void post_write (unsigned long drive) in post_write() argument
755 printk("post_write for drive %ld\n",drive); in post_write()
757 drive &= 3; in post_write()
762 unit[drive].dirty = 0; in post_write()
764 fd_deselect(drive); in post_write()
835 static int amiga_read(int drive) in amiga_read() argument
843 drive&=3; in amiga_read()
845 end = raw + unit[drive].type->read_size; in amiga_read()
847 for (scnt = 0;scnt < unit[drive].dtype->sects * unit[drive].type->sect_mult; scnt++) { in amiga_read()
874 if (hdr.track != unit[drive].track) { in amiga_read()
875 printk(KERN_INFO "MFM_TRACK: %d, %d\n", hdr.track, unit[drive].track); in amiga_read()
879 raw = decode ((ulong *)(unit[drive].trackbuf + hdr.sect*512), in amiga_read()
881 csum = checksum((ulong *)(unit[drive].trackbuf + hdr.sect*512), 512); in amiga_read()
888 ((ulong *)(unit[drive].trackbuf+hdr.sect*512))[0], in amiga_read()
889 ((ulong *)(unit[drive].trackbuf+hdr.sect*512))[1], in amiga_read()
890 ((ulong *)(unit[drive].trackbuf+hdr.sect*512))[2], in amiga_read()
891 ((ulong *)(unit[drive].trackbuf+hdr.sect*512))[3]); in amiga_read()
1150 static int dos_read(int drive) in dos_read() argument
1158 drive&=3; in dos_read()
1160 end = raw + unit[drive].type->read_size; in dos_read()
1162 for (scnt=0; scnt < unit[drive].dtype->sects * unit[drive].type->sect_mult; scnt++) { in dos_read()
1167 unit[drive].track,drive,scnt); in dos_read()
1188 if (hdr.track != unit[drive].track/unit[drive].type->heads) { in dos_read()
1191 unit[drive].track/unit[drive].type->heads); in dos_read()
1195 if (hdr.side != unit[drive].track%unit[drive].type->heads) { in dos_read()
1198 unit[drive].track%unit[drive].type->heads); in dos_read()
1213 unit[drive].track, drive, scnt, hdr.sec); in dos_read()
1228 …raw = dos_decode((unsigned char *)(unit[drive].trackbuf + (hdr.sec - 1) * 512), (ushort *) raw, 51… in dos_read()
1230 crc = dos_data_crc(unit[drive].trackbuf + (hdr.sec - 1) * 512); in dos_read()
1237 ((ulong *)(unit[drive].trackbuf+(hdr.sec-1)*512))[0], in dos_read()
1238 ((ulong *)(unit[drive].trackbuf+(hdr.sec-1)*512))[1], in dos_read()
1239 ((ulong *)(unit[drive].trackbuf+(hdr.sec-1)*512))[2], in dos_read()
1240 ((ulong *)(unit[drive].trackbuf+(hdr.sec-1)*512))[3]); in dos_read()
1271 static unsigned long *ms_putsec(int drive, unsigned long *raw, int cnt) in ms_putsec() argument
1278 drive&=3; in ms_putsec()
1288 hdr.track=unit[drive].track/unit[drive].type->heads; in ms_putsec()
1289 hdr.side=unit[drive].track%unit[drive].type->heads; in ms_putsec()
1307 (unsigned char *)unit[drive].trackbuf+cnt*512,512); in ms_putsec()
1311 crc[0]=dos_data_crc(unit[drive].trackbuf+cnt*512); in ms_putsec()
1362 /* FIXME: this assumes the drive is still spinning -
1423 static int get_track(int drive, int track) in get_track() argument
1427 drive&=3; in get_track()
1428 if (unit[drive].track == track) in get_track()
1430 get_fdc(drive); in get_track()
1431 if (!fd_motor_on(drive)) { in get_track()
1436 if (unit[drive].dirty == 1) { in get_track()
1437 del_timer (flush_track_timer + drive); in get_track()
1438 non_int_flush_track (drive); in get_track()
1442 if (!fd_seek(drive, track)) in get_track()
1444 raw_read(drive); in get_track()
1445 error = (*unit[drive].dtype->read_fkt)(drive); in get_track()
1451 unit[drive].track = -1; in get_track()
1461 int drive = floppy - unit; in amiflop_rw_cur_segment() local
1480 if (get_track(drive, track) == -1) in amiflop_rw_cur_segment()
1488 /* keep the drive spinning while writes are scheduled */ in amiflop_rw_cur_segment()
1489 if (!fd_motor_on(drive)) in amiflop_rw_cur_segment()
1497 mod_timer (flush_track_timer + drive, jiffies + 1); in amiflop_rw_cur_segment()
1527 int drive = MINOR(bdev->bd_dev) & 3; in fd_getgeo() local
1529 geo->heads = unit[drive].type->heads; in fd_getgeo()
1530 geo->sectors = unit[drive].dtype->sects * unit[drive].type->sect_mult; in fd_getgeo()
1531 geo->cylinders = unit[drive].type->tracks; in fd_getgeo()
1539 int drive = p - unit; in fd_locked_ioctl() local
1545 get_fdc(drive); in fd_locked_ioctl()
1546 if (fd_ref[drive] > 1) { in fd_locked_ioctl()
1550 if (fd_motor_on(drive) == 0) { in fd_locked_ioctl()
1554 if (fd_calibrate(drive) == 0) { in fd_locked_ioctl()
1558 floppy_off(drive); in fd_locked_ioctl()
1564 get_fdc(drive); in fd_locked_ioctl()
1565 if (fd_seek(drive,param) != 0){ in fd_locked_ioctl()
1568 non_int_flush_track(drive); in fd_locked_ioctl()
1570 floppy_off(drive); in fd_locked_ioctl()
1577 floppy_off(drive); in fd_locked_ioctl()
1593 del_timer (flush_track_timer + drive); in fd_locked_ioctl()
1594 non_int_flush_track(drive); in fd_locked_ioctl()
1625 int drive; in fd_probe() local
1627 drive = dev & 3; in fd_probe()
1628 code = fd_get_drive_id(drive); in fd_probe()
1630 /* get drive type */ in fd_probe()
1636 printk(KERN_WARNING "fd_probe: unsupported drive type " in fd_probe()
1638 unit[drive].type = &drive_types[num_dr_types-1]; /* FD_NODRIVE */ in fd_probe()
1642 unit[drive].type = drive_types + type; in fd_probe()
1643 unit[drive].track = -1; in fd_probe()
1645 unit[drive].disk = -1; in fd_probe()
1646 unit[drive].motor = 0; in fd_probe()
1647 unit[drive].busy = 0; in fd_probe()
1648 unit[drive].status = -1; in fd_probe()
1654 * drive with different device numbers.
1658 int drive = disk->first_minor & 3; in floppy_open() local
1664 old_dev = fd_device[drive]; in floppy_open()
1666 if (fd_ref[drive] && old_dev != system) { in floppy_open()
1671 if (unit[drive].type->code == FD_NODRIVE) { in floppy_open()
1680 get_fdc(drive); in floppy_open()
1681 fd_select (drive); in floppy_open()
1683 fd_deselect (drive); in floppy_open()
1693 fd_ref[drive]++; in floppy_open()
1694 fd_device[drive] = system; in floppy_open()
1697 unit[drive].dtype=&data_types[system]; in floppy_open()
1698 unit[drive].blocks=unit[drive].type->heads*unit[drive].type->tracks* in floppy_open()
1699 data_types[system].sects*unit[drive].type->sect_mult; in floppy_open()
1700 set_capacity(unit[drive].gendisk[system], unit[drive].blocks); in floppy_open()
1702 printk(KERN_INFO "fd%d: accessing %s-disk with %s-layout\n",drive, in floppy_open()
1703 unit[drive].type->name, data_types[system].name); in floppy_open()
1712 int drive = p - unit; in floppy_release() local
1715 if (unit[drive].dirty == 1) { in floppy_release()
1716 del_timer (flush_track_timer + drive); in floppy_release()
1717 non_int_flush_track (drive); in floppy_release()
1720 if (!fd_ref[drive]--) { in floppy_release()
1722 fd_ref[drive] = 0; in floppy_release()
1725 floppy_off (drive); in floppy_release()
1733 * to the desired drive, but it will probably not survive the sleep if
1739 int drive = p - unit; in amiga_check_events() local
1746 get_fdc(drive); in amiga_check_events()
1747 fd_select (drive); in amiga_check_events()
1749 fd_deselect (drive); in amiga_check_events()
1754 fd_probe(drive); in amiga_check_events()
1777 static int fd_alloc_disk(int drive, int system) in fd_alloc_disk() argument
1782 disk = blk_mq_alloc_disk(&unit[drive].tag_set, NULL); in fd_alloc_disk()
1787 disk->first_minor = drive + system; in fd_alloc_disk()
1793 sprintf(disk->disk_name, "fd%d_msdos", drive); in fd_alloc_disk()
1795 sprintf(disk->disk_name, "fd%d", drive); in fd_alloc_disk()
1796 disk->private_data = &unit[drive]; in fd_alloc_disk()
1799 unit[drive].gendisk[system] = disk; in fd_alloc_disk()
1806 static int fd_alloc_drive(int drive) in fd_alloc_drive() argument
1808 unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL); in fd_alloc_drive()
1809 if (!unit[drive].trackbuf) in fd_alloc_drive()
1812 memset(&unit[drive].tag_set, 0, sizeof(unit[drive].tag_set)); in fd_alloc_drive()
1813 unit[drive].tag_set.ops = &amiflop_mq_ops; in fd_alloc_drive()
1814 unit[drive].tag_set.nr_hw_queues = 1; in fd_alloc_drive()
1815 unit[drive].tag_set.nr_maps = 1; in fd_alloc_drive()
1816 unit[drive].tag_set.queue_depth = 2; in fd_alloc_drive()
1817 unit[drive].tag_set.numa_node = NUMA_NO_NODE; in fd_alloc_drive()
1818 unit[drive].tag_set.flags = BLK_MQ_F_SHOULD_MERGE; in fd_alloc_drive()
1819 if (blk_mq_alloc_tag_set(&unit[drive].tag_set)) in fd_alloc_drive()
1822 pr_cont(" fd%d", drive); in fd_alloc_drive()
1824 if (fd_alloc_disk(drive, 0) || fd_alloc_disk(drive, 1)) in fd_alloc_drive()
1829 blk_mq_free_tag_set(&unit[drive].tag_set); in fd_alloc_drive()
1831 kfree(unit[drive].trackbuf); in fd_alloc_drive()
1833 unit[drive].type->code = FD_NODRIVE; in fd_alloc_drive()
1839 int drive,drives,nomem; in fd_probe_drives() local
1844 for(drive=0;drive<FD_MAX_UNITS;drive++) { in fd_probe_drives()
1845 fd_probe(drive); in fd_probe_drives()
1846 if (unit[drive].type->code == FD_NODRIVE) in fd_probe_drives()
1849 if (fd_alloc_drive(drive) < 0) { in fd_probe_drives()
1850 pr_cont(" no mem for fd%d", drive); in fd_probe_drives()