Lines Matching +full:i +full:- +full:drive

1 // SPDX-License-Identifier: GPL-2.0-only
9 * - Driver now works interrupt driven
10 * - Support for two drives; should work, but I cannot test that :-(
11 * - Reading is done in whole tracks and buffered to speed up things
12 * - Disk change detection and drive deselecting after motor-off
14 * - Autodetection of disk format (DD/HD); untested yet, because I
15 * don't have an HD drive :-(
18 * - Autodetection works now
19 * - Support for 5 1/4'' disks
20 * - Removed drive type (unknown on atari)
21 * - Do seeks with 8 Mhz
24 * - After errors in multiple read mode try again reading single sectors
26 * - Clean up error handling
27 * - Set blk_size for proper size checking
28 * - Initialize track register when testing presence of floppy
29 * - Implement some ioctl's
32 * - When probing the floppies we should add the FDCCMDADD_H flag since
36 * - MFPDELAY() after each FDC access -> atari
37 * - more/other disk formats
38 * - DMA to the block buffer directly if we have a 32bit DMA
39 * - for medusa, the step rate is always 3ms
40 * - on medusa, use only cache_push()
42 * - Make disk format numbering independent from minors
43 * - Let user set max. supported drive type (speeds up format
47 * - implement some more ioctls
48 * - disk formatting
51 * - increase gap size at start of track for HD/ED disks
54 * - implemented FDSETPRM and FDDEFPRM ioctl
57 * - implemented missing BLK* ioctls
60 * - Formatting
61 * - Maybe a better strategy for disk change detection (does anyone
70 #include <linux/blk-mq.h>
108 #define FDCCMD_RESTORE (0x00) /* - */
112 #define FDCCMD_STOT (0x60) /* - */
113 #define FDCCMD_RDSEC (0x80) /* - TYP 2 Commands */
114 #define FDCCMD_WRSEC (0xa0) /* - " */
115 #define FDCCMD_RDADR (0xc0) /* - */
117 #define FDCCMD_WRTRA (0xf0) /* - */
118 #define FDCCMD_FORCI (0xd0) /* - TYP 4 Command */
127 #define FDCCMDADD_H (0x08) /* wait for spin-up */
138 #define FDCSTAT_SPINUP (0x20) /* motor speed stable (Type I) */
142 #define FDCSTAT_TR00 (0x04) /* Track 00 flag (Type I) */
144 #define FDCSTAT_IDX (0x02) /* Index status (Type I) */
149 /* PSG Port A Bit Nr 0 .. Side Sel .. 0 -> Side 1 1 -> Side 2 */
177 { "D360", 9, 720, 0, 1}, /* 1: 360kb in 720k or 1.2MB drive */
178 { "D720", 9,1440, 0, 0}, /* 2: 720kb in 720k or 1.2MB drive */
240 /* some PC formats :-) */
241 { 8, TYPE_ED }, /* 9: E3280 <- was "CompaQ" == E2880 for PC */
245 { 3, TYPE_DD }, /* 13: H820 <- == D820, 82x10 */
263 { 6, TYPE_HD }, /* 31: H1640 <- was H1600 == h1600 for PC */
275 * MSch: User-provided type information. 'drive' points to
281 * User-provided permanent type information. 'drive' points to
284 * default_params[].blocks > 0 - a bit in unit[].flags might be used for this?)
290 int connected; /* !=0 : drive is connected */
295 int track; /* current head position or -1 if
309 #define UD unit[drive]
310 #define UDT unit[drive].disktype
340 * First, there is a DMA buffer in ST-RAM that is used for floppy DMA
358 static int UseTrackbuffer = -1; /* Do track buffering? */
364 static int read_track; /* non-zero if we are reading whole tracks */
366 #define SECTOR_BUFFER(sec) (TrackBuffer + ((sec)-1)*512)
367 #define IS_BUFFERED(drive,side,track) \ argument
368 (BufferDrive == (drive) && BufferSide == (side) && BufferTrack == (track))
383 static int UserSteprate[FD_MAX_UNITS] = { -1, -1 };
395 #define RECALIBRATE_ERRORS 4 /* After this many errors the drive
423 static void fd_select_drive( int drive );
429 static int do_format(int drive, int type, struct atari_format_descr *desc);
430 static void do_fd_action( int drive );
444 static void setup_req_params( int drive );
447 static void fd_probe( int drive );
448 static int fd_test_drive_present( int drive );
517 /* Select a drive, update the FDC's track register and set the correct
521 static void fd_select_drive( int drive ) in fd_select_drive() argument
526 if (drive == SelectedDrive) in fd_select_drive()
533 sound_ym.wd_data = (tmp | DSKDRVNONE) & ~(drive == 0 ? DSKDRV0 : DSKDRV1); in fd_select_drive()
544 dma_wd.fdc_speed = UDT->fdc_speed; in fd_select_drive()
546 SelectedDrive = drive; in fd_select_drive()
562 /* On Falcon, the drive B select line is used on the printer port, so in fd_deselect()
564 SelectedDrive = -1; in fd_deselect()
571 * counts the index signals, which arrive only if one drive is selected.
579 /* no drive selected, needn't deselect anyone */ in fd_motor_off_timer()
588 /* motor already turned off by FDC -> deselect drives */ in fd_motor_off_timer()
597 * in the drive and the FDC will leave the motor on forever (or, in fd_motor_off_timer()
612 static int drive = 0; in check_change() local
618 if (++drive > 1 || !UD.connected) in check_change()
619 drive = 0; in check_change()
628 ~(drive == 0 ? DSKDRV0 : DSKDRV1); in check_change()
633 DPRINT(( "wpstat[%d] = %d\n", drive, stat )); in check_change()
635 set_bit (drive, &changed_floppies); in check_change()
665 for (cnt = 512/4; cnt; cnt--) in copy_buffer()
718 if (SelectedDrive != -1) in fd_error()
719 SUD.track = -1; in fd_error()
721 /* need to re-run request to recalibrate */ in fd_error()
735 /* ---------- Formatting ---------- */
743 static int do_format(int drive, int type, struct atari_format_descr *desc) in do_format() argument
752 type--; in do_format()
756 return -EINVAL; in do_format()
760 q = unit[drive].disk[type]->queue; in do_format()
774 if (!UDT || desc->track >= UDT->blocks/UDT->spt/2 || desc->head >= 2) { in do_format()
776 ret = -EINVAL; in do_format()
780 nsect = UDT->spt; in do_format()
784 BufferDrive = -1; in do_format()
793 *p++ = desc->track; in do_format()
794 *p++ = desc->head; in do_format()
795 *p++ = (nsect + sect - desc->sect_offset) % nsect + 1; in do_format()
806 FILL( TrackBuffer+BUFFER_SIZE-p, 0x4e ); in do_format()
810 ReqTrack = desc->track; in do_format()
811 ReqSide = desc->head; in do_format()
812 do_fd_action( drive ); in do_format()
817 ret = FormatError ? -EIO : 0; in do_format()
826 * required parameter settings (drive select, side select, track
834 static void do_fd_action( int drive ) in do_fd_action() argument
840 if (IS_BUFFERED( drive, ReqSide, ReqTrack )) { in do_fd_action()
845 setup_req_params( drive ); in do_fd_action()
863 if (SelectedDrive != drive) in do_fd_action()
864 fd_select_drive( drive ); in do_fd_action()
866 if (UD.track == -1) in do_fd_action()
868 else if (UD.track != ReqTrack << UDT->stretch) in do_fd_action()
907 dma_wd.fdc_speed = SUDT->fdc_speed; in fd_calibrate_done()
919 /* Seek the drive to the requested track. The drive must have been
925 if (SUD.track == ReqTrack << SUDT->stretch) { in fd_seek()
936 FDC_WRITE( FDCREG_DATA, ReqTrack << SUDT->stretch); in fd_seek()
955 dma_wd.fdc_speed = SUDT->fdc_speed; in fd_seek_done()
960 SUD.track = -1; in fd_seek_done()
964 SUD.track = ReqTrack << SUDT->stretch; in fd_seek_done()
1014 if (SUDT->stretch) { in fd_rwsec()
1017 FDC_WRITE( FDCREG_TRACK, track >> SUDT->stretch); in fd_rwsec()
1045 dma_wd.fdc_acces_seccount = read_track ? SUDT->spt : 1; in fd_rwsec()
1065 * search for the first non-existent sector and need 1 sec to in fd_rwsec()
1066 * recognise that it isn't present :-( in fd_rwsec()
1110 if (addr >= PhysTrackBuffer + SUDT->spt*512) { in fd_readtrack_check()
1121 /* No error until now -- the FDC would have interrupted in fd_readtrack_check()
1155 if (SUDT->stretch) { in fd_rwsec_done1()
1158 FDC_WRITE( FDCREG_TRACK, track << SUDT->stretch); in fd_rwsec_done1()
1177 searched for a non-existent sector! */ in fd_rwsec_done1()
1178 !(read_track && FDC_READ(FDCREG_SECTOR) > SUDT->spt)) { in fd_rwsec_done1()
1181 if (SUDT[-1].blocks > ReqBlock) { in fd_rwsec_done1()
1183 SUDT--; in fd_rwsec_done1()
1185 SUDT->blocks); in fd_rwsec_done1()
1191 printk(KERN_INFO "fd%d: Auto-detected floppy type %s\n", in fd_rwsec_done1()
1192 SelectedDrive, SUDT->name ); in fd_rwsec_done1()
1200 SUDT->blocks); in fd_rwsec_done1()
1206 dma_wd.fdc_speed = SUDT->fdc_speed; in fd_rwsec_done1()
1210 BufferDrive = -1; in fd_rwsec_done1()
1261 BufferDrive = -1; in fd_rwsec_done1()
1279 if (SUDT->stretch) { in fd_writetrack()
1282 FDC_WRITE(FDCREG_TRACK,track >> SUDT->stretch); in fd_writetrack()
1372 * no matter what :-( To save time, the seek goes to the track we're
1388 /* we must wait for the IRQ here, because the ST-DMA in finish_fdc()
1405 * last seek command, the WP bit still reads wrong :-(( in finish_fdc_done()
1420 /* The detection of disk changes is a dark chapter in Atari history :-(
1421 * Because the "Drive ready" signal isn't present in the Atari
1424 * problem by introducing tri-state logic ("maybe changed") and
1427 * filesystem used on the disk and thus the contents of block 0. I've
1438 struct atari_floppy_struct *p = disk->private_data; in floppy_check_events()
1439 unsigned int drive = p - unit; in floppy_check_events() local
1440 if (test_bit (drive, &fake_change)) { in floppy_check_events()
1444 if (test_bit (drive, &changed_floppies)) { in floppy_check_events()
1449 /* WP is on -> could be changed: to be sure, buffers should be in floppy_check_events()
1460 struct atari_floppy_struct *p = disk->private_data; in floppy_revalidate()
1461 unsigned int drive = p - unit; in floppy_revalidate() local
1463 if (test_bit(drive, &changed_floppies) || in floppy_revalidate()
1464 test_bit(drive, &fake_change) || !p->disktype) { in floppy_revalidate()
1467 BufferDrive = -1; in floppy_revalidate()
1468 clear_bit(drive, &fake_change); in floppy_revalidate()
1469 clear_bit(drive, &changed_floppies); in floppy_revalidate()
1471 formats, for 'permanent user-defined' parameter: in floppy_revalidate()
1473 if (default_params[drive].blocks == 0) in floppy_revalidate()
1476 UDT = &default_params[drive]; in floppy_revalidate()
1484 static void setup_req_params( int drive ) in setup_req_params() argument
1488 ReqTrack = block / UDT->spt; in setup_req_params()
1489 ReqSector = block - ReqTrack * UDT->spt + 1; in setup_req_params()
1495 read_track = (ReqCmd == READ && unit[drive].error_count == 0); in setup_req_params()
1506 struct atari_floppy_struct *floppy = bd->rq->q->disk->private_data; in ataflop_queue_rq()
1507 int drive = floppy - unit; in ataflop_queue_rq() local
1508 int type = floppy->type; in ataflop_queue_rq()
1510 DPRINT(("Queue request: drive %d type %d sectors %d of %d last %d\n", in ataflop_queue_rq()
1511 drive, type, blk_rq_cur_sectors(bd->rq), in ataflop_queue_rq()
1512 blk_rq_sectors(bd->rq), bd->last)); in ataflop_queue_rq()
1523 fd_request = bd->rq; in ataflop_queue_rq()
1524 unit[drive].error_count = 0; in ataflop_queue_rq()
1532 /* drive not connected */ in ataflop_queue_rq()
1533 printk(KERN_ERR "Unknown Device: fd%d\n", drive ); in ataflop_queue_rq()
1543 set_capacity(bd->rq->q->disk, UDT->blocks); in ataflop_queue_rq()
1549 if (--type >= NUM_DISK_MINORS) { in ataflop_queue_rq()
1550 printk(KERN_WARNING "fd%d: invalid disk format", drive ); in ataflop_queue_rq()
1556 printk(KERN_WARNING "fd%d: unsupported disk format", drive ); in ataflop_queue_rq()
1563 set_capacity(bd->rq->q->disk, UDT->blocks); in ataflop_queue_rq()
1573 ReqBuffer = bio_data(fd_request->bio); in ataflop_queue_rq()
1574 setup_req_params( drive ); in ataflop_queue_rq()
1575 do_fd_action( drive ); in ataflop_queue_rq()
1587 struct gendisk *disk = bdev->bd_disk; in fd_locked_ioctl()
1588 struct atari_floppy_struct *floppy = disk->private_data; in fd_locked_ioctl()
1589 int drive = floppy - unit; in fd_locked_ioctl() local
1590 int type = floppy->type; in fd_locked_ioctl()
1601 if (--type >= NUM_DISK_MINORS) in fd_locked_ioctl()
1602 return -ENODEV; in fd_locked_ioctl()
1604 return -ENODEV; in fd_locked_ioctl()
1609 drive, dtp, dtp->name); in fd_locked_ioctl()
1613 return -ENXIO; in fd_locked_ioctl()
1618 getprm.size = dtp->blocks; in fd_locked_ioctl()
1619 getprm.sect = dtp->spt; in fd_locked_ioctl()
1621 getprm.track = dtp->blocks/dtp->spt/2; in fd_locked_ioctl()
1622 getprm.stretch = dtp->stretch; in fd_locked_ioctl()
1624 return -EFAULT; in fd_locked_ioctl()
1633 * Currently, the drive geometry is cleared after each in fd_locked_ioctl()
1640 if (floppy->ref != 1 && floppy->ref != -1) in fd_locked_ioctl()
1641 return -EBUSY; in fd_locked_ioctl()
1643 return -EFAULT; in fd_locked_ioctl()
1646 * or the next access will revalidate - and clear UDT :-( in fd_locked_ioctl()
1654 drive, setprm.size, setprm.sect, setprm.stretch); in fd_locked_ioctl()
1658 /* refuse to re-set a predefined type for now */ in fd_locked_ioctl()
1660 return -EINVAL; in fd_locked_ioctl()
1666 * TODO: add user-defined format to head of autoprobe list ? in fd_locked_ioctl()
1667 * Useful to include the user-type for future autodetection! in fd_locked_ioctl()
1673 /* skip this one, invalid for drive ... */ in fd_locked_ioctl()
1680 if ( dtp->blocks == setprm.size in fd_locked_ioctl()
1681 && dtp->spt == setprm.sect in fd_locked_ioctl()
1682 && dtp->stretch == setprm.stretch ) { in fd_locked_ioctl()
1685 drive, dtp->name, dtp); in fd_locked_ioctl()
1687 set_capacity(disk, UDT->blocks); in fd_locked_ioctl()
1691 default_params[drive].name = dtp->name; in fd_locked_ioctl()
1692 default_params[drive].spt = dtp->spt; in fd_locked_ioctl()
1693 default_params[drive].blocks = dtp->blocks; in fd_locked_ioctl()
1694 default_params[drive].fdc_speed = dtp->fdc_speed; in fd_locked_ioctl()
1695 default_params[drive].stretch = dtp->stretch; in fd_locked_ioctl()
1703 /* no matching disk type found above - setting user_params */ in fd_locked_ioctl()
1707 dtp = &default_params[drive]; in fd_locked_ioctl()
1710 dtp = &user_params[drive]; in fd_locked_ioctl()
1712 dtp->name = "user format"; in fd_locked_ioctl()
1713 dtp->blocks = setprm.size; in fd_locked_ioctl()
1714 dtp->spt = setprm.sect; in fd_locked_ioctl()
1716 dtp->fdc_speed = 3; in fd_locked_ioctl()
1718 dtp->fdc_speed = 0; in fd_locked_ioctl()
1719 dtp->stretch = setprm.stretch; in fd_locked_ioctl()
1723 drive, dtp->blocks, dtp->spt, dtp->stretch); in fd_locked_ioctl()
1726 if (setprm.track != dtp->blocks/dtp->spt/2 || in fd_locked_ioctl()
1729 return -EINVAL; in fd_locked_ioctl()
1733 set_capacity(disk, UDT->blocks); in fd_locked_ioctl()
1743 return -EINVAL; in fd_locked_ioctl()
1747 if (floppy->ref != 1 && floppy->ref != -1) in fd_locked_ioctl()
1748 return -EBUSY; in fd_locked_ioctl()
1750 return -EFAULT; in fd_locked_ioctl()
1751 return do_format(drive, type, &fmt_desc); in fd_locked_ioctl()
1755 default_params[drive].blocks = 0; in fd_locked_ioctl()
1761 BufferDrive = -1; in fd_locked_ioctl()
1762 set_bit(drive, &fake_change); in fd_locked_ioctl()
1764 bdev_mark_dead(disk->part0, true); in fd_locked_ioctl()
1769 return -EINVAL; in fd_locked_ioctl()
1785 /* Initialize the 'unit' variable for drive 'drive' */
1787 static void __init fd_probe( int drive ) in fd_probe() argument
1792 if (!fd_test_drive_present( drive )) in fd_probe()
1797 switch( UserSteprate[drive] ) { in fd_probe()
1810 default: /* should be -1 for "not set by user" */ in fd_probe()
1821 /* This function tests the physical presence of a floppy drive (not
1825 * signal. This should now be raised if there is a drive connected
1826 * (and there is no hardware failure :-) Otherwise, the drive is
1830 static int __init fd_test_drive_present( int drive ) in fd_test_drive_present() argument
1836 if (drive >= (MACH_IS_FALCON ? 1 : 2)) return( 0 ); in fd_test_drive_present()
1837 fd_select_drive( drive ); in fd_test_drive_present()
1874 * floppies, additionally start the disk-change and motor-off timers.
1879 int drive, cnt = 0; in config_types() local
1885 printk(KERN_INFO "Probing floppy drive(s):\n"); in config_types()
1886 for( drive = 0; drive < FD_MAX_UNITS; drive++ ) { in config_types()
1887 fd_probe( drive ); in config_types()
1889 printk(KERN_INFO "fd%d\n", drive); in config_types()
1899 * interrupts on this IRQ line :-( in config_types()
1917 * drive with different device numbers.
1922 struct atari_floppy_struct *p = disk->private_data; in floppy_open()
1923 int type = disk->first_minor >> 2; in floppy_open()
1926 if (p->ref && p->type != type) in floppy_open()
1927 return -EBUSY; in floppy_open()
1929 if (p->ref == -1 || (p->ref && mode & BLK_OPEN_EXCL)) in floppy_open()
1930 return -EBUSY; in floppy_open()
1932 p->ref = -1; in floppy_open()
1934 p->ref++; in floppy_open()
1936 p->type = type; in floppy_open()
1945 if (p->wpstat) { in floppy_open()
1946 if (p->ref < 0) in floppy_open()
1947 p->ref = 0; in floppy_open()
1949 p->ref--; in floppy_open()
1950 return -EROFS; in floppy_open()
1970 struct atari_floppy_struct *p = disk->private_data; in floppy_release()
1972 if (p->ref < 0) in floppy_release()
1973 p->ref = 0; in floppy_release()
1974 else if (!p->ref--) { in floppy_release()
1976 p->ref = 0; in floppy_release()
1993 static int ataflop_alloc_disk(unsigned int drive, unsigned int type) in ataflop_alloc_disk() argument
2000 disk = blk_mq_alloc_disk(&unit[drive].tag_set, &lim, NULL); in ataflop_alloc_disk()
2004 disk->major = FLOPPY_MAJOR; in ataflop_alloc_disk()
2005 disk->first_minor = drive + (type << 2); in ataflop_alloc_disk()
2006 disk->minors = 1; in ataflop_alloc_disk()
2007 sprintf(disk->disk_name, "fd%d", drive); in ataflop_alloc_disk()
2008 disk->fops = &floppy_fops; in ataflop_alloc_disk()
2009 disk->flags |= GENHD_FL_NO_PART; in ataflop_alloc_disk()
2010 disk->events = DISK_EVENT_MEDIA_CHANGE; in ataflop_alloc_disk()
2011 disk->private_data = &unit[drive]; in ataflop_alloc_disk()
2014 unit[drive].disk[type] = disk; in ataflop_alloc_disk()
2020 int drive = MINOR(dev) & 3; in ataflop_probe() local
2024 type--; in ataflop_probe()
2026 if (drive >= FD_MAX_UNITS || type >= NUM_DISK_MINORS) in ataflop_probe()
2028 if (unit[drive].disk[type]) in ataflop_probe()
2030 if (ataflop_alloc_disk(drive, type)) in ataflop_probe()
2032 if (add_disk(unit[drive].disk[type])) in ataflop_probe()
2034 unit[drive].registered[type] = true; in ataflop_probe()
2038 put_disk(unit[drive].disk[type]); in ataflop_probe()
2039 unit[drive].disk[type] = NULL; in ataflop_probe()
2044 int i; in atari_floppy_cleanup() local
2047 for (i = 0; i < FD_MAX_UNITS; i++) { in atari_floppy_cleanup()
2049 if (!unit[i].disk[type]) in atari_floppy_cleanup()
2051 del_gendisk(unit[i].disk[type]); in atari_floppy_cleanup()
2052 put_disk(unit[i].disk[type]); in atari_floppy_cleanup()
2054 blk_mq_free_tag_set(&unit[i].tag_set); in atari_floppy_cleanup()
2066 if (!fs->disk[type]) in atari_cleanup_floppy_disk()
2068 if (fs->registered[type]) in atari_cleanup_floppy_disk()
2069 del_gendisk(fs->disk[type]); in atari_cleanup_floppy_disk()
2070 put_disk(fs->disk[type]); in atari_cleanup_floppy_disk()
2072 blk_mq_free_tag_set(&fs->tag_set); in atari_cleanup_floppy_disk()
2077 int i; in atari_floppy_init() local
2081 /* Amiga, Mac, ... don't have Atari-compatible floppy :-) */ in atari_floppy_init()
2082 return -ENODEV; in atari_floppy_init()
2084 for (i = 0; i < FD_MAX_UNITS; i++) { in atari_floppy_init()
2085 memset(&unit[i].tag_set, 0, sizeof(unit[i].tag_set)); in atari_floppy_init()
2086 unit[i].tag_set.ops = &ataflop_mq_ops; in atari_floppy_init()
2087 unit[i].tag_set.nr_hw_queues = 1; in atari_floppy_init()
2088 unit[i].tag_set.nr_maps = 1; in atari_floppy_init()
2089 unit[i].tag_set.queue_depth = 2; in atari_floppy_init()
2090 unit[i].tag_set.numa_node = NUMA_NO_NODE; in atari_floppy_init()
2091 unit[i].tag_set.flags = BLK_MQ_F_SHOULD_MERGE; in atari_floppy_init()
2092 ret = blk_mq_alloc_tag_set(&unit[i].tag_set); in atari_floppy_init()
2096 ret = ataflop_alloc_disk(i, 0); in atari_floppy_init()
2098 blk_mq_free_tag_set(&unit[i].tag_set); in atari_floppy_init()
2104 /* not set by user -> use default: for now, we turn in atari_floppy_init()
2107 card. But the test is too hard :-( */ in atari_floppy_init()
2111 SelectedDrive = -1; in atari_floppy_init()
2112 BufferDrive = -1; in atari_floppy_init()
2117 ret = -ENOMEM; in atari_floppy_init()
2123 BufferDrive = BufferSide = BufferTrack = -1; in atari_floppy_init()
2125 for (i = 0; i < FD_MAX_UNITS; i++) { in atari_floppy_init()
2126 unit[i].track = -1; in atari_floppy_init()
2127 unit[i].flags = 0; in atari_floppy_init()
2128 ret = add_disk(unit[i].disk[0]); in atari_floppy_init()
2131 unit[i].registered[0] = true; in atari_floppy_init()
2149 while (--i >= 0) in atari_floppy_init()
2150 atari_cleanup_floppy_disk(&unit[i]); in atari_floppy_init()
2159 int i; in atari_floppy_setup() local
2175 printk(KERN_ERR "ataflop_setup: bad drive type\n" ); in atari_floppy_setup()
2182 for( i = 3; i <= ints[0] && i-3 < FD_MAX_UNITS; ++i ) { in atari_floppy_setup()
2183 if (ints[i] != 2 && ints[i] != 3 && ints[i] != 6 && ints[i] != 12) in atari_floppy_setup()
2186 UserSteprate[i-3] = ints[i]; in atari_floppy_setup()