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