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