sh: Move clock reporting to its own proc entry.
[linux-2.6/sactl.git] / drivers / scsi / dpt_i2o.c
blobf7b9dbd64a96ee1ae0af28d786a12c1f7ef09574
1 /***************************************************************************
2 dpti.c - description
3 -------------------
4 begin : Thu Sep 7 2000
5 copyright : (C) 2000 by Adaptec
7 July 30, 2001 First version being submitted
8 for inclusion in the kernel. V2.4
10 See Documentation/scsi/dpti.txt for history, notes, license info
11 and credits
12 ***************************************************************************/
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 **************************************************************************/
29 /*#define DEBUG 1 */
30 /*#define UARTDELAY 1 */
32 /* On the real kernel ADDR32 should always be zero for 2.4. GFP_HIGH allocates
33 high pages. Keep the macro around because of the broken unmerged ia64 tree */
35 #define ADDR32 (0)
37 #include <linux/module.h>
39 MODULE_AUTHOR("Deanna Bonds, with _lots_ of help from Mark Salyzyn");
40 MODULE_DESCRIPTION("Adaptec I2O RAID Driver");
42 ////////////////////////////////////////////////////////////////
44 #include <linux/ioctl.h> /* For SCSI-Passthrough */
45 #include <asm/uaccess.h>
47 #include <linux/stat.h>
48 #include <linux/slab.h> /* for kmalloc() */
49 #include <linux/pci.h> /* for PCI support */
50 #include <linux/proc_fs.h>
51 #include <linux/blkdev.h>
52 #include <linux/delay.h> /* for udelay */
53 #include <linux/interrupt.h>
54 #include <linux/kernel.h> /* for printk */
55 #include <linux/sched.h>
56 #include <linux/reboot.h>
57 #include <linux/spinlock.h>
58 #include <linux/smp_lock.h>
59 #include <linux/dma-mapping.h>
61 #include <linux/timer.h>
62 #include <linux/string.h>
63 #include <linux/ioport.h>
64 #include <linux/mutex.h>
66 #include <asm/processor.h> /* for boot_cpu_data */
67 #include <asm/pgtable.h>
68 #include <asm/io.h> /* for virt_to_bus, etc. */
70 #include <scsi/scsi.h>
71 #include <scsi/scsi_cmnd.h>
72 #include <scsi/scsi_device.h>
73 #include <scsi/scsi_host.h>
74 #include <scsi/scsi_tcq.h>
76 #include "dpt/dptsig.h"
77 #include "dpti.h"
79 /*============================================================================
80 * Create a binary signature - this is read by dptsig
81 * Needed for our management apps
82 *============================================================================
84 static dpt_sig_S DPTI_sig = {
85 {'d', 'P', 't', 'S', 'i', 'G'}, SIG_VERSION,
86 #ifdef __i386__
87 PROC_INTEL, PROC_386 | PROC_486 | PROC_PENTIUM | PROC_SEXIUM,
88 #elif defined(__ia64__)
89 PROC_INTEL, PROC_IA64,
90 #elif defined(__sparc__)
91 PROC_ULTRASPARC, PROC_ULTRASPARC,
92 #elif defined(__alpha__)
93 PROC_ALPHA, PROC_ALPHA,
94 #else
95 (-1),(-1),
96 #endif
97 FT_HBADRVR, 0, OEM_DPT, OS_LINUX, CAP_OVERLAP, DEV_ALL,
98 ADF_ALL_SC5, 0, 0, DPT_VERSION, DPT_REVISION, DPT_SUBREVISION,
99 DPT_MONTH, DPT_DAY, DPT_YEAR, "Adaptec Linux I2O RAID Driver"
105 /*============================================================================
106 * Globals
107 *============================================================================
110 static DEFINE_MUTEX(adpt_configuration_lock);
112 static struct i2o_sys_tbl *sys_tbl = NULL;
113 static int sys_tbl_ind = 0;
114 static int sys_tbl_len = 0;
116 static adpt_hba* hba_chain = NULL;
117 static int hba_count = 0;
119 static const struct file_operations adpt_fops = {
120 .ioctl = adpt_ioctl,
121 .open = adpt_open,
122 .release = adpt_close
125 #ifdef REBOOT_NOTIFIER
126 static struct notifier_block adpt_reboot_notifier =
128 adpt_reboot_event,
129 NULL,
132 #endif
134 /* Structures and definitions for synchronous message posting.
135 * See adpt_i2o_post_wait() for description
136 * */
137 struct adpt_i2o_post_wait_data
139 int status;
140 u32 id;
141 adpt_wait_queue_head_t *wq;
142 struct adpt_i2o_post_wait_data *next;
145 static struct adpt_i2o_post_wait_data *adpt_post_wait_queue = NULL;
146 static u32 adpt_post_wait_id = 0;
147 static DEFINE_SPINLOCK(adpt_post_wait_lock);
150 /*============================================================================
151 * Functions
152 *============================================================================
155 static u8 adpt_read_blink_led(adpt_hba* host)
157 if(host->FwDebugBLEDflag_P != 0) {
158 if( readb(host->FwDebugBLEDflag_P) == 0xbc ){
159 return readb(host->FwDebugBLEDvalue_P);
162 return 0;
165 /*============================================================================
166 * Scsi host template interface functions
167 *============================================================================
170 static struct pci_device_id dptids[] = {
171 { PCI_DPT_VENDOR_ID, PCI_DPT_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
172 { PCI_DPT_VENDOR_ID, PCI_DPT_RAPTOR_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},
173 { 0, }
175 MODULE_DEVICE_TABLE(pci,dptids);
177 static int adpt_detect(struct scsi_host_template* sht)
179 struct pci_dev *pDev = NULL;
180 adpt_hba* pHba;
182 adpt_init();
184 PINFO("Detecting Adaptec I2O RAID controllers...\n");
186 /* search for all Adatpec I2O RAID cards */
187 while ((pDev = pci_get_device( PCI_DPT_VENDOR_ID, PCI_ANY_ID, pDev))) {
188 if(pDev->device == PCI_DPT_DEVICE_ID ||
189 pDev->device == PCI_DPT_RAPTOR_DEVICE_ID){
190 if(adpt_install_hba(sht, pDev) ){
191 PERROR("Could not Init an I2O RAID device\n");
192 PERROR("Will not try to detect others.\n");
193 return hba_count-1;
195 pci_dev_get(pDev);
199 /* In INIT state, Activate IOPs */
200 for (pHba = hba_chain; pHba; pHba = pHba->next) {
201 // Activate does get status , init outbound, and get hrt
202 if (adpt_i2o_activate_hba(pHba) < 0) {
203 adpt_i2o_delete_hba(pHba);
208 /* Active IOPs in HOLD state */
210 rebuild_sys_tab:
211 if (hba_chain == NULL)
212 return 0;
215 * If build_sys_table fails, we kill everything and bail
216 * as we can't init the IOPs w/o a system table
218 if (adpt_i2o_build_sys_table() < 0) {
219 adpt_i2o_sys_shutdown();
220 return 0;
223 PDEBUG("HBA's in HOLD state\n");
225 /* If IOP don't get online, we need to rebuild the System table */
226 for (pHba = hba_chain; pHba; pHba = pHba->next) {
227 if (adpt_i2o_online_hba(pHba) < 0) {
228 adpt_i2o_delete_hba(pHba);
229 goto rebuild_sys_tab;
233 /* Active IOPs now in OPERATIONAL state */
234 PDEBUG("HBA's in OPERATIONAL state\n");
236 printk("dpti: If you have a lot of devices this could take a few minutes.\n");
237 for (pHba = hba_chain; pHba; pHba = pHba->next) {
238 printk(KERN_INFO"%s: Reading the hardware resource table.\n", pHba->name);
239 if (adpt_i2o_lct_get(pHba) < 0){
240 adpt_i2o_delete_hba(pHba);
241 continue;
244 if (adpt_i2o_parse_lct(pHba) < 0){
245 adpt_i2o_delete_hba(pHba);
246 continue;
248 adpt_inquiry(pHba);
251 for (pHba = hba_chain; pHba; pHba = pHba->next) {
252 if( adpt_scsi_register(pHba,sht) < 0){
253 adpt_i2o_delete_hba(pHba);
254 continue;
256 pHba->initialized = TRUE;
257 pHba->state &= ~DPTI_STATE_RESET;
260 // Register our control device node
261 // nodes will need to be created in /dev to access this
262 // the nodes can not be created from within the driver
263 if (hba_count && register_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER, &adpt_fops)) {
264 adpt_i2o_sys_shutdown();
265 return 0;
267 return hba_count;
272 * scsi_unregister will be called AFTER we return.
274 static int adpt_release(struct Scsi_Host *host)
276 adpt_hba* pHba = (adpt_hba*) host->hostdata[0];
277 // adpt_i2o_quiesce_hba(pHba);
278 adpt_i2o_delete_hba(pHba);
279 scsi_unregister(host);
280 return 0;
284 static void adpt_inquiry(adpt_hba* pHba)
286 u32 msg[14];
287 u32 *mptr;
288 u32 *lenptr;
289 int direction;
290 int scsidir;
291 u32 len;
292 u32 reqlen;
293 u8* buf;
294 u8 scb[16];
295 s32 rcode;
297 memset(msg, 0, sizeof(msg));
298 buf = kmalloc(80,GFP_KERNEL|ADDR32);
299 if(!buf){
300 printk(KERN_ERR"%s: Could not allocate buffer\n",pHba->name);
301 return;
303 memset((void*)buf, 0, 36);
305 len = 36;
306 direction = 0x00000000;
307 scsidir =0x40000000; // DATA IN (iop<--dev)
309 reqlen = 14; // SINGLE SGE
310 /* Stick the headers on */
311 msg[0] = reqlen<<16 | SGL_OFFSET_12;
312 msg[1] = (0xff<<24|HOST_TID<<12|ADAPTER_TID);
313 msg[2] = 0;
314 msg[3] = 0;
315 // Adaptec/DPT Private stuff
316 msg[4] = I2O_CMD_SCSI_EXEC|DPT_ORGANIZATION_ID<<16;
317 msg[5] = ADAPTER_TID | 1<<16 /* Interpret*/;
318 /* Direction, disconnect ok | sense data | simple queue , CDBLen */
319 // I2O_SCB_FLAG_ENABLE_DISCONNECT |
320 // I2O_SCB_FLAG_SIMPLE_QUEUE_TAG |
321 // I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE;
322 msg[6] = scsidir|0x20a00000| 6 /* cmd len*/;
324 mptr=msg+7;
326 memset(scb, 0, sizeof(scb));
327 // Write SCSI command into the message - always 16 byte block
328 scb[0] = INQUIRY;
329 scb[1] = 0;
330 scb[2] = 0;
331 scb[3] = 0;
332 scb[4] = 36;
333 scb[5] = 0;
334 // Don't care about the rest of scb
336 memcpy(mptr, scb, sizeof(scb));
337 mptr+=4;
338 lenptr=mptr++; /* Remember me - fill in when we know */
340 /* Now fill in the SGList and command */
341 *lenptr = len;
342 *mptr++ = 0xD0000000|direction|len;
343 *mptr++ = virt_to_bus(buf);
345 // Send it on it's way
346 rcode = adpt_i2o_post_wait(pHba, msg, reqlen<<2, 120);
347 if (rcode != 0) {
348 sprintf(pHba->detail, "Adaptec I2O RAID");
349 printk(KERN_INFO "%s: Inquiry Error (%d)\n",pHba->name,rcode);
350 if (rcode != -ETIME && rcode != -EINTR)
351 kfree(buf);
352 } else {
353 memset(pHba->detail, 0, sizeof(pHba->detail));
354 memcpy(&(pHba->detail), "Vendor: Adaptec ", 16);
355 memcpy(&(pHba->detail[16]), " Model: ", 8);
356 memcpy(&(pHba->detail[24]), (u8*) &buf[16], 16);
357 memcpy(&(pHba->detail[40]), " FW: ", 4);
358 memcpy(&(pHba->detail[44]), (u8*) &buf[32], 4);
359 pHba->detail[48] = '\0'; /* precautionary */
360 kfree(buf);
362 adpt_i2o_status_get(pHba);
363 return ;
367 static int adpt_slave_configure(struct scsi_device * device)
369 struct Scsi_Host *host = device->host;
370 adpt_hba* pHba;
372 pHba = (adpt_hba *) host->hostdata[0];
374 if (host->can_queue && device->tagged_supported) {
375 scsi_adjust_queue_depth(device, MSG_SIMPLE_TAG,
376 host->can_queue - 1);
377 } else {
378 scsi_adjust_queue_depth(device, 0, 1);
380 return 0;
383 static int adpt_queue(struct scsi_cmnd * cmd, void (*done) (struct scsi_cmnd *))
385 adpt_hba* pHba = NULL;
386 struct adpt_device* pDev = NULL; /* dpt per device information */
388 cmd->scsi_done = done;
390 * SCSI REQUEST_SENSE commands will be executed automatically by the
391 * Host Adapter for any errors, so they should not be executed
392 * explicitly unless the Sense Data is zero indicating that no error
393 * occurred.
396 if ((cmd->cmnd[0] == REQUEST_SENSE) && (cmd->sense_buffer[0] != 0)) {
397 cmd->result = (DID_OK << 16);
398 cmd->scsi_done(cmd);
399 return 0;
402 pHba = (adpt_hba*)cmd->device->host->hostdata[0];
403 if (!pHba) {
404 return FAILED;
407 rmb();
409 * TODO: I need to block here if I am processing ioctl cmds
410 * but if the outstanding cmds all finish before the ioctl,
411 * the scsi-core will not know to start sending cmds to me again.
412 * I need to a way to restart the scsi-cores queues or should I block
413 * calling scsi_done on the outstanding cmds instead
414 * for now we don't set the IOCTL state
416 if(((pHba->state) & DPTI_STATE_IOCTL) || ((pHba->state) & DPTI_STATE_RESET)) {
417 pHba->host->last_reset = jiffies;
418 pHba->host->resetting = 1;
419 return 1;
422 // TODO if the cmd->device if offline then I may need to issue a bus rescan
423 // followed by a get_lct to see if the device is there anymore
424 if((pDev = (struct adpt_device*) (cmd->device->hostdata)) == NULL) {
426 * First command request for this device. Set up a pointer
427 * to the device structure. This should be a TEST_UNIT_READY
428 * command from scan_scsis_single.
430 if ((pDev = adpt_find_device(pHba, (u32)cmd->device->channel, (u32)cmd->device->id, (u32)cmd->device->lun)) == NULL) {
431 // TODO: if any luns are at this bus, scsi id then fake a TEST_UNIT_READY and INQUIRY response
432 // with type 7F (for all luns less than the max for this bus,id) so the lun scan will continue.
433 cmd->result = (DID_NO_CONNECT << 16);
434 cmd->scsi_done(cmd);
435 return 0;
437 cmd->device->hostdata = pDev;
439 pDev->pScsi_dev = cmd->device;
442 * If we are being called from when the device is being reset,
443 * delay processing of the command until later.
445 if (pDev->state & DPTI_DEV_RESET ) {
446 return FAILED;
448 return adpt_scsi_to_i2o(pHba, cmd, pDev);
451 static int adpt_bios_param(struct scsi_device *sdev, struct block_device *dev,
452 sector_t capacity, int geom[])
454 int heads=-1;
455 int sectors=-1;
456 int cylinders=-1;
458 // *** First lets set the default geometry ****
460 // If the capacity is less than ox2000
461 if (capacity < 0x2000 ) { // floppy
462 heads = 18;
463 sectors = 2;
465 // else if between 0x2000 and 0x20000
466 else if (capacity < 0x20000) {
467 heads = 64;
468 sectors = 32;
470 // else if between 0x20000 and 0x40000
471 else if (capacity < 0x40000) {
472 heads = 65;
473 sectors = 63;
475 // else if between 0x4000 and 0x80000
476 else if (capacity < 0x80000) {
477 heads = 128;
478 sectors = 63;
480 // else if greater than 0x80000
481 else {
482 heads = 255;
483 sectors = 63;
485 cylinders = sector_div(capacity, heads * sectors);
487 // Special case if CDROM
488 if(sdev->type == 5) { // CDROM
489 heads = 252;
490 sectors = 63;
491 cylinders = 1111;
494 geom[0] = heads;
495 geom[1] = sectors;
496 geom[2] = cylinders;
498 PDEBUG("adpt_bios_param: exit\n");
499 return 0;
503 static const char *adpt_info(struct Scsi_Host *host)
505 adpt_hba* pHba;
507 pHba = (adpt_hba *) host->hostdata[0];
508 return (char *) (pHba->detail);
511 static int adpt_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
512 int length, int inout)
514 struct adpt_device* d;
515 int id;
516 int chan;
517 int len = 0;
518 int begin = 0;
519 int pos = 0;
520 adpt_hba* pHba;
521 int unit;
523 *start = buffer;
524 if (inout == TRUE) {
526 * The user has done a write and wants us to take the
527 * data in the buffer and do something with it.
528 * proc_scsiwrite calls us with inout = 1
530 * Read data from buffer (writing to us) - NOT SUPPORTED
532 return -EINVAL;
536 * inout = 0 means the user has done a read and wants information
537 * returned, so we write information about the cards into the buffer
538 * proc_scsiread() calls us with inout = 0
541 // Find HBA (host bus adapter) we are looking for
542 mutex_lock(&adpt_configuration_lock);
543 for (pHba = hba_chain; pHba; pHba = pHba->next) {
544 if (pHba->host == host) {
545 break; /* found adapter */
548 mutex_unlock(&adpt_configuration_lock);
549 if (pHba == NULL) {
550 return 0;
552 host = pHba->host;
554 len = sprintf(buffer , "Adaptec I2O RAID Driver Version: %s\n\n", DPT_I2O_VERSION);
555 len += sprintf(buffer+len, "%s\n", pHba->detail);
556 len += sprintf(buffer+len, "SCSI Host=scsi%d Control Node=/dev/%s irq=%d\n",
557 pHba->host->host_no, pHba->name, host->irq);
558 len += sprintf(buffer+len, "\tpost fifo size = %d\n\treply fifo size = %d\n\tsg table size = %d\n\n",
559 host->can_queue, (int) pHba->reply_fifo_size , host->sg_tablesize);
561 pos = begin + len;
563 /* CHECKPOINT */
564 if(pos > offset + length) {
565 goto stop_output;
567 if(pos <= offset) {
569 * If we haven't even written to where we last left
570 * off (the last time we were called), reset the
571 * beginning pointer.
573 len = 0;
574 begin = pos;
576 len += sprintf(buffer+len, "Devices:\n");
577 for(chan = 0; chan < MAX_CHANNEL; chan++) {
578 for(id = 0; id < MAX_ID; id++) {
579 d = pHba->channel[chan].device[id];
580 while(d){
581 len += sprintf(buffer+len,"\t%-24.24s", d->pScsi_dev->vendor);
582 len += sprintf(buffer+len," Rev: %-8.8s\n", d->pScsi_dev->rev);
583 pos = begin + len;
586 /* CHECKPOINT */
587 if(pos > offset + length) {
588 goto stop_output;
590 if(pos <= offset) {
591 len = 0;
592 begin = pos;
595 unit = d->pI2o_dev->lct_data.tid;
596 len += sprintf(buffer+len, "\tTID=%d, (Channel=%d, Target=%d, Lun=%d) (%s)\n\n",
597 unit, (int)d->scsi_channel, (int)d->scsi_id, (int)d->scsi_lun,
598 scsi_device_online(d->pScsi_dev)? "online":"offline");
599 pos = begin + len;
601 /* CHECKPOINT */
602 if(pos > offset + length) {
603 goto stop_output;
605 if(pos <= offset) {
606 len = 0;
607 begin = pos;
610 d = d->next_lun;
616 * begin is where we last checked our position with regards to offset
617 * begin is always less than offset. len is relative to begin. It
618 * is the number of bytes written past begin
621 stop_output:
622 /* stop the output and calculate the correct length */
623 *(buffer + len) = '\0';
625 *start = buffer + (offset - begin); /* Start of wanted data */
626 len -= (offset - begin);
627 if(len > length) {
628 len = length;
629 } else if(len < 0){
630 len = 0;
631 **start = '\0';
633 return len;
637 /*===========================================================================
638 * Error Handling routines
639 *===========================================================================
642 static int adpt_abort(struct scsi_cmnd * cmd)
644 adpt_hba* pHba = NULL; /* host bus adapter structure */
645 struct adpt_device* dptdevice; /* dpt per device information */
646 u32 msg[5];
647 int rcode;
649 if(cmd->serial_number == 0){
650 return FAILED;
652 pHba = (adpt_hba*) cmd->device->host->hostdata[0];
653 printk(KERN_INFO"%s: Trying to Abort cmd=%ld\n",pHba->name, cmd->serial_number);
654 if ((dptdevice = (void*) (cmd->device->hostdata)) == NULL) {
655 printk(KERN_ERR "%s: Unable to abort: No device in cmnd\n",pHba->name);
656 return FAILED;
659 memset(msg, 0, sizeof(msg));
660 msg[0] = FIVE_WORD_MSG_SIZE|SGL_OFFSET_0;
661 msg[1] = I2O_CMD_SCSI_ABORT<<24|HOST_TID<<12|dptdevice->tid;
662 msg[2] = 0;
663 msg[3]= 0;
664 msg[4] = (u32)cmd;
665 if (pHba->host)
666 spin_lock_irq(pHba->host->host_lock);
667 rcode = adpt_i2o_post_wait(pHba, msg, sizeof(msg), FOREVER);
668 if (pHba->host)
669 spin_unlock_irq(pHba->host->host_lock);
670 if (rcode != 0) {
671 if(rcode == -EOPNOTSUPP ){
672 printk(KERN_INFO"%s: Abort cmd not supported\n",pHba->name);
673 return FAILED;
675 printk(KERN_INFO"%s: Abort cmd=%ld failed.\n",pHba->name, cmd->serial_number);
676 return FAILED;
678 printk(KERN_INFO"%s: Abort cmd=%ld complete.\n",pHba->name, cmd->serial_number);
679 return SUCCESS;
683 #define I2O_DEVICE_RESET 0x27
684 // This is the same for BLK and SCSI devices
685 // NOTE this is wrong in the i2o.h definitions
686 // This is not currently supported by our adapter but we issue it anyway
687 static int adpt_device_reset(struct scsi_cmnd* cmd)
689 adpt_hba* pHba;
690 u32 msg[4];
691 u32 rcode;
692 int old_state;
693 struct adpt_device* d = cmd->device->hostdata;
695 pHba = (void*) cmd->device->host->hostdata[0];
696 printk(KERN_INFO"%s: Trying to reset device\n",pHba->name);
697 if (!d) {
698 printk(KERN_INFO"%s: Reset Device: Device Not found\n",pHba->name);
699 return FAILED;
701 memset(msg, 0, sizeof(msg));
702 msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
703 msg[1] = (I2O_DEVICE_RESET<<24|HOST_TID<<12|d->tid);
704 msg[2] = 0;
705 msg[3] = 0;
707 if (pHba->host)
708 spin_lock_irq(pHba->host->host_lock);
709 old_state = d->state;
710 d->state |= DPTI_DEV_RESET;
711 rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER);
712 d->state = old_state;
713 if (pHba->host)
714 spin_unlock_irq(pHba->host->host_lock);
715 if (rcode != 0) {
716 if(rcode == -EOPNOTSUPP ){
717 printk(KERN_INFO"%s: Device reset not supported\n",pHba->name);
718 return FAILED;
720 printk(KERN_INFO"%s: Device reset failed\n",pHba->name);
721 return FAILED;
722 } else {
723 printk(KERN_INFO"%s: Device reset successful\n",pHba->name);
724 return SUCCESS;
729 #define I2O_HBA_BUS_RESET 0x87
730 // This version of bus reset is called by the eh_error handler
731 static int adpt_bus_reset(struct scsi_cmnd* cmd)
733 adpt_hba* pHba;
734 u32 msg[4];
735 u32 rcode;
737 pHba = (adpt_hba*)cmd->device->host->hostdata[0];
738 memset(msg, 0, sizeof(msg));
739 printk(KERN_WARNING"%s: Bus reset: SCSI Bus %d: tid: %d\n",pHba->name, cmd->device->channel,pHba->channel[cmd->device->channel].tid );
740 msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
741 msg[1] = (I2O_HBA_BUS_RESET<<24|HOST_TID<<12|pHba->channel[cmd->device->channel].tid);
742 msg[2] = 0;
743 msg[3] = 0;
744 if (pHba->host)
745 spin_lock_irq(pHba->host->host_lock);
746 rcode = adpt_i2o_post_wait(pHba, msg,sizeof(msg), FOREVER);
747 if (pHba->host)
748 spin_unlock_irq(pHba->host->host_lock);
749 if (rcode != 0) {
750 printk(KERN_WARNING"%s: Bus reset failed.\n",pHba->name);
751 return FAILED;
752 } else {
753 printk(KERN_WARNING"%s: Bus reset success.\n",pHba->name);
754 return SUCCESS;
758 // This version of reset is called by the eh_error_handler
759 static int __adpt_reset(struct scsi_cmnd* cmd)
761 adpt_hba* pHba;
762 int rcode;
763 pHba = (adpt_hba*)cmd->device->host->hostdata[0];
764 printk(KERN_WARNING"%s: Hba Reset: scsi id %d: tid: %d\n",pHba->name,cmd->device->channel,pHba->channel[cmd->device->channel].tid );
765 rcode = adpt_hba_reset(pHba);
766 if(rcode == 0){
767 printk(KERN_WARNING"%s: HBA reset complete\n",pHba->name);
768 return SUCCESS;
769 } else {
770 printk(KERN_WARNING"%s: HBA reset failed (%x)\n",pHba->name, rcode);
771 return FAILED;
775 static int adpt_reset(struct scsi_cmnd* cmd)
777 int rc;
779 spin_lock_irq(cmd->device->host->host_lock);
780 rc = __adpt_reset(cmd);
781 spin_unlock_irq(cmd->device->host->host_lock);
783 return rc;
786 // This version of reset is called by the ioctls and indirectly from eh_error_handler via adpt_reset
787 static int adpt_hba_reset(adpt_hba* pHba)
789 int rcode;
791 pHba->state |= DPTI_STATE_RESET;
793 // Activate does get status , init outbound, and get hrt
794 if ((rcode=adpt_i2o_activate_hba(pHba)) < 0) {
795 printk(KERN_ERR "%s: Could not activate\n", pHba->name);
796 adpt_i2o_delete_hba(pHba);
797 return rcode;
800 if ((rcode=adpt_i2o_build_sys_table()) < 0) {
801 adpt_i2o_delete_hba(pHba);
802 return rcode;
804 PDEBUG("%s: in HOLD state\n",pHba->name);
806 if ((rcode=adpt_i2o_online_hba(pHba)) < 0) {
807 adpt_i2o_delete_hba(pHba);
808 return rcode;
810 PDEBUG("%s: in OPERATIONAL state\n",pHba->name);
812 if ((rcode=adpt_i2o_lct_get(pHba)) < 0){
813 adpt_i2o_delete_hba(pHba);
814 return rcode;
817 if ((rcode=adpt_i2o_reparse_lct(pHba)) < 0){
818 adpt_i2o_delete_hba(pHba);
819 return rcode;
821 pHba->state &= ~DPTI_STATE_RESET;
823 adpt_fail_posted_scbs(pHba);
824 return 0; /* return success */
827 /*===========================================================================
829 *===========================================================================
833 static void adpt_i2o_sys_shutdown(void)
835 adpt_hba *pHba, *pNext;
836 struct adpt_i2o_post_wait_data *p1, *old;
838 printk(KERN_INFO"Shutting down Adaptec I2O controllers.\n");
839 printk(KERN_INFO" This could take a few minutes if there are many devices attached\n");
840 /* Delete all IOPs from the controller chain */
841 /* They should have already been released by the
842 * scsi-core
844 for (pHba = hba_chain; pHba; pHba = pNext) {
845 pNext = pHba->next;
846 adpt_i2o_delete_hba(pHba);
849 /* Remove any timedout entries from the wait queue. */
850 // spin_lock_irqsave(&adpt_post_wait_lock, flags);
851 /* Nothing should be outstanding at this point so just
852 * free them
854 for(p1 = adpt_post_wait_queue; p1;) {
855 old = p1;
856 p1 = p1->next;
857 kfree(old);
859 // spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
860 adpt_post_wait_queue = NULL;
862 printk(KERN_INFO "Adaptec I2O controllers down.\n");
866 * reboot/shutdown notification.
868 * - Quiesce each IOP in the system
872 #ifdef REBOOT_NOTIFIER
873 static int adpt_reboot_event(struct notifier_block *n, ulong code, void *p)
876 if(code != SYS_RESTART && code != SYS_HALT && code != SYS_POWER_OFF)
877 return NOTIFY_DONE;
879 adpt_i2o_sys_shutdown();
881 return NOTIFY_DONE;
883 #endif
886 static int adpt_install_hba(struct scsi_host_template* sht, struct pci_dev* pDev)
889 adpt_hba* pHba = NULL;
890 adpt_hba* p = NULL;
891 ulong base_addr0_phys = 0;
892 ulong base_addr1_phys = 0;
893 u32 hba_map0_area_size = 0;
894 u32 hba_map1_area_size = 0;
895 void __iomem *base_addr_virt = NULL;
896 void __iomem *msg_addr_virt = NULL;
898 int raptorFlag = FALSE;
900 if(pci_enable_device(pDev)) {
901 return -EINVAL;
904 if (pci_request_regions(pDev, "dpt_i2o")) {
905 PERROR("dpti: adpt_config_hba: pci request region failed\n");
906 return -EINVAL;
909 pci_set_master(pDev);
910 if (pci_set_dma_mask(pDev, DMA_64BIT_MASK) &&
911 pci_set_dma_mask(pDev, DMA_32BIT_MASK))
912 return -EINVAL;
914 base_addr0_phys = pci_resource_start(pDev,0);
915 hba_map0_area_size = pci_resource_len(pDev,0);
917 // Check if standard PCI card or single BAR Raptor
918 if(pDev->device == PCI_DPT_DEVICE_ID){
919 if(pDev->subsystem_device >=0xc032 && pDev->subsystem_device <= 0xc03b){
920 // Raptor card with this device id needs 4M
921 hba_map0_area_size = 0x400000;
922 } else { // Not Raptor - it is a PCI card
923 if(hba_map0_area_size > 0x100000 ){
924 hba_map0_area_size = 0x100000;
927 } else {// Raptor split BAR config
928 // Use BAR1 in this configuration
929 base_addr1_phys = pci_resource_start(pDev,1);
930 hba_map1_area_size = pci_resource_len(pDev,1);
931 raptorFlag = TRUE;
934 base_addr_virt = ioremap(base_addr0_phys,hba_map0_area_size);
935 if (!base_addr_virt) {
936 pci_release_regions(pDev);
937 PERROR("dpti: adpt_config_hba: io remap failed\n");
938 return -EINVAL;
941 if(raptorFlag == TRUE) {
942 msg_addr_virt = ioremap(base_addr1_phys, hba_map1_area_size );
943 if (!msg_addr_virt) {
944 PERROR("dpti: adpt_config_hba: io remap failed on BAR1\n");
945 iounmap(base_addr_virt);
946 pci_release_regions(pDev);
947 return -EINVAL;
949 } else {
950 msg_addr_virt = base_addr_virt;
953 // Allocate and zero the data structure
954 pHba = kmalloc(sizeof(adpt_hba), GFP_KERNEL);
955 if( pHba == NULL) {
956 if(msg_addr_virt != base_addr_virt){
957 iounmap(msg_addr_virt);
959 iounmap(base_addr_virt);
960 pci_release_regions(pDev);
961 return -ENOMEM;
963 memset(pHba, 0, sizeof(adpt_hba));
965 mutex_lock(&adpt_configuration_lock);
967 if(hba_chain != NULL){
968 for(p = hba_chain; p->next; p = p->next);
969 p->next = pHba;
970 } else {
971 hba_chain = pHba;
973 pHba->next = NULL;
974 pHba->unit = hba_count;
975 sprintf(pHba->name, "dpti%d", hba_count);
976 hba_count++;
978 mutex_unlock(&adpt_configuration_lock);
980 pHba->pDev = pDev;
981 pHba->base_addr_phys = base_addr0_phys;
983 // Set up the Virtual Base Address of the I2O Device
984 pHba->base_addr_virt = base_addr_virt;
985 pHba->msg_addr_virt = msg_addr_virt;
986 pHba->irq_mask = base_addr_virt+0x30;
987 pHba->post_port = base_addr_virt+0x40;
988 pHba->reply_port = base_addr_virt+0x44;
990 pHba->hrt = NULL;
991 pHba->lct = NULL;
992 pHba->lct_size = 0;
993 pHba->status_block = NULL;
994 pHba->post_count = 0;
995 pHba->state = DPTI_STATE_RESET;
996 pHba->pDev = pDev;
997 pHba->devices = NULL;
999 // Initializing the spinlocks
1000 spin_lock_init(&pHba->state_lock);
1001 spin_lock_init(&adpt_post_wait_lock);
1003 if(raptorFlag == 0){
1004 printk(KERN_INFO"Adaptec I2O RAID controller %d at %p size=%x irq=%d\n",
1005 hba_count-1, base_addr_virt, hba_map0_area_size, pDev->irq);
1006 } else {
1007 printk(KERN_INFO"Adaptec I2O RAID controller %d irq=%d\n",hba_count-1, pDev->irq);
1008 printk(KERN_INFO" BAR0 %p - size= %x\n",base_addr_virt,hba_map0_area_size);
1009 printk(KERN_INFO" BAR1 %p - size= %x\n",msg_addr_virt,hba_map1_area_size);
1012 if (request_irq (pDev->irq, adpt_isr, IRQF_SHARED, pHba->name, pHba)) {
1013 printk(KERN_ERR"%s: Couldn't register IRQ %d\n", pHba->name, pDev->irq);
1014 adpt_i2o_delete_hba(pHba);
1015 return -EINVAL;
1018 return 0;
1022 static void adpt_i2o_delete_hba(adpt_hba* pHba)
1024 adpt_hba* p1;
1025 adpt_hba* p2;
1026 struct i2o_device* d;
1027 struct i2o_device* next;
1028 int i;
1029 int j;
1030 struct adpt_device* pDev;
1031 struct adpt_device* pNext;
1034 mutex_lock(&adpt_configuration_lock);
1035 // scsi_unregister calls our adpt_release which
1036 // does a quiese
1037 if(pHba->host){
1038 free_irq(pHba->host->irq, pHba);
1040 p2 = NULL;
1041 for( p1 = hba_chain; p1; p2 = p1,p1=p1->next){
1042 if(p1 == pHba) {
1043 if(p2) {
1044 p2->next = p1->next;
1045 } else {
1046 hba_chain = p1->next;
1048 break;
1052 hba_count--;
1053 mutex_unlock(&adpt_configuration_lock);
1055 iounmap(pHba->base_addr_virt);
1056 pci_release_regions(pHba->pDev);
1057 if(pHba->msg_addr_virt != pHba->base_addr_virt){
1058 iounmap(pHba->msg_addr_virt);
1060 kfree(pHba->hrt);
1061 kfree(pHba->lct);
1062 kfree(pHba->status_block);
1063 kfree(pHba->reply_pool);
1065 for(d = pHba->devices; d ; d = next){
1066 next = d->next;
1067 kfree(d);
1069 for(i = 0 ; i < pHba->top_scsi_channel ; i++){
1070 for(j = 0; j < MAX_ID; j++){
1071 if(pHba->channel[i].device[j] != NULL){
1072 for(pDev = pHba->channel[i].device[j]; pDev; pDev = pNext){
1073 pNext = pDev->next_lun;
1074 kfree(pDev);
1079 pci_dev_put(pHba->pDev);
1080 kfree(pHba);
1082 if(hba_count <= 0){
1083 unregister_chrdev(DPTI_I2O_MAJOR, DPT_DRIVER);
1088 static int adpt_init(void)
1090 printk("Loading Adaptec I2O RAID: Version " DPT_I2O_VERSION "\n");
1091 #ifdef REBOOT_NOTIFIER
1092 register_reboot_notifier(&adpt_reboot_notifier);
1093 #endif
1095 return 0;
1099 static struct adpt_device* adpt_find_device(adpt_hba* pHba, u32 chan, u32 id, u32 lun)
1101 struct adpt_device* d;
1103 if(chan < 0 || chan >= MAX_CHANNEL)
1104 return NULL;
1106 if( pHba->channel[chan].device == NULL){
1107 printk(KERN_DEBUG"Adaptec I2O RAID: Trying to find device before they are allocated\n");
1108 return NULL;
1111 d = pHba->channel[chan].device[id];
1112 if(!d || d->tid == 0) {
1113 return NULL;
1116 /* If it is the only lun at that address then this should match*/
1117 if(d->scsi_lun == lun){
1118 return d;
1121 /* else we need to look through all the luns */
1122 for(d=d->next_lun ; d ; d = d->next_lun){
1123 if(d->scsi_lun == lun){
1124 return d;
1127 return NULL;
1131 static int adpt_i2o_post_wait(adpt_hba* pHba, u32* msg, int len, int timeout)
1133 // I used my own version of the WAIT_QUEUE_HEAD
1134 // to handle some version differences
1135 // When embedded in the kernel this could go back to the vanilla one
1136 ADPT_DECLARE_WAIT_QUEUE_HEAD(adpt_wq_i2o_post);
1137 int status = 0;
1138 ulong flags = 0;
1139 struct adpt_i2o_post_wait_data *p1, *p2;
1140 struct adpt_i2o_post_wait_data *wait_data =
1141 kmalloc(sizeof(struct adpt_i2o_post_wait_data),GFP_KERNEL);
1142 DECLARE_WAITQUEUE(wait, current);
1144 if (!wait_data)
1145 return -ENOMEM;
1148 * The spin locking is needed to keep anyone from playing
1149 * with the queue pointers and id while we do the same
1151 spin_lock_irqsave(&adpt_post_wait_lock, flags);
1152 // TODO we need a MORE unique way of getting ids
1153 // to support async LCT get
1154 wait_data->next = adpt_post_wait_queue;
1155 adpt_post_wait_queue = wait_data;
1156 adpt_post_wait_id++;
1157 adpt_post_wait_id &= 0x7fff;
1158 wait_data->id = adpt_post_wait_id;
1159 spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
1161 wait_data->wq = &adpt_wq_i2o_post;
1162 wait_data->status = -ETIMEDOUT;
1164 add_wait_queue(&adpt_wq_i2o_post, &wait);
1166 msg[2] |= 0x80000000 | ((u32)wait_data->id);
1167 timeout *= HZ;
1168 if((status = adpt_i2o_post_this(pHba, msg, len)) == 0){
1169 set_current_state(TASK_INTERRUPTIBLE);
1170 if(pHba->host)
1171 spin_unlock_irq(pHba->host->host_lock);
1172 if (!timeout)
1173 schedule();
1174 else{
1175 timeout = schedule_timeout(timeout);
1176 if (timeout == 0) {
1177 // I/O issued, but cannot get result in
1178 // specified time. Freeing resorces is
1179 // dangerous.
1180 status = -ETIME;
1183 if(pHba->host)
1184 spin_lock_irq(pHba->host->host_lock);
1186 remove_wait_queue(&adpt_wq_i2o_post, &wait);
1188 if(status == -ETIMEDOUT){
1189 printk(KERN_INFO"dpti%d: POST WAIT TIMEOUT\n",pHba->unit);
1190 // We will have to free the wait_data memory during shutdown
1191 return status;
1194 /* Remove the entry from the queue. */
1195 p2 = NULL;
1196 spin_lock_irqsave(&adpt_post_wait_lock, flags);
1197 for(p1 = adpt_post_wait_queue; p1; p2 = p1, p1 = p1->next) {
1198 if(p1 == wait_data) {
1199 if(p1->status == I2O_DETAIL_STATUS_UNSUPPORTED_FUNCTION ) {
1200 status = -EOPNOTSUPP;
1202 if(p2) {
1203 p2->next = p1->next;
1204 } else {
1205 adpt_post_wait_queue = p1->next;
1207 break;
1210 spin_unlock_irqrestore(&adpt_post_wait_lock, flags);
1212 kfree(wait_data);
1214 return status;
1218 static s32 adpt_i2o_post_this(adpt_hba* pHba, u32* data, int len)
1221 u32 m = EMPTY_QUEUE;
1222 u32 __iomem *msg;
1223 ulong timeout = jiffies + 30*HZ;
1224 do {
1225 rmb();
1226 m = readl(pHba->post_port);
1227 if (m != EMPTY_QUEUE) {
1228 break;
1230 if(time_after(jiffies,timeout)){
1231 printk(KERN_WARNING"dpti%d: Timeout waiting for message frame!\n", pHba->unit);
1232 return -ETIMEDOUT;
1234 schedule_timeout_uninterruptible(1);
1235 } while(m == EMPTY_QUEUE);
1237 msg = pHba->msg_addr_virt + m;
1238 memcpy_toio(msg, data, len);
1239 wmb();
1241 //post message
1242 writel(m, pHba->post_port);
1243 wmb();
1245 return 0;
1249 static void adpt_i2o_post_wait_complete(u32 context, int status)
1251 struct adpt_i2o_post_wait_data *p1 = NULL;
1253 * We need to search through the adpt_post_wait
1254 * queue to see if the given message is still
1255 * outstanding. If not, it means that the IOP
1256 * took longer to respond to the message than we
1257 * had allowed and timer has already expired.
1258 * Not much we can do about that except log
1259 * it for debug purposes, increase timeout, and recompile
1261 * Lock needed to keep anyone from moving queue pointers
1262 * around while we're looking through them.
1265 context &= 0x7fff;
1267 spin_lock(&adpt_post_wait_lock);
1268 for(p1 = adpt_post_wait_queue; p1; p1 = p1->next) {
1269 if(p1->id == context) {
1270 p1->status = status;
1271 spin_unlock(&adpt_post_wait_lock);
1272 wake_up_interruptible(p1->wq);
1273 return;
1276 spin_unlock(&adpt_post_wait_lock);
1277 // If this happens we lose commands that probably really completed
1278 printk(KERN_DEBUG"dpti: Could Not find task %d in wait queue\n",context);
1279 printk(KERN_DEBUG" Tasks in wait queue:\n");
1280 for(p1 = adpt_post_wait_queue; p1; p1 = p1->next) {
1281 printk(KERN_DEBUG" %d\n",p1->id);
1283 return;
1286 static s32 adpt_i2o_reset_hba(adpt_hba* pHba)
1288 u32 msg[8];
1289 u8* status;
1290 u32 m = EMPTY_QUEUE ;
1291 ulong timeout = jiffies + (TMOUT_IOPRESET*HZ);
1293 if(pHba->initialized == FALSE) { // First time reset should be quick
1294 timeout = jiffies + (25*HZ);
1295 } else {
1296 adpt_i2o_quiesce_hba(pHba);
1299 do {
1300 rmb();
1301 m = readl(pHba->post_port);
1302 if (m != EMPTY_QUEUE) {
1303 break;
1305 if(time_after(jiffies,timeout)){
1306 printk(KERN_WARNING"Timeout waiting for message!\n");
1307 return -ETIMEDOUT;
1309 schedule_timeout_uninterruptible(1);
1310 } while (m == EMPTY_QUEUE);
1312 status = kmalloc(4, GFP_KERNEL|ADDR32);
1313 if(status == NULL) {
1314 adpt_send_nop(pHba, m);
1315 printk(KERN_ERR"IOP reset failed - no free memory.\n");
1316 return -ENOMEM;
1318 memset(status,0,4);
1320 msg[0]=EIGHT_WORD_MSG_SIZE|SGL_OFFSET_0;
1321 msg[1]=I2O_CMD_ADAPTER_RESET<<24|HOST_TID<<12|ADAPTER_TID;
1322 msg[2]=0;
1323 msg[3]=0;
1324 msg[4]=0;
1325 msg[5]=0;
1326 msg[6]=virt_to_bus(status);
1327 msg[7]=0;
1329 memcpy_toio(pHba->msg_addr_virt+m, msg, sizeof(msg));
1330 wmb();
1331 writel(m, pHba->post_port);
1332 wmb();
1334 while(*status == 0){
1335 if(time_after(jiffies,timeout)){
1336 printk(KERN_WARNING"%s: IOP Reset Timeout\n",pHba->name);
1337 kfree(status);
1338 return -ETIMEDOUT;
1340 rmb();
1341 schedule_timeout_uninterruptible(1);
1344 if(*status == 0x01 /*I2O_EXEC_IOP_RESET_IN_PROGRESS*/) {
1345 PDEBUG("%s: Reset in progress...\n", pHba->name);
1346 // Here we wait for message frame to become available
1347 // indicated that reset has finished
1348 do {
1349 rmb();
1350 m = readl(pHba->post_port);
1351 if (m != EMPTY_QUEUE) {
1352 break;
1354 if(time_after(jiffies,timeout)){
1355 printk(KERN_ERR "%s:Timeout waiting for IOP Reset.\n",pHba->name);
1356 return -ETIMEDOUT;
1358 schedule_timeout_uninterruptible(1);
1359 } while (m == EMPTY_QUEUE);
1360 // Flush the offset
1361 adpt_send_nop(pHba, m);
1363 adpt_i2o_status_get(pHba);
1364 if(*status == 0x02 ||
1365 pHba->status_block->iop_state != ADAPTER_STATE_RESET) {
1366 printk(KERN_WARNING"%s: Reset reject, trying to clear\n",
1367 pHba->name);
1368 } else {
1369 PDEBUG("%s: Reset completed.\n", pHba->name);
1372 kfree(status);
1373 #ifdef UARTDELAY
1374 // This delay is to allow someone attached to the card through the debug UART to
1375 // set up the dump levels that they want before the rest of the initialization sequence
1376 adpt_delay(20000);
1377 #endif
1378 return 0;
1382 static int adpt_i2o_parse_lct(adpt_hba* pHba)
1384 int i;
1385 int max;
1386 int tid;
1387 struct i2o_device *d;
1388 i2o_lct *lct = pHba->lct;
1389 u8 bus_no = 0;
1390 s16 scsi_id;
1391 s16 scsi_lun;
1392 u32 buf[10]; // larger than 7, or 8 ...
1393 struct adpt_device* pDev;
1395 if (lct == NULL) {
1396 printk(KERN_ERR "%s: LCT is empty???\n",pHba->name);
1397 return -1;
1400 max = lct->table_size;
1401 max -= 3;
1402 max /= 9;
1404 for(i=0;i<max;i++) {
1405 if( lct->lct_entry[i].user_tid != 0xfff){
1407 * If we have hidden devices, we need to inform the upper layers about
1408 * the possible maximum id reference to handle device access when
1409 * an array is disassembled. This code has no other purpose but to
1410 * allow us future access to devices that are currently hidden
1411 * behind arrays, hotspares or have not been configured (JBOD mode).
1413 if( lct->lct_entry[i].class_id != I2O_CLASS_RANDOM_BLOCK_STORAGE &&
1414 lct->lct_entry[i].class_id != I2O_CLASS_SCSI_PERIPHERAL &&
1415 lct->lct_entry[i].class_id != I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
1416 continue;
1418 tid = lct->lct_entry[i].tid;
1419 // I2O_DPT_DEVICE_INFO_GROUP_NO;
1420 if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)<0) {
1421 continue;
1423 bus_no = buf[0]>>16;
1424 scsi_id = buf[1];
1425 scsi_lun = (buf[2]>>8 )&0xff;
1426 if(bus_no >= MAX_CHANNEL) { // Something wrong skip it
1427 printk(KERN_WARNING"%s: Channel number %d out of range \n", pHba->name, bus_no);
1428 continue;
1430 if (scsi_id >= MAX_ID){
1431 printk(KERN_WARNING"%s: SCSI ID %d out of range \n", pHba->name, bus_no);
1432 continue;
1434 if(bus_no > pHba->top_scsi_channel){
1435 pHba->top_scsi_channel = bus_no;
1437 if(scsi_id > pHba->top_scsi_id){
1438 pHba->top_scsi_id = scsi_id;
1440 if(scsi_lun > pHba->top_scsi_lun){
1441 pHba->top_scsi_lun = scsi_lun;
1443 continue;
1445 d = kmalloc(sizeof(struct i2o_device), GFP_KERNEL);
1446 if(d==NULL)
1448 printk(KERN_CRIT"%s: Out of memory for I2O device data.\n",pHba->name);
1449 return -ENOMEM;
1452 d->controller = pHba;
1453 d->next = NULL;
1455 memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
1457 d->flags = 0;
1458 tid = d->lct_data.tid;
1459 adpt_i2o_report_hba_unit(pHba, d);
1460 adpt_i2o_install_device(pHba, d);
1462 bus_no = 0;
1463 for(d = pHba->devices; d ; d = d->next) {
1464 if(d->lct_data.class_id == I2O_CLASS_BUS_ADAPTER_PORT ||
1465 d->lct_data.class_id == I2O_CLASS_FIBRE_CHANNEL_PORT){
1466 tid = d->lct_data.tid;
1467 // TODO get the bus_no from hrt-but for now they are in order
1468 //bus_no =
1469 if(bus_no > pHba->top_scsi_channel){
1470 pHba->top_scsi_channel = bus_no;
1472 pHba->channel[bus_no].type = d->lct_data.class_id;
1473 pHba->channel[bus_no].tid = tid;
1474 if(adpt_i2o_query_scalar(pHba, tid, 0x0200, -1, buf, 28)>=0)
1476 pHba->channel[bus_no].scsi_id = buf[1];
1477 PDEBUG("Bus %d - SCSI ID %d.\n", bus_no, buf[1]);
1479 // TODO remove - this is just until we get from hrt
1480 bus_no++;
1481 if(bus_no >= MAX_CHANNEL) { // Something wrong skip it
1482 printk(KERN_WARNING"%s: Channel number %d out of range - LCT\n", pHba->name, bus_no);
1483 break;
1488 // Setup adpt_device table
1489 for(d = pHba->devices; d ; d = d->next) {
1490 if(d->lct_data.class_id == I2O_CLASS_RANDOM_BLOCK_STORAGE ||
1491 d->lct_data.class_id == I2O_CLASS_SCSI_PERIPHERAL ||
1492 d->lct_data.class_id == I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
1494 tid = d->lct_data.tid;
1495 scsi_id = -1;
1496 // I2O_DPT_DEVICE_INFO_GROUP_NO;
1497 if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)>=0) {
1498 bus_no = buf[0]>>16;
1499 scsi_id = buf[1];
1500 scsi_lun = (buf[2]>>8 )&0xff;
1501 if(bus_no >= MAX_CHANNEL) { // Something wrong skip it
1502 continue;
1504 if (scsi_id >= MAX_ID) {
1505 continue;
1507 if( pHba->channel[bus_no].device[scsi_id] == NULL){
1508 pDev = kmalloc(sizeof(struct adpt_device),GFP_KERNEL);
1509 if(pDev == NULL) {
1510 return -ENOMEM;
1512 pHba->channel[bus_no].device[scsi_id] = pDev;
1513 memset(pDev,0,sizeof(struct adpt_device));
1514 } else {
1515 for( pDev = pHba->channel[bus_no].device[scsi_id];
1516 pDev->next_lun; pDev = pDev->next_lun){
1518 pDev->next_lun = kmalloc(sizeof(struct adpt_device),GFP_KERNEL);
1519 if(pDev->next_lun == NULL) {
1520 return -ENOMEM;
1522 memset(pDev->next_lun,0,sizeof(struct adpt_device));
1523 pDev = pDev->next_lun;
1525 pDev->tid = tid;
1526 pDev->scsi_channel = bus_no;
1527 pDev->scsi_id = scsi_id;
1528 pDev->scsi_lun = scsi_lun;
1529 pDev->pI2o_dev = d;
1530 d->owner = pDev;
1531 pDev->type = (buf[0])&0xff;
1532 pDev->flags = (buf[0]>>8)&0xff;
1533 if(scsi_id > pHba->top_scsi_id){
1534 pHba->top_scsi_id = scsi_id;
1536 if(scsi_lun > pHba->top_scsi_lun){
1537 pHba->top_scsi_lun = scsi_lun;
1540 if(scsi_id == -1){
1541 printk(KERN_WARNING"Could not find SCSI ID for %s\n",
1542 d->lct_data.identity_tag);
1546 return 0;
1551 * Each I2O controller has a chain of devices on it - these match
1552 * the useful parts of the LCT of the board.
1555 static int adpt_i2o_install_device(adpt_hba* pHba, struct i2o_device *d)
1557 mutex_lock(&adpt_configuration_lock);
1558 d->controller=pHba;
1559 d->owner=NULL;
1560 d->next=pHba->devices;
1561 d->prev=NULL;
1562 if (pHba->devices != NULL){
1563 pHba->devices->prev=d;
1565 pHba->devices=d;
1566 *d->dev_name = 0;
1568 mutex_unlock(&adpt_configuration_lock);
1569 return 0;
1572 static int adpt_open(struct inode *inode, struct file *file)
1574 int minor;
1575 adpt_hba* pHba;
1577 //TODO check for root access
1579 minor = iminor(inode);
1580 if (minor >= hba_count) {
1581 return -ENXIO;
1583 mutex_lock(&adpt_configuration_lock);
1584 for (pHba = hba_chain; pHba; pHba = pHba->next) {
1585 if (pHba->unit == minor) {
1586 break; /* found adapter */
1589 if (pHba == NULL) {
1590 mutex_unlock(&adpt_configuration_lock);
1591 return -ENXIO;
1594 // if(pHba->in_use){
1595 // mutex_unlock(&adpt_configuration_lock);
1596 // return -EBUSY;
1597 // }
1599 pHba->in_use = 1;
1600 mutex_unlock(&adpt_configuration_lock);
1602 return 0;
1605 static int adpt_close(struct inode *inode, struct file *file)
1607 int minor;
1608 adpt_hba* pHba;
1610 minor = iminor(inode);
1611 if (minor >= hba_count) {
1612 return -ENXIO;
1614 mutex_lock(&adpt_configuration_lock);
1615 for (pHba = hba_chain; pHba; pHba = pHba->next) {
1616 if (pHba->unit == minor) {
1617 break; /* found adapter */
1620 mutex_unlock(&adpt_configuration_lock);
1621 if (pHba == NULL) {
1622 return -ENXIO;
1625 pHba->in_use = 0;
1627 return 0;
1631 static int adpt_i2o_passthru(adpt_hba* pHba, u32 __user *arg)
1633 u32 msg[MAX_MESSAGE_SIZE];
1634 u32* reply = NULL;
1635 u32 size = 0;
1636 u32 reply_size = 0;
1637 u32 __user *user_msg = arg;
1638 u32 __user * user_reply = NULL;
1639 void *sg_list[pHba->sg_tablesize];
1640 u32 sg_offset = 0;
1641 u32 sg_count = 0;
1642 int sg_index = 0;
1643 u32 i = 0;
1644 u32 rcode = 0;
1645 void *p = NULL;
1646 ulong flags = 0;
1648 memset(&msg, 0, MAX_MESSAGE_SIZE*4);
1649 // get user msg size in u32s
1650 if(get_user(size, &user_msg[0])){
1651 return -EFAULT;
1653 size = size>>16;
1655 user_reply = &user_msg[size];
1656 if(size > MAX_MESSAGE_SIZE){
1657 return -EFAULT;
1659 size *= 4; // Convert to bytes
1661 /* Copy in the user's I2O command */
1662 if(copy_from_user(msg, user_msg, size)) {
1663 return -EFAULT;
1665 get_user(reply_size, &user_reply[0]);
1666 reply_size = reply_size>>16;
1667 if(reply_size > REPLY_FRAME_SIZE){
1668 reply_size = REPLY_FRAME_SIZE;
1670 reply_size *= 4;
1671 reply = kmalloc(REPLY_FRAME_SIZE*4, GFP_KERNEL);
1672 if(reply == NULL) {
1673 printk(KERN_WARNING"%s: Could not allocate reply buffer\n",pHba->name);
1674 return -ENOMEM;
1676 memset(reply,0,REPLY_FRAME_SIZE*4);
1677 sg_offset = (msg[0]>>4)&0xf;
1678 msg[2] = 0x40000000; // IOCTL context
1679 msg[3] = (u32)reply;
1680 memset(sg_list,0, sizeof(sg_list[0])*pHba->sg_tablesize);
1681 if(sg_offset) {
1682 // TODO 64bit fix
1683 struct sg_simple_element *sg = (struct sg_simple_element*) (msg+sg_offset);
1684 sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
1685 if (sg_count > pHba->sg_tablesize){
1686 printk(KERN_DEBUG"%s:IOCTL SG List too large (%u)\n", pHba->name,sg_count);
1687 kfree (reply);
1688 return -EINVAL;
1691 for(i = 0; i < sg_count; i++) {
1692 int sg_size;
1694 if (!(sg[i].flag_count & 0x10000000 /*I2O_SGL_FLAGS_SIMPLE_ADDRESS_ELEMENT*/)) {
1695 printk(KERN_DEBUG"%s:Bad SG element %d - not simple (%x)\n",pHba->name,i, sg[i].flag_count);
1696 rcode = -EINVAL;
1697 goto cleanup;
1699 sg_size = sg[i].flag_count & 0xffffff;
1700 /* Allocate memory for the transfer */
1701 p = kmalloc(sg_size, GFP_KERNEL|ADDR32);
1702 if(!p) {
1703 printk(KERN_DEBUG"%s: Could not allocate SG buffer - size = %d buffer number %d of %d\n",
1704 pHba->name,sg_size,i,sg_count);
1705 rcode = -ENOMEM;
1706 goto cleanup;
1708 sg_list[sg_index++] = p; // sglist indexed with input frame, not our internal frame.
1709 /* Copy in the user's SG buffer if necessary */
1710 if(sg[i].flag_count & 0x04000000 /*I2O_SGL_FLAGS_DIR*/) {
1711 // TODO 64bit fix
1712 if (copy_from_user(p,(void __user *)sg[i].addr_bus, sg_size)) {
1713 printk(KERN_DEBUG"%s: Could not copy SG buf %d FROM user\n",pHba->name,i);
1714 rcode = -EFAULT;
1715 goto cleanup;
1718 //TODO 64bit fix
1719 sg[i].addr_bus = (u32)virt_to_bus(p);
1723 do {
1724 if(pHba->host)
1725 spin_lock_irqsave(pHba->host->host_lock, flags);
1726 // This state stops any new commands from enterring the
1727 // controller while processing the ioctl
1728 // pHba->state |= DPTI_STATE_IOCTL;
1729 // We can't set this now - The scsi subsystem sets host_blocked and
1730 // the queue empties and stops. We need a way to restart the queue
1731 rcode = adpt_i2o_post_wait(pHba, msg, size, FOREVER);
1732 if (rcode != 0)
1733 printk("adpt_i2o_passthru: post wait failed %d %p\n",
1734 rcode, reply);
1735 // pHba->state &= ~DPTI_STATE_IOCTL;
1736 if(pHba->host)
1737 spin_unlock_irqrestore(pHba->host->host_lock, flags);
1738 } while(rcode == -ETIMEDOUT);
1740 if(rcode){
1741 goto cleanup;
1744 if(sg_offset) {
1745 /* Copy back the Scatter Gather buffers back to user space */
1746 u32 j;
1747 // TODO 64bit fix
1748 struct sg_simple_element* sg;
1749 int sg_size;
1751 // re-acquire the original message to handle correctly the sg copy operation
1752 memset(&msg, 0, MAX_MESSAGE_SIZE*4);
1753 // get user msg size in u32s
1754 if(get_user(size, &user_msg[0])){
1755 rcode = -EFAULT;
1756 goto cleanup;
1758 size = size>>16;
1759 size *= 4;
1760 /* Copy in the user's I2O command */
1761 if (copy_from_user (msg, user_msg, size)) {
1762 rcode = -EFAULT;
1763 goto cleanup;
1765 sg_count = (size - sg_offset*4) / sizeof(struct sg_simple_element);
1767 // TODO 64bit fix
1768 sg = (struct sg_simple_element*)(msg + sg_offset);
1769 for (j = 0; j < sg_count; j++) {
1770 /* Copy out the SG list to user's buffer if necessary */
1771 if(! (sg[j].flag_count & 0x4000000 /*I2O_SGL_FLAGS_DIR*/)) {
1772 sg_size = sg[j].flag_count & 0xffffff;
1773 // TODO 64bit fix
1774 if (copy_to_user((void __user *)sg[j].addr_bus,sg_list[j], sg_size)) {
1775 printk(KERN_WARNING"%s: Could not copy %p TO user %x\n",pHba->name, sg_list[j], sg[j].addr_bus);
1776 rcode = -EFAULT;
1777 goto cleanup;
1783 /* Copy back the reply to user space */
1784 if (reply_size) {
1785 // we wrote our own values for context - now restore the user supplied ones
1786 if(copy_from_user(reply+2, user_msg+2, sizeof(u32)*2)) {
1787 printk(KERN_WARNING"%s: Could not copy message context FROM user\n",pHba->name);
1788 rcode = -EFAULT;
1790 if(copy_to_user(user_reply, reply, reply_size)) {
1791 printk(KERN_WARNING"%s: Could not copy reply TO user\n",pHba->name);
1792 rcode = -EFAULT;
1797 cleanup:
1798 if (rcode != -ETIME && rcode != -EINTR)
1799 kfree (reply);
1800 while(sg_index) {
1801 if(sg_list[--sg_index]) {
1802 if (rcode != -ETIME && rcode != -EINTR)
1803 kfree(sg_list[sg_index]);
1806 return rcode;
1811 * This routine returns information about the system. This does not effect
1812 * any logic and if the info is wrong - it doesn't matter.
1815 /* Get all the info we can not get from kernel services */
1816 static int adpt_system_info(void __user *buffer)
1818 sysInfo_S si;
1820 memset(&si, 0, sizeof(si));
1822 si.osType = OS_LINUX;
1823 si.osMajorVersion = 0;
1824 si.osMinorVersion = 0;
1825 si.osRevision = 0;
1826 si.busType = SI_PCI_BUS;
1827 si.processorFamily = DPTI_sig.dsProcessorFamily;
1829 #if defined __i386__
1830 adpt_i386_info(&si);
1831 #elif defined (__ia64__)
1832 adpt_ia64_info(&si);
1833 #elif defined(__sparc__)
1834 adpt_sparc_info(&si);
1835 #elif defined (__alpha__)
1836 adpt_alpha_info(&si);
1837 #else
1838 si.processorType = 0xff ;
1839 #endif
1840 if(copy_to_user(buffer, &si, sizeof(si))){
1841 printk(KERN_WARNING"dpti: Could not copy buffer TO user\n");
1842 return -EFAULT;
1845 return 0;
1848 #if defined __ia64__
1849 static void adpt_ia64_info(sysInfo_S* si)
1851 // This is all the info we need for now
1852 // We will add more info as our new
1853 // managmenent utility requires it
1854 si->processorType = PROC_IA64;
1856 #endif
1859 #if defined __sparc__
1860 static void adpt_sparc_info(sysInfo_S* si)
1862 // This is all the info we need for now
1863 // We will add more info as our new
1864 // managmenent utility requires it
1865 si->processorType = PROC_ULTRASPARC;
1867 #endif
1869 #if defined __alpha__
1870 static void adpt_alpha_info(sysInfo_S* si)
1872 // This is all the info we need for now
1873 // We will add more info as our new
1874 // managmenent utility requires it
1875 si->processorType = PROC_ALPHA;
1877 #endif
1879 #if defined __i386__
1881 static void adpt_i386_info(sysInfo_S* si)
1883 // This is all the info we need for now
1884 // We will add more info as our new
1885 // managmenent utility requires it
1886 switch (boot_cpu_data.x86) {
1887 case CPU_386:
1888 si->processorType = PROC_386;
1889 break;
1890 case CPU_486:
1891 si->processorType = PROC_486;
1892 break;
1893 case CPU_586:
1894 si->processorType = PROC_PENTIUM;
1895 break;
1896 default: // Just in case
1897 si->processorType = PROC_PENTIUM;
1898 break;
1902 #endif
1905 static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd,
1906 ulong arg)
1908 int minor;
1909 int error = 0;
1910 adpt_hba* pHba;
1911 ulong flags = 0;
1912 void __user *argp = (void __user *)arg;
1914 minor = iminor(inode);
1915 if (minor >= DPTI_MAX_HBA){
1916 return -ENXIO;
1918 mutex_lock(&adpt_configuration_lock);
1919 for (pHba = hba_chain; pHba; pHba = pHba->next) {
1920 if (pHba->unit == minor) {
1921 break; /* found adapter */
1924 mutex_unlock(&adpt_configuration_lock);
1925 if(pHba == NULL){
1926 return -ENXIO;
1929 while((volatile u32) pHba->state & DPTI_STATE_RESET )
1930 schedule_timeout_uninterruptible(2);
1932 switch (cmd) {
1933 // TODO: handle 3 cases
1934 case DPT_SIGNATURE:
1935 if (copy_to_user(argp, &DPTI_sig, sizeof(DPTI_sig))) {
1936 return -EFAULT;
1938 break;
1939 case I2OUSRCMD:
1940 return adpt_i2o_passthru(pHba, argp);
1942 case DPT_CTRLINFO:{
1943 drvrHBAinfo_S HbaInfo;
1945 #define FLG_OSD_PCI_VALID 0x0001
1946 #define FLG_OSD_DMA 0x0002
1947 #define FLG_OSD_I2O 0x0004
1948 memset(&HbaInfo, 0, sizeof(HbaInfo));
1949 HbaInfo.drvrHBAnum = pHba->unit;
1950 HbaInfo.baseAddr = (ulong) pHba->base_addr_phys;
1951 HbaInfo.blinkState = adpt_read_blink_led(pHba);
1952 HbaInfo.pciBusNum = pHba->pDev->bus->number;
1953 HbaInfo.pciDeviceNum=PCI_SLOT(pHba->pDev->devfn);
1954 HbaInfo.Interrupt = pHba->pDev->irq;
1955 HbaInfo.hbaFlags = FLG_OSD_PCI_VALID | FLG_OSD_DMA | FLG_OSD_I2O;
1956 if(copy_to_user(argp, &HbaInfo, sizeof(HbaInfo))){
1957 printk(KERN_WARNING"%s: Could not copy HbaInfo TO user\n",pHba->name);
1958 return -EFAULT;
1960 break;
1962 case DPT_SYSINFO:
1963 return adpt_system_info(argp);
1964 case DPT_BLINKLED:{
1965 u32 value;
1966 value = (u32)adpt_read_blink_led(pHba);
1967 if (copy_to_user(argp, &value, sizeof(value))) {
1968 return -EFAULT;
1970 break;
1972 case I2ORESETCMD:
1973 if(pHba->host)
1974 spin_lock_irqsave(pHba->host->host_lock, flags);
1975 adpt_hba_reset(pHba);
1976 if(pHba->host)
1977 spin_unlock_irqrestore(pHba->host->host_lock, flags);
1978 break;
1979 case I2ORESCANCMD:
1980 adpt_rescan(pHba);
1981 break;
1982 default:
1983 return -EINVAL;
1986 return error;
1990 static irqreturn_t adpt_isr(int irq, void *dev_id)
1992 struct scsi_cmnd* cmd;
1993 adpt_hba* pHba = dev_id;
1994 u32 m;
1995 void __iomem *reply;
1996 u32 status=0;
1997 u32 context;
1998 ulong flags = 0;
1999 int handled = 0;
2001 if (pHba == NULL){
2002 printk(KERN_WARNING"adpt_isr: NULL dev_id\n");
2003 return IRQ_NONE;
2005 if(pHba->host)
2006 spin_lock_irqsave(pHba->host->host_lock, flags);
2008 while( readl(pHba->irq_mask) & I2O_INTERRUPT_PENDING_B) {
2009 m = readl(pHba->reply_port);
2010 if(m == EMPTY_QUEUE){
2011 // Try twice then give up
2012 rmb();
2013 m = readl(pHba->reply_port);
2014 if(m == EMPTY_QUEUE){
2015 // This really should not happen
2016 printk(KERN_ERR"dpti: Could not get reply frame\n");
2017 goto out;
2020 reply = bus_to_virt(m);
2022 if (readl(reply) & MSG_FAIL) {
2023 u32 old_m = readl(reply+28);
2024 void __iomem *msg;
2025 u32 old_context;
2026 PDEBUG("%s: Failed message\n",pHba->name);
2027 if(old_m >= 0x100000){
2028 printk(KERN_ERR"%s: Bad preserved MFA (%x)- dropping frame\n",pHba->name,old_m);
2029 writel(m,pHba->reply_port);
2030 continue;
2032 // Transaction context is 0 in failed reply frame
2033 msg = pHba->msg_addr_virt + old_m;
2034 old_context = readl(msg+12);
2035 writel(old_context, reply+12);
2036 adpt_send_nop(pHba, old_m);
2038 context = readl(reply+8);
2039 if(context & 0x40000000){ // IOCTL
2040 void *p = (void *)readl(reply+12);
2041 if( p != NULL) {
2042 memcpy_fromio(p, reply, REPLY_FRAME_SIZE * 4);
2044 // All IOCTLs will also be post wait
2046 if(context & 0x80000000){ // Post wait message
2047 status = readl(reply+16);
2048 if(status >> 24){
2049 status &= 0xffff; /* Get detail status */
2050 } else {
2051 status = I2O_POST_WAIT_OK;
2053 if(!(context & 0x40000000)) {
2054 cmd = (struct scsi_cmnd*) readl(reply+12);
2055 if(cmd != NULL) {
2056 printk(KERN_WARNING"%s: Apparent SCSI cmd in Post Wait Context - cmd=%p context=%x\n", pHba->name, cmd, context);
2059 adpt_i2o_post_wait_complete(context, status);
2060 } else { // SCSI message
2061 cmd = (struct scsi_cmnd*) readl(reply+12);
2062 if(cmd != NULL){
2063 if(cmd->serial_number != 0) { // If not timedout
2064 adpt_i2o_to_scsi(reply, cmd);
2068 writel(m, pHba->reply_port);
2069 wmb();
2070 rmb();
2072 handled = 1;
2073 out: if(pHba->host)
2074 spin_unlock_irqrestore(pHba->host->host_lock, flags);
2075 return IRQ_RETVAL(handled);
2078 static s32 adpt_scsi_to_i2o(adpt_hba* pHba, struct scsi_cmnd* cmd, struct adpt_device* d)
2080 int i;
2081 u32 msg[MAX_MESSAGE_SIZE];
2082 u32* mptr;
2083 u32 *lenptr;
2084 int direction;
2085 int scsidir;
2086 u32 len;
2087 u32 reqlen;
2088 s32 rcode;
2090 memset(msg, 0 , sizeof(msg));
2091 len = cmd->request_bufflen;
2092 direction = 0x00000000;
2094 scsidir = 0x00000000; // DATA NO XFER
2095 if(len) {
2097 * Set SCBFlags to indicate if data is being transferred
2098 * in or out, or no data transfer
2099 * Note: Do not have to verify index is less than 0 since
2100 * cmd->cmnd[0] is an unsigned char
2102 switch(cmd->sc_data_direction){
2103 case DMA_FROM_DEVICE:
2104 scsidir =0x40000000; // DATA IN (iop<--dev)
2105 break;
2106 case DMA_TO_DEVICE:
2107 direction=0x04000000; // SGL OUT
2108 scsidir =0x80000000; // DATA OUT (iop-->dev)
2109 break;
2110 case DMA_NONE:
2111 break;
2112 case DMA_BIDIRECTIONAL:
2113 scsidir =0x40000000; // DATA IN (iop<--dev)
2114 // Assume In - and continue;
2115 break;
2116 default:
2117 printk(KERN_WARNING"%s: scsi opcode 0x%x not supported.\n",
2118 pHba->name, cmd->cmnd[0]);
2119 cmd->result = (DID_OK <<16) | (INITIATOR_ERROR << 8);
2120 cmd->scsi_done(cmd);
2121 return 0;
2124 // msg[0] is set later
2125 // I2O_CMD_SCSI_EXEC
2126 msg[1] = ((0xff<<24)|(HOST_TID<<12)|d->tid);
2127 msg[2] = 0;
2128 msg[3] = (u32)cmd; /* We want the SCSI control block back */
2129 // Our cards use the transaction context as the tag for queueing
2130 // Adaptec/DPT Private stuff
2131 msg[4] = I2O_CMD_SCSI_EXEC|(DPT_ORGANIZATION_ID<<16);
2132 msg[5] = d->tid;
2133 /* Direction, disconnect ok | sense data | simple queue , CDBLen */
2134 // I2O_SCB_FLAG_ENABLE_DISCONNECT |
2135 // I2O_SCB_FLAG_SIMPLE_QUEUE_TAG |
2136 // I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE;
2137 msg[6] = scsidir|0x20a00000|cmd->cmd_len;
2139 mptr=msg+7;
2141 // Write SCSI command into the message - always 16 byte block
2142 memset(mptr, 0, 16);
2143 memcpy(mptr, cmd->cmnd, cmd->cmd_len);
2144 mptr+=4;
2145 lenptr=mptr++; /* Remember me - fill in when we know */
2146 reqlen = 14; // SINGLE SGE
2147 /* Now fill in the SGList and command */
2148 if(cmd->use_sg) {
2149 struct scatterlist *sg = (struct scatterlist *)cmd->request_buffer;
2150 int sg_count = pci_map_sg(pHba->pDev, sg, cmd->use_sg,
2151 cmd->sc_data_direction);
2154 len = 0;
2155 for(i = 0 ; i < sg_count; i++) {
2156 *mptr++ = direction|0x10000000|sg_dma_len(sg);
2157 len+=sg_dma_len(sg);
2158 *mptr++ = sg_dma_address(sg);
2159 sg++;
2161 /* Make this an end of list */
2162 mptr[-2] = direction|0xD0000000|sg_dma_len(sg-1);
2163 reqlen = mptr - msg;
2164 *lenptr = len;
2166 if(cmd->underflow && len != cmd->underflow){
2167 printk(KERN_WARNING"Cmd len %08X Cmd underflow %08X\n",
2168 len, cmd->underflow);
2170 } else {
2171 *lenptr = len = cmd->request_bufflen;
2172 if(len == 0) {
2173 reqlen = 12;
2174 } else {
2175 *mptr++ = 0xD0000000|direction|cmd->request_bufflen;
2176 *mptr++ = pci_map_single(pHba->pDev,
2177 cmd->request_buffer,
2178 cmd->request_bufflen,
2179 cmd->sc_data_direction);
2183 /* Stick the headers on */
2184 msg[0] = reqlen<<16 | ((reqlen > 12) ? SGL_OFFSET_12 : SGL_OFFSET_0);
2186 // Send it on it's way
2187 rcode = adpt_i2o_post_this(pHba, msg, reqlen<<2);
2188 if (rcode == 0) {
2189 return 0;
2191 return rcode;
2195 static s32 adpt_scsi_register(adpt_hba* pHba,struct scsi_host_template * sht)
2197 struct Scsi_Host *host = NULL;
2199 host = scsi_register(sht, sizeof(adpt_hba*));
2200 if (host == NULL) {
2201 printk ("%s: scsi_register returned NULL\n",pHba->name);
2202 return -1;
2204 host->hostdata[0] = (unsigned long)pHba;
2205 pHba->host = host;
2207 host->irq = pHba->pDev->irq;
2208 /* no IO ports, so don't have to set host->io_port and
2209 * host->n_io_port
2211 host->io_port = 0;
2212 host->n_io_port = 0;
2213 /* see comments in scsi_host.h */
2214 host->max_id = 16;
2215 host->max_lun = 256;
2216 host->max_channel = pHba->top_scsi_channel + 1;
2217 host->cmd_per_lun = 1;
2218 host->unique_id = (uint) pHba;
2219 host->sg_tablesize = pHba->sg_tablesize;
2220 host->can_queue = pHba->post_fifo_size;
2222 return 0;
2226 static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd)
2228 adpt_hba* pHba;
2229 u32 hba_status;
2230 u32 dev_status;
2231 u32 reply_flags = readl(reply) & 0xff00; // Leave it shifted up 8 bits
2232 // I know this would look cleaner if I just read bytes
2233 // but the model I have been using for all the rest of the
2234 // io is in 4 byte words - so I keep that model
2235 u16 detailed_status = readl(reply+16) &0xffff;
2236 dev_status = (detailed_status & 0xff);
2237 hba_status = detailed_status >> 8;
2239 // calculate resid for sg
2240 cmd->resid = cmd->request_bufflen - readl(reply+5);
2242 pHba = (adpt_hba*) cmd->device->host->hostdata[0];
2244 cmd->sense_buffer[0] = '\0'; // initialize sense valid flag to false
2246 if(!(reply_flags & MSG_FAIL)) {
2247 switch(detailed_status & I2O_SCSI_DSC_MASK) {
2248 case I2O_SCSI_DSC_SUCCESS:
2249 cmd->result = (DID_OK << 16);
2250 // handle underflow
2251 if(readl(reply+5) < cmd->underflow ) {
2252 cmd->result = (DID_ERROR <<16);
2253 printk(KERN_WARNING"%s: SCSI CMD underflow\n",pHba->name);
2255 break;
2256 case I2O_SCSI_DSC_REQUEST_ABORTED:
2257 cmd->result = (DID_ABORT << 16);
2258 break;
2259 case I2O_SCSI_DSC_PATH_INVALID:
2260 case I2O_SCSI_DSC_DEVICE_NOT_PRESENT:
2261 case I2O_SCSI_DSC_SELECTION_TIMEOUT:
2262 case I2O_SCSI_DSC_COMMAND_TIMEOUT:
2263 case I2O_SCSI_DSC_NO_ADAPTER:
2264 case I2O_SCSI_DSC_RESOURCE_UNAVAILABLE:
2265 printk(KERN_WARNING"%s: SCSI Timeout-Device (%d,%d,%d) hba status=0x%x, dev status=0x%x, cmd=0x%x\n",
2266 pHba->name, (u32)cmd->device->channel, (u32)cmd->device->id, (u32)cmd->device->lun, hba_status, dev_status, cmd->cmnd[0]);
2267 cmd->result = (DID_TIME_OUT << 16);
2268 break;
2269 case I2O_SCSI_DSC_ADAPTER_BUSY:
2270 case I2O_SCSI_DSC_BUS_BUSY:
2271 cmd->result = (DID_BUS_BUSY << 16);
2272 break;
2273 case I2O_SCSI_DSC_SCSI_BUS_RESET:
2274 case I2O_SCSI_DSC_BDR_MESSAGE_SENT:
2275 cmd->result = (DID_RESET << 16);
2276 break;
2277 case I2O_SCSI_DSC_PARITY_ERROR_FAILURE:
2278 printk(KERN_WARNING"%s: SCSI CMD parity error\n",pHba->name);
2279 cmd->result = (DID_PARITY << 16);
2280 break;
2281 case I2O_SCSI_DSC_UNABLE_TO_ABORT:
2282 case I2O_SCSI_DSC_COMPLETE_WITH_ERROR:
2283 case I2O_SCSI_DSC_UNABLE_TO_TERMINATE:
2284 case I2O_SCSI_DSC_MR_MESSAGE_RECEIVED:
2285 case I2O_SCSI_DSC_AUTOSENSE_FAILED:
2286 case I2O_SCSI_DSC_DATA_OVERRUN:
2287 case I2O_SCSI_DSC_UNEXPECTED_BUS_FREE:
2288 case I2O_SCSI_DSC_SEQUENCE_FAILURE:
2289 case I2O_SCSI_DSC_REQUEST_LENGTH_ERROR:
2290 case I2O_SCSI_DSC_PROVIDE_FAILURE:
2291 case I2O_SCSI_DSC_REQUEST_TERMINATED:
2292 case I2O_SCSI_DSC_IDE_MESSAGE_SENT:
2293 case I2O_SCSI_DSC_UNACKNOWLEDGED_EVENT:
2294 case I2O_SCSI_DSC_MESSAGE_RECEIVED:
2295 case I2O_SCSI_DSC_INVALID_CDB:
2296 case I2O_SCSI_DSC_LUN_INVALID:
2297 case I2O_SCSI_DSC_SCSI_TID_INVALID:
2298 case I2O_SCSI_DSC_FUNCTION_UNAVAILABLE:
2299 case I2O_SCSI_DSC_NO_NEXUS:
2300 case I2O_SCSI_DSC_CDB_RECEIVED:
2301 case I2O_SCSI_DSC_LUN_ALREADY_ENABLED:
2302 case I2O_SCSI_DSC_QUEUE_FROZEN:
2303 case I2O_SCSI_DSC_REQUEST_INVALID:
2304 default:
2305 printk(KERN_WARNING"%s: SCSI error %0x-Device(%d,%d,%d) hba_status=0x%x, dev_status=0x%x, cmd=0x%x\n",
2306 pHba->name, detailed_status & I2O_SCSI_DSC_MASK, (u32)cmd->device->channel, (u32)cmd->device->id, (u32)cmd->device->lun,
2307 hba_status, dev_status, cmd->cmnd[0]);
2308 cmd->result = (DID_ERROR << 16);
2309 break;
2312 // copy over the request sense data if it was a check
2313 // condition status
2314 if(dev_status == 0x02 /*CHECK_CONDITION*/) {
2315 u32 len = sizeof(cmd->sense_buffer);
2316 len = (len > 40) ? 40 : len;
2317 // Copy over the sense data
2318 memcpy_fromio(cmd->sense_buffer, (reply+28) , len);
2319 if(cmd->sense_buffer[0] == 0x70 /* class 7 */ &&
2320 cmd->sense_buffer[2] == DATA_PROTECT ){
2321 /* This is to handle an array failed */
2322 cmd->result = (DID_TIME_OUT << 16);
2323 printk(KERN_WARNING"%s: SCSI Data Protect-Device (%d,%d,%d) hba_status=0x%x, dev_status=0x%x, cmd=0x%x\n",
2324 pHba->name, (u32)cmd->device->channel, (u32)cmd->device->id, (u32)cmd->device->lun,
2325 hba_status, dev_status, cmd->cmnd[0]);
2329 } else {
2330 /* In this condtion we could not talk to the tid
2331 * the card rejected it. We should signal a retry
2332 * for a limitted number of retries.
2334 cmd->result = (DID_TIME_OUT << 16);
2335 printk(KERN_WARNING"%s: I2O MSG_FAIL - Device (%d,%d,%d) tid=%d, cmd=0x%x\n",
2336 pHba->name, (u32)cmd->device->channel, (u32)cmd->device->id, (u32)cmd->device->lun,
2337 ((struct adpt_device*)(cmd->device->hostdata))->tid, cmd->cmnd[0]);
2340 cmd->result |= (dev_status);
2342 if(cmd->scsi_done != NULL){
2343 cmd->scsi_done(cmd);
2345 return cmd->result;
2349 static s32 adpt_rescan(adpt_hba* pHba)
2351 s32 rcode;
2352 ulong flags = 0;
2354 if(pHba->host)
2355 spin_lock_irqsave(pHba->host->host_lock, flags);
2356 if ((rcode=adpt_i2o_lct_get(pHba)) < 0)
2357 goto out;
2358 if ((rcode=adpt_i2o_reparse_lct(pHba)) < 0)
2359 goto out;
2360 rcode = 0;
2361 out: if(pHba->host)
2362 spin_unlock_irqrestore(pHba->host->host_lock, flags);
2363 return rcode;
2367 static s32 adpt_i2o_reparse_lct(adpt_hba* pHba)
2369 int i;
2370 int max;
2371 int tid;
2372 struct i2o_device *d;
2373 i2o_lct *lct = pHba->lct;
2374 u8 bus_no = 0;
2375 s16 scsi_id;
2376 s16 scsi_lun;
2377 u32 buf[10]; // at least 8 u32's
2378 struct adpt_device* pDev = NULL;
2379 struct i2o_device* pI2o_dev = NULL;
2381 if (lct == NULL) {
2382 printk(KERN_ERR "%s: LCT is empty???\n",pHba->name);
2383 return -1;
2386 max = lct->table_size;
2387 max -= 3;
2388 max /= 9;
2390 // Mark each drive as unscanned
2391 for (d = pHba->devices; d; d = d->next) {
2392 pDev =(struct adpt_device*) d->owner;
2393 if(!pDev){
2394 continue;
2396 pDev->state |= DPTI_DEV_UNSCANNED;
2399 printk(KERN_INFO "%s: LCT has %d entries.\n", pHba->name,max);
2401 for(i=0;i<max;i++) {
2402 if( lct->lct_entry[i].user_tid != 0xfff){
2403 continue;
2406 if( lct->lct_entry[i].class_id == I2O_CLASS_RANDOM_BLOCK_STORAGE ||
2407 lct->lct_entry[i].class_id == I2O_CLASS_SCSI_PERIPHERAL ||
2408 lct->lct_entry[i].class_id == I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL ){
2409 tid = lct->lct_entry[i].tid;
2410 if(adpt_i2o_query_scalar(pHba, tid, 0x8000, -1, buf, 32)<0) {
2411 printk(KERN_ERR"%s: Could not query device\n",pHba->name);
2412 continue;
2414 bus_no = buf[0]>>16;
2415 scsi_id = buf[1];
2416 scsi_lun = (buf[2]>>8 )&0xff;
2417 pDev = pHba->channel[bus_no].device[scsi_id];
2418 /* da lun */
2419 while(pDev) {
2420 if(pDev->scsi_lun == scsi_lun) {
2421 break;
2423 pDev = pDev->next_lun;
2425 if(!pDev ) { // Something new add it
2426 d = kmalloc(sizeof(struct i2o_device), GFP_KERNEL);
2427 if(d==NULL)
2429 printk(KERN_CRIT "Out of memory for I2O device data.\n");
2430 return -ENOMEM;
2433 d->controller = pHba;
2434 d->next = NULL;
2436 memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
2438 d->flags = 0;
2439 adpt_i2o_report_hba_unit(pHba, d);
2440 adpt_i2o_install_device(pHba, d);
2442 if(bus_no >= MAX_CHANNEL) { // Something wrong skip it
2443 printk(KERN_WARNING"%s: Channel number %d out of range \n", pHba->name, bus_no);
2444 continue;
2446 pDev = pHba->channel[bus_no].device[scsi_id];
2447 if( pDev == NULL){
2448 pDev = kmalloc(sizeof(struct adpt_device),GFP_KERNEL);
2449 if(pDev == NULL) {
2450 return -ENOMEM;
2452 pHba->channel[bus_no].device[scsi_id] = pDev;
2453 } else {
2454 while (pDev->next_lun) {
2455 pDev = pDev->next_lun;
2457 pDev = pDev->next_lun = kmalloc(sizeof(struct adpt_device),GFP_KERNEL);
2458 if(pDev == NULL) {
2459 return -ENOMEM;
2462 memset(pDev,0,sizeof(struct adpt_device));
2463 pDev->tid = d->lct_data.tid;
2464 pDev->scsi_channel = bus_no;
2465 pDev->scsi_id = scsi_id;
2466 pDev->scsi_lun = scsi_lun;
2467 pDev->pI2o_dev = d;
2468 d->owner = pDev;
2469 pDev->type = (buf[0])&0xff;
2470 pDev->flags = (buf[0]>>8)&0xff;
2471 // Too late, SCSI system has made up it's mind, but what the hey ...
2472 if(scsi_id > pHba->top_scsi_id){
2473 pHba->top_scsi_id = scsi_id;
2475 if(scsi_lun > pHba->top_scsi_lun){
2476 pHba->top_scsi_lun = scsi_lun;
2478 continue;
2479 } // end of new i2o device
2481 // We found an old device - check it
2482 while(pDev) {
2483 if(pDev->scsi_lun == scsi_lun) {
2484 if(!scsi_device_online(pDev->pScsi_dev)) {
2485 printk(KERN_WARNING"%s: Setting device (%d,%d,%d) back online\n",
2486 pHba->name,bus_no,scsi_id,scsi_lun);
2487 if (pDev->pScsi_dev) {
2488 scsi_device_set_state(pDev->pScsi_dev, SDEV_RUNNING);
2491 d = pDev->pI2o_dev;
2492 if(d->lct_data.tid != tid) { // something changed
2493 pDev->tid = tid;
2494 memcpy(&d->lct_data, &lct->lct_entry[i], sizeof(i2o_lct_entry));
2495 if (pDev->pScsi_dev) {
2496 pDev->pScsi_dev->changed = TRUE;
2497 pDev->pScsi_dev->removable = TRUE;
2500 // Found it - mark it scanned
2501 pDev->state = DPTI_DEV_ONLINE;
2502 break;
2504 pDev = pDev->next_lun;
2508 for (pI2o_dev = pHba->devices; pI2o_dev; pI2o_dev = pI2o_dev->next) {
2509 pDev =(struct adpt_device*) pI2o_dev->owner;
2510 if(!pDev){
2511 continue;
2513 // Drive offline drives that previously existed but could not be found
2514 // in the LCT table
2515 if (pDev->state & DPTI_DEV_UNSCANNED){
2516 pDev->state = DPTI_DEV_OFFLINE;
2517 printk(KERN_WARNING"%s: Device (%d,%d,%d) offline\n",pHba->name,pDev->scsi_channel,pDev->scsi_id,pDev->scsi_lun);
2518 if (pDev->pScsi_dev) {
2519 scsi_device_set_state(pDev->pScsi_dev, SDEV_OFFLINE);
2523 return 0;
2526 static void adpt_fail_posted_scbs(adpt_hba* pHba)
2528 struct scsi_cmnd* cmd = NULL;
2529 struct scsi_device* d = NULL;
2531 shost_for_each_device(d, pHba->host) {
2532 unsigned long flags;
2533 spin_lock_irqsave(&d->list_lock, flags);
2534 list_for_each_entry(cmd, &d->cmd_list, list) {
2535 if(cmd->serial_number == 0){
2536 continue;
2538 cmd->result = (DID_OK << 16) | (QUEUE_FULL <<1);
2539 cmd->scsi_done(cmd);
2541 spin_unlock_irqrestore(&d->list_lock, flags);
2546 /*============================================================================
2547 * Routines from i2o subsystem
2548 *============================================================================
2554 * Bring an I2O controller into HOLD state. See the spec.
2556 static int adpt_i2o_activate_hba(adpt_hba* pHba)
2558 int rcode;
2560 if(pHba->initialized ) {
2561 if (adpt_i2o_status_get(pHba) < 0) {
2562 if((rcode = adpt_i2o_reset_hba(pHba)) != 0){
2563 printk(KERN_WARNING"%s: Could NOT reset.\n", pHba->name);
2564 return rcode;
2566 if (adpt_i2o_status_get(pHba) < 0) {
2567 printk(KERN_INFO "HBA not responding.\n");
2568 return -1;
2572 if(pHba->status_block->iop_state == ADAPTER_STATE_FAULTED) {
2573 printk(KERN_CRIT "%s: hardware fault\n", pHba->name);
2574 return -1;
2577 if (pHba->status_block->iop_state == ADAPTER_STATE_READY ||
2578 pHba->status_block->iop_state == ADAPTER_STATE_OPERATIONAL ||
2579 pHba->status_block->iop_state == ADAPTER_STATE_HOLD ||
2580 pHba->status_block->iop_state == ADAPTER_STATE_FAILED) {
2581 adpt_i2o_reset_hba(pHba);
2582 if (adpt_i2o_status_get(pHba) < 0 || pHba->status_block->iop_state != ADAPTER_STATE_RESET) {
2583 printk(KERN_ERR "%s: Failed to initialize.\n", pHba->name);
2584 return -1;
2587 } else {
2588 if((rcode = adpt_i2o_reset_hba(pHba)) != 0){
2589 printk(KERN_WARNING"%s: Could NOT reset.\n", pHba->name);
2590 return rcode;
2595 if (adpt_i2o_init_outbound_q(pHba) < 0) {
2596 return -1;
2599 /* In HOLD state */
2601 if (adpt_i2o_hrt_get(pHba) < 0) {
2602 return -1;
2605 return 0;
2609 * Bring a controller online into OPERATIONAL state.
2612 static int adpt_i2o_online_hba(adpt_hba* pHba)
2614 if (adpt_i2o_systab_send(pHba) < 0) {
2615 adpt_i2o_delete_hba(pHba);
2616 return -1;
2618 /* In READY state */
2620 if (adpt_i2o_enable_hba(pHba) < 0) {
2621 adpt_i2o_delete_hba(pHba);
2622 return -1;
2625 /* In OPERATIONAL state */
2626 return 0;
2629 static s32 adpt_send_nop(adpt_hba*pHba,u32 m)
2631 u32 __iomem *msg;
2632 ulong timeout = jiffies + 5*HZ;
2634 while(m == EMPTY_QUEUE){
2635 rmb();
2636 m = readl(pHba->post_port);
2637 if(m != EMPTY_QUEUE){
2638 break;
2640 if(time_after(jiffies,timeout)){
2641 printk(KERN_ERR "%s: Timeout waiting for message frame!\n",pHba->name);
2642 return 2;
2644 schedule_timeout_uninterruptible(1);
2646 msg = (u32 __iomem *)(pHba->msg_addr_virt + m);
2647 writel( THREE_WORD_MSG_SIZE | SGL_OFFSET_0,&msg[0]);
2648 writel( I2O_CMD_UTIL_NOP << 24 | HOST_TID << 12 | 0,&msg[1]);
2649 writel( 0,&msg[2]);
2650 wmb();
2652 writel(m, pHba->post_port);
2653 wmb();
2654 return 0;
2657 static s32 adpt_i2o_init_outbound_q(adpt_hba* pHba)
2659 u8 *status;
2660 u32 __iomem *msg = NULL;
2661 int i;
2662 ulong timeout = jiffies + TMOUT_INITOUTBOUND*HZ;
2663 u32* ptr;
2664 u32 outbound_frame; // This had to be a 32 bit address
2665 u32 m;
2667 do {
2668 rmb();
2669 m = readl(pHba->post_port);
2670 if (m != EMPTY_QUEUE) {
2671 break;
2674 if(time_after(jiffies,timeout)){
2675 printk(KERN_WARNING"%s: Timeout waiting for message frame\n",pHba->name);
2676 return -ETIMEDOUT;
2678 schedule_timeout_uninterruptible(1);
2679 } while(m == EMPTY_QUEUE);
2681 msg=(u32 __iomem *)(pHba->msg_addr_virt+m);
2683 status = kmalloc(4,GFP_KERNEL|ADDR32);
2684 if (status==NULL) {
2685 adpt_send_nop(pHba, m);
2686 printk(KERN_WARNING"%s: IOP reset failed - no free memory.\n",
2687 pHba->name);
2688 return -ENOMEM;
2690 memset(status, 0, 4);
2692 writel(EIGHT_WORD_MSG_SIZE| SGL_OFFSET_6, &msg[0]);
2693 writel(I2O_CMD_OUTBOUND_INIT<<24 | HOST_TID<<12 | ADAPTER_TID, &msg[1]);
2694 writel(0, &msg[2]);
2695 writel(0x0106, &msg[3]); /* Transaction context */
2696 writel(4096, &msg[4]); /* Host page frame size */
2697 writel((REPLY_FRAME_SIZE)<<16|0x80, &msg[5]); /* Outbound msg frame size and Initcode */
2698 writel(0xD0000004, &msg[6]); /* Simple SG LE, EOB */
2699 writel(virt_to_bus(status), &msg[7]);
2701 writel(m, pHba->post_port);
2702 wmb();
2704 // Wait for the reply status to come back
2705 do {
2706 if (*status) {
2707 if (*status != 0x01 /*I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS*/) {
2708 break;
2711 rmb();
2712 if(time_after(jiffies,timeout)){
2713 printk(KERN_WARNING"%s: Timeout Initializing\n",pHba->name);
2714 return -ETIMEDOUT;
2716 schedule_timeout_uninterruptible(1);
2717 } while (1);
2719 // If the command was successful, fill the fifo with our reply
2720 // message packets
2721 if(*status != 0x04 /*I2O_EXEC_OUTBOUND_INIT_COMPLETE*/) {
2722 kfree(status);
2723 return -2;
2725 kfree(status);
2727 kfree(pHba->reply_pool);
2729 pHba->reply_pool = kmalloc(pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4, GFP_KERNEL|ADDR32);
2730 if(!pHba->reply_pool){
2731 printk(KERN_ERR"%s: Could not allocate reply pool\n",pHba->name);
2732 return -1;
2734 memset(pHba->reply_pool, 0 , pHba->reply_fifo_size * REPLY_FRAME_SIZE * 4);
2736 ptr = pHba->reply_pool;
2737 for(i = 0; i < pHba->reply_fifo_size; i++) {
2738 outbound_frame = (u32)virt_to_bus(ptr);
2739 writel(outbound_frame, pHba->reply_port);
2740 wmb();
2741 ptr += REPLY_FRAME_SIZE;
2743 adpt_i2o_status_get(pHba);
2744 return 0;
2749 * I2O System Table. Contains information about
2750 * all the IOPs in the system. Used to inform IOPs
2751 * about each other's existence.
2753 * sys_tbl_ver is the CurrentChangeIndicator that is
2754 * used by IOPs to track changes.
2759 static s32 adpt_i2o_status_get(adpt_hba* pHba)
2761 ulong timeout;
2762 u32 m;
2763 u32 __iomem *msg;
2764 u8 *status_block=NULL;
2765 ulong status_block_bus;
2767 if(pHba->status_block == NULL) {
2768 pHba->status_block = (i2o_status_block*)
2769 kmalloc(sizeof(i2o_status_block),GFP_KERNEL|ADDR32);
2770 if(pHba->status_block == NULL) {
2771 printk(KERN_ERR
2772 "dpti%d: Get Status Block failed; Out of memory. \n",
2773 pHba->unit);
2774 return -ENOMEM;
2777 memset(pHba->status_block, 0, sizeof(i2o_status_block));
2778 status_block = (u8*)(pHba->status_block);
2779 status_block_bus = virt_to_bus(pHba->status_block);
2780 timeout = jiffies+TMOUT_GETSTATUS*HZ;
2781 do {
2782 rmb();
2783 m = readl(pHba->post_port);
2784 if (m != EMPTY_QUEUE) {
2785 break;
2787 if(time_after(jiffies,timeout)){
2788 printk(KERN_ERR "%s: Timeout waiting for message !\n",
2789 pHba->name);
2790 return -ETIMEDOUT;
2792 schedule_timeout_uninterruptible(1);
2793 } while(m==EMPTY_QUEUE);
2796 msg=(u32 __iomem *)(pHba->msg_addr_virt+m);
2798 writel(NINE_WORD_MSG_SIZE|SGL_OFFSET_0, &msg[0]);
2799 writel(I2O_CMD_STATUS_GET<<24|HOST_TID<<12|ADAPTER_TID, &msg[1]);
2800 writel(1, &msg[2]);
2801 writel(0, &msg[3]);
2802 writel(0, &msg[4]);
2803 writel(0, &msg[5]);
2804 writel(((u32)status_block_bus)&0xffffffff, &msg[6]);
2805 writel(0, &msg[7]);
2806 writel(sizeof(i2o_status_block), &msg[8]); // 88 bytes
2808 //post message
2809 writel(m, pHba->post_port);
2810 wmb();
2812 while(status_block[87]!=0xff){
2813 if(time_after(jiffies,timeout)){
2814 printk(KERN_ERR"dpti%d: Get status timeout.\n",
2815 pHba->unit);
2816 return -ETIMEDOUT;
2818 rmb();
2819 schedule_timeout_uninterruptible(1);
2822 // Set up our number of outbound and inbound messages
2823 pHba->post_fifo_size = pHba->status_block->max_inbound_frames;
2824 if (pHba->post_fifo_size > MAX_TO_IOP_MESSAGES) {
2825 pHba->post_fifo_size = MAX_TO_IOP_MESSAGES;
2828 pHba->reply_fifo_size = pHba->status_block->max_outbound_frames;
2829 if (pHba->reply_fifo_size > MAX_FROM_IOP_MESSAGES) {
2830 pHba->reply_fifo_size = MAX_FROM_IOP_MESSAGES;
2833 // Calculate the Scatter Gather list size
2834 pHba->sg_tablesize = (pHba->status_block->inbound_frame_size * 4 -40)/ sizeof(struct sg_simple_element);
2835 if (pHba->sg_tablesize > SG_LIST_ELEMENTS) {
2836 pHba->sg_tablesize = SG_LIST_ELEMENTS;
2840 #ifdef DEBUG
2841 printk("dpti%d: State = ",pHba->unit);
2842 switch(pHba->status_block->iop_state) {
2843 case 0x01:
2844 printk("INIT\n");
2845 break;
2846 case 0x02:
2847 printk("RESET\n");
2848 break;
2849 case 0x04:
2850 printk("HOLD\n");
2851 break;
2852 case 0x05:
2853 printk("READY\n");
2854 break;
2855 case 0x08:
2856 printk("OPERATIONAL\n");
2857 break;
2858 case 0x10:
2859 printk("FAILED\n");
2860 break;
2861 case 0x11:
2862 printk("FAULTED\n");
2863 break;
2864 default:
2865 printk("%x (unknown!!)\n",pHba->status_block->iop_state);
2867 #endif
2868 return 0;
2872 * Get the IOP's Logical Configuration Table
2874 static int adpt_i2o_lct_get(adpt_hba* pHba)
2876 u32 msg[8];
2877 int ret;
2878 u32 buf[16];
2880 if ((pHba->lct_size == 0) || (pHba->lct == NULL)){
2881 pHba->lct_size = pHba->status_block->expected_lct_size;
2883 do {
2884 if (pHba->lct == NULL) {
2885 pHba->lct = kmalloc(pHba->lct_size, GFP_KERNEL|ADDR32);
2886 if(pHba->lct == NULL) {
2887 printk(KERN_CRIT "%s: Lct Get failed. Out of memory.\n",
2888 pHba->name);
2889 return -ENOMEM;
2892 memset(pHba->lct, 0, pHba->lct_size);
2894 msg[0] = EIGHT_WORD_MSG_SIZE|SGL_OFFSET_6;
2895 msg[1] = I2O_CMD_LCT_NOTIFY<<24 | HOST_TID<<12 | ADAPTER_TID;
2896 msg[2] = 0;
2897 msg[3] = 0;
2898 msg[4] = 0xFFFFFFFF; /* All devices */
2899 msg[5] = 0x00000000; /* Report now */
2900 msg[6] = 0xD0000000|pHba->lct_size;
2901 msg[7] = virt_to_bus(pHba->lct);
2903 if ((ret=adpt_i2o_post_wait(pHba, msg, sizeof(msg), 360))) {
2904 printk(KERN_ERR "%s: LCT Get failed (status=%#10x.\n",
2905 pHba->name, ret);
2906 printk(KERN_ERR"Adaptec: Error Reading Hardware.\n");
2907 return ret;
2910 if ((pHba->lct->table_size << 2) > pHba->lct_size) {
2911 pHba->lct_size = pHba->lct->table_size << 2;
2912 kfree(pHba->lct);
2913 pHba->lct = NULL;
2915 } while (pHba->lct == NULL);
2917 PDEBUG("%s: Hardware resource table read.\n", pHba->name);
2920 // I2O_DPT_EXEC_IOP_BUFFERS_GROUP_NO;
2921 if(adpt_i2o_query_scalar(pHba, 0 , 0x8000, -1, buf, sizeof(buf))>=0) {
2922 pHba->FwDebugBufferSize = buf[1];
2923 pHba->FwDebugBuffer_P = pHba->base_addr_virt + buf[0];
2924 pHba->FwDebugFlags_P = pHba->FwDebugBuffer_P + FW_DEBUG_FLAGS_OFFSET;
2925 pHba->FwDebugBLEDvalue_P = pHba->FwDebugBuffer_P + FW_DEBUG_BLED_OFFSET;
2926 pHba->FwDebugBLEDflag_P = pHba->FwDebugBLEDvalue_P + 1;
2927 pHba->FwDebugStrLength_P = pHba->FwDebugBuffer_P + FW_DEBUG_STR_LENGTH_OFFSET;
2928 pHba->FwDebugBuffer_P += buf[2];
2929 pHba->FwDebugFlags = 0;
2932 return 0;
2935 static int adpt_i2o_build_sys_table(void)
2937 adpt_hba* pHba = NULL;
2938 int count = 0;
2940 sys_tbl_len = sizeof(struct i2o_sys_tbl) + // Header + IOPs
2941 (hba_count) * sizeof(struct i2o_sys_tbl_entry);
2943 kfree(sys_tbl);
2945 sys_tbl = kmalloc(sys_tbl_len, GFP_KERNEL|ADDR32);
2946 if(!sys_tbl) {
2947 printk(KERN_WARNING "SysTab Set failed. Out of memory.\n");
2948 return -ENOMEM;
2950 memset(sys_tbl, 0, sys_tbl_len);
2952 sys_tbl->num_entries = hba_count;
2953 sys_tbl->version = I2OVERSION;
2954 sys_tbl->change_ind = sys_tbl_ind++;
2956 for(pHba = hba_chain; pHba; pHba = pHba->next) {
2957 // Get updated Status Block so we have the latest information
2958 if (adpt_i2o_status_get(pHba)) {
2959 sys_tbl->num_entries--;
2960 continue; // try next one
2963 sys_tbl->iops[count].org_id = pHba->status_block->org_id;
2964 sys_tbl->iops[count].iop_id = pHba->unit + 2;
2965 sys_tbl->iops[count].seg_num = 0;
2966 sys_tbl->iops[count].i2o_version = pHba->status_block->i2o_version;
2967 sys_tbl->iops[count].iop_state = pHba->status_block->iop_state;
2968 sys_tbl->iops[count].msg_type = pHba->status_block->msg_type;
2969 sys_tbl->iops[count].frame_size = pHba->status_block->inbound_frame_size;
2970 sys_tbl->iops[count].last_changed = sys_tbl_ind - 1; // ??
2971 sys_tbl->iops[count].iop_capabilities = pHba->status_block->iop_capabilities;
2972 sys_tbl->iops[count].inbound_low = (u32)virt_to_bus(pHba->post_port);
2973 sys_tbl->iops[count].inbound_high = (u32)((u64)virt_to_bus(pHba->post_port)>>32);
2975 count++;
2978 #ifdef DEBUG
2980 u32 *table = (u32*)sys_tbl;
2981 printk(KERN_DEBUG"sys_tbl_len=%d in 32bit words\n",(sys_tbl_len >>2));
2982 for(count = 0; count < (sys_tbl_len >>2); count++) {
2983 printk(KERN_INFO "sys_tbl[%d] = %0#10x\n",
2984 count, table[count]);
2987 #endif
2989 return 0;
2994 * Dump the information block associated with a given unit (TID)
2997 static void adpt_i2o_report_hba_unit(adpt_hba* pHba, struct i2o_device *d)
2999 char buf[64];
3000 int unit = d->lct_data.tid;
3002 printk(KERN_INFO "TID %3.3d ", unit);
3004 if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 3, buf, 16)>=0)
3006 buf[16]=0;
3007 printk(" Vendor: %-12.12s", buf);
3009 if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 4, buf, 16)>=0)
3011 buf[16]=0;
3012 printk(" Device: %-12.12s", buf);
3014 if(adpt_i2o_query_scalar(pHba, unit, 0xF100, 6, buf, 8)>=0)
3016 buf[8]=0;
3017 printk(" Rev: %-12.12s\n", buf);
3019 #ifdef DEBUG
3020 printk(KERN_INFO "\tClass: %.21s\n", adpt_i2o_get_class_name(d->lct_data.class_id));
3021 printk(KERN_INFO "\tSubclass: 0x%04X\n", d->lct_data.sub_class);
3022 printk(KERN_INFO "\tFlags: ");
3024 if(d->lct_data.device_flags&(1<<0))
3025 printk("C"); // ConfigDialog requested
3026 if(d->lct_data.device_flags&(1<<1))
3027 printk("U"); // Multi-user capable
3028 if(!(d->lct_data.device_flags&(1<<4)))
3029 printk("P"); // Peer service enabled!
3030 if(!(d->lct_data.device_flags&(1<<5)))
3031 printk("M"); // Mgmt service enabled!
3032 printk("\n");
3033 #endif
3036 #ifdef DEBUG
3038 * Do i2o class name lookup
3040 static const char *adpt_i2o_get_class_name(int class)
3042 int idx = 16;
3043 static char *i2o_class_name[] = {
3044 "Executive",
3045 "Device Driver Module",
3046 "Block Device",
3047 "Tape Device",
3048 "LAN Interface",
3049 "WAN Interface",
3050 "Fibre Channel Port",
3051 "Fibre Channel Device",
3052 "SCSI Device",
3053 "ATE Port",
3054 "ATE Device",
3055 "Floppy Controller",
3056 "Floppy Device",
3057 "Secondary Bus Port",
3058 "Peer Transport Agent",
3059 "Peer Transport",
3060 "Unknown"
3063 switch(class&0xFFF) {
3064 case I2O_CLASS_EXECUTIVE:
3065 idx = 0; break;
3066 case I2O_CLASS_DDM:
3067 idx = 1; break;
3068 case I2O_CLASS_RANDOM_BLOCK_STORAGE:
3069 idx = 2; break;
3070 case I2O_CLASS_SEQUENTIAL_STORAGE:
3071 idx = 3; break;
3072 case I2O_CLASS_LAN:
3073 idx = 4; break;
3074 case I2O_CLASS_WAN:
3075 idx = 5; break;
3076 case I2O_CLASS_FIBRE_CHANNEL_PORT:
3077 idx = 6; break;
3078 case I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL:
3079 idx = 7; break;
3080 case I2O_CLASS_SCSI_PERIPHERAL:
3081 idx = 8; break;
3082 case I2O_CLASS_ATE_PORT:
3083 idx = 9; break;
3084 case I2O_CLASS_ATE_PERIPHERAL:
3085 idx = 10; break;
3086 case I2O_CLASS_FLOPPY_CONTROLLER:
3087 idx = 11; break;
3088 case I2O_CLASS_FLOPPY_DEVICE:
3089 idx = 12; break;
3090 case I2O_CLASS_BUS_ADAPTER_PORT:
3091 idx = 13; break;
3092 case I2O_CLASS_PEER_TRANSPORT_AGENT:
3093 idx = 14; break;
3094 case I2O_CLASS_PEER_TRANSPORT:
3095 idx = 15; break;
3097 return i2o_class_name[idx];
3099 #endif
3102 static s32 adpt_i2o_hrt_get(adpt_hba* pHba)
3104 u32 msg[6];
3105 int ret, size = sizeof(i2o_hrt);
3107 do {
3108 if (pHba->hrt == NULL) {
3109 pHba->hrt=kmalloc(size, GFP_KERNEL|ADDR32);
3110 if (pHba->hrt == NULL) {
3111 printk(KERN_CRIT "%s: Hrt Get failed; Out of memory.\n", pHba->name);
3112 return -ENOMEM;
3116 msg[0]= SIX_WORD_MSG_SIZE| SGL_OFFSET_4;
3117 msg[1]= I2O_CMD_HRT_GET<<24 | HOST_TID<<12 | ADAPTER_TID;
3118 msg[2]= 0;
3119 msg[3]= 0;
3120 msg[4]= (0xD0000000 | size); /* Simple transaction */
3121 msg[5]= virt_to_bus(pHba->hrt); /* Dump it here */
3123 if ((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg),20))) {
3124 printk(KERN_ERR "%s: Unable to get HRT (status=%#10x)\n", pHba->name, ret);
3125 return ret;
3128 if (pHba->hrt->num_entries * pHba->hrt->entry_len << 2 > size) {
3129 size = pHba->hrt->num_entries * pHba->hrt->entry_len << 2;
3130 kfree(pHba->hrt);
3131 pHba->hrt = NULL;
3133 } while(pHba->hrt == NULL);
3134 return 0;
3138 * Query one scalar group value or a whole scalar group.
3140 static int adpt_i2o_query_scalar(adpt_hba* pHba, int tid,
3141 int group, int field, void *buf, int buflen)
3143 u16 opblk[] = { 1, 0, I2O_PARAMS_FIELD_GET, group, 1, field };
3144 u8 *resblk;
3146 int size;
3148 /* 8 bytes for header */
3149 resblk = kmalloc(sizeof(u8) * (8+buflen), GFP_KERNEL|ADDR32);
3150 if (resblk == NULL) {
3151 printk(KERN_CRIT "%s: query scalar failed; Out of memory.\n", pHba->name);
3152 return -ENOMEM;
3155 if (field == -1) /* whole group */
3156 opblk[4] = -1;
3158 size = adpt_i2o_issue_params(I2O_CMD_UTIL_PARAMS_GET, pHba, tid,
3159 opblk, sizeof(opblk), resblk, sizeof(u8)*(8+buflen));
3160 if (size == -ETIME) {
3161 printk(KERN_WARNING "%s: issue params failed; Timed out.\n", pHba->name);
3162 return -ETIME;
3163 } else if (size == -EINTR) {
3164 printk(KERN_WARNING "%s: issue params failed; Interrupted.\n", pHba->name);
3165 return -EINTR;
3168 memcpy(buf, resblk+8, buflen); /* cut off header */
3170 kfree(resblk);
3171 if (size < 0)
3172 return size;
3174 return buflen;
3178 /* Issue UTIL_PARAMS_GET or UTIL_PARAMS_SET
3180 * This function can be used for all UtilParamsGet/Set operations.
3181 * The OperationBlock is given in opblk-buffer,
3182 * and results are returned in resblk-buffer.
3183 * Note that the minimum sized resblk is 8 bytes and contains
3184 * ResultCount, ErrorInfoSize, BlockStatus and BlockSize.
3186 static int adpt_i2o_issue_params(int cmd, adpt_hba* pHba, int tid,
3187 void *opblk, int oplen, void *resblk, int reslen)
3189 u32 msg[9];
3190 u32 *res = (u32 *)resblk;
3191 int wait_status;
3193 msg[0] = NINE_WORD_MSG_SIZE | SGL_OFFSET_5;
3194 msg[1] = cmd << 24 | HOST_TID << 12 | tid;
3195 msg[2] = 0;
3196 msg[3] = 0;
3197 msg[4] = 0;
3198 msg[5] = 0x54000000 | oplen; /* OperationBlock */
3199 msg[6] = virt_to_bus(opblk);
3200 msg[7] = 0xD0000000 | reslen; /* ResultBlock */
3201 msg[8] = virt_to_bus(resblk);
3203 if ((wait_status = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 20))) {
3204 printk("adpt_i2o_issue_params: post_wait failed (%p)\n", resblk);
3205 return wait_status; /* -DetailedStatus */
3208 if (res[1]&0x00FF0000) { /* BlockStatus != SUCCESS */
3209 printk(KERN_WARNING "%s: %s - Error:\n ErrorInfoSize = 0x%02x, "
3210 "BlockStatus = 0x%02x, BlockSize = 0x%04x\n",
3211 pHba->name,
3212 (cmd == I2O_CMD_UTIL_PARAMS_SET) ? "PARAMS_SET"
3213 : "PARAMS_GET",
3214 res[1]>>24, (res[1]>>16)&0xFF, res[1]&0xFFFF);
3215 return -((res[1] >> 16) & 0xFF); /* -BlockStatus */
3218 return 4 + ((res[1] & 0x0000FFFF) << 2); /* bytes used in resblk */
3222 static s32 adpt_i2o_quiesce_hba(adpt_hba* pHba)
3224 u32 msg[4];
3225 int ret;
3227 adpt_i2o_status_get(pHba);
3229 /* SysQuiesce discarded if IOP not in READY or OPERATIONAL state */
3231 if((pHba->status_block->iop_state != ADAPTER_STATE_READY) &&
3232 (pHba->status_block->iop_state != ADAPTER_STATE_OPERATIONAL)){
3233 return 0;
3236 msg[0] = FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
3237 msg[1] = I2O_CMD_SYS_QUIESCE<<24|HOST_TID<<12|ADAPTER_TID;
3238 msg[2] = 0;
3239 msg[3] = 0;
3241 if((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 240))) {
3242 printk(KERN_INFO"dpti%d: Unable to quiesce (status=%#x).\n",
3243 pHba->unit, -ret);
3244 } else {
3245 printk(KERN_INFO"dpti%d: Quiesced.\n",pHba->unit);
3248 adpt_i2o_status_get(pHba);
3249 return ret;
3254 * Enable IOP. Allows the IOP to resume external operations.
3256 static int adpt_i2o_enable_hba(adpt_hba* pHba)
3258 u32 msg[4];
3259 int ret;
3261 adpt_i2o_status_get(pHba);
3262 if(!pHba->status_block){
3263 return -ENOMEM;
3265 /* Enable only allowed on READY state */
3266 if(pHba->status_block->iop_state == ADAPTER_STATE_OPERATIONAL)
3267 return 0;
3269 if(pHba->status_block->iop_state != ADAPTER_STATE_READY)
3270 return -EINVAL;
3272 msg[0]=FOUR_WORD_MSG_SIZE|SGL_OFFSET_0;
3273 msg[1]=I2O_CMD_SYS_ENABLE<<24|HOST_TID<<12|ADAPTER_TID;
3274 msg[2]= 0;
3275 msg[3]= 0;
3277 if ((ret = adpt_i2o_post_wait(pHba, msg, sizeof(msg), 240))) {
3278 printk(KERN_WARNING"%s: Could not enable (status=%#10x).\n",
3279 pHba->name, ret);
3280 } else {
3281 PDEBUG("%s: Enabled.\n", pHba->name);
3284 adpt_i2o_status_get(pHba);
3285 return ret;
3289 static int adpt_i2o_systab_send(adpt_hba* pHba)
3291 u32 msg[12];
3292 int ret;
3294 msg[0] = I2O_MESSAGE_SIZE(12) | SGL_OFFSET_6;
3295 msg[1] = I2O_CMD_SYS_TAB_SET<<24 | HOST_TID<<12 | ADAPTER_TID;
3296 msg[2] = 0;
3297 msg[3] = 0;
3298 msg[4] = (0<<16) | ((pHba->unit+2) << 12); /* Host 0 IOP ID (unit + 2) */
3299 msg[5] = 0; /* Segment 0 */
3302 * Provide three SGL-elements:
3303 * System table (SysTab), Private memory space declaration and
3304 * Private i/o space declaration
3306 msg[6] = 0x54000000 | sys_tbl_len;
3307 msg[7] = virt_to_phys(sys_tbl);
3308 msg[8] = 0x54000000 | 0;
3309 msg[9] = 0;
3310 msg[10] = 0xD4000000 | 0;
3311 msg[11] = 0;
3313 if ((ret=adpt_i2o_post_wait(pHba, msg, sizeof(msg), 120))) {
3314 printk(KERN_INFO "%s: Unable to set SysTab (status=%#10x).\n",
3315 pHba->name, ret);
3317 #ifdef DEBUG
3318 else {
3319 PINFO("%s: SysTab set.\n", pHba->name);
3321 #endif
3323 return ret;
3327 /*============================================================================
3329 *============================================================================
3333 #ifdef UARTDELAY
3335 static static void adpt_delay(int millisec)
3337 int i;
3338 for (i = 0; i < millisec; i++) {
3339 udelay(1000); /* delay for one millisecond */
3343 #endif
3345 static struct scsi_host_template driver_template = {
3346 .name = "dpt_i2o",
3347 .proc_name = "dpt_i2o",
3348 .proc_info = adpt_proc_info,
3349 .detect = adpt_detect,
3350 .release = adpt_release,
3351 .info = adpt_info,
3352 .queuecommand = adpt_queue,
3353 .eh_abort_handler = adpt_abort,
3354 .eh_device_reset_handler = adpt_device_reset,
3355 .eh_bus_reset_handler = adpt_bus_reset,
3356 .eh_host_reset_handler = adpt_reset,
3357 .bios_param = adpt_bios_param,
3358 .slave_configure = adpt_slave_configure,
3359 .can_queue = MAX_TO_IOP_MESSAGES,
3360 .this_id = 7,
3361 .cmd_per_lun = 1,
3362 .use_clustering = ENABLE_CLUSTERING,
3364 #include "scsi_module.c"
3365 MODULE_LICENSE("GPL");