[SCSI] qla4xxx: Fixed AER reset sequence for ISP83xx/ISP84xx
authorTej Parkash <tej.parkash@qlogic.com>
Mon, 16 Dec 2013 11:49:38 +0000 (06:49 -0500)
committerJames Bottomley <JBottomley@Parallels.com>
Sat, 15 Mar 2014 17:19:13 +0000 (10:19 -0700)
Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com>
Reviewed-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla4xxx/ql4_def.h
drivers/scsi/qla4xxx/ql4_os.c

index 5236337..4e11133 100644 (file)
@@ -909,7 +909,8 @@ static inline int is_qla80XX(struct scsi_qla_host *ha)
 static inline int is_aer_supported(struct scsi_qla_host *ha)
 {
        return ((ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8022) ||
-               (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8324));
+               (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8324) ||
+               (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8042));
 }
 
 static inline int adapter_up(struct scsi_qla_host *ha)
index e6fa19c..a78edc3 100644 (file)
@@ -9579,28 +9579,36 @@ static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha)
        }
 
        fn = PCI_FUNC(ha->pdev->devfn);
-       while (fn > 0) {
-               fn--;
-               ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Finding PCI device at "
-                   "func %x\n", ha->host_no, __func__, fn);
-               /* Get the pci device given the domain, bus,
-                * slot/function number */
-               other_pdev =
-                   pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus),
-                   ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn),
-                   fn));
-
-               if (!other_pdev)
-                       continue;
+       if (is_qla8022(ha)) {
+               while (fn > 0) {
+                       fn--;
+                       ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Finding PCI device at func %x\n",
+                                  ha->host_no, __func__, fn);
+                       /* Get the pci device given the domain, bus,
+                        * slot/function number */
+                       other_pdev = pci_get_domain_bus_and_slot(
+                                          pci_domain_nr(ha->pdev->bus),
+                                          ha->pdev->bus->number,
+                                          PCI_DEVFN(PCI_SLOT(ha->pdev->devfn),
+                                          fn));
+
+                       if (!other_pdev)
+                               continue;
 
-               if (atomic_read(&other_pdev->enable_cnt)) {
-                       ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Found PCI "
-                           "func in enabled state%x\n", ha->host_no,
-                           __func__, fn);
+                       if (atomic_read(&other_pdev->enable_cnt)) {
+                               ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Found PCI func in enabled state%x\n",
+                                          ha->host_no, __func__, fn);
+                               pci_dev_put(other_pdev);
+                               break;
+                       }
                        pci_dev_put(other_pdev);
-                       break;
                }
-               pci_dev_put(other_pdev);
+       } else {
+               /* this case is meant for ISP83xx/ISP84xx only */
+               if (qla4_83xx_can_perform_reset(ha)) {
+                       /* reset fn as iSCSI is going to perform the reset */
+                       fn = 0;
+               }
        }
 
        /* The first function on the card, the reset owner will