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