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