1/*+M*************************************************************************
2 * Perceptive Solutions, Inc. PSI-240I device driver proc support for Linux.
3 *
4 * Copyright (c) 1997 Perceptive Solutions, Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; see the file COPYING.  If not, write to
18 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
19 *
20 *
21 *	File Name:		psi240i.h
22 *
23 *	Description:	Header file for the SCSI driver for the PSI240I
24 *					EIDE interface card.
25 *
26 *-M*************************************************************************/
27#ifndef _PSI240I_H
28#define _PSI240I_H
29
30#include <linux/types.h>
31#include <linux/kdev_t.h>
32
33#ifndef	PSI_EIDE_SCSIOP
34#define	PSI_EIDE_SCSIOP	1
35
36/************************************************/
37/*		Some defines that we like 				*/
38/************************************************/
39#define	CHAR		char
40#define	UCHAR		unsigned char
41#define	SHORT		short
42#define	USHORT		unsigned short
43#define	BOOL		unsigned short
44#define	LONG		long
45#define	ULONG		unsigned long
46#define	VOID		void
47
48/************************************************/
49/*		Timeout konstants		 				*/
50/************************************************/
51#define	TIMEOUT_READY				10		// 100 mSec
52#define	TIMEOUT_DRQ					40		// 400 mSec
53
54/************************************************/
55/*		Misc. macros			 				*/
56/************************************************/
57#define ANY2SCSI(up, p)					\
58((UCHAR *)up)[0] = (((ULONG)(p)) >> 8);	\
59((UCHAR *)up)[1] = ((ULONG)(p));
60
61#define SCSI2LONG(up)					\
62( (((long)*(((UCHAR *)up))) << 16)		\
63+ (((long)(((UCHAR *)up)[1])) << 8)		\
64+ ((long)(((UCHAR *)up)[2])) )
65
66#define XANY2SCSI(up, p)				\
67((UCHAR *)up)[0] = ((long)(p)) >> 24;	\
68((UCHAR *)up)[1] = ((long)(p)) >> 16;	\
69((UCHAR *)up)[2] = ((long)(p)) >> 8;	\
70((UCHAR *)up)[3] = ((long)(p));
71
72#define XSCSI2LONG(up)					\
73( (((long)(((UCHAR *)up)[0])) << 24)	\
74+ (((long)(((UCHAR *)up)[1])) << 16)	\
75+ (((long)(((UCHAR *)up)[2])) <<  8)	\
76+ ((long)(((UCHAR *)up)[3])) )
77
78/************************************************/
79/*		SCSI CDB operation codes 				*/
80/************************************************/
81#define SCSIOP_TEST_UNIT_READY		0x00
82#define SCSIOP_REZERO_UNIT			0x01
83#define SCSIOP_REWIND				0x01
84#define SCSIOP_REQUEST_BLOCK_ADDR	0x02
85#define SCSIOP_REQUEST_SENSE		0x03
86#define SCSIOP_FORMAT_UNIT			0x04
87#define SCSIOP_READ_BLOCK_LIMITS	0x05
88#define SCSIOP_REASSIGN_BLOCKS		0x07
89#define SCSIOP_READ6				0x08
90#define SCSIOP_RECEIVE				0x08
91#define SCSIOP_WRITE6				0x0A
92#define SCSIOP_PRINT				0x0A
93#define SCSIOP_SEND					0x0A
94#define SCSIOP_SEEK6				0x0B
95#define SCSIOP_TRACK_SELECT			0x0B
96#define SCSIOP_SLEW_PRINT			0x0B
97#define SCSIOP_SEEK_BLOCK			0x0C
98#define SCSIOP_PARTITION			0x0D
99#define SCSIOP_READ_REVERSE			0x0F
100#define SCSIOP_WRITE_FILEMARKS		0x10
101#define SCSIOP_FLUSH_BUFFER			0x10
102#define SCSIOP_SPACE				0x11
103#define SCSIOP_INQUIRY				0x12
104#define SCSIOP_VERIFY6				0x13
105#define SCSIOP_RECOVER_BUF_DATA		0x14
106#define SCSIOP_MODE_SELECT			0x15
107#define SCSIOP_RESERVE_UNIT			0x16
108#define SCSIOP_RELEASE_UNIT			0x17
109#define SCSIOP_COPY					0x18
110#define SCSIOP_ERASE				0x19
111#define SCSIOP_MODE_SENSE			0x1A
112#define SCSIOP_START_STOP_UNIT		0x1B
113#define SCSIOP_STOP_PRINT			0x1B
114#define SCSIOP_LOAD_UNLOAD			0x1B
115#define SCSIOP_RECEIVE_DIAGNOSTIC	0x1C
116#define SCSIOP_SEND_DIAGNOSTIC		0x1D
117#define SCSIOP_MEDIUM_REMOVAL		0x1E
118#define SCSIOP_READ_CAPACITY		0x25
119#define SCSIOP_READ					0x28
120#define SCSIOP_WRITE				0x2A
121#define SCSIOP_SEEK					0x2B
122#define SCSIOP_LOCATE				0x2B
123#define SCSIOP_WRITE_VERIFY			0x2E
124#define SCSIOP_VERIFY				0x2F
125#define SCSIOP_SEARCH_DATA_HIGH		0x30
126#define SCSIOP_SEARCH_DATA_EQUAL	0x31
127#define SCSIOP_SEARCH_DATA_LOW		0x32
128#define SCSIOP_SET_LIMITS			0x33
129#define SCSIOP_READ_POSITION		0x34
130#define SCSIOP_SYNCHRONIZE_CACHE	0x35
131#define SCSIOP_COMPARE				0x39
132#define SCSIOP_COPY_COMPARE			0x3A
133#define SCSIOP_WRITE_DATA_BUFF		0x3B
134#define SCSIOP_READ_DATA_BUFF		0x3C
135#define SCSIOP_CHANGE_DEFINITION	0x40
136#define SCSIOP_READ_SUB_CHANNEL		0x42
137#define SCSIOP_READ_TOC				0x43
138#define SCSIOP_READ_HEADER			0x44
139#define SCSIOP_PLAY_AUDIO			0x45
140#define SCSIOP_PLAY_AUDIO_MSF		0x47
141#define SCSIOP_PLAY_TRACK_INDEX		0x48
142#define SCSIOP_PLAY_TRACK_RELATIVE	0x49
143#define SCSIOP_PAUSE_RESUME			0x4B
144#define SCSIOP_LOG_SELECT			0x4C
145#define SCSIOP_LOG_SENSE			0x4D
146#define SCSIOP_MODE_SELECT10		0x55
147#define SCSIOP_MODE_SENSE10			0x5A
148#define SCSIOP_LOAD_UNLOAD_SLOT		0xA6
149#define SCSIOP_MECHANISM_STATUS		0xBD
150#define SCSIOP_READ_CD				0xBE
151
152// IDE command definitions
153#define IDE_COMMAND_ATAPI_RESET		0x08
154#define IDE_COMMAND_READ			0x20
155#define IDE_COMMAND_WRITE			0x30
156#define IDE_COMMAND_RECALIBRATE		0x10
157#define IDE_COMMAND_SEEK			0x70
158#define IDE_COMMAND_SET_PARAMETERS	0x91
159#define IDE_COMMAND_VERIFY			0x40
160#define IDE_COMMAND_ATAPI_PACKET	0xA0
161#define IDE_COMMAND_ATAPI_IDENTIFY	0xA1
162#define	IDE_CMD_READ_MULTIPLE		0xC4
163#define	IDE_CMD_WRITE_MULTIPLE		0xC5
164#define	IDE_CMD_SET_MULTIPLE		0xC6
165#define IDE_COMMAND_WRITE_DMA		0xCA
166#define IDE_COMMAND_READ_DMA		0xC8
167#define IDE_COMMAND_IDENTIFY		0xEC
168
169// IDE status definitions
170#define IDE_STATUS_ERROR			0x01
171#define IDE_STATUS_INDEX			0x02
172#define IDE_STATUS_CORRECTED_ERROR	0x04
173#define IDE_STATUS_DRQ				0x08
174#define IDE_STATUS_DSC				0x10
175#define	IDE_STATUS_WRITE_FAULT		0x20
176#define IDE_STATUS_DRDY				0x40
177#define IDE_STATUS_BUSY				0x80
178
179// IDE error definitions
180#define	IDE_ERROR_AMNF				0x01
181#define	IDE_ERROR_TKONF				0x02
182#define	IDE_ERROR_ABRT				0x04
183#define	IDE_ERROR_MCR				0x08
184#define	IDE_ERROR_IDFN				0x10
185#define	IDE_ERROR_MC				0x20
186#define	IDE_ERROR_UNC				0x40
187#define	IDE_ERROR_BBK				0x80
188
189//	IDE interface structure
190typedef struct _IDE_STRUCT
191	{
192	union
193		{
194		UCHAR	ide[9];
195		struct
196			{
197			USHORT	data;
198			UCHAR	sectors;
199			UCHAR	lba[4];
200			UCHAR	cmd;
201			UCHAR	spigot;
202			}	ides;
203		} ide;
204	}	IDE_STRUCT;
205
206// SCSI read capacity structure
207typedef	struct _READ_CAPACITY_DATA
208	{
209	ULONG blks;				/* total blocks (converted to little endian) */
210	ULONG blksiz;			/* size of each (converted to little endian) */
211	}	READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
212
213// SCSI inquiry data
214#ifndef HOSTS_C
215
216typedef struct _INQUIRYDATA
217	{
218	UCHAR DeviceType			:5;
219	UCHAR DeviceTypeQualifier	:3;
220	UCHAR DeviceTypeModifier	:7;
221	UCHAR RemovableMedia		:1;
222    UCHAR Versions;
223    UCHAR ResponseDataFormat;
224    UCHAR AdditionalLength;
225    UCHAR Reserved[2];
226	UCHAR SoftReset				:1;
227	UCHAR CommandQueue			:1;
228	UCHAR Reserved2				:1;
229	UCHAR LinkedCommands		:1;
230	UCHAR Synchronous			:1;
231	UCHAR Wide16Bit				:1;
232	UCHAR Wide32Bit				:1;
233	UCHAR RelativeAddressing	:1;
234    UCHAR VendorId[8];
235    UCHAR ProductId[16];
236    UCHAR ProductRevisionLevel[4];
237    UCHAR VendorSpecific[20];
238    UCHAR Reserved3[40];
239	}	INQUIRYDATA, *PINQUIRYDATA;
240#endif
241
242// IDE IDENTIFY data
243typedef struct _IDENTIFY_DATA
244	{
245    USHORT GeneralConfiguration;            // 00
246    USHORT NumberOfCylinders;               // 02
247    USHORT Reserved1;                       // 04
248    USHORT NumberOfHeads;                   // 06
249    USHORT UnformattedBytesPerTrack;        // 08
250    USHORT UnformattedBytesPerSector;       // 0A
251    USHORT SectorsPerTrack;                 // 0C
252    USHORT VendorUnique1[3];                // 0E
253    USHORT SerialNumber[10];                // 14
254    USHORT BufferType;                      // 28
255    USHORT BufferSectorSize;                // 2A
256    USHORT NumberOfEccBytes;                // 2C
257    USHORT FirmwareRevision[4];             // 2E
258    USHORT ModelNumber[20];                 // 36
259    UCHAR  MaximumBlockTransfer;            // 5E
260    UCHAR  VendorUnique2;                   // 5F
261    USHORT DoubleWordIo;                    // 60
262    USHORT Capabilities;                    // 62
263    USHORT Reserved2;                       // 64
264    UCHAR  VendorUnique3;                   // 66
265    UCHAR  PioCycleTimingMode;              // 67
266    UCHAR  VendorUnique4;                   // 68
267    UCHAR  DmaCycleTimingMode;              // 69
268    USHORT TranslationFieldsValid:1;        // 6A
269    USHORT Reserved3:15;
270    USHORT NumberOfCurrentCylinders;        // 6C
271    USHORT NumberOfCurrentHeads;            // 6E
272    USHORT CurrentSectorsPerTrack;          // 70
273    ULONG  CurrentSectorCapacity;           // 72
274    USHORT Reserved4[197];                  // 76
275	}	IDENTIFY_DATA, *PIDENTIFY_DATA;
276
277// Identify data without the Reserved4.
278typedef struct _IDENTIFY_DATA2 {
279    USHORT GeneralConfiguration;            // 00
280    USHORT NumberOfCylinders;               // 02
281    USHORT Reserved1;                       // 04
282    USHORT NumberOfHeads;                   // 06
283    USHORT UnformattedBytesPerTrack;        // 08
284    USHORT UnformattedBytesPerSector;       // 0A
285    USHORT SectorsPerTrack;                 // 0C
286    USHORT VendorUnique1[3];                // 0E
287    USHORT SerialNumber[10];                // 14
288    USHORT BufferType;                      // 28
289    USHORT BufferSectorSize;                // 2A
290    USHORT NumberOfEccBytes;                // 2C
291    USHORT FirmwareRevision[4];             // 2E
292    USHORT ModelNumber[20];                 // 36
293    UCHAR  MaximumBlockTransfer;            // 5E
294    UCHAR  VendorUnique2;                   // 5F
295    USHORT DoubleWordIo;                    // 60
296    USHORT Capabilities;                    // 62
297    USHORT Reserved2;                       // 64
298    UCHAR  VendorUnique3;                   // 66
299    UCHAR  PioCycleTimingMode;              // 67
300    UCHAR  VendorUnique4;                   // 68
301    UCHAR  DmaCycleTimingMode;              // 69
302	USHORT TranslationFieldsValid:1;     	// 6A
303    USHORT Reserved3:15;
304    USHORT NumberOfCurrentCylinders;        // 6C
305    USHORT NumberOfCurrentHeads;            // 6E
306    USHORT CurrentSectorsPerTrack;          // 70
307    ULONG  CurrentSectorCapacity;           // 72
308	}	IDENTIFY_DATA2, *PIDENTIFY_DATA2;
309
310#endif	// PSI_EIDE_SCSIOP
311
312// function prototypes
313int Psi240i_Detect			(Scsi_Host_Template *tpnt);
314int Psi240i_Command			(Scsi_Cmnd *SCpnt);
315int Psi240i_QueueCommand	(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
316int Psi240i_Abort			(Scsi_Cmnd *SCpnt);
317int Psi240i_Reset			(Scsi_Cmnd *SCpnt, unsigned int flags);
318int Psi240i_BiosParam		(Disk *disk, kdev_t dev, int geom[]);
319
320#ifndef NULL
321	#define NULL 0
322#endif
323
324#define PSI240I { proc_name:      "psi240i", \
325		  name:           "PSI-240I EIDE Disk Controller",\
326		  detect:         Psi240i_Detect,			\
327		  command:	  Psi240i_Command,			\
328		  queuecommand:	  Psi240i_QueueCommand,		\
329		  abort:	  Psi240i_Abort,			\
330		  reset:	  Psi240i_Reset,			\
331		  bios_param:	  Psi240i_BiosParam,                 	\
332		  can_queue:	  1, 					\
333		  this_id:	  -1, 					\
334		  sg_tablesize:	  SG_NONE,		 		\
335		  cmd_per_lun:	  1, 					\
336		  use_clustering: DISABLE_CLUSTERING }
337
338#endif
339