diff options
| -rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index fbc81b012919..59587951c847 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
| @@ -554,6 +554,17 @@ static void | |||
| 554 | zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, | 554 | zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, |
| 555 | struct fsf_link_down_info *link_down) | 555 | struct fsf_link_down_info *link_down) |
| 556 | { | 556 | { |
| 557 | if (atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, | ||
| 558 | &adapter->status)) | ||
| 559 | return; | ||
| 560 | |||
| 561 | atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status); | ||
| 562 | |||
| 563 | if (link_down == NULL) { | ||
| 564 | zfcp_erp_adapter_reopen(adapter, 0); | ||
| 565 | return; | ||
| 566 | } | ||
| 567 | |||
| 557 | switch (link_down->error_code) { | 568 | switch (link_down->error_code) { |
| 558 | case FSF_PSQ_LINK_NO_LIGHT: | 569 | case FSF_PSQ_LINK_NO_LIGHT: |
| 559 | ZFCP_LOG_NORMAL("The local link to adapter %s is down " | 570 | ZFCP_LOG_NORMAL("The local link to adapter %s is down " |
| @@ -634,20 +645,15 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, | |||
| 634 | link_down->explanation_code, | 645 | link_down->explanation_code, |
| 635 | link_down->vendor_specific_code); | 646 | link_down->vendor_specific_code); |
| 636 | 647 | ||
| 637 | if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, | 648 | switch (link_down->error_code) { |
| 638 | &adapter->status)) { | 649 | case FSF_PSQ_LINK_NO_LIGHT: |
| 639 | atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, | 650 | case FSF_PSQ_LINK_WRAP_PLUG: |
| 640 | &adapter->status); | 651 | case FSF_PSQ_LINK_NO_FCP: |
| 641 | switch (link_down->error_code) { | 652 | case FSF_PSQ_LINK_FIRMWARE_UPDATE: |
| 642 | case FSF_PSQ_LINK_NO_LIGHT: | 653 | zfcp_erp_adapter_reopen(adapter, 0); |
| 643 | case FSF_PSQ_LINK_WRAP_PLUG: | 654 | break; |
| 644 | case FSF_PSQ_LINK_NO_FCP: | 655 | default: |
| 645 | case FSF_PSQ_LINK_FIRMWARE_UPDATE: | 656 | zfcp_erp_adapter_failed(adapter); |
| 646 | zfcp_erp_adapter_reopen(adapter, 0); | ||
| 647 | break; | ||
| 648 | default: | ||
| 649 | zfcp_erp_adapter_failed(adapter); | ||
| 650 | } | ||
| 651 | } | 657 | } |
| 652 | } | 658 | } |
| 653 | 659 | ||
| @@ -919,30 +925,36 @@ zfcp_fsf_status_read_handler(struct zfcp_fsf_req *fsf_req) | |||
| 919 | case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK: | 925 | case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK: |
| 920 | ZFCP_LOG_INFO("Physical link to adapter %s is down\n", | 926 | ZFCP_LOG_INFO("Physical link to adapter %s is down\n", |
| 921 | zfcp_get_busid_by_adapter(adapter)); | 927 | zfcp_get_busid_by_adapter(adapter)); |
| 928 | zfcp_fsf_link_down_info_eval(adapter, | ||
| 929 | (struct fsf_link_down_info *) | ||
| 930 | &status_buffer->payload); | ||
| 922 | break; | 931 | break; |
| 923 | case FSF_STATUS_READ_SUB_FDISC_FAILED: | 932 | case FSF_STATUS_READ_SUB_FDISC_FAILED: |
| 924 | ZFCP_LOG_INFO("Local link to adapter %s is down " | 933 | ZFCP_LOG_INFO("Local link to adapter %s is down " |
| 925 | "due to failed FDISC login\n", | 934 | "due to failed FDISC login\n", |
| 926 | zfcp_get_busid_by_adapter(adapter)); | 935 | zfcp_get_busid_by_adapter(adapter)); |
| 936 | zfcp_fsf_link_down_info_eval(adapter, | ||
| 937 | (struct fsf_link_down_info *) | ||
| 938 | &status_buffer->payload); | ||
| 927 | break; | 939 | break; |
| 928 | case FSF_STATUS_READ_SUB_FIRMWARE_UPDATE: | 940 | case FSF_STATUS_READ_SUB_FIRMWARE_UPDATE: |
| 929 | ZFCP_LOG_INFO("Local link to adapter %s is down " | 941 | ZFCP_LOG_INFO("Local link to adapter %s is down " |
| 930 | "due to firmware update on adapter\n", | 942 | "due to firmware update on adapter\n", |
| 931 | zfcp_get_busid_by_adapter(adapter)); | 943 | zfcp_get_busid_by_adapter(adapter)); |
| 944 | zfcp_fsf_link_down_info_eval(adapter, NULL); | ||
| 932 | break; | 945 | break; |
| 933 | default: | 946 | default: |
| 934 | ZFCP_LOG_INFO("Local link to adapter %s is down " | 947 | ZFCP_LOG_INFO("Local link to adapter %s is down " |
| 935 | "due to unknown reason\n", | 948 | "due to unknown reason\n", |
| 936 | zfcp_get_busid_by_adapter(adapter)); | 949 | zfcp_get_busid_by_adapter(adapter)); |
| 950 | zfcp_fsf_link_down_info_eval(adapter, NULL); | ||
| 937 | }; | 951 | }; |
| 938 | zfcp_fsf_link_down_info_eval(adapter, | ||
| 939 | (struct fsf_link_down_info *) &status_buffer->payload); | ||
| 940 | break; | 952 | break; |
| 941 | 953 | ||
| 942 | case FSF_STATUS_READ_LINK_UP: | 954 | case FSF_STATUS_READ_LINK_UP: |
| 943 | ZFCP_LOG_NORMAL("Local link to adapter %s was replugged. " | 955 | ZFCP_LOG_NORMAL("Local link to adapter %s was replugged. " |
| 944 | "Restarting operations on this adapter\n", | 956 | "Restarting operations on this adapter\n", |
| 945 | zfcp_get_busid_by_adapter(adapter)); | 957 | zfcp_get_busid_by_adapter(adapter)); |
| 946 | /* All ports should be marked as ready to run again */ | 958 | /* All ports should be marked as ready to run again */ |
| 947 | zfcp_erp_modify_adapter_status(adapter, | 959 | zfcp_erp_modify_adapter_status(adapter, |
| 948 | ZFCP_STATUS_COMMON_RUNNING, | 960 | ZFCP_STATUS_COMMON_RUNNING, |
