1/***************************************************************************
2                          dpti.c  -  description
3                             -------------------
4    begin                : Thu Sep 7 2000
5    copyright            : (C) 2000 by Adaptec
6
7			   July 30, 2001 First version being submitted
8			   for inclusion in the kernel.  V2.4
9
10    See Documentation/scsi/dpti.txt for history, notes, license info
11    and credits
12 ***************************************************************************/
13
14/***************************************************************************
15 *                                                                         *
16 *   This program is free software; you can redistribute it and/or modify  *
17 *   it under the terms of the GNU General Public License as published by  *
18 *   the Free Software Foundation; either version 2 of the License, or     *
19 *   (at your option) any later version.                                   *
20 *                                                                         *
21 ***************************************************************************/
22/***************************************************************************
23 * Sat Dec 20 2003 Go Taniguchi <go@turbolinux.co.jp>
24 - Support 2.6 kernel and DMA-mapping
25 - ioctl fix for raid tools
26 - use schedule_timeout in long long loop
27 **************************************************************************/
28
29/*#define DEBUG 1 */
30/*#define UARTDELAY 1 */
31
32#include <linux/module.h>
33
34MODULE_AUTHOR("Deanna Bonds, with _lots_ of help from Mark Salyzyn");
35MODULE_DESCRIPTION("Adaptec I2O RAID Driver");
36
37////////////////////////////////////////////////////////////////
38
39#include <linux/ioctl.h>	/* For SCSI-Passthrough */
40#include <asm/uaccess.h>
41
42#include <linux/stat.h>
43#include <linux/slab.h>		/* for kmalloc() */
44#include <linux/pci.h>		/* for PCI support */
45#include <linux/proc_fs.h>
46#include <linux/blkdev.h>
47#include <linux/delay.h>	/* for udelay */
48#include <linux/interrupt.h>
49#include <linux/kernel.h>	/* for printk */
50#include <linux/sched.h>
51#include <linux/reboot.h>
52#include <linux/spinlock.h>
53#include <linux/dma-mapping.h>
54
55#include <linux/timer.h>
56#include <linux/string.h>
57#include <linux/ioport.h>
58#include <linux/mutex.h>
59
60#include <asm/processor.h>	/* for boot_cpu_data */
61#include <asm/pgtable.h>
62#include <asm/io.h>		/* for virt_to_bus, etc. */
63
64#include <scsi/scsi.h>
65#include <scsi/scsi_cmnd.h>
66#include <scsi/scsi_device.h>
67#include <scsi/scsi_host.h>
68#include <scsi/scsi_tcq.h>
69
70#include "dpt/dptsig.h"
71#include "dpti.h"
72
73/*============================================================================
74 * Create a binary signature - this is read by dptsig
75 * Needed for our management apps
76 *============================================================================
77 */
78static DEFINE_MUTEX(adpt_mutex);
79static dpt_sig_S DPTI_sig = {
80	{'d', 'P', 't', 'S', 'i', 'G'}, SIG_VERSION,
81#ifdef __i386__
82	PROC_INTEL, PROC_386 | PROC_486 | PROC_PENTIUM | PROC_SEXIUM,
83#elif defined(__ia64__)
84	PROC_INTEL, PROC_IA64,
85#elif defined(__sparc__)
86	PROC_ULTRASPARC, PROC_ULTRASPARC,
87#elif defined(__alpha__)
88	PROC_ALPHA, PROC_ALPHA,
89#else
90	(-1),(-1),
91#endif
92	 FT_HBADRVR, 0, OEM_DPT, OS_LINUX, CAP_OVERLAP, DEV_ALL,
93	ADF_ALL_SC5, 0, 0, DPT_VERSION, DPT_REVISION, DPT_SUBREVISION,
94	DPT_MONTH, DPT_DAY, DPT_YEAR, "Adaptec Linux I2O RAID Driver"
95};
96
97
98
99
100/*============================================================================
101 * Globals
102 *============================================================================
103 */
104
105static DEFINE_MUTEX(adpt_configuration_lock);
106
107static struct i2o_sys_tbl *sys_tbl;
108static dma_addr_t sys_tbl_pa;
109static int sys_tbl_ind;
110static int sys_tbl_len;
111
112static adpt_hba* hba_chain = NULL;
113static int hba_count = 0;
114
115static struct class *adpt_sysfs_class;
116
117static long adpt_unlocked_ioctl(struct file *, unsigned int, unsigned long);
118#ifdef CONFIG_COMPAT
119static long compat_adpt_ioctl(struct file *, unsigned int, unsigned long);
120#endif
121
122static const struct file_operations adpt_fops = {
123	.unlocked_ioctl	= adpt_unlocked_ioctl,
124	.open		= adpt_open,
125	.release	= adpt_close,
126#ifdef CONFIG_COMPAT
127	.compat_ioctl	= compat_adpt_ioctl,
128#endif
129	.llseek		= noop_llseek,
130};
131
132/* Structures and definitions for synchronous message posting.
133 * See adpt_i2o_post_wait() for description
134 * */
135struct adpt_i2o_post_wait_data
136{
137	int status;
138	u32 id;
139	adpt_wait_queue_head_t *wq;
140	struct adpt_i2o_post_wait_data *next;
141};
142
143static struct adpt_i2o_post_wait_data *adpt_post_wait_queue = NULL;
144static u32 adpt_post_wait_id = 0;
145static DEFINE_SPINLOCK(adpt_post_wait_lock);
146
147
148/*============================================================================
149 * 				Functions
150 *============================================================================
151 */
152
153static inline int dpt_dma64(adpt_hba *pHba)
154{
155	return (sizeof(dma_addr_t) > 4 && (pHba)->dma64);
156}
157
158static inline u32 dma_high(dma_addr_t addr)
159{
160	return upper_32_bits(addr);
161}
162
163static inline u32 dma_low(dma_addr_t addr)
164{
165	return (u32)addr;
166}
167
168static u8 adpt_read_blink_led(adpt_hba* host)
169{
170	if (host->FwDebugBLEDflag_P) {
171		if( readb(host->FwDebugBLEDflag_P) == 0xbc ){
172			return readb(host->FwDebugBLEDvalue_P);
173		}
174	}
175	return 0;
176}
177
178/*============================================================================
179 * Scsi host template interface functions
180 *============================================================================
181 */
182
183static struct pci_device_id dptids[] = {
184	{ PCI_DPT_VENDOR_ID, PCI_DPT_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
185	{ PCI_DPT_VENDOR_ID, PCI_DPT_RAPTOR_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
186	{ 0, }
187};
188MODULE_DEVICE_TABLE(pci,dptids);
189
190static int adpt_detect(struct scsi_host_template* sht)
191{
192	struct pci_dev *pDev = NULL;
193	adpt_hba *pHba;
194	adpt_hba *next;
195
196	PINFO("Detecting Adaptec I2O RAID controllers...\n");
197
198        /* search for all Adatpec I2O RAID cards */
199	while ((pDev = pci_get_device( PCI_DPT_VENDOR_ID, PCI_ANY_ID, pDev))) {
200		if(pDev->device == PCI_DPT_DEVICE_ID ||
201		   pDev->device == PCI_DPT_RAPTOR_DEVICE_ID){
202			if(adpt_install_hba(sht, pDev) ){
203				PERROR("Could not Init an I2O RAID device\n");
204				PERROR("Will not try to detect others.\n");
205				return hba_count-1;
206			}
207			pci_dev_get(pDev);
208		}
209	}
210
211	/* In INIT state, Activate IOPs */
212	for (pHba = hba_chain; pHba; pHba = next) {
213		next = pHba->next;
214		// Activate does get status , init outbound, and get hrt
215		if (adpt_i2o_activate_hba(pHba) < 0) {
216			adpt_i2o_delete_hba(pHba);
217		}
218	}
219
220
221	/* Active IOPs in HOLD state */
222
223rebuild_sys_tab:
224	if (hba_chain == NULL)
225		return 0;
226
227	/*
228	 * If build_sys_table fails, we kill everything and bail
229	 * as we can't init the IOPs w/o a system table
230	 */
231	if (adpt_i2o_build_sys_table() < 0) {
232		adpt_i2o_sys_shutdown();
233		return 0;
234	}
235
236	PDEBUG("HBA's in HOLD state\n");
237
238	/* If IOP don't get online, we need to rebuild the System table */
239	for (pHba = hba_chain; pHba; pHba = pHba->next) {
240		if (adpt_i2o_online_hba(pHba) < 0) {
241			adpt_i2o_delete_hba(pHba);
242			goto rebuild_sys_tab;
243		}
244	}
245
246	/* Active IOPs now in OPERATIONAL state */
247	PDEBUG("HBA's in OPERATIONAL state\n");
248
249	printk("dpti: If you have a lot of devices this could take a few minutes.\n");
250	for (pHba = hba_chain; pHba; pHba = next) {
251		next = pHba->next;
252		printk(KERN_INFO"%s: Reading the hardware resource table.\n", pHba->name);
253		if (adpt_i2o_lct_get(pHba) < 0){
254			adpt_i2o_delete_hba(pHba);
255			continue;
256		}
257
258		if (adpt_i2o_parse_lct(pHba) < 0){
259			adpt_i2o_delete_hba(pHba);
260			continue;
261		}
262		adpt_inquiry(pHba);
263	}
264
265	adpt_sysfs_class = class_create(THIS_MODULE, "dpt_i2o");
266	if (IS_ERR(adpt_sysfs_class)) {
267		printk(KERN_WARNING"dpti: unable to create dpt_i2o class\n");
268		adpt_sysfs_class = NULL;
269	}
270
271	for (pHba = hba_chain; pHba; pHba = next) {
272		next = pHba->next;
273		if (adpt_scsi_host_alloc(pHba, sht) < 0){
274			adpt_i2o_delete_hba(pHba);
275			continue;
276		}
277		pHba->initialized = TRUE;
278		pHba->state &= ~DPTI_STATE_RESET;
279		if (adpt_sysfs_class) {
280			struct device *dev = device_create(adpt_sysfs_class,
281				NULL, MKDEV(DPTI_I2O_MAJOR, pHba->unit), NULL,
282				"dpti%d", pHba->unit);
283			if (IS_ERR(dev)) {
284				printk(KERN_WARNING"dpti%d: unable to "
285					"create device in dpt_i2o class\n",
286					pHba->unit);
287			}
288		}
289	}
290
291	// Register our control device node
292	// nodes will need to be created in /dev to access this
293	// the nodes can not be created from within the driver
294	if (hba_count && register_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER, &adpt_fops)) {
295		adpt_i2o_sys_shutdown();
296		return 0;
297	}
298	return hba_count;
299}
300
301
302/*
303 * scsi_unregister will be called AFTER we return.
304 */
305static int adpt_release(struct Scsi_Host *host)
306{
307	adpt_hba* pHba = (adpt_hba*) host->hostdata[0];
308//	adpt_i2o_quiesce_hba(pHba);
309	adpt_i2o_delete_hba(pHba);
310	scsi_unregister(host);
311	return 0;
312}
313
314
315static void adpt_inquiry(adpt_hba* pHba)
316{
317	u32 msg[17];
318	u32 *mptr;
319	u32 *lenptr;
320	int direction;
321	int scsidir;
322	u32 len;
323	u32 reqlen;
324	u8* buf;
325	dma_addr_t addr;
326	u8  scb[16];
327	s32 rcode;
328
329	memset(msg, 0, sizeof(msg));
330	buf = dma_alloc_coherent(&pHba->pDev->dev, 80, &addr, GFP_KERNEL);
331	if(!buf){
332		printk(KERN_ERR"%s: Could not allocate buffer\n",pHba->name);
333		return;
334	}
335	memset((void*)buf, 0, 36);
336
337	len = 36;
338	direction = 0x00000000;
339	scsidir  =0x40000000;	// DATA IN  (iop<--dev)
340
341	if (dpt_dma64(pHba))
342		reqlen = 17;		// SINGLE SGE, 64 bit
343	else
344		reqlen = 14;		// SINGLE SGE, 32 bit
345	/* Stick the headers on */
346	msg[0] = reqlen<<16 | SGL_OFFSET_12;
347	msg[1] = (0xff<<24|HOST_TID<<12|ADAPTER_TID);
348	msg[2] = 0;
349	msg[3]  = 0;
350	// Adaptec/DPT Private stuff
351	msg[4] = I2O_CMD_SCSI_EXEC|DPT_ORGANIZATION_ID<<16;
352	msg[5] = ADAPTER_TID | 1<<16 /* Interpret*/;
353	/* Direction, disconnect ok | sense data | simple queue , CDBLen */
354	// I2O_SCB_FLAG_ENABLE_DISCONNECT |
355	// I2O_SCB_FLAG_SIMPLE_QUEUE_TAG |
356	// I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE;
357	msg[6] = scsidir|0x20a00000| 6 /* cmd len*/;
358
359	mptr=msg+7;
360
361	memset(scb, 0, sizeof(scb));
362	// Write SCSI command into the message - always 16 byte block
363	scb[0] = INQUIRY;
364	scb[1] = 0;
365	scb[2] = 0;
366	scb[3] = 0;
367	scb[4] = 36;
368	scb[5] = 0;
369	// Don't care about the rest of scb
370
371	memcpy(mptr, scb, sizeof(scb));
372	mptr+=4;
373	lenptr=mptr++;		/* Remember me - fill in when we know */
374
375	/* Now fill in the SGList and command */
376	*lenptr = len;
377	if (dpt_dma64(pHba)) {
378		*mptr++ = (0x7C<<24)+(2<<16)+0x02; /* Enable 64 bit */
379		*mptr++ = 1 << PAGE_SHIFT;
380		*mptr++ = 0xD0000000|direction|len;
381		*mptr++ = dma_low(addr);
382		*mptr++ = dma_high(addr);
383	} else {
384		*mptr++ = 0xD0000000|direction|len;
385		*mptr++ = addr;
386	}
387
388	// Send it on it's way
389	rcode = adpt_i2o_post_wait(pHba, msg, reqlen<<2, 120);
390	if (rcode != 0) {
391		sprintf(pHba->detail, "Adaptec I2O RAID");
392		printk(KERN_INFO "%s: Inquiry Error (%d)\n",pHba->name,rcode);
393		if (rcode != -ETIME && rcode != -EINTR)
394			dma_free_coherent(&pHba->pDev->dev, 80, buf, addr);
395	} else {
396		memset(pHba->detail, 0, sizeof(pHba->detail));
397		memcpy(&(pHba->detail), "Vendor: Adaptec ", 16);
398		memcpy(&(pHba->detail[16]), " Model: ", 8);
399		memcpy(&(pHba->detail[24]), (u8*) &buf[16], 16);
400		memcpy(&(pHba->detail[40]), " FW: ", 4);
401		memcpy(&(pHba->detail[44]), (u8*) &buf[32], 4);
402		pHba->detail[48] = '\0';	/* precautionary */
403		dma_free_coherent(&pHba->pDev->dev, 80, buf, addr);
404	}
405	adpt_i2o_status_get(pHba);
406	return ;
407}
408
409
410static int adpt_slave_configure(struct scsi_device * device)
411{
412	struct Scsi_Host *host = device->host;
413	adpt_hba* pHba;
414
415	pHba = (adpt_hba *) host->hostdata[0];
416
417	if (host->can_queue && device->tagged_supported) {
418		scsi_change_queue_depth(device,
419				host->can_queue - 1);
420	}
421	return 0;
422}
423
424static int adpt_queue_lck(struct scsi_cmnd * cmd, void (*done) (struct scsi_cmnd *))
425{
426	adpt_hba* pHba = NULL;
427	struct adpt_device* pDev = NULL;	/* dpt per device information */
428
429	cmd->scsi_done = done;
430	/*
431	 * SCSI REQUEST_SENSE commands will be executed automatically by the
432	 * Host Adapter for any errors, so they should not be executed
433	 * explicitly unless the Sense Data is zero indicating that no error
434	 * occurred.
435	 */
436
437	if ((cmd->cmnd[0] == REQUEST_SENSE) && (cmd->sense_buffer[0] != 0)) {
438		cmd->result = (DID_OK << 16);
439		cmd->scsi_done(cmd);
440		return 0;
441	}
442
443	pHba = (adpt_hba*)cmd->device->host->hostdata[0];
444	if (!pHba) {
445		return FAILED;
446	}
447
448	rmb();
449	if ((pHba->state) & DPTI_STATE_RESET)
450		return SCSI_MLQUEUE_HOST_BUSY;
451
452	// TODO if the cmd->device if offline then I may need to issue a bus rescan
453	// followed by a get_lct to see if the device is there anymore
454	if((pDev = (struct adpt_device*) (cmd->device->hostdata)) == NULL) {
455		/*
456		 * First command request for this device.  Set up a pointer
457		 * to the device structure.  This should be a TEST_UNIT_READY
458		 * command from scan_scsis_single.
459		 */
460		if ((pDev = adpt_find_device(pHba, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun)) == NULL) {
461			// TODO: if any luns are at this bus, scsi id then fake a TEST_UNIT_READY and INQUIRY response
462			// with type 7F (for all luns less than the max for this bus,id) so the lun scan will continue.
463			cmd->result = (DID_NO_CONNECT << 16);
464			cmd->scsi_done(cmd);
465			return 0;
466		}
467		cmd->device->hostdata = pDev;
468	}
469	pDev->pScsi_dev = cmd->device;
470
471	/*
472	 * If we are being called from when the device is being reset,
473	 * delay processing of the command until later.
474	 */
475	if (pDev->state & DPTI_DEV_RESET ) {
476		return FAILED;
477	}
478	return adpt_scsi_to_i2o(pHba, cmd, pDev);
479}
480
481static DEF_SCSI_QCMD(adpt_queue)
482
483static int adpt_bios_param(struct scsi_device *sdev, struct block_device *dev,
484		sector_t capacity, int geom[])
485{
486	int heads=-1;
487	int sectors=-1;
488	int cylinders=-1;
489
490	// *** First lets set the default geometry ****
491
492	// If the capacity is less than ox2000
493	if (capacity < 0x2000 ) {	// floppy
494		heads = 18;
495		sectors = 2;
496	}
497	// else if between 0x2000 and 0x20000
498	else if (capacity < 0x20000) {
499		heads = 64;
500		sectors = 32;
501	}
502	// else if between 0x20000 and 0x40000
503	else if (capacity < 0x40000) {
504		heads = 65;
505		sectors = 63;
506	}
507	// else if between 0x4000 and 0x80000
508	else if (capacity < 0x80000) {
509		heads = 128;
510		sectors = 63;
511	}
512	// else if greater than 0x80000
513	else {
514		heads = 255;
515		sectors = 63;
516	}
517	cylinders = sector_div(capacity, heads * sectors);
518
519	// Special case if CDROM
520	if(sdev->type == 5) {  // CDROM
521		heads = 252;
522		sectors = 63;
523		cylinders = 1111;
524	}
525
526	geom[0] = heads;
527	geom[1] = sectors;
528	geom[2] = cylinders;
529
530	PDEBUG("adpt_bios_param: exit\n");
531	return 0;
532}
533
534
535static const char *adpt_info(struct Scsi_Host *host)
536{
537	adpt_hba* pHba;
538
539	pHba = (adpt_hba *) host->hostdata[0];
540	return (char *) (pHba->detail);
541}
542
543static int adpt_show_info(struct seq_file *m, struct Scsi_Host *host)
544{
545	struct adpt_device* d;
546	int id;
547	int chan;
548	adpt_hba* pHba;
549	int unit;
550
551	// Find HBA (host bus adapter) we are looking for
552	mutex_lock(&adpt_configuration_lock);
553	for (pHba = hba_chain; pHba; pHba = pHba->next) {
554		if (pHba->host == host) {
555			break;	/* found adapter */
556		}
557	}
558	mutex_unlock(&adpt_configuration_lock);
559	if (pHba == NULL) {
560		return 0;
561	}
562	host = pHba->host;
563
564	seq_printf(m, "Adaptec I2O RAID Driver Version: %s\n\n", DPT_I2O_VERSION);
565	seq_printf(m, "%s\n", pHba->detail);
566	seq_printf(m, "SCSI Host=scsi%d  Control Node=/dev/%s  irq=%d\n",
567			pHba->host->host_no, pHba->name, host->irq);
568	seq_printf(m, "\tpost fifo size  = %d\n\treply fifo size = %d\n\tsg table size   = %d\n\n",
569			host->can_queue, (int) pHba->reply_fifo_size , host->sg_tablesize);
570
571	seq_puts(m, "Devices:\n");
572	for(chan = 0; chan < MAX_CHANNEL; chan++) {
573		for(id = 0; id < MAX_ID; id++) {
574			d = pHba->channel[chan].device[id];
575			while(d) {
576				seq_printf(m,"\t%-24.24s", d->pScsi_dev->vendor);
577				seq_printf(m," Rev: %-8.8s\n", d->pScsi_dev->rev);
578
579				unit = d->pI2o_dev->lct_data.tid;
580				seq_printf(m, "\tTID=%d, (Channel=%d, Target=%d, Lun=%llu)  (%s)\n\n",
581					       unit, (int)d->scsi_channel, (int)d->scsi_id, d->scsi_lun,
582					       scsi_device_online(d->pScsi_dev)? "online":"offline");
583				d = d->next_lun;
584			}
585		}
586	}
587	return 0;
588}
589
590/*
591 *	Turn a struct scsi_cmnd * into a unique 32 bit 'context'.
592 */
593static u32 adpt_cmd_to_context(struct scsi_cmnd *cmd)
594{
595	return (u32)cmd->serial_number;
596}
597
598/*
599 *	Go from a u32 'context' to a struct scsi_cmnd * .
600 *	This could probably be made more efficient.
601 */
602static struct scsi_cmnd *
603	adpt_cmd_from_context(adpt_hba * pHba, u32 context)
604{
605	struct scsi_cmnd * cmd;
606	struct scsi_device * d;
607
608	if (context == 0)
609		return NULL;
610
611	spin_unlock(pHba->host->host_lock);
612	shost_for_each_device(d, pHba->host) {
613		unsigned long flags;
614		spin_lock_irqsave(&d->list_lock, flags);
615		list_for_each_entry(cmd, &d->cmd_list, list) {
616			if (((u32)cmd->serial_number == context)) {
617				spin_unlock_irqrestore(&d->list_lock, flags);
618				scsi_device_put(d);
619				spin_lock(pHba->host->host_lock);
620				return cmd;
621			}
622		}
623		spin_unlock_irqrestore(&d->list_lock, flags);
624	}
625	spin_lock(pHba->host->host_lock);
626
627	return NULL;
628}
629
630/*
631 *	Turn a pointer to ioctl reply data into an u32 'context'
632 */
633static u32 adpt_ioctl_to_context(adpt_hba * pHba, void *reply)
634{
635#if BITS_PER_LONG == 32
636	return (u32)(unsigned long)reply;
637#else
638	ulong flags = 0;
639	u32 nr, i;
640
641	spin_lock_irqsave(pHba->host->host_lock, flags);
642	nr = ARRAY_SIZE(pHba->ioctl_reply_context);
643	for (i = 0; i < nr; i++) {
644		if (pHba->ioctl_reply_context[i] == NULL) {
645			pHba->ioctl_reply_context[i] = reply;
646			break;
647		}
648	}
649	spin_unlock_irqrestore(pHba->host->host_lock, flags);
650	if (i >= nr) {
651		kfree (reply);
652		printk(KERN_WARNING"%s: Too many outstanding "
653				"ioctl commands\n", pHba->name);
654		return (u32)-1;
655	}
656
657	return i;
658#endif
659}
660
661/*
662 *	Go from an u32 'context' to a pointer to ioctl reply data.
663 */
664static void *adpt_ioctl_from_context(adpt_hba *pHba, u32 context)
665{
666#if BITS_PER_LONG == 32
667	return (void *)(unsigned long)context;
668#else
669	void *p = pHba->ioctl_reply_context[context];
670	pHba->ioctl_reply_context[context] = NULL;
671
672	return p;
673#endif
674}
675
676/*===========================================================================
677 * Error Handling routines
678 *===========================================================================
679 */
680
681static int adpt_abort(struct scsi_cmnd * cmd)
682{
683	adpt_hba* pHba = NULL;	/* host bus adapter structure */
684	struct adpt_device* dptdevice;	/* dpt per device information */
685	u32 msg[5];
686	int rcode;
687
688	if(cmd->serial_number == 0){
689		return FAILED;
690	}
691	pHba = (adpt_hba*) cmd->device->host->hostdata[0];
692	printk(KERN_INFO"%s: Trying to Abort\n",pHba->name);
693	if ((dptdevice = (void*) (cmd->device->hostdata)) == NULL) {
694		printk(KERN_ERR "%s: Unable to abort: No device in cmnd\n",pHba->name);
695		return FAILED;
696	}
697
698	memset(msg, 0, sizeof(msg));
699	msg[0] = FIVE_WORD_MSG_SIZE|SGL_OFFSET_0;
700	msg[1] = I2O_CMD_SCSI_ABORT<<24|HOST_TID<<12|dptdevice->tid;
701	msg[2] = 0;
702	msg[3]= 0;
703	msg[4] = adpt_cmd_to_context(cmd);
704	if (pHba->host)
705		spin_lock_irq(pHba->host->host_lock);
706	rcode = adpt_i2o_post_wait(pHba, msg, sizeof(msg), FOREVER);
707	if (pHba->host)
708		spin_unlock_irq(pHba->host->host_lock);
709	if (rcode != 0) {
710		if(rcode == -EOPNOTSUPP ){
711			printk(KERN_INFO"%s: Abort cmd not supported\n",pHba->name);
712			return FAILED;
713		}
714		printk(KERN_INFO"%s: Abort failed.\n",pHba->name);
715		return FAILED;
716	}
717	printk(KERN_INFO"%s: Abort complete.\n",pHba->name);
718	return SUCCESS;
719}
720
721
722#define I2O_DEVICE_RESET 0x27
723// This is the same for BLK and SCSI devices
724// NOTE this is wrong in the i2o.h definitions
725// This is not currently supported by our adapter but we issue it anyway
726static int adpt_device_reset(struct scsi_cmnd* cmd)
727{
728	adpt_hba* pHba;
729	u32 msg[4];
730	u32 rcode;
731	int old_state;
732	struct adpt_device* d = cmd->device->hostdata;
733
734	pHba = (void*) cmd->device->host->hostdata[0];
735	printk(KERN_INFO"%s: Trying to reset device\n",pHba->name);
736	if (!d) {
737		printk(KERN_INFO"%s: Reset Device: Device Not found\n",pHba->name);
738		return FAILED;
739	}
740	memset(msg, 0, sizeof(msg));
741	msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
742	msg[1] = (I2O_DEVICE_RESET<<24|HOST_TID<<12|d->tid);
743	msg[2] = 0;
744	msg[3] = 0;
745
746	if (pHba->host)
747		spin_lock_irq(pHba->host->host_lock);
748	old_state = d->state;
749	d->state |= DPTI_DEV_RESET;
750	rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER);
751	d->state = old_state;
752	if (pHba->host)
753		spin_unlock_irq(pHba->host->host_lock);
754	if (rcode != 0) {
755		if(rcode == -EOPNOTSUPP ){
756			printk(KERN_INFO"%s: Device reset not supported\n",pHba->name);
757			return FAILED;
758		}
759		printk(KERN_INFO"%s: Device reset failed\n",pHba->name);
760		return FAILED;
761	} else {
762		printk(KERN_INFO"%s: Device reset successful\n",pHba->name);
763		return SUCCESS;
764	}
765}
766
767
768#define I2O_HBA_BUS_RESET 0x87
769// This version of bus reset is called by the eh_error handler
770static int adpt_bus_reset(struct scsi_cmnd* cmd)
771{
772	adpt_hba* pHba;
773	u32 msg[4];
774	u32 rcode;
775
776	pHba = (adpt_hba*)cmd->device->host->hostdata[0];
777	memset(msg, 0, sizeof(msg));
778	printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %d\n",pHba->name, cmd->device->channel,pHba->channel[cmd->device->channel].tid );
779	msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
780	msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[cmd->device->channel].tid);
781	msg[2] = 0;
782	msg[3] = 0;
783	if (pHba->host)
784		spin_lock_irq(pHba->host->host_lock);
785	rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER);
786	if (pHba->host)
787		spin_unlock_irq(pHba->host->host_lock);
788	if (rcode != 0) {
789		printk(KERN_WARNING"%s: Bus reset failed.\n",pHba->name);
790		return FAILED;
791	} else {
792		printk(KERN_WARNING"%s: Bus reset success.\n",pHba->name);
793		return SUCCESS;
794	}
795}
796
797// This version of reset is called by the eh_error_handler
798static int __adpt_reset(struct scsi_cmnd* cmd)
799{
800	adpt_hba* pHba;
801	int rcode;
802	pHba = (adpt_hba*)cmd->device->host->hostdata[0];
803	printk(KERN_WARNING"%s: Hba Reset: scsi id %d: tid: %d\n",pHba->name,cmd->device->channel,pHba->channel[cmd->device->channel].tid );
804	rcode =  adpt_hba_reset(pHba);
805	if(rcode == 0){
806		printk(KERN_WARNING"%s: HBA reset complete\n",pHba->name);
807		return SUCCESS;
808	} else {
809		printk(KERN_WARNING"%s: HBA reset failed (%x)\n",pHba->name, rcode);
810		return FAILED;
811	}
812}
813
814static int adpt_reset(struct scsi_cmnd* cmd)
815{
816	int rc;
817
818	spin_lock_irq(cmd->device->host->host_lock);
819	rc = __adpt_reset(cmd);
820	spin_unlock_irq(cmd->device->host->host_lock);
821
822	return rc;
823}
824
825// This version of reset is called by the ioctls and indirectly from eh_error_handler via adpt_reset
826static int adpt_hba_reset(adpt_hba* pHba)
827{
828	int rcode;
829
830	pHba->state |= DPTI_STATE_RESET;
831
832	// Activate does get status , init outbound, and get hrt
833	if ((rcode=adpt_i2o_activate_hba(pHba)) < 0) {
834		printk(KERN_ERR "%s: Could not activate\n", pHba->name);
835		adpt_i2o_delete_hba(pHba);
836		return rcode;
837	}
838
839	if ((rcode=adpt_i2o_build_sys_table()) < 0) {
840		adpt_i2o_delete_hba(pHba);
841		return rcode;
842	}
843	PDEBUG("%s: in HOLD state\n",pHba->name);
844
845	if ((rcode=adpt_i2o_online_hba(pHba)) < 0) {
846		adpt_i2o_delete_hba(pHba);
847		return rcode;
848	}
849	PDEBUG("%s: in OPERATIONAL state\n",pHba->name);
850
851	if ((rcode=adpt_i2o_lct_get(pHba)) < 0){
852		adpt_i2o_delete_hba(pHba);
853		return rcode;
854	}
855
856	if ((rcode=adpt_i2o_reparse_lct(pHba)) < 0){
857		adpt_i2o_delete_hba(pHba);
858		return rcode;
859	}
860	pHba->state &= ~DPTI_STATE_RESET;
861
862	adpt_fail_posted_scbs(pHba);
863	return 0;	/* return success */
864}
865
866/*===========================================================================
867 *
868 *===========================================================================
869 */
870
871
872static void adpt_i2o_sys_shutdown(void)
873{
874	adpt_hba *pHba, *pNext;
875	struct adpt_i2o_post_wait_data *p1, *old;
876
877	 printk(KERN_INFO"Shutting down Adaptec I2O controllers.\n");
878	 printk(KERN_INFO"   This could take a few minutes if there are many devices attached\n");
879	/* Delete all IOPs from the controller chain */
880	/* They should have already been released by the
881	 * scsi-core
882	 */
883	for (pHba = hba_chain; pHba; pHba = pNext) {
884		pNext = pHba->next;
885		adpt_i2o_delete_hba(pHba);
886	}
887
888	/* Remove any timedout entries from the wait queue.  */
889//	spin_lock_irqsave(&adpt_post_wait_lock, flags);
890	/* Nothing should be outstanding at this point so just
891	 * free them
892	 */
893	for(p1 = adpt_post_wait_queue; p1;) {
894		old = p1;
895		p1 = p1->next;
896		kfree(old);
897	}
898//	spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
899	adpt_post_wait_queue = NULL;
900
901	 printk(KERN_INFO "Adaptec I2O controllers down.\n");
902}
903
904static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev)
905{
906
907	adpt_hba* pHba = NULL;
908	adpt_hba* p = NULL;
909	ulong base_addr0_phys = 0;
910	ulong base_addr1_phys = 0;
911	u32 hba_map0_area_size = 0;
912	u32 hba_map1_area_size = 0;
913	void __iomem *base_addr_virt = NULL;
914	void __iomem *msg_addr_virt = NULL;
915	int dma64 = 0;
916
917	int raptorFlag = FALSE;
918
919	if(pci_enable_device(pDev)) {
920		return -EINVAL;
921	}
922
923	if (pci_request_regions(pDev, "dpt_i2o")) {
924		PERROR("dpti: adpt_config_hba: pci request region failed\n");
925		return -EINVAL;
926	}
927
928	pci_set_master(pDev);
929
930	/*
931	 *	See if we should enable dma64 mode.
932	 */
933	if (sizeof(dma_addr_t) > 4 &&
934	    pci_set_dma_mask(pDev, DMA_BIT_MASK(64)) == 0) {
935		if (dma_get_required_mask(&pDev->dev) > DMA_BIT_MASK(32))
936			dma64 = 1;
937	}
938	if (!dma64 && pci_set_dma_mask(pDev, DMA_BIT_MASK(32)) != 0)
939		return -EINVAL;
940
941	/* adapter only supports message blocks below 4GB */
942	pci_set_consistent_dma_mask(pDev, DMA_BIT_MASK(32));
943
944	base_addr0_phys = pci_resource_start(pDev,0);
945	hba_map0_area_size = pci_resource_len(pDev,0);
946
947	// Check if standard PCI card or single BAR Raptor
948	if(pDev->device == PCI_DPT_DEVICE_ID){
949		if(pDev->subsystem_device >=0xc032 && pDev->subsystem_device <= 0xc03b){
950			// Raptor card with this device id needs 4M
951			hba_map0_area_size = 0x400000;
952		} else { // Not Raptor - it is a PCI card
953			if(hba_map0_area_size > 0x100000 ){
954				hba_map0_area_size = 0x100000;
955			}
956		}
957	} else {// Raptor split BAR config
958		// Use BAR1 in this configuration
959		base_addr1_phys = pci_resource_start(pDev,1);
960		hba_map1_area_size = pci_resource_len(pDev,1);
961		raptorFlag = TRUE;
962	}
963
964#if BITS_PER_LONG == 64
965	/*
966	 *	The original Adaptec 64 bit driver has this comment here:
967	 *	"x86_64 machines need more optimal mappings"
968	 *
969	 *	I assume some HBAs report ridiculously large mappings
970	 *	and we need to limit them on platforms with IOMMUs.
971	 */
972	if (raptorFlag == TRUE) {
973		if (hba_map0_area_size > 128)
974			hba_map0_area_size = 128;
975		if (hba_map1_area_size > 524288)
976			hba_map1_area_size = 524288;
977	} else {
978		if (hba_map0_area_size > 524288)
979			hba_map0_area_size = 524288;
980	}
981#endif
982
983	base_addr_virt = ioremap(base_addr0_phys,hba_map0_area_size);
984	if (!base_addr_virt) {
985		pci_release_regions(pDev);
986		PERROR("dpti: adpt_config_hba: io remap failed\n");
987		return -EINVAL;
988	}
989
990        if(raptorFlag == TRUE) {
991		msg_addr_virt = ioremap(base_addr1_phys, hba_map1_area_size );
992		if (!msg_addr_virt) {
993			PERROR("dpti: adpt_config_hba: io remap failed on BAR1\n");
994			iounmap(base_addr_virt);
995			pci_release_regions(pDev);
996			return -EINVAL;
997		}
998	} else {
999		msg_addr_virt = base_addr_virt;
1000	}
1001
1002	// Allocate and zero the data structure
1003	pHba = kzalloc(sizeof(adpt_hba), GFP_KERNEL);
1004	if (!pHba) {
1005		if (msg_addr_virt != base_addr_virt)
1006			iounmap(msg_addr_virt);
1007		iounmap(base_addr_virt);
1008		pci_release_regions(pDev);
1009		return -ENOMEM;
1010	}
1011
1012	mutex_lock(&adpt_configuration_lock);
1013
1014	if(hba_chain != NULL){
1015		for(p = hba_chain; p->next; p = p->next);
1016		p->next = pHba;
1017	} else {
1018		hba_chain = pHba;
1019	}
1020	pHba->next = NULL;
1021	pHba->unit = hba_count;
1022	sprintf(pHba->name, "dpti%d", hba_count);
1023	hba_count++;
1024
1025	mutex_unlock(&adpt_configuration_lock);
1026
1027	pHba->pDev = pDev;
1028	pHba->base_addr_phys = base_addr0_phys;
1029
1030	// Set up the Virtual Base Address of the I2O Device
1031	pHba->base_addr_virt = base_addr_virt;
1032	pHba->msg_addr_virt = msg_addr_virt;
1033	pHba->irq_mask = base_addr_virt+0x30;
1034	pHba->post_port = base_addr_virt+0x40;
1035	pHba->reply_port = base_addr_virt+0x44;
1036
1037	pHba->hrt = NULL;
1038	pHba->lct = NULL;
1039	pHba->lct_size = 0;
1040	pHba->status_block = NULL;
1041	pHba->post_count = 0;
1042	pHba->state = DPTI_STATE_RESET;
1043	pHba->pDev = pDev;
1044	pHba->devices = NULL;
1045	pHba->dma64 = dma64;
1046
1047	// Initializing the spinlocks
1048	spin_lock_init(&pHba->state_lock);
1049	spin_lock_init(&adpt_post_wait_lock);
1050
1051	if(raptorFlag == 0){
1052		printk(KERN_INFO "Adaptec I2O RAID controller"
1053				 " %d at %p size=%x irq=%d%s\n",
1054			hba_count-1, base_addr_virt,
1055			hba_map0_area_size, pDev->irq,
1056			dma64 ? " (64-bit DMA)" : "");
1057	} else {
1058		printk(KERN_INFO"Adaptec I2O RAID controller %d irq=%d%s\n",
1059			hba_count-1, pDev->irq,
1060			dma64 ? " (64-bit DMA)" : "");
1061		printk(KERN_INFO"     BAR0 %p - size= %x\n",base_addr_virt,hba_map0_area_size);
1062		printk(KERN_INFO"     BAR1 %p - size= %x\n",msg_addr_virt,hba_map1_area_size);
1063	}
1064
1065	if (request_irq (pDev->irq, adpt_isr, IRQF_SHARED, pHba->name, pHba)) {
1066		printk(KERN_ERR"%s: Couldn't register IRQ %d\n", pHba->name, pDev->irq);
1067		adpt_i2o_delete_hba(pHba);
1068		return -EINVAL;
1069	}
1070
1071	return 0;
1072}
1073
1074
1075static void adpt_i2o_delete_hba(adpt_hba* pHba)
1076{
1077	adpt_hba* p1;
1078	adpt_hba* p2;
1079	struct i2o_device* d;
1080	struct i2o_device* next;
1081	int i;
1082	int j;
1083	struct adpt_device* pDev;
1084	struct adpt_device* pNext;
1085
1086
1087	mutex_lock(&adpt_configuration_lock);
1088	// scsi_unregister calls our adpt_release which
1089	// does a quiese
1090	if(pHba->host){
1091		free_irq(pHba->host->irq, pHba);
1092	}
1093	p2 = NULL;
1094	for( p1 = hba_chain; p1; p2 = p1,p1=p1->next){
1095		if(p1 == pHba) {
1096			if(p2) {
1097				p2->next = p1->next;
1098			} else {
1099				hba_chain = p1->next;
1100			}
1101			break;
1102		}
1103	}
1104
1105	hba_count--;
1106	mutex_unlock(&adpt_configuration_lock);
1107
1108	iounmap(pHba->base_addr_virt);
1109	pci_release_regions(pHba->pDev);
1110	if(pHba->msg_addr_virt != pHba->base_addr_virt){
1111		iounmap(pHba->msg_addr_virt);
1112	}
1113	if(pHba->FwDebugBuffer_P)
1114	   	iounmap(pHba->FwDebugBuffer_P);
1115	if(pHba->hrt) {
1116		dma_free_coherent(&pHba->pDev->dev,
1117			pHba->hrt->num_entries * pHba->hrt->entry_len << 2,
1118			pHba->hrt, pHba->hrt_pa);
1119	}
1120	if(pHba->lct) {
1121		dma_free_coherent(&pHba->pDev->dev, pHba->lct_size,
1122			pHba->lct, pHba->lct_pa);
1123	}
1124	if(pHba->status_block) {
1125		dma_free_coherent(&pHba->pDev->dev, sizeof(i2o_status_block),
1126			pHba->status_block, pHba->status_block_pa);
1127	}
1128	if(pHba->reply_pool) {
1129		dma_free_coherent(&pHba->pDev->dev,
1130			pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4,
1131			pHba->reply_pool, pHba->reply_pool_pa);
1132	}
1133
1134	for(d = pHba->devices; d ; d = next){
1135		next = d->next;
1136		kfree(d);
1137	}
1138	for(i = 0 ; i < pHba->top_scsi_channel ; i++){
1139		for(j = 0; j < MAX_ID; j++){
1140			if(pHba->channel[i].device[j] != NULL){
1141				for(pDev = pHba->channel[i].device[j]; pDev; pDev = pNext){
1142					pNext = pDev->next_lun;
1143					kfree(pDev);
1144				}
1145			}
1146		}
1147	}
1148	pci_dev_put(pHba->pDev);
1149	if (adpt_sysfs_class)
1150		device_destroy(adpt_sysfs_class,
1151				MKDEV(DPTI_I2O_MAJOR, pHba->unit));
1152	kfree(pHba);
1153
1154	if(hba_count <= 0){
1155		unregister_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER);
1156		if (adpt_sysfs_class) {
1157			class_destroy(adpt_sysfs_class);
1158			adpt_sysfs_class = NULL;
1159		}
1160	}
1161}
1162
1163static struct adpt_device* adpt_find_device(adpt_hba* pHba, u32 chan, u32 id, u64 lun)
1164{
1165	struct adpt_device* d;
1166
1167	if(chan < 0 || chan >= MAX_CHANNEL)
1168		return NULL;
1169
1170	if( pHba->channel[chan].device == NULL){
1171		printk(KERN_DEBUG"Adaptec I2O RAID: Trying to find device before they are allocated\n");
1172		return NULL;
1173	}
1174
1175	d = pHba->channel[chan].device[id];
1176	if(!d || d->tid == 0) {
1177		return NULL;
1178	}
1179
1180	/* If it is the only lun at that address then this should match*/
1181	if(d->scsi_lun == lun){
1182		return d;
1183	}
1184
1185	/* else we need to look through all the luns */
1186	for(d=d->next_lun ; d ; d = d->next_lun){
1187		if(d->scsi_lun == lun){
1188			return d;
1189		}
1190	}
1191	return NULL;
1192}
1193
1194
1195static int adpt_i2o_post_wait(adpt_hba* pHba, u32* msg, int len, int timeout)
1196{
1197	// I used my own version of the WAIT_QUEUE_HEAD
1198	// to handle some version differences
1199	// When embedded in the kernel this could go back to the vanilla one
1200	ADPT_DECLARE_WAIT_QUEUE_HEAD(adpt_wq_i2o_post);
1201	int status = 0;
1202	ulong flags = 0;
1203	struct adpt_i2o_post_wait_data *p1, *p2;
1204	struct adpt_i2o_post_wait_data *wait_data =
1205		kmalloc(sizeof(struct adpt_i2o_post_wait_data), GFP_ATOMIC);
1206	DECLARE_WAITQUEUE(wait, current);
1207
1208	if (!wait_data)
1209		return -ENOMEM;
1210
1211	/*
1212	 * The spin locking is needed to keep anyone from playing
1213	 * with the queue pointers and id while we do the same
1214	 */
1215	spin_lock_irqsave(&adpt_post_wait_lock, flags);
1216       // TODO we need a MORE unique way of getting ids
1217       // to support async LCT get
1218	wait_data->next = adpt_post_wait_queue;
1219	adpt_post_wait_queue = wait_data;
1220	adpt_post_wait_id++;
1221	adpt_post_wait_id &= 0x7fff;
1222	wait_data->id =  adpt_post_wait_id;
1223	spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
1224
1225	wait_data->wq = &adpt_wq_i2o_post;
1226	wait_data->status = -ETIMEDOUT;
1227
1228	add_wait_queue(&adpt_wq_i2o_post, &wait);
1229
1230	msg[2] |= 0x80000000 | ((u32)wait_data->id);
1231	timeout *= HZ;
1232	if((status = adpt_i2o_post_this(pHba, msg, len)) == 0){
1233		set_current_state(TASK_INTERRUPTIBLE);
1234		if(pHba->host)
1235			spin_unlock_irq(pHba->host->host_lock);
1236		if (!timeout)
1237			schedule();
1238		else{
1239			timeout = schedule_timeout(timeout);
1240			if (timeout == 0) {
1241				// I/O issued, but cannot get result in
1242				// specified time. Freeing resorces is
1243				// dangerous.
1244				status = -ETIME;
1245			}
1246		}
1247		if(pHba->host)
1248			spin_lock_irq(pHba->host->host_lock);
1249	}
1250	remove_wait_queue(&adpt_wq_i2o_post, &wait);
1251
1252	if(status == -ETIMEDOUT){
1253		printk(KERN_INFO"dpti%d: POST WAIT TIMEOUT\n",pHba->unit);
1254		// We will have to free the wait_data memory during shutdown
1255		return status;
1256	}
1257
1258	/* Remove the entry from the queue.  */
1259	p2 = NULL;
1260	spin_lock_irqsave(&adpt_post_wait_lock, flags);
1261	for(p1 = adpt_post_wait_queue; p1; p2 = p1, p1 = p1->next) {
1262		if(p1 == wait_data) {
1263			if(p1->status == I2O_DETAIL_STATUS_UNSUPPORTED_FUNCTION ) {
1264				status = -EOPNOTSUPP;
1265			}
1266			if(p2) {
1267				p2->next = p1->next;
1268			} else {
1269				adpt_post_wait_queue = p1->next;
1270			}
1271			break;
1272		}
1273	}
1274	spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
1275
1276	kfree(wait_data);
1277
1278	return status;
1279}
1280
1281
1282static s32 adpt_i2o_post_this(adpt_hba* pHba, u32* data, int len)
1283{
1284
1285	u32 m = EMPTY_QUEUE;
1286	u32 __iomem *msg;
1287	ulong timeout = jiffies + 30*HZ;
1288	do {
1289		rmb();
1290		m = readl(pHba->post_port);
1291		if (m != EMPTY_QUEUE) {
1292			break;
1293		}
1294		if(time_after(jiffies,timeout)){
1295			printk(KERN_WARNING"dpti%d: Timeout waiting for message frame!\n", pHba->unit);
1296			return -ETIMEDOUT;
1297		}
1298		schedule_timeout_uninterruptible(1);
1299	} while(m == EMPTY_QUEUE);
1300
1301	msg = pHba->msg_addr_virt + m;
1302	memcpy_toio(msg, data, len);
1303	wmb();
1304
1305	//post message
1306	writel(m, pHba->post_port);
1307	wmb();
1308
1309	return 0;
1310}
1311
1312
1313static void adpt_i2o_post_wait_complete(u32 context, int status)
1314{
1315	struct adpt_i2o_post_wait_data *p1 = NULL;
1316	/*
1317	 * We need to search through the adpt_post_wait
1318	 * queue to see if the given message is still
1319	 * outstanding.  If not, it means that the IOP
1320	 * took longer to respond to the message than we
1321	 * had allowed and timer has already expired.
1322	 * Not much we can do about that except log
1323	 * it for debug purposes, increase timeout, and recompile
1324	 *
1325	 * Lock needed to keep anyone from moving queue pointers
1326	 * around while we're looking through them.
1327	 */
1328
1329	context &= 0x7fff;
1330
1331	spin_lock(&adpt_post_wait_lock);
1332	for(p1 = adpt_post_wait_queue; p1; p1 = p1->next) {
1333		if(p1->id == context) {
1334			p1->status = status;
1335			spin_unlock(&adpt_post_wait_lock);
1336			wake_up_interruptible(p1->wq);
1337			return;
1338		}
1339	}
1340	spin_unlock(&adpt_post_wait_lock);
1341        // If this happens we lose commands that probably really completed
1342	printk(KERN_DEBUG"dpti: Could Not find task %d in wait queue\n",context);
1343	printk(KERN_DEBUG"      Tasks in wait queue:\n");
1344	for(p1 = adpt_post_wait_queue; p1; p1 = p1->next) {
1345		printk(KERN_DEBUG"           %d\n",p1->id);
1346	}
1347	return;
1348}
1349
1350static s32 adpt_i2o_reset_hba(adpt_hba* pHba)
1351{
1352	u32 msg[8];
1353	u8* status;
1354	dma_addr_t addr;
1355	u32 m = EMPTY_QUEUE ;
1356	ulong timeout = jiffies + (TMOUT_IOPRESET*HZ);
1357
1358	if(pHba->initialized  == FALSE) {	// First time reset should be quick
1359		timeout = jiffies + (25*HZ);
1360	} else {
1361		adpt_i2o_quiesce_hba(pHba);
1362	}
1363
1364	do {
1365		rmb();
1366		m = readl(pHba->post_port);
1367		if (m != EMPTY_QUEUE) {
1368			break;
1369		}
1370		if(time_after(jiffies,timeout)){
1371			printk(KERN_WARNING"Timeout waiting for message!\n");
1372			return -ETIMEDOUT;
1373		}
1374		schedule_timeout_uninterruptible(1);
1375	} while (m == EMPTY_QUEUE);
1376
1377	status = dma_alloc_coherent(&pHba->pDev->dev, 4, &addr, GFP_KERNEL);
1378	if(status == NULL) {
1379		adpt_send_nop(pHba, m);
1380		printk(KERN_ERR"IOP reset failed - no free memory.\n");
1381		return -ENOMEM;
1382	}
1383	memset(status,0,4);
1384
1385	msg[0]=EIGHT_WORD_MSG_SIZE|SGL_OFFSET_0;
1386	msg[1]=I2O_CMD_ADAPTER_RESET<<24|HOST_TID<<12|ADAPTER_TID;
1387	msg[2]=0;
1388	msg[3]=0;
1389	msg[4]=0;
1390	msg[5]=0;
1391	msg[6]=dma_low(addr);
1392	msg[7]=dma_high(addr);
1393
1394	memcpy_toio(pHba->msg_addr_virt+m, msg, sizeof(msg));
1395	wmb();
1396	writel(m, pHba->post_port);
1397	wmb();
1398
1399	while(*status == 0){
1400		if(time_after(jiffies,timeout)){
1401			printk(KERN_WARNING"%s: IOP Reset Timeout\n",pHba->name);
1402			/* We lose 4 bytes of "status" here, but we cannot
1403			   free these because controller may awake and corrupt
1404			   those bytes at any time */
1405			/* dma_free_coherent(&pHba->pDev->dev, 4, buf, addr); */
1406			return -ETIMEDOUT;
1407		}
1408		rmb();
1409		schedule_timeout_uninterruptible(1);
1410	}
1411
1412	if(*status == 0x01 /*I2O_EXEC_IOP_RESET_IN_PROGRESS*/) {
1413		PDEBUG("%s: Reset in progress...\n", pHba->name);
1414		// Here we wait for message frame to become available
1415		// indicated that reset has finished
1416		do {
1417			rmb();
1418			m = readl(pHba->post_port);
1419			if (m != EMPTY_QUEUE) {
1420				break;
1421			}
1422			if(time_after(jiffies,timeout)){
1423				printk(KERN_ERR "%s:Timeout waiting for IOP Reset.\n",pHba->name);
1424				/* We lose 4 bytes of "status" here, but we
1425				   cannot free these because controller may
1426				   awake and corrupt those bytes at any time */
1427				/* dma_free_coherent(&pHba->pDev->dev, 4, buf, addr); */
1428				return -ETIMEDOUT;
1429			}
1430			schedule_timeout_uninterruptible(1);
1431		} while (m == EMPTY_QUEUE);
1432		// Flush the offset
1433		adpt_send_nop(pHba, m);
1434	}
1435	adpt_i2o_status_get(pHba);
1436	if(*status == 0x02 ||
1437			pHba->status_block->iop_state != ADAPTER_STATE_RESET) {
1438		printk(KERN_WARNING"%s: Reset reject, trying to clear\n",
1439				pHba->name);
1440	} else {
1441		PDEBUG("%s: Reset completed.\n", pHba->name);
1442	}
1443
1444	dma_free_coherent(&pHba->pDev->dev, 4, status, addr);
1445#ifdef UARTDELAY
1446	// This delay is to allow someone attached to the card through the debug UART to
1447	// set up the dump levels that they want before the rest of the initialization sequence
1448	adpt_delay(20000);
1449#endif
1450	return 0;
1451}
1452
1453
1454static int adpt_i2o_parse_lct(adpt_hba* pHba)
1455{
1456	int i;
1457	int max;
1458	int tid;
1459	struct i2o_device *d;
1460	i2o_lct *lct = pHba->lct;
1461	u8 bus_no = 0;
1462	s16 scsi_id;
1463	u64 scsi_lun;
1464	u32 buf[10]; // larger than 7, or 8 ...
1465	struct adpt_device* pDev;
1466
1467	if (lct == NULL) {
1468		printk(KERN_ERR "%s: LCT is empty???\n",pHba->name);
1469		return -1;
1470	}
1471
1472	max = lct->table_size;
1473	max -= 3;
1474	max /= 9;
1475
1476	for(i=0;i<max;i++) {
1477		if( lct->lct_entry[i].user_tid != 0xfff){
1478			/*
1479			 * If we have hidden devices, we need to inform the upper layers about
1480			 * the possible maximum id reference to handle device access when
1481			 * an array is disassembled. This code has no other purpose but to
1482			 * allow us future access to devices that are currently hidden
1483			 * behind arrays, hotspares or have not been configured (JBOD mode).
1484			 */
1485			if( lct->lct_entry[i].class_id != I2O_CLASS_RANDOM_BLOCK_STORAGE &&
1486			    lct->lct_entry[i].class_id != I2O_CLASS_SCSI_PERIPHERAL &&
1487			    lct->lct_entry[i].class_id != I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
1488			    	continue;
1489			}
1490			tid = lct->lct_entry[i].tid;
1491			// I2O_DPT_DEVICE_INFO_GROUP_NO;
1492			if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)<0) {
1493				continue;
1494			}
1495			bus_no = buf[0]>>16;
1496			scsi_id = buf[1];
1497			scsi_lun = scsilun_to_int((struct scsi_lun *)&buf[2]);
1498			if(bus_no >= MAX_CHANNEL) {	// Something wrong skip it
1499				printk(KERN_WARNING"%s: Channel number %d out of range \n", pHba->name, bus_no);
1500				continue;
1501			}
1502			if (scsi_id >= MAX_ID){
1503				printk(KERN_WARNING"%s: SCSI ID %d out of range \n", pHba->name, bus_no);
1504				continue;
1505			}
1506			if(bus_no > pHba->top_scsi_channel){
1507				pHba->top_scsi_channel = bus_no;
1508			}
1509			if(scsi_id > pHba->top_scsi_id){
1510				pHba->top_scsi_id = scsi_id;
1511			}
1512			if(scsi_lun > pHba->top_scsi_lun){
1513				pHba->top_scsi_lun = scsi_lun;
1514			}
1515			continue;
1516		}
1517		d = kmalloc(sizeof(struct i2o_device), GFP_KERNEL);
1518		if(d==NULL)
1519		{
1520			printk(KERN_CRIT"%s: Out of memory for I2O device data.\n",pHba->name);
1521			return -ENOMEM;
1522		}
1523
1524		d->controller = pHba;
1525		d->next = NULL;
1526
1527		memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
1528
1529		d->flags = 0;
1530		tid = d->lct_data.tid;
1531		adpt_i2o_report_hba_unit(pHba, d);
1532		adpt_i2o_install_device(pHba, d);
1533	}
1534	bus_no = 0;
1535	for(d = pHba->devices; d ; d = d->next) {
1536		if(d->lct_data.class_id  == I2O_CLASS_BUS_ADAPTER_PORT ||
1537		   d->lct_data.class_id  == I2O_CLASS_FIBRE_CHANNEL_PORT){
1538			tid = d->lct_data.tid;
1539			// TODO get the bus_no from hrt-but for now they are in order
1540			//bus_no =
1541			if(bus_no > pHba->top_scsi_channel){
1542				pHba->top_scsi_channel = bus_no;
1543			}
1544			pHba->channel[bus_no].type = d->lct_data.class_id;
1545			pHba->channel[bus_no].tid = tid;
1546			if(adpt_i2o_query_scalar(pHba, tid, 0x0200, -1, buf, 28)>=0)
1547			{
1548				pHba->channel[bus_no].scsi_id = buf[1];
1549				PDEBUG("Bus %d - SCSI ID %d.\n", bus_no, buf[1]);
1550			}
1551			// TODO remove - this is just until we get from hrt
1552			bus_no++;
1553			if(bus_no >= MAX_CHANNEL) {	// Something wrong skip it
1554				printk(KERN_WARNING"%s: Channel number %d out of range - LCT\n", pHba->name, bus_no);
1555				break;
1556			}
1557		}
1558	}
1559
1560	// Setup adpt_device table
1561	for(d = pHba->devices; d ; d = d->next) {
1562		if(d->lct_data.class_id  == I2O_CLASS_RANDOM_BLOCK_STORAGE ||
1563		   d->lct_data.class_id  == I2O_CLASS_SCSI_PERIPHERAL ||
1564		   d->lct_data.class_id  == I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
1565
1566			tid = d->lct_data.tid;
1567			scsi_id = -1;
1568			// I2O_DPT_DEVICE_INFO_GROUP_NO;
1569			if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)>=0) {
1570				bus_no = buf[0]>>16;
1571				scsi_id = buf[1];
1572				scsi_lun = scsilun_to_int((struct scsi_lun *)&buf[2]);
1573				if(bus_no >= MAX_CHANNEL) {	// Something wrong skip it
1574					continue;
1575				}
1576				if (scsi_id >= MAX_ID) {
1577					continue;
1578				}
1579				if( pHba->channel[bus_no].device[scsi_id] == NULL){
1580					pDev =  kzalloc(sizeof(struct adpt_device),GFP_KERNEL);
1581					if(pDev == NULL) {
1582						return -ENOMEM;
1583					}
1584					pHba->channel[bus_no].device[scsi_id] = pDev;
1585				} else {
1586					for( pDev = pHba->channel[bus_no].device[scsi_id];
1587							pDev->next_lun; pDev = pDev->next_lun){
1588					}
1589					pDev->next_lun = kzalloc(sizeof(struct adpt_device),GFP_KERNEL);
1590					if(pDev->next_lun == NULL) {
1591						return -ENOMEM;
1592					}
1593					pDev = pDev->next_lun;
1594				}
1595				pDev->tid = tid;
1596				pDev->scsi_channel = bus_no;
1597				pDev->scsi_id = scsi_id;
1598				pDev->scsi_lun = scsi_lun;
1599				pDev->pI2o_dev = d;
1600				d->owner = pDev;
1601				pDev->type = (buf[0])&0xff;
1602				pDev->flags = (buf[0]>>8)&0xff;
1603				if(scsi_id > pHba->top_scsi_id){
1604					pHba->top_scsi_id = scsi_id;
1605				}
1606				if(scsi_lun > pHba->top_scsi_lun){
1607					pHba->top_scsi_lun = scsi_lun;
1608				}
1609			}
1610			if(scsi_id == -1){
1611				printk(KERN_WARNING"Could not find SCSI ID for %s\n",
1612						d->lct_data.identity_tag);
1613			}
1614		}
1615	}
1616	return 0;
1617}
1618
1619
1620/*
1621 *	Each I2O controller has a chain of devices on it - these match
1622 *	the useful parts of the LCT of the board.
1623 */
1624
1625static int adpt_i2o_install_device(adpt_hba* pHba, struct i2o_device *d)
1626{
1627	mutex_lock(&adpt_configuration_lock);
1628	d->controller=pHba;
1629	d->owner=NULL;
1630	d->next=pHba->devices;
1631	d->prev=NULL;
1632	if (pHba->devices != NULL){
1633		pHba->devices->prev=d;
1634	}
1635	pHba->devices=d;
1636	*d->dev_name = 0;
1637
1638	mutex_unlock(&adpt_configuration_lock);
1639	return 0;
1640}
1641
1642static int adpt_open(struct inode *inode, struct file *file)
1643{
1644	int minor;
1645	adpt_hba* pHba;
1646
1647	mutex_lock(&adpt_mutex);
1648	//TODO check for root access
1649	//
1650	minor = iminor(inode);
1651	if (minor >= hba_count) {
1652		mutex_unlock(&adpt_mutex);
1653		return -ENXIO;
1654	}
1655	mutex_lock(&adpt_configuration_lock);
1656	for (pHba = hba_chain; pHba; pHba = pHba->next) {
1657		if (pHba->unit == minor) {
1658			break;	/* found adapter */
1659		}
1660	}
1661	if (pHba == NULL) {
1662		mutex_unlock(&adpt_configuration_lock);
1663		mutex_unlock(&adpt_mutex);
1664		return -ENXIO;
1665	}
1666
1667//	if(pHba->in_use){
1668	//	mutex_unlock(&adpt_configuration_lock);
1669//		return -EBUSY;
1670//	}
1671
1672	pHba->in_use = 1;
1673	mutex_unlock(&adpt_configuration_lock);
1674	mutex_unlock(&adpt_mutex);
1675
1676	return 0;
1677}
1678
1679static int adpt_close(struct inode *inode, struct file *file)
1680{
1681	int minor;
1682	adpt_hba* pHba;
1683
1684	minor = iminor(inode);
1685	if (minor >= hba_count) {
1686		return -ENXIO;
1687	}
1688	mutex_lock(&adpt_configuration_lock);
1689	for (pHba = hba_chain; pHba; pHba = pHba->next) {
1690		if (pHba->unit == minor) {
1691			break;	/* found adapter */
1692		}
1693	}
1694	mutex_unlock(&adpt_configuration_lock);
1695	if (pHba == NULL) {
1696		return -ENXIO;
1697	}
1698
1699	pHba->in_use = 0;
1700
1701	return 0;
1702}
1703
1704
1705static int adpt_i2o_passthru(adpt_hba* pHba, u32 __user *arg)
1706{
1707	u32 msg[MAX_MESSAGE_SIZE];
1708	u32* reply = NULL;
1709	u32 size = 0;
1710	u32 reply_size = 0;
1711	u32 __user *user_msg = arg;
1712	u32 __user * user_reply = NULL;
1713	void *sg_list[pHba->sg_tablesize];
1714	u32 sg_offset = 0;
1715	u32 sg_count = 0;
1716	int sg_index = 0;
1717	u32 i = 0;
1718	u32 rcode = 0;
1719	void *p = NULL;
1720	dma_addr_t addr;
1721	ulong flags = 0;
1722
1723	memset(&msg, 0, MAX_MESSAGE_SIZE*4);
1724	// get user msg size in u32s
1725	if(get_user(size, &user_msg[0])){
1726		return -EFAULT;
1727	}
1728	size = size>>16;
1729
1730	user_reply = &user_msg[size];
1731	if(size > MAX_MESSAGE_SIZE){
1732		return -EFAULT;
1733	}
1734	size *= 4; // Convert to bytes
1735
1736	/* Copy in the user's I2O command */
1737	if(copy_from_user(msg, user_msg, size)) {
1738		return -EFAULT;
1739	}
1740	get_user(reply_size, &user_reply[0]);
1741	reply_size = reply_size>>16;
1742	if(reply_size > REPLY_FRAME_SIZE){
1743		reply_size = REPLY_FRAME_SIZE;
1744	}
1745	reply_size *= 4;
1746	reply = kzalloc(REPLY_FRAME_SIZE*4, GFP_KERNEL);
1747	if(reply == NULL) {
1748		printk(KERN_WARNING"%s: Could not allocate reply buffer\n",pHba->name);
1749		return -ENOMEM;
1750	}
1751	sg_offset = (msg[0]>>4)&0xf;
1752	msg[2] = 0x40000000; // IOCTL context
1753	msg[3] = adpt_ioctl_to_context(pHba, reply);
1754	if (msg[3] == (u32)-1)
1755		return -EBUSY;
1756
1757	memset(sg_list,0, sizeof(sg_list[0])*pHba->sg_tablesize);
1758	if(sg_offset) {
1759		// TODO add 64 bit API
1760		struct sg_simple_element *sg =  (struct sg_simple_element*) (msg+sg_offset);
1761		sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
1762		if (sg_count > pHba->sg_tablesize){
1763			printk(KERN_DEBUG"%s:IOCTL SG List too large (%u)\n", pHba->name,sg_count);
1764			kfree (reply);
1765			return -EINVAL;
1766		}
1767
1768		for(i = 0; i < sg_count; i++) {
1769			int sg_size;
1770
1771			if (!(sg[i].flag_count & 0x10000000 /*I2O_SGL_FLAGS_SIMPLE_ADDRESS_ELEMENT*/)) {
1772				printk(KERN_DEBUG"%s:Bad SG element %d - not simple (%x)\n",pHba->name,i,  sg[i].flag_count);
1773				rcode = -EINVAL;
1774				goto cleanup;
1775			}
1776			sg_size = sg[i].flag_count & 0xffffff;
1777			/* Allocate memory for the transfer */
1778			p = dma_alloc_coherent(&pHba->pDev->dev, sg_size, &addr, GFP_KERNEL);
1779			if(!p) {
1780				printk(KERN_DEBUG"%s: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
1781						pHba->name,sg_size,i,sg_count);
1782				rcode = -ENOMEM;
1783				goto cleanup;
1784			}
1785			sg_list[sg_index++] = p; // sglist indexed with input frame, not our internal frame.
1786			/* Copy in the user's SG buffer if necessary */
1787			if(sg[i].flag_count & 0x04000000 /*I2O_SGL_FLAGS_DIR*/) {
1788				// sg_simple_element API is 32 bit
1789				if (copy_from_user(p,(void __user *)(ulong)sg[i].addr_bus, sg_size)) {
1790					printk(KERN_DEBUG"%s: Could not copy SG buf %d FROM user\n",pHba->name,i);
1791					rcode = -EFAULT;
1792					goto cleanup;
1793				}
1794			}
1795			/* sg_simple_element API is 32 bit, but addr < 4GB */
1796			sg[i].addr_bus = addr;
1797		}
1798	}
1799
1800	do {
1801		/*
1802		 * Stop any new commands from enterring the
1803		 * controller while processing the ioctl
1804		 */
1805		if (pHba->host) {
1806			scsi_block_requests(pHba->host);
1807			spin_lock_irqsave(pHba->host->host_lock, flags);
1808		}
1809		rcode = adpt_i2o_post_wait(pHba, msg, size, FOREVER);
1810		if (rcode != 0)
1811			printk("adpt_i2o_passthru: post wait failed %d %p\n",
1812					rcode, reply);
1813		if (pHba->host) {
1814			spin_unlock_irqrestore(pHba->host->host_lock, flags);
1815			scsi_unblock_requests(pHba->host);
1816		}
1817	} while (rcode == -ETIMEDOUT);
1818
1819	if(rcode){
1820		goto cleanup;
1821	}
1822
1823	if(sg_offset) {
1824	/* Copy back the Scatter Gather buffers back to user space */
1825		u32 j;
1826		// TODO add 64 bit API
1827		struct sg_simple_element* sg;
1828		int sg_size;
1829
1830		// re-acquire the original message to handle correctly the sg copy operation
1831		memset(&msg, 0, MAX_MESSAGE_SIZE*4);
1832		// get user msg size in u32s
1833		if(get_user(size, &user_msg[0])){
1834			rcode = -EFAULT;
1835			goto cleanup;
1836		}
1837		size = size>>16;
1838		size *= 4;
1839		if (size > MAX_MESSAGE_SIZE) {
1840			rcode = -EINVAL;
1841			goto cleanup;
1842		}
1843		/* Copy in the user's I2O command */
1844		if (copy_from_user (msg, user_msg, size)) {
1845			rcode = -EFAULT;
1846			goto cleanup;
1847		}
1848		sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
1849
1850		// TODO add 64 bit API
1851		sg 	 = (struct sg_simple_element*)(msg + sg_offset);
1852		for (j = 0; j < sg_count; j++) {
1853			/* Copy out the SG list to user's buffer if necessary */
1854			if(! (sg[j].flag_count & 0x4000000 /*I2O_SGL_FLAGS_DIR*/)) {
1855				sg_size = sg[j].flag_count & 0xffffff;
1856				// sg_simple_element API is 32 bit
1857				if (copy_to_user((void __user *)(ulong)sg[j].addr_bus,sg_list[j], sg_size)) {
1858					printk(KERN_WARNING"%s: Could not copy %p TO user %x\n",pHba->name, sg_list[j], sg[j].addr_bus);
1859					rcode = -EFAULT;
1860					goto cleanup;
1861				}
1862			}
1863		}
1864	}
1865
1866	/* Copy back the reply to user space */
1867	if (reply_size) {
1868		// we wrote our own values for context - now restore the user supplied ones
1869		if(copy_from_user(reply+2, user_msg+2, sizeof(u32)*2)) {
1870			printk(KERN_WARNING"%s: Could not copy message context FROM user\n",pHba->name);
1871			rcode = -EFAULT;
1872		}
1873		if(copy_to_user(user_reply, reply, reply_size)) {
1874			printk(KERN_WARNING"%s: Could not copy reply TO user\n",pHba->name);
1875			rcode = -EFAULT;
1876		}
1877	}
1878
1879
1880cleanup:
1881	if (rcode != -ETIME && rcode != -EINTR) {
1882		struct sg_simple_element *sg =
1883				(struct sg_simple_element*) (msg +sg_offset);
1884		kfree (reply);
1885		while(sg_index) {
1886			if(sg_list[--sg_index]) {
1887				dma_free_coherent(&pHba->pDev->dev,
1888					sg[sg_index].flag_count & 0xffffff,
1889					sg_list[sg_index],
1890					sg[sg_index].addr_bus);
1891			}
1892		}
1893	}
1894	return rcode;
1895}
1896
1897#if defined __ia64__
1898static void adpt_ia64_info(sysInfo_S* si)
1899{
1900	// This is all the info we need for now
1901	// We will add more info as our new
1902	// managmenent utility requires it
1903	si->processorType = PROC_IA64;
1904}
1905#endif
1906
1907#if defined __sparc__
1908static void adpt_sparc_info(sysInfo_S* si)
1909{
1910	// This is all the info we need for now
1911	// We will add more info as our new
1912	// managmenent utility requires it
1913	si->processorType = PROC_ULTRASPARC;
1914}
1915#endif
1916#if defined __alpha__
1917static void adpt_alpha_info(sysInfo_S* si)
1918{
1919	// This is all the info we need for now
1920	// We will add more info as our new
1921	// managmenent utility requires it
1922	si->processorType = PROC_ALPHA;
1923}
1924#endif
1925
1926#if defined __i386__
1927static void adpt_i386_info(sysInfo_S* si)
1928{
1929	// This is all the info we need for now
1930	// We will add more info as our new
1931	// managmenent utility requires it
1932	switch (boot_cpu_data.x86) {
1933	case CPU_386:
1934		si->processorType = PROC_386;
1935		break;
1936	case CPU_486:
1937		si->processorType = PROC_486;
1938		break;
1939	case CPU_586:
1940		si->processorType = PROC_PENTIUM;
1941		break;
1942	default:  // Just in case
1943		si->processorType = PROC_PENTIUM;
1944		break;
1945	}
1946}
1947#endif
1948
1949/*
1950 * This routine returns information about the system.  This does not effect
1951 * any logic and if the info is wrong - it doesn't matter.
1952 */
1953
1954/* Get all the info we can not get from kernel services */
1955static int adpt_system_info(void __user *buffer)
1956{
1957	sysInfo_S si;
1958
1959	memset(&si, 0, sizeof(si));
1960
1961	si.osType = OS_LINUX;
1962	si.osMajorVersion = 0;
1963	si.osMinorVersion = 0;
1964	si.osRevision = 0;
1965	si.busType = SI_PCI_BUS;
1966	si.processorFamily = DPTI_sig.dsProcessorFamily;
1967
1968#if defined __i386__
1969	adpt_i386_info(&si);
1970#elif defined (__ia64__)
1971	adpt_ia64_info(&si);
1972#elif defined(__sparc__)
1973	adpt_sparc_info(&si);
1974#elif defined (__alpha__)
1975	adpt_alpha_info(&si);
1976#else
1977	si.processorType = 0xff ;
1978#endif
1979	if (copy_to_user(buffer, &si, sizeof(si))){
1980		printk(KERN_WARNING"dpti: Could not copy buffer TO user\n");
1981		return -EFAULT;
1982	}
1983
1984	return 0;
1985}
1986
1987static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd, ulong arg)
1988{
1989	int minor;
1990	int error = 0;
1991	adpt_hba* pHba;
1992	ulong flags = 0;
1993	void __user *argp = (void __user *)arg;
1994
1995	minor = iminor(inode);
1996	if (minor >= DPTI_MAX_HBA){
1997		return -ENXIO;
1998	}
1999	mutex_lock(&adpt_configuration_lock);
2000	for (pHba = hba_chain; pHba; pHba = pHba->next) {
2001		if (pHba->unit == minor) {
2002			break;	/* found adapter */
2003		}
2004	}
2005	mutex_unlock(&adpt_configuration_lock);
2006	if(pHba == NULL){
2007		return -ENXIO;
2008	}
2009
2010	while((volatile u32) pHba->state & DPTI_STATE_RESET )
2011		schedule_timeout_uninterruptible(2);
2012
2013	switch (cmd) {
2014	// TODO: handle 3 cases
2015	case DPT_SIGNATURE:
2016		if (copy_to_user(argp, &DPTI_sig, sizeof(DPTI_sig))) {
2017			return -EFAULT;
2018		}
2019		break;
2020	case I2OUSRCMD:
2021		return adpt_i2o_passthru(pHba, argp);
2022
2023	case DPT_CTRLINFO:{
2024		drvrHBAinfo_S HbaInfo;
2025
2026#define FLG_OSD_PCI_VALID 0x0001
2027#define FLG_OSD_DMA	  0x0002
2028#define FLG_OSD_I2O	  0x0004
2029		memset(&HbaInfo, 0, sizeof(HbaInfo));
2030		HbaInfo.drvrHBAnum = pHba->unit;
2031		HbaInfo.baseAddr = (ulong) pHba->base_addr_phys;
2032		HbaInfo.blinkState = adpt_read_blink_led(pHba);
2033		HbaInfo.pciBusNum =  pHba->pDev->bus->number;
2034		HbaInfo.pciDeviceNum=PCI_SLOT(pHba->pDev->devfn);
2035		HbaInfo.Interrupt = pHba->pDev->irq;
2036		HbaInfo.hbaFlags = FLG_OSD_PCI_VALID | FLG_OSD_DMA | FLG_OSD_I2O;
2037		if(copy_to_user(argp, &HbaInfo, sizeof(HbaInfo))){
2038			printk(KERN_WARNING"%s: Could not copy HbaInfo TO user\n",pHba->name);
2039			return -EFAULT;
2040		}
2041		break;
2042		}
2043	case DPT_SYSINFO:
2044		return adpt_system_info(argp);
2045	case DPT_BLINKLED:{
2046		u32 value;
2047		value = (u32)adpt_read_blink_led(pHba);
2048		if (copy_to_user(argp, &value, sizeof(value))) {
2049			return -EFAULT;
2050		}
2051		break;
2052		}
2053	case I2ORESETCMD:
2054		if(pHba->host)
2055			spin_lock_irqsave(pHba->host->host_lock, flags);
2056		adpt_hba_reset(pHba);
2057		if(pHba->host)
2058			spin_unlock_irqrestore(pHba->host->host_lock, flags);
2059		break;
2060	case I2ORESCANCMD:
2061		adpt_rescan(pHba);
2062		break;
2063	default:
2064		return -EINVAL;
2065	}
2066
2067	return error;
2068}
2069
2070static long adpt_unlocked_ioctl(struct file *file, uint cmd, ulong arg)
2071{
2072	struct inode *inode;
2073	long ret;
2074
2075	inode = file_inode(file);
2076
2077	mutex_lock(&adpt_mutex);
2078	ret = adpt_ioctl(inode, file, cmd, arg);
2079	mutex_unlock(&adpt_mutex);
2080
2081	return ret;
2082}
2083
2084#ifdef CONFIG_COMPAT
2085static long compat_adpt_ioctl(struct file *file,
2086				unsigned int cmd, unsigned long arg)
2087{
2088	struct inode *inode;
2089	long ret;
2090
2091	inode = file_inode(file);
2092
2093	mutex_lock(&adpt_mutex);
2094
2095	switch(cmd) {
2096		case DPT_SIGNATURE:
2097		case I2OUSRCMD:
2098		case DPT_CTRLINFO:
2099		case DPT_SYSINFO:
2100		case DPT_BLINKLED:
2101		case I2ORESETCMD:
2102		case I2ORESCANCMD:
2103		case (DPT_TARGET_BUSY & 0xFFFF):
2104		case DPT_TARGET_BUSY:
2105			ret = adpt_ioctl(inode, file, cmd, arg);
2106			break;
2107		default:
2108			ret =  -ENOIOCTLCMD;
2109	}
2110
2111	mutex_unlock(&adpt_mutex);
2112
2113	return ret;
2114}
2115#endif
2116
2117static irqreturn_t adpt_isr(int irq, void *dev_id)
2118{
2119	struct scsi_cmnd* cmd;
2120	adpt_hba* pHba = dev_id;
2121	u32 m;
2122	void __iomem *reply;
2123	u32 status=0;
2124	u32 context;
2125	ulong flags = 0;
2126	int handled = 0;
2127
2128	if (pHba == NULL){
2129		printk(KERN_WARNING"adpt_isr: NULL dev_id\n");
2130		return IRQ_NONE;
2131	}
2132	if(pHba->host)
2133		spin_lock_irqsave(pHba->host->host_lock, flags);
2134
2135	while( readl(pHba->irq_mask) & I2O_INTERRUPT_PENDING_B) {
2136		m = readl(pHba->reply_port);
2137		if(m == EMPTY_QUEUE){
2138			// Try twice then give up
2139			rmb();
2140			m = readl(pHba->reply_port);
2141			if(m == EMPTY_QUEUE){
2142				// This really should not happen
2143				printk(KERN_ERR"dpti: Could not get reply frame\n");
2144				goto out;
2145			}
2146		}
2147		if (pHba->reply_pool_pa <= m &&
2148		    m < pHba->reply_pool_pa +
2149			(pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4)) {
2150			reply = (u8 *)pHba->reply_pool +
2151						(m - pHba->reply_pool_pa);
2152		} else {
2153			/* Ick, we should *never* be here */
2154			printk(KERN_ERR "dpti: reply frame not from pool\n");
2155			reply = (u8 *)bus_to_virt(m);
2156		}
2157
2158		if (readl(reply) & MSG_FAIL) {
2159			u32 old_m = readl(reply+28);
2160			void __iomem *msg;
2161			u32 old_context;
2162			PDEBUG("%s: Failed message\n",pHba->name);
2163			if(old_m >= 0x100000){
2164				printk(KERN_ERR"%s: Bad preserved MFA (%x)- dropping frame\n",pHba->name,old_m);
2165				writel(m,pHba->reply_port);
2166				continue;
2167			}
2168			// Transaction context is 0 in failed reply frame
2169			msg = pHba->msg_addr_virt + old_m;
2170			old_context = readl(msg+12);
2171			writel(old_context, reply+12);
2172			adpt_send_nop(pHba, old_m);
2173		}
2174		context = readl(reply+8);
2175		if(context & 0x40000000){ // IOCTL
2176			void *p = adpt_ioctl_from_context(pHba, readl(reply+12));
2177			if( p != NULL) {
2178				memcpy_fromio(p, reply, REPLY_FRAME_SIZE * 4);
2179			}
2180			// All IOCTLs will also be post wait
2181		}
2182		if(context & 0x80000000){ // Post wait message
2183			status = readl(reply+16);
2184			if(status  >> 24){
2185				status &=  0xffff; /* Get detail status */
2186			} else {
2187				status = I2O_POST_WAIT_OK;
2188			}
2189			if(!(context & 0x40000000)) {
2190				cmd = adpt_cmd_from_context(pHba,
2191							readl(reply+12));
2192				if(cmd != NULL) {
2193					printk(KERN_WARNING"%s: Apparent SCSI cmd in Post Wait Context - cmd=%p context=%x\n", pHba->name, cmd, context);
2194				}
2195			}
2196			adpt_i2o_post_wait_complete(context, status);
2197		} else { // SCSI message
2198			cmd = adpt_cmd_from_context (pHba, readl(reply+12));
2199			if(cmd != NULL){
2200				scsi_dma_unmap(cmd);
2201				if(cmd->serial_number != 0) { // If not timedout
2202					adpt_i2o_to_scsi(reply, cmd);
2203				}
2204			}
2205		}
2206		writel(m, pHba->reply_port);
2207		wmb();
2208		rmb();
2209	}
2210	handled = 1;
2211out:	if(pHba->host)
2212		spin_unlock_irqrestore(pHba->host->host_lock, flags);
2213	return IRQ_RETVAL(handled);
2214}
2215
2216static s32 adpt_scsi_to_i2o(adpt_hba* pHba, struct scsi_cmnd* cmd, struct adpt_device* d)
2217{
2218	int i;
2219	u32 msg[MAX_MESSAGE_SIZE];
2220	u32* mptr;
2221	u32* lptr;
2222	u32 *lenptr;
2223	int direction;
2224	int scsidir;
2225	int nseg;
2226	u32 len;
2227	u32 reqlen;
2228	s32 rcode;
2229	dma_addr_t addr;
2230
2231	memset(msg, 0 , sizeof(msg));
2232	len = scsi_bufflen(cmd);
2233	direction = 0x00000000;
2234
2235	scsidir = 0x00000000;			// DATA NO XFER
2236	if(len) {
2237		/*
2238		 * Set SCBFlags to indicate if data is being transferred
2239		 * in or out, or no data transfer
2240		 * Note:  Do not have to verify index is less than 0 since
2241		 * cmd->cmnd[0] is an unsigned char
2242		 */
2243		switch(cmd->sc_data_direction){
2244		case DMA_FROM_DEVICE:
2245			scsidir  =0x40000000;	// DATA IN  (iop<--dev)
2246			break;
2247		case DMA_TO_DEVICE:
2248			direction=0x04000000;	// SGL OUT
2249			scsidir  =0x80000000;	// DATA OUT (iop-->dev)
2250			break;
2251		case DMA_NONE:
2252			break;
2253		case DMA_BIDIRECTIONAL:
2254			scsidir  =0x40000000;	// DATA IN  (iop<--dev)
2255			// Assume In - and continue;
2256			break;
2257		default:
2258			printk(KERN_WARNING"%s: scsi opcode 0x%x not supported.\n",
2259			     pHba->name, cmd->cmnd[0]);
2260			cmd->result = (DID_OK <<16) | (INITIATOR_ERROR << 8);
2261			cmd->scsi_done(cmd);
2262			return 	0;
2263		}
2264	}
2265	// msg[0] is set later
2266	// I2O_CMD_SCSI_EXEC
2267	msg[1] = ((0xff<<24)|(HOST_TID<<12)|d->tid);
2268	msg[2] = 0;
2269	msg[3] = adpt_cmd_to_context(cmd);  /* Want SCSI control block back */
2270	// Our cards use the transaction context as the tag for queueing
2271	// Adaptec/DPT Private stuff
2272	msg[4] = I2O_CMD_SCSI_EXEC|(DPT_ORGANIZATION_ID<<16);
2273	msg[5] = d->tid;
2274	/* Direction, disconnect ok | sense data | simple queue , CDBLen */
2275	// I2O_SCB_FLAG_ENABLE_DISCONNECT |
2276	// I2O_SCB_FLAG_SIMPLE_QUEUE_TAG |
2277	// I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE;
2278	msg[6] = scsidir|0x20a00000|cmd->cmd_len;
2279
2280	mptr=msg+7;
2281
2282	// Write SCSI command into the message - always 16 byte block
2283	memset(mptr, 0,  16);
2284	memcpy(mptr, cmd->cmnd, cmd->cmd_len);
2285	mptr+=4;
2286	lenptr=mptr++;		/* Remember me - fill in when we know */
2287	if (dpt_dma64(pHba)) {
2288		reqlen = 16;		// SINGLE SGE
2289		*mptr++ = (0x7C<<24)+(2<<16)+0x02; /* Enable 64 bit */
2290		*mptr++ = 1 << PAGE_SHIFT;
2291	} else {
2292		reqlen = 14;		// SINGLE SGE
2293	}
2294	/* Now fill in the SGList and command */
2295
2296	nseg = scsi_dma_map(cmd);
2297	BUG_ON(nseg < 0);
2298	if (nseg) {
2299		struct scatterlist *sg;
2300
2301		len = 0;
2302		scsi_for_each_sg(cmd, sg, nseg, i) {
2303			lptr = mptr;
2304			*mptr++ = direction|0x10000000|sg_dma_len(sg);
2305			len+=sg_dma_len(sg);
2306			addr = sg_dma_address(sg);
2307			*mptr++ = dma_low(addr);
2308			if (dpt_dma64(pHba))
2309				*mptr++ = dma_high(addr);
2310			/* Make this an end of list */
2311			if (i == nseg - 1)
2312				*lptr = direction|0xD0000000|sg_dma_len(sg);
2313		}
2314		reqlen = mptr - msg;
2315		*lenptr = len;
2316
2317		if(cmd->underflow && len != cmd->underflow){
2318			printk(KERN_WARNING"Cmd len %08X Cmd underflow %08X\n",
2319				len, cmd->underflow);
2320		}
2321	} else {
2322		*lenptr = len = 0;
2323		reqlen = 12;
2324	}
2325
2326	/* Stick the headers on */
2327	msg[0] = reqlen<<16 | ((reqlen > 12) ? SGL_OFFSET_12 : SGL_OFFSET_0);
2328
2329	// Send it on it's way
2330	rcode = adpt_i2o_post_this(pHba, msg, reqlen<<2);
2331	if (rcode == 0) {
2332		return 0;
2333	}
2334	return rcode;
2335}
2336
2337
2338static s32 adpt_scsi_host_alloc(adpt_hba* pHba, struct scsi_host_template *sht)
2339{
2340	struct Scsi_Host *host;
2341
2342	host = scsi_host_alloc(sht, sizeof(adpt_hba*));
2343	if (host == NULL) {
2344		printk("%s: scsi_host_alloc returned NULL\n", pHba->name);
2345		return -1;
2346	}
2347	host->hostdata[0] = (unsigned long)pHba;
2348	pHba->host = host;
2349
2350	host->irq = pHba->pDev->irq;
2351	/* no IO ports, so don't have to set host->io_port and
2352	 * host->n_io_port
2353	 */
2354	host->io_port = 0;
2355	host->n_io_port = 0;
2356				/* see comments in scsi_host.h */
2357	host->max_id = 16;
2358	host->max_lun = 256;
2359	host->max_channel = pHba->top_scsi_channel + 1;
2360	host->cmd_per_lun = 1;
2361	host->unique_id = (u32)sys_tbl_pa + pHba->unit;
2362	host->sg_tablesize = pHba->sg_tablesize;
2363	host->can_queue = pHba->post_fifo_size;
2364	host->use_cmd_list = 1;
2365
2366	return 0;
2367}
2368
2369
2370static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd)
2371{
2372	adpt_hba* pHba;
2373	u32 hba_status;
2374	u32 dev_status;
2375	u32 reply_flags = readl(reply) & 0xff00; // Leave it shifted up 8 bits
2376	// I know this would look cleaner if I just read bytes
2377	// but the model I have been using for all the rest of the
2378	// io is in 4 byte words - so I keep that model
2379	u16 detailed_status = readl(reply+16) &0xffff;
2380	dev_status = (detailed_status & 0xff);
2381	hba_status = detailed_status >> 8;
2382
2383	// calculate resid for sg
2384	scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(reply+20));
2385
2386	pHba = (adpt_hba*) cmd->device->host->hostdata[0];
2387
2388	cmd->sense_buffer[0] = '\0';  // initialize sense valid flag to false
2389
2390	if(!(reply_flags & MSG_FAIL)) {
2391		switch(detailed_status & I2O_SCSI_DSC_MASK) {
2392		case I2O_SCSI_DSC_SUCCESS:
2393			cmd->result = (DID_OK << 16);
2394			// handle underflow
2395			if (readl(reply+20) < cmd->underflow) {
2396				cmd->result = (DID_ERROR <<16);
2397				printk(KERN_WARNING"%s: SCSI CMD underflow\n",pHba->name);
2398			}
2399			break;
2400		case I2O_SCSI_DSC_REQUEST_ABORTED:
2401			cmd->result = (DID_ABORT << 16);
2402			break;
2403		case I2O_SCSI_DSC_PATH_INVALID:
2404		case I2O_SCSI_DSC_DEVICE_NOT_PRESENT:
2405		case I2O_SCSI_DSC_SELECTION_TIMEOUT:
2406		case I2O_SCSI_DSC_COMMAND_TIMEOUT:
2407		case I2O_SCSI_DSC_NO_ADAPTER:
2408		case I2O_SCSI_DSC_RESOURCE_UNAVAILABLE:
2409			printk(KERN_WARNING"%s: SCSI Timeout-Device (%d,%d,%llu) hba status=0x%x, dev status=0x%x, cmd=0x%x\n",
2410				pHba->name, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun, hba_status, dev_status, cmd->cmnd[0]);
2411			cmd->result = (DID_TIME_OUT << 16);
2412			break;
2413		case I2O_SCSI_DSC_ADAPTER_BUSY:
2414		case I2O_SCSI_DSC_BUS_BUSY:
2415			cmd->result = (DID_BUS_BUSY << 16);
2416			break;
2417		case I2O_SCSI_DSC_SCSI_BUS_RESET:
2418		case I2O_SCSI_DSC_BDR_MESSAGE_SENT:
2419			cmd->result = (DID_RESET << 16);
2420			break;
2421		case I2O_SCSI_DSC_PARITY_ERROR_FAILURE:
2422			printk(KERN_WARNING"%s: SCSI CMD parity error\n",pHba->name);
2423			cmd->result = (DID_PARITY << 16);
2424			break;
2425		case I2O_SCSI_DSC_UNABLE_TO_ABORT:
2426		case I2O_SCSI_DSC_COMPLETE_WITH_ERROR:
2427		case I2O_SCSI_DSC_UNABLE_TO_TERMINATE:
2428		case I2O_SCSI_DSC_MR_MESSAGE_RECEIVED:
2429		case I2O_SCSI_DSC_AUTOSENSE_FAILED:
2430		case I2O_SCSI_DSC_DATA_OVERRUN:
2431		case I2O_SCSI_DSC_UNEXPECTED_BUS_FREE:
2432		case I2O_SCSI_DSC_SEQUENCE_FAILURE:
2433		case I2O_SCSI_DSC_REQUEST_LENGTH_ERROR:
2434		case I2O_SCSI_DSC_PROVIDE_FAILURE:
2435		case I2O_SCSI_DSC_REQUEST_TERMINATED:
2436		case I2O_SCSI_DSC_IDE_MESSAGE_SENT:
2437		case I2O_SCSI_DSC_UNACKNOWLEDGED_EVENT:
2438		case I2O_SCSI_DSC_MESSAGE_RECEIVED:
2439		case I2O_SCSI_DSC_INVALID_CDB:
2440		case I2O_SCSI_DSC_LUN_INVALID:
2441		case I2O_SCSI_DSC_SCSI_TID_INVALID:
2442		case I2O_SCSI_DSC_FUNCTION_UNAVAILABLE:
2443		case I2O_SCSI_DSC_NO_NEXUS:
2444		case I2O_SCSI_DSC_CDB_RECEIVED:
2445		case I2O_SCSI_DSC_LUN_ALREADY_ENABLED:
2446		case I2O_SCSI_DSC_QUEUE_FROZEN:
2447		case I2O_SCSI_DSC_REQUEST_INVALID:
2448		default:
2449			printk(KERN_WARNING"%s: SCSI error %0x-Device(%d,%d,%llu) hba_status=0x%x, dev_status=0x%x, cmd=0x%x\n",
2450				pHba->name, detailed_status & I2O_SCSI_DSC_MASK, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun,
2451			       hba_status, dev_status, cmd->cmnd[0]);
2452			cmd->result = (DID_ERROR << 16);
2453			break;
2454		}
2455
2456		// copy over the request sense data if it was a check
2457		// condition status
2458		if (dev_status == SAM_STAT_CHECK_CONDITION) {
2459			u32 len = min(SCSI_SENSE_BUFFERSIZE, 40);
2460			// Copy over the sense data
2461			memcpy_fromio(cmd->sense_buffer, (reply+28) , len);
2462			if(cmd->sense_buffer[0] == 0x70 /* class 7 */ &&
2463			   cmd->sense_buffer[2] == DATA_PROTECT ){
2464				/* This is to handle an array failed */
2465				cmd->result = (DID_TIME_OUT << 16);
2466				printk(KERN_WARNING"%s: SCSI Data Protect-Device (%d,%d,%llu) hba_status=0x%x, dev_status=0x%x, cmd=0x%x\n",
2467					pHba->name, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun,
2468					hba_status, dev_status, cmd->cmnd[0]);
2469
2470			}
2471		}
2472	} else {
2473		/* In this condtion we could not talk to the tid
2474		 * the card rejected it.  We should signal a retry
2475		 * for a limitted number of retries.
2476		 */
2477		cmd->result = (DID_TIME_OUT << 16);
2478		printk(KERN_WARNING"%s: I2O MSG_FAIL - Device (%d,%d,%llu) tid=%d, cmd=0x%x\n",
2479			pHba->name, (u32)cmd->device->channel, (u32)cmd->device->id, cmd->device->lun,
2480			((struct adpt_device*)(cmd->device->hostdata))->tid, cmd->cmnd[0]);
2481	}
2482
2483	cmd->result |= (dev_status);
2484
2485	if(cmd->scsi_done != NULL){
2486		cmd->scsi_done(cmd);
2487	}
2488	return cmd->result;
2489}
2490
2491
2492static s32 adpt_rescan(adpt_hba* pHba)
2493{
2494	s32 rcode;
2495	ulong flags = 0;
2496
2497	if(pHba->host)
2498		spin_lock_irqsave(pHba->host->host_lock, flags);
2499	if ((rcode=adpt_i2o_lct_get(pHba)) < 0)
2500		goto out;
2501	if ((rcode=adpt_i2o_reparse_lct(pHba)) < 0)
2502		goto out;
2503	rcode = 0;
2504out:	if(pHba->host)
2505		spin_unlock_irqrestore(pHba->host->host_lock, flags);
2506	return rcode;
2507}
2508
2509
2510static s32 adpt_i2o_reparse_lct(adpt_hba* pHba)
2511{
2512	int i;
2513	int max;
2514	int tid;
2515	struct i2o_device *d;
2516	i2o_lct *lct = pHba->lct;
2517	u8 bus_no = 0;
2518	s16 scsi_id;
2519	u64 scsi_lun;
2520	u32 buf[10]; // at least 8 u32's
2521	struct adpt_device* pDev = NULL;
2522	struct i2o_device* pI2o_dev = NULL;
2523
2524	if (lct == NULL) {
2525		printk(KERN_ERR "%s: LCT is empty???\n",pHba->name);
2526		return -1;
2527	}
2528
2529	max = lct->table_size;
2530	max -= 3;
2531	max /= 9;
2532
2533	// Mark each drive as unscanned
2534	for (d = pHba->devices; d; d = d->next) {
2535		pDev =(struct adpt_device*) d->owner;
2536		if(!pDev){
2537			continue;
2538		}
2539		pDev->state |= DPTI_DEV_UNSCANNED;
2540	}
2541
2542	printk(KERN_INFO "%s: LCT has %d entries.\n", pHba->name,max);
2543
2544	for(i=0;i<max;i++) {
2545		if( lct->lct_entry[i].user_tid != 0xfff){
2546			continue;
2547		}
2548
2549		if( lct->lct_entry[i].class_id == I2O_CLASS_RANDOM_BLOCK_STORAGE ||
2550		    lct->lct_entry[i].class_id == I2O_CLASS_SCSI_PERIPHERAL ||
2551		    lct->lct_entry[i].class_id == I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
2552			tid = lct->lct_entry[i].tid;
2553			if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)<0) {
2554				printk(KERN_ERR"%s: Could not query device\n",pHba->name);
2555				continue;
2556			}
2557			bus_no = buf[0]>>16;
2558			if (bus_no >= MAX_CHANNEL) {	/* Something wrong skip it */
2559				printk(KERN_WARNING
2560					"%s: Channel number %d out of range\n",
2561					pHba->name, bus_no);
2562				continue;
2563			}
2564
2565			scsi_id = buf[1];
2566			scsi_lun = scsilun_to_int((struct scsi_lun *)&buf[2]);
2567			pDev = pHba->channel[bus_no].device[scsi_id];
2568			/* da lun */
2569			while(pDev) {
2570				if(pDev->scsi_lun == scsi_lun) {
2571					break;
2572				}
2573				pDev = pDev->next_lun;
2574			}
2575			if(!pDev ) { // Something new add it
2576				d = kmalloc(sizeof(struct i2o_device),
2577					    GFP_ATOMIC);
2578				if(d==NULL)
2579				{
2580					printk(KERN_CRIT "Out of memory for I2O device data.\n");
2581					return -ENOMEM;
2582				}
2583
2584				d->controller = pHba;
2585				d->next = NULL;
2586
2587				memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
2588
2589				d->flags = 0;
2590				adpt_i2o_report_hba_unit(pHba, d);
2591				adpt_i2o_install_device(pHba, d);
2592
2593				pDev = pHba->channel[bus_no].device[scsi_id];
2594				if( pDev == NULL){
2595					pDev =
2596					  kzalloc(sizeof(struct adpt_device),
2597						  GFP_ATOMIC);
2598					if(pDev == NULL) {
2599						return -ENOMEM;
2600					}
2601					pHba->channel[bus_no].device[scsi_id] = pDev;
2602				} else {
2603					while (pDev->next_lun) {
2604						pDev = pDev->next_lun;
2605					}
2606					pDev = pDev->next_lun =
2607					  kzalloc(sizeof(struct adpt_device),
2608						  GFP_ATOMIC);
2609					if(pDev == NULL) {
2610						return -ENOMEM;
2611					}
2612				}
2613				pDev->tid = d->lct_data.tid;
2614				pDev->scsi_channel = bus_no;
2615				pDev->scsi_id = scsi_id;
2616				pDev->scsi_lun = scsi_lun;
2617				pDev->pI2o_dev = d;
2618				d->owner = pDev;
2619				pDev->type = (buf[0])&0xff;
2620				pDev->flags = (buf[0]>>8)&0xff;
2621				// Too late, SCSI system has made up it's mind, but what the hey ...
2622				if(scsi_id > pHba->top_scsi_id){
2623					pHba->top_scsi_id = scsi_id;
2624				}
2625				if(scsi_lun > pHba->top_scsi_lun){
2626					pHba->top_scsi_lun = scsi_lun;
2627				}
2628				continue;
2629			} // end of new i2o device
2630
2631			// We found an old device - check it
2632			while(pDev) {
2633				if(pDev->scsi_lun == scsi_lun) {
2634					if(!scsi_device_online(pDev->pScsi_dev)) {
2635						printk(KERN_WARNING"%s: Setting device (%d,%d,%llu) back online\n",
2636								pHba->name,bus_no,scsi_id,scsi_lun);
2637						if (pDev->pScsi_dev) {
2638							scsi_device_set_state(pDev->pScsi_dev, SDEV_RUNNING);
2639						}
2640					}
2641					d = pDev->pI2o_dev;
2642					if(d->lct_data.tid != tid) { // something changed
2643						pDev->tid = tid;
2644						memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
2645						if (pDev->pScsi_dev) {
2646							pDev->pScsi_dev->changed = TRUE;
2647							pDev->pScsi_dev->removable = TRUE;
2648						}
2649					}
2650					// Found it - mark it scanned
2651					pDev->state = DPTI_DEV_ONLINE;
2652					break;
2653				}
2654				pDev = pDev->next_lun;
2655			}
2656		}
2657	}
2658	for (pI2o_dev = pHba->devices; pI2o_dev; pI2o_dev = pI2o_dev->next) {
2659		pDev =(struct adpt_device*) pI2o_dev->owner;
2660		if(!pDev){
2661			continue;
2662		}
2663		// Drive offline drives that previously existed but could not be found
2664		// in the LCT table
2665		if (pDev->state & DPTI_DEV_UNSCANNED){
2666			pDev->state = DPTI_DEV_OFFLINE;
2667			printk(KERN_WARNING"%s: Device (%d,%d,%llu) offline\n",pHba->name,pDev->scsi_channel,pDev->scsi_id,pDev->scsi_lun);
2668			if (pDev->pScsi_dev) {
2669				scsi_device_set_state(pDev->pScsi_dev, SDEV_OFFLINE);
2670			}
2671		}
2672	}
2673	return 0;
2674}
2675
2676static void adpt_fail_posted_scbs(adpt_hba* pHba)
2677{
2678	struct scsi_cmnd* 	cmd = NULL;
2679	struct scsi_device* 	d = NULL;
2680
2681	shost_for_each_device(d, pHba->host) {
2682		unsigned long flags;
2683		spin_lock_irqsave(&d->list_lock, flags);
2684		list_for_each_entry(cmd, &d->cmd_list, list) {
2685			if(cmd->serial_number == 0){
2686				continue;
2687			}
2688			cmd->result = (DID_OK << 16) | (QUEUE_FULL <<1);
2689			cmd->scsi_done(cmd);
2690		}
2691		spin_unlock_irqrestore(&d->list_lock, flags);
2692	}
2693}
2694
2695
2696/*============================================================================
2697 *  Routines from i2o subsystem
2698 *============================================================================
2699 */
2700
2701
2702
2703/*
2704 *	Bring an I2O controller into HOLD state. See the spec.
2705 */
2706static int adpt_i2o_activate_hba(adpt_hba* pHba)
2707{
2708	int rcode;
2709
2710	if(pHba->initialized ) {
2711		if (adpt_i2o_status_get(pHba) < 0) {
2712			if((rcode = adpt_i2o_reset_hba(pHba)) != 0){
2713				printk(KERN_WARNING"%s: Could NOT reset.\n", pHba->name);
2714				return rcode;
2715			}
2716			if (adpt_i2o_status_get(pHba) < 0) {
2717				printk(KERN_INFO "HBA not responding.\n");
2718				return -1;
2719			}
2720		}
2721
2722		if(pHba->status_block->iop_state == ADAPTER_STATE_FAULTED) {
2723			printk(KERN_CRIT "%s: hardware fault\n", pHba->name);
2724			return -1;
2725		}
2726
2727		if (pHba->status_block->iop_state == ADAPTER_STATE_READY ||
2728		    pHba->status_block->iop_state == ADAPTER_STATE_OPERATIONAL ||
2729		    pHba->status_block->iop_state == ADAPTER_STATE_HOLD ||
2730		    pHba->status_block->iop_state == ADAPTER_STATE_FAILED) {
2731			adpt_i2o_reset_hba(pHba);
2732			if (adpt_i2o_status_get(pHba) < 0 || pHba->status_block->iop_state != ADAPTER_STATE_RESET) {
2733				printk(KERN_ERR "%s: Failed to initialize.\n", pHba->name);
2734				return -1;
2735			}
2736		}
2737	} else {
2738		if((rcode = adpt_i2o_reset_hba(pHba)) != 0){
2739			printk(KERN_WARNING"%s: Could NOT reset.\n", pHba->name);
2740			return rcode;
2741		}
2742
2743	}
2744
2745	if (adpt_i2o_init_outbound_q(pHba) < 0) {
2746		return -1;
2747	}
2748
2749	/* In HOLD state */
2750
2751	if (adpt_i2o_hrt_get(pHba) < 0) {
2752		return -1;
2753	}
2754
2755	return 0;
2756}
2757
2758/*
2759 *	Bring a controller online into OPERATIONAL state.
2760 */
2761
2762static int adpt_i2o_online_hba(adpt_hba* pHba)
2763{
2764	if (adpt_i2o_systab_send(pHba) < 0) {
2765		adpt_i2o_delete_hba(pHba);
2766		return -1;
2767	}
2768	/* In READY state */
2769
2770	if (adpt_i2o_enable_hba(pHba) < 0) {
2771		adpt_i2o_delete_hba(pHba);
2772		return -1;
2773	}
2774
2775	/* In OPERATIONAL state  */
2776	return 0;
2777}
2778
2779static s32 adpt_send_nop(adpt_hba*pHba,u32 m)
2780{
2781	u32 __iomem *msg;
2782	ulong timeout = jiffies + 5*HZ;
2783
2784	while(m == EMPTY_QUEUE){
2785		rmb();
2786		m = readl(pHba->post_port);
2787		if(m != EMPTY_QUEUE){
2788			break;
2789		}
2790		if(time_after(jiffies,timeout)){
2791			printk(KERN_ERR "%s: Timeout waiting for message frame!\n",pHba->name);
2792			return 2;
2793		}
2794		schedule_timeout_uninterruptible(1);
2795	}
2796	msg = (u32 __iomem *)(pHba->msg_addr_virt + m);
2797	writel( THREE_WORD_MSG_SIZE | SGL_OFFSET_0,&msg[0]);
2798	writel( I2O_CMD_UTIL_NOP << 24 | HOST_TID << 12 | 0,&msg[1]);
2799	writel( 0,&msg[2]);
2800	wmb();
2801
2802	writel(m, pHba->post_port);
2803	wmb();
2804	return 0;
2805}
2806
2807static s32 adpt_i2o_init_outbound_q(adpt_hba* pHba)
2808{
2809	u8 *status;
2810	dma_addr_t addr;
2811	u32 __iomem *msg = NULL;
2812	int i;
2813	ulong timeout = jiffies + TMOUT_INITOUTBOUND*HZ;
2814	u32 m;
2815
2816	do {
2817		rmb();
2818		m = readl(pHba->post_port);
2819		if (m != EMPTY_QUEUE) {
2820			break;
2821		}
2822
2823		if(time_after(jiffies,timeout)){
2824			printk(KERN_WARNING"%s: Timeout waiting for message frame\n",pHba->name);
2825			return -ETIMEDOUT;
2826		}
2827		schedule_timeout_uninterruptible(1);
2828	} while(m == EMPTY_QUEUE);
2829
2830	msg=(u32 __iomem *)(pHba->msg_addr_virt+m);
2831
2832	status = dma_alloc_coherent(&pHba->pDev->dev, 4, &addr, GFP_KERNEL);
2833	if (!status) {
2834		adpt_send_nop(pHba, m);
2835		printk(KERN_WARNING"%s: IOP reset failed - no free memory.\n",
2836			pHba->name);
2837		return -ENOMEM;
2838	}
2839	memset(status, 0, 4);
2840
2841	writel(EIGHT_WORD_MSG_SIZE| SGL_OFFSET_6, &msg[0]);
2842	writel(I2O_CMD_OUTBOUND_INIT<<24 | HOST_TID<<12 | ADAPTER_TID, &msg[1]);
2843	writel(0, &msg[2]);
2844	writel(0x0106, &msg[3]);	/* Transaction context */
2845	writel(4096, &msg[4]);		/* Host page frame size */
2846	writel((REPLY_FRAME_SIZE)<<16|0x80, &msg[5]);	/* Outbound msg frame size and Initcode */
2847	writel(0xD0000004, &msg[6]);		/* Simple SG LE, EOB */
2848	writel((u32)addr, &msg[7]);
2849
2850	writel(m, pHba->post_port);
2851	wmb();
2852
2853	// Wait for the reply status to come back
2854	do {
2855		if (*status) {
2856			if (*status != 0x01 /*I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS*/) {
2857				break;
2858			}
2859		}
2860		rmb();
2861		if(time_after(jiffies,timeout)){
2862			printk(KERN_WARNING"%s: Timeout Initializing\n",pHba->name);
2863			/* We lose 4 bytes of "status" here, but we
2864			   cannot free these because controller may
2865			   awake and corrupt those bytes at any time */
2866			/* dma_free_coherent(&pHba->pDev->dev, 4, status, addr); */
2867			return -ETIMEDOUT;
2868		}
2869		schedule_timeout_uninterruptible(1);
2870	} while (1);
2871
2872	// If the command was successful, fill the fifo with our reply
2873	// message packets
2874	if(*status != 0x04 /*I2O_EXEC_OUTBOUND_INIT_COMPLETE*/) {
2875		dma_free_coherent(&pHba->pDev->dev, 4, status, addr);
2876		return -2;
2877	}
2878	dma_free_coherent(&pHba->pDev->dev, 4, status, addr);
2879
2880	if(pHba->reply_pool != NULL) {
2881		dma_free_coherent(&pHba->pDev->dev,
2882			pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4,
2883			pHba->reply_pool, pHba->reply_pool_pa);
2884	}
2885
2886	pHba->reply_pool = dma_alloc_coherent(&pHba->pDev->dev,
2887				pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4,
2888				&pHba->reply_pool_pa, GFP_KERNEL);
2889	if (!pHba->reply_pool) {
2890		printk(KERN_ERR "%s: Could not allocate reply pool\n", pHba->name);
2891		return -ENOMEM;
2892	}
2893	memset(pHba->reply_pool, 0 , pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4);
2894
2895	for(i = 0; i < pHba->reply_fifo_size; i++) {
2896		writel(pHba->reply_pool_pa + (i * REPLY_FRAME_SIZE * 4),
2897			pHba->reply_port);
2898		wmb();
2899	}
2900	adpt_i2o_status_get(pHba);
2901	return 0;
2902}
2903
2904
2905/*
2906 * I2O System Table.  Contains information about
2907 * all the IOPs in the system.  Used to inform IOPs
2908 * about each other's existence.
2909 *
2910 * sys_tbl_ver is the CurrentChangeIndicator that is
2911 * used by IOPs to track changes.
2912 */
2913
2914
2915
2916static s32 adpt_i2o_status_get(adpt_hba* pHba)
2917{
2918	ulong timeout;
2919	u32 m;
2920	u32 __iomem *msg;
2921	u8 *status_block=NULL;
2922
2923	if(pHba->status_block == NULL) {
2924		pHba->status_block = dma_alloc_coherent(&pHba->pDev->dev,
2925					sizeof(i2o_status_block),
2926					&pHba->status_block_pa, GFP_KERNEL);
2927		if(pHba->status_block == NULL) {
2928			printk(KERN_ERR
2929			"dpti%d: Get Status Block failed; Out of memory. \n",
2930			pHba->unit);
2931			return -ENOMEM;
2932		}
2933	}
2934	memset(pHba->status_block, 0, sizeof(i2o_status_block));
2935	status_block = (u8*)(pHba->status_block);
2936	timeout = jiffies+TMOUT_GETSTATUS*HZ;
2937	do {
2938		rmb();
2939		m = readl(pHba->post_port);
2940		if (m != EMPTY_QUEUE) {
2941			break;
2942		}
2943		if(time_after(jiffies,timeout)){
2944			printk(KERN_ERR "%s: Timeout waiting for message !\n",
2945					pHba->name);
2946			return -ETIMEDOUT;
2947		}
2948		schedule_timeout_uninterruptible(1);
2949	} while(m==EMPTY_QUEUE);
2950
2951
2952	msg=(u32 __iomem *)(pHba->msg_addr_virt+m);
2953
2954	writel(NINE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg[0]);
2955	writel(I2O_CMD_STATUS_GET<<24|HOST_TID<<12|ADAPTER_TID, &msg[1]);
2956	writel(1, &msg[2]);
2957	writel(0, &msg[3]);
2958	writel(0, &msg[4]);
2959	writel(0, &msg[5]);
2960	writel( dma_low(pHba->status_block_pa), &msg[6]);
2961	writel( dma_high(pHba->status_block_pa), &msg[7]);
2962	writel(sizeof(i2o_status_block), &msg[8]); // 88 bytes
2963
2964	//post message
2965	writel(m, pHba->post_port);
2966	wmb();
2967
2968	while(status_block[87]!=0xff){
2969		if(time_after(jiffies,timeout)){
2970			printk(KERN_ERR"dpti%d: Get status timeout.\n",
2971				pHba->unit);
2972			return -ETIMEDOUT;
2973		}
2974		rmb();
2975		schedule_timeout_uninterruptible(1);
2976	}
2977
2978	// Set up our number of outbound and inbound messages
2979	pHba->post_fifo_size = pHba->status_block->max_inbound_frames;
2980	if (pHba->post_fifo_size > MAX_TO_IOP_MESSAGES) {
2981		pHba->post_fifo_size = MAX_TO_IOP_MESSAGES;
2982	}
2983
2984	pHba->reply_fifo_size = pHba->status_block->max_outbound_frames;
2985	if (pHba->reply_fifo_size > MAX_FROM_IOP_MESSAGES) {
2986		pHba->reply_fifo_size = MAX_FROM_IOP_MESSAGES;
2987	}
2988
2989	// Calculate the Scatter Gather list size
2990	if (dpt_dma64(pHba)) {
2991		pHba->sg_tablesize
2992		  = ((pHba->status_block->inbound_frame_size * 4
2993		  - 14 * sizeof(u32))
2994		  / (sizeof(struct sg_simple_element) + sizeof(u32)));
2995	} else {
2996		pHba->sg_tablesize
2997		  = ((pHba->status_block->inbound_frame_size * 4
2998		  - 12 * sizeof(u32))
2999		  / sizeof(struct sg_simple_element));
3000	}
3001	if (pHba->sg_tablesize > SG_LIST_ELEMENTS) {
3002		pHba->sg_tablesize = SG_LIST_ELEMENTS;
3003	}
3004
3005
3006#ifdef DEBUG
3007	printk("dpti%d: State = ",pHba->unit);
3008	switch(pHba->status_block->iop_state) {
3009		case 0x01:
3010			printk("INIT\n");
3011			break;
3012		case 0x02:
3013			printk("RESET\n");
3014			break;
3015		case 0x04:
3016			printk("HOLD\n");
3017			break;
3018		case 0x05:
3019			printk("READY\n");
3020			break;
3021		case 0x08:
3022			printk("OPERATIONAL\n");
3023			break;
3024		case 0x10:
3025			printk("FAILED\n");
3026			break;
3027		case 0x11:
3028			printk("FAULTED\n");
3029			break;
3030		default:
3031			printk("%x (unknown!!)\n",pHba->status_block->iop_state);
3032	}
3033#endif
3034	return 0;
3035}
3036
3037/*
3038 * Get the IOP's Logical Configuration Table
3039 */
3040static int adpt_i2o_lct_get(adpt_hba* pHba)
3041{
3042	u32 msg[8];
3043	int ret;
3044	u32 buf[16];
3045
3046	if ((pHba->lct_size == 0) || (pHba->lct == NULL)){
3047		pHba->lct_size = pHba->status_block->expected_lct_size;
3048	}
3049	do {
3050		if (pHba->lct == NULL) {
3051			pHba->lct = dma_alloc_coherent(&pHba->pDev->dev,
3052					pHba->lct_size, &pHba->lct_pa,
3053					GFP_ATOMIC);
3054			if(pHba->lct == NULL) {
3055				printk(KERN_CRIT "%s: Lct Get failed. Out of memory.\n",
3056					pHba->name);
3057				return -ENOMEM;
3058			}
3059		}
3060		memset(pHba->lct, 0, pHba->lct_size);
3061
3062		msg[0] = EIGHT_WORD_MSG_SIZE|SGL_OFFSET_6;
3063		msg[1] = I2O_CMD_LCT_NOTIFY<<24 | HOST_TID<<12 | ADAPTER_TID;
3064		msg[2] = 0;
3065		msg[3] = 0;
3066		msg[4] = 0xFFFFFFFF;	/* All devices */
3067		msg[5] = 0x00000000;	/* Report now */
3068		msg[6] = 0xD0000000|pHba->lct_size;
3069		msg[7] = (u32)pHba->lct_pa;
3070
3071		if ((ret=adpt_i2o_post_wait(pHba, msg, sizeof(msg), 360))) {
3072			printk(KERN_ERR "%s: LCT Get failed (status=%#10x.\n",
3073				pHba->name, ret);
3074			printk(KERN_ERR"Adaptec: Error Reading Hardware.\n");
3075			return ret;
3076		}
3077
3078		if ((pHba->lct->table_size << 2) > pHba->lct_size) {
3079			pHba->lct_size = pHba->lct->table_size << 2;
3080			dma_free_coherent(&pHba->pDev->dev, pHba->lct_size,
3081					pHba->lct, pHba->lct_pa);
3082			pHba->lct = NULL;
3083		}
3084	} while (pHba->lct == NULL);
3085
3086	PDEBUG("%s: Hardware resource table read.\n", pHba->name);
3087
3088
3089	// I2O_DPT_EXEC_IOP_BUFFERS_GROUP_NO;
3090	if(adpt_i2o_query_scalar(pHba, 0 , 0x8000, -1, buf, sizeof(buf))>=0) {
3091		pHba->FwDebugBufferSize = buf[1];
3092		pHba->FwDebugBuffer_P = ioremap(pHba->base_addr_phys + buf[0],
3093						pHba->FwDebugBufferSize);
3094		if (pHba->FwDebugBuffer_P) {
3095			pHba->FwDebugFlags_P     = pHba->FwDebugBuffer_P +
3096							FW_DEBUG_FLAGS_OFFSET;
3097			pHba->FwDebugBLEDvalue_P = pHba->FwDebugBuffer_P +
3098							FW_DEBUG_BLED_OFFSET;
3099			pHba->FwDebugBLEDflag_P  = pHba->FwDebugBLEDvalue_P + 1;
3100			pHba->FwDebugStrLength_P = pHba->FwDebugBuffer_P +
3101						FW_DEBUG_STR_LENGTH_OFFSET;
3102			pHba->FwDebugBuffer_P += buf[2];
3103			pHba->FwDebugFlags = 0;
3104		}
3105	}
3106
3107	return 0;
3108}
3109
3110static int adpt_i2o_build_sys_table(void)
3111{
3112	adpt_hba* pHba = hba_chain;
3113	int count = 0;
3114
3115	if (sys_tbl)
3116		dma_free_coherent(&pHba->pDev->dev, sys_tbl_len,
3117					sys_tbl, sys_tbl_pa);
3118
3119	sys_tbl_len = sizeof(struct i2o_sys_tbl) +	// Header + IOPs
3120				(hba_count) * sizeof(struct i2o_sys_tbl_entry);
3121
3122	sys_tbl = dma_alloc_coherent(&pHba->pDev->dev,
3123				sys_tbl_len, &sys_tbl_pa, GFP_KERNEL);
3124	if (!sys_tbl) {
3125		printk(KERN_WARNING "SysTab Set failed. Out of memory.\n");
3126		return -ENOMEM;
3127	}
3128	memset(sys_tbl, 0, sys_tbl_len);
3129
3130	sys_tbl->num_entries = hba_count;
3131	sys_tbl->version = I2OVERSION;
3132	sys_tbl->change_ind = sys_tbl_ind++;
3133
3134	for(pHba = hba_chain; pHba; pHba = pHba->next) {
3135		u64 addr;
3136		// Get updated Status Block so we have the latest information
3137		if (adpt_i2o_status_get(pHba)) {
3138			sys_tbl->num_entries--;
3139			continue; // try next one
3140		}
3141
3142		sys_tbl->iops[count].org_id = pHba->status_block->org_id;
3143		sys_tbl->iops[count].iop_id = pHba->unit + 2;
3144		sys_tbl->iops[count].seg_num = 0;
3145		sys_tbl->iops[count].i2o_version = pHba->status_block->i2o_version;
3146		sys_tbl->iops[count].iop_state = pHba->status_block->iop_state;
3147		sys_tbl->iops[count].msg_type = pHba->status_block->msg_type;
3148		sys_tbl->iops[count].frame_size = pHba->status_block->inbound_frame_size;
3149		sys_tbl->iops[count].last_changed = sys_tbl_ind - 1; // ??
3150		sys_tbl->iops[count].iop_capabilities = pHba->status_block->iop_capabilities;
3151		addr = pHba->base_addr_phys + 0x40;
3152		sys_tbl->iops[count].inbound_low = dma_low(addr);
3153		sys_tbl->iops[count].inbound_high = dma_high(addr);
3154
3155		count++;
3156	}
3157
3158#ifdef DEBUG
3159{
3160	u32 *table = (u32*)sys_tbl;
3161	printk(KERN_DEBUG"sys_tbl_len=%d in 32bit words\n",(sys_tbl_len >>2));
3162	for(count = 0; count < (sys_tbl_len >>2); count++) {
3163		printk(KERN_INFO "sys_tbl[%d] = %0#10x\n",
3164			count, table[count]);
3165	}
3166}
3167#endif
3168
3169	return 0;
3170}
3171
3172
3173/*
3174 *	 Dump the information block associated with a given unit (TID)
3175 */
3176
3177static void adpt_i2o_report_hba_unit(adpt_hba* pHba, struct i2o_device *d)
3178{
3179	char buf[64];
3180	int unit = d->lct_data.tid;
3181
3182	printk(KERN_INFO "TID %3.3d ", unit);
3183
3184	if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 3, buf, 16)>=0)
3185	{
3186		buf[16]=0;
3187		printk(" Vendor: %-12.12s", buf);
3188	}
3189	if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 4, buf, 16)>=0)
3190	{
3191		buf[16]=0;
3192		printk(" Device: %-12.12s", buf);
3193	}
3194	if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 6, buf, 8)>=0)
3195	{
3196		buf[8]=0;
3197		printk(" Rev: %-12.12s\n", buf);
3198	}
3199#ifdef DEBUG
3200	 printk(KERN_INFO "\tClass: %.21s\n", adpt_i2o_get_class_name(d->lct_data.class_id));
3201	 printk(KERN_INFO "\tSubclass: 0x%04X\n", d->lct_data.sub_class);
3202	 printk(KERN_INFO "\tFlags: ");
3203
3204	 if(d->lct_data.device_flags&(1<<0))
3205		  printk("C");	     // ConfigDialog requested
3206	 if(d->lct_data.device_flags&(1<<1))
3207		  printk("U");	     // Multi-user capable
3208	 if(!(d->lct_data.device_flags&(1<<4)))
3209		  printk("P");	     // Peer service enabled!
3210	 if(!(d->lct_data.device_flags&(1<<5)))
3211		  printk("M");	     // Mgmt service enabled!
3212	 printk("\n");
3213#endif
3214}
3215
3216#ifdef DEBUG
3217/*
3218 *	Do i2o class name lookup
3219 */
3220static const char *adpt_i2o_get_class_name(int class)
3221{
3222	int idx = 16;
3223	static char *i2o_class_name[] = {
3224		"Executive",
3225		"Device Driver Module",
3226		"Block Device",
3227		"Tape Device",
3228		"LAN Interface",
3229		"WAN Interface",
3230		"Fibre Channel Port",
3231		"Fibre Channel Device",
3232		"SCSI Device",
3233		"ATE Port",
3234		"ATE Device",
3235		"Floppy Controller",
3236		"Floppy Device",
3237		"Secondary Bus Port",
3238		"Peer Transport Agent",
3239		"Peer Transport",
3240		"Unknown"
3241	};
3242
3243	switch(class&0xFFF) {
3244	case I2O_CLASS_EXECUTIVE:
3245		idx = 0; break;
3246	case I2O_CLASS_DDM:
3247		idx = 1; break;
3248	case I2O_CLASS_RANDOM_BLOCK_STORAGE:
3249		idx = 2; break;
3250	case I2O_CLASS_SEQUENTIAL_STORAGE:
3251		idx = 3; break;
3252	case I2O_CLASS_LAN:
3253		idx = 4; break;
3254	case I2O_CLASS_WAN:
3255		idx = 5; break;
3256	case I2O_CLASS_FIBRE_CHANNEL_PORT:
3257		idx = 6; break;
3258	case I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL:
3259		idx = 7; break;
3260	case I2O_CLASS_SCSI_PERIPHERAL:
3261		idx = 8; break;
3262	case I2O_CLASS_ATE_PORT:
3263		idx = 9; break;
3264	case I2O_CLASS_ATE_PERIPHERAL:
3265		idx = 10; break;
3266	case I2O_CLASS_FLOPPY_CONTROLLER:
3267		idx = 11; break;
3268	case I2O_CLASS_FLOPPY_DEVICE:
3269		idx = 12; break;
3270	case I2O_CLASS_BUS_ADAPTER_PORT:
3271		idx = 13; break;
3272	case I2O_CLASS_PEER_TRANSPORT_AGENT:
3273		idx = 14; break;
3274	case I2O_CLASS_PEER_TRANSPORT:
3275		idx = 15; break;
3276	}
3277	return i2o_class_name[idx];
3278}
3279#endif
3280
3281
3282static s32 adpt_i2o_hrt_get(adpt_hba* pHba)
3283{
3284	u32 msg[6];
3285	int ret, size = sizeof(i2o_hrt);
3286
3287	do {
3288		if (pHba->hrt == NULL) {
3289			pHba->hrt = dma_alloc_coherent(&pHba->pDev->dev,
3290					size, &pHba->hrt_pa, GFP_KERNEL);
3291			if (pHba->hrt == NULL) {
3292				printk(KERN_CRIT "%s: Hrt Get failed; Out of memory.\n", pHba->name);
3293				return -ENOMEM;
3294			}
3295		}
3296
3297		msg[0]= SIX_WORD_MSG_SIZE| SGL_OFFSET_4;
3298		msg[1]= I2O_CMD_HRT_GET<<24 | HOST_TID<<12 | ADAPTER_TID;
3299		msg[2]= 0;
3300		msg[3]= 0;
3301		msg[4]= (0xD0000000 | size);    /* Simple transaction */
3302		msg[5]= (u32)pHba->hrt_pa;	/* Dump it here */
3303
3304		if ((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg),20))) {
3305			printk(KERN_ERR "%s: Unable to get HRT (status=%#10x)\n", pHba->name, ret);
3306			return ret;
3307		}
3308
3309		if (pHba->hrt->num_entries * pHba->hrt->entry_len << 2 > size) {
3310			int newsize = pHba->hrt->num_entries * pHba->hrt->entry_len << 2;
3311			dma_free_coherent(&pHba->pDev->dev, size,
3312				pHba->hrt, pHba->hrt_pa);
3313			size = newsize;
3314			pHba->hrt = NULL;
3315		}
3316	} while(pHba->hrt == NULL);
3317	return 0;
3318}
3319
3320/*
3321 *	 Query one scalar group value or a whole scalar group.
3322 */
3323static int adpt_i2o_query_scalar(adpt_hba* pHba, int tid,
3324			int group, int field, void *buf, int buflen)
3325{
3326	u16 opblk[] = { 1, 0, I2O_PARAMS_FIELD_GET, group, 1, field };
3327	u8 *opblk_va;
3328	dma_addr_t opblk_pa;
3329	u8 *resblk_va;
3330	dma_addr_t resblk_pa;
3331
3332	int size;
3333
3334	/* 8 bytes for header */
3335	resblk_va = dma_alloc_coherent(&pHba->pDev->dev,
3336			sizeof(u8) * (8 + buflen), &resblk_pa, GFP_KERNEL);
3337	if (resblk_va == NULL) {
3338		printk(KERN_CRIT "%s: query scalar failed; Out of memory.\n", pHba->name);
3339		return -ENOMEM;
3340	}
3341
3342	opblk_va = dma_alloc_coherent(&pHba->pDev->dev,
3343			sizeof(opblk), &opblk_pa, GFP_KERNEL);
3344	if (opblk_va == NULL) {
3345		dma_free_coherent(&pHba->pDev->dev, sizeof(u8) * (8+buflen),
3346			resblk_va, resblk_pa);
3347		printk(KERN_CRIT "%s: query operatio failed; Out of memory.\n",
3348			pHba->name);
3349		return -ENOMEM;
3350	}
3351	if (field == -1)  		/* whole group */
3352			opblk[4] = -1;
3353
3354	memcpy(opblk_va, opblk, sizeof(opblk));
3355	size = adpt_i2o_issue_params(I2O_CMD_UTIL_PARAMS_GET, pHba, tid,
3356		opblk_va, opblk_pa, sizeof(opblk),
3357		resblk_va, resblk_pa, sizeof(u8)*(8+buflen));
3358	dma_free_coherent(&pHba->pDev->dev, sizeof(opblk), opblk_va, opblk_pa);
3359	if (size == -ETIME) {
3360		dma_free_coherent(&pHba->pDev->dev, sizeof(u8) * (8+buflen),
3361							resblk_va, resblk_pa);
3362		printk(KERN_WARNING "%s: issue params failed; Timed out.\n", pHba->name);
3363		return -ETIME;
3364	} else if (size == -EINTR) {
3365		dma_free_coherent(&pHba->pDev->dev, sizeof(u8) * (8+buflen),
3366							resblk_va, resblk_pa);
3367		printk(KERN_WARNING "%s: issue params failed; Interrupted.\n", pHba->name);
3368		return -EINTR;
3369	}
3370
3371	memcpy(buf, resblk_va+8, buflen);  /* cut off header */
3372
3373	dma_free_coherent(&pHba->pDev->dev, sizeof(u8) * (8+buflen),
3374						resblk_va, resblk_pa);
3375	if (size < 0)
3376		return size;
3377
3378	return buflen;
3379}
3380
3381
3382/*	Issue UTIL_PARAMS_GET or UTIL_PARAMS_SET
3383 *
3384 *	This function can be used for all UtilParamsGet/Set operations.
3385 *	The OperationBlock is given in opblk-buffer,
3386 *	and results are returned in resblk-buffer.
3387 *	Note that the minimum sized resblk is 8 bytes and contains
3388 *	ResultCount, ErrorInfoSize, BlockStatus and BlockSize.
3389 */
3390static int adpt_i2o_issue_params(int cmd, adpt_hba* pHba, int tid,
3391		  void *opblk_va,  dma_addr_t opblk_pa, int oplen,
3392		void *resblk_va, dma_addr_t resblk_pa, int reslen)
3393{
3394	u32 msg[9];
3395	u32 *res = (u32 *)resblk_va;
3396	int wait_status;
3397
3398	msg[0] = NINE_WORD_MSG_SIZE | SGL_OFFSET_5;
3399	msg[1] = cmd << 24 | HOST_TID << 12 | tid;
3400	msg[2] = 0;
3401	msg[3] = 0;
3402	msg[4] = 0;
3403	msg[5] = 0x54000000 | oplen;	/* OperationBlock */
3404	msg[6] = (u32)opblk_pa;
3405	msg[7] = 0xD0000000 | reslen;	/* ResultBlock */
3406	msg[8] = (u32)resblk_pa;
3407
3408	if ((wait_status = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 20))) {
3409		printk("adpt_i2o_issue_params: post_wait failed (%p)\n", resblk_va);
3410   		return wait_status; 	/* -DetailedStatus */
3411	}
3412
3413	if (res[1]&0x00FF0000) { 	/* BlockStatus != SUCCESS */
3414		printk(KERN_WARNING "%s: %s - Error:\n  ErrorInfoSize = 0x%02x, "
3415			"BlockStatus = 0x%02x, BlockSize = 0x%04x\n",
3416			pHba->name,
3417			(cmd == I2O_CMD_UTIL_PARAMS_SET) ? "PARAMS_SET"
3418							 : "PARAMS_GET",
3419			res[1]>>24, (res[1]>>16)&0xFF, res[1]&0xFFFF);
3420		return -((res[1] >> 16) & 0xFF); /* -BlockStatus */
3421	}
3422
3423	 return 4 + ((res[1] & 0x0000FFFF) << 2); /* bytes used in resblk */
3424}
3425
3426
3427static s32 adpt_i2o_quiesce_hba(adpt_hba* pHba)
3428{
3429	u32 msg[4];
3430	int ret;
3431
3432	adpt_i2o_status_get(pHba);
3433
3434	/* SysQuiesce discarded if IOP not in READY or OPERATIONAL state */
3435
3436	if((pHba->status_block->iop_state != ADAPTER_STATE_READY) &&
3437   	   (pHba->status_block->iop_state != ADAPTER_STATE_OPERATIONAL)){
3438		return 0;
3439	}
3440
3441	msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
3442	msg[1] = I2O_CMD_SYS_QUIESCE<<24|HOST_TID<<12|ADAPTER_TID;
3443	msg[2] = 0;
3444	msg[3] = 0;
3445
3446	if((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 240))) {
3447		printk(KERN_INFO"dpti%d: Unable to quiesce (status=%#x).\n",
3448				pHba->unit, -ret);
3449	} else {
3450		printk(KERN_INFO"dpti%d: Quiesced.\n",pHba->unit);
3451	}
3452
3453	adpt_i2o_status_get(pHba);
3454	return ret;
3455}
3456
3457
3458/*
3459 * Enable IOP. Allows the IOP to resume external operations.
3460 */
3461static int adpt_i2o_enable_hba(adpt_hba* pHba)
3462{
3463	u32 msg[4];
3464	int ret;
3465
3466	adpt_i2o_status_get(pHba);
3467	if(!pHba->status_block){
3468		return -ENOMEM;
3469	}
3470	/* Enable only allowed on READY state */
3471	if(pHba->status_block->iop_state == ADAPTER_STATE_OPERATIONAL)
3472		return 0;
3473
3474	if(pHba->status_block->iop_state != ADAPTER_STATE_READY)
3475		return -EINVAL;
3476
3477	msg[0]=FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
3478	msg[1]=I2O_CMD_SYS_ENABLE<<24|HOST_TID<<12|ADAPTER_TID;
3479	msg[2]= 0;
3480	msg[3]= 0;
3481
3482	if ((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 240))) {
3483		printk(KERN_WARNING"%s: Could not enable (status=%#10x).\n",
3484			pHba->name, ret);
3485	} else {
3486		PDEBUG("%s: Enabled.\n", pHba->name);
3487	}
3488
3489	adpt_i2o_status_get(pHba);
3490	return ret;
3491}
3492
3493
3494static int adpt_i2o_systab_send(adpt_hba* pHba)
3495{
3496	 u32 msg[12];
3497	 int ret;
3498
3499	msg[0] = I2O_MESSAGE_SIZE(12) | SGL_OFFSET_6;
3500	msg[1] = I2O_CMD_SYS_TAB_SET<<24 | HOST_TID<<12 | ADAPTER_TID;
3501	msg[2] = 0;
3502	msg[3] = 0;
3503	msg[4] = (0<<16) | ((pHba->unit+2) << 12); /* Host 0 IOP ID (unit + 2) */
3504	msg[5] = 0;				   /* Segment 0 */
3505
3506	/*
3507	 * Provide three SGL-elements:
3508	 * System table (SysTab), Private memory space declaration and
3509	 * Private i/o space declaration
3510	 */
3511	msg[6] = 0x54000000 | sys_tbl_len;
3512	msg[7] = (u32)sys_tbl_pa;
3513	msg[8] = 0x54000000 | 0;
3514	msg[9] = 0;
3515	msg[10] = 0xD4000000 | 0;
3516	msg[11] = 0;
3517
3518	if ((ret=adpt_i2o_post_wait(pHba, msg, sizeof(msg), 120))) {
3519		printk(KERN_INFO "%s: Unable to set SysTab (status=%#10x).\n",
3520			pHba->name, ret);
3521	}
3522#ifdef DEBUG
3523	else {
3524		PINFO("%s: SysTab set.\n", pHba->name);
3525	}
3526#endif
3527
3528	return ret;
3529 }
3530
3531
3532/*============================================================================
3533 *
3534 *============================================================================
3535 */
3536
3537
3538#ifdef UARTDELAY
3539
3540static static void adpt_delay(int millisec)
3541{
3542	int i;
3543	for (i = 0; i < millisec; i++) {
3544		udelay(1000);	/* delay for one millisecond */
3545	}
3546}
3547
3548#endif
3549
3550static struct scsi_host_template driver_template = {
3551	.module			= THIS_MODULE,
3552	.name			= "dpt_i2o",
3553	.proc_name		= "dpt_i2o",
3554	.show_info		= adpt_show_info,
3555	.info			= adpt_info,
3556	.queuecommand		= adpt_queue,
3557	.eh_abort_handler	= adpt_abort,
3558	.eh_device_reset_handler = adpt_device_reset,
3559	.eh_bus_reset_handler	= adpt_bus_reset,
3560	.eh_host_reset_handler	= adpt_reset,
3561	.bios_param		= adpt_bios_param,
3562	.slave_configure	= adpt_slave_configure,
3563	.can_queue		= MAX_TO_IOP_MESSAGES,
3564	.this_id		= 7,
3565	.cmd_per_lun		= 1,
3566	.use_clustering		= ENABLE_CLUSTERING,
3567};
3568
3569static int __init adpt_init(void)
3570{
3571	int		error;
3572	adpt_hba	*pHba, *next;
3573
3574	printk("Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "\n");
3575
3576	error = adpt_detect(&driver_template);
3577	if (error < 0)
3578		return error;
3579	if (hba_chain == NULL)
3580		return -ENODEV;
3581
3582	for (pHba = hba_chain; pHba; pHba = pHba->next) {
3583		error = scsi_add_host(pHba->host, &pHba->pDev->dev);
3584		if (error)
3585			goto fail;
3586		scsi_scan_host(pHba->host);
3587	}
3588	return 0;
3589fail:
3590	for (pHba = hba_chain; pHba; pHba = next) {
3591		next = pHba->next;
3592		scsi_remove_host(pHba->host);
3593	}
3594	return error;
3595}
3596
3597static void __exit adpt_exit(void)
3598{
3599	adpt_hba	*pHba, *next;
3600
3601	for (pHba = hba_chain; pHba; pHba = pHba->next)
3602		scsi_remove_host(pHba->host);
3603	for (pHba = hba_chain; pHba; pHba = next) {
3604		next = pHba->next;
3605		adpt_release(pHba->host);
3606	}
3607}
3608
3609module_init(adpt_init);
3610module_exit(adpt_exit);
3611
3612MODULE_LICENSE("GPL");
3613