diff options
author | Kevin Barnett <kevin.barnett@microsemi.com> | 2016-08-31 15:54:47 -0400 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2016-09-02 06:21:38 -0400 |
commit | e57a1f9b2fa4326ec289f1d03c658184ed6addb8 (patch) | |
tree | df7464f0ea54713544bc919979a4864340ead890 | |
parent | ff6abb7383d2eec6c8c988ff661352e66f245686 (diff) |
scsi: smartpqi: correct controller offline issue
Fixes: 6c223761e 'smartpqi: initial commit of Microsemi smartpqi driver'
Fixed a bug where the driver would not free all of the
controller resources if the controller ever went offline.
Reviewed-by: Scott Teel <scott.teel@microsemi.com>
Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r-- | drivers/scsi/smartpqi/smartpqi_init.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c index 43bfeaca65db..d759703da287 100644 --- a/drivers/scsi/smartpqi/smartpqi_init.c +++ b/drivers/scsi/smartpqi/smartpqi_init.c | |||
@@ -5609,19 +5609,14 @@ static void pqi_free_ctrl_resources(struct pqi_ctrl_info *ctrl_info) | |||
5609 | 5609 | ||
5610 | static void pqi_remove_ctrl(struct pqi_ctrl_info *ctrl_info) | 5610 | static void pqi_remove_ctrl(struct pqi_ctrl_info *ctrl_info) |
5611 | { | 5611 | { |
5612 | int rc; | 5612 | cancel_delayed_work_sync(&ctrl_info->rescan_work); |
5613 | cancel_delayed_work_sync(&ctrl_info->update_time_work); | ||
5614 | pqi_remove_all_scsi_devices(ctrl_info); | ||
5615 | pqi_unregister_scsi(ctrl_info); | ||
5613 | 5616 | ||
5614 | if (ctrl_info->controller_online) { | ||
5615 | cancel_delayed_work_sync(&ctrl_info->rescan_work); | ||
5616 | cancel_delayed_work_sync(&ctrl_info->update_time_work); | ||
5617 | pqi_remove_all_scsi_devices(ctrl_info); | ||
5618 | pqi_unregister_scsi(ctrl_info); | ||
5619 | ctrl_info->controller_online = false; | ||
5620 | } | ||
5621 | if (ctrl_info->pqi_mode_enabled) { | 5617 | if (ctrl_info->pqi_mode_enabled) { |
5622 | sis_disable_msix(ctrl_info); | 5618 | sis_disable_msix(ctrl_info); |
5623 | rc = pqi_reset(ctrl_info); | 5619 | if (pqi_reset(ctrl_info) == 0) |
5624 | if (rc == 0) | ||
5625 | sis_reenable_sis_mode(ctrl_info); | 5620 | sis_reenable_sis_mode(ctrl_info); |
5626 | } | 5621 | } |
5627 | pqi_free_ctrl_resources(ctrl_info); | 5622 | pqi_free_ctrl_resources(ctrl_info); |