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