File: /usr/src/linux/drivers/scsi/psi240i.h

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
190     typedef 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
207     typedef	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     
216     typedef 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
243     typedef 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.
278     typedef 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
313     int Psi240i_Detect			(Scsi_Host_Template *tpnt);
314     int Psi240i_Command			(Scsi_Cmnd *SCpnt);
315     int Psi240i_QueueCommand	(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *));
316     int Psi240i_Abort			(Scsi_Cmnd *SCpnt);
317     int Psi240i_Reset			(Scsi_Cmnd *SCpnt, unsigned int flags);
318     int 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