From: Suganath Prabu <suganath-prabu.subram...@broadcom.com>

[ Upstream commit dc730212e8a378763cb182b889f90c8101331332 ]

Call sas_remove_host() before removing the target devices in the driver's
.remove() callback function(i.e. during driver unload time).  So that
driver can provide a way to allow SYNC CACHE, START STOP unit commands
etc. (which are issued from SML) to the target drives during driver unload
time.

Once sas_remove_host() is called before removing the target drives then
driver can just clean up the resources allocated for target devices and no
need to call sas_port_delete_phy(), sas_port_delete() API's as these API's
internally called from sas_remove_host().

Signed-off-by: Suganath Prabu <suganath-prabu.subram...@broadcom.com>
Reviewed-by: Bjorn Helgaas <bhelg...@google.com>
Reviewed-by: Andy Shevchenko <andy.shevche...@gmail.com>
Signed-off-by: Martin K. Petersen <martin.peter...@oracle.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 drivers/scsi/mpt3sas/mpt3sas_scsih.c     | 2 +-
 drivers/scsi/mpt3sas/mpt3sas_transport.c | 7 +++++--
 2 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c 
b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 03c52847ed07..adac18ba84d4 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -9641,6 +9641,7 @@ static void scsih_remove(struct pci_dev *pdev)
 
        /* release all the volumes */
        _scsih_ir_shutdown(ioc);
+       sas_remove_host(shost);
        list_for_each_entry_safe(raid_device, next, &ioc->raid_device_list,
            list) {
                if (raid_device->starget) {
@@ -9682,7 +9683,6 @@ static void scsih_remove(struct pci_dev *pdev)
                ioc->sas_hba.num_phys = 0;
        }
 
-       sas_remove_host(shost);
        mpt3sas_base_detach(ioc);
        spin_lock(&gioc_lock);
        list_del(&ioc->list);
diff --git a/drivers/scsi/mpt3sas/mpt3sas_transport.c 
b/drivers/scsi/mpt3sas/mpt3sas_transport.c
index 6a8a3c09b4b1..8338b4db0e31 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_transport.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_transport.c
@@ -821,10 +821,13 @@ mpt3sas_transport_port_remove(struct MPT3SAS_ADAPTER 
*ioc, u64 sas_address,
                            mpt3sas_port->remote_identify.sas_address,
                            mpt3sas_phy->phy_id);
                mpt3sas_phy->phy_belongs_to_port = 0;
-               sas_port_delete_phy(mpt3sas_port->port, mpt3sas_phy->phy);
+               if (!ioc->remove_host)
+                       sas_port_delete_phy(mpt3sas_port->port,
+                                               mpt3sas_phy->phy);
                list_del(&mpt3sas_phy->port_siblings);
        }
-       sas_port_delete(mpt3sas_port->port);
+       if (!ioc->remove_host)
+               sas_port_delete(mpt3sas_port->port);
        kfree(mpt3sas_port);
 }
 
-- 
2.19.1

Reply via email to