[SCSI] libsas: use ->lldd_I_T_nexus_reset for ->eh_bus_reset_handler
authorDan Williams <dan.j.williams@intel.com>
Fri, 22 Jun 2012 06:30:58 +0000 (23:30 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 20 Jul 2012 07:58:51 +0000 (08:58 +0100)
sas_eh_bus_reset_handler() amounts to sas_phy_reset() without
notification of the reset to the lldd.  If this is triggered from
eh-cmnd recovery there may be sas_tasks for the lldd to terminate, so
->lldd_I_T_nexus_reset is warranted.

Cc: Xiangliang Yu <yuxiangl@marvell.com>
Cc: Luben Tuikov <ltuikov@yahoo.com>
Cc: Jack Wang <jack_wang@usish.com>
Reviewed-by: Jacek Danecki <jacek.danecki@intel.com>
[jacek: modify pm8001_I_T_nexus_reset to return -ENODEV]
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/libsas/sas_scsi_host.c
drivers/scsi/pm8001/pm8001_sas.c

index 875b87112c50882125a73e6b2bbd92c91837652e..676414859872acbbc0e1ae301c4726d52ba50c7d 100644 (file)
@@ -576,25 +576,22 @@ int sas_eh_device_reset_handler(struct scsi_cmnd *cmd)
        return FAILED;
 }
 
-/* Attempt to send a phy (bus) reset */
 int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd)
 {
-       struct domain_device *dev = cmd_to_domain_dev(cmd);
-       struct sas_phy *phy = sas_get_local_phy(dev);
-       struct Scsi_Host *host = cmd->device->host;
        int res;
+       struct Scsi_Host *host = cmd->device->host;
+       struct domain_device *dev = cmd_to_domain_dev(cmd);
+       struct sas_internal *i = to_sas_internal(host->transportt);
 
        if (current != host->ehandler)
                return sas_queue_reset(dev, SAS_DEV_RESET, 0, 0);
 
-       res = sas_phy_reset(phy, 1);
-       if (res)
-               SAS_DPRINTK("Bus reset of %s failed 0x%x\n",
-                           kobject_name(&phy->dev.kobj),
-                           res);
-       sas_put_local_phy(phy);
+       if (!i->dft->lldd_I_T_nexus_reset)
+               return FAILED;
 
-       if (res == TMF_RESP_FUNC_SUCC || res == TMF_RESP_FUNC_COMPLETE)
+       res = i->dft->lldd_I_T_nexus_reset(dev);
+       if (res == TMF_RESP_FUNC_SUCC || res == TMF_RESP_FUNC_COMPLETE ||
+           res == -ENODEV)
                return SUCCESS;
 
        return FAILED;
index 3b11edd4a50c8c586ecd0c2abd9d6f90a2031c54..fdbba57a74aec61a031dcd0d218ba45e10f48505 100644 (file)
@@ -962,8 +962,9 @@ int pm8001_I_T_nexus_reset(struct domain_device *dev)
        struct pm8001_device *pm8001_dev;
        struct pm8001_hba_info *pm8001_ha;
        struct sas_phy *phy;
+
        if (!dev || !dev->lldd_dev)
-               return -1;
+               return -ENODEV;
 
        pm8001_dev = dev->lldd_dev;
        pm8001_ha = pm8001_find_ha_by_dev(dev);