/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos720 src/bos/kernel/sys/fd.h 1.25.1.2                                */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 1989,1995              */
/* All Rights Reserved                                                    */
/*                                                                        */
/* US Government Users Restricted Rights - Use, duplication or            */
/* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.      */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
/* @(#)82       1.25.1.2  src/bos/kernel/sys/fd.h, sysxfd, bos720 4/29/98 13:00:56 */
#ifndef _H_FD
#define _H_FD
/*
 * COMPONENT_NAME: (SYSXFD) Diskette Device Driver Header File
 *
 * FUNCTIONS:
 *
 * ORIGINS: 27, 83
 *
 * (C) COPYRIGHT International Business Machines Corp. 1989, 1995
 * All Rights Reserved
 * Licensed Materials - Property of IBM
 *
 * US Government Users Restricted Rights - Use, duplication or
 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 *
 * LEVEL 1, 5 Years Bull Confidential Information
 */

#include <sys/inttypes.h>
/*
 * The following is the structure passed in to the fd_config routine.
 */

union  	fd_config {
	/* used in CFG_INIT for adapter configuration */
	struct fda_config {
		uint	slot_num;	/* adapter slot number */
		uint	bus_id;		/* id of io bus */
		uint    io_address;	/* offset to first io address */
					/* of the controller 	      */
		int	dma_level;	/* diskette DMA arbitration level */
		int	bus_int_level;	/* bus interrupt level */
		int	device_idle_time;    /* time before entering PM idle mode */
		int	device_standby_time; /* time before entering PM idle mode */
		int	pm_attribute; 	/* PM attribute for the device */
		ushort	bus_type;	/* bus type for interrupt handler */
		uchar	int_class;	/* interrupt class */
		uchar   adapter_type;
	#define FD_ADAPTER0     0x00	/* default adapter type */
	#define FD_ADAPTER1     0x01	/* SIO devid fef6 - RS/6000 2xx type */
	#define FD_ADAPTER2     0x02	/* MCA SMP */
	#define FD_ADAPTER3     0x03	/* ISA Super SIO */
	#define FD_ADAPTER4     0x04	/* ISA Super SIO - CHRP */
		char	adap_name[8];	/* string for error logging */
	} fda;

