diff options
Diffstat (limited to 'drivers/s390/scsi/zfcp_aux.c')
-rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 184 |
1 files changed, 2 insertions, 182 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index bfe3ba73bc0f..0b5087f7cabc 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -122,95 +122,6 @@ _zfcp_hex_dump(char *addr, int count) | |||
122 | 122 | ||
123 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_OTHER | 123 | #define ZFCP_LOG_AREA ZFCP_LOG_AREA_OTHER |
124 | 124 | ||
125 | static inline int | ||
126 | zfcp_fsf_req_is_scsi_cmnd(struct zfcp_fsf_req *fsf_req) | ||
127 | { | ||
128 | return ((fsf_req->fsf_command == FSF_QTCB_FCP_CMND) && | ||
129 | !(fsf_req->status & ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT)); | ||
130 | } | ||
131 | |||
132 | void | ||
133 | zfcp_cmd_dbf_event_fsf(const char *text, struct zfcp_fsf_req *fsf_req, | ||
134 | void *add_data, int add_length) | ||
135 | { | ||
136 | struct zfcp_adapter *adapter = fsf_req->adapter; | ||
137 | struct scsi_cmnd *scsi_cmnd; | ||
138 | int level = 3; | ||
139 | int i; | ||
140 | unsigned long flags; | ||
141 | |||
142 | spin_lock_irqsave(&adapter->dbf_lock, flags); | ||
143 | if (zfcp_fsf_req_is_scsi_cmnd(fsf_req)) { | ||
144 | scsi_cmnd = fsf_req->data.send_fcp_command_task.scsi_cmnd; | ||
145 | debug_text_event(adapter->cmd_dbf, level, "fsferror"); | ||
146 | debug_text_event(adapter->cmd_dbf, level, text); | ||
147 | debug_event(adapter->cmd_dbf, level, &fsf_req, | ||
148 | sizeof (unsigned long)); | ||
149 | debug_event(adapter->cmd_dbf, level, &fsf_req->seq_no, | ||
150 | sizeof (u32)); | ||
151 | debug_event(adapter->cmd_dbf, level, &scsi_cmnd, | ||
152 | sizeof (unsigned long)); | ||
153 | debug_event(adapter->cmd_dbf, level, &scsi_cmnd->cmnd, | ||
154 | min(ZFCP_CMD_DBF_LENGTH, (int)scsi_cmnd->cmd_len)); | ||
155 | for (i = 0; i < add_length; i += ZFCP_CMD_DBF_LENGTH) | ||
156 | debug_event(adapter->cmd_dbf, | ||
157 | level, | ||
158 | (char *) add_data + i, | ||
159 | min(ZFCP_CMD_DBF_LENGTH, add_length - i)); | ||
160 | } | ||
161 | spin_unlock_irqrestore(&adapter->dbf_lock, flags); | ||
162 | } | ||
163 | |||
164 | /* XXX additionally log unit if available */ | ||
165 | /* ---> introduce new parameter for unit, see 2.4 code */ | ||
166 | void | ||
167 | zfcp_cmd_dbf_event_scsi(const char *text, struct scsi_cmnd *scsi_cmnd) | ||
168 | { | ||
169 | struct zfcp_adapter *adapter; | ||
170 | union zfcp_req_data *req_data; | ||
171 | struct zfcp_fsf_req *fsf_req; | ||
172 | int level = ((host_byte(scsi_cmnd->result) != 0) ? 1 : 5); | ||
173 | unsigned long flags; | ||
174 | |||
175 | adapter = (struct zfcp_adapter *) scsi_cmnd->device->host->hostdata[0]; | ||
176 | req_data = (union zfcp_req_data *) scsi_cmnd->host_scribble; | ||
177 | fsf_req = (req_data ? req_data->send_fcp_command_task.fsf_req : NULL); | ||
178 | spin_lock_irqsave(&adapter->dbf_lock, flags); | ||
179 | debug_text_event(adapter->cmd_dbf, level, "hostbyte"); | ||
180 | debug_text_event(adapter->cmd_dbf, level, text); | ||
181 | debug_event(adapter->cmd_dbf, level, &scsi_cmnd->result, sizeof (u32)); | ||
182 | debug_event(adapter->cmd_dbf, level, &scsi_cmnd, | ||
183 | sizeof (unsigned long)); | ||
184 | debug_event(adapter->cmd_dbf, level, &scsi_cmnd->cmnd, | ||
185 | min(ZFCP_CMD_DBF_LENGTH, (int)scsi_cmnd->cmd_len)); | ||
186 | if (likely(fsf_req)) { | ||
187 | debug_event(adapter->cmd_dbf, level, &fsf_req, | ||
188 | sizeof (unsigned long)); | ||
189 | debug_event(adapter->cmd_dbf, level, &fsf_req->seq_no, | ||
190 | sizeof (u32)); | ||
191 | } else { | ||
192 | debug_text_event(adapter->cmd_dbf, level, ""); | ||
193 | debug_text_event(adapter->cmd_dbf, level, ""); | ||
194 | } | ||
195 | spin_unlock_irqrestore(&adapter->dbf_lock, flags); | ||
196 | } | ||
197 | |||
198 | void | ||
199 | zfcp_in_els_dbf_event(struct zfcp_adapter *adapter, const char *text, | ||
200 | struct fsf_status_read_buffer *status_buffer, int length) | ||
201 | { | ||
202 | int level = 1; | ||
203 | int i; | ||
204 | |||
205 | debug_text_event(adapter->in_els_dbf, level, text); | ||
206 | debug_event(adapter->in_els_dbf, level, &status_buffer->d_id, 8); | ||
207 | for (i = 0; i < length; i += ZFCP_IN_ELS_DBF_LENGTH) | ||
208 | debug_event(adapter->in_els_dbf, | ||
209 | level, | ||
210 | (char *) status_buffer->payload + i, | ||
211 | min(ZFCP_IN_ELS_DBF_LENGTH, length - i)); | ||
212 | } | ||
213 | |||
214 | /** | 125 | /** |
215 | * zfcp_device_setup - setup function | 126 | * zfcp_device_setup - setup function |
216 | * @str: pointer to parameter string | 127 | * @str: pointer to parameter string |
@@ -1017,81 +928,6 @@ zfcp_free_low_mem_buffers(struct zfcp_adapter *adapter) | |||
1017 | mempool_destroy(adapter->pool.data_gid_pn); | 928 | mempool_destroy(adapter->pool.data_gid_pn); |
1018 | } | 929 | } |
1019 | 930 | ||
1020 | /** | ||
1021 | * zfcp_adapter_debug_register - registers debug feature for an adapter | ||
1022 | * @adapter: pointer to adapter for which debug features should be registered | ||
1023 | * return: -ENOMEM on error, 0 otherwise | ||
1024 | */ | ||
1025 | int | ||
1026 | zfcp_adapter_debug_register(struct zfcp_adapter *adapter) | ||
1027 | { | ||
1028 | char dbf_name[20]; | ||
1029 | |||
1030 | /* debug feature area which records SCSI command failures (hostbyte) */ | ||
1031 | spin_lock_init(&adapter->dbf_lock); | ||
1032 | |||
1033 | sprintf(dbf_name, ZFCP_CMD_DBF_NAME "%s", | ||
1034 | zfcp_get_busid_by_adapter(adapter)); | ||
1035 | adapter->cmd_dbf = debug_register(dbf_name, ZFCP_CMD_DBF_INDEX, | ||
1036 | ZFCP_CMD_DBF_AREAS, | ||
1037 | ZFCP_CMD_DBF_LENGTH); | ||
1038 | debug_register_view(adapter->cmd_dbf, &debug_hex_ascii_view); | ||
1039 | debug_set_level(adapter->cmd_dbf, ZFCP_CMD_DBF_LEVEL); | ||
1040 | |||
1041 | /* debug feature area which records SCSI command aborts */ | ||
1042 | sprintf(dbf_name, ZFCP_ABORT_DBF_NAME "%s", | ||
1043 | zfcp_get_busid_by_adapter(adapter)); | ||
1044 | adapter->abort_dbf = debug_register(dbf_name, ZFCP_ABORT_DBF_INDEX, | ||
1045 | ZFCP_ABORT_DBF_AREAS, | ||
1046 | ZFCP_ABORT_DBF_LENGTH); | ||
1047 | debug_register_view(adapter->abort_dbf, &debug_hex_ascii_view); | ||
1048 | debug_set_level(adapter->abort_dbf, ZFCP_ABORT_DBF_LEVEL); | ||
1049 | |||
1050 | /* debug feature area which records incoming ELS commands */ | ||
1051 | sprintf(dbf_name, ZFCP_IN_ELS_DBF_NAME "%s", | ||
1052 | zfcp_get_busid_by_adapter(adapter)); | ||
1053 | adapter->in_els_dbf = debug_register(dbf_name, ZFCP_IN_ELS_DBF_INDEX, | ||
1054 | ZFCP_IN_ELS_DBF_AREAS, | ||
1055 | ZFCP_IN_ELS_DBF_LENGTH); | ||
1056 | debug_register_view(adapter->in_els_dbf, &debug_hex_ascii_view); | ||
1057 | debug_set_level(adapter->in_els_dbf, ZFCP_IN_ELS_DBF_LEVEL); | ||
1058 | |||
1059 | /* debug feature area which records erp events */ | ||
1060 | sprintf(dbf_name, ZFCP_ERP_DBF_NAME "%s", | ||
1061 | zfcp_get_busid_by_adapter(adapter)); | ||
1062 | adapter->erp_dbf = debug_register(dbf_name, ZFCP_ERP_DBF_INDEX, | ||
1063 | ZFCP_ERP_DBF_AREAS, | ||
1064 | ZFCP_ERP_DBF_LENGTH); | ||
1065 | debug_register_view(adapter->erp_dbf, &debug_hex_ascii_view); | ||
1066 | debug_set_level(adapter->erp_dbf, ZFCP_ERP_DBF_LEVEL); | ||
1067 | |||
1068 | if (!(adapter->cmd_dbf && adapter->abort_dbf && | ||
1069 | adapter->in_els_dbf && adapter->erp_dbf)) { | ||
1070 | zfcp_adapter_debug_unregister(adapter); | ||
1071 | return -ENOMEM; | ||
1072 | } | ||
1073 | |||
1074 | return 0; | ||
1075 | |||
1076 | } | ||
1077 | |||
1078 | /** | ||
1079 | * zfcp_adapter_debug_unregister - unregisters debug feature for an adapter | ||
1080 | * @adapter: pointer to adapter for which debug features should be unregistered | ||
1081 | */ | ||
1082 | void | ||
1083 | zfcp_adapter_debug_unregister(struct zfcp_adapter *adapter) | ||
1084 | { | ||
1085 | debug_unregister(adapter->abort_dbf); | ||
1086 | debug_unregister(adapter->cmd_dbf); | ||
1087 | debug_unregister(adapter->erp_dbf); | ||
1088 | debug_unregister(adapter->in_els_dbf); | ||
1089 | adapter->abort_dbf = NULL; | ||
1090 | adapter->cmd_dbf = NULL; | ||
1091 | adapter->erp_dbf = NULL; | ||
1092 | adapter->in_els_dbf = NULL; | ||
1093 | } | ||
1094 | |||
1095 | void | 931 | void |
1096 | zfcp_dummy_release(struct device *dev) | 932 | zfcp_dummy_release(struct device *dev) |
1097 | { | 933 | { |
@@ -1462,10 +1298,6 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_adapter *adapter, | |||
1462 | /* see FC-FS */ | 1298 | /* see FC-FS */ |
1463 | no_entries = (fcp_rscn_head->payload_len / 4); | 1299 | no_entries = (fcp_rscn_head->payload_len / 4); |
1464 | 1300 | ||
1465 | zfcp_in_els_dbf_event(adapter, "##rscn", status_buffer, | ||
1466 | fcp_rscn_head->payload_len); | ||
1467 | |||
1468 | debug_text_event(adapter->erp_dbf, 1, "unsol_els_rscn:"); | ||
1469 | for (i = 1; i < no_entries; i++) { | 1301 | for (i = 1; i < no_entries; i++) { |
1470 | /* skip head and start with 1st element */ | 1302 | /* skip head and start with 1st element */ |
1471 | fcp_rscn_element++; | 1303 | fcp_rscn_element++; |
@@ -1497,8 +1329,6 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_adapter *adapter, | |||
1497 | (ZFCP_STATUS_PORT_DID_DID, &port->status)) { | 1329 | (ZFCP_STATUS_PORT_DID_DID, &port->status)) { |
1498 | ZFCP_LOG_INFO("incoming RSCN, trying to open " | 1330 | ZFCP_LOG_INFO("incoming RSCN, trying to open " |
1499 | "port 0x%016Lx\n", port->wwpn); | 1331 | "port 0x%016Lx\n", port->wwpn); |
1500 | debug_text_event(adapter->erp_dbf, 1, | ||
1501 | "unsol_els_rscnu:"); | ||
1502 | zfcp_erp_port_reopen(port, | 1332 | zfcp_erp_port_reopen(port, |
1503 | ZFCP_STATUS_COMMON_ERP_FAILED); | 1333 | ZFCP_STATUS_COMMON_ERP_FAILED); |
1504 | continue; | 1334 | continue; |
@@ -1524,8 +1354,6 @@ zfcp_fsf_incoming_els_rscn(struct zfcp_adapter *adapter, | |||
1524 | */ | 1354 | */ |
1525 | ZFCP_LOG_INFO("incoming RSCN, trying to open " | 1355 | ZFCP_LOG_INFO("incoming RSCN, trying to open " |
1526 | "port 0x%016Lx\n", port->wwpn); | 1356 | "port 0x%016Lx\n", port->wwpn); |
1527 | debug_text_event(adapter->erp_dbf, 1, | ||
1528 | "unsol_els_rscnk:"); | ||
1529 | zfcp_test_link(port); | 1357 | zfcp_test_link(port); |
1530 | } | 1358 | } |
1531 | } | 1359 | } |
@@ -1541,8 +1369,6 @@ zfcp_fsf_incoming_els_plogi(struct zfcp_adapter *adapter, | |||
1541 | struct zfcp_port *port; | 1369 | struct zfcp_port *port; |
1542 | unsigned long flags; | 1370 | unsigned long flags; |
1543 | 1371 | ||
1544 | zfcp_in_els_dbf_event(adapter, "##plogi", status_buffer, 28); | ||
1545 | |||
1546 | read_lock_irqsave(&zfcp_data.config_lock, flags); | 1372 | read_lock_irqsave(&zfcp_data.config_lock, flags); |
1547 | list_for_each_entry(port, &adapter->port_list_head, list) { | 1373 | list_for_each_entry(port, &adapter->port_list_head, list) { |
1548 | if (port->wwpn == (*(wwn_t *) & els_logi->nport_wwn)) | 1374 | if (port->wwpn == (*(wwn_t *) & els_logi->nport_wwn)) |
@@ -1556,8 +1382,6 @@ zfcp_fsf_incoming_els_plogi(struct zfcp_adapter *adapter, | |||
1556 | status_buffer->d_id, | 1382 | status_buffer->d_id, |
1557 | zfcp_get_busid_by_adapter(adapter)); | 1383 | zfcp_get_busid_by_adapter(adapter)); |
1558 | } else { | 1384 | } else { |
1559 | debug_text_event(adapter->erp_dbf, 1, "unsol_els_plogi:"); | ||
1560 | debug_event(adapter->erp_dbf, 1, &els_logi->nport_wwn, 8); | ||
1561 | zfcp_erp_port_forced_reopen(port, 0); | 1385 | zfcp_erp_port_forced_reopen(port, 0); |
1562 | } | 1386 | } |
1563 | } | 1387 | } |
@@ -1570,8 +1394,6 @@ zfcp_fsf_incoming_els_logo(struct zfcp_adapter *adapter, | |||
1570 | struct zfcp_port *port; | 1394 | struct zfcp_port *port; |
1571 | unsigned long flags; | 1395 | unsigned long flags; |
1572 | 1396 | ||
1573 | zfcp_in_els_dbf_event(adapter, "##logo", status_buffer, 16); | ||
1574 | |||
1575 | read_lock_irqsave(&zfcp_data.config_lock, flags); | 1397 | read_lock_irqsave(&zfcp_data.config_lock, flags); |
1576 | list_for_each_entry(port, &adapter->port_list_head, list) { | 1398 | list_for_each_entry(port, &adapter->port_list_head, list) { |
1577 | if (port->wwpn == els_logo->nport_wwpn) | 1399 | if (port->wwpn == els_logo->nport_wwpn) |
@@ -1585,8 +1407,6 @@ zfcp_fsf_incoming_els_logo(struct zfcp_adapter *adapter, | |||
1585 | status_buffer->d_id, | 1407 | status_buffer->d_id, |
1586 | zfcp_get_busid_by_adapter(adapter)); | 1408 | zfcp_get_busid_by_adapter(adapter)); |
1587 | } else { | 1409 | } else { |
1588 | debug_text_event(adapter->erp_dbf, 1, "unsol_els_logo:"); | ||
1589 | debug_event(adapter->erp_dbf, 1, &els_logo->nport_wwpn, 8); | ||
1590 | zfcp_erp_port_forced_reopen(port, 0); | 1410 | zfcp_erp_port_forced_reopen(port, 0); |
1591 | } | 1411 | } |
1592 | } | 1412 | } |
@@ -1595,7 +1415,6 @@ static void | |||
1595 | zfcp_fsf_incoming_els_unknown(struct zfcp_adapter *adapter, | 1415 | zfcp_fsf_incoming_els_unknown(struct zfcp_adapter *adapter, |
1596 | struct fsf_status_read_buffer *status_buffer) | 1416 | struct fsf_status_read_buffer *status_buffer) |
1597 | { | 1417 | { |
1598 | zfcp_in_els_dbf_event(adapter, "##undef", status_buffer, 24); | ||
1599 | ZFCP_LOG_NORMAL("warning: unknown incoming ELS 0x%08x " | 1418 | ZFCP_LOG_NORMAL("warning: unknown incoming ELS 0x%08x " |
1600 | "for adapter %s\n", *(u32 *) (status_buffer->payload), | 1419 | "for adapter %s\n", *(u32 *) (status_buffer->payload), |
1601 | zfcp_get_busid_by_adapter(adapter)); | 1420 | zfcp_get_busid_by_adapter(adapter)); |
@@ -1609,10 +1428,11 @@ zfcp_fsf_incoming_els(struct zfcp_fsf_req *fsf_req) | |||
1609 | u32 els_type; | 1428 | u32 els_type; |
1610 | struct zfcp_adapter *adapter; | 1429 | struct zfcp_adapter *adapter; |
1611 | 1430 | ||
1612 | status_buffer = fsf_req->data.status_read.buffer; | 1431 | status_buffer = (struct fsf_status_read_buffer *) fsf_req->data; |
1613 | els_type = *(u32 *) (status_buffer->payload); | 1432 | els_type = *(u32 *) (status_buffer->payload); |
1614 | adapter = fsf_req->adapter; | 1433 | adapter = fsf_req->adapter; |
1615 | 1434 | ||
1435 | zfcp_san_dbf_event_incoming_els(fsf_req); | ||
1616 | if (els_type == LS_PLOGI) | 1436 | if (els_type == LS_PLOGI) |
1617 | zfcp_fsf_incoming_els_plogi(adapter, status_buffer); | 1437 | zfcp_fsf_incoming_els_plogi(adapter, status_buffer); |
1618 | else if (els_type == LS_LOGO) | 1438 | else if (els_type == LS_LOGO) |