diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-29 20:22:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-29 20:22:03 -0400 |
commit | a6ce22a5f61ba838b43763bf1e5be399f9dee4d0 (patch) | |
tree | 2abed83e85724bd45c5b0b842b9ce36d1c4ca160 /drivers/message/fusion/mptfc.c | |
parent | 4e950f6f0189f65f8bf069cf2272649ef418f5e4 (diff) | |
parent | 09120a8cd38dbdb0c9a59ff8456cf88b510e6baa (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: (28 commits)
[SCSI] mpt fusion: Changes in mptctl.c for logging support
[SCSI] mpt fusion: Changes in mptfc.c mptlan.c mptsas.c and mptspi.c for logging support
[SCSI] mpt fusion: Changes in mptscsih.c for logging support
[SCSI] mpt fusion: Changes in mptbase.c for logging support
[SCSI] mpt fusion: logging support in Kconfig, Makefile, mptbase.h and addition of mptdebug.h
[SCSI] libsas: Fix potential NULL dereference in sas_smp_get_phy_events()
[SCSI] bsg: Fix build for CONFIG_BLOCK=n
[SCSI] aacraid: fix Sunrise Lake reset handling
[SCSI] aacraid: add SCSI SYNCHONIZE_CACHE range checking
[SCSI] add easyRAID to the no report luns blacklist
[SCSI] advansys: lindent and other large, uninteresting changes
[SCSI] aic79xx, aic7xxx: Fix incorrect width setting
[SCSI] qla2xxx: fix to honor ignored parameters in sysfs attributes
[SCSI] aacraid: draw line in sand, sundry cleanup and version update
[SCSI] iscsi_tcp: Turn off bounce buffers
[SCSI] libiscsi: fix cmd seqeunce number checking
[SCSI] iscsi_tcp, ib_iser Enable module refcounting for iscsi host template
[SCSI] libiscsi: make sure session is not blocked when removing host
[SCSI] libsas: Remove PCI dependencies
[SCSI] simscsi: convert to use the data buffer accessors
...
Diffstat (limited to 'drivers/message/fusion/mptfc.c')
-rw-r--r-- | drivers/message/fusion/mptfc.c | 108 |
1 files changed, 47 insertions, 61 deletions
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c index f2ebaa9992fe..8422c25e4a3e 100644 --- a/drivers/message/fusion/mptfc.c +++ b/drivers/message/fusion/mptfc.c | |||
@@ -188,16 +188,18 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt, | |||
188 | int (*func)(struct scsi_cmnd *SCpnt), | 188 | int (*func)(struct scsi_cmnd *SCpnt), |
189 | const char *caller) | 189 | const char *caller) |
190 | { | 190 | { |
191 | MPT_SCSI_HOST *hd; | ||
191 | struct scsi_device *sdev = SCpnt->device; | 192 | struct scsi_device *sdev = SCpnt->device; |
192 | struct Scsi_Host *shost = sdev->host; | 193 | struct Scsi_Host *shost = sdev->host; |
193 | struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); | 194 | struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); |
194 | unsigned long flags; | 195 | unsigned long flags; |
195 | int ready; | 196 | int ready; |
196 | 197 | ||
198 | hd = (MPT_SCSI_HOST *) SCpnt->device->host->hostdata; | ||
197 | spin_lock_irqsave(shost->host_lock, flags); | 199 | spin_lock_irqsave(shost->host_lock, flags); |
198 | while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) { | 200 | while ((ready = fc_remote_port_chkready(rport) >> 16) == DID_IMM_RETRY) { |
199 | spin_unlock_irqrestore(shost->host_lock, flags); | 201 | spin_unlock_irqrestore(shost->host_lock, flags); |
200 | dfcprintk ((MYIOC_s_INFO_FMT | 202 | dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT |
201 | "mptfc_block_error_handler.%d: %d:%d, port status is " | 203 | "mptfc_block_error_handler.%d: %d:%d, port status is " |
202 | "DID_IMM_RETRY, deferring %s recovery.\n", | 204 | "DID_IMM_RETRY, deferring %s recovery.\n", |
203 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, | 205 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, |
@@ -209,7 +211,7 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt, | |||
209 | spin_unlock_irqrestore(shost->host_lock, flags); | 211 | spin_unlock_irqrestore(shost->host_lock, flags); |
210 | 212 | ||
211 | if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) { | 213 | if (ready == DID_NO_CONNECT || !SCpnt->device->hostdata) { |
212 | dfcprintk ((MYIOC_s_INFO_FMT | 214 | dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT |
213 | "%s.%d: %d:%d, failing recovery, " | 215 | "%s.%d: %d:%d, failing recovery, " |
214 | "port state %d, vdev %p.\n", caller, | 216 | "port state %d, vdev %p.\n", caller, |
215 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, | 217 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, |
@@ -218,7 +220,7 @@ mptfc_block_error_handler(struct scsi_cmnd *SCpnt, | |||
218 | SCpnt->device->hostdata)); | 220 | SCpnt->device->hostdata)); |
219 | return FAILED; | 221 | return FAILED; |
220 | } | 222 | } |
221 | dfcprintk ((MYIOC_s_INFO_FMT | 223 | dfcprintk (hd->ioc, printk(MYIOC_s_DEBUG_FMT |
222 | "%s.%d: %d:%d, executing recovery.\n", caller, | 224 | "%s.%d: %d:%d, executing recovery.\n", caller, |
223 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, | 225 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->name, |
224 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, | 226 | ((MPT_SCSI_HOST *) shost->hostdata)->ioc->sh->host_no, |
@@ -483,7 +485,7 @@ mptfc_register_dev(MPT_ADAPTER *ioc, int channel, FCDevicePage0_t *pg0) | |||
483 | 485 | ||
484 | pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; | 486 | pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; |
485 | nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; | 487 | nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; |
486 | dfcprintk ((MYIOC_s_INFO_FMT | 488 | dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT |
487 | "mptfc_reg_dev.%d: %x, %llx / %llx, tid %d, " | 489 | "mptfc_reg_dev.%d: %x, %llx / %llx, tid %d, " |
488 | "rport tid %d, tmo %d\n", | 490 | "rport tid %d, tmo %d\n", |
489 | ioc->name, | 491 | ioc->name, |
@@ -559,6 +561,35 @@ mptfc_target_alloc(struct scsi_target *starget) | |||
559 | 561 | ||
560 | return rc; | 562 | return rc; |
561 | } | 563 | } |
564 | /* | ||
565 | * mptfc_dump_lun_info | ||
566 | * @ioc | ||
567 | * @rport | ||
568 | * @sdev | ||
569 | * | ||
570 | */ | ||
571 | static void | ||
572 | mptfc_dump_lun_info(MPT_ADAPTER *ioc, struct fc_rport *rport, struct scsi_device *sdev, | ||
573 | VirtTarget *vtarget) | ||
574 | { | ||
575 | u64 nn, pn; | ||
576 | struct mptfc_rport_info *ri; | ||
577 | |||
578 | ri = *((struct mptfc_rport_info **)rport->dd_data); | ||
579 | pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; | ||
580 | nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; | ||
581 | dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT | ||
582 | "mptfc_slv_alloc.%d: num_luns %d, sdev.id %d, " | ||
583 | "CurrentTargetID %d, %x %llx %llx\n", | ||
584 | ioc->name, | ||
585 | sdev->host->host_no, | ||
586 | vtarget->num_luns, | ||
587 | sdev->id, ri->pg0.CurrentTargetID, | ||
588 | ri->pg0.PortIdentifier, | ||
589 | (unsigned long long)pn, | ||
590 | (unsigned long long)nn)); | ||
591 | } | ||
592 | |||
562 | 593 | ||
563 | /* | 594 | /* |
564 | * OS entry point to allow host driver to alloc memory | 595 | * OS entry point to allow host driver to alloc memory |
@@ -606,25 +637,7 @@ mptfc_slave_alloc(struct scsi_device *sdev) | |||
606 | vtarget->num_luns++; | 637 | vtarget->num_luns++; |
607 | 638 | ||
608 | 639 | ||
609 | #ifdef DMPT_DEBUG_FC | 640 | mptfc_dump_lun_info(hd->ioc, rport, sdev, vtarget); |
610 | { | ||
611 | u64 nn, pn; | ||
612 | struct mptfc_rport_info *ri; | ||
613 | ri = *((struct mptfc_rport_info **)rport->dd_data); | ||
614 | pn = (u64)ri->pg0.WWPN.High << 32 | (u64)ri->pg0.WWPN.Low; | ||
615 | nn = (u64)ri->pg0.WWNN.High << 32 | (u64)ri->pg0.WWNN.Low; | ||
616 | dfcprintk ((MYIOC_s_INFO_FMT | ||
617 | "mptfc_slv_alloc.%d: num_luns %d, sdev.id %d, " | ||
618 | "CurrentTargetID %d, %x %llx %llx\n", | ||
619 | hd->ioc->name, | ||
620 | sdev->host->host_no, | ||
621 | vtarget->num_luns, | ||
622 | sdev->id, ri->pg0.CurrentTargetID, | ||
623 | ri->pg0.PortIdentifier, | ||
624 | (unsigned long long)pn, | ||
625 | (unsigned long long)nn)); | ||
626 | } | ||
627 | #endif | ||
628 | 641 | ||
629 | return 0; | 642 | return 0; |
630 | } | 643 | } |
@@ -653,27 +666,12 @@ mptfc_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)) | |||
653 | /* dd_data is null until finished adding target */ | 666 | /* dd_data is null until finished adding target */ |
654 | ri = *((struct mptfc_rport_info **)rport->dd_data); | 667 | ri = *((struct mptfc_rport_info **)rport->dd_data); |
655 | if (unlikely(!ri)) { | 668 | if (unlikely(!ri)) { |
656 | dfcprintk ((MYIOC_s_INFO_FMT | ||
657 | "mptfc_qcmd.%d: %d:%d, dd_data is null.\n", | ||
658 | ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name, | ||
659 | ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no, | ||
660 | SCpnt->device->id,SCpnt->device->lun)); | ||
661 | SCpnt->result = DID_IMM_RETRY << 16; | 669 | SCpnt->result = DID_IMM_RETRY << 16; |
662 | done(SCpnt); | 670 | done(SCpnt); |
663 | return 0; | 671 | return 0; |
664 | } | 672 | } |
665 | 673 | ||
666 | err = mptscsih_qcmd(SCpnt,done); | 674 | return mptscsih_qcmd(SCpnt,done); |
667 | #ifdef DMPT_DEBUG_FC | ||
668 | if (unlikely(err)) { | ||
669 | dfcprintk ((MYIOC_s_INFO_FMT | ||
670 | "mptfc_qcmd.%d: %d:%d, mptscsih_qcmd returns non-zero, (%x).\n", | ||
671 | ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->name, | ||
672 | ((MPT_SCSI_HOST *) SCpnt->device->host->hostdata)->ioc->sh->host_no, | ||
673 | SCpnt->device->id,SCpnt->device->lun,err)); | ||
674 | } | ||
675 | #endif | ||
676 | return err; | ||
677 | } | 675 | } |
678 | 676 | ||
679 | /* | 677 | /* |
@@ -1041,7 +1039,7 @@ mptfc_setup_reset(struct work_struct *work) | |||
1041 | 1039 | ||
1042 | pn = (u64)ri->pg0.WWPN.High << 32 | | 1040 | pn = (u64)ri->pg0.WWPN.High << 32 | |
1043 | (u64)ri->pg0.WWPN.Low; | 1041 | (u64)ri->pg0.WWPN.Low; |
1044 | dfcprintk ((MYIOC_s_INFO_FMT | 1042 | dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT |
1045 | "mptfc_setup_reset.%d: %llx deleted\n", | 1043 | "mptfc_setup_reset.%d: %llx deleted\n", |
1046 | ioc->name, | 1044 | ioc->name, |
1047 | ioc->sh->host_no, | 1045 | ioc->sh->host_no, |
@@ -1088,7 +1086,7 @@ mptfc_rescan_devices(struct work_struct *work) | |||
1088 | 1086 | ||
1089 | pn = (u64)ri->pg0.WWPN.High << 32 | | 1087 | pn = (u64)ri->pg0.WWPN.High << 32 | |
1090 | (u64)ri->pg0.WWPN.Low; | 1088 | (u64)ri->pg0.WWPN.Low; |
1091 | dfcprintk ((MYIOC_s_INFO_FMT | 1089 | dfcprintk (ioc, printk(MYIOC_s_DEBUG_FMT |
1092 | "mptfc_rescan.%d: %llx deleted\n", | 1090 | "mptfc_rescan.%d: %llx deleted\n", |
1093 | ioc->name, | 1091 | ioc->name, |
1094 | ioc->sh->host_no, | 1092 | ioc->sh->host_no, |
@@ -1212,7 +1210,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1212 | 1210 | ||
1213 | if (numSGE < sh->sg_tablesize) { | 1211 | if (numSGE < sh->sg_tablesize) { |
1214 | /* Reset this value */ | 1212 | /* Reset this value */ |
1215 | dprintk((MYIOC_s_INFO_FMT | 1213 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT |
1216 | "Resetting sg_tablesize to %d from %d\n", | 1214 | "Resetting sg_tablesize to %d from %d\n", |
1217 | ioc->name, numSGE, sh->sg_tablesize)); | 1215 | ioc->name, numSGE, sh->sg_tablesize)); |
1218 | sh->sg_tablesize = numSGE; | 1216 | sh->sg_tablesize = numSGE; |
@@ -1232,7 +1230,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1232 | goto out_mptfc_probe; | 1230 | goto out_mptfc_probe; |
1233 | } | 1231 | } |
1234 | 1232 | ||
1235 | dprintk((MYIOC_s_INFO_FMT "ScsiLookup @ %p\n", | 1233 | dprintk(ioc, printk(MYIOC_s_DEBUG_FMT "ScsiLookup @ %p\n", |
1236 | ioc->name, hd->ScsiLookup)); | 1234 | ioc->name, hd->ScsiLookup)); |
1237 | 1235 | ||
1238 | /* Clear the TM flags | 1236 | /* Clear the TM flags |
@@ -1264,7 +1262,7 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1264 | sh->transportt = mptfc_transport_template; | 1262 | sh->transportt = mptfc_transport_template; |
1265 | error = scsi_add_host (sh, &ioc->pcidev->dev); | 1263 | error = scsi_add_host (sh, &ioc->pcidev->dev); |
1266 | if(error) { | 1264 | if(error) { |
1267 | dprintk((KERN_ERR MYNAM | 1265 | dprintk(ioc, printk(KERN_ERR MYNAM |
1268 | "scsi_add_host failed\n")); | 1266 | "scsi_add_host failed\n")); |
1269 | goto out_mptfc_probe; | 1267 | goto out_mptfc_probe; |
1270 | } | 1268 | } |
@@ -1323,7 +1321,7 @@ mptfc_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) | |||
1323 | unsigned long flags; | 1321 | unsigned long flags; |
1324 | int rc=1; | 1322 | int rc=1; |
1325 | 1323 | ||
1326 | devtverboseprintk((MYIOC_s_INFO_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n", | 1324 | devtverboseprintk(ioc, printk(MYIOC_s_DEBUG_FMT "MPT event (=%02Xh) routed to SCSI host driver!\n", |
1327 | ioc->name, event)); | 1325 | ioc->name, event)); |
1328 | 1326 | ||
1329 | if (ioc->sh == NULL || | 1327 | if (ioc->sh == NULL || |
@@ -1357,8 +1355,8 @@ mptfc_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) | |||
1357 | return rc; | 1355 | return rc; |
1358 | 1356 | ||
1359 | 1357 | ||
1360 | dtmprintk((KERN_WARNING MYNAM | 1358 | dtmprintk(ioc, printk(MYIOC_s_DEBUG_FMT |
1361 | ": IOC %s_reset routed to FC host driver!\n", | 1359 | ": IOC %s_reset routed to FC host driver!\n",ioc->name, |
1362 | reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( | 1360 | reset_phase==MPT_IOC_SETUP_RESET ? "setup" : ( |
1363 | reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); | 1361 | reset_phase==MPT_IOC_PRE_RESET ? "pre" : "post"))); |
1364 | 1362 | ||
@@ -1413,15 +1411,8 @@ mptfc_init(void) | |||
1413 | mptfcTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTFC_DRIVER); | 1411 | mptfcTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTFC_DRIVER); |
1414 | mptfcInternalCtx = mpt_register(mptscsih_scandv_complete, MPTFC_DRIVER); | 1412 | mptfcInternalCtx = mpt_register(mptscsih_scandv_complete, MPTFC_DRIVER); |
1415 | 1413 | ||
1416 | if (mpt_event_register(mptfcDoneCtx, mptfc_event_process) == 0) { | 1414 | mpt_event_register(mptfcDoneCtx, mptfc_event_process); |
1417 | devtverboseprintk((KERN_INFO MYNAM | 1415 | mpt_reset_register(mptfcDoneCtx, mptfc_ioc_reset); |
1418 | ": Registered for IOC event notifications\n")); | ||
1419 | } | ||
1420 | |||
1421 | if (mpt_reset_register(mptfcDoneCtx, mptfc_ioc_reset) == 0) { | ||
1422 | dprintk((KERN_INFO MYNAM | ||
1423 | ": Registered for IOC reset notifications\n")); | ||
1424 | } | ||
1425 | 1416 | ||
1426 | error = pci_register_driver(&mptfc_driver); | 1417 | error = pci_register_driver(&mptfc_driver); |
1427 | if (error) | 1418 | if (error) |
@@ -1486,12 +1477,7 @@ mptfc_exit(void) | |||
1486 | fc_release_transport(mptfc_transport_template); | 1477 | fc_release_transport(mptfc_transport_template); |
1487 | 1478 | ||
1488 | mpt_reset_deregister(mptfcDoneCtx); | 1479 | mpt_reset_deregister(mptfcDoneCtx); |
1489 | dprintk((KERN_INFO MYNAM | ||
1490 | ": Deregistered for IOC reset notifications\n")); | ||
1491 | |||
1492 | mpt_event_deregister(mptfcDoneCtx); | 1480 | mpt_event_deregister(mptfcDoneCtx); |
1493 | dprintk((KERN_INFO MYNAM | ||
1494 | ": Deregistered for IOC event notifications\n")); | ||
1495 | 1481 | ||
1496 | mpt_deregister(mptfcInternalCtx); | 1482 | mpt_deregister(mptfcInternalCtx); |
1497 | mpt_deregister(mptfcTaskCtx); | 1483 | mpt_deregister(mptfcTaskCtx); |