1/************************************************************************** 2 * Initio 9100 device driver for Linux. 3 * 4 * Copyright (c) 1994-1998 Initio Corporation 5 * All rights reserved. 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2, or (at your option) 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; see the file COPYING. If not, write to 19 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 20 * 21 * -------------------------------------------------------------------------- 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the above copyright 27 * notice, this list of conditions, and the following disclaimer, 28 * without modification, immediately at the beginning of the file. 29 * 2. Redistributions in binary form must reproduce the above copyright 30 * notice, this list of conditions and the following disclaimer in the 31 * documentation and/or other materials provided with the distribution. 32 * 3. The name of the author may not be used to endorse or promote products 33 * derived from this software without specific prior written permission. 34 * 35 * Where this Software is combined with software released under the terms of 36 * the GNU General Public License ("GPL") and the terms of the GPL would require the 37 * combined work to also be released under the terms of the GPL, the terms 38 * and conditions of this License will apply in addition to those of the 39 * GPL with the exception of any terms or conditions of this License that 40 * conflict with, or are expressly prohibited by, the GPL. 41 * 42 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 45 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 46 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 52 * SUCH DAMAGE. 53 * 54 ************************************************************************* 55 * 56 * Module: ini9100u.h 57 * Description: INI-9100U/UW LINUX device driver header 58 * Revision History: 59 * 06/18/96 Harry Chen, Initial Version 1.00A (Beta) 60 * 06/23/98 hc - v1.01k 61 * - Get it work for kernel version >= 2.1.75 62 * 12/09/98 bv - v1.03a 63 * - Removed unused code 64 * 12/13/98 bv - v1.03b 65 * - Add spinlocks to HCS structure. 66 * 21/01/99 bv - v1.03e 67 * - Added PCI_ID structure 68 **************************************************************************/ 69 70#ifndef CVT_LINUX_VERSION 71#define CVT_LINUX_VERSION(V,P,S) (((V) * 65536) + ((P) * 256) + (S)) 72#endif 73 74#ifndef LINUX_VERSION_CODE 75#include <linux/version.h> 76#endif 77#include <linux/types.h> 78 79#include "sd.h" 80 81extern int i91u_detect(Scsi_Host_Template *); 82extern int i91u_release(struct Scsi_Host *); 83extern int i91u_command(Scsi_Cmnd *); 84extern int i91u_queue(Scsi_Cmnd *, void (*done) (Scsi_Cmnd *)); 85extern int i91u_abort(Scsi_Cmnd *); 86extern int i91u_reset(Scsi_Cmnd *, unsigned int); 87extern int i91u_biosparam(Scsi_Disk *, kdev_t, int *); /*for linux v2.0 */ 88 89#define i91u_REVID "Initio INI-9X00U/UW SCSI device driver; Revision: 1.03g" 90 91#define INI9100U { \ 92 next: NULL, \ 93 module: NULL, \ 94 proc_name: "INI9100U", \ 95 proc_info: NULL, \ 96 name: i91u_REVID, \ 97 detect: i91u_detect, \ 98 release: i91u_release, \ 99 info: NULL, \ 100 command: i91u_command, \ 101 queuecommand: i91u_queue, \ 102 eh_strategy_handler: NULL, \ 103 eh_abort_handler: NULL, \ 104 eh_device_reset_handler: NULL, \ 105 eh_bus_reset_handler: NULL, \ 106 eh_host_reset_handler: NULL, \ 107 abort: i91u_abort, \ 108 reset: i91u_reset, \ 109 slave_attach: NULL, \ 110 bios_param: i91u_biosparam, \ 111 can_queue: 1, \ 112 this_id: 1, \ 113 sg_tablesize: SG_ALL, \ 114 cmd_per_lun: 1, \ 115 present: 0, \ 116 unchecked_isa_dma: 0, \ 117 use_clustering: ENABLE_CLUSTERING, \ 118 use_new_eh_code: 0 \ 119} 120 121#define VIRT_TO_BUS(i) (unsigned int) virt_to_bus((void *)(i)) 122#define ULONG unsigned long 123#define USHORT unsigned short 124#define UCHAR unsigned char 125#define BYTE u8 126#define WORD unsigned short 127#define DWORD unsigned long 128#define UBYTE u8 129#define UWORD unsigned short 130#define UDWORD unsigned long 131#define U32 u32 132 133#ifndef NULL 134#define NULL 0 /* zero */ 135#endif 136#ifndef TRUE 137#define TRUE (1) /* boolean true */ 138#endif 139#ifndef FALSE 140#define FALSE (0) /* boolean false */ 141#endif 142#ifndef FAILURE 143#define FAILURE (-1) 144#endif 145 146#define i91u_MAXQUEUE 2 147#define TOTAL_SG_ENTRY 32 148#define MAX_TARGETS 16 149#define SENSE_SIZE 14 150 151#define INI_VENDOR_ID 0x1101 /* Initio's PCI vendor ID */ 152#define DMX_VENDOR_ID 0x134a /* Domex's PCI vendor ID */ 153#define I950_DEVICE_ID 0x9500 /* Initio's inic-950 product ID */ 154#define I940_DEVICE_ID 0x9400 /* Initio's inic-940 product ID */ 155#define I935_DEVICE_ID 0x9401 /* Initio's inic-935 product ID */ 156#define I920_DEVICE_ID 0x0002 /* Initio's other product ID */ 157 158/************************************************************************/ 159/* Vendor ID/Device ID Pair Structure */ 160/************************************************************************/ 161typedef struct PCI_ID_Struc { 162 unsigned short vendor_id; 163 unsigned short device_id; 164} PCI_ID; 165 166/************************************************************************/ 167/* Scatter-Gather Element Structure */ 168/************************************************************************/ 169typedef struct SG_Struc { 170 U32 SG_Ptr; /* Data Pointer */ 171 U32 SG_Len; /* Data Length */ 172} SG; 173 174/*********************************************************************** 175 SCSI Control Block 176************************************************************************/ 177typedef struct Scsi_Ctrl_Blk { 178 U32 SCB_InitioReserved[9]; /* 0 */ 179 180 UBYTE SCB_Opcode; /*24 SCB command code */ 181 UBYTE SCB_Flags; /*25 SCB Flags */ 182 UBYTE SCB_Target; /*26 Target Id */ 183 UBYTE SCB_Lun; /*27 Lun */ 184 U32 SCB_BufPtr; /*28 Data Buffer Pointer */ 185 U32 SCB_BufLen; /*2C Data Allocation Length */ 186 UBYTE SCB_SGLen; /*30 SG list # */ 187 UBYTE SCB_SenseLen; /*31 Sense Allocation Length */ 188 UBYTE SCB_HaStat; /*32 */ 189 UBYTE SCB_TaStat; /*33 */ 190 UBYTE SCB_CDBLen; /*34 CDB Length */ 191 UBYTE SCB_Ident; /*35 Identify */ 192 UBYTE SCB_TagMsg; /*36 Tag Message */ 193 UBYTE SCB_TagId; /*37 Queue Tag */ 194 UBYTE SCB_CDB[12]; /*38 */ 195 U32 SCB_SGPAddr; /*44 SG List/Sense Buf phy. Addr. */ 196 U32 SCB_SensePtr; /*48 Sense data pointer */ 197 void (*SCB_Post) (BYTE *, BYTE *); /*4C POST routine */ 198 Scsi_Cmnd *SCB_Srb; /*50 SRB Pointer */ 199 SG SCB_SGList[TOTAL_SG_ENTRY]; /*54 Start of SG list */ 200} SCB; 201 202/* Opcodes of SCB_Opcode */ 203#define ExecSCSI 0x1 204#define BusDevRst 0x2 205#define AbortCmd 0x3 206 207/* Bit Definition for SCB_Flags */ 208#define SCF_DONE 0x01 209#define SCF_POST 0x02 210#define SCF_SENSE 0x04 211#define SCF_DIR 0x18 212#define SCF_NO_DCHK 0x00 213#define SCF_DIN 0x08 214#define SCF_DOUT 0x10 215#define SCF_NO_XF 0x18 216#define SCF_POLL 0x40 217#define SCF_SG 0x80 218 219/* Error Codes for SCB_HaStat */ 220#define HOST_SEL_TOUT 0x11 221#define HOST_DO_DU 0x12 222#define HOST_BUS_FREE 0x13 223#define HOST_BAD_PHAS 0x14 224#define HOST_INV_CMD 0x16 225#define HOST_SCSI_RST 0x1B 226#define HOST_DEV_RST 0x1C 227 228/* Error Codes for SCB_TaStat */ 229#define TARGET_CHKCOND 0x02 230#define TARGET_BUSY 0x08 231 232/* Queue tag msg: Simple_quque_tag, Head_of_queue_tag, Ordered_queue_tag */ 233#define MSG_STAG 0x20 234#define MSG_HTAG 0x21 235#define MSG_OTAG 0x22 236 237/*********************************************************************** 238 Target Device Control Structure 239**********************************************************************/ 240 241typedef struct Tar_Ctrl_Struc { 242 ULONG TCS_InitioReserved; /* 0 */ 243 244 UWORD TCS_DrvFlags; /* 4 */ 245 UBYTE TCS_DrvHead; /* 6 */ 246 UBYTE TCS_DrvSector; /* 7 */ 247} TCS; 248 249/*********************************************************************** 250 Target Device Control Structure 251**********************************************************************/ 252/* Bit Definition for TCF_DrvFlags */ 253#define TCF_DRV_255_63 0x0400 254 255/*********************************************************************** 256 Host Adapter Control Structure 257************************************************************************/ 258typedef struct Ha_Ctrl_Struc { 259 UWORD HCS_Base; /* 00 */ 260 UWORD HCS_BIOS; /* 02 */ 261 UBYTE HCS_Intr; /* 04 */ 262 UBYTE HCS_SCSI_ID; /* 05 */ 263 UBYTE HCS_MaxTar; /* 06 */ 264 UBYTE HCS_NumScbs; /* 07 */ 265 266 UBYTE HCS_Flags; /* 08 */ 267 UBYTE HCS_Index; /* 09 */ 268 UBYTE HCS_Reserved[2]; /* 0a */ 269 ULONG HCS_InitioReserved[27]; /* 0C */ 270 TCS HCS_Tcs[16]; /* 78 -> 16 Targets */ 271 Scsi_Cmnd *pSRB_head; /* SRB save queue header */ 272 Scsi_Cmnd *pSRB_tail; /* SRB save queue tail */ 273 spinlock_t HCS_AvailLock; 274 spinlock_t HCS_SemaphLock; 275 spinlock_t pSRB_lock; 276 struct pci_dev *pci_dev; 277} HCS; 278 279/* Bit Definition for HCB_Flags */ 280#define HCF_EXPECT_RESET 0x10 281 282/* SCSI related definition */ 283#define DISC_NOT_ALLOW 0x80 /* Disconnect is not allowed */ 284#define DISC_ALLOW 0xC0 /* Disconnect is allowed */ 285

