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