/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _UAPI_LINUX_FD_H
#define _UAPI_LINUX_FD_H

#include <linux/ioctl.h>
#include <linux/compiler.h>




struct floppy_struct {
	unsigned int	size,		
			sect,		
			head,		
			track,		
			stretch;	
					
					
					
#define FD_STRETCH 1
#define FD_SWAPSIDES 2
#define FD_ZEROBASED 4
#define FD_SECTBASEMASK 0x3FC
#define FD_MKSECTBASE(s) (((s) ^ 1) << 2)
#define FD_SECTBASE(floppy) ((((floppy)->stretch & FD_SECTBASEMASK) >> 2) ^ 1)

	unsigned char	gap,		

			rate,		
#define FD_2M 0x4
#define FD_SIZECODEMASK 0x38
#define FD_SIZECODE(floppy) (((((floppy)->rate&FD_SIZECODEMASK)>> 3)+ 2) %8)
#define FD_SECTSIZE(floppy) ( (floppy)->rate & FD_2M ? \
			     512 : 128 << FD_SIZECODE(floppy) )
#define FD_PERP 0x40

			spec1,		
			fmt_gap;	
	const char	* name; 
};





#define FDCLRPRM _IO(2, 0x41)


#define FDSETPRM _IOW(2, 0x42, struct floppy_struct)
#define FDSETMEDIAPRM FDSETPRM


#define FDDEFPRM _IOW(2, 0x43, struct floppy_struct)
#define FDGETPRM _IOR(2, 0x04, struct floppy_struct)
#define FDDEFMEDIAPRM FDDEFPRM
#define FDGETMEDIAPRM FDGETPRM



#define	FDMSGON  _IO(2,0x45)
#define	FDMSGOFF _IO(2,0x46)




#define FD_FILL_BYTE 0xF6 

struct format_descr {
	unsigned int device,head,track;
};

#define FDFMTBEG _IO(2,0x47)

#define	FDFMTTRK _IOW(2,0x48, struct format_descr)

#define FDFMTEND _IO(2,0x49)




struct floppy_max_errors {
	unsigned int
	  abort,      
	  read_track, 
	  reset,      
	  recal,      

	  
	  reporting;

};

#define FDSETEMSGTRESH	_IO(2,0x4a)


#define FDFLUSH  _IO(2,0x4b)


#define FDSETMAXERRS _IOW(2, 0x4c, struct floppy_max_errors)
#define FDGETMAXERRS _IOR(2, 0x0e, struct floppy_max_errors)



typedef char floppy_drive_name[16];
#define FDGETDRVTYP _IOR(2, 0x0f, floppy_drive_name)




struct floppy_drive_params {
	signed char cmos;		

	
	unsigned long max_dtr;		
	unsigned long hlt;     		
	unsigned long hut;     		
	unsigned long srt;     		

	unsigned long spinup;		
	unsigned long spindown;		
	unsigned char spindown_offset;	
	unsigned char select_delay;	
	unsigned char rps;		
	unsigned char tracks;		
	unsigned long timeout;		

	unsigned char interleave_sect;	

	struct floppy_max_errors max_errors;

	char flags;			


#define FTD_MSG 0x10
#define FD_BROKEN_DCL 0x20
#define FD_DEBUG 0x02
#define FD_SILENT_DCL_CLEAR 0x4
#define FD_INVERTED_DCL 0x80 

	char read_track;		



#define FD_AUTODETECT_SIZE 8

	short autodetect[FD_AUTODETECT_SIZE]; 

	int checkfreq; 
	int native_format; 
};

enum {
	FD_NEED_TWADDLE_BIT,	
	FD_VERIFY_BIT,		
	FD_DISK_NEWCHANGE_BIT,	
	FD_UNUSED_BIT,
	FD_DISK_CHANGED_BIT,	
	FD_DISK_WRITABLE_BIT,	
	FD_OPEN_SHOULD_FAIL_BIT
};

#define FDSETDRVPRM _IOW(2, 0x90, struct floppy_drive_params)
#define FDGETDRVPRM _IOR(2, 0x11, struct floppy_drive_params)




