Version:  2.0.40 2.2.26 2.4.37 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18

Linux/drivers/scsi/dpt_i2o.c

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

This page was automatically generated by LXR 0.3.1 (source).  •  Linux is a registered trademark of Linus Torvalds  •  Contact us