Coherent4.2.10/include/sys/hdioctl.h

/* (-lgl
 *	Coherent 386 release 4.2
 *	Copyright (c) 1982, 1993 by Mark Williams Company.
 *	All rights reserved. May not be copied without permission.
 *	For copying permission and licensing info, write licensing@mwc.com
 -lgl) */

#ifndef __SYS_HDIOCTL_H__
#define	__SYS_HDIOCTL_H__

#include <common/feature.h>

/*
 * Ioctl support for hard disk devices.
 */

#define	HDIOC	('H' << 8)
#define	HDGETA	(HDIOC|1)	/* get drive attributes */
#define	HDSETA	(HDIOC|2)	/* set drive attributes */
#define HDGETIDEINFO (HDIOC|4)	/* get result of IDE info command */

/*
 * Configuration word (ii_config) meanings by bit number
 * 0:  ?
 * 1:  Hard sectored
 * 2:  Soft sectored
 * 3:  Not MFM encoded
 * 4:  Head Switch Time > 15 usec
 * 5:  Spindled Motor Control Option Implemented
 * 6:  Fixed Drive
 * 7:  ?
 * 8:  Disk Transfer Rate <= 5Mbs
 * 9:  Disk Transfer Rate > 5Mbs but <= 10 Mbs
 * 10: Disk Transfer Rate > 10Mbs
 * 11: Rotational Speed Tolerance > 0.5%
 * 12: Data Strobe Offset Option Available
 * 13: Track Offset Option Available
 * 14: Format Speed Tolerance Gap Required
 * 15: ?
 */

typedef struct ide_info {
  unsigned short ii_config;	/* Configuration */
  unsigned short ii_cyl;	/* Cylinders (default xlat mode) */
  unsigned short ii_reserved;	/* reserved */
  unsigned short ii_heads;	/* heads (default xlat mode */
  unsigned short ii_bpt;	/* bytes per track (unformatted) */
  unsigned short ii_bps;	/* bytes per sector (unformatted) */
  unsigned short ii_spt;	/* sectors per track (default xlat mode) */
  unsigned short ii_vendor1[3];	/* vendor unique data */
  unsigned short ii_serialnum[10]; /* serial number in ASCII */
  unsigned short ii_buffertype;	/* buffer type */
  unsigned short ii_buffersize;	/* buffer size in 512 byte sectors */
  unsigned short ii_eccbyteslong; /* ecc bytes for r/w long */
  unsigned short ii_firmrev[4];	/* firmware revision in ascii */
  unsigned short ii_modelnum[20]; /* model number in ascii */
  unsigned short ii_doublewordio; /* double word transfer flag */
  unsigned short ii_capabilities; /* capabilities */
  unsigned short ii_reserved2;	/* reserved */
  unsigned short ii_piomode;	/* PIO data xfer timing mode */
  unsigned short ii_dmamode;	/* DMA data xfer timing mode */
  unsigned short ii_reserved3[75]; /* reserved */
  unsigned short ii_vendor2[32]; /* vendor unique data */
  unsigned short ii_reserved4[96]; /* reserved */
} ide_info_t;


/*
 * Drive attributes
 * Note: all fields defined as bytes to prevent compiler arith probs.
 *	All multi-byte fields are stored low-byte first.
 * This struct is configured for binary compatibility with ROM data!
 */

typedef struct hdparm_s {
	unsigned char	ncyl[2];	/* number of cylinders */
	unsigned char	nhead;		/* number heads */
	unsigned char	rwccp[2];	/* reduced write curr cyl */
	unsigned char	wpcc[2];	/* write pre-compensation cyl */
	unsigned char	eccl;		/* max ecc data length */
	unsigned char	ctrl;		/* control byte */
	unsigned char	fill2[3];
	unsigned char	landc[2];	/* landing zone cylinder */
	unsigned char	nspt;		/* number of sectors per track */
	unsigned char	hdfill3;
} hdparm_t;


/* Macro for initializing drive parameter tables. */

#define _HDPARMS(cyl,hd,spt,ctl,pcomp)	{ \
	{ (cyl) & 0xFF, (cyl) >> 8 }, hd, { 0, 0 }, \
	{ (pcomp) & 0xFF, (pcomp) >> 8 }, 0, ctl, \
	{ 0, 0, 0 }, { 0 , 0 }, spt, 0 }


/* Convert from a 2-element unsigned char array to unsigned short. */
/* Copy number into a 2-element unsigned char array. */

#if	_I386

#define _CHAR2_TO_USHORT(c_array)	(* (unsigned short *) (c_array))
#define	_NUM_TO_CHAR2(c_array, num)	(* (unsigned short *) (c_array) = (num))

#else

#define _CHAR2_TO_USHORT(c_array)	\
	((unsigned short) ((c_array)[1] << 8) | (c_array)[0])
/#define _NUM_TO_CHAR2(c_array, num) \
	(((c_array)[0] = (num) & 0xFF), ((c_array)[1] = (num) >> 8))

#endif


#if	_KERNEL
#define N_ATDRV	2U			/* only two drives supported */
#endif

#endif /* ! defined (__SYS_HDIOCTL_H__) */