/****************************************************************************
 ****************************************************************************
 ***
 ***   This header was automatically generated from a Linux kernel header
 ***   of the same name, to make information necessary for userspace to
 ***   call into the kernel available to libc.  It contains only constants,
 ***   structures, and macros generated from the original header, and thus,
 ***   contains no copyrightable information.
 ***
 ****************************************************************************
 ****************************************************************************/
#ifndef _LINUX_FD_H
#define _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

 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;

 short autodetect[8];

 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
};

#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;
 unsigned char cmd_count;
 unsigned char cmd[16];
 unsigned char reply_count;
 unsigned char reply[16];
 int track;
 int resultcode;

 int reserved1;
 int reserved2;
};

#define FDRAWCMD _IO(2, 0x58)

#define FDTWADDLE _IO(2, 0x59)

#define FDEJECT _IO(2, 0x5a)

#endif
