diff options
Diffstat (limited to 'drivers/s390/scsi')
-rw-r--r-- | drivers/s390/scsi/zfcp_dbf.c | 76 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 13 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 82 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 5 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 80 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 15 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs_adapter.c | 4 |
7 files changed, 118 insertions, 157 deletions
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index 4d7d47cf2394..a5f2ba9a8fdb 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c | |||
@@ -710,10 +710,9 @@ static inline void | |||
710 | _zfcp_scsi_dbf_event_common(const char *tag, const char *tag2, int level, | 710 | _zfcp_scsi_dbf_event_common(const char *tag, const char *tag2, int level, |
711 | struct zfcp_adapter *adapter, | 711 | struct zfcp_adapter *adapter, |
712 | struct scsi_cmnd *scsi_cmnd, | 712 | struct scsi_cmnd *scsi_cmnd, |
713 | struct zfcp_fsf_req *new_fsf_req) | 713 | struct zfcp_fsf_req *fsf_req, |
714 | struct zfcp_fsf_req *old_fsf_req) | ||
714 | { | 715 | { |
715 | struct zfcp_fsf_req *fsf_req = | ||
716 | (struct zfcp_fsf_req *)scsi_cmnd->host_scribble; | ||
717 | struct zfcp_scsi_dbf_record *rec = &adapter->scsi_dbf_buf; | 716 | struct zfcp_scsi_dbf_record *rec = &adapter->scsi_dbf_buf; |
718 | struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec; | 717 | struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec; |
719 | unsigned long flags; | 718 | unsigned long flags; |
@@ -727,19 +726,20 @@ _zfcp_scsi_dbf_event_common(const char *tag, const char *tag2, int level, | |||
727 | if (offset == 0) { | 726 | if (offset == 0) { |
728 | strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE); | 727 | strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE); |
729 | strncpy(rec->tag2, tag2, ZFCP_DBF_TAG_SIZE); | 728 | strncpy(rec->tag2, tag2, ZFCP_DBF_TAG_SIZE); |
730 | if (scsi_cmnd->device) { | 729 | if (scsi_cmnd != NULL) { |
731 | rec->scsi_id = scsi_cmnd->device->id; | 730 | if (scsi_cmnd->device) { |
732 | rec->scsi_lun = scsi_cmnd->device->lun; | 731 | rec->scsi_id = scsi_cmnd->device->id; |
732 | rec->scsi_lun = scsi_cmnd->device->lun; | ||
733 | } | ||
734 | rec->scsi_result = scsi_cmnd->result; | ||
735 | rec->scsi_cmnd = (unsigned long)scsi_cmnd; | ||
736 | rec->scsi_serial = scsi_cmnd->serial_number; | ||
737 | memcpy(rec->scsi_opcode, &scsi_cmnd->cmnd, | ||
738 | min((int)scsi_cmnd->cmd_len, | ||
739 | ZFCP_DBF_SCSI_OPCODE)); | ||
740 | rec->scsi_retries = scsi_cmnd->retries; | ||
741 | rec->scsi_allowed = scsi_cmnd->allowed; | ||
733 | } | 742 | } |
734 | rec->scsi_result = scsi_cmnd->result; | ||
735 | rec->scsi_cmnd = (unsigned long)scsi_cmnd; | ||
736 | rec->scsi_serial = scsi_cmnd->serial_number; | ||
737 | memcpy(rec->scsi_opcode, | ||
738 | &scsi_cmnd->cmnd, | ||
739 | min((int)scsi_cmnd->cmd_len, | ||
740 | ZFCP_DBF_SCSI_OPCODE)); | ||
741 | rec->scsi_retries = scsi_cmnd->retries; | ||
742 | rec->scsi_allowed = scsi_cmnd->allowed; | ||
743 | if (fsf_req != NULL) { | 743 | if (fsf_req != NULL) { |
744 | fcp_rsp = (struct fcp_rsp_iu *) | 744 | fcp_rsp = (struct fcp_rsp_iu *) |
745 | &(fsf_req->qtcb->bottom.io.fcp_rsp); | 745 | &(fsf_req->qtcb->bottom.io.fcp_rsp); |
@@ -772,15 +772,8 @@ _zfcp_scsi_dbf_event_common(const char *tag, const char *tag2, int level, | |||
772 | rec->fsf_seqno = fsf_req->seq_no; | 772 | rec->fsf_seqno = fsf_req->seq_no; |
773 | rec->fsf_issued = fsf_req->issued; | 773 | rec->fsf_issued = fsf_req->issued; |
774 | } | 774 | } |
775 | if (new_fsf_req != NULL) { | 775 | rec->type.old_fsf_reqid = |
776 | rec->type.new_fsf_req.fsf_reqid = | 776 | (unsigned long) old_fsf_req; |
777 | (unsigned long) | ||
778 | new_fsf_req; | ||
779 | rec->type.new_fsf_req.fsf_seqno = | ||
780 | new_fsf_req->seq_no; | ||
781 | rec->type.new_fsf_req.fsf_issued = | ||
782 | new_fsf_req->issued; | ||
783 | } | ||
784 | } else { | 777 | } else { |
785 | strncpy(dump->tag, "dump", ZFCP_DBF_TAG_SIZE); | 778 | strncpy(dump->tag, "dump", ZFCP_DBF_TAG_SIZE); |
786 | dump->total_size = buflen; | 779 | dump->total_size = buflen; |
@@ -801,19 +794,21 @@ _zfcp_scsi_dbf_event_common(const char *tag, const char *tag2, int level, | |||
801 | inline void | 794 | inline void |
802 | zfcp_scsi_dbf_event_result(const char *tag, int level, | 795 | zfcp_scsi_dbf_event_result(const char *tag, int level, |
803 | struct zfcp_adapter *adapter, | 796 | struct zfcp_adapter *adapter, |
804 | struct scsi_cmnd *scsi_cmnd) | 797 | struct scsi_cmnd *scsi_cmnd, |
798 | struct zfcp_fsf_req *fsf_req) | ||
805 | { | 799 | { |
806 | _zfcp_scsi_dbf_event_common("rslt", | 800 | _zfcp_scsi_dbf_event_common("rslt", tag, level, |
807 | tag, level, adapter, scsi_cmnd, NULL); | 801 | adapter, scsi_cmnd, fsf_req, NULL); |
808 | } | 802 | } |
809 | 803 | ||
810 | inline void | 804 | inline void |
811 | zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter, | 805 | zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter, |
812 | struct scsi_cmnd *scsi_cmnd, | 806 | struct scsi_cmnd *scsi_cmnd, |
813 | struct zfcp_fsf_req *new_fsf_req) | 807 | struct zfcp_fsf_req *new_fsf_req, |
808 | struct zfcp_fsf_req *old_fsf_req) | ||
814 | { | 809 | { |
815 | _zfcp_scsi_dbf_event_common("abrt", | 810 | _zfcp_scsi_dbf_event_common("abrt", tag, 1, |
816 | tag, 1, adapter, scsi_cmnd, new_fsf_req); | 811 | adapter, scsi_cmnd, new_fsf_req, old_fsf_req); |
817 | } | 812 | } |
818 | 813 | ||
819 | inline void | 814 | inline void |
@@ -823,7 +818,7 @@ zfcp_scsi_dbf_event_devreset(const char *tag, u8 flag, struct zfcp_unit *unit, | |||
823 | struct zfcp_adapter *adapter = unit->port->adapter; | 818 | struct zfcp_adapter *adapter = unit->port->adapter; |
824 | 819 | ||
825 | _zfcp_scsi_dbf_event_common(flag == FCP_TARGET_RESET ? "trst" : "lrst", | 820 | _zfcp_scsi_dbf_event_common(flag == FCP_TARGET_RESET ? "trst" : "lrst", |
826 | tag, 1, adapter, scsi_cmnd, NULL); | 821 | tag, 1, adapter, scsi_cmnd, NULL, NULL); |
827 | } | 822 | } |
828 | 823 | ||
829 | static int | 824 | static int |
@@ -856,6 +851,10 @@ zfcp_scsi_dbf_view_format(debug_info_t * id, struct debug_view *view, | |||
856 | rec->scsi_retries); | 851 | rec->scsi_retries); |
857 | len += zfcp_dbf_view(out_buf + len, "scsi_allowed", "0x%02x", | 852 | len += zfcp_dbf_view(out_buf + len, "scsi_allowed", "0x%02x", |
858 | rec->scsi_allowed); | 853 | rec->scsi_allowed); |
854 | if (strncmp(rec->tag, "abrt", ZFCP_DBF_TAG_SIZE) == 0) { | ||
855 | len += zfcp_dbf_view(out_buf + len, "old_fsf_reqid", "0x%0Lx", | ||
856 | rec->type.old_fsf_reqid); | ||
857 | } | ||
859 | len += zfcp_dbf_view(out_buf + len, "fsf_reqid", "0x%0Lx", | 858 | len += zfcp_dbf_view(out_buf + len, "fsf_reqid", "0x%0Lx", |
860 | rec->fsf_reqid); | 859 | rec->fsf_reqid); |
861 | len += zfcp_dbf_view(out_buf + len, "fsf_seqno", "0x%08x", | 860 | len += zfcp_dbf_view(out_buf + len, "fsf_seqno", "0x%08x", |
@@ -883,21 +882,6 @@ zfcp_scsi_dbf_view_format(debug_info_t * id, struct debug_view *view, | |||
883 | min((int)rec->type.fcp.sns_info_len, | 882 | min((int)rec->type.fcp.sns_info_len, |
884 | ZFCP_DBF_SCSI_FCP_SNS_INFO), 0, | 883 | ZFCP_DBF_SCSI_FCP_SNS_INFO), 0, |
885 | rec->type.fcp.sns_info_len); | 884 | rec->type.fcp.sns_info_len); |
886 | } else if (strncmp(rec->tag, "abrt", ZFCP_DBF_TAG_SIZE) == 0) { | ||
887 | len += zfcp_dbf_view(out_buf + len, "fsf_reqid_abort", "0x%0Lx", | ||
888 | rec->type.new_fsf_req.fsf_reqid); | ||
889 | len += zfcp_dbf_view(out_buf + len, "fsf_seqno_abort", "0x%08x", | ||
890 | rec->type.new_fsf_req.fsf_seqno); | ||
891 | len += zfcp_dbf_stck(out_buf + len, "fsf_issued", | ||
892 | rec->type.new_fsf_req.fsf_issued); | ||
893 | } else if ((strncmp(rec->tag, "trst", ZFCP_DBF_TAG_SIZE) == 0) || | ||
894 | (strncmp(rec->tag, "lrst", ZFCP_DBF_TAG_SIZE) == 0)) { | ||
895 | len += zfcp_dbf_view(out_buf + len, "fsf_reqid_reset", "0x%0Lx", | ||
896 | rec->type.new_fsf_req.fsf_reqid); | ||
897 | len += zfcp_dbf_view(out_buf + len, "fsf_seqno_reset", "0x%08x", | ||
898 | rec->type.new_fsf_req.fsf_seqno); | ||
899 | len += zfcp_dbf_stck(out_buf + len, "fsf_issued", | ||
900 | rec->type.new_fsf_req.fsf_issued); | ||
901 | } | 885 | } |
902 | 886 | ||
903 | len += sprintf(out_buf + len, "\n"); | 887 | len += sprintf(out_buf + len, "\n"); |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index e260d19fa717..7f551d66f47f 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -152,11 +152,6 @@ typedef u32 scsi_lun_t; | |||
152 | #define ZFCP_EXCHANGE_CONFIG_DATA_FIRST_SLEEP 100 | 152 | #define ZFCP_EXCHANGE_CONFIG_DATA_FIRST_SLEEP 100 |
153 | #define ZFCP_EXCHANGE_CONFIG_DATA_RETRIES 7 | 153 | #define ZFCP_EXCHANGE_CONFIG_DATA_RETRIES 7 |
154 | 154 | ||
155 | /* Retry 5 times every 2 second, then every minute */ | ||
156 | #define ZFCP_EXCHANGE_PORT_DATA_SHORT_RETRIES 5 | ||
157 | #define ZFCP_EXCHANGE_PORT_DATA_SHORT_SLEEP 200 | ||
158 | #define ZFCP_EXCHANGE_PORT_DATA_LONG_SLEEP 6000 | ||
159 | |||
160 | /* timeout value for "default timer" for fsf requests */ | 155 | /* timeout value for "default timer" for fsf requests */ |
161 | #define ZFCP_FSF_REQUEST_TIMEOUT (60*HZ); | 156 | #define ZFCP_FSF_REQUEST_TIMEOUT (60*HZ); |
162 | 157 | ||
@@ -429,11 +424,7 @@ struct zfcp_scsi_dbf_record { | |||
429 | u32 fsf_seqno; | 424 | u32 fsf_seqno; |
430 | u64 fsf_issued; | 425 | u64 fsf_issued; |
431 | union { | 426 | union { |
432 | struct { | 427 | u64 old_fsf_reqid; |
433 | u64 fsf_reqid; | ||
434 | u32 fsf_seqno; | ||
435 | u64 fsf_issued; | ||
436 | } new_fsf_req; | ||
437 | struct { | 428 | struct { |
438 | u8 rsp_validity; | 429 | u8 rsp_validity; |
439 | u8 rsp_scsi_status; | 430 | u8 rsp_scsi_status; |
@@ -915,8 +906,6 @@ struct zfcp_adapter { | |||
915 | wwn_t peer_wwnn; /* P2P peer WWNN */ | 906 | wwn_t peer_wwnn; /* P2P peer WWNN */ |
916 | wwn_t peer_wwpn; /* P2P peer WWPN */ | 907 | wwn_t peer_wwpn; /* P2P peer WWPN */ |
917 | u32 peer_d_id; /* P2P peer D_ID */ | 908 | u32 peer_d_id; /* P2P peer D_ID */ |
918 | wwn_t physical_wwpn; /* WWPN of physical port */ | ||
919 | u32 physical_s_id; /* local FC port ID */ | ||
920 | struct ccw_device *ccw_device; /* S/390 ccw device */ | 909 | struct ccw_device *ccw_device; /* S/390 ccw device */ |
921 | u8 fc_service_class; | 910 | u8 fc_service_class; |
922 | u32 hydra_version; /* Hydra version */ | 911 | u32 hydra_version; /* Hydra version */ |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index da947e662031..e3c4bdd29a60 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -2246,15 +2246,6 @@ zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *erp_action) | |||
2246 | { | 2246 | { |
2247 | int retval; | 2247 | int retval; |
2248 | 2248 | ||
2249 | if ((atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, | ||
2250 | &erp_action->adapter->status)) && | ||
2251 | (erp_action->adapter->adapter_features & | ||
2252 | FSF_FEATURE_HBAAPI_MANAGEMENT)) { | ||
2253 | zfcp_erp_adapter_strategy_open_fsf_xport(erp_action); | ||
2254 | atomic_set(&erp_action->adapter->erp_counter, 0); | ||
2255 | return ZFCP_ERP_FAILED; | ||
2256 | } | ||
2257 | |||
2258 | retval = zfcp_erp_adapter_strategy_open_fsf_xconfig(erp_action); | 2249 | retval = zfcp_erp_adapter_strategy_open_fsf_xconfig(erp_action); |
2259 | if (retval == ZFCP_ERP_FAILED) | 2250 | if (retval == ZFCP_ERP_FAILED) |
2260 | return ZFCP_ERP_FAILED; | 2251 | return ZFCP_ERP_FAILED; |
@@ -2266,13 +2257,6 @@ zfcp_erp_adapter_strategy_open_fsf(struct zfcp_erp_action *erp_action) | |||
2266 | return zfcp_erp_adapter_strategy_open_fsf_statusread(erp_action); | 2257 | return zfcp_erp_adapter_strategy_open_fsf_statusread(erp_action); |
2267 | } | 2258 | } |
2268 | 2259 | ||
2269 | /* | ||
2270 | * function: | ||
2271 | * | ||
2272 | * purpose: | ||
2273 | * | ||
2274 | * returns: | ||
2275 | */ | ||
2276 | static int | 2260 | static int |
2277 | zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action) | 2261 | zfcp_erp_adapter_strategy_open_fsf_xconfig(struct zfcp_erp_action *erp_action) |
2278 | { | 2262 | { |
@@ -2350,48 +2334,40 @@ static int | |||
2350 | zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action) | 2334 | zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *erp_action) |
2351 | { | 2335 | { |
2352 | int ret; | 2336 | int ret; |
2353 | int retries; | 2337 | struct zfcp_adapter *adapter; |
2354 | int sleep; | ||
2355 | struct zfcp_adapter *adapter = erp_action->adapter; | ||
2356 | 2338 | ||
2339 | adapter = erp_action->adapter; | ||
2357 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); | 2340 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); |
2358 | 2341 | ||
2359 | retries = 0; | 2342 | write_lock(&adapter->erp_lock); |
2360 | do { | 2343 | zfcp_erp_action_to_running(erp_action); |
2361 | write_lock(&adapter->erp_lock); | 2344 | write_unlock(&adapter->erp_lock); |
2362 | zfcp_erp_action_to_running(erp_action); | ||
2363 | write_unlock(&adapter->erp_lock); | ||
2364 | zfcp_erp_timeout_init(erp_action); | ||
2365 | ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL); | ||
2366 | if (ret == -EOPNOTSUPP) { | ||
2367 | debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp"); | ||
2368 | return ZFCP_ERP_SUCCEEDED; | ||
2369 | } else if (ret) { | ||
2370 | debug_text_event(adapter->erp_dbf, 3, "a_xport_failed"); | ||
2371 | return ZFCP_ERP_FAILED; | ||
2372 | } | ||
2373 | debug_text_event(adapter->erp_dbf, 6, "a_xport_ok"); | ||
2374 | 2345 | ||
2375 | down(&adapter->erp_ready_sem); | 2346 | zfcp_erp_timeout_init(erp_action); |
2376 | if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { | 2347 | ret = zfcp_fsf_exchange_port_data(erp_action, adapter, NULL); |
2377 | ZFCP_LOG_INFO("error: exchange of port data " | 2348 | if (ret == -EOPNOTSUPP) { |
2378 | "for adapter %s timed out\n", | 2349 | debug_text_event(adapter->erp_dbf, 3, "a_xport_notsupp"); |
2379 | zfcp_get_busid_by_adapter(adapter)); | 2350 | return ZFCP_ERP_SUCCEEDED; |
2380 | break; | 2351 | } else if (ret) { |
2381 | } | 2352 | debug_text_event(adapter->erp_dbf, 3, "a_xport_failed"); |
2382 | if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, | 2353 | return ZFCP_ERP_FAILED; |
2383 | &adapter->status)) | 2354 | } |
2384 | break; | 2355 | debug_text_event(adapter->erp_dbf, 6, "a_xport_ok"); |
2385 | 2356 | ||
2386 | if (retries < ZFCP_EXCHANGE_PORT_DATA_SHORT_RETRIES) { | 2357 | ret = ZFCP_ERP_SUCCEEDED; |
2387 | sleep = ZFCP_EXCHANGE_PORT_DATA_SHORT_SLEEP; | 2358 | down(&adapter->erp_ready_sem); |
2388 | retries++; | 2359 | if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) { |
2389 | } else | 2360 | ZFCP_LOG_INFO("error: exchange port data timed out (adapter " |
2390 | sleep = ZFCP_EXCHANGE_PORT_DATA_LONG_SLEEP; | 2361 | "%s)\n", zfcp_get_busid_by_adapter(adapter)); |
2391 | schedule_timeout(sleep); | 2362 | ret = ZFCP_ERP_FAILED; |
2392 | } while (1); | 2363 | } |
2364 | if (!atomic_test_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status)) { | ||
2365 | ZFCP_LOG_INFO("error: exchange port data failed (adapter " | ||
2366 | "%s\n", zfcp_get_busid_by_adapter(adapter)); | ||
2367 | ret = ZFCP_ERP_FAILED; | ||
2368 | } | ||
2393 | 2369 | ||
2394 | return ZFCP_ERP_SUCCEEDED; | 2370 | return ret; |
2395 | } | 2371 | } |
2396 | 2372 | ||
2397 | /* | 2373 | /* |
@@ -3439,6 +3415,8 @@ zfcp_erp_action_cleanup(int action, struct zfcp_adapter *adapter, | |||
3439 | "(adapter %s, wwpn=0x%016Lx)\n", | 3415 | "(adapter %s, wwpn=0x%016Lx)\n", |
3440 | zfcp_get_busid_by_port(port), | 3416 | zfcp_get_busid_by_port(port), |
3441 | port->wwpn); | 3417 | port->wwpn); |
3418 | else | ||
3419 | scsi_flush_work(adapter->scsi_host); | ||
3442 | } | 3420 | } |
3443 | zfcp_port_put(port); | 3421 | zfcp_port_put(port); |
3444 | break; | 3422 | break; |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index c1ba7cf1b496..700f5402a978 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
@@ -194,9 +194,10 @@ extern void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *); | |||
194 | extern void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *); | 194 | extern void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *); |
195 | 195 | ||
196 | extern void zfcp_scsi_dbf_event_result(const char *, int, struct zfcp_adapter *, | 196 | extern void zfcp_scsi_dbf_event_result(const char *, int, struct zfcp_adapter *, |
197 | struct scsi_cmnd *); | 197 | struct scsi_cmnd *, |
198 | struct zfcp_fsf_req *); | ||
198 | extern void zfcp_scsi_dbf_event_abort(const char *, struct zfcp_adapter *, | 199 | extern void zfcp_scsi_dbf_event_abort(const char *, struct zfcp_adapter *, |
199 | struct scsi_cmnd *, | 200 | struct scsi_cmnd *, struct zfcp_fsf_req *, |
200 | struct zfcp_fsf_req *); | 201 | struct zfcp_fsf_req *); |
201 | extern void zfcp_scsi_dbf_event_devreset(const char *, u8, struct zfcp_unit *, | 202 | extern void zfcp_scsi_dbf_event_devreset(const char *, u8, struct zfcp_unit *, |
202 | struct scsi_cmnd *); | 203 | struct scsi_cmnd *); |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 9f0cb3d820c0..662ec571d73b 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -388,6 +388,7 @@ zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *fsf_req) | |||
388 | case FSF_PROT_LINK_DOWN: | 388 | case FSF_PROT_LINK_DOWN: |
389 | zfcp_fsf_link_down_info_eval(adapter, | 389 | zfcp_fsf_link_down_info_eval(adapter, |
390 | &prot_status_qual->link_down_info); | 390 | &prot_status_qual->link_down_info); |
391 | zfcp_erp_adapter_reopen(adapter, 0); | ||
391 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 392 | fsf_req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
392 | break; | 393 | break; |
393 | 394 | ||
@@ -558,10 +559,8 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, | |||
558 | 559 | ||
559 | atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status); | 560 | atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status); |
560 | 561 | ||
561 | if (link_down == NULL) { | 562 | if (link_down == NULL) |
562 | zfcp_erp_adapter_reopen(adapter, 0); | 563 | goto out; |
563 | return; | ||
564 | } | ||
565 | 564 | ||
566 | switch (link_down->error_code) { | 565 | switch (link_down->error_code) { |
567 | case FSF_PSQ_LINK_NO_LIGHT: | 566 | case FSF_PSQ_LINK_NO_LIGHT: |
@@ -643,16 +642,8 @@ zfcp_fsf_link_down_info_eval(struct zfcp_adapter *adapter, | |||
643 | link_down->explanation_code, | 642 | link_down->explanation_code, |
644 | link_down->vendor_specific_code); | 643 | link_down->vendor_specific_code); |
645 | 644 | ||
646 | switch (link_down->error_code) { | 645 | out: |
647 | case FSF_PSQ_LINK_NO_LIGHT: | 646 | zfcp_erp_adapter_failed(adapter); |
648 | case FSF_PSQ_LINK_WRAP_PLUG: | ||
649 | case FSF_PSQ_LINK_NO_FCP: | ||
650 | case FSF_PSQ_LINK_FIRMWARE_UPDATE: | ||
651 | zfcp_erp_adapter_reopen(adapter, 0); | ||
652 | break; | ||
653 | default: | ||
654 | zfcp_erp_adapter_failed(adapter); | ||
655 | } | ||
656 | } | 647 | } |
657 | 648 | ||
658 | /* | 649 | /* |
@@ -2304,6 +2295,35 @@ zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action, | |||
2304 | return retval; | 2295 | return retval; |
2305 | } | 2296 | } |
2306 | 2297 | ||
2298 | /** | ||
2299 | * zfcp_fsf_exchange_port_evaluate | ||
2300 | * @fsf_req: fsf_req which belongs to xchg port data request | ||
2301 | * @xchg_ok: specifies if xchg port data was incomplete or complete (0/1) | ||
2302 | */ | ||
2303 | static void | ||
2304 | zfcp_fsf_exchange_port_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) | ||
2305 | { | ||
2306 | struct zfcp_adapter *adapter; | ||
2307 | struct fsf_qtcb *qtcb; | ||
2308 | struct fsf_qtcb_bottom_port *bottom, *data; | ||
2309 | struct Scsi_Host *shost; | ||
2310 | |||
2311 | adapter = fsf_req->adapter; | ||
2312 | qtcb = fsf_req->qtcb; | ||
2313 | bottom = &qtcb->bottom.port; | ||
2314 | shost = adapter->scsi_host; | ||
2315 | |||
2316 | data = (struct fsf_qtcb_bottom_port*) fsf_req->data; | ||
2317 | if (data) | ||
2318 | memcpy(data, bottom, sizeof(struct fsf_qtcb_bottom_port)); | ||
2319 | |||
2320 | if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) | ||
2321 | fc_host_permanent_port_name(shost) = bottom->wwpn; | ||
2322 | else | ||
2323 | fc_host_permanent_port_name(shost) = fc_host_port_name(shost); | ||
2324 | fc_host_maxframe_size(shost) = bottom->maximum_frame_size; | ||
2325 | fc_host_supported_speeds(shost) = bottom->supported_speed; | ||
2326 | } | ||
2307 | 2327 | ||
2308 | /** | 2328 | /** |
2309 | * zfcp_fsf_exchange_port_data_handler - handler for exchange_port_data request | 2329 | * zfcp_fsf_exchange_port_data_handler - handler for exchange_port_data request |
@@ -2312,38 +2332,26 @@ zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action, | |||
2312 | static void | 2332 | static void |
2313 | zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) | 2333 | zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) |
2314 | { | 2334 | { |
2315 | struct zfcp_adapter *adapter = fsf_req->adapter; | 2335 | struct zfcp_adapter *adapter; |
2316 | struct Scsi_Host *shost = adapter->scsi_host; | 2336 | struct fsf_qtcb *qtcb; |
2317 | struct fsf_qtcb *qtcb = fsf_req->qtcb; | 2337 | |
2318 | struct fsf_qtcb_bottom_port *bottom, *data; | 2338 | adapter = fsf_req->adapter; |
2339 | qtcb = fsf_req->qtcb; | ||
2319 | 2340 | ||
2320 | if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) | 2341 | if (fsf_req->status & ZFCP_STATUS_FSFREQ_ERROR) |
2321 | return; | 2342 | return; |
2322 | 2343 | ||
2323 | switch (qtcb->header.fsf_status) { | 2344 | switch (qtcb->header.fsf_status) { |
2324 | case FSF_GOOD: | 2345 | case FSF_GOOD: |
2346 | zfcp_fsf_exchange_port_evaluate(fsf_req, 1); | ||
2325 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); | 2347 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); |
2326 | |||
2327 | bottom = &qtcb->bottom.port; | ||
2328 | data = (struct fsf_qtcb_bottom_port*) fsf_req->data; | ||
2329 | if (data) | ||
2330 | memcpy(data, bottom, sizeof(struct fsf_qtcb_bottom_port)); | ||
2331 | if (adapter->connection_features & FSF_FEATURE_NPIV_MODE) | ||
2332 | fc_host_permanent_port_name(shost) = bottom->wwpn; | ||
2333 | else | ||
2334 | fc_host_permanent_port_name(shost) = | ||
2335 | fc_host_port_name(shost); | ||
2336 | fc_host_maxframe_size(shost) = bottom->maximum_frame_size; | ||
2337 | fc_host_supported_speeds(shost) = bottom->supported_speed; | ||
2338 | break; | 2348 | break; |
2339 | |||
2340 | case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE: | 2349 | case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE: |
2350 | zfcp_fsf_exchange_port_evaluate(fsf_req, 0); | ||
2341 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); | 2351 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XPORT_OK, &adapter->status); |
2342 | |||
2343 | zfcp_fsf_link_down_info_eval(adapter, | 2352 | zfcp_fsf_link_down_info_eval(adapter, |
2344 | &qtcb->header.fsf_status_qual.link_down_info); | 2353 | &qtcb->header.fsf_status_qual.link_down_info); |
2345 | break; | 2354 | break; |
2346 | |||
2347 | default: | 2355 | default: |
2348 | debug_text_event(adapter->erp_dbf, 0, "xchg-port-ng"); | 2356 | debug_text_event(adapter->erp_dbf, 0, "xchg-port-ng"); |
2349 | debug_event(adapter->erp_dbf, 0, | 2357 | debug_event(adapter->erp_dbf, 0, |
@@ -4203,11 +4211,11 @@ zfcp_fsf_send_fcp_command_task_handler(struct zfcp_fsf_req *fsf_req) | |||
4203 | ZFCP_LOG_DEBUG("scpnt->result =0x%x\n", scpnt->result); | 4211 | ZFCP_LOG_DEBUG("scpnt->result =0x%x\n", scpnt->result); |
4204 | 4212 | ||
4205 | if (scpnt->result != 0) | 4213 | if (scpnt->result != 0) |
4206 | zfcp_scsi_dbf_event_result("erro", 3, fsf_req->adapter, scpnt); | 4214 | zfcp_scsi_dbf_event_result("erro", 3, fsf_req->adapter, scpnt, fsf_req); |
4207 | else if (scpnt->retries > 0) | 4215 | else if (scpnt->retries > 0) |
4208 | zfcp_scsi_dbf_event_result("retr", 4, fsf_req->adapter, scpnt); | 4216 | zfcp_scsi_dbf_event_result("retr", 4, fsf_req->adapter, scpnt, fsf_req); |
4209 | else | 4217 | else |
4210 | zfcp_scsi_dbf_event_result("norm", 6, fsf_req->adapter, scpnt); | 4218 | zfcp_scsi_dbf_event_result("norm", 6, fsf_req->adapter, scpnt, fsf_req); |
4211 | 4219 | ||
4212 | /* cleanup pointer (need this especially for abort) */ | 4220 | /* cleanup pointer (need this especially for abort) */ |
4213 | scpnt->host_scribble = NULL; | 4221 | scpnt->host_scribble = NULL; |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index e0803757c0fa..9f6b4d7a46f3 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -242,7 +242,7 @@ zfcp_scsi_command_fail(struct scsi_cmnd *scpnt, int result) | |||
242 | if ((scpnt->device != NULL) && (scpnt->device->host != NULL)) | 242 | if ((scpnt->device != NULL) && (scpnt->device->host != NULL)) |
243 | zfcp_scsi_dbf_event_result("fail", 4, | 243 | zfcp_scsi_dbf_event_result("fail", 4, |
244 | (struct zfcp_adapter*) scpnt->device->host->hostdata[0], | 244 | (struct zfcp_adapter*) scpnt->device->host->hostdata[0], |
245 | scpnt); | 245 | scpnt, NULL); |
246 | /* return directly */ | 246 | /* return directly */ |
247 | scpnt->scsi_done(scpnt); | 247 | scpnt->scsi_done(scpnt); |
248 | } | 248 | } |
@@ -446,7 +446,7 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) | |||
446 | old_fsf_req = (struct zfcp_fsf_req *) scpnt->host_scribble; | 446 | old_fsf_req = (struct zfcp_fsf_req *) scpnt->host_scribble; |
447 | if (!old_fsf_req) { | 447 | if (!old_fsf_req) { |
448 | write_unlock_irqrestore(&adapter->abort_lock, flags); | 448 | write_unlock_irqrestore(&adapter->abort_lock, flags); |
449 | zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, new_fsf_req); | 449 | zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, NULL, NULL); |
450 | retval = SUCCESS; | 450 | retval = SUCCESS; |
451 | goto out; | 451 | goto out; |
452 | } | 452 | } |
@@ -460,6 +460,8 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) | |||
460 | adapter, unit, 0); | 460 | adapter, unit, 0); |
461 | if (!new_fsf_req) { | 461 | if (!new_fsf_req) { |
462 | ZFCP_LOG_INFO("error: initiation of Abort FCP Cmnd failed\n"); | 462 | ZFCP_LOG_INFO("error: initiation of Abort FCP Cmnd failed\n"); |
463 | zfcp_scsi_dbf_event_abort("nres", adapter, scpnt, NULL, | ||
464 | old_fsf_req); | ||
463 | retval = FAILED; | 465 | retval = FAILED; |
464 | goto out; | 466 | goto out; |
465 | } | 467 | } |
@@ -470,13 +472,16 @@ zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) | |||
470 | 472 | ||
471 | /* status should be valid since signals were not permitted */ | 473 | /* status should be valid since signals were not permitted */ |
472 | if (new_fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED) { | 474 | if (new_fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED) { |
473 | zfcp_scsi_dbf_event_abort("okay", adapter, scpnt, new_fsf_req); | 475 | zfcp_scsi_dbf_event_abort("okay", adapter, scpnt, new_fsf_req, |
476 | NULL); | ||
474 | retval = SUCCESS; | 477 | retval = SUCCESS; |
475 | } else if (new_fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED) { | 478 | } else if (new_fsf_req->status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED) { |
476 | zfcp_scsi_dbf_event_abort("lte2", adapter, scpnt, new_fsf_req); | 479 | zfcp_scsi_dbf_event_abort("lte2", adapter, scpnt, new_fsf_req, |
480 | NULL); | ||
477 | retval = SUCCESS; | 481 | retval = SUCCESS; |
478 | } else { | 482 | } else { |
479 | zfcp_scsi_dbf_event_abort("fail", adapter, scpnt, new_fsf_req); | 483 | zfcp_scsi_dbf_event_abort("fail", adapter, scpnt, new_fsf_req, |
484 | NULL); | ||
480 | retval = FAILED; | 485 | retval = FAILED; |
481 | } | 486 | } |
482 | zfcp_fsf_req_free(new_fsf_req); | 487 | zfcp_fsf_req_free(new_fsf_req); |
diff --git a/drivers/s390/scsi/zfcp_sysfs_adapter.c b/drivers/s390/scsi/zfcp_sysfs_adapter.c index dfc07370f412..b29ac25e07f3 100644 --- a/drivers/s390/scsi/zfcp_sysfs_adapter.c +++ b/drivers/s390/scsi/zfcp_sysfs_adapter.c | |||
@@ -55,8 +55,6 @@ ZFCP_DEFINE_ADAPTER_ATTR(status, "0x%08x\n", atomic_read(&adapter->status)); | |||
55 | ZFCP_DEFINE_ADAPTER_ATTR(peer_wwnn, "0x%016llx\n", adapter->peer_wwnn); | 55 | ZFCP_DEFINE_ADAPTER_ATTR(peer_wwnn, "0x%016llx\n", adapter->peer_wwnn); |
56 | ZFCP_DEFINE_ADAPTER_ATTR(peer_wwpn, "0x%016llx\n", adapter->peer_wwpn); | 56 | ZFCP_DEFINE_ADAPTER_ATTR(peer_wwpn, "0x%016llx\n", adapter->peer_wwpn); |
57 | ZFCP_DEFINE_ADAPTER_ATTR(peer_d_id, "0x%06x\n", adapter->peer_d_id); | 57 | ZFCP_DEFINE_ADAPTER_ATTR(peer_d_id, "0x%06x\n", adapter->peer_d_id); |
58 | ZFCP_DEFINE_ADAPTER_ATTR(physical_wwpn, "0x%016llx\n", adapter->physical_wwpn); | ||
59 | ZFCP_DEFINE_ADAPTER_ATTR(physical_s_id, "0x%06x\n", adapter->physical_s_id); | ||
60 | ZFCP_DEFINE_ADAPTER_ATTR(card_version, "0x%04x\n", adapter->hydra_version); | 58 | ZFCP_DEFINE_ADAPTER_ATTR(card_version, "0x%04x\n", adapter->hydra_version); |
61 | ZFCP_DEFINE_ADAPTER_ATTR(lic_version, "0x%08x\n", adapter->fsf_lic_version); | 59 | ZFCP_DEFINE_ADAPTER_ATTR(lic_version, "0x%08x\n", adapter->fsf_lic_version); |
62 | ZFCP_DEFINE_ADAPTER_ATTR(hardware_version, "0x%08x\n", | 60 | ZFCP_DEFINE_ADAPTER_ATTR(hardware_version, "0x%08x\n", |
@@ -241,8 +239,6 @@ static struct attribute *zfcp_adapter_attrs[] = { | |||
241 | &dev_attr_peer_wwnn.attr, | 239 | &dev_attr_peer_wwnn.attr, |
242 | &dev_attr_peer_wwpn.attr, | 240 | &dev_attr_peer_wwpn.attr, |
243 | &dev_attr_peer_d_id.attr, | 241 | &dev_attr_peer_d_id.attr, |
244 | &dev_attr_physical_wwpn.attr, | ||
245 | &dev_attr_physical_s_id.attr, | ||
246 | &dev_attr_card_version.attr, | 242 | &dev_attr_card_version.attr, |
247 | &dev_attr_lic_version.attr, | 243 | &dev_attr_lic_version.attr, |
248 | &dev_attr_status.attr, | 244 | &dev_attr_status.attr, |