diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 69 |
1 files changed, 34 insertions, 35 deletions
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 2a00f812779a..28c7185f24bc 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -705,32 +705,10 @@ static int zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *act) | |||
705 | return ZFCP_ERP_SUCCEEDED; | 705 | return ZFCP_ERP_SUCCEEDED; |
706 | } | 706 | } |
707 | 707 | ||
708 | static int zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *act, | 708 | static void zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *act) |
709 | int close) | ||
710 | { | 709 | { |
711 | int retval = ZFCP_ERP_SUCCEEDED; | ||
712 | struct zfcp_adapter *adapter = act->adapter; | 710 | struct zfcp_adapter *adapter = act->adapter; |
713 | 711 | ||
714 | if (close) | ||
715 | goto close_only; | ||
716 | |||
717 | retval = zfcp_erp_adapter_strategy_open_qdio(act); | ||
718 | if (retval != ZFCP_ERP_SUCCEEDED) | ||
719 | goto failed_qdio; | ||
720 | |||
721 | retval = zfcp_erp_adapter_strategy_open_fsf(act); | ||
722 | if (retval != ZFCP_ERP_SUCCEEDED) | ||
723 | goto failed_openfcp; | ||
724 | |||
725 | atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &act->adapter->status); | ||
726 | |||
727 | return ZFCP_ERP_SUCCEEDED; | ||
728 | |||
729 | close_only: | ||
730 | atomic_clear_mask(ZFCP_STATUS_COMMON_OPEN, | ||
731 | &act->adapter->status); | ||
732 | |||
733 | failed_openfcp: | ||
734 | /* close queues to ensure that buffers are not accessed by adapter */ | 712 | /* close queues to ensure that buffers are not accessed by adapter */ |
735 | zfcp_qdio_close(adapter); | 713 | zfcp_qdio_close(adapter); |
736 | zfcp_fsf_req_dismiss_all(adapter); | 714 | zfcp_fsf_req_dismiss_all(adapter); |
@@ -738,27 +716,48 @@ static int zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *act, | |||
738 | /* all ports and units are closed */ | 716 | /* all ports and units are closed */ |
739 | zfcp_erp_modify_adapter_status(adapter, 24, NULL, | 717 | zfcp_erp_modify_adapter_status(adapter, 24, NULL, |
740 | ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); | 718 | ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); |
741 | failed_qdio: | 719 | |
742 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK | | 720 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK | |
743 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, | 721 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status); |
744 | &act->adapter->status); | ||
745 | return retval; | ||
746 | } | 722 | } |
747 | 723 | ||
748 | static int zfcp_erp_adapter_strategy(struct zfcp_erp_action *act) | 724 | static int zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *act) |
749 | { | 725 | { |
750 | int retval; | 726 | struct zfcp_adapter *adapter = act->adapter; |
751 | 727 | ||
752 | zfcp_erp_adapter_strategy_generic(act, 1); /* close */ | 728 | if (zfcp_erp_adapter_strategy_open_qdio(act)) { |
753 | if (act->status & ZFCP_STATUS_ERP_CLOSE_ONLY) | 729 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK | |
754 | return ZFCP_ERP_EXIT; | 730 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, |
731 | &adapter->status); | ||
732 | return ZFCP_ERP_FAILED; | ||
733 | } | ||
755 | 734 | ||
756 | retval = zfcp_erp_adapter_strategy_generic(act, 0); /* open */ | 735 | if (zfcp_erp_adapter_strategy_open_fsf(act)) { |
736 | zfcp_erp_adapter_strategy_close(act); | ||
737 | return ZFCP_ERP_FAILED; | ||
738 | } | ||
739 | |||
740 | atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &adapter->status); | ||
741 | |||
742 | return ZFCP_ERP_SUCCEEDED; | ||
743 | } | ||
744 | |||
745 | static int zfcp_erp_adapter_strategy(struct zfcp_erp_action *act) | ||
746 | { | ||
747 | struct zfcp_adapter *adapter = act->adapter; | ||
748 | |||
749 | if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_OPEN) { | ||
750 | zfcp_erp_adapter_strategy_close(act); | ||
751 | if (act->status & ZFCP_STATUS_ERP_CLOSE_ONLY) | ||
752 | return ZFCP_ERP_EXIT; | ||
753 | } | ||
757 | 754 | ||
758 | if (retval == ZFCP_ERP_FAILED) | 755 | if (zfcp_erp_adapter_strategy_open(act)) { |
759 | ssleep(8); | 756 | ssleep(8); |
757 | return ZFCP_ERP_FAILED; | ||
758 | } | ||
760 | 759 | ||
761 | return retval; | 760 | return ZFCP_ERP_SUCCEEDED; |
762 | } | 761 | } |
763 | 762 | ||
764 | static int zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *act) | 763 | static int zfcp_erp_port_forced_strategy_close(struct zfcp_erp_action *act) |