struct floppy_drive_struct {
	unsigned long flags;

#define FD_NEED_TWADDLE (1 << FD_NEED_TWADDLE_BIT)
#define FD_VERIFY (1 << FD_VERIFY_BIT)
#define FD_DISK_NEWCHANGE (1 << FD_DISK_NEWCHANGE_BIT)
#define FD_DISK_CHANGED (1 << FD_DISK_CHANGED_BIT)
#define FD_DISK_WRITABLE (1 << FD_DISK_WRITABLE_BIT)

	unsigned long spinup_date;
	unsigned long select_date;
	unsigned long first_read_date;
	short probed_format;
	short track; 
	short maxblock; 
	short maxtrack; 
	int generation; 


	int keep_data;

	
	int fd_ref;
	int fd_device;
	unsigned long last_checked; 

	char *dmabuf;
	int bufblocks;
};

#define FDGETDRVSTAT _IOR(2, 0x12, struct floppy_drive_struct)
#define FDPOLLDRVSTAT _IOR(2, 0x13, struct floppy_drive_struct)




enum reset_mode {
	FD_RESET_IF_NEEDED,	
	FD_RESET_IF_RAWCMD,	
	FD_RESET_ALWAYS		
};
#define FDRESET _IO(2, 0x54)



struct floppy_fdc_state {
	int spec1;		
	int spec2;		
	int dtr;
	unsigned char version;	
	unsigned char dor;
	unsigned long address;	
	unsigned int rawcmd:2;
	unsigned int reset:1;
	unsigned int need_configure:1;
	unsigned int perp_mode:2;
	unsigned int has_fifo:1;
	unsigned int driver_version;	
#define FD_DRIVER_VERSION 0x100


	unsigned char track[4];
	

};

#define FDGETFDCSTAT _IOR(2, 0x15, struct floppy_fdc_state)



struct floppy_write_errors {
	

	unsigned int write_errors;  

	
	unsigned long first_error_sector;
	int           first_error_generation;
	unsigned long last_error_sector;
	int           last_error_generation;

	unsigned int badness; 
};

#define FDWERRORCLR  _IO(2, 0x56)

#define FDWERRORGET  _IOR(2, 0x17, struct floppy_write_errors)





#define FDHAVEBATCHEDRAWCMD

struct floppy_raw_cmd {
	unsigned int flags;
#define FD_RAW_READ 1
#define FD_RAW_WRITE 2
#define FD_RAW_NO_MOTOR 4
#define FD_RAW_DISK_CHANGE 4 
#define FD_RAW_INTR 8    
#define FD_RAW_SPIN 0x10 
#define FD_RAW_NO_MOTOR_AFTER 0x20 
#define FD_RAW_NEED_DISK 0x40  
#define FD_RAW_NEED_SEEK 0x80  


#define FD_RAW_MORE 0x100  
#define FD_RAW_STOP_IF_FAILURE 0x200 
#define FD_RAW_STOP_IF_SUCCESS 0x400 
#define FD_RAW_SOFTFAILURE 0x800 


#define FD_RAW_FAILURE 0x10000 
#define FD_RAW_HARDFAILURE 0x20000 

	void __user *data;
	char *kernel_data; 
	struct floppy_raw_cmd *next; 
	long length; 
	long phys_length; 
	int buffer_length; 

	unsigned char rate;

#define FD_RAW_CMD_SIZE 16
#define FD_RAW_REPLY_SIZE 16
#define FD_RAW_CMD_FULLSIZE (FD_RAW_CMD_SIZE + 1 + FD_RAW_REPLY_SIZE)

	

	unsigned char cmd_count;
	union {
		struct {
			unsigned char cmd[FD_RAW_CMD_SIZE];
			unsigned char reply_count;
			unsigned char reply[FD_RAW_REPLY_SIZE];
		};
		unsigned char fullcmd[FD_RAW_CMD_FULLSIZE];
	};
	int track;
	int resultcode;

	int reserved1;
	int reserved2;
};

#define FDRAWCMD _IO(2, 0x58)


#define FDTWADDLE _IO(2, 0x59)



#define FDEJECT _IO(2, 0x5a)




#endif 
