diff options
| -rw-r--r-- | drivers/s390/scsi/zfcp_ccw.c | 10 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_dbf.c | 32 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 16 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 16 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 65 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 21 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_sysfs_adapter.c | 10 |
7 files changed, 72 insertions, 98 deletions
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index b30abab77da3..0fc46381fc22 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
| @@ -202,19 +202,9 @@ static int | |||
| 202 | zfcp_ccw_set_offline(struct ccw_device *ccw_device) | 202 | zfcp_ccw_set_offline(struct ccw_device *ccw_device) |
| 203 | { | 203 | { |
| 204 | struct zfcp_adapter *adapter; | 204 | struct zfcp_adapter *adapter; |
| 205 | struct zfcp_port *port; | ||
| 206 | struct fc_rport *rport; | ||
| 207 | 205 | ||
| 208 | down(&zfcp_data.config_sema); | 206 | down(&zfcp_data.config_sema); |
| 209 | adapter = dev_get_drvdata(&ccw_device->dev); | 207 | adapter = dev_get_drvdata(&ccw_device->dev); |
| 210 | /* might be racy, but we cannot take config_lock due to the fact that | ||
| 211 | fc_remote_port_delete might sleep */ | ||
| 212 | list_for_each_entry(port, &adapter->port_list_head, list) | ||
| 213 | if (port->rport) { | ||
| 214 | rport = port->rport; | ||
| 215 | port->rport = NULL; | ||
| 216 | fc_remote_port_delete(rport); | ||
| 217 | } | ||
| 218 | zfcp_erp_adapter_shutdown(adapter, 0); | 208 | zfcp_erp_adapter_shutdown(adapter, 0); |
| 219 | zfcp_erp_wait(adapter); | 209 | zfcp_erp_wait(adapter); |
| 220 | zfcp_adapter_scsi_unregister(adapter); | 210 | zfcp_adapter_scsi_unregister(adapter); |
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index 64d9b90373fe..826fb3b00605 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c | |||
| @@ -486,8 +486,7 @@ struct debug_view zfcp_hba_dbf_view = { | |||
| 486 | 486 | ||
| 487 | inline void | 487 | inline void |
| 488 | _zfcp_san_dbf_event_common_ct(const char *tag, struct zfcp_fsf_req *fsf_req, | 488 | _zfcp_san_dbf_event_common_ct(const char *tag, struct zfcp_fsf_req *fsf_req, |
| 489 | fc_id_t s_id, fc_id_t d_id, | 489 | u32 s_id, u32 d_id, void *buffer, int buflen) |
| 490 | void *buffer, int buflen) | ||
| 491 | { | 490 | { |
| 492 | struct zfcp_send_ct *send_ct = (struct zfcp_send_ct *)fsf_req->data; | 491 | struct zfcp_send_ct *send_ct = (struct zfcp_send_ct *)fsf_req->data; |
| 493 | struct zfcp_port *port = send_ct->port; | 492 | struct zfcp_port *port = send_ct->port; |
| @@ -532,9 +531,9 @@ inline void zfcp_san_dbf_event_ct_request(struct zfcp_fsf_req *fsf_req) | |||
| 532 | struct zfcp_port *port = ct->port; | 531 | struct zfcp_port *port = ct->port; |
| 533 | struct zfcp_adapter *adapter = port->adapter; | 532 | struct zfcp_adapter *adapter = port->adapter; |
| 534 | 533 | ||
| 535 | _zfcp_san_dbf_event_common_ct("octc", | 534 | _zfcp_san_dbf_event_common_ct("octc", fsf_req, |
| 536 | fsf_req, adapter->s_id, port->d_id, | 535 | fc_host_port_id(adapter->scsi_host), |
| 537 | zfcp_sg_to_address(ct->req), | 536 | port->d_id, zfcp_sg_to_address(ct->req), |
| 538 | ct->req->length); | 537 | ct->req->length); |
| 539 | } | 538 | } |
| 540 | 539 | ||
| @@ -544,17 +543,16 @@ inline void zfcp_san_dbf_event_ct_response(struct zfcp_fsf_req *fsf_req) | |||
| 544 | struct zfcp_port *port = ct->port; | 543 | struct zfcp_port *port = ct->port; |
| 545 | struct zfcp_adapter *adapter = port->adapter; | 544 | struct zfcp_adapter *adapter = port->adapter; |
| 546 | 545 | ||
| 547 | _zfcp_san_dbf_event_common_ct("rctc", | 546 | _zfcp_san_dbf_event_common_ct("rctc", fsf_req, port->d_id, |
| 548 | fsf_req, port->d_id, adapter->s_id, | 547 | fc_host_port_id(adapter->scsi_host), |
| 549 | zfcp_sg_to_address(ct->resp), | 548 | zfcp_sg_to_address(ct->resp), |
| 550 | ct->resp->length); | 549 | ct->resp->length); |
| 551 | } | 550 | } |
| 552 | 551 | ||
| 553 | static inline void | 552 | static inline void |
| 554 | _zfcp_san_dbf_event_common_els(const char *tag, int level, | 553 | _zfcp_san_dbf_event_common_els(const char *tag, int level, |
| 555 | struct zfcp_fsf_req *fsf_req, | 554 | struct zfcp_fsf_req *fsf_req, u32 s_id, |
| 556 | fc_id_t s_id, fc_id_t d_id, u8 ls_code, | 555 | u32 d_id, u8 ls_code, void *buffer, int buflen) |
| 557 | void *buffer, int buflen) | ||
| 558 | { | 556 | { |
| 559 | struct zfcp_adapter *adapter = fsf_req->adapter; | 557 | struct zfcp_adapter *adapter = fsf_req->adapter; |
| 560 | struct zfcp_san_dbf_record *rec = &adapter->san_dbf_buf; | 558 | struct zfcp_san_dbf_record *rec = &adapter->san_dbf_buf; |
| @@ -597,8 +595,9 @@ inline void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req *fsf_req) | |||
| 597 | { | 595 | { |
| 598 | struct zfcp_send_els *els = (struct zfcp_send_els *)fsf_req->data; | 596 | struct zfcp_send_els *els = (struct zfcp_send_els *)fsf_req->data; |
| 599 | 597 | ||
| 600 | _zfcp_san_dbf_event_common_els("oels", 2, | 598 | _zfcp_san_dbf_event_common_els("oels", 2, fsf_req, |
| 601 | fsf_req, els->adapter->s_id, els->d_id, | 599 | fc_host_port_id(els->adapter->scsi_host), |
| 600 | els->d_id, | ||
| 602 | *(u8 *) zfcp_sg_to_address(els->req), | 601 | *(u8 *) zfcp_sg_to_address(els->req), |
| 603 | zfcp_sg_to_address(els->req), | 602 | zfcp_sg_to_address(els->req), |
| 604 | els->req->length); | 603 | els->req->length); |
| @@ -608,8 +607,8 @@ inline void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *fsf_req) | |||
| 608 | { | 607 | { |
| 609 | struct zfcp_send_els *els = (struct zfcp_send_els *)fsf_req->data; | 608 | struct zfcp_send_els *els = (struct zfcp_send_els *)fsf_req->data; |
| 610 | 609 | ||
| 611 | _zfcp_san_dbf_event_common_els("rels", 2, | 610 | _zfcp_san_dbf_event_common_els("rels", 2, fsf_req, els->d_id, |
| 612 | fsf_req, els->d_id, els->adapter->s_id, | 611 | fc_host_port_id(els->adapter->scsi_host), |
| 613 | *(u8 *) zfcp_sg_to_address(els->req), | 612 | *(u8 *) zfcp_sg_to_address(els->req), |
| 614 | zfcp_sg_to_address(els->resp), | 613 | zfcp_sg_to_address(els->resp), |
| 615 | els->resp->length); | 614 | els->resp->length); |
| @@ -623,9 +622,8 @@ inline void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *fsf_req) | |||
| 623 | int length = (int)status_buffer->length - | 622 | int length = (int)status_buffer->length - |
| 624 | (int)((void *)&status_buffer->payload - (void *)status_buffer); | 623 | (int)((void *)&status_buffer->payload - (void *)status_buffer); |
| 625 | 624 | ||
| 626 | _zfcp_san_dbf_event_common_els("iels", 1, | 625 | _zfcp_san_dbf_event_common_els("iels", 1, fsf_req, status_buffer->d_id, |
| 627 | fsf_req, status_buffer->d_id, | 626 | fc_host_port_id(adapter->scsi_host), |
| 628 | adapter->s_id, | ||
| 629 | *(u8 *) status_buffer->payload, | 627 | *(u8 *) status_buffer->payload, |
| 630 | (void *)status_buffer->payload, length); | 628 | (void *)status_buffer->payload, length); |
| 631 | } | 629 | } |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 4b6af8e07e8d..d81b737d68cc 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
| @@ -165,7 +165,6 @@ typedef u32 scsi_lun_t; | |||
| 165 | /*************** FIBRE CHANNEL PROTOCOL SPECIFIC DEFINES ********************/ | 165 | /*************** FIBRE CHANNEL PROTOCOL SPECIFIC DEFINES ********************/ |
| 166 | 166 | ||
| 167 | typedef unsigned long long wwn_t; | 167 | typedef unsigned long long wwn_t; |
| 168 | typedef unsigned int fc_id_t; | ||
| 169 | typedef unsigned long long fcp_lun_t; | 168 | typedef unsigned long long fcp_lun_t; |
| 170 | /* data length field may be at variable position in FCP-2 FCP_CMND IU */ | 169 | /* data length field may be at variable position in FCP-2 FCP_CMND IU */ |
| 171 | typedef unsigned int fcp_dl_t; | 170 | typedef unsigned int fcp_dl_t; |
| @@ -806,7 +805,7 @@ struct ct_iu_gid_pn_req { | |||
| 806 | /* FS_ACC IU and data unit for GID_PN nameserver request */ | 805 | /* FS_ACC IU and data unit for GID_PN nameserver request */ |
| 807 | struct ct_iu_gid_pn_resp { | 806 | struct ct_iu_gid_pn_resp { |
| 808 | struct ct_hdr header; | 807 | struct ct_hdr header; |
| 809 | fc_id_t d_id; | 808 | u32 d_id; |
| 810 | } __attribute__ ((packed)); | 809 | } __attribute__ ((packed)); |
| 811 | 810 | ||
| 812 | typedef void (*zfcp_send_ct_handler_t)(unsigned long); | 811 | typedef void (*zfcp_send_ct_handler_t)(unsigned long); |
| @@ -872,7 +871,7 @@ typedef void (*zfcp_send_els_handler_t)(unsigned long); | |||
| 872 | struct zfcp_send_els { | 871 | struct zfcp_send_els { |
| 873 | struct zfcp_adapter *adapter; | 872 | struct zfcp_adapter *adapter; |
| 874 | struct zfcp_port *port; | 873 | struct zfcp_port *port; |
| 875 | fc_id_t d_id; | 874 | u32 d_id; |
| 876 | struct scatterlist *req; | 875 | struct scatterlist *req; |
| 877 | struct scatterlist *resp; | 876 | struct scatterlist *resp; |
| 878 | unsigned int req_count; | 877 | unsigned int req_count; |
| @@ -915,24 +914,19 @@ struct zfcp_adapter { | |||
| 915 | atomic_t refcount; /* reference count */ | 914 | atomic_t refcount; /* reference count */ |
| 916 | wait_queue_head_t remove_wq; /* can be used to wait for | 915 | wait_queue_head_t remove_wq; /* can be used to wait for |
| 917 | refcount drop to zero */ | 916 | refcount drop to zero */ |
| 918 | wwn_t wwnn; /* WWNN */ | ||
| 919 | wwn_t wwpn; /* WWPN */ | ||
| 920 | fc_id_t s_id; /* N_Port ID */ | ||
| 921 | wwn_t peer_wwnn; /* P2P peer WWNN */ | 917 | wwn_t peer_wwnn; /* P2P peer WWNN */ |
| 922 | wwn_t peer_wwpn; /* P2P peer WWPN */ | 918 | wwn_t peer_wwpn; /* P2P peer WWPN */ |
| 923 | fc_id_t peer_d_id; /* P2P peer D_ID */ | 919 | u32 peer_d_id; /* P2P peer D_ID */ |
| 924 | wwn_t physical_wwpn; /* WWPN of physical port */ | 920 | wwn_t physical_wwpn; /* WWPN of physical port */ |
| 925 | fc_id_t physical_s_id; /* local FC port ID */ | 921 | u32 physical_s_id; /* local FC port ID */ |
| 926 | struct ccw_device *ccw_device; /* S/390 ccw device */ | 922 | struct ccw_device *ccw_device; /* S/390 ccw device */ |
| 927 | u8 fc_service_class; | 923 | u8 fc_service_class; |
| 928 | u32 fc_topology; /* FC topology */ | 924 | u32 fc_topology; /* FC topology */ |
| 929 | u32 fc_link_speed; /* FC interface speed */ | ||
| 930 | u32 hydra_version; /* Hydra version */ | 925 | u32 hydra_version; /* Hydra version */ |
| 931 | u32 fsf_lic_version; | 926 | u32 fsf_lic_version; |
| 932 | u32 adapter_features; /* FCP channel features */ | 927 | u32 adapter_features; /* FCP channel features */ |
| 933 | u32 connection_features; /* host connection features */ | 928 | u32 connection_features; /* host connection features */ |
| 934 | u32 hardware_version; /* of FCP channel */ | 929 | u32 hardware_version; /* of FCP channel */ |
| 935 | u8 serial_number[32]; /* of hardware */ | ||
| 936 | struct Scsi_Host *scsi_host; /* Pointer to mid-layer */ | 930 | struct Scsi_Host *scsi_host; /* Pointer to mid-layer */ |
| 937 | unsigned short scsi_host_no; /* Assigned host number */ | 931 | unsigned short scsi_host_no; /* Assigned host number */ |
| 938 | unsigned char name[9]; | 932 | unsigned char name[9]; |
| @@ -1006,7 +1000,7 @@ struct zfcp_port { | |||
| 1006 | atomic_t status; /* status of this remote port */ | 1000 | atomic_t status; /* status of this remote port */ |
| 1007 | wwn_t wwnn; /* WWNN if known */ | 1001 | wwn_t wwnn; /* WWNN if known */ |
| 1008 | wwn_t wwpn; /* WWPN */ | 1002 | wwn_t wwpn; /* WWPN */ |
| 1009 | fc_id_t d_id; /* D_ID */ | 1003 | u32 d_id; /* D_ID */ |
| 1010 | u32 handle; /* handle assigned by FSF */ | 1004 | u32 handle; /* handle assigned by FSF */ |
| 1011 | struct zfcp_erp_action erp_action; /* pending error recovery */ | 1005 | struct zfcp_erp_action erp_action; /* pending error recovery */ |
| 1012 | atomic_t erp_counter; | 1006 | atomic_t erp_counter; |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index c4a6799aed44..023f4e558ae4 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
| @@ -346,13 +346,13 @@ zfcp_erp_adisc(struct zfcp_port *port) | |||
| 346 | 346 | ||
| 347 | /* acc. to FC-FS, hard_nport_id in ADISC should not be set for ports | 347 | /* acc. to FC-FS, hard_nport_id in ADISC should not be set for ports |
| 348 | without FC-AL-2 capability, so we don't set it */ | 348 | without FC-AL-2 capability, so we don't set it */ |
| 349 | adisc->wwpn = adapter->wwpn; | 349 | adisc->wwpn = fc_host_port_name(adapter->scsi_host); |
| 350 | adisc->wwnn = adapter->wwnn; | 350 | adisc->wwnn = fc_host_node_name(adapter->scsi_host); |
| 351 | adisc->nport_id = adapter->s_id; | 351 | adisc->nport_id = fc_host_port_id(adapter->scsi_host); |
| 352 | ZFCP_LOG_INFO("ADISC request from s_id 0x%08x to d_id 0x%08x " | 352 | ZFCP_LOG_INFO("ADISC request from s_id 0x%08x to d_id 0x%08x " |
| 353 | "(wwpn=0x%016Lx, wwnn=0x%016Lx, " | 353 | "(wwpn=0x%016Lx, wwnn=0x%016Lx, " |
| 354 | "hard_nport_id=0x%08x, nport_id=0x%08x)\n", | 354 | "hard_nport_id=0x%08x, nport_id=0x%08x)\n", |
| 355 | adapter->s_id, send_els->d_id, (wwn_t) adisc->wwpn, | 355 | adisc->nport_id, send_els->d_id, (wwn_t) adisc->wwpn, |
| 356 | (wwn_t) adisc->wwnn, adisc->hard_nport_id, | 356 | (wwn_t) adisc->wwnn, adisc->hard_nport_id, |
| 357 | adisc->nport_id); | 357 | adisc->nport_id); |
| 358 | 358 | ||
| @@ -405,7 +405,7 @@ zfcp_erp_adisc_handler(unsigned long data) | |||
| 405 | struct zfcp_send_els *send_els; | 405 | struct zfcp_send_els *send_els; |
| 406 | struct zfcp_port *port; | 406 | struct zfcp_port *port; |
| 407 | struct zfcp_adapter *adapter; | 407 | struct zfcp_adapter *adapter; |
| 408 | fc_id_t d_id; | 408 | u32 d_id; |
| 409 | struct zfcp_ls_adisc_acc *adisc; | 409 | struct zfcp_ls_adisc_acc *adisc; |
| 410 | 410 | ||
| 411 | send_els = (struct zfcp_send_els *) data; | 411 | send_els = (struct zfcp_send_els *) data; |
| @@ -436,9 +436,9 @@ zfcp_erp_adisc_handler(unsigned long data) | |||
| 436 | ZFCP_LOG_INFO("ADISC response from d_id 0x%08x to s_id " | 436 | ZFCP_LOG_INFO("ADISC response from d_id 0x%08x to s_id " |
| 437 | "0x%08x (wwpn=0x%016Lx, wwnn=0x%016Lx, " | 437 | "0x%08x (wwpn=0x%016Lx, wwnn=0x%016Lx, " |
| 438 | "hard_nport_id=0x%08x, nport_id=0x%08x)\n", | 438 | "hard_nport_id=0x%08x, nport_id=0x%08x)\n", |
| 439 | d_id, adapter->s_id, (wwn_t) adisc->wwpn, | 439 | d_id, fc_host_port_id(adapter->scsi_host), |
| 440 | (wwn_t) adisc->wwnn, adisc->hard_nport_id, | 440 | (wwn_t) adisc->wwpn, (wwn_t) adisc->wwnn, |
| 441 | adisc->nport_id); | 441 | adisc->hard_nport_id, adisc->nport_id); |
| 442 | 442 | ||
| 443 | /* set wwnn for port */ | 443 | /* set wwnn for port */ |
| 444 | if (port->wwnn == 0) | 444 | if (port->wwnn == 0) |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index f994f453e2d2..3b0fc1163f5f 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
| @@ -1617,7 +1617,7 @@ zfcp_fsf_send_els(struct zfcp_send_els *els) | |||
| 1617 | { | 1617 | { |
| 1618 | volatile struct qdio_buffer_element *sbale; | 1618 | volatile struct qdio_buffer_element *sbale; |
| 1619 | struct zfcp_fsf_req *fsf_req; | 1619 | struct zfcp_fsf_req *fsf_req; |
| 1620 | fc_id_t d_id; | 1620 | u32 d_id; |
| 1621 | struct zfcp_adapter *adapter; | 1621 | struct zfcp_adapter *adapter; |
| 1622 | unsigned long lock_flags; | 1622 | unsigned long lock_flags; |
| 1623 | int bytes; | 1623 | int bytes; |
| @@ -1740,7 +1740,7 @@ static int zfcp_fsf_send_els_handler(struct zfcp_fsf_req *fsf_req) | |||
| 1740 | { | 1740 | { |
| 1741 | struct zfcp_adapter *adapter; | 1741 | struct zfcp_adapter *adapter; |
| 1742 | struct zfcp_port *port; | 1742 | struct zfcp_port *port; |
| 1743 | fc_id_t d_id; | 1743 | u32 d_id; |
| 1744 | struct fsf_qtcb_header *header; | 1744 | struct fsf_qtcb_header *header; |
| 1745 | struct fsf_qtcb_bottom_support *bottom; | 1745 | struct fsf_qtcb_bottom_support *bottom; |
| 1746 | struct zfcp_send_els *send_els; | 1746 | struct zfcp_send_els *send_els; |
| @@ -1978,6 +1978,7 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) | |||
| 1978 | { | 1978 | { |
| 1979 | struct fsf_qtcb_bottom_config *bottom; | 1979 | struct fsf_qtcb_bottom_config *bottom; |
| 1980 | struct zfcp_adapter *adapter = fsf_req->adapter; | 1980 | struct zfcp_adapter *adapter = fsf_req->adapter; |
| 1981 | struct Scsi_Host *shost = adapter->scsi_host; | ||
| 1981 | 1982 | ||
| 1982 | bottom = &fsf_req->qtcb->bottom.config; | 1983 | bottom = &fsf_req->qtcb->bottom.config; |
| 1983 | ZFCP_LOG_DEBUG("low/high QTCB version 0x%x/0x%x of FSF\n", | 1984 | ZFCP_LOG_DEBUG("low/high QTCB version 0x%x/0x%x of FSF\n", |
| @@ -1990,22 +1991,23 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) | |||
| 1990 | adapter->peer_d_id = 0; | 1991 | adapter->peer_d_id = 0; |
| 1991 | 1992 | ||
| 1992 | if (xchg_ok) { | 1993 | if (xchg_ok) { |
| 1993 | adapter->wwnn = bottom->nport_serv_param.wwnn; | 1994 | fc_host_node_name(shost) = bottom->nport_serv_param.wwnn; |
| 1994 | adapter->wwpn = bottom->nport_serv_param.wwpn; | 1995 | fc_host_port_name(shost) = bottom->nport_serv_param.wwpn; |
| 1995 | adapter->s_id = bottom->s_id & ZFCP_DID_MASK; | 1996 | fc_host_port_id(shost) = bottom->s_id & ZFCP_DID_MASK; |
| 1997 | fc_host_speed(shost) = bottom->fc_link_speed; | ||
| 1998 | fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3; | ||
| 1996 | adapter->fc_topology = bottom->fc_topology; | 1999 | adapter->fc_topology = bottom->fc_topology; |
| 1997 | adapter->fc_link_speed = bottom->fc_link_speed; | ||
| 1998 | adapter->hydra_version = bottom->adapter_type; | 2000 | adapter->hydra_version = bottom->adapter_type; |
| 1999 | if (adapter->physical_wwpn == 0) | 2001 | if (adapter->physical_wwpn == 0) |
| 2000 | adapter->physical_wwpn = adapter->wwpn; | 2002 | adapter->physical_wwpn = fc_host_port_name(shost); |
| 2001 | if (adapter->physical_s_id == 0) | 2003 | if (adapter->physical_s_id == 0) |
| 2002 | adapter->physical_s_id = adapter->s_id; | 2004 | adapter->physical_s_id = fc_host_port_id(shost); |
| 2003 | } else { | 2005 | } else { |
| 2004 | adapter->wwnn = 0; | 2006 | fc_host_node_name(shost) = 0; |
| 2005 | adapter->wwpn = 0; | 2007 | fc_host_port_name(shost) = 0; |
| 2006 | adapter->s_id = 0; | 2008 | fc_host_port_id(shost) = 0; |
| 2009 | fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN; | ||
| 2007 | adapter->fc_topology = 0; | 2010 | adapter->fc_topology = 0; |
| 2008 | adapter->fc_link_speed = 0; | ||
| 2009 | adapter->hydra_version = 0; | 2011 | adapter->hydra_version = 0; |
| 2010 | } | 2012 | } |
| 2011 | 2013 | ||
| @@ -2017,24 +2019,26 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) | |||
| 2017 | 2019 | ||
| 2018 | if (adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT) { | 2020 | if (adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT) { |
| 2019 | adapter->hardware_version = bottom->hardware_version; | 2021 | adapter->hardware_version = bottom->hardware_version; |
| 2020 | memcpy(adapter->serial_number, bottom->serial_number, 17); | 2022 | memcpy(fc_host_serial_number(shost), bottom->serial_number, |
| 2021 | EBCASC(adapter->serial_number, sizeof(adapter->serial_number)); | 2023 | min(FC_SERIAL_NUMBER_SIZE, 17)); |
| 2024 | EBCASC(fc_host_serial_number(shost), | ||
| 2025 | min(FC_SERIAL_NUMBER_SIZE, 17)); | ||
| 2022 | } | 2026 | } |
| 2023 | 2027 | ||
| 2024 | ZFCP_LOG_NORMAL("The adapter %s reported the following characteristics:\n" | 2028 | ZFCP_LOG_NORMAL("The adapter %s reported the following characteristics:\n" |
| 2025 | "WWNN 0x%016Lx, " | 2029 | "WWNN 0x%016Lx, " |
| 2026 | "WWPN 0x%016Lx, " | 2030 | "WWPN 0x%016Lx, " |
| 2027 | "S_ID 0x%08x,\n" | 2031 | "S_ID 0x%08x,\n" |
| 2028 | "adapter version 0x%x, " | 2032 | "adapter version 0x%x, " |
| 2029 | "LIC version 0x%x, " | 2033 | "LIC version 0x%x, " |
| 2030 | "FC link speed %d Gb/s\n", | 2034 | "FC link speed %d Gb/s\n", |
| 2031 | zfcp_get_busid_by_adapter(adapter), | 2035 | zfcp_get_busid_by_adapter(adapter), |
| 2032 | adapter->wwnn, | 2036 | (wwn_t) fc_host_node_name(shost), |
| 2033 | adapter->wwpn, | 2037 | (wwn_t) fc_host_port_name(shost), |
| 2034 | (unsigned int) adapter->s_id, | 2038 | fc_host_port_id(shost), |
| 2035 | adapter->hydra_version, | 2039 | adapter->hydra_version, |
| 2036 | adapter->fsf_lic_version, | 2040 | adapter->fsf_lic_version, |
| 2037 | adapter->fc_link_speed); | 2041 | fc_host_speed(shost)); |
| 2038 | if (ZFCP_QTCB_VERSION < bottom->low_qtcb_version) { | 2042 | if (ZFCP_QTCB_VERSION < bottom->low_qtcb_version) { |
| 2039 | ZFCP_LOG_NORMAL("error: the adapter %s " | 2043 | ZFCP_LOG_NORMAL("error: the adapter %s " |
| 2040 | "only supports newer control block " | 2044 | "only supports newer control block " |
| @@ -2055,7 +2059,6 @@ zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *fsf_req, int xchg_ok) | |||
| 2055 | zfcp_erp_adapter_shutdown(adapter, 0); | 2059 | zfcp_erp_adapter_shutdown(adapter, 0); |
| 2056 | return -EIO; | 2060 | return -EIO; |
| 2057 | } | 2061 | } |
| 2058 | zfcp_set_fc_host_attrs(adapter); | ||
| 2059 | return 0; | 2062 | return 0; |
| 2060 | } | 2063 | } |
| 2061 | 2064 | ||
| @@ -2259,6 +2262,7 @@ static void | |||
| 2259 | zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) | 2262 | zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) |
| 2260 | { | 2263 | { |
| 2261 | struct zfcp_adapter *adapter = fsf_req->adapter; | 2264 | struct zfcp_adapter *adapter = fsf_req->adapter; |
| 2265 | struct Scsi_Host *shost = adapter->scsi_host; | ||
| 2262 | struct fsf_qtcb *qtcb = fsf_req->qtcb; | 2266 | struct fsf_qtcb *qtcb = fsf_req->qtcb; |
| 2263 | struct fsf_qtcb_bottom_port *bottom, *data; | 2267 | struct fsf_qtcb_bottom_port *bottom, *data; |
| 2264 | 2268 | ||
| @@ -2277,9 +2281,10 @@ zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *fsf_req) | |||
| 2277 | adapter->physical_wwpn = bottom->wwpn; | 2281 | adapter->physical_wwpn = bottom->wwpn; |
| 2278 | adapter->physical_s_id = bottom->fc_port_id; | 2282 | adapter->physical_s_id = bottom->fc_port_id; |
| 2279 | } else { | 2283 | } else { |
| 2280 | adapter->physical_wwpn = adapter->wwpn; | 2284 | adapter->physical_wwpn = fc_host_port_name(shost); |
| 2281 | adapter->physical_s_id = adapter->s_id; | 2285 | adapter->physical_s_id = fc_host_port_id(shost); |
| 2282 | } | 2286 | } |
| 2287 | fc_host_maxframe_size(shost) = bottom->maximum_frame_size; | ||
| 2283 | break; | 2288 | break; |
| 2284 | 2289 | ||
| 2285 | case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE: | 2290 | case FSF_EXCHANGE_CONFIG_DATA_INCOMPLETE: |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index c1403a23174f..3dcd1bfba3b4 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
| @@ -698,10 +698,16 @@ void | |||
| 698 | zfcp_adapter_scsi_unregister(struct zfcp_adapter *adapter) | 698 | zfcp_adapter_scsi_unregister(struct zfcp_adapter *adapter) |
| 699 | { | 699 | { |
| 700 | struct Scsi_Host *shost; | 700 | struct Scsi_Host *shost; |
| 701 | struct zfcp_port *port; | ||
| 701 | 702 | ||
| 702 | shost = adapter->scsi_host; | 703 | shost = adapter->scsi_host; |
| 703 | if (!shost) | 704 | if (!shost) |
| 704 | return; | 705 | return; |
| 706 | read_lock_irq(&zfcp_data.config_lock); | ||
| 707 | list_for_each_entry(port, &adapter->port_list_head, list) | ||
| 708 | if (port->rport) | ||
| 709 | port->rport = NULL; | ||
| 710 | read_unlock_irq(&zfcp_data.config_lock); | ||
| 705 | fc_remove_host(shost); | 711 | fc_remove_host(shost); |
| 706 | scsi_remove_host(shost); | 712 | scsi_remove_host(shost); |
| 707 | scsi_host_put(shost); | 713 | scsi_host_put(shost); |
| @@ -776,18 +782,6 @@ zfcp_get_node_name(struct scsi_target *starget) | |||
| 776 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); | 782 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); |
| 777 | } | 783 | } |
| 778 | 784 | ||
| 779 | void | ||
| 780 | zfcp_set_fc_host_attrs(struct zfcp_adapter *adapter) | ||
| 781 | { | ||
| 782 | struct Scsi_Host *shost = adapter->scsi_host; | ||
| 783 | |||
| 784 | fc_host_node_name(shost) = adapter->wwnn; | ||
| 785 | fc_host_port_name(shost) = adapter->wwpn; | ||
| 786 | strncpy(fc_host_serial_number(shost), adapter->serial_number, | ||
| 787 | min(FC_SERIAL_NUMBER_SIZE, 32)); | ||
| 788 | fc_host_supported_classes(shost) = FC_COS_CLASS2 | FC_COS_CLASS3; | ||
| 789 | } | ||
| 790 | |||
| 791 | struct fc_function_template zfcp_transport_functions = { | 785 | struct fc_function_template zfcp_transport_functions = { |
| 792 | .get_starget_port_id = zfcp_get_port_id, | 786 | .get_starget_port_id = zfcp_get_port_id, |
| 793 | .get_starget_port_name = zfcp_get_port_name, | 787 | .get_starget_port_name = zfcp_get_port_name, |
| @@ -799,7 +793,10 @@ struct fc_function_template zfcp_transport_functions = { | |||
| 799 | .show_host_node_name = 1, | 793 | .show_host_node_name = 1, |
| 800 | .show_host_port_name = 1, | 794 | .show_host_port_name = 1, |
| 801 | .show_host_supported_classes = 1, | 795 | .show_host_supported_classes = 1, |
| 796 | .show_host_maxframe_size = 1, | ||
| 802 | .show_host_serial_number = 1, | 797 | .show_host_serial_number = 1, |
| 798 | .show_host_speed = 1, | ||
| 799 | .show_host_port_id = 1, | ||
| 803 | }; | 800 | }; |
| 804 | 801 | ||
| 805 | /** | 802 | /** |
diff --git a/drivers/s390/scsi/zfcp_sysfs_adapter.c b/drivers/s390/scsi/zfcp_sysfs_adapter.c index c406ea5c5e95..0cd435280e7d 100644 --- a/drivers/s390/scsi/zfcp_sysfs_adapter.c +++ b/drivers/s390/scsi/zfcp_sysfs_adapter.c | |||
| @@ -62,9 +62,6 @@ static ssize_t zfcp_sysfs_adapter_##_name##_show(struct device *dev, struct devi | |||
| 62 | static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_adapter_##_name##_show, NULL); | 62 | static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_adapter_##_name##_show, NULL); |
| 63 | 63 | ||
| 64 | ZFCP_DEFINE_ADAPTER_ATTR(status, "0x%08x\n", atomic_read(&adapter->status)); | 64 | ZFCP_DEFINE_ADAPTER_ATTR(status, "0x%08x\n", atomic_read(&adapter->status)); |
| 65 | ZFCP_DEFINE_ADAPTER_ATTR(wwnn, "0x%016llx\n", adapter->wwnn); | ||
| 66 | ZFCP_DEFINE_ADAPTER_ATTR(wwpn, "0x%016llx\n", adapter->wwpn); | ||
| 67 | ZFCP_DEFINE_ADAPTER_ATTR(s_id, "0x%06x\n", adapter->s_id); | ||
| 68 | ZFCP_DEFINE_ADAPTER_ATTR(peer_wwnn, "0x%016llx\n", adapter->peer_wwnn); | 65 | ZFCP_DEFINE_ADAPTER_ATTR(peer_wwnn, "0x%016llx\n", adapter->peer_wwnn); |
| 69 | ZFCP_DEFINE_ADAPTER_ATTR(peer_wwpn, "0x%016llx\n", adapter->peer_wwpn); | 66 | ZFCP_DEFINE_ADAPTER_ATTR(peer_wwpn, "0x%016llx\n", adapter->peer_wwpn); |
| 70 | ZFCP_DEFINE_ADAPTER_ATTR(peer_d_id, "0x%06x\n", adapter->peer_d_id); | 67 | ZFCP_DEFINE_ADAPTER_ATTR(peer_d_id, "0x%06x\n", adapter->peer_d_id); |
| @@ -72,13 +69,11 @@ ZFCP_DEFINE_ADAPTER_ATTR(physical_wwpn, "0x%016llx\n", adapter->physical_wwpn); | |||
| 72 | ZFCP_DEFINE_ADAPTER_ATTR(physical_s_id, "0x%06x\n", adapter->physical_s_id); | 69 | ZFCP_DEFINE_ADAPTER_ATTR(physical_s_id, "0x%06x\n", adapter->physical_s_id); |
| 73 | ZFCP_DEFINE_ADAPTER_ATTR(card_version, "0x%04x\n", adapter->hydra_version); | 70 | ZFCP_DEFINE_ADAPTER_ATTR(card_version, "0x%04x\n", adapter->hydra_version); |
| 74 | ZFCP_DEFINE_ADAPTER_ATTR(lic_version, "0x%08x\n", adapter->fsf_lic_version); | 71 | ZFCP_DEFINE_ADAPTER_ATTR(lic_version, "0x%08x\n", adapter->fsf_lic_version); |
| 75 | ZFCP_DEFINE_ADAPTER_ATTR(fc_link_speed, "%d Gb/s\n", adapter->fc_link_speed); | ||
| 76 | ZFCP_DEFINE_ADAPTER_ATTR(fc_service_class, "%d\n", adapter->fc_service_class); | 72 | ZFCP_DEFINE_ADAPTER_ATTR(fc_service_class, "%d\n", adapter->fc_service_class); |
| 77 | ZFCP_DEFINE_ADAPTER_ATTR(fc_topology, "%s\n", | 73 | ZFCP_DEFINE_ADAPTER_ATTR(fc_topology, "%s\n", |
| 78 | fc_topologies[adapter->fc_topology]); | 74 | fc_topologies[adapter->fc_topology]); |
| 79 | ZFCP_DEFINE_ADAPTER_ATTR(hardware_version, "0x%08x\n", | 75 | ZFCP_DEFINE_ADAPTER_ATTR(hardware_version, "0x%08x\n", |
| 80 | adapter->hardware_version); | 76 | adapter->hardware_version); |
| 81 | ZFCP_DEFINE_ADAPTER_ATTR(serial_number, "%17s\n", adapter->serial_number); | ||
| 82 | ZFCP_DEFINE_ADAPTER_ATTR(scsi_host_no, "0x%x\n", adapter->scsi_host_no); | 77 | ZFCP_DEFINE_ADAPTER_ATTR(scsi_host_no, "0x%x\n", adapter->scsi_host_no); |
| 83 | ZFCP_DEFINE_ADAPTER_ATTR(in_recovery, "%d\n", atomic_test_mask | 78 | ZFCP_DEFINE_ADAPTER_ATTR(in_recovery, "%d\n", atomic_test_mask |
| 84 | (ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)); | 79 | (ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)); |
| @@ -257,9 +252,6 @@ static struct attribute *zfcp_adapter_attrs[] = { | |||
| 257 | &dev_attr_in_recovery.attr, | 252 | &dev_attr_in_recovery.attr, |
| 258 | &dev_attr_port_remove.attr, | 253 | &dev_attr_port_remove.attr, |
| 259 | &dev_attr_port_add.attr, | 254 | &dev_attr_port_add.attr, |
| 260 | &dev_attr_wwnn.attr, | ||
| 261 | &dev_attr_wwpn.attr, | ||
| 262 | &dev_attr_s_id.attr, | ||
| 263 | &dev_attr_peer_wwnn.attr, | 255 | &dev_attr_peer_wwnn.attr, |
| 264 | &dev_attr_peer_wwpn.attr, | 256 | &dev_attr_peer_wwpn.attr, |
| 265 | &dev_attr_peer_d_id.attr, | 257 | &dev_attr_peer_d_id.attr, |
| @@ -267,13 +259,11 @@ static struct attribute *zfcp_adapter_attrs[] = { | |||
| 267 | &dev_attr_physical_s_id.attr, | 259 | &dev_attr_physical_s_id.attr, |
| 268 | &dev_attr_card_version.attr, | 260 | &dev_attr_card_version.attr, |
| 269 | &dev_attr_lic_version.attr, | 261 | &dev_attr_lic_version.attr, |
| 270 | &dev_attr_fc_link_speed.attr, | ||
| 271 | &dev_attr_fc_service_class.attr, | 262 | &dev_attr_fc_service_class.attr, |
| 272 | &dev_attr_fc_topology.attr, | 263 | &dev_attr_fc_topology.attr, |
| 273 | &dev_attr_scsi_host_no.attr, | 264 | &dev_attr_scsi_host_no.attr, |
| 274 | &dev_attr_status.attr, | 265 | &dev_attr_status.attr, |
| 275 | &dev_attr_hardware_version.attr, | 266 | &dev_attr_hardware_version.attr, |
| 276 | &dev_attr_serial_number.attr, | ||
| 277 | NULL | 267 | NULL |
| 278 | }; | 268 | }; |
| 279 | 269 | ||
