xref: /openbmc/linux/drivers/scsi/a100u2w.c (revision 1da177e4)
1 /*
2  * Initio A100 device driver for Linux.
3  *
4  * Copyright (c) 1994-1998 Initio Corporation
5  * Copyright (c) 2003-2004 Christoph Hellwig
6  * All rights reserved.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2, or (at your option)
11  * any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; see the file COPYING.  If not, write to
20  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
21  *
22  * --------------------------------------------------------------------------
23  *
24  * Redistribution and use in source and binary forms, with or without
25  * modification, are permitted provided that the following conditions
26  * are met:
27  * 1. Redistributions of source code must retain the above copyright
28  *    notice, this list of conditions, and the following disclaimer,
29  *    without modification, immediately at the beginning of the file.
30  * 2. Redistributions in binary form must reproduce the above copyright
31  *    notice, this list of conditions and the following disclaimer in the
32  *    documentation and/or other materials provided with the distribution.
33  * 3. The name of the author may not be used to endorse or promote products
34  *    derived from this software without specific prior written permission.
35  *
36  * Where this Software is combined with software released under the terms of
37  * the GNU General Public License ("GPL") and the terms of the GPL would require the
38  * combined work to also be released under the terms of the GPL, the terms
39  * and conditions of this License will apply in addition to those of the
40  * GPL with the exception of any terms or conditions of this License that
41  * conflict with, or are expressly prohibited by, the GPL.
42  *
43  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
44  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
45  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
47  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
53  * SUCH DAMAGE.
54  */
55 
56 /*
57  * Revision History:
58  * 07/02/98 hl	- v.91n Initial drivers.
59  * 09/14/98 hl - v1.01 Support new Kernel.
60  * 09/22/98 hl - v1.01a Support reset.
61  * 09/24/98 hl - v1.01b Fixed reset.
62  * 10/05/98 hl - v1.02 split the source code and release.
63  * 12/19/98 bv - v1.02a Use spinlocks for 2.1.95 and up
64  * 01/31/99 bv - v1.02b Use mdelay instead of waitForPause
65  * 08/08/99 bv - v1.02c Use waitForPause again.
66  * 06/25/02 Doug Ledford <dledford@redhat.com> - v1.02d
67  *          - Remove limit on number of controllers
68  *          - Port to DMA mapping API
69  *          - Clean up interrupt handler registration
70  *          - Fix memory leaks
71  *          - Fix allocation of scsi host structs and private data
72  * 11/18/03 Christoph Hellwig <hch@lst.de>
73  *	    - Port to new probing API
74  *	    - Fix some more leaks in init failure cases
75  * 9/28/04 Christoph Hellwig <hch@lst.de>
76  *	    - merge the two source files
77  *	    - remove internal queueing code
78  */
79 
80 #include <linux/module.h>
81 #include <linux/errno.h>
82 #include <linux/delay.h>
83 #include <linux/interrupt.h>
84 #include <linux/pci.h>
85 #include <linux/init.h>
86 #include <linux/blkdev.h>
87 #include <linux/spinlock.h>
88 #include <linux/kernel.h>
89 #include <linux/string.h>
90 #include <linux/ioport.h>
91 #include <linux/slab.h>
92 
93 #include <asm/io.h>
94 #include <asm/irq.h>
95 
96 #include <scsi/scsi.h>
97 #include <scsi/scsi_cmnd.h>
98 #include <scsi/scsi_device.h>
99 #include <scsi/scsi_host.h>
100 
101 #include "a100u2w.h"
102 
103 
104 #define JIFFIES_TO_MS(t) ((t) * 1000 / HZ)
105 #define MS_TO_JIFFIES(j) ((j * HZ) / 1000)
106 
107 static ORC_SCB *orc_alloc_scb(ORC_HCS * hcsp);
108 static void inia100SCBPost(BYTE * pHcb, BYTE * pScb);
109 
110 static NVRAM nvram, *nvramp = &nvram;
111 static UCHAR dftNvRam[64] =
112 {
113 /*----------header -------------*/
114 	0x01,			/* 0x00: Sub System Vendor ID 0 */
115 	0x11,			/* 0x01: Sub System Vendor ID 1 */
116 	0x60,			/* 0x02: Sub System ID 0        */
117 	0x10,			/* 0x03: Sub System ID 1        */
118 	0x00,			/* 0x04: SubClass               */
119 	0x01,			/* 0x05: Vendor ID 0            */
120 	0x11,			/* 0x06: Vendor ID 1            */
121 	0x60,			/* 0x07: Device ID 0            */
122 	0x10,			/* 0x08: Device ID 1            */
123 	0x00,			/* 0x09: Reserved               */
124 	0x00,			/* 0x0A: Reserved               */
125 	0x01,			/* 0x0B: Revision of Data Structure     */
126 				/* -- Host Adapter Structure --- */
127 	0x01,			/* 0x0C: Number Of SCSI Channel */
128 	0x01,			/* 0x0D: BIOS Configuration 1   */
129 	0x00,			/* 0x0E: BIOS Configuration 2   */
130 	0x00,			/* 0x0F: BIOS Configuration 3   */
131 				/* --- SCSI Channel 0 Configuration --- */
132 	0x07,			/* 0x10: H/A ID                 */
133 	0x83,			/* 0x11: Channel Configuration  */
134 	0x20,			/* 0x12: MAX TAG per target     */
135 	0x0A,			/* 0x13: SCSI Reset Recovering time     */
136 	0x00,			/* 0x14: Channel Configuration4 */
137 	0x00,			/* 0x15: Channel Configuration5 */
138 				/* SCSI Channel 0 Target Configuration  */
139 				/* 0x16-0x25                    */
140 	0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
141 	0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
142 				/* --- SCSI Channel 1 Configuration --- */
143 	0x07,			/* 0x26: H/A ID                 */
144 	0x83,			/* 0x27: Channel Configuration  */
145 	0x20,			/* 0x28: MAX TAG per target     */
146 	0x0A,			/* 0x29: SCSI Reset Recovering time     */
147 	0x00,			/* 0x2A: Channel Configuration4 */
148 	0x00,			/* 0x2B: Channel Configuration5 */
149 				/* SCSI Channel 1 Target Configuration  */
150 				/* 0x2C-0x3B                    */
151 	0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
152 	0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8, 0xC8,
153 	0x00,			/* 0x3C: Reserved               */
154 	0x00,			/* 0x3D: Reserved               */
155 	0x00,			/* 0x3E: Reserved               */
156 	0x00			/* 0x3F: Checksum               */
157 };
158 
159 
160 /***************************************************************************/
161 static void waitForPause(unsigned amount)
162 {
163 	ULONG the_time = jiffies + MS_TO_JIFFIES(amount);
164 	while (time_before_eq(jiffies, the_time))
165 		cpu_relax();
166 }
167 
168 /***************************************************************************/
169 static UCHAR waitChipReady(ORC_HCS * hcsp)
170 {
171 	int i;
172 
173 	for (i = 0; i < 10; i++) {	/* Wait 1 second for report timeout     */
174 		if (ORC_RD(hcsp->HCS_Base, ORC_HCTRL) & HOSTSTOP)	/* Wait HOSTSTOP set */
175 			return 1;
176 		waitForPause(100);	/* wait 100ms before try again  */
177 	}
178 	return 0;
179 }
180 
181 /***************************************************************************/
182 static UCHAR waitFWReady(ORC_HCS * hcsp)
183 {
184 	int i;
185 
186 	for (i = 0; i < 10; i++) {	/* Wait 1 second for report timeout     */
187 		if (ORC_RD(hcsp->HCS_Base, ORC_HSTUS) & RREADY)		/* Wait READY set */
188 			return 1;
189 		waitForPause(100);	/* wait 100ms before try again  */
190 	}
191 	return 0;
192 }
193 
194 /***************************************************************************/
195 static UCHAR waitSCSIRSTdone(ORC_HCS * hcsp)
196 {
197 	int i;
198 
199 	for (i = 0; i < 10; i++) {	/* Wait 1 second for report timeout     */
200 		if (!(ORC_RD(hcsp->HCS_Base, ORC_HCTRL) & SCSIRST))	/* Wait SCSIRST done */
201 			return 1;
202 		waitForPause(100);	/* wait 100ms before try again  */
203 	}
204 	return 0;
205 }
206 
207 /***************************************************************************/
208 static UCHAR waitHDOoff(ORC_HCS * hcsp)
209 {
210 	int i;
211 
212 	for (i = 0; i < 10; i++) {	/* Wait 1 second for report timeout     */
213 		if (!(ORC_RD(hcsp->HCS_Base, ORC_HCTRL) & HDO))		/* Wait HDO off */
214 			return 1;
215 		waitForPause(100);	/* wait 100ms before try again  */
216 	}
217 	return 0;
218 }
219 
220 /***************************************************************************/
221 static UCHAR waitHDIset(ORC_HCS * hcsp, UCHAR * pData)
222 {
223 	int i;
224 
225 	for (i = 0; i < 10; i++) {	/* Wait 1 second for report timeout     */
226 		if ((*pData = ORC_RD(hcsp->HCS_Base, ORC_HSTUS)) & HDI)
227 			return 1;	/* Wait HDI set */
228 		waitForPause(100);	/* wait 100ms before try again  */
229 	}
230 	return 0;
231 }
232 
233 /***************************************************************************/
234 static unsigned short get_FW_version(ORC_HCS * hcsp)
235 {
236 	UCHAR bData;
237 	union {
238 		unsigned short sVersion;
239 		unsigned char cVersion[2];
240 	} Version;
241 
242 	ORC_WR(hcsp->HCS_Base + ORC_HDATA, ORC_CMD_VERSION);
243 	ORC_WR(hcsp->HCS_Base + ORC_HCTRL, HDO);
244 	if (waitHDOoff(hcsp) == 0)	/* Wait HDO off   */
245 		return 0;
246 
247 	if (waitHDIset(hcsp, &bData) == 0)	/* Wait HDI set   */
248 		return 0;
249 	Version.cVersion[0] = ORC_RD(hcsp->HCS_Base, ORC_HDATA);
250 	ORC_WR(hcsp->HCS_Base + ORC_HSTUS, bData);	/* Clear HDI            */
251 
252 	if (waitHDIset(hcsp, &bData) == 0)	/* Wait HDI set   */
253 		return 0;
254 	Version.cVersion[1] = ORC_RD(hcsp->HCS_Base, ORC_HDATA);
255 	ORC_WR(hcsp->HCS_Base + ORC_HSTUS, bData);	/* Clear HDI            */
256 
257 	return (Version.sVersion);
258 }
259 
260 /***************************************************************************/
261 static UCHAR set_NVRAM(ORC_HCS * hcsp, unsigned char address, unsigned char value)
262 {
263 	ORC_WR(hcsp->HCS_Base + ORC_HDATA, ORC_CMD_SET_NVM);	/* Write command */
264 	ORC_WR(hcsp->HCS_Base + ORC_HCTRL, HDO);
265 	if (waitHDOoff(hcsp) == 0)	/* Wait HDO off   */
266 		return 0;
267 
268 	ORC_WR(hcsp->HCS_Base + ORC_HDATA, address);	/* Write address */
269 	ORC_WR(hcsp->HCS_Base + ORC_HCTRL, HDO);
270 	if (waitHDOoff(hcsp) == 0)	/* Wait HDO off   */
271 		return 0;
272 
273 	ORC_WR(hcsp->HCS_Base + ORC_HDATA, value);	/* Write value  */
274 	ORC_WR(hcsp->HCS_Base + ORC_HCTRL, HDO);
275 	if (waitHDOoff(hcsp) == 0)	/* Wait HDO off   */
276 		return 0;
277 
278 	return 1;
279 }
280 
281 /***************************************************************************/
282 static UCHAR get_NVRAM(ORC_HCS * hcsp, unsigned char address, unsigned char *pDataIn)
283 {
284 	unsigned char bData;
285 
286 	ORC_WR(hcsp->HCS_Base + ORC_HDATA, ORC_CMD_GET_NVM);	/* Write command */
287 	ORC_WR(hcsp->HCS_Base + ORC_HCTRL, HDO);
288 	if (waitHDOoff(hcsp) == 0)	/* Wait HDO off   */
289 		return 0;
290 
291 	ORC_WR(hcsp->HCS_Base + ORC_HDATA, address);	/* Write address */
292 	ORC_WR(hcsp->HCS_Base + ORC_HCTRL, HDO);
293 	if (waitHDOoff(hcsp) == 0)	/* Wait HDO off   */
294 		return 0;
295 
296 	if (waitHDIset(hcsp, &bData) == 0)	/* Wait HDI set   */
297 		return 0;
298 	*pDataIn = ORC_RD(hcsp->HCS_Base, ORC_HDATA);
299 	ORC_WR(hcsp->HCS_Base + ORC_HSTUS, bData);	/* Clear HDI    */
300 
301 	return 1;
302 }
303 
304 /***************************************************************************/
305 static void orc_exec_scb(ORC_HCS * hcsp, ORC_SCB * scbp)
306 {
307 	scbp->SCB_Status = ORCSCB_POST;
308 	ORC_WR(hcsp->HCS_Base + ORC_PQUEUE, scbp->SCB_ScbIdx);
309 	return;
310 }
311 
312 
313 /***********************************************************************
314  Read SCSI H/A configuration parameters from serial EEPROM
315 ************************************************************************/
316 static int se2_rd_all(ORC_HCS * hcsp)
317 {
318 	int i;
319 	UCHAR *np, chksum = 0;
320 
321 	np = (UCHAR *) nvramp;
322 	for (i = 0; i < 64; i++, np++) {	/* <01> */
323 		if (get_NVRAM(hcsp, (unsigned char) i, np) == 0)
324 			return -1;
325 //      *np++ = get_NVRAM(hcsp, (unsigned char ) i);
326 	}
327 
328 /*------ Is ckecksum ok ? ------*/
329 	np = (UCHAR *) nvramp;
330 	for (i = 0; i < 63; i++)
331 		chksum += *np++;
332 
333 	if (nvramp->CheckSum != (UCHAR) chksum)
334 		return -1;
335 	return 1;
336 }
337 
338 /************************************************************************
339  Update SCSI H/A configuration parameters from serial EEPROM
340 *************************************************************************/
341 static void se2_update_all(ORC_HCS * hcsp)
342 {				/* setup default pattern  */
343 	int i;
344 	UCHAR *np, *np1, chksum = 0;
345 
346 	/* Calculate checksum first   */
347 	np = (UCHAR *) dftNvRam;
348 	for (i = 0; i < 63; i++)
349 		chksum += *np++;
350 	*np = chksum;
351 
352 	np = (UCHAR *) dftNvRam;
353 	np1 = (UCHAR *) nvramp;
354 	for (i = 0; i < 64; i++, np++, np1++) {
355 		if (*np != *np1) {
356 			set_NVRAM(hcsp, (unsigned char) i, *np);
357 		}
358 	}
359 	return;
360 }
361 
362 /*************************************************************************
363  Function name  : read_eeprom
364 **************************************************************************/
365 static void read_eeprom(ORC_HCS * hcsp)
366 {
367 	if (se2_rd_all(hcsp) != 1) {
368 		se2_update_all(hcsp);	/* setup default pattern        */
369 		se2_rd_all(hcsp);	/* load again                   */
370 	}
371 }
372 
373 
374 /***************************************************************************/
375 static UCHAR load_FW(ORC_HCS * hcsp)
376 {
377 	U32 dData;
378 	USHORT wBIOSAddress;
379 	USHORT i;
380 	UCHAR *pData, bData;
381 
382 
383 	bData = ORC_RD(hcsp->HCS_Base, ORC_GCFG);
384 	ORC_WR(hcsp->HCS_Base + ORC_GCFG, bData | EEPRG);	/* Enable EEPROM programming */
385 	ORC_WR(hcsp->HCS_Base + ORC_EBIOSADR2, 0x00);
386 	ORC_WRSHORT(hcsp->HCS_Base + ORC_EBIOSADR0, 0x00);
387 	if (ORC_RD(hcsp->HCS_Base, ORC_EBIOSDATA) != 0x55) {
388 		ORC_WR(hcsp->HCS_Base + ORC_GCFG, bData);	/* Disable EEPROM programming */
389 		return 0;
390 	}
391 	ORC_WRSHORT(hcsp->HCS_Base + ORC_EBIOSADR0, 0x01);
392 	if (ORC_RD(hcsp->HCS_Base, ORC_EBIOSDATA) != 0xAA) {
393 		ORC_WR(hcsp->HCS_Base + ORC_GCFG, bData);	/* Disable EEPROM programming */
394 		return 0;
395 	}
396 	ORC_WR(hcsp->HCS_Base + ORC_RISCCTL, PRGMRST | DOWNLOAD);	/* Enable SRAM programming */
397 	pData = (UCHAR *) & dData;
398 	dData = 0;		/* Initial FW address to 0 */
399 	ORC_WRSHORT(hcsp->HCS_Base + ORC_EBIOSADR0, 0x10);
400 	*pData = ORC_RD(hcsp->HCS_Base, ORC_EBIOSDATA);		/* Read from BIOS */
401 	ORC_WRSHORT(hcsp->HCS_Base + ORC_EBIOSADR0, 0x11);
402 	*(pData + 1) = ORC_RD(hcsp->HCS_Base, ORC_EBIOSDATA);	/* Read from BIOS */
403 	ORC_WRSHORT(hcsp->HCS_Base + ORC_EBIOSADR0, 0x12);
404 	*(pData + 2) = ORC_RD(hcsp->HCS_Base, ORC_EBIOSDATA);	/* Read from BIOS */
405 	ORC_WR(hcsp->HCS_Base + ORC_EBIOSADR2, *(pData + 2));
406 	ORC_WRLONG(hcsp->HCS_Base + ORC_FWBASEADR, dData);	/* Write FW address */
407 
408 	wBIOSAddress = (USHORT) dData;	/* FW code locate at BIOS address + ? */
409 	for (i = 0, pData = (UCHAR *) & dData;	/* Download the code    */
410 	     i < 0x1000;	/* Firmware code size = 4K      */
411 	     i++, wBIOSAddress++) {
412 		ORC_WRSHORT(hcsp->HCS_Base + ORC_EBIOSADR0, wBIOSAddress);
413 		*pData++ = ORC_RD(hcsp->HCS_Base, ORC_EBIOSDATA);	/* Read from BIOS */
414 		if ((i % 4) == 3) {
415 			ORC_WRLONG(hcsp->HCS_Base + ORC_RISCRAM, dData);	/* Write every 4 bytes */
416 			pData = (UCHAR *) & dData;
417 		}
418 	}
419 
420 	ORC_WR(hcsp->HCS_Base + ORC_RISCCTL, PRGMRST | DOWNLOAD);	/* Reset program count 0 */
421 	wBIOSAddress -= 0x1000;	/* Reset the BIOS adddress      */
422 	for (i = 0, pData = (UCHAR *) & dData;	/* Check the code       */
423 	     i < 0x1000;	/* Firmware code size = 4K      */
424 	     i++, wBIOSAddress++) {
425 		ORC_WRSHORT(hcsp->HCS_Base + ORC_EBIOSADR0, wBIOSAddress);
426 		*pData++ = ORC_RD(hcsp->HCS_Base, ORC_EBIOSDATA);	/* Read from BIOS */
427 		if ((i % 4) == 3) {
428 			if (ORC_RDLONG(hcsp->HCS_Base, ORC_RISCRAM) != dData) {
429 				ORC_WR(hcsp->HCS_Base + ORC_RISCCTL, PRGMRST);	/* Reset program to 0 */
430 				ORC_WR(hcsp->HCS_Base + ORC_GCFG, bData);	/*Disable EEPROM programming */
431 				return 0;
432 			}
433 			pData = (UCHAR *) & dData;
434 		}
435 	}
436 	ORC_WR(hcsp->HCS_Base + ORC_RISCCTL, PRGMRST);	/* Reset program to 0   */
437 	ORC_WR(hcsp->HCS_Base + ORC_GCFG, bData);	/* Disable EEPROM programming */
438 	return 1;
439 }
440 
441 /***************************************************************************/
442 static void setup_SCBs(ORC_HCS * hcsp)
443 {
444 	ORC_SCB *pVirScb;
445 	int i;
446 	ESCB *pVirEscb;
447 	dma_addr_t pPhysEscb;
448 
449 	/* Setup SCB HCS_Base and SCB Size registers */
450 	ORC_WR(hcsp->HCS_Base + ORC_SCBSIZE, ORC_MAXQUEUE);	/* Total number of SCBs */
451 	/* SCB HCS_Base address 0      */
452 	ORC_WRLONG(hcsp->HCS_Base + ORC_SCBBASE0, hcsp->HCS_physScbArray);
453 	/* SCB HCS_Base address 1      */
454 	ORC_WRLONG(hcsp->HCS_Base + ORC_SCBBASE1, hcsp->HCS_physScbArray);
455 
456 	/* setup scatter list address with one buffer */
457 	pVirScb = hcsp->HCS_virScbArray;
458 	pVirEscb = hcsp->HCS_virEscbArray;
459 
460 	for (i = 0; i < ORC_MAXQUEUE; i++) {
461 		pPhysEscb = (hcsp->HCS_physEscbArray + (sizeof(ESCB) * i));
462 		pVirScb->SCB_SGPAddr = (U32) pPhysEscb;
463 		pVirScb->SCB_SensePAddr = (U32) pPhysEscb;
464 		pVirScb->SCB_EScb = pVirEscb;
465 		pVirScb->SCB_ScbIdx = i;
466 		pVirScb++;
467 		pVirEscb++;
468 	}
469 
470 	return;
471 }
472 
473 /***************************************************************************/
474 static void initAFlag(ORC_HCS * hcsp)
475 {
476 	UCHAR i, j;
477 
478 	for (i = 0; i < MAX_CHANNELS; i++) {
479 		for (j = 0; j < 8; j++) {
480 			hcsp->BitAllocFlag[i][j] = 0xffffffff;
481 		}
482 	}
483 }
484 
485 /***************************************************************************/
486 static int init_orchid(ORC_HCS * hcsp)
487 {
488 	UBYTE *readBytep;
489 	USHORT revision;
490 	UCHAR i;
491 
492 	initAFlag(hcsp);
493 	ORC_WR(hcsp->HCS_Base + ORC_GIMSK, 0xFF);	/* Disable all interrupt        */
494 	if (ORC_RD(hcsp->HCS_Base, ORC_HSTUS) & RREADY) {	/* Orchid is ready              */
495 		revision = get_FW_version(hcsp);
496 		if (revision == 0xFFFF) {
497 			ORC_WR(hcsp->HCS_Base + ORC_HCTRL, DEVRST);	/* Reset Host Adapter   */
498 			if (waitChipReady(hcsp) == 0)
499 				return (-1);
500 			load_FW(hcsp);	/* Download FW                  */
501 			setup_SCBs(hcsp);	/* Setup SCB HCS_Base and SCB Size registers */
502 			ORC_WR(hcsp->HCS_Base + ORC_HCTRL, 0);	/* clear HOSTSTOP       */
503 			if (waitFWReady(hcsp) == 0)
504 				return (-1);
505 			/* Wait for firmware ready     */
506 		} else {
507 			setup_SCBs(hcsp);	/* Setup SCB HCS_Base and SCB Size registers */
508 		}
509 	} else {		/* Orchid is not Ready          */
510 		ORC_WR(hcsp->HCS_Base + ORC_HCTRL, DEVRST);	/* Reset Host Adapter   */
511 		if (waitChipReady(hcsp) == 0)
512 			return (-1);
513 		load_FW(hcsp);	/* Download FW                  */
514 		setup_SCBs(hcsp);	/* Setup SCB HCS_Base and SCB Size registers */
515 		ORC_WR(hcsp->HCS_Base + ORC_HCTRL, HDO);	/* Do Hardware Reset &  */
516 
517 		/*     clear HOSTSTOP  */
518 		if (waitFWReady(hcsp) == 0)		/* Wait for firmware ready      */
519 			return (-1);
520 	}
521 
522 /*------------- get serial EEProm settting -------*/
523 
524 	read_eeprom(hcsp);
525 
526 	if (nvramp->Revision != 1)
527 		return (-1);
528 
529 	hcsp->HCS_SCSI_ID = nvramp->SCSI0Id;
530 	hcsp->HCS_BIOS = nvramp->BIOSConfig1;
531 	hcsp->HCS_MaxTar = MAX_TARGETS;
532 	readBytep = (UCHAR *) & (nvramp->Target00Config);
533 	for (i = 0; i < 16; readBytep++, i++) {
534 		hcsp->TargetFlag[i] = *readBytep;
535 		hcsp->MaximumTags[i] = ORC_MAXTAGS;
536 	}			/* for                          */
537 
538 	if (nvramp->SCSI0Config & NCC_BUSRESET) {	/* Reset SCSI bus               */
539 		hcsp->HCS_Flags |= HCF_SCSI_RESET;
540 	}
541 	ORC_WR(hcsp->HCS_Base + ORC_GIMSK, 0xFB);	/* enable RP FIFO interrupt     */
542 	return (0);
543 }
544 
545 /*****************************************************************************
546  Function name  : orc_reset_scsi_bus
547  Description    : Reset registers, reset a hanging bus and
548                   kill active and disconnected commands for target w/o soft reset
549  Input          : pHCB  -       Pointer to host adapter structure
550  Output         : None.
551  Return         : pSRB  -       Pointer to SCSI request block.
552 *****************************************************************************/
553 static int orc_reset_scsi_bus(ORC_HCS * pHCB)
554 {				/* I need Host Control Block Information */
555 	ULONG flags;
556 
557 	spin_lock_irqsave(&(pHCB->BitAllocFlagLock), flags);
558 
559 	initAFlag(pHCB);
560 	/* reset scsi bus */
561 	ORC_WR(pHCB->HCS_Base + ORC_HCTRL, SCSIRST);
562 	if (waitSCSIRSTdone(pHCB) == 0) {
563 		spin_unlock_irqrestore(&(pHCB->BitAllocFlagLock), flags);
564 		return FAILED;
565 	} else {
566 		spin_unlock_irqrestore(&(pHCB->BitAllocFlagLock), flags);
567 		return SUCCESS;
568 	}
569 }
570 
571 /*****************************************************************************
572  Function name  : orc_device_reset
573  Description    : Reset registers, reset a hanging bus and
574                   kill active and disconnected commands for target w/o soft reset
575  Input          : pHCB  -       Pointer to host adapter structure
576  Output         : None.
577  Return         : pSRB  -       Pointer to SCSI request block.
578 *****************************************************************************/
579 static int orc_device_reset(ORC_HCS * pHCB, struct scsi_cmnd *SCpnt, unsigned int target)
580 {				/* I need Host Control Block Information */
581 	ORC_SCB *pScb;
582 	ESCB *pVirEscb;
583 	ORC_SCB *pVirScb;
584 	UCHAR i;
585 	ULONG flags;
586 
587 	spin_lock_irqsave(&(pHCB->BitAllocFlagLock), flags);
588 	pScb = (ORC_SCB *) NULL;
589 	pVirEscb = (ESCB *) NULL;
590 
591 	/* setup scatter list address with one buffer */
592 	pVirScb = pHCB->HCS_virScbArray;
593 
594 	initAFlag(pHCB);
595 	/* device reset */
596 	for (i = 0; i < ORC_MAXQUEUE; i++) {
597 		pVirEscb = pVirScb->SCB_EScb;
598 		if ((pVirScb->SCB_Status) && (pVirEscb->SCB_Srb == SCpnt))
599 			break;
600 		pVirScb++;
601 	}
602 
603 	if (i == ORC_MAXQUEUE) {
604 		printk("Unable to Reset - No SCB Found\n");
605 		spin_unlock_irqrestore(&(pHCB->BitAllocFlagLock), flags);
606 		return FAILED;
607 	}
608 	if ((pScb = orc_alloc_scb(pHCB)) == NULL) {
609 		spin_unlock_irqrestore(&(pHCB->BitAllocFlagLock), flags);
610 		return FAILED;
611 	}
612 	pScb->SCB_Opcode = ORC_BUSDEVRST;
613 	pScb->SCB_Target = target;
614 	pScb->SCB_HaStat = 0;
615 	pScb->SCB_TaStat = 0;
616 	pScb->SCB_Status = 0x0;
617 	pScb->SCB_Link = 0xFF;
618 	pScb->SCB_Reserved0 = 0;
619 	pScb->SCB_Reserved1 = 0;
620 	pScb->SCB_XferLen = 0;
621 	pScb->SCB_SGLen = 0;
622 
623 	pVirEscb->SCB_Srb = NULL;
624 	pVirEscb->SCB_Srb = SCpnt;
625 	orc_exec_scb(pHCB, pScb);	/* Start execute SCB            */
626 	spin_unlock_irqrestore(&(pHCB->BitAllocFlagLock), flags);
627 	return SUCCESS;
628 }
629 
630 
631 /***************************************************************************/
632 static ORC_SCB *__orc_alloc_scb(ORC_HCS * hcsp)
633 {
634 	ORC_SCB *pTmpScb;
635 	UCHAR Ch;
636 	ULONG idx;
637 	UCHAR index;
638 	UCHAR i;
639 
640 	Ch = hcsp->HCS_Index;
641 	for (i = 0; i < 8; i++) {
642 		for (index = 0; index < 32; index++) {
643 			if ((hcsp->BitAllocFlag[Ch][i] >> index) & 0x01) {
644 				hcsp->BitAllocFlag[Ch][i] &= ~(1 << index);
645 				break;
646 			}
647 		}
648 		idx = index + 32 * i;
649 		pTmpScb = (ORC_SCB *) ((ULONG) hcsp->HCS_virScbArray + (idx * sizeof(ORC_SCB)));
650 		return (pTmpScb);
651 	}
652 	return (NULL);
653 }
654 
655 static ORC_SCB *orc_alloc_scb(ORC_HCS * hcsp)
656 {
657 	ORC_SCB *pTmpScb;
658 	ULONG flags;
659 
660 	spin_lock_irqsave(&(hcsp->BitAllocFlagLock), flags);
661 	pTmpScb = __orc_alloc_scb(hcsp);
662 	spin_unlock_irqrestore(&(hcsp->BitAllocFlagLock), flags);
663 	return (pTmpScb);
664 }
665 
666 
667 /***************************************************************************/
668 static void orc_release_scb(ORC_HCS * hcsp, ORC_SCB * scbp)
669 {
670 	ULONG flags;
671 	UCHAR Index;
672 	UCHAR i;
673 	UCHAR Ch;
674 
675 	spin_lock_irqsave(&(hcsp->BitAllocFlagLock), flags);
676 	Ch = hcsp->HCS_Index;
677 	Index = scbp->SCB_ScbIdx;
678 	i = Index / 32;
679 	Index %= 32;
680 	hcsp->BitAllocFlag[Ch][i] |= (1 << Index);
681 	spin_unlock_irqrestore(&(hcsp->BitAllocFlagLock), flags);
682 }
683 
684 /*****************************************************************************
685  Function name  : abort_SCB
686  Description    : Abort a queued command.
687 	                 (commands that are on the bus can't be aborted easily)
688  Input          : pHCB  -       Pointer to host adapter structure
689  Output         : None.
690  Return         : pSRB  -       Pointer to SCSI request block.
691 *****************************************************************************/
692 static int abort_SCB(ORC_HCS * hcsp, ORC_SCB * pScb)
693 {
694 	unsigned char bData, bStatus;
695 
696 	ORC_WR(hcsp->HCS_Base + ORC_HDATA, ORC_CMD_ABORT_SCB);	/* Write command */
697 	ORC_WR(hcsp->HCS_Base + ORC_HCTRL, HDO);
698 	if (waitHDOoff(hcsp) == 0)	/* Wait HDO off   */
699 		return 0;
700 
701 	ORC_WR(hcsp->HCS_Base + ORC_HDATA, pScb->SCB_ScbIdx);	/* Write address */
702 	ORC_WR(hcsp->HCS_Base + ORC_HCTRL, HDO);
703 	if (waitHDOoff(hcsp) == 0)	/* Wait HDO off   */
704 		return 0;
705 
706 	if (waitHDIset(hcsp, &bData) == 0)	/* Wait HDI set   */
707 		return 0;
708 	bStatus = ORC_RD(hcsp->HCS_Base, ORC_HDATA);
709 	ORC_WR(hcsp->HCS_Base + ORC_HSTUS, bData);	/* Clear HDI    */
710 
711 	if (bStatus == 1)	/* 0 - Successfully               */
712 		return 0;	/* 1 - Fail                     */
713 	return 1;
714 }
715 
716 /*****************************************************************************
717  Function name  : inia100_abort
718  Description    : Abort a queued command.
719 	                 (commands that are on the bus can't be aborted easily)
720  Input          : pHCB  -       Pointer to host adapter structure
721  Output         : None.
722  Return         : pSRB  -       Pointer to SCSI request block.
723 *****************************************************************************/
724 static int orc_abort_srb(ORC_HCS * hcsp, struct scsi_cmnd *SCpnt)
725 {
726 	ESCB *pVirEscb;
727 	ORC_SCB *pVirScb;
728 	UCHAR i;
729 	ULONG flags;
730 
731 	spin_lock_irqsave(&(hcsp->BitAllocFlagLock), flags);
732 
733 	pVirScb = hcsp->HCS_virScbArray;
734 
735 	for (i = 0; i < ORC_MAXQUEUE; i++, pVirScb++) {
736 		pVirEscb = pVirScb->SCB_EScb;
737 		if ((pVirScb->SCB_Status) && (pVirEscb->SCB_Srb == SCpnt)) {
738 			if (pVirScb->SCB_TagMsg == 0) {
739 				spin_unlock_irqrestore(&(hcsp->BitAllocFlagLock), flags);
740 				return FAILED;
741 			} else {
742 				if (abort_SCB(hcsp, pVirScb)) {
743 					pVirEscb->SCB_Srb = NULL;
744 					spin_unlock_irqrestore(&(hcsp->BitAllocFlagLock), flags);
745 					return SUCCESS;
746 				} else {
747 					spin_unlock_irqrestore(&(hcsp->BitAllocFlagLock), flags);
748 					return FAILED;
749 				}
750 			}
751 		}
752 	}
753 	spin_unlock_irqrestore(&(hcsp->BitAllocFlagLock), flags);
754 	return FAILED;
755 }
756 
757 /***********************************************************************
758  Routine Description:
759 	  This is the interrupt service routine for the Orchid SCSI adapter.
760 	  It reads the interrupt register to determine if the adapter is indeed
761 	  the source of the interrupt and clears the interrupt at the device.
762  Arguments:
763 	  HwDeviceExtension - HBA miniport driver's adapter data storage
764  Return Value:
765 ***********************************************************************/
766 static void orc_interrupt(
767 			  ORC_HCS * hcsp
768 )
769 {
770 	BYTE bScbIdx;
771 	ORC_SCB *pScb;
772 
773 	if (ORC_RD(hcsp->HCS_Base, ORC_RQUEUECNT) == 0) {
774 		return;		// 0;
775 
776 	}
777 	do {
778 		bScbIdx = ORC_RD(hcsp->HCS_Base, ORC_RQUEUE);
779 
780 		pScb = (ORC_SCB *) ((ULONG) hcsp->HCS_virScbArray + (ULONG) (sizeof(ORC_SCB) * bScbIdx));
781 		pScb->SCB_Status = 0x0;
782 
783 		inia100SCBPost((BYTE *) hcsp, (BYTE *) pScb);
784 	} while (ORC_RD(hcsp->HCS_Base, ORC_RQUEUECNT));
785 	return;			//1;
786 
787 }				/* End of I1060Interrupt() */
788 
789 /*****************************************************************************
790  Function name  : inia100BuildSCB
791  Description    :
792  Input          : pHCB  -       Pointer to host adapter structure
793  Output         : None.
794  Return         : pSRB  -       Pointer to SCSI request block.
795 *****************************************************************************/
796 static void inia100BuildSCB(ORC_HCS * pHCB, ORC_SCB * pSCB, struct scsi_cmnd * SCpnt)
797 {				/* Create corresponding SCB     */
798 	struct scatterlist *pSrbSG;
799 	ORC_SG *pSG;		/* Pointer to SG list           */
800 	int i, count_sg;
801 	ESCB *pEScb;
802 
803 	pEScb = pSCB->SCB_EScb;
804 	pEScb->SCB_Srb = SCpnt;
805 	pSG = NULL;
806 
807 	pSCB->SCB_Opcode = ORC_EXECSCSI;
808 	pSCB->SCB_Flags = SCF_NO_DCHK;	/* Clear done bit               */
809 	pSCB->SCB_Target = SCpnt->device->id;
810 	pSCB->SCB_Lun = SCpnt->device->lun;
811 	pSCB->SCB_Reserved0 = 0;
812 	pSCB->SCB_Reserved1 = 0;
813 	pSCB->SCB_SGLen = 0;
814 
815 	if ((pSCB->SCB_XferLen = (U32) SCpnt->request_bufflen)) {
816 		pSG = (ORC_SG *) & pEScb->ESCB_SGList[0];
817 		if (SCpnt->use_sg) {
818 			pSrbSG = (struct scatterlist *) SCpnt->request_buffer;
819 			count_sg = pci_map_sg(pHCB->pdev, pSrbSG, SCpnt->use_sg,
820 					SCpnt->sc_data_direction);
821 			pSCB->SCB_SGLen = (U32) (count_sg * 8);
822 			for (i = 0; i < count_sg; i++, pSG++, pSrbSG++) {
823 				pSG->SG_Ptr = (U32) sg_dma_address(pSrbSG);
824 				pSG->SG_Len = (U32) sg_dma_len(pSrbSG);
825 			}
826 		} else if (SCpnt->request_bufflen != 0) {/* Non SG */
827 			pSCB->SCB_SGLen = 0x8;
828 			SCpnt->SCp.dma_handle = pci_map_single(pHCB->pdev,
829 					SCpnt->request_buffer,
830 					SCpnt->request_bufflen,
831 					SCpnt->sc_data_direction);
832 			pSG->SG_Ptr = (U32) SCpnt->SCp.dma_handle;
833 			pSG->SG_Len = (U32) SCpnt->request_bufflen;
834 		} else {
835 			pSCB->SCB_SGLen = 0;
836 			pSG->SG_Ptr = 0;
837 			pSG->SG_Len = 0;
838 		}
839 	}
840 	pSCB->SCB_SGPAddr = (U32) pSCB->SCB_SensePAddr;
841 	pSCB->SCB_HaStat = 0;
842 	pSCB->SCB_TaStat = 0;
843 	pSCB->SCB_Link = 0xFF;
844 	pSCB->SCB_SenseLen = SENSE_SIZE;
845 	pSCB->SCB_CDBLen = SCpnt->cmd_len;
846 	if (pSCB->SCB_CDBLen >= IMAX_CDB) {
847 		printk("max cdb length= %x\b", SCpnt->cmd_len);
848 		pSCB->SCB_CDBLen = IMAX_CDB;
849 	}
850 	pSCB->SCB_Ident = SCpnt->device->lun | DISC_ALLOW;
851 	if (SCpnt->device->tagged_supported) {	/* Tag Support                  */
852 		pSCB->SCB_TagMsg = SIMPLE_QUEUE_TAG;	/* Do simple tag only   */
853 	} else {
854 		pSCB->SCB_TagMsg = 0;	/* No tag support               */
855 	}
856 	memcpy(&pSCB->SCB_CDB[0], &SCpnt->cmnd, pSCB->SCB_CDBLen);
857 	return;
858 }
859 
860 /*****************************************************************************
861  Function name  : inia100_queue
862  Description    : Queue a command and setup interrupts for a free bus.
863  Input          : pHCB  -       Pointer to host adapter structure
864  Output         : None.
865  Return         : pSRB  -       Pointer to SCSI request block.
866 *****************************************************************************/
867 static int inia100_queue(struct scsi_cmnd * SCpnt, void (*done) (struct scsi_cmnd *))
868 {
869 	register ORC_SCB *pSCB;
870 	ORC_HCS *pHCB;		/* Point to Host adapter control block */
871 
872 	pHCB = (ORC_HCS *) SCpnt->device->host->hostdata;
873 	SCpnt->scsi_done = done;
874 	/* Get free SCSI control block  */
875 	if ((pSCB = orc_alloc_scb(pHCB)) == NULL)
876 		return SCSI_MLQUEUE_HOST_BUSY;
877 
878 	inia100BuildSCB(pHCB, pSCB, SCpnt);
879 	orc_exec_scb(pHCB, pSCB);	/* Start execute SCB            */
880 
881 	return (0);
882 }
883 
884 /*****************************************************************************
885  Function name  : inia100_abort
886  Description    : Abort a queued command.
887 	                 (commands that are on the bus can't be aborted easily)
888  Input          : pHCB  -       Pointer to host adapter structure
889  Output         : None.
890  Return         : pSRB  -       Pointer to SCSI request block.
891 *****************************************************************************/
892 static int inia100_abort(struct scsi_cmnd * SCpnt)
893 {
894 	ORC_HCS *hcsp;
895 
896 	hcsp = (ORC_HCS *) SCpnt->device->host->hostdata;
897 	return orc_abort_srb(hcsp, SCpnt);
898 }
899 
900 /*****************************************************************************
901  Function name  : inia100_reset
902  Description    : Reset registers, reset a hanging bus and
903                   kill active and disconnected commands for target w/o soft reset
904  Input          : pHCB  -       Pointer to host adapter structure
905  Output         : None.
906  Return         : pSRB  -       Pointer to SCSI request block.
907 *****************************************************************************/
908 static int inia100_bus_reset(struct scsi_cmnd * SCpnt)
909 {				/* I need Host Control Block Information */
910 	ORC_HCS *pHCB;
911 	pHCB = (ORC_HCS *) SCpnt->device->host->hostdata;
912 	return orc_reset_scsi_bus(pHCB);
913 }
914 
915 /*****************************************************************************
916  Function name  : inia100_device_reset
917  Description    : Reset the device
918  Input          : pHCB  -       Pointer to host adapter structure
919  Output         : None.
920  Return         : pSRB  -       Pointer to SCSI request block.
921 *****************************************************************************/
922 static int inia100_device_reset(struct scsi_cmnd * SCpnt)
923 {				/* I need Host Control Block Information */
924 	ORC_HCS *pHCB;
925 	pHCB = (ORC_HCS *) SCpnt->device->host->hostdata;
926 	return orc_device_reset(pHCB, SCpnt, SCpnt->device->id);
927 
928 }
929 
930 /*****************************************************************************
931  Function name  : inia100SCBPost
932  Description    : This is callback routine be called when orc finish one
933 			SCSI command.
934  Input          : pHCB  -       Pointer to host adapter control block.
935 		  pSCB  -       Pointer to SCSI control block.
936  Output         : None.
937  Return         : None.
938 *****************************************************************************/
939 static void inia100SCBPost(BYTE * pHcb, BYTE * pScb)
940 {
941 	struct scsi_cmnd *pSRB;	/* Pointer to SCSI request block */
942 	ORC_HCS *pHCB;
943 	ORC_SCB *pSCB;
944 	ESCB *pEScb;
945 
946 	pHCB = (ORC_HCS *) pHcb;
947 	pSCB = (ORC_SCB *) pScb;
948 	pEScb = pSCB->SCB_EScb;
949 	if ((pSRB = (struct scsi_cmnd *) pEScb->SCB_Srb) == 0) {
950 		printk("inia100SCBPost: SRB pointer is empty\n");
951 		orc_release_scb(pHCB, pSCB);	/* Release SCB for current channel */
952 		return;
953 	}
954 	pEScb->SCB_Srb = NULL;
955 
956 	switch (pSCB->SCB_HaStat) {
957 	case 0x0:
958 	case 0xa:		/* Linked command complete without error and linked normally */
959 	case 0xb:		/* Linked command complete without error interrupt generated */
960 		pSCB->SCB_HaStat = 0;
961 		break;
962 
963 	case 0x11:		/* Selection time out-The initiator selection or target
964 				   reselection was not complete within the SCSI Time out period */
965 		pSCB->SCB_HaStat = DID_TIME_OUT;
966 		break;
967 
968 	case 0x14:		/* Target bus phase sequence failure-An invalid bus phase or bus
969 				   phase sequence was requested by the target. The host adapter
970 				   will generate a SCSI Reset Condition, notifying the host with
971 				   a SCRD interrupt */
972 		pSCB->SCB_HaStat = DID_RESET;
973 		break;
974 
975 	case 0x1a:		/* SCB Aborted. 07/21/98 */
976 		pSCB->SCB_HaStat = DID_ABORT;
977 		break;
978 
979 	case 0x12:		/* Data overrun/underrun-The target attempted to transfer more data
980 				   than was allocated by the Data Length field or the sum of the
981 				   Scatter / Gather Data Length fields. */
982 	case 0x13:		/* Unexpected bus free-The target dropped the SCSI BSY at an unexpected time. */
983 	case 0x16:		/* Invalid CCB Operation Code-The first byte of the CCB was invalid. */
984 
985 	default:
986 		printk("inia100: %x %x\n", pSCB->SCB_HaStat, pSCB->SCB_TaStat);
987 		pSCB->SCB_HaStat = DID_ERROR;	/* Couldn't find any better */
988 		break;
989 	}
990 
991 	if (pSCB->SCB_TaStat == 2) {	/* Check condition              */
992 		memcpy((unsigned char *) &pSRB->sense_buffer[0],
993 		   (unsigned char *) &pEScb->ESCB_SGList[0], SENSE_SIZE);
994 	}
995 	pSRB->result = pSCB->SCB_TaStat | (pSCB->SCB_HaStat << 16);
996 
997 	if (pSRB->use_sg) {
998 		pci_unmap_sg(pHCB->pdev,
999 			     (struct scatterlist *)pSRB->request_buffer,
1000 			     pSRB->use_sg, pSRB->sc_data_direction);
1001 	} else if (pSRB->request_bufflen != 0) {
1002 		pci_unmap_single(pHCB->pdev, pSRB->SCp.dma_handle,
1003 				 pSRB->request_bufflen,
1004 				 pSRB->sc_data_direction);
1005 	}
1006 
1007 	pSRB->scsi_done(pSRB);	/* Notify system DONE           */
1008 
1009 	orc_release_scb(pHCB, pSCB);	/* Release SCB for current channel */
1010 }
1011 
1012 /*
1013  * Interrupt handler (main routine of the driver)
1014  */
1015 static irqreturn_t inia100_intr(int irqno, void *devid, struct pt_regs *regs)
1016 {
1017 	struct Scsi_Host *host = (struct Scsi_Host *)devid;
1018 	ORC_HCS *pHcb = (ORC_HCS *)host->hostdata;
1019 	unsigned long flags;
1020 
1021 	spin_lock_irqsave(host->host_lock, flags);
1022 	orc_interrupt(pHcb);
1023 	spin_unlock_irqrestore(host->host_lock, flags);
1024 
1025 	return IRQ_HANDLED;
1026 }
1027 
1028 static struct scsi_host_template inia100_template = {
1029 	.proc_name		= "inia100",
1030 	.name			= inia100_REVID,
1031 	.queuecommand		= inia100_queue,
1032 	.eh_abort_handler	= inia100_abort,
1033 	.eh_bus_reset_handler	= inia100_bus_reset,
1034 	.eh_device_reset_handler = inia100_device_reset,
1035 	.can_queue		= 1,
1036 	.this_id		= 1,
1037 	.sg_tablesize		= SG_ALL,
1038 	.cmd_per_lun 		= 1,
1039 	.use_clustering		= ENABLE_CLUSTERING,
1040 };
1041 
1042 static int __devinit inia100_probe_one(struct pci_dev *pdev,
1043 		const struct pci_device_id *id)
1044 {
1045 	struct Scsi_Host *shost;
1046 	ORC_HCS *pHCB;
1047 	unsigned long port, bios;
1048 	int error = -ENODEV;
1049 	u32 sz;
1050 	unsigned long dBiosAdr;
1051 	char *pbBiosAdr;
1052 
1053 	if (pci_enable_device(pdev))
1054 		goto out;
1055 	if (pci_set_dma_mask(pdev, 0xffffffffULL)) {
1056 		printk(KERN_WARNING "Unable to set 32bit DMA "
1057 				    "on inia100 adapter, ignoring.\n");
1058 		goto out_disable_device;
1059 	}
1060 
1061 	pci_set_master(pdev);
1062 
1063 	port = pci_resource_start(pdev, 0);
1064 	if (!request_region(port, 256, "inia100")) {
1065 		printk(KERN_WARNING "inia100: io port 0x%lx, is busy.\n", port);
1066 		goto out_disable_device;
1067 	}
1068 
1069 	/* <02> read from base address + 0x50 offset to get the bios balue. */
1070 	bios = ORC_RDWORD(port, 0x50);
1071 
1072 
1073 	shost = scsi_host_alloc(&inia100_template, sizeof(ORC_HCS));
1074 	if (!shost)
1075 		goto out_release_region;
1076 
1077 	pHCB = (ORC_HCS *)shost->hostdata;
1078 	pHCB->pdev = pdev;
1079 	pHCB->HCS_Base = port;
1080 	pHCB->HCS_BIOS = bios;
1081 	spin_lock_init(&pHCB->BitAllocFlagLock);
1082 
1083 	/* Get total memory needed for SCB */
1084 	sz = ORC_MAXQUEUE * sizeof(ORC_SCB);
1085 	pHCB->HCS_virScbArray = pci_alloc_consistent(pdev, sz,
1086 			&pHCB->HCS_physScbArray);
1087 	if (!pHCB->HCS_virScbArray) {
1088 		printk("inia100: SCB memory allocation error\n");
1089 		goto out_host_put;
1090 	}
1091 	memset(pHCB->HCS_virScbArray, 0, sz);
1092 
1093 	/* Get total memory needed for ESCB */
1094 	sz = ORC_MAXQUEUE * sizeof(ESCB);
1095 	pHCB->HCS_virEscbArray = pci_alloc_consistent(pdev, sz,
1096 			&pHCB->HCS_physEscbArray);
1097 	if (!pHCB->HCS_virEscbArray) {
1098 		printk("inia100: ESCB memory allocation error\n");
1099 		goto out_free_scb_array;
1100 	}
1101 	memset(pHCB->HCS_virEscbArray, 0, sz);
1102 
1103 	dBiosAdr = pHCB->HCS_BIOS;
1104 	dBiosAdr = (dBiosAdr << 4);
1105 	pbBiosAdr = phys_to_virt(dBiosAdr);
1106 	if (init_orchid(pHCB)) {	/* Initialize orchid chip */
1107 		printk("inia100: initial orchid fail!!\n");
1108 		goto out_free_escb_array;
1109 	}
1110 
1111 	shost->io_port = pHCB->HCS_Base;
1112 	shost->n_io_port = 0xff;
1113 	shost->can_queue = ORC_MAXQUEUE;
1114 	shost->unique_id = shost->io_port;
1115 	shost->max_id = pHCB->HCS_MaxTar;
1116 	shost->max_lun = 16;
1117 	shost->irq = pHCB->HCS_Intr = pdev->irq;
1118 	shost->this_id = pHCB->HCS_SCSI_ID;	/* Assign HCS index */
1119 	shost->sg_tablesize = TOTAL_SG_ENTRY;
1120 
1121 	/* Initial orc chip           */
1122 	error = request_irq(pdev->irq, inia100_intr, SA_SHIRQ,
1123 			"inia100", shost);
1124 	if (error < 0) {
1125 		printk(KERN_WARNING "inia100: unable to get irq %d\n",
1126 				pdev->irq);
1127 		goto out_free_escb_array;
1128 	}
1129 
1130 	pci_set_drvdata(pdev, shost);
1131 
1132 	error = scsi_add_host(shost, &pdev->dev);
1133 	if (error)
1134 		goto out_free_irq;
1135 
1136 	scsi_scan_host(shost);
1137 	return 0;
1138 
1139  out_free_irq:
1140         free_irq(shost->irq, shost);
1141  out_free_escb_array:
1142 	pci_free_consistent(pdev, ORC_MAXQUEUE * sizeof(ESCB),
1143 			pHCB->HCS_virEscbArray, pHCB->HCS_physEscbArray);
1144  out_free_scb_array:
1145 	pci_free_consistent(pdev, ORC_MAXQUEUE * sizeof(ORC_SCB),
1146 			pHCB->HCS_virScbArray, pHCB->HCS_physScbArray);
1147  out_host_put:
1148 	scsi_host_put(shost);
1149  out_release_region:
1150         release_region(port, 256);
1151  out_disable_device:
1152 	pci_disable_device(pdev);
1153  out:
1154 	return error;
1155 }
1156 
1157 static void __devexit inia100_remove_one(struct pci_dev *pdev)
1158 {
1159 	struct Scsi_Host *shost = pci_get_drvdata(pdev);
1160 	ORC_HCS *pHCB = (ORC_HCS *)shost->hostdata;
1161 
1162 	scsi_remove_host(shost);
1163 
1164         free_irq(shost->irq, shost);
1165 	pci_free_consistent(pdev, ORC_MAXQUEUE * sizeof(ESCB),
1166 			pHCB->HCS_virEscbArray, pHCB->HCS_physEscbArray);
1167 	pci_free_consistent(pdev, ORC_MAXQUEUE * sizeof(ORC_SCB),
1168 			pHCB->HCS_virScbArray, pHCB->HCS_physScbArray);
1169         release_region(shost->io_port, 256);
1170 
1171 	scsi_host_put(shost);
1172 }
1173 
1174 static struct pci_device_id inia100_pci_tbl[] = {
1175 	{PCI_VENDOR_ID_INIT, 0x1060, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
1176 	{0,}
1177 };
1178 MODULE_DEVICE_TABLE(pci, inia100_pci_tbl);
1179 
1180 static struct pci_driver inia100_pci_driver = {
1181 	.name		= "inia100",
1182 	.id_table	= inia100_pci_tbl,
1183 	.probe		= inia100_probe_one,
1184 	.remove		= __devexit_p(inia100_remove_one),
1185 };
1186 
1187 static int __init inia100_init(void)
1188 {
1189 	return pci_module_init(&inia100_pci_driver);
1190 }
1191 
1192 static void __exit inia100_exit(void)
1193 {
1194 	pci_unregister_driver(&inia100_pci_driver);
1195 }
1196 
1197 MODULE_DESCRIPTION("Initio A100U2W SCSI driver");
1198 MODULE_AUTHOR("Initio Corporation");
1199 MODULE_LICENSE("Dual BSD/GPL");
1200 
1201 module_init(inia100_init);
1202 module_exit(inia100_exit);
1203