	/* used in CFG_INIT for drive configuration */
	struct fdd_config {
		int	pm_device_id;	/* drive's planar device id for pm */
		int	device_idle_time;    /* time before entering PM idle mode */
		int	device_standby_time; /* time before entering PM idle mode */
		int	pm_attribute; 	/* PM attribute for the device */
		ushort	motor_start;	/* motor start time in milliseconds */
		uchar 	type;		/* drive type */
	#define	D_96	2		/* 96 tpi, (1.2M, 5.25" drive) */
	#define D_135H  8               /* 135 tpi, high density,
						(1.44M, 3.5" drive) */
	#define D_1354H 4               /* 135 tpi, high density,
						(2.88M, 3.5" drive) */
		uchar	head_settle;	/* head settle time in milliseconds */
		uchar	step_rate;	/* step rate time in milliseconds */
		char	resource_name[8];	/* string for error logging */
	} fdd;

	/* used in CFG_QVPD to detect presence of drives */
	uint	drive_info[2];	/* information about the drive uses D_96, */
			/* D_135H, and D_1354H to identify drive type.    */
#define FD_PRESENT      0x100
#define FD_CONFIGURED   0x200
#define FD_CHRP         0x400
};


/*
 * Diskette minor numbers use the following convention:
 *   
 *
 *                       Diskette Diameter
 *                              |
 *                    Drive     |     
 * Configure          Number    |        Diskette Type
 * Adapter            ______    |    _____________________
 *  |                |      |  | |  |                     |
 *  0    000 0000     0    0    0    0    0    0    0    0
 *
 */

/*
 * Defines for each of the diskette minor device types.            
 */

#define	FDGENERIC	0	/* generic minor device number */
#define	FD1440_3	0x01	/* 3.5 inch, 1.44M diskette */
#define	FD720_3		0x02	/* 3.5 inch, 720K diskette */
#define FD2880_3        0x03    /* 3.5 inch, 2.88M diskette */
#define	FD1200_5	0x21	/* 5.25 inch, 1.2M diskette */
#define	FD360_5		0x22	/* 5.25 inch, 360K diskette */
#define	FD360_5		0x22	/* 5.25 inch, 360K diskette */

#define FD_ADAP_MINOR_NUM	0x8000	/* minor number for diskette adapter */
					/* a flag so config knows it is      */
					/* configuring the adapter and not   */
					/* the drive 			     */
/*
 * Diskette device driver ioctl operations.
 */

#define	FDIOC	('F'<<8)
#define	FDIOCDSELDRV	(FDIOC|1)	/* de-select the drive */
#define	FDIOCFORMAT	(FDIOC|2)	/* format track */
#define	FDIOCGETPARMS	(FDIOC|3)	/* get diskette & drive
						characteristics */
#define	FDIOCGINFO	(FDIOC|4)	/* get drive info */
#define	FDIOCNORETRY	(FDIOC|5)	/* disable retries on errors */
#define	FDIOCREADID	(FDIOC|6)	/* read first address field found */
#define	FDIOCRECAL	(FDIOC|7)	/* recalibrate the drive */
#define	FDIOCRESET	(FDIOC|8)	/* reset diskette controller */
#define	FDIOCRETRY	(FDIOC|9)	/* enable retries on errors */
#define	FDIOCSEEK	(FDIOC|10)	/* seek to designated cylinder */
#define	FDIOCSELDRV	(FDIOC|11)	/* select the drive */
#define	FDIOCSETPARMS	(FDIOC|12)	/* set diskette & drive
						characteristics */
#define	FDIOCSETTLE	(FDIOC|13)	/* check the head settle time */
#define	FDIOCSINFO	(FDIOC|14)	/* set drive info */
#define	FDIOCSPEED	(FDIOC|15)	/* check the diskette rotation speed */
#define	FDIOCSTATUS	(FDIOC|16)	/* get the drive status */

/*
 * The following is the structure used by the FDIOCGINFO and FDIOCSINFO
 * ioctl operations.
 */

struct fdinfo {
	short	type;	/* drive type */
#define	D_96	2	/* 96 tpi, (1.2M, 5.25" drive) */
#define	D_135H	8	/* 135 tpi, high density, (1.44M, 3.5" drive) */
#define D_1354H 4       /* 135 tpi, high density, (2.88M, 3.5" drive) */
	short	info_reserved;
	int	nsects;	/* number of sectors/track */
	int	sides;	/* number of sides */
	int	ncyls;	/* number of cylinders */
};

/*
 * The following is the structure used by the FDIOCSTATUS ioctl
 * system call.                                               
 */

struct fd_status {
	uchar	status1;	/* status byte 1 */
#define	FDNODRIVE	1	/* no drive selected */
#define	FDDRIVE0	2	/* drive 0 selected */
#define	FDDRIVE1	4	/* drive 1 selected */
#define	FD250KBPS	8	/* 250 kbps data transfer rate */
#define	FD300KBPS	16	/* 300 kbps data transfer rate */
#define	FD500KBPS	32	/* 500 kbps data transfer rare */
#define FD1MBPS         64      /* 1000 Mbps data transfer rare */
	uchar	status2;	/* status byte 2 */
#define	FD3INCHHIGH	2	/* 1.44 Megabyte drive */
#define FD3INCHHIGH4M   4       /* 2.88 Megabyte drive */
#define	FD5INCHHIGH	8	/* 1.2 Megabyte drive */
#define	FDRETRY		16	/* retries are enabled */
#define	FDTIMEOUT	32	/* device driver timer expired */
	uchar	status3;	/* status byte 3 */
#define	FDDOUBLE	2	/* doubled-sided diskette */
#define FD36PRTRCK      4       /* 36 sectors per track */
#define	FD9PRTRCK	8	/* 9 sectors per track */
#define	FD15PRTRCK	16	/* 15 sectors per track */
#define	FD18PRTRCK	32	/* 18 sectors per track */
#define	FD40CYLS	64	/* 40 cylinders */
#define	FD80CYLS	128	/* 80 cylinders */
	uchar	command0;	/* command phase byte 0 */
	uchar	command1;	/* command phase byte 1 */
	uchar	mainstat;	/* controller main status register */
	uchar	dsktchng;	/* controller disk changed register */
	uchar	result0;	/* result phase status register 0 */
	uchar	result1;	/* result phase status register 1 */
	uchar	result2;	/* result phase status register 2 */
	uchar	result3;	/* result phase status register 3 */
	uchar	cylinder_num; 	/* cylinder number */
	uchar	head_num;	/* head number */
	uchar	sector_num;	/* sector number */
	uchar	bytes_num;	/* number of bytes per sector */
	uchar	head_settle_time;	/* time in milliseconds */
	uint	motor_speed;	/* time in milliseconds */
	__ulong32_t Mbytes_read;/* number of Mbytes read since last config */
	__ulong32_t Mbytes_written;/* number of Mbytes written since last
					config */
	__ulong32_t status_reserved0;
	__ulong32_t status_reserved1;
};

/*
 * The following is the structure used by the FDIOCSETPARMS and the
 * FDIOCGETPARMS ioctl system calls.
 */

struct fdparms {
	uchar	diskette_type;	/* ORed together flags describing type */
	uchar	sector_size;	/* encoded sector size */
	uchar	tracks_per_cylinder;	/* decimal value */
	uchar	data_rate;	/* encoded data rate */
	uchar	head_settle_time;	/* head settle time in milliseconds */
	uchar	head_load;	/* encoded head settle time */
	uchar	fill_byte;	/* hex data pattern */
	uchar	step_rate;	/* encoded step rate time */
	uchar	step_rate_time;	/* step rate in milliseconds */
	uchar	gap;		/* r/w gap */
	uchar	format_gap;	/* format gap */
	uchar	data_length;	/* see data sheet for usage info */
	uchar	motor_off_time;	/* time before motor is turned off (secs) */
	ushort	sectors_per_track;	/* decimal value */
	ushort	sectors_per_cylinder;	/* decimal value */
	ushort	cylinders_per_disk;	/* decimal value */
	ushort	bytes_per_sector;	/* decimal value */
	ushort	number_of_blocks;	/* total number of sectors on the 
						diskette */
	ushort	motor_start;	/* motor start time in milliseconds */
	ushort	motor_ticks;	/* motor start time in timer ticks */
};

#endif /* _H_FD */
