diff options
author | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-05 19:09:46 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-05 19:09:46 -0500 |
commit | ec0bf39a471bf6fcd01def2bd677128cea940b73 (patch) | |
tree | 0d98b304d97605613a14329b40ed8cbb88296528 /drivers/scsi/qla4xxx/ql4_os.c | |
parent | bf83c2a315637dee8a8b5c2221ce5030cc38c6db (diff) | |
parent | d32adcb85c74fd81963714689842993e7014515f (diff) |
Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6: (73 commits)
[SCSI] aic79xx: Add ASC-29320LPE ids to driver
[SCSI] stex: version update
[SCSI] stex: change wait loop code
[SCSI] stex: add new device type support
[SCSI] stex: update device id info
[SCSI] stex: adjust default queue length
[SCSI] stex: add value check in hard reset routine
[SCSI] stex: fix controller_info command handling
[SCSI] stex: fix biosparam calculation
[SCSI] megaraid: fix MMIO casts
[SCSI] tgt: fix undefined flush_dcache_page() problem
[SCSI] libsas: better error handling in sas_expander.c
[SCSI] lpfc 8.1.11 : Change version number to 8.1.11
[SCSI] lpfc 8.1.11 : Misc Fixes
[SCSI] lpfc 8.1.11 : Add soft_wwnn sysfs attribute, rename soft_wwn_enable
[SCSI] lpfc 8.1.11 : Removed decoding of PCI Subsystem Id
[SCSI] lpfc 8.1.11 : Add MSI (Message Signalled Interrupts) support
[SCSI] lpfc 8.1.11 : Adjust LOG_FCP logging
[SCSI] lpfc 8.1.11 : Fix Memory leaks
[SCSI] lpfc 8.1.11 : Fix lpfc_multi_ring_support
...
Diffstat (limited to 'drivers/scsi/qla4xxx/ql4_os.c')
-rw-r--r-- | drivers/scsi/qla4xxx/ql4_os.c | 117 |
1 files changed, 20 insertions, 97 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c index 5b8db6109536..db9d88e7bee7 100644 --- a/drivers/scsi/qla4xxx/ql4_os.c +++ b/drivers/scsi/qla4xxx/ql4_os.c | |||
@@ -708,10 +708,10 @@ static int qla4xxx_cmd_wait(struct scsi_qla_host *ha) | |||
708 | } | 708 | } |
709 | 709 | ||
710 | /** | 710 | /** |
711 | * qla4010_soft_reset - performs soft reset. | 711 | * qla4xxx_soft_reset - performs soft reset. |
712 | * @ha: Pointer to host adapter structure. | 712 | * @ha: Pointer to host adapter structure. |
713 | **/ | 713 | **/ |
714 | static int qla4010_soft_reset(struct scsi_qla_host *ha) | 714 | int qla4xxx_soft_reset(struct scsi_qla_host *ha) |
715 | { | 715 | { |
716 | uint32_t max_wait_time; | 716 | uint32_t max_wait_time; |
717 | unsigned long flags = 0; | 717 | unsigned long flags = 0; |
@@ -817,29 +817,6 @@ static int qla4010_soft_reset(struct scsi_qla_host *ha) | |||
817 | } | 817 | } |
818 | 818 | ||
819 | /** | 819 | /** |
820 | * qla4xxx_topcat_reset - performs hard reset of TopCat Chip. | ||
821 | * @ha: Pointer to host adapter structure. | ||
822 | **/ | ||
823 | static int qla4xxx_topcat_reset(struct scsi_qla_host *ha) | ||
824 | { | ||
825 | unsigned long flags; | ||
826 | |||
827 | ql4xxx_lock_nvram(ha); | ||
828 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
829 | writel(set_rmask(GPOR_TOPCAT_RESET), isp_gp_out(ha)); | ||
830 | readl(isp_gp_out(ha)); | ||
831 | mdelay(1); | ||
832 | |||
833 | writel(clr_rmask(GPOR_TOPCAT_RESET), isp_gp_out(ha)); | ||
834 | readl(isp_gp_out(ha)); | ||
835 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
836 | mdelay(2523); | ||
837 | |||
838 | ql4xxx_unlock_nvram(ha); | ||
839 | return QLA_SUCCESS; | ||
840 | } | ||
841 | |||
842 | /** | ||
843 | * qla4xxx_flush_active_srbs - returns all outstanding i/o requests to O.S. | 820 | * qla4xxx_flush_active_srbs - returns all outstanding i/o requests to O.S. |
844 | * @ha: Pointer to host adapter structure. | 821 | * @ha: Pointer to host adapter structure. |
845 | * | 822 | * |
@@ -867,26 +844,6 @@ static void qla4xxx_flush_active_srbs(struct scsi_qla_host *ha) | |||
867 | } | 844 | } |
868 | 845 | ||
869 | /** | 846 | /** |
870 | * qla4xxx_hard_reset - performs HBA Hard Reset | ||
871 | * @ha: Pointer to host adapter structure. | ||
872 | **/ | ||
873 | static int qla4xxx_hard_reset(struct scsi_qla_host *ha) | ||
874 | { | ||
875 | /* The QLA4010 really doesn't have an equivalent to a hard reset */ | ||
876 | qla4xxx_flush_active_srbs(ha); | ||
877 | if (test_bit(AF_TOPCAT_CHIP_PRESENT, &ha->flags)) { | ||
878 | int status = QLA_ERROR; | ||
879 | |||
880 | if ((qla4010_soft_reset(ha) == QLA_SUCCESS) && | ||
881 | (qla4xxx_topcat_reset(ha) == QLA_SUCCESS) && | ||
882 | (qla4010_soft_reset(ha) == QLA_SUCCESS)) | ||
883 | status = QLA_SUCCESS; | ||
884 | return status; | ||
885 | } else | ||
886 | return qla4010_soft_reset(ha); | ||
887 | } | ||
888 | |||
889 | /** | ||
890 | * qla4xxx_recover_adapter - recovers adapter after a fatal error | 847 | * qla4xxx_recover_adapter - recovers adapter after a fatal error |
891 | * @ha: Pointer to host adapter structure. | 848 | * @ha: Pointer to host adapter structure. |
892 | * @renew_ddb_list: Indicates what to do with the adapter's ddb list | 849 | * @renew_ddb_list: Indicates what to do with the adapter's ddb list |
@@ -919,18 +876,11 @@ static int qla4xxx_recover_adapter(struct scsi_qla_host *ha, | |||
919 | if (status == QLA_SUCCESS) { | 876 | if (status == QLA_SUCCESS) { |
920 | DEBUG2(printk("scsi%ld: %s - Performing soft reset..\n", | 877 | DEBUG2(printk("scsi%ld: %s - Performing soft reset..\n", |
921 | ha->host_no, __func__)); | 878 | ha->host_no, __func__)); |
922 | status = qla4xxx_soft_reset(ha); | 879 | qla4xxx_flush_active_srbs(ha); |
923 | } | 880 | if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) |
924 | /* FIXMEkaren: Do we want to keep interrupts enabled and process | 881 | status = qla4xxx_soft_reset(ha); |
925 | AENs after soft reset */ | 882 | else |
926 | 883 | status = QLA_ERROR; | |
927 | /* If firmware (SOFT) reset failed, or if all outstanding | ||
928 | * commands have not returned, then do a HARD reset. | ||
929 | */ | ||
930 | if (status == QLA_ERROR) { | ||
931 | DEBUG2(printk("scsi%ld: %s - Performing hard reset..\n", | ||
932 | ha->host_no, __func__)); | ||
933 | status = qla4xxx_hard_reset(ha); | ||
934 | } | 884 | } |
935 | 885 | ||
936 | /* Flush any pending ddb changed AENs */ | 886 | /* Flush any pending ddb changed AENs */ |
@@ -1016,13 +966,9 @@ static void qla4xxx_do_dpc(void *data) | |||
1016 | struct scsi_qla_host *ha = (struct scsi_qla_host *) data; | 966 | struct scsi_qla_host *ha = (struct scsi_qla_host *) data; |
1017 | struct ddb_entry *ddb_entry, *dtemp; | 967 | struct ddb_entry *ddb_entry, *dtemp; |
1018 | 968 | ||
1019 | DEBUG2(printk("scsi%ld: %s: DPC handler waking up.\n", | 969 | DEBUG2(printk("scsi%ld: %s: DPC handler waking up." |
1020 | ha->host_no, __func__)); | 970 | "flags = 0x%08lx, dpc_flags = 0x%08lx\n", |
1021 | 971 | ha->host_no, __func__, ha->flags, ha->dpc_flags)); | |
1022 | DEBUG2(printk("scsi%ld: %s: ha->flags = 0x%08lx\n", | ||
1023 | ha->host_no, __func__, ha->flags)); | ||
1024 | DEBUG2(printk("scsi%ld: %s: ha->dpc_flags = 0x%08lx\n", | ||
1025 | ha->host_no, __func__, ha->dpc_flags)); | ||
1026 | 972 | ||
1027 | /* Initialization not yet finished. Don't do anything yet. */ | 973 | /* Initialization not yet finished. Don't do anything yet. */ |
1028 | if (!test_bit(AF_INIT_DONE, &ha->flags)) | 974 | if (!test_bit(AF_INIT_DONE, &ha->flags)) |
@@ -1032,16 +978,8 @@ static void qla4xxx_do_dpc(void *data) | |||
1032 | test_bit(DPC_RESET_HA, &ha->dpc_flags) || | 978 | test_bit(DPC_RESET_HA, &ha->dpc_flags) || |
1033 | test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || | 979 | test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) || |
1034 | test_bit(DPC_RESET_HA_DESTROY_DDB_LIST, &ha->dpc_flags)) { | 980 | test_bit(DPC_RESET_HA_DESTROY_DDB_LIST, &ha->dpc_flags)) { |
1035 | if (test_bit(DPC_RESET_HA_DESTROY_DDB_LIST, &ha->dpc_flags)) | 981 | if (test_bit(DPC_RESET_HA_DESTROY_DDB_LIST, &ha->dpc_flags) || |
1036 | /* | 982 | test_bit(DPC_RESET_HA, &ha->dpc_flags)) |
1037 | * dg 09/23 Never initialize ddb list | ||
1038 | * once we up and running | ||
1039 | * qla4xxx_recover_adapter(ha, | ||
1040 | * REBUILD_DDB_LIST); | ||
1041 | */ | ||
1042 | qla4xxx_recover_adapter(ha, PRESERVE_DDB_LIST); | ||
1043 | |||
1044 | if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) | ||
1045 | qla4xxx_recover_adapter(ha, PRESERVE_DDB_LIST); | 983 | qla4xxx_recover_adapter(ha, PRESERVE_DDB_LIST); |
1046 | 984 | ||
1047 | if (test_and_clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { | 985 | if (test_and_clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) { |
@@ -1122,7 +1060,8 @@ static void qla4xxx_free_adapter(struct scsi_qla_host *ha) | |||
1122 | destroy_workqueue(ha->dpc_thread); | 1060 | destroy_workqueue(ha->dpc_thread); |
1123 | 1061 | ||
1124 | /* Issue Soft Reset to put firmware in unknown state */ | 1062 | /* Issue Soft Reset to put firmware in unknown state */ |
1125 | qla4xxx_soft_reset(ha); | 1063 | if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) |
1064 | qla4xxx_soft_reset(ha); | ||
1126 | 1065 | ||
1127 | /* Remove timer thread, if present */ | 1066 | /* Remove timer thread, if present */ |
1128 | if (ha->timer_active) | 1067 | if (ha->timer_active) |
@@ -1261,7 +1200,6 @@ static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev, | |||
1261 | init_waitqueue_head(&ha->mailbox_wait_queue); | 1200 | init_waitqueue_head(&ha->mailbox_wait_queue); |
1262 | 1201 | ||
1263 | spin_lock_init(&ha->hardware_lock); | 1202 | spin_lock_init(&ha->hardware_lock); |
1264 | spin_lock_init(&ha->list_lock); | ||
1265 | 1203 | ||
1266 | /* Allocate dma buffers */ | 1204 | /* Allocate dma buffers */ |
1267 | if (qla4xxx_mem_alloc(ha)) { | 1205 | if (qla4xxx_mem_alloc(ha)) { |
@@ -1468,27 +1406,6 @@ struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha, uint32_t in | |||
1468 | } | 1406 | } |
1469 | 1407 | ||
1470 | /** | 1408 | /** |
1471 | * qla4xxx_soft_reset - performs a SOFT RESET of hba. | ||
1472 | * @ha: Pointer to host adapter structure. | ||
1473 | **/ | ||
1474 | int qla4xxx_soft_reset(struct scsi_qla_host *ha) | ||
1475 | { | ||
1476 | |||
1477 | DEBUG2(printk(KERN_WARNING "scsi%ld: %s: chip reset!\n", ha->host_no, | ||
1478 | __func__)); | ||
1479 | if (test_bit(AF_TOPCAT_CHIP_PRESENT, &ha->flags)) { | ||
1480 | int status = QLA_ERROR; | ||
1481 | |||
1482 | if ((qla4010_soft_reset(ha) == QLA_SUCCESS) && | ||
1483 | (qla4xxx_topcat_reset(ha) == QLA_SUCCESS) && | ||
1484 | (qla4010_soft_reset(ha) == QLA_SUCCESS) ) | ||
1485 | status = QLA_SUCCESS; | ||
1486 | return status; | ||
1487 | } else | ||
1488 | return qla4010_soft_reset(ha); | ||
1489 | } | ||
1490 | |||
1491 | /** | ||
1492 | * qla4xxx_eh_wait_on_command - waits for command to be returned by firmware | 1409 | * qla4xxx_eh_wait_on_command - waits for command to be returned by firmware |
1493 | * @ha: actual ha whose done queue will contain the comd returned by firmware. | 1410 | * @ha: actual ha whose done queue will contain the comd returned by firmware. |
1494 | * @cmd: Scsi Command to wait on. | 1411 | * @cmd: Scsi Command to wait on. |
@@ -1686,6 +1603,12 @@ static struct pci_device_id qla4xxx_pci_tbl[] = { | |||
1686 | .subvendor = PCI_ANY_ID, | 1603 | .subvendor = PCI_ANY_ID, |
1687 | .subdevice = PCI_ANY_ID, | 1604 | .subdevice = PCI_ANY_ID, |
1688 | }, | 1605 | }, |
1606 | { | ||
1607 | .vendor = PCI_VENDOR_ID_QLOGIC, | ||
1608 | .device = PCI_DEVICE_ID_QLOGIC_ISP4032, | ||
1609 | .subvendor = PCI_ANY_ID, | ||
1610 | .subdevice = PCI_ANY_ID, | ||
1611 | }, | ||
1689 | {0, 0}, | 1612 | {0, 0}, |
1690 | }; | 1613 | }; |
1691 | MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl); | 1614 | MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl); |