1 /*+M*************************************************************************
 
   2  * Perceptive Solutions, Inc. PSI-240I device driver proc support for Linux.
 
   4  * Copyright (c) 1997 Perceptive Solutions, Inc.
 
   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)
 
  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.
 
  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.
 
  21  *      File Name:              psi240i.h
 
  23  *      Description:    Header file for the SCSI driver for the PSI240I
 
  24  *                                      EIDE interface card.
 
  26  *-M*************************************************************************/
 
  30 #include <linux/types.h>
 
  32 #ifndef PSI_EIDE_SCSIOP
 
  33 #define PSI_EIDE_SCSIOP 1
 
  35 /************************************************/
 
  36 /*              Some defines that we like                               */
 
  37 /************************************************/
 
  39 #define UCHAR           unsigned char
 
  41 #define USHORT          unsigned short
 
  42 #define BOOL            unsigned short
 
  44 #define ULONG           unsigned long
 
  47 /************************************************/
 
  48 /*              Timeout konstants                                               */
 
  49 /************************************************/
 
  50 #define TIMEOUT_READY                           10              // 100 mSec
 
  51 #define TIMEOUT_DRQ                                     40              // 400 mSec
 
  53 /************************************************/
 
  55 /************************************************/
 
  56 #define ANY2SCSI(up, p)                                 \
 
  57 ((UCHAR *)up)[0] = (((ULONG)(p)) >> 8); \
 
  58 ((UCHAR *)up)[1] = ((ULONG)(p));
 
  60 #define SCSI2LONG(up)                                   \
 
  61 ( (((long)*(((UCHAR *)up))) << 16)              \
 
  62 + (((long)(((UCHAR *)up)[1])) << 8)             \
 
  63 + ((long)(((UCHAR *)up)[2])) )
 
  65 #define XANY2SCSI(up, p)                                \
 
  66 ((UCHAR *)up)[0] = ((long)(p)) >> 24;   \
 
  67 ((UCHAR *)up)[1] = ((long)(p)) >> 16;   \
 
  68 ((UCHAR *)up)[2] = ((long)(p)) >> 8;    \
 
  69 ((UCHAR *)up)[3] = ((long)(p));
 
  71 #define XSCSI2LONG(up)                                  \
 
  72 ( (((long)(((UCHAR *)up)[0])) << 24)    \
 
  73 + (((long)(((UCHAR *)up)[1])) << 16)    \
 
  74 + (((long)(((UCHAR *)up)[2])) <<  8)    \
 
  75 + ((long)(((UCHAR *)up)[3])) )
 
  77 /************************************************/
 
  78 /*              SCSI CDB operation codes                                */
 
  79 /************************************************/
 
  80 #define SCSIOP_TEST_UNIT_READY          0x00
 
  81 #define SCSIOP_REZERO_UNIT                      0x01
 
  82 #define SCSIOP_REWIND                           0x01
 
  83 #define SCSIOP_REQUEST_BLOCK_ADDR       0x02
 
  84 #define SCSIOP_REQUEST_SENSE            0x03
 
  85 #define SCSIOP_FORMAT_UNIT                      0x04
 
  86 #define SCSIOP_READ_BLOCK_LIMITS        0x05
 
  87 #define SCSIOP_REASSIGN_BLOCKS          0x07
 
  88 #define SCSIOP_READ6                            0x08
 
  89 #define SCSIOP_RECEIVE                          0x08
 
  90 #define SCSIOP_WRITE6                           0x0A
 
  91 #define SCSIOP_PRINT                            0x0A
 
  92 #define SCSIOP_SEND                                     0x0A
 
  93 #define SCSIOP_SEEK6                            0x0B
 
  94 #define SCSIOP_TRACK_SELECT                     0x0B
 
  95 #define SCSIOP_SLEW_PRINT                       0x0B
 
  96 #define SCSIOP_SEEK_BLOCK                       0x0C
 
  97 #define SCSIOP_PARTITION                        0x0D
 
  98 #define SCSIOP_READ_REVERSE                     0x0F
 
  99 #define SCSIOP_WRITE_FILEMARKS          0x10
 
 100 #define SCSIOP_FLUSH_BUFFER                     0x10
 
 101 #define SCSIOP_SPACE                            0x11
 
 102 #define SCSIOP_INQUIRY                          0x12
 
 103 #define SCSIOP_VERIFY6                          0x13
 
 104 #define SCSIOP_RECOVER_BUF_DATA         0x14
 
 105 #define SCSIOP_MODE_SELECT                      0x15
 
 106 #define SCSIOP_RESERVE_UNIT                     0x16
 
 107 #define SCSIOP_RELEASE_UNIT                     0x17
 
 108 #define SCSIOP_COPY                                     0x18
 
 109 #define SCSIOP_ERASE                            0x19
 
 110 #define SCSIOP_MODE_SENSE                       0x1A
 
 111 #define SCSIOP_START_STOP_UNIT          0x1B
 
 112 #define SCSIOP_STOP_PRINT                       0x1B
 
 113 #define SCSIOP_LOAD_UNLOAD                      0x1B
 
 114 #define SCSIOP_RECEIVE_DIAGNOSTIC       0x1C
 
 115 #define SCSIOP_SEND_DIAGNOSTIC          0x1D
 
 116 #define SCSIOP_MEDIUM_REMOVAL           0x1E
 
 117 #define SCSIOP_READ_CAPACITY            0x25
 
 118 #define SCSIOP_READ                                     0x28
 
 119 #define SCSIOP_WRITE                            0x2A
 
 120 #define SCSIOP_SEEK                                     0x2B
 
 121 #define SCSIOP_LOCATE                           0x2B
 
 122 #define SCSIOP_WRITE_VERIFY                     0x2E
 
 123 #define SCSIOP_VERIFY                           0x2F
 
 124 #define SCSIOP_SEARCH_DATA_HIGH         0x30
 
 125 #define SCSIOP_SEARCH_DATA_EQUAL        0x31
 
 126 #define SCSIOP_SEARCH_DATA_LOW          0x32
 
 127 #define SCSIOP_SET_LIMITS                       0x33
 
 128 #define SCSIOP_READ_POSITION            0x34
 
 129 #define SCSIOP_SYNCHRONIZE_CACHE        0x35
 
 130 #define SCSIOP_COMPARE                          0x39
 
 131 #define SCSIOP_COPY_COMPARE                     0x3A
 
 132 #define SCSIOP_WRITE_DATA_BUFF          0x3B
 
 133 #define SCSIOP_READ_DATA_BUFF           0x3C
 
 134 #define SCSIOP_CHANGE_DEFINITION        0x40
 
 135 #define SCSIOP_READ_SUB_CHANNEL         0x42
 
 136 #define SCSIOP_READ_TOC                         0x43
 
 137 #define SCSIOP_READ_HEADER                      0x44
 
 138 #define SCSIOP_PLAY_AUDIO                       0x45
 
 139 #define SCSIOP_PLAY_AUDIO_MSF           0x47
 
 140 #define SCSIOP_PLAY_TRACK_INDEX         0x48
 
 141 #define SCSIOP_PLAY_TRACK_RELATIVE      0x49
 
 142 #define SCSIOP_PAUSE_RESUME                     0x4B
 
 143 #define SCSIOP_LOG_SELECT                       0x4C
 
 144 #define SCSIOP_LOG_SENSE                        0x4D
 
 145 #define SCSIOP_MODE_SELECT10            0x55
 
 146 #define SCSIOP_MODE_SENSE10                     0x5A
 
 147 #define SCSIOP_LOAD_UNLOAD_SLOT         0xA6
 
 148 #define SCSIOP_MECHANISM_STATUS         0xBD
 
 149 #define SCSIOP_READ_CD                          0xBE
 
 151 // IDE command definitions
 
 152 #define IDE_COMMAND_ATAPI_RESET         0x08
 
 153 #define IDE_COMMAND_READ                        0x20
 
 154 #define IDE_COMMAND_WRITE                       0x30
 
 155 #define IDE_COMMAND_RECALIBRATE         0x10
 
 156 #define IDE_COMMAND_SEEK                        0x70
 
 157 #define IDE_COMMAND_SET_PARAMETERS      0x91
 
 158 #define IDE_COMMAND_VERIFY                      0x40
 
 159 #define IDE_COMMAND_ATAPI_PACKET        0xA0
 
 160 #define IDE_COMMAND_ATAPI_IDENTIFY      0xA1
 
 161 #define IDE_CMD_READ_MULTIPLE           0xC4
 
 162 #define IDE_CMD_WRITE_MULTIPLE          0xC5
 
 163 #define IDE_CMD_SET_MULTIPLE            0xC6
 
 164 #define IDE_COMMAND_WRITE_DMA           0xCA
 
 165 #define IDE_COMMAND_READ_DMA            0xC8
 
 166 #define IDE_COMMAND_IDENTIFY            0xEC
 
 168 // IDE status definitions
 
 169 #define IDE_STATUS_ERROR                        0x01
 
 170 #define IDE_STATUS_INDEX                        0x02
 
 171 #define IDE_STATUS_CORRECTED_ERROR      0x04
 
 172 #define IDE_STATUS_DRQ                          0x08
 
 173 #define IDE_STATUS_DSC                          0x10
 
 174 #define IDE_STATUS_WRITE_FAULT          0x20
 
 175 #define IDE_STATUS_DRDY                         0x40
 
 176 #define IDE_STATUS_BUSY                         0x80
 
 178 // IDE error definitions
 
 179 #define IDE_ERROR_AMNF                          0x01
 
 180 #define IDE_ERROR_TKONF                         0x02
 
 181 #define IDE_ERROR_ABRT                          0x04
 
 182 #define IDE_ERROR_MCR                           0x08
 
 183 #define IDE_ERROR_IDFN                          0x10
 
 184 #define IDE_ERROR_MC                            0x20
 
 185 #define IDE_ERROR_UNC                           0x40
 
 186 #define IDE_ERROR_BBK                           0x80
 
 188 //      IDE interface structure
 
 189 typedef struct _IDE_STRUCT
 
 205 // SCSI read capacity structure
 
 206 typedef struct _READ_CAPACITY_DATA
 
 208         ULONG blks;                             /* total blocks (converted to little endian) */
 
 209         ULONG blksiz;                   /* size of each (converted to little endian) */
 
 210         }       READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
 
 215 typedef struct _INQUIRYDATA
 
 218         UCHAR DeviceTypeQualifier       :3;
 
 219         UCHAR DeviceTypeModifier        :7;
 
 220         UCHAR RemovableMedia            :1;
 
 222     UCHAR ResponseDataFormat;
 
 223     UCHAR AdditionalLength;
 
 226         UCHAR CommandQueue                      :1;
 
 228         UCHAR LinkedCommands            :1;
 
 229         UCHAR Synchronous                       :1;
 
 232         UCHAR RelativeAddressing        :1;
 
 235     UCHAR ProductRevisionLevel[4];
 
 236     UCHAR VendorSpecific[20];
 
 238         }       INQUIRYDATA, *PINQUIRYDATA;
 
 242 typedef struct _IDENTIFY_DATA
 
 244     USHORT GeneralConfiguration;            // 00
 
 245     USHORT NumberOfCylinders;               // 02
 
 246     USHORT Reserved1;                       // 04
 
 247     USHORT NumberOfHeads;                   // 06
 
 248     USHORT UnformattedBytesPerTrack;        // 08
 
 249     USHORT UnformattedBytesPerSector;       // 0A
 
 250     USHORT SectorsPerTrack;                 // 0C
 
 251     USHORT VendorUnique1[3];                // 0E
 
 252     USHORT SerialNumber[10];                // 14
 
 253     USHORT BufferType;                      // 28
 
 254     USHORT BufferSectorSize;                // 2A
 
 255     USHORT NumberOfEccBytes;                // 2C
 
 256     USHORT FirmwareRevision[4];             // 2E
 
 257     USHORT ModelNumber[20];                 // 36
 
 258     UCHAR  MaximumBlockTransfer;            // 5E
 
 259     UCHAR  VendorUnique2;                   // 5F
 
 260     USHORT DoubleWordIo;                    // 60
 
 261     USHORT Capabilities;                    // 62
 
 262     USHORT Reserved2;                       // 64
 
 263     UCHAR  VendorUnique3;                   // 66
 
 264     UCHAR  PioCycleTimingMode;              // 67
 
 265     UCHAR  VendorUnique4;                   // 68
 
 266     UCHAR  DmaCycleTimingMode;              // 69
 
 267     USHORT TranslationFieldsValid:1;        // 6A
 
 269     USHORT NumberOfCurrentCylinders;        // 6C
 
 270     USHORT NumberOfCurrentHeads;            // 6E
 
 271     USHORT CurrentSectorsPerTrack;          // 70
 
 272     ULONG  CurrentSectorCapacity;           // 72
 
 273     USHORT Reserved4[197];                  // 76
 
 274         }       IDENTIFY_DATA, *PIDENTIFY_DATA;
 
 276 // Identify data without the Reserved4.
 
 277 typedef struct _IDENTIFY_DATA2 {
 
 278     USHORT GeneralConfiguration;            // 00
 
 279     USHORT NumberOfCylinders;               // 02
 
 280     USHORT Reserved1;                       // 04
 
 281     USHORT NumberOfHeads;                   // 06
 
 282     USHORT UnformattedBytesPerTrack;        // 08
 
 283     USHORT UnformattedBytesPerSector;       // 0A
 
 284     USHORT SectorsPerTrack;                 // 0C
 
 285     USHORT VendorUnique1[3];                // 0E
 
 286     USHORT SerialNumber[10];                // 14
 
 287     USHORT BufferType;                      // 28
 
 288     USHORT BufferSectorSize;                // 2A
 
 289     USHORT NumberOfEccBytes;                // 2C
 
 290     USHORT FirmwareRevision[4];             // 2E
 
 291     USHORT ModelNumber[20];                 // 36
 
 292     UCHAR  MaximumBlockTransfer;            // 5E
 
 293     UCHAR  VendorUnique2;                   // 5F
 
 294     USHORT DoubleWordIo;                    // 60
 
 295     USHORT Capabilities;                    // 62
 
 296     USHORT Reserved2;                       // 64
 
 297     UCHAR  VendorUnique3;                   // 66
 
 298     UCHAR  PioCycleTimingMode;              // 67
 
 299     UCHAR  VendorUnique4;                   // 68
 
 300     UCHAR  DmaCycleTimingMode;              // 69
 
 301         USHORT TranslationFieldsValid:1;        // 6A
 
 303     USHORT NumberOfCurrentCylinders;        // 6C
 
 304     USHORT NumberOfCurrentHeads;            // 6E
 
 305     USHORT CurrentSectorsPerTrack;          // 70
 
 306     ULONG  CurrentSectorCapacity;           // 72
 
 307         }       IDENTIFY_DATA2, *PIDENTIFY_DATA2;
 
 309 #endif  // PSI_EIDE_SCSIOP
 
 311 // function prototypes
 
 312 int Psi240i_Command                     (Scsi_Cmnd *SCpnt);
 
 313 int Psi240i_Abort                       (Scsi_Cmnd *SCpnt);
 
 314 int Psi240i_Reset                       (Scsi_Cmnd *SCpnt, unsigned int flags);