cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ataflop.c (57810B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  drivers/block/ataflop.c
      4 *
      5 *  Copyright (C) 1993  Greg Harp
      6 *  Atari Support by Bjoern Brauel, Roman Hodek
      7 *
      8 *  Big cleanup Sep 11..14 1994 Roman Hodek:
      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
     13 *     similar to TOS
     14 *   - Autodetection of disk format (DD/HD); untested yet, because I
     15 *     don't have an HD drive :-(
     16 *
     17 *  Fixes Nov 13 1994 Martin Schaller:
     18 *   - Autodetection works now
     19 *   - Support for 5 1/4'' disks
     20 *   - Removed drive type (unknown on atari)
     21 *   - Do seeks with 8 Mhz
     22 *
     23 *  Changes by Andreas Schwab:
     24 *   - After errors in multiple read mode try again reading single sectors
     25 *  (Feb 1995):
     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
     30 *
     31 *  Changes by Torsten Lang:
     32 *   - When probing the floppies we should add the FDCCMDADD_H flag since
     33 *     the FDC will otherwise wait forever when no disk is inserted...
     34 *
     35 * ++ Freddi Aschwanden (fa) 20.9.95 fixes for medusa:
     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()
     41 * Roman:
     42 *  - Make disk format numbering independent from minors
     43 *  - Let user set max. supported drive type (speeds up format
     44 *    detection, saves buffer space)
     45 *
     46 * Roman 10/15/95:
     47 *  - implement some more ioctls
     48 *  - disk formatting
     49 *  
     50 * Andreas 95/12/12:
     51 *  - increase gap size at start of track for HD/ED disks
     52 *
     53 * Michael (MSch) 11/07/96:
     54 *  - implemented FDSETPRM and FDDEFPRM ioctl
     55 *
     56 * Andreas (97/03/19):
     57 *  - implemented missing BLK* ioctls
     58 *
     59 *  Things left to do:
     60 *   - Formatting
     61 *   - Maybe a better strategy for disk change detection (does anyone
     62 *     know one?)
     63 */
     64
     65#include <linux/module.h>
     66
     67#include <linux/fd.h>
     68#include <linux/delay.h>
     69#include <linux/init.h>
     70#include <linux/blk-mq.h>
     71#include <linux/major.h>
     72#include <linux/mutex.h>
     73#include <linux/completion.h>
     74#include <linux/wait.h>
     75
     76#include <asm/atariints.h>
     77#include <asm/atari_stdma.h>
     78#include <asm/atari_stram.h>
     79
     80#define	FD_MAX_UNITS 2
     81
     82#undef DEBUG
     83
     84static DEFINE_MUTEX(ataflop_mutex);
     85static struct request *fd_request;
     86
     87/*
     88 * WD1772 stuff
     89 */
     90
     91/* register codes */
     92
     93#define FDCSELREG_STP   (0x80)   /* command/status register */
     94#define FDCSELREG_TRA   (0x82)   /* track register */
     95#define FDCSELREG_SEC   (0x84)   /* sector register */
     96#define FDCSELREG_DTA   (0x86)   /* data register */
     97
     98/* register names for FDC_READ/WRITE macros */
     99
    100#define FDCREG_CMD		0
    101#define FDCREG_STATUS	0
    102#define FDCREG_TRACK	2
    103#define FDCREG_SECTOR	4
    104#define FDCREG_DATA		6
    105
    106/* command opcodes */
    107
    108#define FDCCMD_RESTORE  (0x00)   /*  -                   */
    109#define FDCCMD_SEEK     (0x10)   /*   |                  */
    110#define FDCCMD_STEP     (0x20)   /*   |  TYP 1 Commands  */
    111#define FDCCMD_STIN     (0x40)   /*   |                  */
    112#define FDCCMD_STOT     (0x60)   /*  -                   */
    113#define FDCCMD_RDSEC    (0x80)   /*  -   TYP 2 Commands  */
    114#define FDCCMD_WRSEC    (0xa0)   /*  -          "        */
    115#define FDCCMD_RDADR    (0xc0)   /*  -                   */
    116#define FDCCMD_RDTRA    (0xe0)   /*   |  TYP 3 Commands  */
    117#define FDCCMD_WRTRA    (0xf0)   /*  -                   */
    118#define FDCCMD_FORCI    (0xd0)   /*  -   TYP 4 Command   */
    119
    120/* command modifier bits */
    121
    122#define FDCCMDADD_SR6   (0x00)   /* step rate settings */
    123#define FDCCMDADD_SR12  (0x01)
    124#define FDCCMDADD_SR2   (0x02)
    125#define FDCCMDADD_SR3   (0x03)
    126#define FDCCMDADD_V     (0x04)   /* verify */
    127#define FDCCMDADD_H     (0x08)   /* wait for spin-up */
    128#define FDCCMDADD_U     (0x10)   /* update track register */
    129#define FDCCMDADD_M     (0x10)   /* multiple sector access */
    130#define FDCCMDADD_E     (0x04)   /* head settling flag */
    131#define FDCCMDADD_P     (0x02)   /* precompensation off */
    132#define FDCCMDADD_A0    (0x01)   /* DAM flag */
    133
    134/* status register bits */
    135
    136#define	FDCSTAT_MOTORON	(0x80)   /* motor on */
    137#define	FDCSTAT_WPROT	(0x40)   /* write protected (FDCCMD_WR*) */
    138#define	FDCSTAT_SPINUP	(0x20)   /* motor speed stable (Type I) */
    139#define	FDCSTAT_DELDAM	(0x20)   /* sector has deleted DAM (Type II+III) */
    140#define	FDCSTAT_RECNF	(0x10)   /* record not found */
    141#define	FDCSTAT_CRC		(0x08)   /* CRC error */
    142#define	FDCSTAT_TR00	(0x04)   /* Track 00 flag (Type I) */
    143#define	FDCSTAT_LOST	(0x04)   /* Lost Data (Type II+III) */
    144#define	FDCSTAT_IDX		(0x02)   /* Index status (Type I) */
    145#define	FDCSTAT_DRQ		(0x02)   /* DRQ status (Type II+III) */
    146#define	FDCSTAT_BUSY	(0x01)   /* FDC is busy */
    147
    148
    149/* PSG Port A Bit Nr 0 .. Side Sel .. 0 -> Side 1  1 -> Side 2 */
    150#define DSKSIDE     (0x01)
    151
    152#define DSKDRVNONE  (0x06)
    153#define DSKDRV0     (0x02)
    154#define DSKDRV1     (0x04)
    155
    156/* step rates */
    157#define	FDCSTEP_6	0x00
    158#define	FDCSTEP_12	0x01
    159#define	FDCSTEP_2	0x02
    160#define	FDCSTEP_3	0x03
    161
    162struct atari_format_descr {
    163	int track;		/* to be formatted */
    164	int head;		/*   ""     ""     */
    165	int sect_offset;	/* offset of first sector */
    166};
    167
    168/* Disk types: DD, HD, ED */
    169static struct atari_disk_type {
    170	const char	*name;
    171	unsigned	spt;		/* sectors per track */
    172	unsigned	blocks;		/* total number of blocks */
    173	unsigned	fdc_speed;	/* fdc_speed setting */
    174	unsigned 	stretch;	/* track doubling ? */
    175} atari_disk_type[] = {
    176	{ "d360",  9, 720, 0, 0},	/*  0: 360kB diskette */
    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 */
    179	{ "D820", 10,1640, 0, 0},	/*  3: DD disk with 82 tracks/10 sectors */
    180/* formats above are probed for type DD */
    181#define	MAX_TYPE_DD 3
    182	{ "h1200",15,2400, 3, 0},	/*  4: 1.2MB diskette */
    183	{ "H1440",18,2880, 3, 0},	/*  5: 1.4 MB diskette (HD) */
    184	{ "H1640",20,3280, 3, 0},	/*  6: 1.64MB diskette (fat HD) 82 tr 20 sec */
    185/* formats above are probed for types DD and HD */
    186#define	MAX_TYPE_HD 6
    187	{ "E2880",36,5760, 3, 0},	/*  7: 2.8 MB diskette (ED) */
    188	{ "E3280",40,6560, 3, 0},	/*  8: 3.2 MB diskette (fat ED) 82 tr 40 sec */
    189/* formats above are probed for types DD, HD and ED */
    190#define	MAX_TYPE_ED 8
    191/* types below are never autoprobed */
    192	{ "H1680",21,3360, 3, 0},	/*  9: 1.68MB diskette (fat HD) 80 tr 21 sec */
    193	{ "h410",10,820, 0, 1},		/* 10: 410k diskette 41 tr 10 sec, stretch */
    194	{ "h1476",18,2952, 3, 0},	/* 11: 1.48MB diskette 82 tr 18 sec */
    195	{ "H1722",21,3444, 3, 0},	/* 12: 1.72MB diskette 82 tr 21 sec */
    196	{ "h420",10,840, 0, 1},		/* 13: 420k diskette 42 tr 10 sec, stretch */
    197	{ "H830",10,1660, 0, 0},	/* 14: 820k diskette 83 tr 10 sec */
    198	{ "h1494",18,2952, 3, 0},	/* 15: 1.49MB diskette 83 tr 18 sec */
    199	{ "H1743",21,3486, 3, 0},	/* 16: 1.74MB diskette 83 tr 21 sec */
    200	{ "h880",11,1760, 0, 0},	/* 17: 880k diskette 80 tr 11 sec */
    201	{ "D1040",13,2080, 0, 0},	/* 18: 1.04MB diskette 80 tr 13 sec */
    202	{ "D1120",14,2240, 0, 0},	/* 19: 1.12MB diskette 80 tr 14 sec */
    203	{ "h1600",20,3200, 3, 0},	/* 20: 1.60MB diskette 80 tr 20 sec */
    204	{ "H1760",22,3520, 3, 0},	/* 21: 1.76MB diskette 80 tr 22 sec */
    205	{ "H1920",24,3840, 3, 0},	/* 22: 1.92MB diskette 80 tr 24 sec */
    206	{ "E3200",40,6400, 3, 0},	/* 23: 3.2MB diskette 80 tr 40 sec */
    207	{ "E3520",44,7040, 3, 0},	/* 24: 3.52MB diskette 80 tr 44 sec */
    208	{ "E3840",48,7680, 3, 0},	/* 25: 3.84MB diskette 80 tr 48 sec */
    209	{ "H1840",23,3680, 3, 0},	/* 26: 1.84MB diskette 80 tr 23 sec */
    210	{ "D800",10,1600, 0, 0},	/* 27: 800k diskette 80 tr 10 sec */
    211};
    212
    213static int StartDiskType[] = {
    214	MAX_TYPE_DD,
    215	MAX_TYPE_HD,
    216	MAX_TYPE_ED
    217};
    218
    219#define	TYPE_DD		0
    220#define	TYPE_HD		1
    221#define	TYPE_ED		2
    222
    223static int DriveType = TYPE_HD;
    224
    225static DEFINE_SPINLOCK(ataflop_lock);
    226
    227/* Array for translating minors into disk formats */
    228static struct {
    229	int 	 index;
    230	unsigned drive_types;
    231} minor2disktype[] = {
    232	{  0, TYPE_DD },	/*  1: d360 */
    233	{  4, TYPE_HD },	/*  2: h1200 */
    234	{  1, TYPE_DD },	/*  3: D360 */
    235	{  2, TYPE_DD },	/*  4: D720 */
    236	{  1, TYPE_DD },	/*  5: h360 = D360 */
    237	{  2, TYPE_DD },	/*  6: h720 = D720 */
    238	{  5, TYPE_HD },	/*  7: H1440 */
    239	{  7, TYPE_ED },	/*  8: E2880 */
    240/* some PC formats :-) */
    241	{  8, TYPE_ED },	/*  9: E3280    <- was "CompaQ" == E2880 for PC */
    242	{  5, TYPE_HD },	/* 10: h1440 = H1440 */
    243	{  9, TYPE_HD },	/* 11: H1680 */
    244	{ 10, TYPE_DD },	/* 12: h410  */
    245	{  3, TYPE_DD },	/* 13: H820     <- == D820, 82x10 */
    246	{ 11, TYPE_HD },	/* 14: h1476 */
    247	{ 12, TYPE_HD },	/* 15: H1722 */
    248	{ 13, TYPE_DD },	/* 16: h420  */
    249	{ 14, TYPE_DD },	/* 17: H830  */
    250	{ 15, TYPE_HD },	/* 18: h1494 */
    251	{ 16, TYPE_HD },	/* 19: H1743 */
    252	{ 17, TYPE_DD },	/* 20: h880  */
    253	{ 18, TYPE_DD },	/* 21: D1040 */
    254	{ 19, TYPE_DD },	/* 22: D1120 */
    255	{ 20, TYPE_HD },	/* 23: h1600 */
    256	{ 21, TYPE_HD },	/* 24: H1760 */
    257	{ 22, TYPE_HD },	/* 25: H1920 */
    258	{ 23, TYPE_ED },	/* 26: E3200 */
    259	{ 24, TYPE_ED },	/* 27: E3520 */
    260	{ 25, TYPE_ED },	/* 28: E3840 */
    261	{ 26, TYPE_HD },	/* 29: H1840 */
    262	{ 27, TYPE_DD },	/* 30: D800  */
    263	{  6, TYPE_HD },	/* 31: H1640    <- was H1600 == h1600 for PC */
    264};
    265
    266#define NUM_DISK_MINORS ARRAY_SIZE(minor2disktype)
    267
    268/*
    269 * Maximum disk size (in kilobytes). This default is used whenever the
    270 * current disk size is unknown.
    271 */
    272#define MAX_DISK_SIZE 3280
    273
    274/*
    275 * MSch: User-provided type information. 'drive' points to
    276 * the respective entry of this array. Set by FDSETPRM ioctls.
    277 */
    278static struct atari_disk_type user_params[FD_MAX_UNITS];
    279
    280/*
    281 * User-provided permanent type information. 'drive' points to
    282 * the respective entry of this array.  Set by FDDEFPRM ioctls, 
    283 * restored upon disk change by floppy_revalidate() if valid (as seen by
    284 * default_params[].blocks > 0 - a bit in unit[].flags might be used for this?)
    285 */
    286static struct atari_disk_type default_params[FD_MAX_UNITS];
    287
    288/* current info on each unit */
    289static struct atari_floppy_struct {
    290	int connected;				/* !=0 : drive is connected */
    291	int autoprobe;				/* !=0 : do autoprobe	    */
    292
    293	struct atari_disk_type	*disktype;	/* current type of disk */
    294
    295	int track;		/* current head position or -1 if
    296				   unknown */
    297	unsigned int steprate;	/* steprate setting */
    298	unsigned int wpstat;	/* current state of WP signal (for
    299				   disk change detection) */
    300	int flags;		/* flags */
    301	struct gendisk *disk[NUM_DISK_MINORS];
    302	bool registered[NUM_DISK_MINORS];
    303	int ref;
    304	int type;
    305	struct blk_mq_tag_set tag_set;
    306	int error_count;
    307} unit[FD_MAX_UNITS];
    308
    309#define	UD	unit[drive]
    310#define	UDT	unit[drive].disktype
    311#define	SUD	unit[SelectedDrive]
    312#define	SUDT	unit[SelectedDrive].disktype
    313
    314
    315#define FDC_READ(reg) ({			\
    316    /* unsigned long __flags; */		\
    317    unsigned short __val;			\
    318    /* local_irq_save(__flags); */		\
    319    dma_wd.dma_mode_status = 0x80 | (reg);	\
    320    udelay(25);					\
    321    __val = dma_wd.fdc_acces_seccount;		\
    322    MFPDELAY();					\
    323    /* local_irq_restore(__flags); */		\
    324    __val & 0xff;				\
    325})
    326
    327#define FDC_WRITE(reg,val)			\
    328    do {					\
    329	/* unsigned long __flags; */		\
    330	/* local_irq_save(__flags); */		\
    331	dma_wd.dma_mode_status = 0x80 | (reg);	\
    332	udelay(25);				\
    333	dma_wd.fdc_acces_seccount = (val);	\
    334	MFPDELAY();				\
    335        /* local_irq_restore(__flags); */	\
    336    } while(0)
    337
    338
    339/* Buffering variables:
    340 * First, there is a DMA buffer in ST-RAM that is used for floppy DMA
    341 * operations. Second, a track buffer is used to cache a whole track
    342 * of the disk to save read operations. These are two separate buffers
    343 * because that allows write operations without clearing the track buffer.
    344 */
    345
    346static int MaxSectors[] = {
    347	11, 22, 44
    348};
    349static int BufferSize[] = {
    350	15*512, 30*512, 60*512
    351};
    352
    353#define	BUFFER_SIZE	(BufferSize[DriveType])
    354
    355unsigned char *DMABuffer;			  /* buffer for writes */
    356static unsigned long PhysDMABuffer;   /* physical address */
    357
    358static int UseTrackbuffer = -1;		  /* Do track buffering? */
    359module_param(UseTrackbuffer, int, 0);
    360
    361unsigned char *TrackBuffer;			  /* buffer for reads */
    362static unsigned long PhysTrackBuffer; /* physical address */
    363static int BufferDrive, BufferSide, BufferTrack;
    364static int read_track;		/* non-zero if we are reading whole tracks */
    365
    366#define	SECTOR_BUFFER(sec)	(TrackBuffer + ((sec)-1)*512)
    367#define	IS_BUFFERED(drive,side,track) \
    368    (BufferDrive == (drive) && BufferSide == (side) && BufferTrack == (track))
    369
    370/*
    371 * These are global variables, as that's the easiest way to give
    372 * information to interrupts. They are the data used for the current
    373 * request.
    374 */
    375static int SelectedDrive = 0;
    376static int ReqCmd, ReqBlock;
    377static int ReqSide, ReqTrack, ReqSector, ReqCnt;
    378static int HeadSettleFlag = 0;
    379static unsigned char *ReqData, *ReqBuffer;
    380static int MotorOn = 0, MotorOffTrys;
    381static int IsFormatting = 0, FormatError;
    382
    383static int UserSteprate[FD_MAX_UNITS] = { -1, -1 };
    384module_param_array(UserSteprate, int, NULL, 0);
    385
    386static DECLARE_COMPLETION(format_wait);
    387
    388static unsigned long changed_floppies = 0xff, fake_change = 0;
    389#define	CHECK_CHANGE_DELAY	HZ/2
    390
    391#define	FD_MOTOR_OFF_DELAY	(3*HZ)
    392#define	FD_MOTOR_OFF_MAXTRY	(10*20)
    393
    394#define FLOPPY_TIMEOUT		(6*HZ)
    395#define RECALIBRATE_ERRORS	4	/* After this many errors the drive
    396					 * will be recalibrated. */
    397#define MAX_ERRORS		8	/* After this many errors the driver
    398					 * will give up. */
    399
    400
    401/*
    402 * The driver is trying to determine the correct media format
    403 * while Probing is set. fd_rwsec_done() clears it after a
    404 * successful access.
    405 */
    406static int Probing = 0;
    407
    408/* This flag is set when a dummy seek is necessary to make the WP
    409 * status bit accessible.
    410 */
    411static int NeedSeek = 0;
    412
    413
    414#ifdef DEBUG
    415#define DPRINT(a)	printk a
    416#else
    417#define DPRINT(a)
    418#endif
    419
    420/***************************** Prototypes *****************************/
    421
    422static void fd_select_side( int side );
    423static void fd_select_drive( int drive );
    424static void fd_deselect( void );
    425static void fd_motor_off_timer(struct timer_list *unused);
    426static void check_change(struct timer_list *unused);
    427static irqreturn_t floppy_irq (int irq, void *dummy);
    428static void fd_error( void );
    429static int do_format(int drive, int type, struct atari_format_descr *desc);
    430static void do_fd_action( int drive );
    431static void fd_calibrate( void );
    432static void fd_calibrate_done( int status );
    433static void fd_seek( void );
    434static void fd_seek_done( int status );
    435static void fd_rwsec( void );
    436static void fd_readtrack_check(struct timer_list *unused);
    437static void fd_rwsec_done( int status );
    438static void fd_rwsec_done1(int status);
    439static void fd_writetrack( void );
    440static void fd_writetrack_done( int status );
    441static void fd_times_out(struct timer_list *unused);
    442static void finish_fdc( void );
    443static void finish_fdc_done( int dummy );
    444static void setup_req_params( int drive );
    445static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
    446                     cmd, unsigned long param);
    447static void fd_probe( int drive );
    448static int fd_test_drive_present( int drive );
    449static void config_types( void );
    450static int floppy_open(struct block_device *bdev, fmode_t mode);
    451static void floppy_release(struct gendisk *disk, fmode_t mode);
    452
    453/************************* End of Prototypes **************************/
    454
    455static DEFINE_TIMER(motor_off_timer, fd_motor_off_timer);
    456static DEFINE_TIMER(readtrack_timer, fd_readtrack_check);
    457static DEFINE_TIMER(timeout_timer, fd_times_out);
    458static DEFINE_TIMER(fd_timer, check_change);
    459	
    460static void fd_end_request_cur(blk_status_t err)
    461{
    462	DPRINT(("fd_end_request_cur(), bytes %d of %d\n",
    463		blk_rq_cur_bytes(fd_request),
    464		blk_rq_bytes(fd_request)));
    465
    466	if (!blk_update_request(fd_request, err,
    467				blk_rq_cur_bytes(fd_request))) {
    468		DPRINT(("calling __blk_mq_end_request()\n"));
    469		__blk_mq_end_request(fd_request, err);
    470		fd_request = NULL;
    471	} else {
    472		/* requeue rest of request */
    473		DPRINT(("calling blk_mq_requeue_request()\n"));
    474		blk_mq_requeue_request(fd_request, true);
    475		fd_request = NULL;
    476	}
    477}
    478
    479static inline void start_motor_off_timer(void)
    480{
    481	mod_timer(&motor_off_timer, jiffies + FD_MOTOR_OFF_DELAY);
    482	MotorOffTrys = 0;
    483}
    484
    485static inline void start_check_change_timer( void )
    486{
    487	mod_timer(&fd_timer, jiffies + CHECK_CHANGE_DELAY);
    488}
    489
    490static inline void start_timeout(void)
    491{
    492	mod_timer(&timeout_timer, jiffies + FLOPPY_TIMEOUT);
    493}
    494
    495static inline void stop_timeout(void)
    496{
    497	del_timer(&timeout_timer);
    498}
    499
    500/* Select the side to use. */
    501
    502static void fd_select_side( int side )
    503{
    504	unsigned long flags;
    505
    506	/* protect against various other ints mucking around with the PSG */
    507	local_irq_save(flags);
    508  
    509	sound_ym.rd_data_reg_sel = 14; /* Select PSG Port A */
    510	sound_ym.wd_data = (side == 0) ? sound_ym.rd_data_reg_sel | 0x01 :
    511	                                 sound_ym.rd_data_reg_sel & 0xfe;
    512
    513	local_irq_restore(flags);
    514}
    515
    516
    517/* Select a drive, update the FDC's track register and set the correct
    518 * clock speed for this disk's type.
    519 */
    520
    521static void fd_select_drive( int drive )
    522{
    523	unsigned long flags;
    524	unsigned char tmp;
    525  
    526	if (drive == SelectedDrive)
    527	  return;
    528
    529	/* protect against various other ints mucking around with the PSG */
    530	local_irq_save(flags);
    531	sound_ym.rd_data_reg_sel = 14; /* Select PSG Port A */
    532	tmp = sound_ym.rd_data_reg_sel;
    533	sound_ym.wd_data = (tmp | DSKDRVNONE) & ~(drive == 0 ? DSKDRV0 : DSKDRV1);
    534	atari_dont_touch_floppy_select = 1;
    535	local_irq_restore(flags);
    536
    537	/* restore track register to saved value */
    538	FDC_WRITE( FDCREG_TRACK, UD.track );
    539	udelay(25);
    540
    541	/* select 8/16 MHz */
    542	if (UDT)
    543		if (ATARIHW_PRESENT(FDCSPEED))
    544			dma_wd.fdc_speed = UDT->fdc_speed;
    545	
    546	SelectedDrive = drive;
    547}
    548
    549
    550/* Deselect both drives. */
    551
    552static void fd_deselect( void )
    553{
    554	unsigned long flags;
    555
    556	/* protect against various other ints mucking around with the PSG */
    557	local_irq_save(flags);
    558	atari_dont_touch_floppy_select = 0;
    559	sound_ym.rd_data_reg_sel=14;	/* Select PSG Port A */
    560	sound_ym.wd_data = (sound_ym.rd_data_reg_sel |
    561			    (MACH_IS_FALCON ? 3 : 7)); /* no drives selected */
    562	/* On Falcon, the drive B select line is used on the printer port, so
    563	 * leave it alone... */
    564	SelectedDrive = -1;
    565	local_irq_restore(flags);
    566}
    567
    568
    569/* This timer function deselects the drives when the FDC switched the
    570 * motor off. The deselection cannot happen earlier because the FDC
    571 * counts the index signals, which arrive only if one drive is selected.
    572 */
    573
    574static void fd_motor_off_timer(struct timer_list *unused)
    575{
    576	unsigned char status;
    577
    578	if (SelectedDrive < 0)
    579		/* no drive selected, needn't deselect anyone */
    580		return;
    581
    582	if (stdma_islocked())
    583		goto retry;
    584
    585	status = FDC_READ( FDCREG_STATUS );
    586
    587	if (!(status & 0x80)) {
    588		/* motor already turned off by FDC -> deselect drives */
    589		MotorOn = 0;
    590		fd_deselect();
    591		return;
    592	}
    593	/* not yet off, try again */
    594
    595  retry:
    596	/* Test again later; if tested too often, it seems there is no disk
    597	 * in the drive and the FDC will leave the motor on forever (or,
    598	 * at least until a disk is inserted). So we'll test only twice
    599	 * per second from then on...
    600	 */
    601	mod_timer(&motor_off_timer,
    602		  jiffies + (MotorOffTrys++ < FD_MOTOR_OFF_MAXTRY ? HZ/20 : HZ/2));
    603}
    604
    605
    606/* This function is repeatedly called to detect disk changes (as good
    607 * as possible) and keep track of the current state of the write protection.
    608 */
    609
    610static void check_change(struct timer_list *unused)
    611{
    612	static int    drive = 0;
    613
    614	unsigned long flags;
    615	unsigned char old_porta;
    616	int			  stat;
    617
    618	if (++drive > 1 || !UD.connected)
    619		drive = 0;
    620
    621	/* protect against various other ints mucking around with the PSG */
    622	local_irq_save(flags);
    623
    624	if (!stdma_islocked()) {
    625		sound_ym.rd_data_reg_sel = 14;
    626		old_porta = sound_ym.rd_data_reg_sel;
    627		sound_ym.wd_data = (old_porta | DSKDRVNONE) &
    628			               ~(drive == 0 ? DSKDRV0 : DSKDRV1);
    629		stat = !!(FDC_READ( FDCREG_STATUS ) & FDCSTAT_WPROT);
    630		sound_ym.wd_data = old_porta;
    631
    632		if (stat != UD.wpstat) {
    633			DPRINT(( "wpstat[%d] = %d\n", drive, stat ));
    634			UD.wpstat = stat;
    635			set_bit (drive, &changed_floppies);
    636		}
    637	}
    638	local_irq_restore(flags);
    639
    640	start_check_change_timer();
    641}
    642
    643 
    644/* Handling of the Head Settling Flag: This flag should be set after each
    645 * seek operation, because we don't use seeks with verify.
    646 */
    647
    648static inline void set_head_settle_flag(void)
    649{
    650	HeadSettleFlag = FDCCMDADD_E;
    651}
    652
    653static inline int get_head_settle_flag(void)
    654{
    655	int	tmp = HeadSettleFlag;
    656	HeadSettleFlag = 0;
    657	return( tmp );
    658}
    659
    660static inline void copy_buffer(void *from, void *to)
    661{
    662	ulong *p1 = (ulong *)from, *p2 = (ulong *)to;
    663	int cnt;
    664
    665	for (cnt = 512/4; cnt; cnt--)
    666		*p2++ = *p1++;
    667}
    668
    669/* General Interrupt Handling */
    670
    671static void (*FloppyIRQHandler)( int status ) = NULL;
    672
    673static irqreturn_t floppy_irq (int irq, void *dummy)
    674{
    675	unsigned char status;
    676	void (*handler)( int );
    677
    678	handler = xchg(&FloppyIRQHandler, NULL);
    679
    680	if (handler) {
    681		nop();
    682		status = FDC_READ( FDCREG_STATUS );
    683		DPRINT(("FDC irq, status = %02x handler = %08lx\n",status,(unsigned long)handler));
    684		handler( status );
    685	}
    686	else {
    687		DPRINT(("FDC irq, no handler\n"));
    688	}
    689	return IRQ_HANDLED;
    690}
    691
    692
    693/* Error handling: If some error happened, retry some times, then
    694 * recalibrate, then try again, and fail after MAX_ERRORS.
    695 */
    696
    697static void fd_error( void )
    698{
    699	if (IsFormatting) {
    700		IsFormatting = 0;
    701		FormatError = 1;
    702		complete(&format_wait);
    703		return;
    704	}
    705
    706	if (!fd_request)
    707		return;
    708
    709	unit[SelectedDrive].error_count++;
    710	if (unit[SelectedDrive].error_count >= MAX_ERRORS) {
    711		printk(KERN_ERR "fd%d: too many errors.\n", SelectedDrive );
    712		fd_end_request_cur(BLK_STS_IOERR);
    713		finish_fdc();
    714		return;
    715	}
    716	else if (unit[SelectedDrive].error_count == RECALIBRATE_ERRORS) {
    717		printk(KERN_WARNING "fd%d: recalibrating\n", SelectedDrive );
    718		if (SelectedDrive != -1)
    719			SUD.track = -1;
    720	}
    721	/* need to re-run request to recalibrate */
    722	atari_disable_irq( IRQ_MFP_FDC );
    723
    724	setup_req_params( SelectedDrive );
    725	do_fd_action( SelectedDrive );
    726
    727	atari_enable_irq( IRQ_MFP_FDC );
    728}
    729
    730
    731
    732#define	SET_IRQ_HANDLER(proc) do { FloppyIRQHandler = (proc); } while(0)
    733
    734
    735/* ---------- Formatting ---------- */
    736
    737#define FILL(n,val)		\
    738    do {			\
    739	memset( p, val, n );	\
    740	p += n;			\
    741    } while(0)
    742
    743static int do_format(int drive, int type, struct atari_format_descr *desc)
    744{
    745	struct request_queue *q;
    746	unsigned char	*p;
    747	int sect, nsect;
    748	unsigned long	flags;
    749	int ret;
    750
    751	if (type) {
    752		type--;
    753		if (type >= NUM_DISK_MINORS ||
    754		    minor2disktype[type].drive_types > DriveType) {
    755			finish_fdc();
    756			return -EINVAL;
    757		}
    758	}
    759
    760	q = unit[drive].disk[type]->queue;
    761	blk_mq_freeze_queue(q);
    762	blk_mq_quiesce_queue(q);
    763
    764	local_irq_save(flags);
    765	stdma_lock(floppy_irq, NULL);
    766	atari_turnon_irq( IRQ_MFP_FDC ); /* should be already, just to be sure */
    767	local_irq_restore(flags);
    768
    769	if (type) {
    770		type = minor2disktype[type].index;
    771		UDT = &atari_disk_type[type];
    772	}
    773
    774	if (!UDT || desc->track >= UDT->blocks/UDT->spt/2 || desc->head >= 2) {
    775		finish_fdc();
    776		ret = -EINVAL;
    777		goto out;
    778	}
    779
    780	nsect = UDT->spt;
    781	p = TrackBuffer;
    782	/* The track buffer is used for the raw track data, so its
    783	   contents become invalid! */
    784	BufferDrive = -1;
    785	/* stop deselect timer */
    786	del_timer( &motor_off_timer );
    787
    788	FILL( 60 * (nsect / 9), 0x4e );
    789	for( sect = 0; sect < nsect; ++sect ) {
    790		FILL( 12, 0 );
    791		FILL( 3, 0xf5 );
    792		*p++ = 0xfe;
    793		*p++ = desc->track;
    794		*p++ = desc->head;
    795		*p++ = (nsect + sect - desc->sect_offset) % nsect + 1;
    796		*p++ = 2;
    797		*p++ = 0xf7;
    798		FILL( 22, 0x4e );
    799		FILL( 12, 0 );
    800		FILL( 3, 0xf5 );
    801		*p++ = 0xfb;
    802		FILL( 512, 0xe5 );
    803		*p++ = 0xf7;
    804		FILL( 40, 0x4e );
    805	}
    806	FILL( TrackBuffer+BUFFER_SIZE-p, 0x4e );
    807
    808	IsFormatting = 1;
    809	FormatError = 0;
    810	ReqTrack = desc->track;
    811	ReqSide  = desc->head;
    812	do_fd_action( drive );
    813
    814	wait_for_completion(&format_wait);
    815
    816	finish_fdc();
    817	ret = FormatError ? -EIO : 0;
    818out:
    819	blk_mq_unquiesce_queue(q);
    820	blk_mq_unfreeze_queue(q);
    821	return ret;
    822}
    823
    824
    825/* do_fd_action() is the general procedure for a fd request: All
    826 * required parameter settings (drive select, side select, track
    827 * position) are checked and set if needed. For each of these
    828 * parameters and the actual reading or writing exist two functions:
    829 * one that starts the setting (or skips it if possible) and one
    830 * callback for the "done" interrupt. Each done func calls the next
    831 * set function to propagate the request down to fd_rwsec_done().
    832 */
    833
    834static void do_fd_action( int drive )
    835{
    836	DPRINT(("do_fd_action\n"));
    837	
    838	if (UseTrackbuffer && !IsFormatting) {
    839	repeat:
    840	    if (IS_BUFFERED( drive, ReqSide, ReqTrack )) {
    841		if (ReqCmd == READ) {
    842		    copy_buffer( SECTOR_BUFFER(ReqSector), ReqData );
    843		    if (++ReqCnt < blk_rq_cur_sectors(fd_request)) {
    844			/* read next sector */
    845			setup_req_params( drive );
    846			goto repeat;
    847		    }
    848		    else {
    849			/* all sectors finished */
    850			fd_end_request_cur(BLK_STS_OK);
    851			finish_fdc();
    852			return;
    853		    }
    854		}
    855		else {
    856		    /* cmd == WRITE, pay attention to track buffer
    857		     * consistency! */
    858		    copy_buffer( ReqData, SECTOR_BUFFER(ReqSector) );
    859		}
    860	    }
    861	}
    862
    863	if (SelectedDrive != drive)
    864		fd_select_drive( drive );
    865    
    866	if (UD.track == -1)
    867		fd_calibrate();
    868	else if (UD.track != ReqTrack << UDT->stretch)
    869		fd_seek();
    870	else if (IsFormatting)
    871		fd_writetrack();
    872	else
    873		fd_rwsec();
    874}
    875
    876
    877/* Seek to track 0 if the current track is unknown */
    878
    879static void fd_calibrate( void )
    880{
    881	if (SUD.track >= 0) {
    882		fd_calibrate_done( 0 );
    883		return;
    884	}
    885
    886	if (ATARIHW_PRESENT(FDCSPEED))
    887		dma_wd.fdc_speed = 0;   /* always seek with 8 Mhz */
    888	DPRINT(("fd_calibrate\n"));
    889	SET_IRQ_HANDLER( fd_calibrate_done );
    890	/* we can't verify, since the speed may be incorrect */
    891	FDC_WRITE( FDCREG_CMD, FDCCMD_RESTORE | SUD.steprate );
    892
    893	NeedSeek = 1;
    894	MotorOn = 1;
    895	start_timeout();
    896	/* wait for IRQ */
    897}
    898
    899
    900static void fd_calibrate_done( int status )
    901{
    902	DPRINT(("fd_calibrate_done()\n"));
    903	stop_timeout();
    904    
    905	/* set the correct speed now */
    906	if (ATARIHW_PRESENT(FDCSPEED))
    907		dma_wd.fdc_speed = SUDT->fdc_speed;
    908	if (status & FDCSTAT_RECNF) {
    909		printk(KERN_ERR "fd%d: restore failed\n", SelectedDrive );
    910		fd_error();
    911	}
    912	else {
    913		SUD.track = 0;
    914		fd_seek();
    915	}
    916}
    917  
    918  
    919/* Seek the drive to the requested track. The drive must have been
    920 * calibrated at some point before this.
    921 */
    922  
    923static void fd_seek( void )
    924{
    925	if (SUD.track == ReqTrack << SUDT->stretch) {
    926		fd_seek_done( 0 );
    927		return;
    928	}
    929
    930	if (ATARIHW_PRESENT(FDCSPEED)) {
    931		dma_wd.fdc_speed = 0;	/* always seek witch 8 Mhz */
    932		MFPDELAY();
    933	}
    934
    935	DPRINT(("fd_seek() to track %d\n",ReqTrack));
    936	FDC_WRITE( FDCREG_DATA, ReqTrack << SUDT->stretch);
    937	udelay(25);
    938	SET_IRQ_HANDLER( fd_seek_done );
    939	FDC_WRITE( FDCREG_CMD, FDCCMD_SEEK | SUD.steprate );
    940
    941	MotorOn = 1;
    942	set_head_settle_flag();
    943	start_timeout();
    944	/* wait for IRQ */
    945}
    946
    947
    948static void fd_seek_done( int status )
    949{
    950	DPRINT(("fd_seek_done()\n"));
    951	stop_timeout();
    952	
    953	/* set the correct speed */
    954	if (ATARIHW_PRESENT(FDCSPEED))
    955		dma_wd.fdc_speed = SUDT->fdc_speed;
    956	if (status & FDCSTAT_RECNF) {
    957		printk(KERN_ERR "fd%d: seek error (to track %d)\n",
    958				SelectedDrive, ReqTrack );
    959		/* we don't know exactly which track we are on now! */
    960		SUD.track = -1;
    961		fd_error();
    962	}
    963	else {
    964		SUD.track = ReqTrack << SUDT->stretch;
    965		NeedSeek = 0;
    966		if (IsFormatting)
    967			fd_writetrack();
    968		else
    969			fd_rwsec();
    970	}
    971}
    972
    973
    974/* This does the actual reading/writing after positioning the head
    975 * over the correct track.
    976 */
    977
    978static int MultReadInProgress = 0;
    979
    980
    981static void fd_rwsec( void )
    982{
    983	unsigned long paddr, flags;
    984	unsigned int  rwflag, old_motoron;
    985	unsigned int track;
    986	
    987	DPRINT(("fd_rwsec(), Sec=%d, Access=%c\n",ReqSector, ReqCmd == WRITE ? 'w' : 'r' ));
    988	if (ReqCmd == WRITE) {
    989		if (ATARIHW_PRESENT(EXTD_DMA)) {
    990			paddr = virt_to_phys(ReqData);
    991		}
    992		else {
    993			copy_buffer( ReqData, DMABuffer );
    994			paddr = PhysDMABuffer;
    995		}
    996		dma_cache_maintenance( paddr, 512, 1 );
    997		rwflag = 0x100;
    998	}
    999	else {
   1000		if (read_track)
   1001			paddr = PhysTrackBuffer;
   1002		else
   1003			paddr = ATARIHW_PRESENT(EXTD_DMA) ? 
   1004				virt_to_phys(ReqData) : PhysDMABuffer;
   1005		rwflag = 0;
   1006	}
   1007
   1008	fd_select_side( ReqSide );
   1009  
   1010	/* Start sector of this operation */
   1011	FDC_WRITE( FDCREG_SECTOR, read_track ? 1 : ReqSector );
   1012	MFPDELAY();
   1013	/* Cheat for track if stretch != 0 */
   1014	if (SUDT->stretch) {
   1015		track = FDC_READ( FDCREG_TRACK);
   1016		MFPDELAY();
   1017		FDC_WRITE( FDCREG_TRACK, track >> SUDT->stretch);
   1018	}
   1019	udelay(25);
   1020  
   1021	/* Setup DMA */
   1022	local_irq_save(flags);
   1023	dma_wd.dma_lo = (unsigned char)paddr;
   1024	MFPDELAY();
   1025	paddr >>= 8;
   1026	dma_wd.dma_md = (unsigned char)paddr;
   1027	MFPDELAY();
   1028	paddr >>= 8;
   1029	if (ATARIHW_PRESENT(EXTD_DMA))
   1030		st_dma_ext_dmahi = (unsigned short)paddr;
   1031	else
   1032		dma_wd.dma_hi = (unsigned char)paddr;
   1033	MFPDELAY();
   1034	local_irq_restore(flags);
   1035  
   1036	/* Clear FIFO and switch DMA to correct mode */  
   1037	dma_wd.dma_mode_status = 0x90 | rwflag;  
   1038	MFPDELAY();
   1039	dma_wd.dma_mode_status = 0x90 | (rwflag ^ 0x100);  
   1040	MFPDELAY();
   1041	dma_wd.dma_mode_status = 0x90 | rwflag;
   1042	MFPDELAY();
   1043  
   1044	/* How many sectors for DMA */
   1045	dma_wd.fdc_acces_seccount = read_track ? SUDT->spt : 1;
   1046  
   1047	udelay(25);  
   1048  
   1049	/* Start operation */
   1050	dma_wd.dma_mode_status = FDCSELREG_STP | rwflag;
   1051	udelay(25);
   1052	SET_IRQ_HANDLER( fd_rwsec_done );
   1053	dma_wd.fdc_acces_seccount =
   1054	  (get_head_settle_flag() |
   1055	   (rwflag ? FDCCMD_WRSEC : (FDCCMD_RDSEC | (read_track ? FDCCMDADD_M : 0))));
   1056
   1057	old_motoron = MotorOn;
   1058	MotorOn = 1;
   1059	NeedSeek = 1;
   1060	/* wait for interrupt */
   1061
   1062	if (read_track) {
   1063		/* If reading a whole track, wait about one disk rotation and
   1064		 * then check if all sectors are read. The FDC will even
   1065		 * search for the first non-existent sector and need 1 sec to
   1066		 * recognise that it isn't present :-(
   1067		 */
   1068		MultReadInProgress = 1;
   1069		mod_timer(&readtrack_timer,
   1070			  /* 1 rot. + 5 rot.s if motor was off  */
   1071			  jiffies + HZ/5 + (old_motoron ? 0 : HZ));
   1072	}
   1073	start_timeout();
   1074}
   1075
   1076    
   1077static void fd_readtrack_check(struct timer_list *unused)
   1078{
   1079	unsigned long flags, addr, addr2;
   1080
   1081	local_irq_save(flags);
   1082
   1083	if (!MultReadInProgress) {
   1084		/* This prevents a race condition that could arise if the
   1085		 * interrupt is triggered while the calling of this timer
   1086		 * callback function takes place. The IRQ function then has
   1087		 * already cleared 'MultReadInProgress'  when flow of control
   1088		 * gets here.
   1089		 */
   1090		local_irq_restore(flags);
   1091		return;
   1092	}
   1093
   1094	/* get the current DMA address */
   1095	/* ++ f.a. read twice to avoid being fooled by switcher */
   1096	addr = 0;
   1097	do {
   1098		addr2 = addr;
   1099		addr = dma_wd.dma_lo & 0xff;
   1100		MFPDELAY();
   1101		addr |= (dma_wd.dma_md & 0xff) << 8;
   1102		MFPDELAY();
   1103		if (ATARIHW_PRESENT( EXTD_DMA ))
   1104			addr |= (st_dma_ext_dmahi & 0xffff) << 16;
   1105		else
   1106			addr |= (dma_wd.dma_hi & 0xff) << 16;
   1107		MFPDELAY();
   1108	} while(addr != addr2);
   1109  
   1110	if (addr >= PhysTrackBuffer + SUDT->spt*512) {
   1111		/* already read enough data, force an FDC interrupt to stop
   1112		 * the read operation
   1113		 */
   1114		SET_IRQ_HANDLER( NULL );
   1115		MultReadInProgress = 0;
   1116		local_irq_restore(flags);
   1117		DPRINT(("fd_readtrack_check(): done\n"));
   1118		FDC_WRITE( FDCREG_CMD, FDCCMD_FORCI );
   1119		udelay(25);
   1120
   1121		/* No error until now -- the FDC would have interrupted
   1122		 * otherwise!
   1123		 */
   1124		fd_rwsec_done1(0);
   1125	}
   1126	else {
   1127		/* not yet finished, wait another tenth rotation */
   1128		local_irq_restore(flags);
   1129		DPRINT(("fd_readtrack_check(): not yet finished\n"));
   1130		mod_timer(&readtrack_timer, jiffies + HZ/5/10);
   1131	}
   1132}
   1133
   1134
   1135static void fd_rwsec_done( int status )
   1136{
   1137	DPRINT(("fd_rwsec_done()\n"));
   1138
   1139	if (read_track) {
   1140		del_timer(&readtrack_timer);
   1141		if (!MultReadInProgress)
   1142			return;
   1143		MultReadInProgress = 0;
   1144	}
   1145	fd_rwsec_done1(status);
   1146}
   1147
   1148static void fd_rwsec_done1(int status)
   1149{
   1150	unsigned int track;
   1151
   1152	stop_timeout();
   1153	
   1154	/* Correct the track if stretch != 0 */
   1155	if (SUDT->stretch) {
   1156		track = FDC_READ( FDCREG_TRACK);
   1157		MFPDELAY();
   1158		FDC_WRITE( FDCREG_TRACK, track << SUDT->stretch);
   1159	}
   1160
   1161	if (!UseTrackbuffer) {
   1162		dma_wd.dma_mode_status = 0x90;
   1163		MFPDELAY();
   1164		if (!(dma_wd.dma_mode_status & 0x01)) {
   1165			printk(KERN_ERR "fd%d: DMA error\n", SelectedDrive );
   1166			goto err_end;
   1167		}
   1168	}
   1169	MFPDELAY();
   1170
   1171	if (ReqCmd == WRITE && (status & FDCSTAT_WPROT)) {
   1172		printk(KERN_NOTICE "fd%d: is write protected\n", SelectedDrive );
   1173		goto err_end;
   1174	}	
   1175	if ((status & FDCSTAT_RECNF) &&
   1176	    /* RECNF is no error after a multiple read when the FDC
   1177	       searched for a non-existent sector! */
   1178	    !(read_track && FDC_READ(FDCREG_SECTOR) > SUDT->spt)) {
   1179		if (Probing) {
   1180			if (SUDT > atari_disk_type) {
   1181			    if (SUDT[-1].blocks > ReqBlock) {
   1182				/* try another disk type */
   1183				SUDT--;
   1184				set_capacity(unit[SelectedDrive].disk[0],
   1185							SUDT->blocks);
   1186			    } else
   1187				Probing = 0;
   1188			}
   1189			else {
   1190				if (SUD.flags & FTD_MSG)
   1191					printk(KERN_INFO "fd%d: Auto-detected floppy type %s\n",
   1192					       SelectedDrive, SUDT->name );
   1193				Probing=0;
   1194			}
   1195		} else {	
   1196/* record not found, but not probing. Maybe stretch wrong ? Restart probing */
   1197			if (SUD.autoprobe) {
   1198				SUDT = atari_disk_type + StartDiskType[DriveType];
   1199				set_capacity(unit[SelectedDrive].disk[0],
   1200							SUDT->blocks);
   1201				Probing = 1;
   1202			}
   1203		}
   1204		if (Probing) {
   1205			if (ATARIHW_PRESENT(FDCSPEED)) {
   1206				dma_wd.fdc_speed = SUDT->fdc_speed;
   1207				MFPDELAY();
   1208			}
   1209			setup_req_params( SelectedDrive );
   1210			BufferDrive = -1;
   1211			do_fd_action( SelectedDrive );
   1212			return;
   1213		}
   1214
   1215		printk(KERN_ERR "fd%d: sector %d not found (side %d, track %d)\n",
   1216		       SelectedDrive, FDC_READ (FDCREG_SECTOR), ReqSide, ReqTrack );
   1217		goto err_end;
   1218	}
   1219	if (status & FDCSTAT_CRC) {
   1220		printk(KERN_ERR "fd%d: CRC error (side %d, track %d, sector %d)\n",
   1221		       SelectedDrive, ReqSide, ReqTrack, FDC_READ (FDCREG_SECTOR) );
   1222		goto err_end;
   1223	}
   1224	if (status & FDCSTAT_LOST) {
   1225		printk(KERN_ERR "fd%d: lost data (side %d, track %d, sector %d)\n",
   1226		       SelectedDrive, ReqSide, ReqTrack, FDC_READ (FDCREG_SECTOR) );
   1227		goto err_end;
   1228	}
   1229
   1230	Probing = 0;
   1231	
   1232	if (ReqCmd == READ) {
   1233		if (!read_track) {
   1234			void *addr;
   1235			addr = ATARIHW_PRESENT( EXTD_DMA ) ? ReqData : DMABuffer;
   1236			dma_cache_maintenance( virt_to_phys(addr), 512, 0 );
   1237			if (!ATARIHW_PRESENT( EXTD_DMA ))
   1238				copy_buffer (addr, ReqData);
   1239		} else {
   1240			dma_cache_maintenance( PhysTrackBuffer, MaxSectors[DriveType] * 512, 0 );
   1241			BufferDrive = SelectedDrive;
   1242			BufferSide  = ReqSide;
   1243			BufferTrack = ReqTrack;
   1244			copy_buffer (SECTOR_BUFFER (ReqSector), ReqData);
   1245		}
   1246	}
   1247  
   1248	if (++ReqCnt < blk_rq_cur_sectors(fd_request)) {
   1249		/* read next sector */
   1250		setup_req_params( SelectedDrive );
   1251		do_fd_action( SelectedDrive );
   1252	}
   1253	else {
   1254		/* all sectors finished */
   1255		fd_end_request_cur(BLK_STS_OK);
   1256		finish_fdc();
   1257	}
   1258	return;
   1259  
   1260  err_end:
   1261	BufferDrive = -1;
   1262	fd_error();
   1263}
   1264
   1265
   1266static void fd_writetrack( void )
   1267{
   1268	unsigned long paddr, flags;
   1269	unsigned int track;
   1270	
   1271	DPRINT(("fd_writetrack() Tr=%d Si=%d\n", ReqTrack, ReqSide ));
   1272
   1273	paddr = PhysTrackBuffer;
   1274	dma_cache_maintenance( paddr, BUFFER_SIZE, 1 );
   1275
   1276	fd_select_side( ReqSide );
   1277  
   1278	/* Cheat for track if stretch != 0 */
   1279	if (SUDT->stretch) {
   1280		track = FDC_READ( FDCREG_TRACK);
   1281		MFPDELAY();
   1282		FDC_WRITE(FDCREG_TRACK,track >> SUDT->stretch);
   1283	}
   1284	udelay(40);
   1285  
   1286	/* Setup DMA */
   1287	local_irq_save(flags);
   1288	dma_wd.dma_lo = (unsigned char)paddr;
   1289	MFPDELAY();
   1290	paddr >>= 8;
   1291	dma_wd.dma_md = (unsigned char)paddr;
   1292	MFPDELAY();
   1293	paddr >>= 8;
   1294	if (ATARIHW_PRESENT( EXTD_DMA ))
   1295		st_dma_ext_dmahi = (unsigned short)paddr;
   1296	else
   1297		dma_wd.dma_hi = (unsigned char)paddr;
   1298	MFPDELAY();
   1299	local_irq_restore(flags);
   1300  
   1301	/* Clear FIFO and switch DMA to correct mode */  
   1302	dma_wd.dma_mode_status = 0x190;  
   1303	MFPDELAY();
   1304	dma_wd.dma_mode_status = 0x90;  
   1305	MFPDELAY();
   1306	dma_wd.dma_mode_status = 0x190;
   1307	MFPDELAY();
   1308  
   1309	/* How many sectors for DMA */
   1310	dma_wd.fdc_acces_seccount = BUFFER_SIZE/512;
   1311	udelay(40);  
   1312  
   1313	/* Start operation */
   1314	dma_wd.dma_mode_status = FDCSELREG_STP | 0x100;
   1315	udelay(40);
   1316	SET_IRQ_HANDLER( fd_writetrack_done );
   1317	dma_wd.fdc_acces_seccount = FDCCMD_WRTRA | get_head_settle_flag(); 
   1318
   1319	MotorOn = 1;
   1320	start_timeout();
   1321	/* wait for interrupt */
   1322}
   1323
   1324
   1325static void fd_writetrack_done( int status )
   1326{
   1327	DPRINT(("fd_writetrack_done()\n"));
   1328
   1329	stop_timeout();
   1330
   1331	if (status & FDCSTAT_WPROT) {
   1332		printk(KERN_NOTICE "fd%d: is write protected\n", SelectedDrive );
   1333		goto err_end;
   1334	}	
   1335	if (status & FDCSTAT_LOST) {
   1336		printk(KERN_ERR "fd%d: lost data (side %d, track %d)\n",
   1337				SelectedDrive, ReqSide, ReqTrack );
   1338		goto err_end;
   1339	}
   1340
   1341	complete(&format_wait);
   1342	return;
   1343
   1344  err_end:
   1345	fd_error();
   1346}
   1347
   1348static void fd_times_out(struct timer_list *unused)
   1349{
   1350	atari_disable_irq( IRQ_MFP_FDC );
   1351	if (!FloppyIRQHandler) goto end; /* int occurred after timer was fired, but
   1352					  * before we came here... */
   1353
   1354	SET_IRQ_HANDLER( NULL );
   1355	/* If the timeout occurred while the readtrack_check timer was
   1356	 * active, we need to cancel it, else bad things will happen */
   1357	if (UseTrackbuffer)
   1358		del_timer( &readtrack_timer );
   1359	FDC_WRITE( FDCREG_CMD, FDCCMD_FORCI );
   1360	udelay( 25 );
   1361	
   1362	printk(KERN_ERR "floppy timeout\n" );
   1363	fd_error();
   1364  end:
   1365	atari_enable_irq( IRQ_MFP_FDC );
   1366}
   1367
   1368
   1369/* The (noop) seek operation here is needed to make the WP bit in the
   1370 * FDC status register accessible for check_change. If the last disk
   1371 * operation would have been a RDSEC, this bit would always read as 0
   1372 * no matter what :-( To save time, the seek goes to the track we're
   1373 * already on.
   1374 */
   1375
   1376static void finish_fdc( void )
   1377{
   1378	if (!NeedSeek || !stdma_is_locked_by(floppy_irq)) {
   1379		finish_fdc_done( 0 );
   1380	}
   1381	else {
   1382		DPRINT(("finish_fdc: dummy seek started\n"));
   1383		FDC_WRITE (FDCREG_DATA, SUD.track);
   1384		SET_IRQ_HANDLER( finish_fdc_done );
   1385		FDC_WRITE (FDCREG_CMD, FDCCMD_SEEK);
   1386		MotorOn = 1;
   1387		start_timeout();
   1388		/* we must wait for the IRQ here, because the ST-DMA
   1389		   is released immediately afterwards and the interrupt
   1390		   may be delivered to the wrong driver. */
   1391	  }
   1392}
   1393
   1394
   1395static void finish_fdc_done( int dummy )
   1396{
   1397	unsigned long flags;
   1398
   1399	DPRINT(("finish_fdc_done entered\n"));
   1400	stop_timeout();
   1401	NeedSeek = 0;
   1402
   1403	if (timer_pending(&fd_timer) && time_before(fd_timer.expires, jiffies + 5))
   1404		/* If the check for a disk change is done too early after this
   1405		 * last seek command, the WP bit still reads wrong :-((
   1406		 */
   1407		mod_timer(&fd_timer, jiffies + 5);
   1408	else
   1409		start_check_change_timer();
   1410	start_motor_off_timer();
   1411
   1412	local_irq_save(flags);
   1413	if (stdma_is_locked_by(floppy_irq))
   1414		stdma_release();
   1415	local_irq_restore(flags);
   1416
   1417	DPRINT(("finish_fdc() finished\n"));
   1418}
   1419
   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
   1422 * hardware, one has to rely on the "Write Protect". This works fine,
   1423 * as long as no write protected disks are used. TOS solves this
   1424 * problem by introducing tri-state logic ("maybe changed") and
   1425 * looking at the serial number in block 0. This isn't possible for
   1426 * Linux, since the floppy driver can't make assumptions about the
   1427 * filesystem used on the disk and thus the contents of block 0. I've
   1428 * chosen the method to always say "The disk was changed" if it is
   1429 * unsure whether it was. This implies that every open or mount
   1430 * invalidates the disk buffers if you work with write protected
   1431 * disks. But at least this is better than working with incorrect data
   1432 * due to unrecognised disk changes.
   1433 */
   1434
   1435static unsigned int floppy_check_events(struct gendisk *disk,
   1436					unsigned int clearing)
   1437{
   1438	struct atari_floppy_struct *p = disk->private_data;
   1439	unsigned int drive = p - unit;
   1440	if (test_bit (drive, &fake_change)) {
   1441		/* simulated change (e.g. after formatting) */
   1442		return DISK_EVENT_MEDIA_CHANGE;
   1443	}
   1444	if (test_bit (drive, &changed_floppies)) {
   1445		/* surely changed (the WP signal changed at least once) */
   1446		return DISK_EVENT_MEDIA_CHANGE;
   1447	}
   1448	if (UD.wpstat) {
   1449		/* WP is on -> could be changed: to be sure, buffers should be
   1450		 * invalidated...
   1451		 */
   1452		return DISK_EVENT_MEDIA_CHANGE;
   1453	}
   1454
   1455	return 0;
   1456}
   1457
   1458static int floppy_revalidate(struct gendisk *disk)
   1459{
   1460	struct atari_floppy_struct *p = disk->private_data;
   1461	unsigned int drive = p - unit;
   1462
   1463	if (test_bit(drive, &changed_floppies) ||
   1464	    test_bit(drive, &fake_change) || !p->disktype) {
   1465		if (UD.flags & FTD_MSG)
   1466			printk(KERN_ERR "floppy: clear format %p!\n", UDT);
   1467		BufferDrive = -1;
   1468		clear_bit(drive, &fake_change);
   1469		clear_bit(drive, &changed_floppies);
   1470		/* MSch: clearing geometry makes sense only for autoprobe
   1471		   formats, for 'permanent user-defined' parameter:
   1472		   restore default_params[] here if flagged valid! */
   1473		if (default_params[drive].blocks == 0)
   1474			UDT = NULL;
   1475		else
   1476			UDT = &default_params[drive];
   1477	}
   1478	return 0;
   1479}
   1480
   1481
   1482/* This sets up the global variables describing the current request. */
   1483
   1484static void setup_req_params( int drive )
   1485{
   1486	int block = ReqBlock + ReqCnt;
   1487
   1488	ReqTrack = block / UDT->spt;
   1489	ReqSector = block - ReqTrack * UDT->spt + 1;
   1490	ReqSide = ReqTrack & 1;
   1491	ReqTrack >>= 1;
   1492	ReqData = ReqBuffer + 512 * ReqCnt;
   1493
   1494	if (UseTrackbuffer)
   1495		read_track = (ReqCmd == READ && unit[drive].error_count == 0);
   1496	else
   1497		read_track = 0;
   1498
   1499	DPRINT(("Request params: Si=%d Tr=%d Se=%d Data=%08lx\n",ReqSide,
   1500			ReqTrack, ReqSector, (unsigned long)ReqData ));
   1501}
   1502
   1503static blk_status_t ataflop_queue_rq(struct blk_mq_hw_ctx *hctx,
   1504				     const struct blk_mq_queue_data *bd)
   1505{
   1506	struct atari_floppy_struct *floppy = bd->rq->q->disk->private_data;
   1507	int drive = floppy - unit;
   1508	int type = floppy->type;
   1509
   1510	DPRINT(("Queue request: drive %d type %d sectors %d of %d last %d\n",
   1511		drive, type, blk_rq_cur_sectors(bd->rq),
   1512		blk_rq_sectors(bd->rq), bd->last));
   1513
   1514	spin_lock_irq(&ataflop_lock);
   1515	if (fd_request) {
   1516		spin_unlock_irq(&ataflop_lock);
   1517		return BLK_STS_DEV_RESOURCE;
   1518	}
   1519	if (!stdma_try_lock(floppy_irq, NULL))  {
   1520		spin_unlock_irq(&ataflop_lock);
   1521		return BLK_STS_RESOURCE;
   1522	}
   1523	fd_request = bd->rq;
   1524	unit[drive].error_count = 0;
   1525	blk_mq_start_request(fd_request);
   1526
   1527	atari_disable_irq( IRQ_MFP_FDC );
   1528
   1529	IsFormatting = 0;
   1530
   1531	if (!UD.connected) {
   1532		/* drive not connected */
   1533		printk(KERN_ERR "Unknown Device: fd%d\n", drive );
   1534		fd_end_request_cur(BLK_STS_IOERR);
   1535		stdma_release();
   1536		goto out;
   1537	}
   1538		
   1539	if (type == 0) {
   1540		if (!UDT) {
   1541			Probing = 1;
   1542			UDT = atari_disk_type + StartDiskType[DriveType];
   1543			set_capacity(bd->rq->q->disk, UDT->blocks);
   1544			UD.autoprobe = 1;
   1545		}
   1546	} 
   1547	else {
   1548		/* user supplied disk type */
   1549		if (--type >= NUM_DISK_MINORS) {
   1550			printk(KERN_WARNING "fd%d: invalid disk format", drive );
   1551			fd_end_request_cur(BLK_STS_IOERR);
   1552			stdma_release();
   1553			goto out;
   1554		}
   1555		if (minor2disktype[type].drive_types > DriveType)  {
   1556			printk(KERN_WARNING "fd%d: unsupported disk format", drive );
   1557			fd_end_request_cur(BLK_STS_IOERR);
   1558			stdma_release();
   1559			goto out;
   1560		}
   1561		type = minor2disktype[type].index;
   1562		UDT = &atari_disk_type[type];
   1563		set_capacity(bd->rq->q->disk, UDT->blocks);
   1564		UD.autoprobe = 0;
   1565	}
   1566
   1567	/* stop deselect timer */
   1568	del_timer( &motor_off_timer );
   1569		
   1570	ReqCnt = 0;
   1571	ReqCmd = rq_data_dir(fd_request);
   1572	ReqBlock = blk_rq_pos(fd_request);
   1573	ReqBuffer = bio_data(fd_request->bio);
   1574	setup_req_params( drive );
   1575	do_fd_action( drive );
   1576
   1577	atari_enable_irq( IRQ_MFP_FDC );
   1578
   1579out:
   1580	spin_unlock_irq(&ataflop_lock);
   1581	return BLK_STS_OK;
   1582}
   1583
   1584static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode,
   1585		    unsigned int cmd, unsigned long param)
   1586{
   1587	struct gendisk *disk = bdev->bd_disk;
   1588	struct atari_floppy_struct *floppy = disk->private_data;
   1589	int drive = floppy - unit;
   1590	int type = floppy->type;
   1591	struct atari_format_descr fmt_desc;
   1592	struct atari_disk_type *dtp;
   1593	struct floppy_struct getprm;
   1594	int settype;
   1595	struct floppy_struct setprm;
   1596	void __user *argp = (void __user *)param;
   1597
   1598	switch (cmd) {
   1599	case FDGETPRM:
   1600		if (type) {
   1601			if (--type >= NUM_DISK_MINORS)
   1602				return -ENODEV;
   1603			if (minor2disktype[type].drive_types > DriveType)
   1604				return -ENODEV;
   1605			type = minor2disktype[type].index;
   1606			dtp = &atari_disk_type[type];
   1607			if (UD.flags & FTD_MSG)
   1608			    printk (KERN_ERR "floppy%d: found dtp %p name %s!\n",
   1609			        drive, dtp, dtp->name);
   1610		}
   1611		else {
   1612			if (!UDT)
   1613				return -ENXIO;
   1614			else
   1615				dtp = UDT;
   1616		}
   1617		memset((void *)&getprm, 0, sizeof(getprm));
   1618		getprm.size = dtp->blocks;
   1619		getprm.sect = dtp->spt;
   1620		getprm.head = 2;
   1621		getprm.track = dtp->blocks/dtp->spt/2;
   1622		getprm.stretch = dtp->stretch;
   1623		if (copy_to_user(argp, &getprm, sizeof(getprm)))
   1624			return -EFAULT;
   1625		return 0;
   1626	}
   1627	switch (cmd) {
   1628	case FDSETPRM:
   1629	case FDDEFPRM:
   1630	        /* 
   1631		 * MSch 7/96: simple 'set geometry' case: just set the
   1632		 * 'default' device params (minor == 0).
   1633		 * Currently, the drive geometry is cleared after each
   1634		 * disk change and subsequent revalidate()! simple
   1635		 * implementation of FDDEFPRM: save geometry from a
   1636		 * FDDEFPRM call and restore it in floppy_revalidate() !
   1637		 */
   1638
   1639		/* get the parameters from user space */
   1640		if (floppy->ref != 1 && floppy->ref != -1)
   1641			return -EBUSY;
   1642		if (copy_from_user(&setprm, argp, sizeof(setprm)))
   1643			return -EFAULT;
   1644		/* 
   1645		 * first of all: check for floppy change and revalidate, 
   1646		 * or the next access will revalidate - and clear UDT :-(
   1647		 */
   1648
   1649		if (floppy_check_events(disk, 0))
   1650		        floppy_revalidate(disk);
   1651
   1652		if (UD.flags & FTD_MSG)
   1653		    printk (KERN_INFO "floppy%d: setting size %d spt %d str %d!\n",
   1654			drive, setprm.size, setprm.sect, setprm.stretch);
   1655
   1656		/* what if type > 0 here? Overwrite specified entry ? */
   1657		if (type) {
   1658		        /* refuse to re-set a predefined type for now */
   1659			finish_fdc();
   1660			return -EINVAL;
   1661		}
   1662
   1663		/* 
   1664		 * type == 0: first look for a matching entry in the type list,
   1665		 * and set the UD.disktype field to use the perdefined entry.
   1666		 * TODO: add user-defined format to head of autoprobe list ? 
   1667		 * Useful to include the user-type for future autodetection!
   1668		 */
   1669
   1670		for (settype = 0; settype < NUM_DISK_MINORS; settype++) {
   1671			int setidx = 0;
   1672			if (minor2disktype[settype].drive_types > DriveType) {
   1673				/* skip this one, invalid for drive ... */
   1674				continue;
   1675			}
   1676			setidx = minor2disktype[settype].index;
   1677			dtp = &atari_disk_type[setidx];
   1678
   1679			/* found matching entry ?? */
   1680			if (   dtp->blocks  == setprm.size 
   1681			    && dtp->spt     == setprm.sect
   1682			    && dtp->stretch == setprm.stretch ) {
   1683				if (UD.flags & FTD_MSG)
   1684				    printk (KERN_INFO "floppy%d: setting %s %p!\n",
   1685				        drive, dtp->name, dtp);
   1686				UDT = dtp;
   1687				set_capacity(disk, UDT->blocks);
   1688
   1689				if (cmd == FDDEFPRM) {
   1690				  /* save settings as permanent default type */
   1691				  default_params[drive].name    = dtp->name;
   1692				  default_params[drive].spt     = dtp->spt;
   1693				  default_params[drive].blocks  = dtp->blocks;
   1694				  default_params[drive].fdc_speed = dtp->fdc_speed;
   1695				  default_params[drive].stretch = dtp->stretch;
   1696				}
   1697				
   1698				return 0;
   1699			}
   1700
   1701		}
   1702
   1703		/* no matching disk type found above - setting user_params */
   1704
   1705	       	if (cmd == FDDEFPRM) {
   1706			/* set permanent type */
   1707			dtp = &default_params[drive];
   1708		} else
   1709			/* set user type (reset by disk change!) */
   1710			dtp = &user_params[drive];
   1711
   1712		dtp->name   = "user format";
   1713		dtp->blocks = setprm.size;
   1714		dtp->spt    = setprm.sect;
   1715		if (setprm.sect > 14) 
   1716			dtp->fdc_speed = 3;
   1717		else
   1718			dtp->fdc_speed = 0;
   1719		dtp->stretch = setprm.stretch;
   1720
   1721		if (UD.flags & FTD_MSG)
   1722			printk (KERN_INFO "floppy%d: blk %d spt %d str %d!\n",
   1723				drive, dtp->blocks, dtp->spt, dtp->stretch);
   1724
   1725		/* sanity check */
   1726		if (setprm.track != dtp->blocks/dtp->spt/2 ||
   1727		    setprm.head != 2) {
   1728			finish_fdc();
   1729			return -EINVAL;
   1730		}
   1731
   1732		UDT = dtp;
   1733		set_capacity(disk, UDT->blocks);
   1734
   1735		return 0;
   1736	case FDMSGON:
   1737		UD.flags |= FTD_MSG;
   1738		return 0;
   1739	case FDMSGOFF:
   1740		UD.flags &= ~FTD_MSG;
   1741		return 0;
   1742	case FDSETEMSGTRESH:
   1743		return -EINVAL;
   1744	case FDFMTBEG:
   1745		return 0;
   1746	case FDFMTTRK:
   1747		if (floppy->ref != 1 && floppy->ref != -1)
   1748			return -EBUSY;
   1749		if (copy_from_user(&fmt_desc, argp, sizeof(fmt_desc)))
   1750			return -EFAULT;
   1751		return do_format(drive, type, &fmt_desc);
   1752	case FDCLRPRM:
   1753		UDT = NULL;
   1754		/* MSch: invalidate default_params */
   1755		default_params[drive].blocks  = 0;
   1756		set_capacity(disk, MAX_DISK_SIZE * 2);
   1757		fallthrough;
   1758	case FDFMTEND:
   1759	case FDFLUSH:
   1760		/* invalidate the buffer track to force a reread */
   1761		BufferDrive = -1;
   1762		set_bit(drive, &fake_change);
   1763		if (bdev_check_media_change(bdev))
   1764			floppy_revalidate(bdev->bd_disk);
   1765		return 0;
   1766	default:
   1767		return -EINVAL;
   1768	}
   1769}
   1770
   1771static int fd_ioctl(struct block_device *bdev, fmode_t mode,
   1772			     unsigned int cmd, unsigned long arg)
   1773{
   1774	int ret;
   1775
   1776	mutex_lock(&ataflop_mutex);
   1777	ret = fd_locked_ioctl(bdev, mode, cmd, arg);
   1778	mutex_unlock(&ataflop_mutex);
   1779
   1780	return ret;
   1781}
   1782
   1783/* Initialize the 'unit' variable for drive 'drive' */
   1784
   1785static void __init fd_probe( int drive )
   1786{
   1787	UD.connected = 0;
   1788	UDT  = NULL;
   1789
   1790	if (!fd_test_drive_present( drive ))
   1791		return;
   1792
   1793	UD.connected = 1;
   1794	UD.track     = 0;
   1795	switch( UserSteprate[drive] ) {
   1796	case 2:
   1797		UD.steprate = FDCSTEP_2;
   1798		break;
   1799	case 3:
   1800		UD.steprate = FDCSTEP_3;
   1801		break;
   1802	case 6:
   1803		UD.steprate = FDCSTEP_6;
   1804		break;
   1805	case 12:
   1806		UD.steprate = FDCSTEP_12;
   1807		break;
   1808	default: /* should be -1 for "not set by user" */
   1809		if (ATARIHW_PRESENT( FDCSPEED ) || MACH_IS_MEDUSA)
   1810			UD.steprate = FDCSTEP_3;
   1811		else
   1812			UD.steprate = FDCSTEP_6;
   1813		break;
   1814	}
   1815	MotorOn = 1;	/* from probe restore operation! */
   1816}
   1817
   1818
   1819/* This function tests the physical presence of a floppy drive (not
   1820 * whether a disk is inserted). This is done by issuing a restore
   1821 * command, waiting max. 2 seconds (that should be enough to move the
   1822 * head across the whole disk) and looking at the state of the "TR00"
   1823 * signal. This should now be raised if there is a drive connected
   1824 * (and there is no hardware failure :-) Otherwise, the drive is
   1825 * declared absent.
   1826 */
   1827
   1828static int __init fd_test_drive_present( int drive )
   1829{
   1830	unsigned long timeout;
   1831	unsigned char status;
   1832	int ok;
   1833	
   1834	if (drive >= (MACH_IS_FALCON ? 1 : 2)) return( 0 );
   1835	fd_select_drive( drive );
   1836
   1837	/* disable interrupt temporarily */
   1838	atari_turnoff_irq( IRQ_MFP_FDC );
   1839	FDC_WRITE (FDCREG_TRACK, 0xff00);
   1840	FDC_WRITE( FDCREG_CMD, FDCCMD_RESTORE | FDCCMDADD_H | FDCSTEP_6 );
   1841
   1842	timeout = jiffies + 2*HZ+HZ/2;
   1843	while (time_before(jiffies, timeout))
   1844		if (!(st_mfp.par_dt_reg & 0x20))
   1845			break;
   1846
   1847	status = FDC_READ( FDCREG_STATUS );
   1848	ok = (status & FDCSTAT_TR00) != 0;
   1849
   1850	/* force interrupt to abort restore operation (FDC would try
   1851	 * about 50 seconds!) */
   1852	FDC_WRITE( FDCREG_CMD, FDCCMD_FORCI );
   1853	udelay(500);
   1854	status = FDC_READ( FDCREG_STATUS );
   1855	udelay(20);
   1856
   1857	if (ok) {
   1858		/* dummy seek command to make WP bit accessible */
   1859		FDC_WRITE( FDCREG_DATA, 0 );
   1860		FDC_WRITE( FDCREG_CMD, FDCCMD_SEEK );
   1861		while( st_mfp.par_dt_reg & 0x20 )
   1862			;
   1863		status = FDC_READ( FDCREG_STATUS );
   1864	}
   1865
   1866	atari_turnon_irq( IRQ_MFP_FDC );
   1867	return( ok );
   1868}
   1869
   1870
   1871/* Look how many and which kind of drives are connected. If there are
   1872 * floppies, additionally start the disk-change and motor-off timers.
   1873 */
   1874
   1875static void __init config_types( void )
   1876{
   1877	int drive, cnt = 0;
   1878
   1879	/* for probing drives, set the FDC speed to 8 MHz */
   1880	if (ATARIHW_PRESENT(FDCSPEED))
   1881		dma_wd.fdc_speed = 0;
   1882
   1883	printk(KERN_INFO "Probing floppy drive(s):\n");
   1884	for( drive = 0; drive < FD_MAX_UNITS; drive++ ) {
   1885		fd_probe( drive );
   1886		if (UD.connected) {
   1887			printk(KERN_INFO "fd%d\n", drive);
   1888			++cnt;
   1889		}
   1890	}
   1891
   1892	if (FDC_READ( FDCREG_STATUS ) & FDCSTAT_BUSY) {
   1893		/* If FDC is still busy from probing, give it another FORCI
   1894		 * command to abort the operation. If this isn't done, the FDC
   1895		 * will interrupt later and its IRQ line stays low, because
   1896		 * the status register isn't read. And this will block any
   1897		 * interrupts on this IRQ line :-(
   1898		 */
   1899		FDC_WRITE( FDCREG_CMD, FDCCMD_FORCI );
   1900		udelay(500);
   1901		FDC_READ( FDCREG_STATUS );
   1902		udelay(20);
   1903	}
   1904	
   1905	if (cnt > 0) {
   1906		start_motor_off_timer();
   1907		if (cnt == 1) fd_select_drive( 0 );
   1908		start_check_change_timer();
   1909	}
   1910}
   1911
   1912/*
   1913 * floppy_open check for aliasing (/dev/fd0 can be the same as
   1914 * /dev/PS0 etc), and disallows simultaneous access to the same
   1915 * drive with different device numbers.
   1916 */
   1917
   1918static int floppy_open(struct block_device *bdev, fmode_t mode)
   1919{
   1920	struct atari_floppy_struct *p = bdev->bd_disk->private_data;
   1921	int type  = MINOR(bdev->bd_dev) >> 2;
   1922
   1923	DPRINT(("fd_open: type=%d\n",type));
   1924	if (p->ref && p->type != type)
   1925		return -EBUSY;
   1926
   1927	if (p->ref == -1 || (p->ref && mode & FMODE_EXCL))
   1928		return -EBUSY;
   1929
   1930	if (mode & FMODE_EXCL)
   1931		p->ref = -1;
   1932	else
   1933		p->ref++;
   1934
   1935	p->type = type;
   1936
   1937	if (mode & FMODE_NDELAY)
   1938		return 0;
   1939
   1940	if (mode & (FMODE_READ|FMODE_WRITE)) {
   1941		if (bdev_check_media_change(bdev))
   1942			floppy_revalidate(bdev->bd_disk);
   1943		if (mode & FMODE_WRITE) {
   1944			if (p->wpstat) {
   1945				if (p->ref < 0)
   1946					p->ref = 0;
   1947				else
   1948					p->ref--;
   1949				return -EROFS;
   1950			}
   1951		}
   1952	}
   1953	return 0;
   1954}
   1955
   1956static int floppy_unlocked_open(struct block_device *bdev, fmode_t mode)
   1957{
   1958	int ret;
   1959
   1960	mutex_lock(&ataflop_mutex);
   1961	ret = floppy_open(bdev, mode);
   1962	mutex_unlock(&ataflop_mutex);
   1963
   1964	return ret;
   1965}
   1966
   1967static void floppy_release(struct gendisk *disk, fmode_t mode)
   1968{
   1969	struct atari_floppy_struct *p = disk->private_data;
   1970	mutex_lock(&ataflop_mutex);
   1971	if (p->ref < 0)
   1972		p->ref = 0;
   1973	else if (!p->ref--) {
   1974		printk(KERN_ERR "floppy_release with fd_ref == 0");
   1975		p->ref = 0;
   1976	}
   1977	mutex_unlock(&ataflop_mutex);
   1978}
   1979
   1980static const struct block_device_operations floppy_fops = {
   1981	.owner		= THIS_MODULE,
   1982	.open		= floppy_unlocked_open,
   1983	.release	= floppy_release,
   1984	.ioctl		= fd_ioctl,
   1985	.check_events	= floppy_check_events,
   1986};
   1987
   1988static const struct blk_mq_ops ataflop_mq_ops = {
   1989	.queue_rq = ataflop_queue_rq,
   1990};
   1991
   1992static int ataflop_alloc_disk(unsigned int drive, unsigned int type)
   1993{
   1994	struct gendisk *disk;
   1995
   1996	disk = blk_mq_alloc_disk(&unit[drive].tag_set, NULL);
   1997	if (IS_ERR(disk))
   1998		return PTR_ERR(disk);
   1999
   2000	disk->major = FLOPPY_MAJOR;
   2001	disk->first_minor = drive + (type << 2);
   2002	disk->minors = 1;
   2003	sprintf(disk->disk_name, "fd%d", drive);
   2004	disk->fops = &floppy_fops;
   2005	disk->flags |= GENHD_FL_NO_PART;
   2006	disk->events = DISK_EVENT_MEDIA_CHANGE;
   2007	disk->private_data = &unit[drive];
   2008	set_capacity(disk, MAX_DISK_SIZE * 2);
   2009
   2010	unit[drive].disk[type] = disk;
   2011	return 0;
   2012}
   2013
   2014static void ataflop_probe(dev_t dev)
   2015{
   2016	int drive = MINOR(dev) & 3;
   2017	int type  = MINOR(dev) >> 2;
   2018
   2019	if (type)
   2020		type--;
   2021
   2022	if (drive >= FD_MAX_UNITS || type >= NUM_DISK_MINORS)
   2023		return;
   2024	if (unit[drive].disk[type])
   2025		return;
   2026	if (ataflop_alloc_disk(drive, type))
   2027		return;
   2028	if (add_disk(unit[drive].disk[type]))
   2029		goto cleanup_disk;
   2030	unit[drive].registered[type] = true;
   2031	return;
   2032
   2033cleanup_disk:
   2034	blk_cleanup_disk(unit[drive].disk[type]);
   2035	unit[drive].disk[type] = NULL;
   2036}
   2037
   2038static void atari_floppy_cleanup(void)
   2039{
   2040	int i;
   2041	int type;
   2042
   2043	for (i = 0; i < FD_MAX_UNITS; i++) {
   2044		for (type = 0; type < NUM_DISK_MINORS; type++) {
   2045			if (!unit[i].disk[type])
   2046				continue;
   2047			del_gendisk(unit[i].disk[type]);
   2048			blk_cleanup_queue(unit[i].disk[type]->queue);
   2049			put_disk(unit[i].disk[type]);
   2050		}
   2051		blk_mq_free_tag_set(&unit[i].tag_set);
   2052	}
   2053
   2054	del_timer_sync(&fd_timer);
   2055	atari_stram_free(DMABuffer);
   2056}
   2057
   2058static void atari_cleanup_floppy_disk(struct atari_floppy_struct *fs)
   2059{
   2060	int type;
   2061
   2062	for (type = 0; type < NUM_DISK_MINORS; type++) {
   2063		if (!fs->disk[type])
   2064			continue;
   2065		if (fs->registered[type])
   2066			del_gendisk(fs->disk[type]);
   2067		blk_cleanup_disk(fs->disk[type]);
   2068	}
   2069	blk_mq_free_tag_set(&fs->tag_set);
   2070}
   2071
   2072static int __init atari_floppy_init (void)
   2073{
   2074	int i;
   2075	int ret;
   2076
   2077	if (!MACH_IS_ATARI)
   2078		/* Amiga, Mac, ... don't have Atari-compatible floppy :-) */
   2079		return -ENODEV;
   2080
   2081	for (i = 0; i < FD_MAX_UNITS; i++) {
   2082		memset(&unit[i].tag_set, 0, sizeof(unit[i].tag_set));
   2083		unit[i].tag_set.ops = &ataflop_mq_ops;
   2084		unit[i].tag_set.nr_hw_queues = 1;
   2085		unit[i].tag_set.nr_maps = 1;
   2086		unit[i].tag_set.queue_depth = 2;
   2087		unit[i].tag_set.numa_node = NUMA_NO_NODE;
   2088		unit[i].tag_set.flags = BLK_MQ_F_SHOULD_MERGE;
   2089		ret = blk_mq_alloc_tag_set(&unit[i].tag_set);
   2090		if (ret)
   2091			goto err;
   2092
   2093		ret = ataflop_alloc_disk(i, 0);
   2094		if (ret) {
   2095			blk_mq_free_tag_set(&unit[i].tag_set);
   2096			goto err;
   2097		}
   2098	}
   2099
   2100	if (UseTrackbuffer < 0)
   2101		/* not set by user -> use default: for now, we turn
   2102		   track buffering off for all Medusas, though it
   2103		   could be used with ones that have a counter
   2104		   card. But the test is too hard :-( */
   2105		UseTrackbuffer = !MACH_IS_MEDUSA;
   2106
   2107	/* initialize variables */
   2108	SelectedDrive = -1;
   2109	BufferDrive = -1;
   2110
   2111	DMABuffer = atari_stram_alloc(BUFFER_SIZE+512, "ataflop");
   2112	if (!DMABuffer) {
   2113		printk(KERN_ERR "atari_floppy_init: cannot get dma buffer\n");
   2114		ret = -ENOMEM;
   2115		goto err;
   2116	}
   2117	TrackBuffer = DMABuffer + 512;
   2118	PhysDMABuffer = atari_stram_to_phys(DMABuffer);
   2119	PhysTrackBuffer = virt_to_phys(TrackBuffer);
   2120	BufferDrive = BufferSide = BufferTrack = -1;
   2121
   2122	for (i = 0; i < FD_MAX_UNITS; i++) {
   2123		unit[i].track = -1;
   2124		unit[i].flags = 0;
   2125		ret = add_disk(unit[i].disk[0]);
   2126		if (ret)
   2127			goto err_out_dma;
   2128		unit[i].registered[0] = true;
   2129	}
   2130
   2131	printk(KERN_INFO "Atari floppy driver: max. %cD, %strack buffering\n",
   2132	       DriveType == 0 ? 'D' : DriveType == 1 ? 'H' : 'E',
   2133	       UseTrackbuffer ? "" : "no ");
   2134	config_types();
   2135
   2136	ret = __register_blkdev(FLOPPY_MAJOR, "fd", ataflop_probe);
   2137	if (ret) {
   2138		printk(KERN_ERR "atari_floppy_init: cannot register block device\n");
   2139		atari_floppy_cleanup();
   2140	}
   2141	return ret;
   2142
   2143err_out_dma:
   2144	atari_stram_free(DMABuffer);
   2145err:
   2146	while (--i >= 0)
   2147		atari_cleanup_floppy_disk(&unit[i]);
   2148
   2149	return ret;
   2150}
   2151
   2152#ifndef MODULE
   2153static int __init atari_floppy_setup(char *str)
   2154{
   2155	int ints[3 + FD_MAX_UNITS];
   2156	int i;
   2157
   2158	if (!MACH_IS_ATARI)
   2159		return 0;
   2160
   2161	str = get_options(str, 3 + FD_MAX_UNITS, ints);
   2162	
   2163	if (ints[0] < 1) {
   2164		printk(KERN_ERR "ataflop_setup: no arguments!\n" );
   2165		return 0;
   2166	}
   2167	else if (ints[0] > 2+FD_MAX_UNITS) {
   2168		printk(KERN_ERR "ataflop_setup: too many arguments\n" );
   2169	}
   2170
   2171	if (ints[1] < 0 || ints[1] > 2)
   2172		printk(KERN_ERR "ataflop_setup: bad drive type\n" );
   2173	else
   2174		DriveType = ints[1];
   2175
   2176	if (ints[0] >= 2)
   2177		UseTrackbuffer = (ints[2] > 0);
   2178
   2179	for( i = 3; i <= ints[0] && i-3 < FD_MAX_UNITS; ++i ) {
   2180		if (ints[i] != 2 && ints[i] != 3 && ints[i] != 6 && ints[i] != 12)
   2181			printk(KERN_ERR "ataflop_setup: bad steprate\n" );
   2182		else
   2183			UserSteprate[i-3] = ints[i];
   2184	}
   2185	return 1;
   2186}
   2187
   2188__setup("floppy=", atari_floppy_setup);
   2189#endif
   2190
   2191static void __exit atari_floppy_exit(void)
   2192{
   2193	unregister_blkdev(FLOPPY_MAJOR, "fd");
   2194	atari_floppy_cleanup();
   2195}
   2196
   2197module_init(atari_floppy_init)
   2198module_exit(atari_floppy_exit)
   2199
   2200MODULE_LICENSE("GPL");