diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 9 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ccw.c | 14 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_cfdc.c | 8 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_dbf.c | 1177 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_dbf.h | 497 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 141 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 52 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fc.c | 20 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 113 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 10 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 43 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs.c | 9 |
12 files changed, 745 insertions, 1348 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 044fb22718d2..51c666fb67a4 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -45,8 +45,8 @@ static char *init_device; | |||
45 | module_param_named(device, init_device, charp, 0400); | 45 | module_param_named(device, init_device, charp, 0400); |
46 | MODULE_PARM_DESC(device, "specify initial device"); | 46 | MODULE_PARM_DESC(device, "specify initial device"); |
47 | 47 | ||
48 | static struct kmem_cache *zfcp_cache_hw_align(const char *name, | 48 | static struct kmem_cache * __init zfcp_cache_hw_align(const char *name, |
49 | unsigned long size) | 49 | unsigned long size) |
50 | { | 50 | { |
51 | return kmem_cache_create(name, size, roundup_pow_of_two(size), 0, NULL); | 51 | return kmem_cache_create(name, size, roundup_pow_of_two(size), 0, NULL); |
52 | } | 52 | } |
@@ -311,8 +311,7 @@ int zfcp_status_read_refill(struct zfcp_adapter *adapter) | |||
311 | if (zfcp_fsf_status_read(adapter->qdio)) { | 311 | if (zfcp_fsf_status_read(adapter->qdio)) { |
312 | if (atomic_read(&adapter->stat_miss) >= | 312 | if (atomic_read(&adapter->stat_miss) >= |
313 | adapter->stat_read_buf_num) { | 313 | adapter->stat_read_buf_num) { |
314 | zfcp_erp_adapter_reopen(adapter, 0, "axsref1", | 314 | zfcp_erp_adapter_reopen(adapter, 0, "axsref1"); |
315 | NULL); | ||
316 | return 1; | 315 | return 1; |
317 | } | 316 | } |
318 | break; | 317 | break; |
@@ -459,7 +458,7 @@ void zfcp_adapter_unregister(struct zfcp_adapter *adapter) | |||
459 | sysfs_remove_group(&cdev->dev.kobj, &zfcp_sysfs_adapter_attrs); | 458 | sysfs_remove_group(&cdev->dev.kobj, &zfcp_sysfs_adapter_attrs); |
460 | 459 | ||
461 | zfcp_erp_thread_kill(adapter); | 460 | zfcp_erp_thread_kill(adapter); |
462 | zfcp_dbf_adapter_unregister(adapter->dbf); | 461 | zfcp_dbf_adapter_unregister(adapter); |
463 | zfcp_qdio_destroy(adapter->qdio); | 462 | zfcp_qdio_destroy(adapter->qdio); |
464 | 463 | ||
465 | zfcp_ccw_adapter_put(adapter); /* final put to release */ | 464 | zfcp_ccw_adapter_put(adapter); /* final put to release */ |
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index 0833c2b51e39..4f7852dd30c7 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
@@ -48,7 +48,7 @@ static int zfcp_ccw_activate(struct ccw_device *cdev) | |||
48 | 48 | ||
49 | zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING); | 49 | zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING); |
50 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, | 50 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, |
51 | "ccresu2", NULL); | 51 | "ccresu2"); |
52 | zfcp_erp_wait(adapter); | 52 | zfcp_erp_wait(adapter); |
53 | flush_work(&adapter->scan_work); | 53 | flush_work(&adapter->scan_work); |
54 | 54 | ||
@@ -182,7 +182,7 @@ static int zfcp_ccw_set_offline(struct ccw_device *cdev) | |||
182 | if (!adapter) | 182 | if (!adapter) |
183 | return 0; | 183 | return 0; |
184 | 184 | ||
185 | zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1", NULL); | 185 | zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1"); |
186 | zfcp_erp_wait(adapter); | 186 | zfcp_erp_wait(adapter); |
187 | 187 | ||
188 | zfcp_ccw_adapter_put(adapter); | 188 | zfcp_ccw_adapter_put(adapter); |
@@ -207,24 +207,24 @@ static int zfcp_ccw_notify(struct ccw_device *cdev, int event) | |||
207 | switch (event) { | 207 | switch (event) { |
208 | case CIO_GONE: | 208 | case CIO_GONE: |
209 | dev_warn(&cdev->dev, "The FCP device has been detached\n"); | 209 | dev_warn(&cdev->dev, "The FCP device has been detached\n"); |
210 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti1", NULL); | 210 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti1"); |
211 | break; | 211 | break; |
212 | case CIO_NO_PATH: | 212 | case CIO_NO_PATH: |
213 | dev_warn(&cdev->dev, | 213 | dev_warn(&cdev->dev, |
214 | "The CHPID for the FCP device is offline\n"); | 214 | "The CHPID for the FCP device is offline\n"); |
215 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti2", NULL); | 215 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti2"); |
216 | break; | 216 | break; |
217 | case CIO_OPER: | 217 | case CIO_OPER: |
218 | dev_info(&cdev->dev, "The FCP device is operational again\n"); | 218 | dev_info(&cdev->dev, "The FCP device is operational again\n"); |
219 | zfcp_erp_set_adapter_status(adapter, | 219 | zfcp_erp_set_adapter_status(adapter, |
220 | ZFCP_STATUS_COMMON_RUNNING); | 220 | ZFCP_STATUS_COMMON_RUNNING); |
221 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, | 221 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, |
222 | "ccnoti4", NULL); | 222 | "ccnoti4"); |
223 | break; | 223 | break; |
224 | case CIO_BOXED: | 224 | case CIO_BOXED: |
225 | dev_warn(&cdev->dev, "The FCP device did not respond within " | 225 | dev_warn(&cdev->dev, "The FCP device did not respond within " |
226 | "the specified time\n"); | 226 | "the specified time\n"); |
227 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti5", NULL); | 227 | zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti5"); |
228 | break; | 228 | break; |
229 | } | 229 | } |
230 | 230 | ||
@@ -243,7 +243,7 @@ static void zfcp_ccw_shutdown(struct ccw_device *cdev) | |||
243 | if (!adapter) | 243 | if (!adapter) |
244 | return; | 244 | return; |
245 | 245 | ||
246 | zfcp_erp_adapter_shutdown(adapter, 0, "ccshut1", NULL); | 246 | zfcp_erp_adapter_shutdown(adapter, 0, "ccshut1"); |
247 | zfcp_erp_wait(adapter); | 247 | zfcp_erp_wait(adapter); |
248 | zfcp_erp_thread_kill(adapter); | 248 | zfcp_erp_thread_kill(adapter); |
249 | 249 | ||
diff --git a/drivers/s390/scsi/zfcp_cfdc.c b/drivers/s390/scsi/zfcp_cfdc.c index d692e229ecba..46342fee394d 100644 --- a/drivers/s390/scsi/zfcp_cfdc.c +++ b/drivers/s390/scsi/zfcp_cfdc.c | |||
@@ -288,7 +288,7 @@ void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter *adapter) | |||
288 | (status & ZFCP_STATUS_COMMON_ACCESS_BOXED)) | 288 | (status & ZFCP_STATUS_COMMON_ACCESS_BOXED)) |
289 | zfcp_erp_port_reopen(port, | 289 | zfcp_erp_port_reopen(port, |
290 | ZFCP_STATUS_COMMON_ERP_FAILED, | 290 | ZFCP_STATUS_COMMON_ERP_FAILED, |
291 | "cfaac_1", NULL); | 291 | "cfaac_1"); |
292 | } | 292 | } |
293 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | 293 | read_unlock_irqrestore(&adapter->port_list_lock, flags); |
294 | 294 | ||
@@ -299,7 +299,7 @@ void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter *adapter) | |||
299 | (status & ZFCP_STATUS_COMMON_ACCESS_BOXED)) | 299 | (status & ZFCP_STATUS_COMMON_ACCESS_BOXED)) |
300 | zfcp_erp_lun_reopen(sdev, | 300 | zfcp_erp_lun_reopen(sdev, |
301 | ZFCP_STATUS_COMMON_ERP_FAILED, | 301 | ZFCP_STATUS_COMMON_ERP_FAILED, |
302 | "cfaac_2", NULL); | 302 | "cfaac_2"); |
303 | } | 303 | } |
304 | } | 304 | } |
305 | 305 | ||
@@ -426,7 +426,7 @@ int zfcp_cfdc_open_lun_eval(struct scsi_device *sdev, | |||
426 | zfcp_scsi_dev_lun(sdev), | 426 | zfcp_scsi_dev_lun(sdev), |
427 | (unsigned long long)zfcp_sdev->port->wwpn); | 427 | (unsigned long long)zfcp_sdev->port->wwpn); |
428 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ERP_FAILED); | 428 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ERP_FAILED); |
429 | zfcp_erp_lun_shutdown(sdev, 0, "fsouh_6", NULL); | 429 | zfcp_erp_lun_shutdown(sdev, 0, "fsouh_6"); |
430 | return -EACCES; | 430 | return -EACCES; |
431 | } | 431 | } |
432 | 432 | ||
@@ -437,7 +437,7 @@ int zfcp_cfdc_open_lun_eval(struct scsi_device *sdev, | |||
437 | zfcp_scsi_dev_lun(sdev), | 437 | zfcp_scsi_dev_lun(sdev), |
438 | (unsigned long long)zfcp_sdev->port->wwpn); | 438 | (unsigned long long)zfcp_sdev->port->wwpn); |
439 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ERP_FAILED); | 439 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ERP_FAILED); |
440 | zfcp_erp_lun_shutdown(sdev, 0, "fsosh_8", NULL); | 440 | zfcp_erp_lun_shutdown(sdev, 0, "fsosh_8"); |
441 | return -EACCES; | 441 | return -EACCES; |
442 | } | 442 | } |
443 | 443 | ||
diff --git a/drivers/s390/scsi/zfcp_dbf.c b/drivers/s390/scsi/zfcp_dbf.c index 2cdd6b28ff7f..96d1462e0bf5 100644 --- a/drivers/s390/scsi/zfcp_dbf.c +++ b/drivers/s390/scsi/zfcp_dbf.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Debug traces for zfcp. | 4 | * Debug traces for zfcp. |
5 | * | 5 | * |
6 | * Copyright IBM Corporation 2002, 2009 | 6 | * Copyright IBM Corporation 2002, 2010 |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #define KMSG_COMPONENT "zfcp" | 9 | #define KMSG_COMPONENT "zfcp" |
@@ -22,980 +22,392 @@ module_param(dbfsize, uint, 0400); | |||
22 | MODULE_PARM_DESC(dbfsize, | 22 | MODULE_PARM_DESC(dbfsize, |
23 | "number of pages for each debug feature area (default 4)"); | 23 | "number of pages for each debug feature area (default 4)"); |
24 | 24 | ||
25 | static void zfcp_dbf_hexdump(debug_info_t *dbf, void *to, int to_len, | 25 | static inline unsigned int zfcp_dbf_plen(unsigned int offset) |
26 | int level, char *from, int from_len) | ||
27 | { | 26 | { |
28 | int offset; | 27 | return sizeof(struct zfcp_dbf_pay) + offset - ZFCP_DBF_PAY_MAX_REC; |
29 | struct zfcp_dbf_dump *dump = to; | ||
30 | int room = to_len - sizeof(*dump); | ||
31 | |||
32 | for (offset = 0; offset < from_len; offset += dump->size) { | ||
33 | memset(to, 0, to_len); | ||
34 | strncpy(dump->tag, "dump", ZFCP_DBF_TAG_SIZE); | ||
35 | dump->total_size = from_len; | ||
36 | dump->offset = offset; | ||
37 | dump->size = min(from_len - offset, room); | ||
38 | memcpy(dump->data, from + offset, dump->size); | ||
39 | debug_event(dbf, level, dump, dump->size + sizeof(*dump)); | ||
40 | } | ||
41 | } | 28 | } |
42 | 29 | ||
43 | static void zfcp_dbf_tag(char **p, const char *label, const char *tag) | 30 | static inline |
31 | void zfcp_dbf_pl_write(struct zfcp_dbf *dbf, void *data, u16 length, char *area, | ||
32 | u64 req_id) | ||
44 | { | 33 | { |
45 | int i; | 34 | struct zfcp_dbf_pay *pl = &dbf->pay_buf; |
46 | 35 | u16 offset = 0, rec_length; | |
47 | *p += sprintf(*p, "%-24s", label); | ||
48 | for (i = 0; i < ZFCP_DBF_TAG_SIZE; i++) | ||
49 | *p += sprintf(*p, "%c", tag[i]); | ||
50 | *p += sprintf(*p, "\n"); | ||
51 | } | ||
52 | 36 | ||
53 | static void zfcp_dbf_outs(char **buf, const char *s1, const char *s2) | 37 | spin_lock(&dbf->pay_lock); |
54 | { | 38 | memset(pl, 0, sizeof(*pl)); |
55 | *buf += sprintf(*buf, "%-24s%s\n", s1, s2); | 39 | pl->fsf_req_id = req_id; |
56 | } | 40 | memcpy(pl->area, area, ZFCP_DBF_TAG_LEN); |
57 | 41 | ||
58 | static void zfcp_dbf_out(char **buf, const char *s, const char *format, ...) | 42 | while (offset < length) { |
59 | { | 43 | rec_length = min((u16) ZFCP_DBF_PAY_MAX_REC, |
60 | va_list arg; | 44 | (u16) (length - offset)); |
45 | memcpy(pl->data, data + offset, rec_length); | ||
46 | debug_event(dbf->pay, 1, pl, zfcp_dbf_plen(rec_length)); | ||
61 | 47 | ||
62 | *buf += sprintf(*buf, "%-24s", s); | 48 | offset += rec_length; |
63 | va_start(arg, format); | 49 | pl->counter++; |
64 | *buf += vsprintf(*buf, format, arg); | ||
65 | va_end(arg); | ||
66 | *buf += sprintf(*buf, "\n"); | ||
67 | } | ||
68 | |||
69 | static void zfcp_dbf_outd(char **p, const char *label, char *buffer, | ||
70 | int buflen, int offset, int total_size) | ||
71 | { | ||
72 | if (!offset) | ||
73 | *p += sprintf(*p, "%-24s ", label); | ||
74 | while (buflen--) { | ||
75 | if (offset > 0) { | ||
76 | if ((offset % 32) == 0) | ||
77 | *p += sprintf(*p, "\n%-24c ", ' '); | ||
78 | else if ((offset % 4) == 0) | ||
79 | *p += sprintf(*p, " "); | ||
80 | } | ||
81 | *p += sprintf(*p, "%02x", *buffer++); | ||
82 | if (++offset == total_size) { | ||
83 | *p += sprintf(*p, "\n"); | ||
84 | break; | ||
85 | } | ||
86 | } | 50 | } |
87 | if (!total_size) | ||
88 | *p += sprintf(*p, "\n"); | ||
89 | } | ||
90 | 51 | ||
91 | static int zfcp_dbf_view_header(debug_info_t *id, struct debug_view *view, | 52 | spin_unlock(&dbf->pay_lock); |
92 | int area, debug_entry_t *entry, char *out_buf) | ||
93 | { | ||
94 | struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)DEBUG_DATA(entry); | ||
95 | struct timespec t; | ||
96 | char *p = out_buf; | ||
97 | |||
98 | if (strncmp(dump->tag, "dump", ZFCP_DBF_TAG_SIZE) != 0) { | ||
99 | stck_to_timespec(entry->id.stck, &t); | ||
100 | zfcp_dbf_out(&p, "timestamp", "%011lu:%06lu", | ||
101 | t.tv_sec, t.tv_nsec); | ||
102 | zfcp_dbf_out(&p, "cpu", "%02i", entry->id.fields.cpuid); | ||
103 | } else { | ||
104 | zfcp_dbf_outd(&p, "", dump->data, dump->size, dump->offset, | ||
105 | dump->total_size); | ||
106 | if ((dump->offset + dump->size) == dump->total_size) | ||
107 | p += sprintf(p, "\n"); | ||
108 | } | ||
109 | return p - out_buf; | ||
110 | } | 53 | } |
111 | 54 | ||
112 | void _zfcp_dbf_hba_fsf_response(const char *tag2, int level, | 55 | /** |
113 | struct zfcp_fsf_req *fsf_req, | 56 | * zfcp_dbf_hba_fsf_res - trace event for fsf responses |
114 | struct zfcp_dbf *dbf) | 57 | * @tag: tag indicating which kind of unsolicited status has been received |
58 | * @req: request for which a response was received | ||
59 | */ | ||
60 | void zfcp_dbf_hba_fsf_res(char *tag, struct zfcp_fsf_req *req) | ||
115 | { | 61 | { |
116 | struct fsf_qtcb *qtcb = fsf_req->qtcb; | 62 | struct zfcp_dbf *dbf = req->adapter->dbf; |
117 | union fsf_prot_status_qual *prot_status_qual = | 63 | struct fsf_qtcb_prefix *q_pref = &req->qtcb->prefix; |
118 | &qtcb->prefix.prot_status_qual; | 64 | struct fsf_qtcb_header *q_head = &req->qtcb->header; |
119 | union fsf_status_qual *fsf_status_qual = &qtcb->header.fsf_status_qual; | 65 | struct zfcp_dbf_hba *rec = &dbf->hba_buf; |
120 | struct scsi_cmnd *scsi_cmnd; | ||
121 | struct zfcp_port *port; | ||
122 | struct zfcp_unit *unit; | ||
123 | struct zfcp_send_els *send_els; | ||
124 | struct zfcp_dbf_hba_record *rec = &dbf->hba_buf; | ||
125 | struct zfcp_dbf_hba_record_response *response = &rec->u.response; | ||
126 | unsigned long flags; | 66 | unsigned long flags; |
127 | 67 | ||
128 | spin_lock_irqsave(&dbf->hba_lock, flags); | 68 | spin_lock_irqsave(&dbf->hba_lock, flags); |
129 | memset(rec, 0, sizeof(*rec)); | 69 | memset(rec, 0, sizeof(*rec)); |
130 | strncpy(rec->tag, "resp", ZFCP_DBF_TAG_SIZE); | ||
131 | strncpy(rec->tag2, tag2, ZFCP_DBF_TAG_SIZE); | ||
132 | |||
133 | response->fsf_command = fsf_req->fsf_command; | ||
134 | response->fsf_reqid = fsf_req->req_id; | ||
135 | response->fsf_seqno = fsf_req->seq_no; | ||
136 | response->fsf_issued = fsf_req->issued; | ||
137 | response->fsf_prot_status = qtcb->prefix.prot_status; | ||
138 | response->fsf_status = qtcb->header.fsf_status; | ||
139 | memcpy(response->fsf_prot_status_qual, | ||
140 | prot_status_qual, FSF_PROT_STATUS_QUAL_SIZE); | ||
141 | memcpy(response->fsf_status_qual, | ||
142 | fsf_status_qual, FSF_STATUS_QUALIFIER_SIZE); | ||
143 | response->fsf_req_status = fsf_req->status; | ||
144 | response->sbal_first = fsf_req->qdio_req.sbal_first; | ||
145 | response->sbal_last = fsf_req->qdio_req.sbal_last; | ||
146 | response->sbal_response = fsf_req->qdio_req.sbal_response; | ||
147 | response->pool = fsf_req->pool != NULL; | ||
148 | response->erp_action = (unsigned long)fsf_req->erp_action; | ||
149 | |||
150 | switch (fsf_req->fsf_command) { | ||
151 | case FSF_QTCB_FCP_CMND: | ||
152 | if (fsf_req->status & ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT) | ||
153 | break; | ||
154 | scsi_cmnd = (struct scsi_cmnd *)fsf_req->data; | ||
155 | if (scsi_cmnd) { | ||
156 | response->u.fcp.cmnd = (unsigned long)scsi_cmnd; | ||
157 | response->u.fcp.data_dir = | ||
158 | qtcb->bottom.io.data_direction; | ||
159 | } | ||
160 | break; | ||
161 | |||
162 | case FSF_QTCB_OPEN_PORT_WITH_DID: | ||
163 | case FSF_QTCB_CLOSE_PORT: | ||
164 | case FSF_QTCB_CLOSE_PHYSICAL_PORT: | ||
165 | port = (struct zfcp_port *)fsf_req->data; | ||
166 | response->u.port.wwpn = port->wwpn; | ||
167 | response->u.port.d_id = port->d_id; | ||
168 | response->u.port.port_handle = qtcb->header.port_handle; | ||
169 | break; | ||
170 | |||
171 | case FSF_QTCB_OPEN_LUN: | ||
172 | case FSF_QTCB_CLOSE_LUN: | ||
173 | unit = (struct zfcp_unit *)fsf_req->data; | ||
174 | port = unit->port; | ||
175 | response->u.unit.wwpn = port->wwpn; | ||
176 | response->u.unit.fcp_lun = unit->fcp_lun; | ||
177 | response->u.unit.port_handle = qtcb->header.port_handle; | ||
178 | response->u.unit.lun_handle = qtcb->header.lun_handle; | ||
179 | break; | ||
180 | |||
181 | case FSF_QTCB_SEND_ELS: | ||
182 | send_els = (struct zfcp_send_els *)fsf_req->data; | ||
183 | response->u.els.d_id = ntoh24(qtcb->bottom.support.d_id); | ||
184 | break; | ||
185 | |||
186 | case FSF_QTCB_ABORT_FCP_CMND: | ||
187 | case FSF_QTCB_SEND_GENERIC: | ||
188 | case FSF_QTCB_EXCHANGE_CONFIG_DATA: | ||
189 | case FSF_QTCB_EXCHANGE_PORT_DATA: | ||
190 | case FSF_QTCB_DOWNLOAD_CONTROL_FILE: | ||
191 | case FSF_QTCB_UPLOAD_CONTROL_FILE: | ||
192 | break; | ||
193 | } | ||
194 | |||
195 | debug_event(dbf->hba, level, rec, sizeof(*rec)); | ||
196 | 70 | ||
197 | /* have fcp channel microcode fixed to use as little as possible */ | 71 | memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); |
198 | if (fsf_req->fsf_command != FSF_QTCB_FCP_CMND) { | 72 | rec->id = ZFCP_DBF_HBA_RES; |
199 | /* adjust length skipping trailing zeros */ | 73 | rec->fsf_req_id = req->req_id; |
200 | char *buf = (char *)qtcb + qtcb->header.log_start; | 74 | rec->fsf_req_status = req->status; |
201 | int len = qtcb->header.log_length; | 75 | rec->fsf_cmd = req->fsf_command; |
202 | for (; len && !buf[len - 1]; len--); | 76 | rec->fsf_seq_no = req->seq_no; |
203 | zfcp_dbf_hexdump(dbf->hba, rec, sizeof(*rec), level, buf, | 77 | rec->u.res.req_issued = req->issued; |
204 | len); | 78 | rec->u.res.prot_status = q_pref->prot_status; |
79 | rec->u.res.fsf_status = q_head->fsf_status; | ||
80 | |||
81 | memcpy(rec->u.res.prot_status_qual, &q_pref->prot_status_qual, | ||
82 | FSF_PROT_STATUS_QUAL_SIZE); | ||
83 | memcpy(rec->u.res.fsf_status_qual, &q_head->fsf_status_qual, | ||
84 | FSF_STATUS_QUALIFIER_SIZE); | ||
85 | |||
86 | if (req->fsf_command != FSF_QTCB_FCP_CMND) { | ||
87 | rec->pl_len = q_head->log_length; | ||
88 | zfcp_dbf_pl_write(dbf, (char *)q_pref + q_head->log_start, | ||
89 | rec->pl_len, "fsf_res", req->req_id); | ||
205 | } | 90 | } |
206 | 91 | ||
207 | spin_unlock_irqrestore(&dbf->hba_lock, flags); | 92 | debug_event(dbf->hba, 1, rec, sizeof(*rec)); |
208 | } | ||
209 | |||
210 | void _zfcp_dbf_hba_fsf_unsol(const char *tag, int level, struct zfcp_dbf *dbf, | ||
211 | struct fsf_status_read_buffer *status_buffer) | ||
212 | { | ||
213 | struct zfcp_dbf_hba_record *rec = &dbf->hba_buf; | ||
214 | unsigned long flags; | ||
215 | |||
216 | spin_lock_irqsave(&dbf->hba_lock, flags); | ||
217 | memset(rec, 0, sizeof(*rec)); | ||
218 | strncpy(rec->tag, "stat", ZFCP_DBF_TAG_SIZE); | ||
219 | strncpy(rec->tag2, tag, ZFCP_DBF_TAG_SIZE); | ||
220 | |||
221 | rec->u.status.failed = atomic_read(&dbf->adapter->stat_miss); | ||
222 | if (status_buffer != NULL) { | ||
223 | rec->u.status.status_type = status_buffer->status_type; | ||
224 | rec->u.status.status_subtype = status_buffer->status_subtype; | ||
225 | memcpy(&rec->u.status.queue_designator, | ||
226 | &status_buffer->queue_designator, | ||
227 | sizeof(struct fsf_queue_designator)); | ||
228 | |||
229 | switch (status_buffer->status_type) { | ||
230 | case FSF_STATUS_READ_SENSE_DATA_AVAIL: | ||
231 | rec->u.status.payload_size = | ||
232 | ZFCP_DBF_UNSOL_PAYLOAD_SENSE_DATA_AVAIL; | ||
233 | break; | ||
234 | |||
235 | case FSF_STATUS_READ_BIT_ERROR_THRESHOLD: | ||
236 | rec->u.status.payload_size = | ||
237 | ZFCP_DBF_UNSOL_PAYLOAD_BIT_ERROR_THRESHOLD; | ||
238 | break; | ||
239 | |||
240 | case FSF_STATUS_READ_LINK_DOWN: | ||
241 | switch (status_buffer->status_subtype) { | ||
242 | case FSF_STATUS_READ_SUB_NO_PHYSICAL_LINK: | ||
243 | case FSF_STATUS_READ_SUB_FDISC_FAILED: | ||
244 | rec->u.status.payload_size = | ||
245 | sizeof(struct fsf_link_down_info); | ||
246 | } | ||
247 | break; | ||
248 | |||
249 | case FSF_STATUS_READ_FEATURE_UPDATE_ALERT: | ||
250 | rec->u.status.payload_size = | ||
251 | ZFCP_DBF_UNSOL_PAYLOAD_FEATURE_UPDATE_ALERT; | ||
252 | break; | ||
253 | } | ||
254 | memcpy(&rec->u.status.payload, | ||
255 | &status_buffer->payload, rec->u.status.payload_size); | ||
256 | } | ||
257 | |||
258 | debug_event(dbf->hba, level, rec, sizeof(*rec)); | ||
259 | spin_unlock_irqrestore(&dbf->hba_lock, flags); | 93 | spin_unlock_irqrestore(&dbf->hba_lock, flags); |
260 | } | 94 | } |
261 | 95 | ||
262 | /** | 96 | /** |
263 | * zfcp_dbf_hba_qdio - trace event for QDIO related failure | 97 | * zfcp_dbf_hba_fsf_uss - trace event for an unsolicited status buffer |
264 | * @qdio: qdio structure affected by this QDIO related event | 98 | * @tag: tag indicating which kind of unsolicited status has been received |
265 | * @qdio_error: as passed by qdio module | 99 | * @req: request providing the unsolicited status |
266 | * @sbal_index: first buffer with error condition, as passed by qdio module | ||
267 | * @sbal_count: number of buffers affected, as passed by qdio module | ||
268 | */ | 100 | */ |
269 | void zfcp_dbf_hba_qdio(struct zfcp_dbf *dbf, unsigned int qdio_error, | 101 | void zfcp_dbf_hba_fsf_uss(char *tag, struct zfcp_fsf_req *req) |
270 | int sbal_index, int sbal_count) | ||
271 | { | 102 | { |
272 | struct zfcp_dbf_hba_record *r = &dbf->hba_buf; | 103 | struct zfcp_dbf *dbf = req->adapter->dbf; |
104 | struct fsf_status_read_buffer *srb = req->data; | ||
105 | struct zfcp_dbf_hba *rec = &dbf->hba_buf; | ||
273 | unsigned long flags; | 106 | unsigned long flags; |
274 | 107 | ||
275 | spin_lock_irqsave(&dbf->hba_lock, flags); | 108 | spin_lock_irqsave(&dbf->hba_lock, flags); |
276 | memset(r, 0, sizeof(*r)); | 109 | memset(rec, 0, sizeof(*rec)); |
277 | strncpy(r->tag, "qdio", ZFCP_DBF_TAG_SIZE); | 110 | |
278 | r->u.qdio.qdio_error = qdio_error; | 111 | memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); |
279 | r->u.qdio.sbal_index = sbal_index; | 112 | rec->id = ZFCP_DBF_HBA_USS; |
280 | r->u.qdio.sbal_count = sbal_count; | 113 | rec->fsf_req_id = req->req_id; |
281 | debug_event(dbf->hba, 0, r, sizeof(*r)); | 114 | rec->fsf_req_status = req->status; |
115 | rec->fsf_cmd = req->fsf_command; | ||
116 | |||
117 | if (!srb) | ||
118 | goto log; | ||
119 | |||
120 | rec->u.uss.status_type = srb->status_type; | ||
121 | rec->u.uss.status_subtype = srb->status_subtype; | ||
122 | rec->u.uss.d_id = ntoh24(srb->d_id); | ||
123 | rec->u.uss.lun = srb->fcp_lun; | ||
124 | memcpy(&rec->u.uss.queue_designator, &srb->queue_designator, | ||
125 | sizeof(rec->u.uss.queue_designator)); | ||
126 | |||
127 | /* status read buffer payload length */ | ||
128 | rec->pl_len = (!srb->length) ? 0 : srb->length - | ||
129 | offsetof(struct fsf_status_read_buffer, payload); | ||
130 | |||
131 | if (rec->pl_len) | ||
132 | zfcp_dbf_pl_write(dbf, srb->payload.data, rec->pl_len, | ||
133 | "fsf_uss", req->req_id); | ||
134 | log: | ||
135 | debug_event(dbf->hba, 2, rec, sizeof(*rec)); | ||
282 | spin_unlock_irqrestore(&dbf->hba_lock, flags); | 136 | spin_unlock_irqrestore(&dbf->hba_lock, flags); |
283 | } | 137 | } |
284 | 138 | ||
285 | /** | 139 | /** |
286 | * zfcp_dbf_hba_berr - trace event for bit error threshold | 140 | * zfcp_dbf_hba_bit_err - trace event for bit error conditions |
287 | * @dbf: dbf structure affected by this QDIO related event | 141 | * @tag: tag indicating which kind of unsolicited status has been received |
288 | * @req: fsf request | 142 | * @req: request which caused the bit_error condition |
289 | */ | 143 | */ |
290 | void zfcp_dbf_hba_berr(struct zfcp_dbf *dbf, struct zfcp_fsf_req *req) | 144 | void zfcp_dbf_hba_bit_err(char *tag, struct zfcp_fsf_req *req) |
291 | { | 145 | { |
292 | struct zfcp_dbf_hba_record *r = &dbf->hba_buf; | 146 | struct zfcp_dbf *dbf = req->adapter->dbf; |
147 | struct zfcp_dbf_hba *rec = &dbf->hba_buf; | ||
293 | struct fsf_status_read_buffer *sr_buf = req->data; | 148 | struct fsf_status_read_buffer *sr_buf = req->data; |
294 | struct fsf_bit_error_payload *err = &sr_buf->payload.bit_error; | ||
295 | unsigned long flags; | 149 | unsigned long flags; |
296 | 150 | ||
297 | spin_lock_irqsave(&dbf->hba_lock, flags); | 151 | spin_lock_irqsave(&dbf->hba_lock, flags); |
298 | memset(r, 0, sizeof(*r)); | 152 | memset(rec, 0, sizeof(*rec)); |
299 | strncpy(r->tag, "berr", ZFCP_DBF_TAG_SIZE); | ||
300 | memcpy(&r->u.berr, err, sizeof(struct fsf_bit_error_payload)); | ||
301 | debug_event(dbf->hba, 0, r, sizeof(*r)); | ||
302 | spin_unlock_irqrestore(&dbf->hba_lock, flags); | ||
303 | } | ||
304 | static void zfcp_dbf_hba_view_response(char **p, | ||
305 | struct zfcp_dbf_hba_record_response *r) | ||
306 | { | ||
307 | struct timespec t; | ||
308 | |||
309 | zfcp_dbf_out(p, "fsf_command", "0x%08x", r->fsf_command); | ||
310 | zfcp_dbf_out(p, "fsf_reqid", "0x%0Lx", r->fsf_reqid); | ||
311 | zfcp_dbf_out(p, "fsf_seqno", "0x%08x", r->fsf_seqno); | ||
312 | stck_to_timespec(r->fsf_issued, &t); | ||
313 | zfcp_dbf_out(p, "fsf_issued", "%011lu:%06lu", t.tv_sec, t.tv_nsec); | ||
314 | zfcp_dbf_out(p, "fsf_prot_status", "0x%08x", r->fsf_prot_status); | ||
315 | zfcp_dbf_out(p, "fsf_status", "0x%08x", r->fsf_status); | ||
316 | zfcp_dbf_outd(p, "fsf_prot_status_qual", r->fsf_prot_status_qual, | ||
317 | FSF_PROT_STATUS_QUAL_SIZE, 0, FSF_PROT_STATUS_QUAL_SIZE); | ||
318 | zfcp_dbf_outd(p, "fsf_status_qual", r->fsf_status_qual, | ||
319 | FSF_STATUS_QUALIFIER_SIZE, 0, FSF_STATUS_QUALIFIER_SIZE); | ||
320 | zfcp_dbf_out(p, "fsf_req_status", "0x%08x", r->fsf_req_status); | ||
321 | zfcp_dbf_out(p, "sbal_first", "0x%02x", r->sbal_first); | ||
322 | zfcp_dbf_out(p, "sbal_last", "0x%02x", r->sbal_last); | ||
323 | zfcp_dbf_out(p, "sbal_response", "0x%02x", r->sbal_response); | ||
324 | zfcp_dbf_out(p, "pool", "0x%02x", r->pool); | ||
325 | |||
326 | switch (r->fsf_command) { | ||
327 | case FSF_QTCB_FCP_CMND: | ||
328 | if (r->fsf_req_status & ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT) | ||
329 | break; | ||
330 | zfcp_dbf_out(p, "data_direction", "0x%04x", r->u.fcp.data_dir); | ||
331 | zfcp_dbf_out(p, "scsi_cmnd", "0x%0Lx", r->u.fcp.cmnd); | ||
332 | *p += sprintf(*p, "\n"); | ||
333 | break; | ||
334 | |||
335 | case FSF_QTCB_OPEN_PORT_WITH_DID: | ||
336 | case FSF_QTCB_CLOSE_PORT: | ||
337 | case FSF_QTCB_CLOSE_PHYSICAL_PORT: | ||
338 | zfcp_dbf_out(p, "wwpn", "0x%016Lx", r->u.port.wwpn); | ||
339 | zfcp_dbf_out(p, "d_id", "0x%06x", r->u.port.d_id); | ||
340 | zfcp_dbf_out(p, "port_handle", "0x%08x", r->u.port.port_handle); | ||
341 | break; | ||
342 | |||
343 | case FSF_QTCB_OPEN_LUN: | ||
344 | case FSF_QTCB_CLOSE_LUN: | ||
345 | zfcp_dbf_out(p, "wwpn", "0x%016Lx", r->u.unit.wwpn); | ||
346 | zfcp_dbf_out(p, "fcp_lun", "0x%016Lx", r->u.unit.fcp_lun); | ||
347 | zfcp_dbf_out(p, "port_handle", "0x%08x", r->u.unit.port_handle); | ||
348 | zfcp_dbf_out(p, "lun_handle", "0x%08x", r->u.unit.lun_handle); | ||
349 | break; | ||
350 | |||
351 | case FSF_QTCB_SEND_ELS: | ||
352 | zfcp_dbf_out(p, "d_id", "0x%06x", r->u.els.d_id); | ||
353 | break; | ||
354 | |||
355 | case FSF_QTCB_ABORT_FCP_CMND: | ||
356 | case FSF_QTCB_SEND_GENERIC: | ||
357 | case FSF_QTCB_EXCHANGE_CONFIG_DATA: | ||
358 | case FSF_QTCB_EXCHANGE_PORT_DATA: | ||
359 | case FSF_QTCB_DOWNLOAD_CONTROL_FILE: | ||
360 | case FSF_QTCB_UPLOAD_CONTROL_FILE: | ||
361 | break; | ||
362 | } | ||
363 | } | ||
364 | |||
365 | static void zfcp_dbf_hba_view_status(char **p, | ||
366 | struct zfcp_dbf_hba_record_status *r) | ||
367 | { | ||
368 | zfcp_dbf_out(p, "failed", "0x%02x", r->failed); | ||
369 | zfcp_dbf_out(p, "status_type", "0x%08x", r->status_type); | ||
370 | zfcp_dbf_out(p, "status_subtype", "0x%08x", r->status_subtype); | ||
371 | zfcp_dbf_outd(p, "queue_designator", (char *)&r->queue_designator, | ||
372 | sizeof(struct fsf_queue_designator), 0, | ||
373 | sizeof(struct fsf_queue_designator)); | ||
374 | zfcp_dbf_outd(p, "payload", (char *)&r->payload, r->payload_size, 0, | ||
375 | r->payload_size); | ||
376 | } | ||
377 | |||
378 | static void zfcp_dbf_hba_view_qdio(char **p, struct zfcp_dbf_hba_record_qdio *r) | ||
379 | { | ||
380 | zfcp_dbf_out(p, "qdio_error", "0x%08x", r->qdio_error); | ||
381 | zfcp_dbf_out(p, "sbal_index", "0x%02x", r->sbal_index); | ||
382 | zfcp_dbf_out(p, "sbal_count", "0x%02x", r->sbal_count); | ||
383 | } | ||
384 | 153 | ||
385 | static void zfcp_dbf_hba_view_berr(char **p, struct fsf_bit_error_payload *r) | 154 | memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); |
386 | { | 155 | rec->id = ZFCP_DBF_HBA_BIT; |
387 | zfcp_dbf_out(p, "link_failures", "%d", r->link_failure_error_count); | 156 | rec->fsf_req_id = req->req_id; |
388 | zfcp_dbf_out(p, "loss_of_sync_err", "%d", r->loss_of_sync_error_count); | 157 | rec->fsf_req_status = req->status; |
389 | zfcp_dbf_out(p, "loss_of_sig_err", "%d", r->loss_of_signal_error_count); | 158 | rec->fsf_cmd = req->fsf_command; |
390 | zfcp_dbf_out(p, "prim_seq_err", "%d", | 159 | memcpy(&rec->u.be, &sr_buf->payload.bit_error, |
391 | r->primitive_sequence_error_count); | 160 | sizeof(struct fsf_bit_error_payload)); |
392 | zfcp_dbf_out(p, "inval_trans_word_err", "%d", | ||
393 | r->invalid_transmission_word_error_count); | ||
394 | zfcp_dbf_out(p, "CRC_errors", "%d", r->crc_error_count); | ||
395 | zfcp_dbf_out(p, "prim_seq_event_to", "%d", | ||
396 | r->primitive_sequence_event_timeout_count); | ||
397 | zfcp_dbf_out(p, "elast_buf_overrun_err", "%d", | ||
398 | r->elastic_buffer_overrun_error_count); | ||
399 | zfcp_dbf_out(p, "adv_rec_buf2buf_cred", "%d", | ||
400 | r->advertised_receive_b2b_credit); | ||
401 | zfcp_dbf_out(p, "curr_rec_buf2buf_cred", "%d", | ||
402 | r->current_receive_b2b_credit); | ||
403 | zfcp_dbf_out(p, "adv_trans_buf2buf_cred", "%d", | ||
404 | r->advertised_transmit_b2b_credit); | ||
405 | zfcp_dbf_out(p, "curr_trans_buf2buf_cred", "%d", | ||
406 | r->current_transmit_b2b_credit); | ||
407 | } | ||
408 | 161 | ||
409 | static int zfcp_dbf_hba_view_format(debug_info_t *id, struct debug_view *view, | 162 | debug_event(dbf->hba, 1, rec, sizeof(*rec)); |
410 | char *out_buf, const char *in_buf) | 163 | spin_unlock_irqrestore(&dbf->hba_lock, flags); |
411 | { | ||
412 | struct zfcp_dbf_hba_record *r = (struct zfcp_dbf_hba_record *)in_buf; | ||
413 | char *p = out_buf; | ||
414 | |||
415 | if (strncmp(r->tag, "dump", ZFCP_DBF_TAG_SIZE) == 0) | ||
416 | return 0; | ||
417 | |||
418 | zfcp_dbf_tag(&p, "tag", r->tag); | ||
419 | if (isalpha(r->tag2[0])) | ||
420 | zfcp_dbf_tag(&p, "tag2", r->tag2); | ||
421 | |||
422 | if (strncmp(r->tag, "resp", ZFCP_DBF_TAG_SIZE) == 0) | ||
423 | zfcp_dbf_hba_view_response(&p, &r->u.response); | ||
424 | else if (strncmp(r->tag, "stat", ZFCP_DBF_TAG_SIZE) == 0) | ||
425 | zfcp_dbf_hba_view_status(&p, &r->u.status); | ||
426 | else if (strncmp(r->tag, "qdio", ZFCP_DBF_TAG_SIZE) == 0) | ||
427 | zfcp_dbf_hba_view_qdio(&p, &r->u.qdio); | ||
428 | else if (strncmp(r->tag, "berr", ZFCP_DBF_TAG_SIZE) == 0) | ||
429 | zfcp_dbf_hba_view_berr(&p, &r->u.berr); | ||
430 | |||
431 | if (strncmp(r->tag, "resp", ZFCP_DBF_TAG_SIZE) != 0) | ||
432 | p += sprintf(p, "\n"); | ||
433 | return p - out_buf; | ||
434 | } | 164 | } |
435 | 165 | ||
436 | static struct debug_view zfcp_dbf_hba_view = { | 166 | static void zfcp_dbf_set_common(struct zfcp_dbf_rec *rec, |
437 | .name = "structured", | 167 | struct zfcp_adapter *adapter, |
438 | .header_proc = zfcp_dbf_view_header, | 168 | struct zfcp_port *port, |
439 | .format_proc = zfcp_dbf_hba_view_format, | 169 | struct scsi_device *sdev) |
440 | }; | ||
441 | |||
442 | static const char *zfcp_dbf_rec_tags[] = { | ||
443 | [ZFCP_REC_DBF_ID_THREAD] = "thread", | ||
444 | [ZFCP_REC_DBF_ID_TARGET] = "target", | ||
445 | [ZFCP_REC_DBF_ID_TRIGGER] = "trigger", | ||
446 | [ZFCP_REC_DBF_ID_ACTION] = "action", | ||
447 | }; | ||
448 | |||
449 | static int zfcp_dbf_rec_view_format(debug_info_t *id, struct debug_view *view, | ||
450 | char *buf, const char *_rec) | ||
451 | { | 170 | { |
452 | struct zfcp_dbf_rec_record *r = (struct zfcp_dbf_rec_record *)_rec; | 171 | rec->adapter_status = atomic_read(&adapter->status); |
453 | char *p = buf; | 172 | if (port) { |
454 | char hint[ZFCP_DBF_ID_SIZE + 1]; | 173 | rec->port_status = atomic_read(&port->status); |
455 | 174 | rec->wwpn = port->wwpn; | |
456 | memcpy(hint, r->id2, ZFCP_DBF_ID_SIZE); | 175 | rec->d_id = port->d_id; |
457 | hint[ZFCP_DBF_ID_SIZE] = 0; | 176 | } |
458 | zfcp_dbf_outs(&p, "tag", zfcp_dbf_rec_tags[r->id]); | 177 | if (sdev) { |
459 | zfcp_dbf_outs(&p, "hint", hint); | 178 | rec->lun_status = atomic_read(&sdev_to_zfcp(sdev)->status); |
460 | switch (r->id) { | 179 | rec->lun = zfcp_scsi_dev_lun(sdev); |
461 | case ZFCP_REC_DBF_ID_THREAD: | ||
462 | zfcp_dbf_out(&p, "total", "%d", r->u.thread.total); | ||
463 | zfcp_dbf_out(&p, "ready", "%d", r->u.thread.ready); | ||
464 | zfcp_dbf_out(&p, "running", "%d", r->u.thread.running); | ||
465 | break; | ||
466 | case ZFCP_REC_DBF_ID_TARGET: | ||
467 | zfcp_dbf_out(&p, "reference", "0x%016Lx", r->u.target.ref); | ||
468 | zfcp_dbf_out(&p, "status", "0x%08x", r->u.target.status); | ||
469 | zfcp_dbf_out(&p, "erp_count", "%d", r->u.target.erp_count); | ||
470 | zfcp_dbf_out(&p, "d_id", "0x%06x", r->u.target.d_id); | ||
471 | zfcp_dbf_out(&p, "wwpn", "0x%016Lx", r->u.target.wwpn); | ||
472 | zfcp_dbf_out(&p, "fcp_lun", "0x%016Lx", r->u.target.fcp_lun); | ||
473 | break; | ||
474 | case ZFCP_REC_DBF_ID_TRIGGER: | ||
475 | zfcp_dbf_out(&p, "reference", "0x%016Lx", r->u.trigger.ref); | ||
476 | zfcp_dbf_out(&p, "erp_action", "0x%016Lx", r->u.trigger.action); | ||
477 | zfcp_dbf_out(&p, "requested", "%d", r->u.trigger.want); | ||
478 | zfcp_dbf_out(&p, "executed", "%d", r->u.trigger.need); | ||
479 | zfcp_dbf_out(&p, "wwpn", "0x%016Lx", r->u.trigger.wwpn); | ||
480 | zfcp_dbf_out(&p, "fcp_lun", "0x%016Lx", r->u.trigger.fcp_lun); | ||
481 | zfcp_dbf_out(&p, "adapter_status", "0x%08x", r->u.trigger.as); | ||
482 | zfcp_dbf_out(&p, "port_status", "0x%08x", r->u.trigger.ps); | ||
483 | zfcp_dbf_out(&p, "lun_status", "0x%08x", r->u.trigger.ls); | ||
484 | break; | ||
485 | case ZFCP_REC_DBF_ID_ACTION: | ||
486 | zfcp_dbf_out(&p, "erp_action", "0x%016Lx", r->u.action.action); | ||
487 | zfcp_dbf_out(&p, "fsf_req", "0x%016Lx", r->u.action.fsf_req); | ||
488 | zfcp_dbf_out(&p, "status", "0x%08Lx", r->u.action.status); | ||
489 | zfcp_dbf_out(&p, "step", "0x%08Lx", r->u.action.step); | ||
490 | break; | ||
491 | } | 180 | } |
492 | p += sprintf(p, "\n"); | ||
493 | return p - buf; | ||
494 | } | 181 | } |
495 | 182 | ||
496 | static struct debug_view zfcp_dbf_rec_view = { | ||
497 | .name = "structured", | ||
498 | .header_proc = zfcp_dbf_view_header, | ||
499 | .format_proc = zfcp_dbf_rec_view_format, | ||
500 | }; | ||
501 | |||
502 | /** | 183 | /** |
503 | * zfcp_dbf_rec_thread - trace event related to recovery thread operation | 184 | * zfcp_dbf_rec_trig - trace event related to triggered recovery |
504 | * @id2: identifier for event | 185 | * @tag: identifier for event |
505 | * @dbf: reference to dbf structure | 186 | * @adapter: adapter on which the erp_action should run |
506 | * This function assumes that the caller is holding erp_lock. | 187 | * @port: remote port involved in the erp_action |
188 | * @sdev: scsi device involved in the erp_action | ||
189 | * @want: wanted erp_action | ||
190 | * @need: required erp_action | ||
191 | * | ||
192 | * The adapter->erp_lock has to be held. | ||
507 | */ | 193 | */ |
508 | void zfcp_dbf_rec_thread(char *id2, struct zfcp_dbf *dbf) | 194 | void zfcp_dbf_rec_trig(char *tag, struct zfcp_adapter *adapter, |
195 | struct zfcp_port *port, struct scsi_device *sdev, | ||
196 | u8 want, u8 need) | ||
509 | { | 197 | { |
510 | struct zfcp_adapter *adapter = dbf->adapter; | 198 | struct zfcp_dbf *dbf = adapter->dbf; |
511 | struct zfcp_dbf_rec_record *r = &dbf->rec_buf; | 199 | struct zfcp_dbf_rec *rec = &dbf->rec_buf; |
512 | unsigned long flags = 0; | ||
513 | struct list_head *entry; | 200 | struct list_head *entry; |
514 | unsigned ready = 0, running = 0, total; | ||
515 | |||
516 | list_for_each(entry, &adapter->erp_ready_head) | ||
517 | ready++; | ||
518 | list_for_each(entry, &adapter->erp_running_head) | ||
519 | running++; | ||
520 | total = adapter->erp_total_count; | ||
521 | |||
522 | spin_lock_irqsave(&dbf->rec_lock, flags); | ||
523 | memset(r, 0, sizeof(*r)); | ||
524 | r->id = ZFCP_REC_DBF_ID_THREAD; | ||
525 | memcpy(r->id2, id2, ZFCP_DBF_ID_SIZE); | ||
526 | r->u.thread.total = total; | ||
527 | r->u.thread.ready = ready; | ||
528 | r->u.thread.running = running; | ||
529 | debug_event(dbf->rec, 6, r, sizeof(*r)); | ||
530 | spin_unlock_irqrestore(&dbf->rec_lock, flags); | ||
531 | } | ||
532 | |||
533 | /** | ||
534 | * zfcp_dbf_rec_thread - trace event related to recovery thread operation | ||
535 | * @id2: identifier for event | ||
536 | * @adapter: adapter | ||
537 | * This function assumes that the caller does not hold erp_lock. | ||
538 | */ | ||
539 | void zfcp_dbf_rec_thread_lock(char *id2, struct zfcp_dbf *dbf) | ||
540 | { | ||
541 | struct zfcp_adapter *adapter = dbf->adapter; | ||
542 | unsigned long flags; | ||
543 | |||
544 | read_lock_irqsave(&adapter->erp_lock, flags); | ||
545 | zfcp_dbf_rec_thread(id2, dbf); | ||
546 | read_unlock_irqrestore(&adapter->erp_lock, flags); | ||
547 | } | ||
548 | |||
549 | static void zfcp_dbf_rec_target(char *id2, void *ref, struct zfcp_dbf *dbf, | ||
550 | atomic_t *status, atomic_t *erp_count, u64 wwpn, | ||
551 | u32 d_id, u64 fcp_lun) | ||
552 | { | ||
553 | struct zfcp_dbf_rec_record *r = &dbf->rec_buf; | ||
554 | unsigned long flags; | 201 | unsigned long flags; |
555 | 202 | ||
556 | spin_lock_irqsave(&dbf->rec_lock, flags); | 203 | spin_lock_irqsave(&dbf->rec_lock, flags); |
557 | memset(r, 0, sizeof(*r)); | 204 | memset(rec, 0, sizeof(*rec)); |
558 | r->id = ZFCP_REC_DBF_ID_TARGET; | ||
559 | memcpy(r->id2, id2, ZFCP_DBF_ID_SIZE); | ||
560 | r->u.target.ref = (unsigned long)ref; | ||
561 | r->u.target.status = atomic_read(status); | ||
562 | r->u.target.wwpn = wwpn; | ||
563 | r->u.target.d_id = d_id; | ||
564 | r->u.target.fcp_lun = fcp_lun; | ||
565 | r->u.target.erp_count = atomic_read(erp_count); | ||
566 | debug_event(dbf->rec, 3, r, sizeof(*r)); | ||
567 | spin_unlock_irqrestore(&dbf->rec_lock, flags); | ||
568 | } | ||
569 | |||
570 | /** | ||
571 | * zfcp_dbf_rec_adapter - trace event for adapter state change | ||
572 | * @id: identifier for trigger of state change | ||
573 | * @ref: additional reference (e.g. request) | ||
574 | * @dbf: reference to dbf structure | ||
575 | */ | ||
576 | void zfcp_dbf_rec_adapter(char *id, void *ref, struct zfcp_dbf *dbf) | ||
577 | { | ||
578 | struct zfcp_adapter *adapter = dbf->adapter; | ||
579 | |||
580 | zfcp_dbf_rec_target(id, ref, dbf, &adapter->status, | ||
581 | &adapter->erp_counter, 0, 0, | ||
582 | ZFCP_DBF_INVALID_LUN); | ||
583 | } | ||
584 | |||
585 | /** | ||
586 | * zfcp_dbf_rec_port - trace event for port state change | ||
587 | * @id: identifier for trigger of state change | ||
588 | * @ref: additional reference (e.g. request) | ||
589 | * @port: port | ||
590 | */ | ||
591 | void zfcp_dbf_rec_port(char *id, void *ref, struct zfcp_port *port) | ||
592 | { | ||
593 | struct zfcp_dbf *dbf = port->adapter->dbf; | ||
594 | 205 | ||
595 | zfcp_dbf_rec_target(id, ref, dbf, &port->status, | 206 | rec->id = ZFCP_DBF_REC_TRIG; |
596 | &port->erp_counter, port->wwpn, port->d_id, | 207 | memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); |
597 | ZFCP_DBF_INVALID_LUN); | 208 | zfcp_dbf_set_common(rec, adapter, port, sdev); |
598 | } | ||
599 | 209 | ||
600 | /** | 210 | list_for_each(entry, &adapter->erp_ready_head) |
601 | * zfcp_dbf_rec_lun - trace event for LUN state change | 211 | rec->u.trig.ready++; |
602 | * @id: identifier for trigger of state change | ||
603 | * @ref: additional reference (e.g. request) | ||
604 | * @sdev: SCSI device | ||
605 | */ | ||
606 | void zfcp_dbf_rec_lun(char *id, void *ref, struct scsi_device *sdev) | ||
607 | { | ||
608 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | ||
609 | struct zfcp_port *port = zfcp_sdev->port; | ||
610 | struct zfcp_dbf *dbf = port->adapter->dbf; | ||
611 | 212 | ||
612 | zfcp_dbf_rec_target(id, ref, dbf, &zfcp_sdev->status, | 213 | list_for_each(entry, &adapter->erp_running_head) |
613 | &zfcp_sdev->erp_counter, port->wwpn, port->d_id, | 214 | rec->u.trig.running++; |
614 | zfcp_scsi_dev_lun(sdev)); | ||
615 | } | ||
616 | 215 | ||
617 | /** | 216 | rec->u.trig.want = want; |
618 | * zfcp_dbf_rec_trigger - trace event for triggered error recovery | 217 | rec->u.trig.need = need; |
619 | * @id2: identifier for error recovery trigger | ||
620 | * @ref: additional reference (e.g. request) | ||
621 | * @want: originally requested error recovery action | ||
622 | * @need: error recovery action actually initiated | ||
623 | * @action: address of error recovery action struct | ||
624 | * @adapter: adapter | ||
625 | * @port: port | ||
626 | * @sdev: SCSI device | ||
627 | */ | ||
628 | void zfcp_dbf_rec_trigger(char *id2, void *ref, u8 want, u8 need, void *action, | ||
629 | struct zfcp_adapter *adapter, struct zfcp_port *port, | ||
630 | struct scsi_device *sdev) | ||
631 | { | ||
632 | struct zfcp_dbf *dbf = adapter->dbf; | ||
633 | struct zfcp_dbf_rec_record *r = &dbf->rec_buf; | ||
634 | unsigned long flags; | ||
635 | 218 | ||
636 | spin_lock_irqsave(&dbf->rec_lock, flags); | 219 | debug_event(dbf->rec, 1, rec, sizeof(*rec)); |
637 | memset(r, 0, sizeof(*r)); | ||
638 | r->id = ZFCP_REC_DBF_ID_TRIGGER; | ||
639 | memcpy(r->id2, id2, ZFCP_DBF_ID_SIZE); | ||
640 | r->u.trigger.ref = (unsigned long)ref; | ||
641 | r->u.trigger.want = want; | ||
642 | r->u.trigger.need = need; | ||
643 | r->u.trigger.action = (unsigned long)action; | ||
644 | r->u.trigger.as = atomic_read(&adapter->status); | ||
645 | if (port) { | ||
646 | r->u.trigger.ps = atomic_read(&port->status); | ||
647 | r->u.trigger.wwpn = port->wwpn; | ||
648 | } | ||
649 | if (sdev) | ||
650 | r->u.trigger.ls = atomic_read(&sdev_to_zfcp(sdev)->status); | ||
651 | r->u.trigger.fcp_lun = sdev ? zfcp_scsi_dev_lun(sdev) : | ||
652 | ZFCP_DBF_INVALID_LUN; | ||
653 | debug_event(dbf->rec, action ? 1 : 4, r, sizeof(*r)); | ||
654 | spin_unlock_irqrestore(&dbf->rec_lock, flags); | 220 | spin_unlock_irqrestore(&dbf->rec_lock, flags); |
655 | } | 221 | } |
656 | 222 | ||
223 | |||
657 | /** | 224 | /** |
658 | * zfcp_dbf_rec_action - trace event showing progress of recovery action | 225 | * zfcp_dbf_rec_run - trace event related to running recovery |
659 | * @id2: identifier | 226 | * @tag: identifier for event |
660 | * @erp_action: error recovery action struct pointer | 227 | * @erp: erp_action running |
661 | */ | 228 | */ |
662 | void zfcp_dbf_rec_action(char *id2, struct zfcp_erp_action *erp_action) | 229 | void zfcp_dbf_rec_run(char *tag, struct zfcp_erp_action *erp) |
663 | { | 230 | { |
664 | struct zfcp_dbf *dbf = erp_action->adapter->dbf; | 231 | struct zfcp_dbf *dbf = erp->adapter->dbf; |
665 | struct zfcp_dbf_rec_record *r = &dbf->rec_buf; | 232 | struct zfcp_dbf_rec *rec = &dbf->rec_buf; |
666 | unsigned long flags; | 233 | unsigned long flags; |
667 | 234 | ||
668 | spin_lock_irqsave(&dbf->rec_lock, flags); | 235 | spin_lock_irqsave(&dbf->rec_lock, flags); |
669 | memset(r, 0, sizeof(*r)); | 236 | memset(rec, 0, sizeof(*rec)); |
670 | r->id = ZFCP_REC_DBF_ID_ACTION; | ||
671 | memcpy(r->id2, id2, ZFCP_DBF_ID_SIZE); | ||
672 | r->u.action.action = (unsigned long)erp_action; | ||
673 | r->u.action.status = erp_action->status; | ||
674 | r->u.action.step = erp_action->step; | ||
675 | r->u.action.fsf_req = erp_action->fsf_req_id; | ||
676 | debug_event(dbf->rec, 5, r, sizeof(*r)); | ||
677 | spin_unlock_irqrestore(&dbf->rec_lock, flags); | ||
678 | } | ||
679 | 237 | ||
680 | /** | 238 | rec->id = ZFCP_DBF_REC_RUN; |
681 | * zfcp_dbf_san_ct_request - trace event for issued CT request | 239 | memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); |
682 | * @fsf_req: request containing issued CT data | 240 | zfcp_dbf_set_common(rec, erp->adapter, erp->port, erp->sdev); |
683 | * @d_id: destination id where ct request is sent to | ||
684 | */ | ||
685 | void zfcp_dbf_san_ct_request(struct zfcp_fsf_req *fsf_req, u32 d_id) | ||
686 | { | ||
687 | struct zfcp_fsf_ct_els *ct = (struct zfcp_fsf_ct_els *)fsf_req->data; | ||
688 | struct zfcp_adapter *adapter = fsf_req->adapter; | ||
689 | struct zfcp_dbf *dbf = adapter->dbf; | ||
690 | struct fc_ct_hdr *hdr = sg_virt(ct->req); | ||
691 | struct zfcp_dbf_san_record *r = &dbf->san_buf; | ||
692 | struct zfcp_dbf_san_record_ct_request *oct = &r->u.ct_req; | ||
693 | int level = 3; | ||
694 | unsigned long flags; | ||
695 | 241 | ||
696 | spin_lock_irqsave(&dbf->san_lock, flags); | 242 | rec->u.run.fsf_req_id = erp->fsf_req_id; |
697 | memset(r, 0, sizeof(*r)); | 243 | rec->u.run.rec_status = erp->status; |
698 | strncpy(r->tag, "octc", ZFCP_DBF_TAG_SIZE); | 244 | rec->u.run.rec_step = erp->step; |
699 | r->fsf_reqid = fsf_req->req_id; | 245 | rec->u.run.rec_action = erp->action; |
700 | r->fsf_seqno = fsf_req->seq_no; | ||
701 | oct->d_id = d_id; | ||
702 | oct->cmd_req_code = hdr->ct_cmd; | ||
703 | oct->revision = hdr->ct_rev; | ||
704 | oct->gs_type = hdr->ct_fs_type; | ||
705 | oct->gs_subtype = hdr->ct_fs_subtype; | ||
706 | oct->options = hdr->ct_options; | ||
707 | oct->max_res_size = hdr->ct_mr_size; | ||
708 | oct->len = min((int)ct->req->length - (int)sizeof(struct fc_ct_hdr), | ||
709 | ZFCP_DBF_SAN_MAX_PAYLOAD); | ||
710 | debug_event(dbf->san, level, r, sizeof(*r)); | ||
711 | zfcp_dbf_hexdump(dbf->san, r, sizeof(*r), level, | ||
712 | (void *)hdr + sizeof(struct fc_ct_hdr), oct->len); | ||
713 | spin_unlock_irqrestore(&dbf->san_lock, flags); | ||
714 | } | ||
715 | 246 | ||
716 | /** | 247 | if (erp->sdev) |
717 | * zfcp_dbf_san_ct_response - trace event for completion of CT request | 248 | rec->u.run.rec_count = |
718 | * @fsf_req: request containing CT response | 249 | atomic_read(&sdev_to_zfcp(erp->sdev)->erp_counter); |
719 | */ | 250 | else if (erp->port) |
720 | void zfcp_dbf_san_ct_response(struct zfcp_fsf_req *fsf_req) | 251 | rec->u.run.rec_count = atomic_read(&erp->port->erp_counter); |
721 | { | 252 | else |
722 | struct zfcp_fsf_ct_els *ct = (struct zfcp_fsf_ct_els *)fsf_req->data; | 253 | rec->u.run.rec_count = atomic_read(&erp->adapter->erp_counter); |
723 | struct zfcp_adapter *adapter = fsf_req->adapter; | ||
724 | struct fc_ct_hdr *hdr = sg_virt(ct->resp); | ||
725 | struct zfcp_dbf *dbf = adapter->dbf; | ||
726 | struct zfcp_dbf_san_record *r = &dbf->san_buf; | ||
727 | struct zfcp_dbf_san_record_ct_response *rct = &r->u.ct_resp; | ||
728 | int level = 3; | ||
729 | unsigned long flags; | ||
730 | 254 | ||
731 | spin_lock_irqsave(&dbf->san_lock, flags); | 255 | debug_event(dbf->rec, 1, rec, sizeof(*rec)); |
732 | memset(r, 0, sizeof(*r)); | 256 | spin_unlock_irqrestore(&dbf->rec_lock, flags); |
733 | strncpy(r->tag, "rctc", ZFCP_DBF_TAG_SIZE); | ||
734 | r->fsf_reqid = fsf_req->req_id; | ||
735 | r->fsf_seqno = fsf_req->seq_no; | ||
736 | rct->cmd_rsp_code = hdr->ct_cmd; | ||
737 | rct->revision = hdr->ct_rev; | ||
738 | rct->reason_code = hdr->ct_reason; | ||
739 | rct->expl = hdr->ct_explan; | ||
740 | rct->vendor_unique = hdr->ct_vendor; | ||
741 | rct->max_res_size = hdr->ct_mr_size; | ||
742 | rct->len = min((int)ct->resp->length - (int)sizeof(struct fc_ct_hdr), | ||
743 | ZFCP_DBF_SAN_MAX_PAYLOAD); | ||
744 | debug_event(dbf->san, level, r, sizeof(*r)); | ||
745 | zfcp_dbf_hexdump(dbf->san, r, sizeof(*r), level, | ||
746 | (void *)hdr + sizeof(struct fc_ct_hdr), rct->len); | ||
747 | spin_unlock_irqrestore(&dbf->san_lock, flags); | ||
748 | } | 257 | } |
749 | 258 | ||
750 | static void zfcp_dbf_san_els(const char *tag, int level, | 259 | static inline |
751 | struct zfcp_fsf_req *fsf_req, u32 d_id, | 260 | void zfcp_dbf_san(char *tag, struct zfcp_dbf *dbf, void *data, u8 id, u16 len, |
752 | void *buffer, int buflen) | 261 | u64 req_id, u32 d_id) |
753 | { | 262 | { |
754 | struct zfcp_adapter *adapter = fsf_req->adapter; | 263 | struct zfcp_dbf_san *rec = &dbf->san_buf; |
755 | struct zfcp_dbf *dbf = adapter->dbf; | 264 | u16 rec_len; |
756 | struct zfcp_dbf_san_record *rec = &dbf->san_buf; | ||
757 | unsigned long flags; | 265 | unsigned long flags; |
758 | 266 | ||
759 | spin_lock_irqsave(&dbf->san_lock, flags); | 267 | spin_lock_irqsave(&dbf->san_lock, flags); |
760 | memset(rec, 0, sizeof(*rec)); | 268 | memset(rec, 0, sizeof(*rec)); |
761 | strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE); | 269 | |
762 | rec->fsf_reqid = fsf_req->req_id; | 270 | rec->id = id; |
763 | rec->fsf_seqno = fsf_req->seq_no; | 271 | rec->fsf_req_id = req_id; |
764 | rec->u.els.d_id = d_id; | 272 | rec->d_id = d_id; |
765 | debug_event(dbf->san, level, rec, sizeof(*rec)); | 273 | rec_len = min(len, (u16)ZFCP_DBF_SAN_MAX_PAYLOAD); |
766 | zfcp_dbf_hexdump(dbf->san, rec, sizeof(*rec), level, | 274 | memcpy(rec->payload, data, rec_len); |
767 | buffer, min(buflen, ZFCP_DBF_SAN_MAX_PAYLOAD)); | 275 | memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); |
276 | |||
277 | debug_event(dbf->san, 1, rec, sizeof(*rec)); | ||
768 | spin_unlock_irqrestore(&dbf->san_lock, flags); | 278 | spin_unlock_irqrestore(&dbf->san_lock, flags); |
769 | } | 279 | } |
770 | 280 | ||
771 | /** | 281 | /** |
772 | * zfcp_dbf_san_els_request - trace event for issued ELS | 282 | * zfcp_dbf_san_req - trace event for issued SAN request |
773 | * @fsf_req: request containing issued ELS | 283 | * @tag: indentifier for event |
284 | * @fsf_req: request containing issued CT data | ||
285 | * d_id: destination ID | ||
774 | */ | 286 | */ |
775 | void zfcp_dbf_san_els_request(struct zfcp_fsf_req *fsf_req) | 287 | void zfcp_dbf_san_req(char *tag, struct zfcp_fsf_req *fsf, u32 d_id) |
776 | { | 288 | { |
777 | struct zfcp_fsf_ct_els *els = (struct zfcp_fsf_ct_els *)fsf_req->data; | 289 | struct zfcp_dbf *dbf = fsf->adapter->dbf; |
778 | u32 d_id = ntoh24(fsf_req->qtcb->bottom.support.d_id); | 290 | struct zfcp_fsf_ct_els *ct_els = fsf->data; |
291 | u16 length; | ||
779 | 292 | ||
780 | zfcp_dbf_san_els("oels", 2, fsf_req, d_id, | 293 | length = (u16)(ct_els->req->length + FC_CT_HDR_LEN); |
781 | sg_virt(els->req), els->req->length); | 294 | zfcp_dbf_san(tag, dbf, sg_virt(ct_els->req), ZFCP_DBF_SAN_REQ, length, |
295 | fsf->req_id, d_id); | ||
782 | } | 296 | } |
783 | 297 | ||
784 | /** | 298 | /** |
785 | * zfcp_dbf_san_els_response - trace event for completed ELS | 299 | * zfcp_dbf_san_res - trace event for received SAN request |
786 | * @fsf_req: request containing ELS response | 300 | * @tag: indentifier for event |
301 | * @fsf_req: request containing issued CT data | ||
787 | */ | 302 | */ |
788 | void zfcp_dbf_san_els_response(struct zfcp_fsf_req *fsf_req) | 303 | void zfcp_dbf_san_res(char *tag, struct zfcp_fsf_req *fsf) |
789 | { | 304 | { |
790 | struct zfcp_fsf_ct_els *els = (struct zfcp_fsf_ct_els *)fsf_req->data; | 305 | struct zfcp_dbf *dbf = fsf->adapter->dbf; |
791 | u32 d_id = ntoh24(fsf_req->qtcb->bottom.support.d_id); | 306 | struct zfcp_fsf_ct_els *ct_els = fsf->data; |
307 | u16 length; | ||
792 | 308 | ||
793 | zfcp_dbf_san_els("rels", 2, fsf_req, d_id, | 309 | length = (u16)(ct_els->resp->length + FC_CT_HDR_LEN); |
794 | sg_virt(els->resp), els->resp->length); | 310 | zfcp_dbf_san(tag, dbf, sg_virt(ct_els->resp), ZFCP_DBF_SAN_RES, length, |
311 | fsf->req_id, 0); | ||
795 | } | 312 | } |
796 | 313 | ||
797 | /** | 314 | /** |
798 | * zfcp_dbf_san_incoming_els - trace event for incomig ELS | 315 | * zfcp_dbf_san_in_els - trace event for incoming ELS |
799 | * @fsf_req: request containing unsolicited status buffer with incoming ELS | 316 | * @tag: indentifier for event |
317 | * @fsf_req: request containing issued CT data | ||
800 | */ | 318 | */ |
801 | void zfcp_dbf_san_incoming_els(struct zfcp_fsf_req *fsf_req) | 319 | void zfcp_dbf_san_in_els(char *tag, struct zfcp_fsf_req *fsf) |
802 | { | 320 | { |
803 | struct fsf_status_read_buffer *buf = | 321 | struct zfcp_dbf *dbf = fsf->adapter->dbf; |
804 | (struct fsf_status_read_buffer *)fsf_req->data; | 322 | struct fsf_status_read_buffer *srb = |
805 | int length = (int)buf->length - | 323 | (struct fsf_status_read_buffer *) fsf->data; |
806 | (int)((void *)&buf->payload - (void *)buf); | 324 | u16 length; |
807 | 325 | ||
808 | zfcp_dbf_san_els("iels", 1, fsf_req, ntoh24(buf->d_id), | 326 | length = (u16)(srb->length - |
809 | (void *)buf->payload.data, length); | 327 | offsetof(struct fsf_status_read_buffer, payload)); |
810 | } | 328 | zfcp_dbf_san(tag, dbf, srb->payload.data, ZFCP_DBF_SAN_ELS, length, |
811 | 329 | fsf->req_id, ntoh24(srb->d_id)); | |
812 | static int zfcp_dbf_san_view_format(debug_info_t *id, struct debug_view *view, | ||
813 | char *out_buf, const char *in_buf) | ||
814 | { | ||
815 | struct zfcp_dbf_san_record *r = (struct zfcp_dbf_san_record *)in_buf; | ||
816 | char *p = out_buf; | ||
817 | |||
818 | if (strncmp(r->tag, "dump", ZFCP_DBF_TAG_SIZE) == 0) | ||
819 | return 0; | ||
820 | |||
821 | zfcp_dbf_tag(&p, "tag", r->tag); | ||
822 | zfcp_dbf_out(&p, "fsf_reqid", "0x%0Lx", r->fsf_reqid); | ||
823 | zfcp_dbf_out(&p, "fsf_seqno", "0x%08x", r->fsf_seqno); | ||
824 | |||
825 | if (strncmp(r->tag, "octc", ZFCP_DBF_TAG_SIZE) == 0) { | ||
826 | struct zfcp_dbf_san_record_ct_request *ct = &r->u.ct_req; | ||
827 | zfcp_dbf_out(&p, "d_id", "0x%06x", ct->d_id); | ||
828 | zfcp_dbf_out(&p, "cmd_req_code", "0x%04x", ct->cmd_req_code); | ||
829 | zfcp_dbf_out(&p, "revision", "0x%02x", ct->revision); | ||
830 | zfcp_dbf_out(&p, "gs_type", "0x%02x", ct->gs_type); | ||
831 | zfcp_dbf_out(&p, "gs_subtype", "0x%02x", ct->gs_subtype); | ||
832 | zfcp_dbf_out(&p, "options", "0x%02x", ct->options); | ||
833 | zfcp_dbf_out(&p, "max_res_size", "0x%04x", ct->max_res_size); | ||
834 | } else if (strncmp(r->tag, "rctc", ZFCP_DBF_TAG_SIZE) == 0) { | ||
835 | struct zfcp_dbf_san_record_ct_response *ct = &r->u.ct_resp; | ||
836 | zfcp_dbf_out(&p, "cmd_rsp_code", "0x%04x", ct->cmd_rsp_code); | ||
837 | zfcp_dbf_out(&p, "revision", "0x%02x", ct->revision); | ||
838 | zfcp_dbf_out(&p, "reason_code", "0x%02x", ct->reason_code); | ||
839 | zfcp_dbf_out(&p, "reason_code_expl", "0x%02x", ct->expl); | ||
840 | zfcp_dbf_out(&p, "vendor_unique", "0x%02x", ct->vendor_unique); | ||
841 | zfcp_dbf_out(&p, "max_res_size", "0x%04x", ct->max_res_size); | ||
842 | } else if (strncmp(r->tag, "oels", ZFCP_DBF_TAG_SIZE) == 0 || | ||
843 | strncmp(r->tag, "rels", ZFCP_DBF_TAG_SIZE) == 0 || | ||
844 | strncmp(r->tag, "iels", ZFCP_DBF_TAG_SIZE) == 0) { | ||
845 | struct zfcp_dbf_san_record_els *els = &r->u.els; | ||
846 | zfcp_dbf_out(&p, "d_id", "0x%06x", els->d_id); | ||
847 | } | ||
848 | return p - out_buf; | ||
849 | } | 330 | } |
850 | 331 | ||
851 | static struct debug_view zfcp_dbf_san_view = { | 332 | /** |
852 | .name = "structured", | 333 | * zfcp_dbf_scsi - trace event for scsi commands |
853 | .header_proc = zfcp_dbf_view_header, | 334 | * @tag: identifier for event |
854 | .format_proc = zfcp_dbf_san_view_format, | 335 | * @sc: pointer to struct scsi_cmnd |
855 | }; | 336 | * @fsf: pointer to struct zfcp_fsf_req |
856 | 337 | */ | |
857 | void _zfcp_dbf_scsi(const char *tag, const char *tag2, int level, | 338 | void zfcp_dbf_scsi(char *tag, struct scsi_cmnd *sc, struct zfcp_fsf_req *fsf) |
858 | struct zfcp_dbf *dbf, struct scsi_cmnd *scsi_cmnd, | ||
859 | struct zfcp_fsf_req *fsf_req, unsigned long old_req_id) | ||
860 | { | 339 | { |
861 | struct zfcp_dbf_scsi_record *rec = &dbf->scsi_buf; | 340 | struct zfcp_adapter *adapter = |
862 | struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec; | 341 | (struct zfcp_adapter *) sc->device->host->hostdata[0]; |
863 | unsigned long flags; | 342 | struct zfcp_dbf *dbf = adapter->dbf; |
343 | struct zfcp_dbf_scsi *rec = &dbf->scsi_buf; | ||
864 | struct fcp_resp_with_ext *fcp_rsp; | 344 | struct fcp_resp_with_ext *fcp_rsp; |
865 | struct fcp_resp_rsp_info *fcp_rsp_info = NULL; | 345 | struct fcp_resp_rsp_info *fcp_rsp_info; |
866 | char *fcp_sns_info = NULL; | 346 | unsigned long flags; |
867 | int offset = 0, buflen = 0; | ||
868 | 347 | ||
869 | spin_lock_irqsave(&dbf->scsi_lock, flags); | 348 | spin_lock_irqsave(&dbf->scsi_lock, flags); |
870 | do { | 349 | memset(rec, 0, sizeof(*rec)); |
871 | memset(rec, 0, sizeof(*rec)); | ||
872 | if (offset == 0) { | ||
873 | strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE); | ||
874 | strncpy(rec->tag2, tag2, ZFCP_DBF_TAG_SIZE); | ||
875 | if (scsi_cmnd != NULL) { | ||
876 | if (scsi_cmnd->device) { | ||
877 | rec->scsi_id = scsi_cmnd->device->id; | ||
878 | rec->scsi_lun = scsi_cmnd->device->lun; | ||
879 | } | ||
880 | rec->scsi_result = scsi_cmnd->result; | ||
881 | rec->scsi_cmnd = (unsigned long)scsi_cmnd; | ||
882 | memcpy(rec->scsi_opcode, scsi_cmnd->cmnd, | ||
883 | min((int)scsi_cmnd->cmd_len, | ||
884 | ZFCP_DBF_SCSI_OPCODE)); | ||
885 | rec->scsi_retries = scsi_cmnd->retries; | ||
886 | rec->scsi_allowed = scsi_cmnd->allowed; | ||
887 | } | ||
888 | if (fsf_req != NULL) { | ||
889 | fcp_rsp = (struct fcp_resp_with_ext *) | ||
890 | &(fsf_req->qtcb->bottom.io.fcp_rsp); | ||
891 | fcp_rsp_info = (struct fcp_resp_rsp_info *) | ||
892 | &fcp_rsp[1]; | ||
893 | fcp_sns_info = (char *) &fcp_rsp[1]; | ||
894 | if (fcp_rsp->resp.fr_flags & FCP_RSP_LEN_VAL) | ||
895 | fcp_sns_info += fcp_rsp->ext.fr_sns_len; | ||
896 | |||
897 | rec->rsp_validity = fcp_rsp->resp.fr_flags; | ||
898 | rec->rsp_scsi_status = fcp_rsp->resp.fr_status; | ||
899 | rec->rsp_resid = fcp_rsp->ext.fr_resid; | ||
900 | if (fcp_rsp->resp.fr_flags & FCP_RSP_LEN_VAL) | ||
901 | rec->rsp_code = fcp_rsp_info->rsp_code; | ||
902 | if (fcp_rsp->resp.fr_flags & FCP_SNS_LEN_VAL) { | ||
903 | buflen = min(fcp_rsp->ext.fr_sns_len, | ||
904 | (u32)ZFCP_DBF_SCSI_MAX_FCP_SNS_INFO); | ||
905 | rec->sns_info_len = buflen; | ||
906 | memcpy(rec->sns_info, fcp_sns_info, | ||
907 | min(buflen, | ||
908 | ZFCP_DBF_SCSI_FCP_SNS_INFO)); | ||
909 | offset += min(buflen, | ||
910 | ZFCP_DBF_SCSI_FCP_SNS_INFO); | ||
911 | } | ||
912 | |||
913 | rec->fsf_reqid = fsf_req->req_id; | ||
914 | rec->fsf_seqno = fsf_req->seq_no; | ||
915 | rec->fsf_issued = fsf_req->issued; | ||
916 | } | ||
917 | rec->old_fsf_reqid = old_req_id; | ||
918 | } else { | ||
919 | strncpy(dump->tag, "dump", ZFCP_DBF_TAG_SIZE); | ||
920 | dump->total_size = buflen; | ||
921 | dump->offset = offset; | ||
922 | dump->size = min(buflen - offset, | ||
923 | (int)sizeof(struct | ||
924 | zfcp_dbf_scsi_record) - | ||
925 | (int)sizeof(struct zfcp_dbf_dump)); | ||
926 | memcpy(dump->data, fcp_sns_info + offset, dump->size); | ||
927 | offset += dump->size; | ||
928 | } | ||
929 | debug_event(dbf->scsi, level, rec, sizeof(*rec)); | ||
930 | } while (offset < buflen); | ||
931 | spin_unlock_irqrestore(&dbf->scsi_lock, flags); | ||
932 | } | ||
933 | 350 | ||
934 | static int zfcp_dbf_scsi_view_format(debug_info_t *id, struct debug_view *view, | 351 | memcpy(rec->tag, tag, ZFCP_DBF_TAG_LEN); |
935 | char *out_buf, const char *in_buf) | 352 | rec->id = ZFCP_DBF_SCSI_CMND; |
936 | { | 353 | rec->scsi_result = sc->result; |
937 | struct zfcp_dbf_scsi_record *r = (struct zfcp_dbf_scsi_record *)in_buf; | 354 | rec->scsi_retries = sc->retries; |
938 | struct timespec t; | 355 | rec->scsi_allowed = sc->allowed; |
939 | char *p = out_buf; | 356 | rec->scsi_id = sc->device->id; |
940 | 357 | rec->scsi_lun = sc->device->lun; | |
941 | if (strncmp(r->tag, "dump", ZFCP_DBF_TAG_SIZE) == 0) | 358 | rec->host_scribble = (unsigned long)sc->host_scribble; |
942 | return 0; | 359 | |
943 | 360 | memcpy(rec->scsi_opcode, sc->cmnd, | |
944 | zfcp_dbf_tag(&p, "tag", r->tag); | 361 | min((int)sc->cmd_len, ZFCP_DBF_SCSI_OPCODE)); |
945 | zfcp_dbf_tag(&p, "tag2", r->tag2); | 362 | |
946 | zfcp_dbf_out(&p, "scsi_id", "0x%08x", r->scsi_id); | 363 | if (fsf) { |
947 | zfcp_dbf_out(&p, "scsi_lun", "0x%08x", r->scsi_lun); | 364 | rec->fsf_req_id = fsf->req_id; |
948 | zfcp_dbf_out(&p, "scsi_result", "0x%08x", r->scsi_result); | 365 | fcp_rsp = (struct fcp_resp_with_ext *) |
949 | zfcp_dbf_out(&p, "scsi_cmnd", "0x%0Lx", r->scsi_cmnd); | 366 | &(fsf->qtcb->bottom.io.fcp_rsp); |
950 | zfcp_dbf_outd(&p, "scsi_opcode", r->scsi_opcode, ZFCP_DBF_SCSI_OPCODE, | 367 | memcpy(&rec->fcp_rsp, fcp_rsp, FCP_RESP_WITH_EXT); |
951 | 0, ZFCP_DBF_SCSI_OPCODE); | 368 | if (fcp_rsp->resp.fr_flags & FCP_RSP_LEN_VAL) { |
952 | zfcp_dbf_out(&p, "scsi_retries", "0x%02x", r->scsi_retries); | 369 | fcp_rsp_info = (struct fcp_resp_rsp_info *) &fcp_rsp[1]; |
953 | zfcp_dbf_out(&p, "scsi_allowed", "0x%02x", r->scsi_allowed); | 370 | rec->fcp_rsp_info = fcp_rsp_info->rsp_code; |
954 | if (strncmp(r->tag, "abrt", ZFCP_DBF_TAG_SIZE) == 0) | 371 | } |
955 | zfcp_dbf_out(&p, "old_fsf_reqid", "0x%0Lx", r->old_fsf_reqid); | 372 | if (fcp_rsp->resp.fr_flags & FCP_SNS_LEN_VAL) { |
956 | zfcp_dbf_out(&p, "fsf_reqid", "0x%0Lx", r->fsf_reqid); | 373 | rec->pl_len = min((u16)SCSI_SENSE_BUFFERSIZE, |
957 | zfcp_dbf_out(&p, "fsf_seqno", "0x%08x", r->fsf_seqno); | 374 | (u16)ZFCP_DBF_PAY_MAX_REC); |
958 | stck_to_timespec(r->fsf_issued, &t); | 375 | zfcp_dbf_pl_write(dbf, sc->sense_buffer, rec->pl_len, |
959 | zfcp_dbf_out(&p, "fsf_issued", "%011lu:%06lu", t.tv_sec, t.tv_nsec); | 376 | "fcp_sns", fsf->req_id); |
960 | 377 | } | |
961 | if (strncmp(r->tag, "rslt", ZFCP_DBF_TAG_SIZE) == 0) { | ||
962 | zfcp_dbf_out(&p, "fcp_rsp_validity", "0x%02x", r->rsp_validity); | ||
963 | zfcp_dbf_out(&p, "fcp_rsp_scsi_status", "0x%02x", | ||
964 | r->rsp_scsi_status); | ||
965 | zfcp_dbf_out(&p, "fcp_rsp_resid", "0x%08x", r->rsp_resid); | ||
966 | zfcp_dbf_out(&p, "fcp_rsp_code", "0x%08x", r->rsp_code); | ||
967 | zfcp_dbf_out(&p, "fcp_sns_info_len", "0x%08x", r->sns_info_len); | ||
968 | zfcp_dbf_outd(&p, "fcp_sns_info", r->sns_info, | ||
969 | min((int)r->sns_info_len, | ||
970 | ZFCP_DBF_SCSI_FCP_SNS_INFO), 0, | ||
971 | r->sns_info_len); | ||
972 | } | 378 | } |
973 | p += sprintf(p, "\n"); | ||
974 | return p - out_buf; | ||
975 | } | ||
976 | 379 | ||
977 | static struct debug_view zfcp_dbf_scsi_view = { | 380 | debug_event(dbf->scsi, 1, rec, sizeof(*rec)); |
978 | .name = "structured", | 381 | spin_unlock_irqrestore(&dbf->scsi_lock, flags); |
979 | .header_proc = zfcp_dbf_view_header, | 382 | } |
980 | .format_proc = zfcp_dbf_scsi_view_format, | ||
981 | }; | ||
982 | 383 | ||
983 | static debug_info_t *zfcp_dbf_reg(const char *name, int level, | 384 | static debug_info_t *zfcp_dbf_reg(const char *name, int size, int rec_size) |
984 | struct debug_view *view, int size) | ||
985 | { | 385 | { |
986 | struct debug_info *d; | 386 | struct debug_info *d; |
987 | 387 | ||
988 | d = debug_register(name, dbfsize, level, size); | 388 | d = debug_register(name, size, 1, rec_size); |
989 | if (!d) | 389 | if (!d) |
990 | return NULL; | 390 | return NULL; |
991 | 391 | ||
992 | debug_register_view(d, &debug_hex_ascii_view); | 392 | debug_register_view(d, &debug_hex_ascii_view); |
993 | debug_register_view(d, view); | 393 | debug_set_level(d, 3); |
994 | debug_set_level(d, level); | ||
995 | 394 | ||
996 | return d; | 395 | return d; |
997 | } | 396 | } |
998 | 397 | ||
398 | static void zfcp_dbf_unregister(struct zfcp_dbf *dbf) | ||
399 | { | ||
400 | if (!dbf) | ||
401 | return; | ||
402 | |||
403 | debug_unregister(dbf->scsi); | ||
404 | debug_unregister(dbf->san); | ||
405 | debug_unregister(dbf->hba); | ||
406 | debug_unregister(dbf->pay); | ||
407 | debug_unregister(dbf->rec); | ||
408 | kfree(dbf); | ||
409 | } | ||
410 | |||
999 | /** | 411 | /** |
1000 | * zfcp_adapter_debug_register - registers debug feature for an adapter | 412 | * zfcp_adapter_debug_register - registers debug feature for an adapter |
1001 | * @adapter: pointer to adapter for which debug features should be registered | 413 | * @adapter: pointer to adapter for which debug features should be registered |
@@ -1003,69 +415,66 @@ static debug_info_t *zfcp_dbf_reg(const char *name, int level, | |||
1003 | */ | 415 | */ |
1004 | int zfcp_dbf_adapter_register(struct zfcp_adapter *adapter) | 416 | int zfcp_dbf_adapter_register(struct zfcp_adapter *adapter) |
1005 | { | 417 | { |
1006 | char dbf_name[DEBUG_MAX_NAME_LEN]; | 418 | char name[DEBUG_MAX_NAME_LEN]; |
1007 | struct zfcp_dbf *dbf; | 419 | struct zfcp_dbf *dbf; |
1008 | 420 | ||
1009 | dbf = kzalloc(sizeof(struct zfcp_dbf), GFP_KERNEL); | 421 | dbf = kzalloc(sizeof(struct zfcp_dbf), GFP_KERNEL); |
1010 | if (!dbf) | 422 | if (!dbf) |
1011 | return -ENOMEM; | 423 | return -ENOMEM; |
1012 | 424 | ||
1013 | dbf->adapter = adapter; | 425 | spin_lock_init(&dbf->pay_lock); |
1014 | |||
1015 | spin_lock_init(&dbf->hba_lock); | 426 | spin_lock_init(&dbf->hba_lock); |
1016 | spin_lock_init(&dbf->san_lock); | 427 | spin_lock_init(&dbf->san_lock); |
1017 | spin_lock_init(&dbf->scsi_lock); | 428 | spin_lock_init(&dbf->scsi_lock); |
1018 | spin_lock_init(&dbf->rec_lock); | 429 | spin_lock_init(&dbf->rec_lock); |
1019 | 430 | ||
1020 | /* debug feature area which records recovery activity */ | 431 | /* debug feature area which records recovery activity */ |
1021 | sprintf(dbf_name, "zfcp_%s_rec", dev_name(&adapter->ccw_device->dev)); | 432 | sprintf(name, "zfcp_%s_rec", dev_name(&adapter->ccw_device->dev)); |
1022 | dbf->rec = zfcp_dbf_reg(dbf_name, 3, &zfcp_dbf_rec_view, | 433 | dbf->rec = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_rec)); |
1023 | sizeof(struct zfcp_dbf_rec_record)); | ||
1024 | if (!dbf->rec) | 434 | if (!dbf->rec) |
1025 | goto err_out; | 435 | goto err_out; |
1026 | 436 | ||
1027 | /* debug feature area which records HBA (FSF and QDIO) conditions */ | 437 | /* debug feature area which records HBA (FSF and QDIO) conditions */ |
1028 | sprintf(dbf_name, "zfcp_%s_hba", dev_name(&adapter->ccw_device->dev)); | 438 | sprintf(name, "zfcp_%s_hba", dev_name(&adapter->ccw_device->dev)); |
1029 | dbf->hba = zfcp_dbf_reg(dbf_name, 3, &zfcp_dbf_hba_view, | 439 | dbf->hba = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_hba)); |
1030 | sizeof(struct zfcp_dbf_hba_record)); | ||
1031 | if (!dbf->hba) | 440 | if (!dbf->hba) |
1032 | goto err_out; | 441 | goto err_out; |
1033 | 442 | ||
443 | /* debug feature area which records payload info */ | ||
444 | sprintf(name, "zfcp_%s_pay", dev_name(&adapter->ccw_device->dev)); | ||
445 | dbf->pay = zfcp_dbf_reg(name, dbfsize * 2, sizeof(struct zfcp_dbf_pay)); | ||
446 | if (!dbf->pay) | ||
447 | goto err_out; | ||
448 | |||
1034 | /* debug feature area which records SAN command failures and recovery */ | 449 | /* debug feature area which records SAN command failures and recovery */ |
1035 | sprintf(dbf_name, "zfcp_%s_san", dev_name(&adapter->ccw_device->dev)); | 450 | sprintf(name, "zfcp_%s_san", dev_name(&adapter->ccw_device->dev)); |
1036 | dbf->san = zfcp_dbf_reg(dbf_name, 6, &zfcp_dbf_san_view, | 451 | dbf->san = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_san)); |
1037 | sizeof(struct zfcp_dbf_san_record)); | ||
1038 | if (!dbf->san) | 452 | if (!dbf->san) |
1039 | goto err_out; | 453 | goto err_out; |
1040 | 454 | ||
1041 | /* debug feature area which records SCSI command failures and recovery */ | 455 | /* debug feature area which records SCSI command failures and recovery */ |
1042 | sprintf(dbf_name, "zfcp_%s_scsi", dev_name(&adapter->ccw_device->dev)); | 456 | sprintf(name, "zfcp_%s_scsi", dev_name(&adapter->ccw_device->dev)); |
1043 | dbf->scsi = zfcp_dbf_reg(dbf_name, 3, &zfcp_dbf_scsi_view, | 457 | dbf->scsi = zfcp_dbf_reg(name, dbfsize, sizeof(struct zfcp_dbf_scsi)); |
1044 | sizeof(struct zfcp_dbf_scsi_record)); | ||
1045 | if (!dbf->scsi) | 458 | if (!dbf->scsi) |
1046 | goto err_out; | 459 | goto err_out; |
1047 | 460 | ||
1048 | adapter->dbf = dbf; | 461 | adapter->dbf = dbf; |
1049 | return 0; | ||
1050 | 462 | ||
463 | return 0; | ||
1051 | err_out: | 464 | err_out: |
1052 | zfcp_dbf_adapter_unregister(dbf); | 465 | zfcp_dbf_unregister(dbf); |
1053 | return -ENOMEM; | 466 | return -ENOMEM; |
1054 | } | 467 | } |
1055 | 468 | ||
1056 | /** | 469 | /** |
1057 | * zfcp_adapter_debug_unregister - unregisters debug feature for an adapter | 470 | * zfcp_adapter_debug_unregister - unregisters debug feature for an adapter |
1058 | * @dbf: pointer to dbf for which debug features should be unregistered | 471 | * @adapter: pointer to adapter for which debug features should be unregistered |
1059 | */ | 472 | */ |
1060 | void zfcp_dbf_adapter_unregister(struct zfcp_dbf *dbf) | 473 | void zfcp_dbf_adapter_unregister(struct zfcp_adapter *adapter) |
1061 | { | 474 | { |
1062 | if (!dbf) | 475 | struct zfcp_dbf *dbf = adapter->dbf; |
1063 | return; | 476 | |
1064 | debug_unregister(dbf->scsi); | 477 | adapter->dbf = NULL; |
1065 | debug_unregister(dbf->san); | 478 | zfcp_dbf_unregister(dbf); |
1066 | debug_unregister(dbf->hba); | ||
1067 | debug_unregister(dbf->rec); | ||
1068 | dbf->adapter->dbf = NULL; | ||
1069 | kfree(dbf); | ||
1070 | } | 479 | } |
1071 | 480 | ||
diff --git a/drivers/s390/scsi/zfcp_dbf.h b/drivers/s390/scsi/zfcp_dbf.h index 04081b1b62b4..714f087eb7a9 100644 --- a/drivers/s390/scsi/zfcp_dbf.h +++ b/drivers/s390/scsi/zfcp_dbf.h | |||
@@ -1,22 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * This file is part of the zfcp device driver for | 2 | * zfcp device driver |
3 | * FCP adapters for IBM System z9 and zSeries. | 3 | * debug feature declarations |
4 | * | 4 | * |
5 | * Copyright IBM Corp. 2008, 2009 | 5 | * Copyright IBM Corp. 2008, 2010 |
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2, or (at your option) | ||
10 | * any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | */ | 6 | */ |
21 | 7 | ||
22 | #ifndef ZFCP_DBF_H | 8 | #ifndef ZFCP_DBF_H |
@@ -27,322 +13,350 @@ | |||
27 | #include "zfcp_fsf.h" | 13 | #include "zfcp_fsf.h" |
28 | #include "zfcp_def.h" | 14 | #include "zfcp_def.h" |
29 | 15 | ||
30 | #define ZFCP_DBF_TAG_SIZE 4 | 16 | #define ZFCP_DBF_TAG_LEN 7 |
31 | #define ZFCP_DBF_ID_SIZE 7 | ||
32 | 17 | ||
33 | #define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull | 18 | #define ZFCP_DBF_INVALID_LUN 0xFFFFFFFFFFFFFFFFull |
34 | 19 | ||
35 | struct zfcp_dbf_dump { | 20 | /** |
36 | u8 tag[ZFCP_DBF_TAG_SIZE]; | 21 | * struct zfcp_dbf_rec_trigger - trace record for triggered recovery action |
37 | u32 total_size; /* size of total dump data */ | 22 | * @ready: number of ready recovery actions |
38 | u32 offset; /* how much data has being already dumped */ | 23 | * @running: number of running recovery actions |
39 | u32 size; /* how much data comes with this record */ | 24 | * @want: wanted recovery action |
40 | u8 data[]; /* dump data */ | 25 | * @need: needed recovery action |
41 | } __attribute__ ((packed)); | 26 | */ |
42 | 27 | struct zfcp_dbf_rec_trigger { | |
43 | struct zfcp_dbf_rec_record_thread { | ||
44 | u32 total; | ||
45 | u32 ready; | 28 | u32 ready; |
46 | u32 running; | 29 | u32 running; |
47 | }; | ||
48 | |||
49 | struct zfcp_dbf_rec_record_target { | ||
50 | u64 ref; | ||
51 | u32 status; | ||
52 | u32 d_id; | ||
53 | u64 wwpn; | ||
54 | u64 fcp_lun; | ||
55 | u32 erp_count; | ||
56 | }; | ||
57 | |||
58 | struct zfcp_dbf_rec_record_trigger { | ||
59 | u8 want; | 30 | u8 want; |
60 | u8 need; | 31 | u8 need; |
61 | u32 as; | 32 | } __packed; |
62 | u32 ps; | ||
63 | u32 ls; | ||
64 | u64 ref; | ||
65 | u64 action; | ||
66 | u64 wwpn; | ||
67 | u64 fcp_lun; | ||
68 | }; | ||
69 | 33 | ||
70 | struct zfcp_dbf_rec_record_action { | 34 | /** |
71 | u32 status; | 35 | * struct zfcp_dbf_rec_running - trace record for running recovery |
72 | u32 step; | 36 | * @fsf_req_id: request id for fsf requests |
73 | u64 action; | 37 | * @rec_status: status of the fsf request |
74 | u64 fsf_req; | 38 | * @rec_step: current step of the recovery action |
39 | * rec_count: recovery counter | ||
40 | */ | ||
41 | struct zfcp_dbf_rec_running { | ||
42 | u64 fsf_req_id; | ||
43 | u32 rec_status; | ||
44 | u16 rec_step; | ||
45 | u8 rec_action; | ||
46 | u8 rec_count; | ||
47 | } __packed; | ||
48 | |||
49 | /** | ||
50 | * enum zfcp_dbf_rec_id - recovery trace record id | ||
51 | * @ZFCP_DBF_REC_TRIG: triggered recovery identifier | ||
52 | * @ZFCP_DBF_REC_RUN: running recovery identifier | ||
53 | */ | ||
54 | enum zfcp_dbf_rec_id { | ||
55 | ZFCP_DBF_REC_TRIG = 1, | ||
56 | ZFCP_DBF_REC_RUN = 2, | ||
75 | }; | 57 | }; |
76 | 58 | ||
77 | struct zfcp_dbf_rec_record { | 59 | /** |
60 | * struct zfcp_dbf_rec - trace record for error recovery actions | ||
61 | * @id: unique number of recovery record type | ||
62 | * @tag: identifier string specifying the location of initiation | ||
63 | * @lun: logical unit number | ||
64 | * @wwpn: word wide port number | ||
65 | * @d_id: destination ID | ||
66 | * @adapter_status: current status of the adapter | ||
67 | * @port_status: current status of the port | ||
68 | * @lun_status: current status of the lun | ||
69 | * @u.trig: structure zfcp_dbf_rec_trigger | ||
70 | * @u.run: structure zfcp_dbf_rec_running | ||
71 | */ | ||
72 | struct zfcp_dbf_rec { | ||
78 | u8 id; | 73 | u8 id; |
79 | char id2[7]; | 74 | char tag[ZFCP_DBF_TAG_LEN]; |
75 | u64 lun; | ||
76 | u64 wwpn; | ||
77 | u32 d_id; | ||
78 | u32 adapter_status; | ||
79 | u32 port_status; | ||
80 | u32 lun_status; | ||
80 | union { | 81 | union { |
81 | struct zfcp_dbf_rec_record_action action; | 82 | struct zfcp_dbf_rec_trigger trig; |
82 | struct zfcp_dbf_rec_record_thread thread; | 83 | struct zfcp_dbf_rec_running run; |
83 | struct zfcp_dbf_rec_record_target target; | ||
84 | struct zfcp_dbf_rec_record_trigger trigger; | ||
85 | } u; | 84 | } u; |
86 | }; | 85 | } __packed; |
87 | 86 | ||
88 | enum { | 87 | /** |
89 | ZFCP_REC_DBF_ID_ACTION, | 88 | * enum zfcp_dbf_san_id - SAN trace record identifier |
90 | ZFCP_REC_DBF_ID_THREAD, | 89 | * @ZFCP_DBF_SAN_REQ: request trace record id |
91 | ZFCP_REC_DBF_ID_TARGET, | 90 | * @ZFCP_DBF_SAN_RES: response trace record id |
92 | ZFCP_REC_DBF_ID_TRIGGER, | 91 | * @ZFCP_DBF_SAN_ELS: extended link service record id |
92 | */ | ||
93 | enum zfcp_dbf_san_id { | ||
94 | ZFCP_DBF_SAN_REQ = 1, | ||
95 | ZFCP_DBF_SAN_RES = 2, | ||
96 | ZFCP_DBF_SAN_ELS = 3, | ||
93 | }; | 97 | }; |
94 | 98 | ||
95 | struct zfcp_dbf_hba_record_response { | 99 | /** struct zfcp_dbf_san - trace record for SAN requests and responses |
96 | u32 fsf_command; | 100 | * @id: unique number of recovery record type |
97 | u64 fsf_reqid; | 101 | * @tag: identifier string specifying the location of initiation |
98 | u32 fsf_seqno; | 102 | * @fsf_req_id: request id for fsf requests |
99 | u64 fsf_issued; | 103 | * @payload: unformatted information related to request/response |
100 | u32 fsf_prot_status; | 104 | * @d_id: destination id |
105 | */ | ||
106 | struct zfcp_dbf_san { | ||
107 | u8 id; | ||
108 | char tag[ZFCP_DBF_TAG_LEN]; | ||
109 | u64 fsf_req_id; | ||
110 | u32 d_id; | ||
111 | #define ZFCP_DBF_SAN_MAX_PAYLOAD (FC_CT_HDR_LEN + 32) | ||
112 | char payload[ZFCP_DBF_SAN_MAX_PAYLOAD]; | ||
113 | } __packed; | ||
114 | |||
115 | /** | ||
116 | * struct zfcp_dbf_hba_res - trace record for hba responses | ||
117 | * @req_issued: timestamp when request was issued | ||
118 | * @prot_status: protocol status | ||
119 | * @prot_status_qual: protocol status qualifier | ||
120 | * @fsf_status: fsf status | ||
121 | * @fsf_status_qual: fsf status qualifier | ||
122 | */ | ||
123 | struct zfcp_dbf_hba_res { | ||
124 | u64 req_issued; | ||
125 | u32 prot_status; | ||
126 | u8 prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE]; | ||
101 | u32 fsf_status; | 127 | u32 fsf_status; |
102 | u8 fsf_prot_status_qual[FSF_PROT_STATUS_QUAL_SIZE]; | 128 | u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE]; |
103 | u8 fsf_status_qual[FSF_STATUS_QUALIFIER_SIZE]; | 129 | } __packed; |
104 | u32 fsf_req_status; | ||
105 | u8 sbal_first; | ||
106 | u8 sbal_last; | ||
107 | u8 sbal_response; | ||
108 | u8 pool; | ||
109 | u64 erp_action; | ||
110 | union { | ||
111 | struct { | ||
112 | u64 cmnd; | ||
113 | u32 data_dir; | ||
114 | } fcp; | ||
115 | struct { | ||
116 | u64 wwpn; | ||
117 | u32 d_id; | ||
118 | u32 port_handle; | ||
119 | } port; | ||
120 | struct { | ||
121 | u64 wwpn; | ||
122 | u64 fcp_lun; | ||
123 | u32 port_handle; | ||
124 | u32 lun_handle; | ||
125 | } unit; | ||
126 | struct { | ||
127 | u32 d_id; | ||
128 | } els; | ||
129 | } u; | ||
130 | } __attribute__ ((packed)); | ||
131 | 130 | ||
132 | struct zfcp_dbf_hba_record_status { | 131 | /** |
133 | u8 failed; | 132 | * struct zfcp_dbf_hba_uss - trace record for unsolicited status |
133 | * @status_type: type of unsolicited status | ||
134 | * @status_subtype: subtype of unsolicited status | ||
135 | * @d_id: destination ID | ||
136 | * @lun: logical unit number | ||
137 | * @queue_designator: queue designator | ||
138 | */ | ||
139 | struct zfcp_dbf_hba_uss { | ||
134 | u32 status_type; | 140 | u32 status_type; |
135 | u32 status_subtype; | 141 | u32 status_subtype; |
136 | struct fsf_queue_designator | ||
137 | queue_designator; | ||
138 | u32 payload_size; | ||
139 | #define ZFCP_DBF_UNSOL_PAYLOAD 80 | ||
140 | #define ZFCP_DBF_UNSOL_PAYLOAD_SENSE_DATA_AVAIL 32 | ||
141 | #define ZFCP_DBF_UNSOL_PAYLOAD_BIT_ERROR_THRESHOLD 56 | ||
142 | #define ZFCP_DBF_UNSOL_PAYLOAD_FEATURE_UPDATE_ALERT 2 * sizeof(u32) | ||
143 | u8 payload[ZFCP_DBF_UNSOL_PAYLOAD]; | ||
144 | } __attribute__ ((packed)); | ||
145 | |||
146 | struct zfcp_dbf_hba_record_qdio { | ||
147 | u32 qdio_error; | ||
148 | u8 sbal_index; | ||
149 | u8 sbal_count; | ||
150 | } __attribute__ ((packed)); | ||
151 | |||
152 | struct zfcp_dbf_hba_record { | ||
153 | u8 tag[ZFCP_DBF_TAG_SIZE]; | ||
154 | u8 tag2[ZFCP_DBF_TAG_SIZE]; | ||
155 | union { | ||
156 | struct zfcp_dbf_hba_record_response response; | ||
157 | struct zfcp_dbf_hba_record_status status; | ||
158 | struct zfcp_dbf_hba_record_qdio qdio; | ||
159 | struct fsf_bit_error_payload berr; | ||
160 | } u; | ||
161 | } __attribute__ ((packed)); | ||
162 | |||
163 | struct zfcp_dbf_san_record_ct_request { | ||
164 | u16 cmd_req_code; | ||
165 | u8 revision; | ||
166 | u8 gs_type; | ||
167 | u8 gs_subtype; | ||
168 | u8 options; | ||
169 | u16 max_res_size; | ||
170 | u32 len; | ||
171 | u32 d_id; | ||
172 | } __attribute__ ((packed)); | ||
173 | |||
174 | struct zfcp_dbf_san_record_ct_response { | ||
175 | u16 cmd_rsp_code; | ||
176 | u8 revision; | ||
177 | u8 reason_code; | ||
178 | u8 expl; | ||
179 | u8 vendor_unique; | ||
180 | u16 max_res_size; | ||
181 | u32 len; | ||
182 | } __attribute__ ((packed)); | ||
183 | |||
184 | struct zfcp_dbf_san_record_els { | ||
185 | u32 d_id; | 142 | u32 d_id; |
186 | } __attribute__ ((packed)); | 143 | u64 lun; |
144 | u64 queue_designator; | ||
145 | } __packed; | ||
187 | 146 | ||
188 | struct zfcp_dbf_san_record { | 147 | /** |
189 | u8 tag[ZFCP_DBF_TAG_SIZE]; | 148 | * enum zfcp_dbf_hba_id - HBA trace record identifier |
190 | u64 fsf_reqid; | 149 | * @ZFCP_DBF_HBA_RES: response trace record |
191 | u32 fsf_seqno; | 150 | * @ZFCP_DBF_HBA_USS: unsolicited status trace record |
151 | * @ZFCP_DBF_HBA_BIT: bit error trace record | ||
152 | */ | ||
153 | enum zfcp_dbf_hba_id { | ||
154 | ZFCP_DBF_HBA_RES = 1, | ||
155 | ZFCP_DBF_HBA_USS = 2, | ||
156 | ZFCP_DBF_HBA_BIT = 3, | ||
157 | }; | ||
158 | |||
159 | /** | ||
160 | * struct zfcp_dbf_hba - common trace record for HBA records | ||
161 | * @id: unique number of recovery record type | ||
162 | * @tag: identifier string specifying the location of initiation | ||
163 | * @fsf_req_id: request id for fsf requests | ||
164 | * @fsf_req_status: status of fsf request | ||
165 | * @fsf_cmd: fsf command | ||
166 | * @fsf_seq_no: fsf sequence number | ||
167 | * @pl_len: length of payload stored as zfcp_dbf_pay | ||
168 | * @u: record type specific data | ||
169 | */ | ||
170 | struct zfcp_dbf_hba { | ||
171 | u8 id; | ||
172 | char tag[ZFCP_DBF_TAG_LEN]; | ||
173 | u64 fsf_req_id; | ||
174 | u32 fsf_req_status; | ||
175 | u32 fsf_cmd; | ||
176 | u32 fsf_seq_no; | ||
177 | u16 pl_len; | ||
192 | union { | 178 | union { |
193 | struct zfcp_dbf_san_record_ct_request ct_req; | 179 | struct zfcp_dbf_hba_res res; |
194 | struct zfcp_dbf_san_record_ct_response ct_resp; | 180 | struct zfcp_dbf_hba_uss uss; |
195 | struct zfcp_dbf_san_record_els els; | 181 | struct fsf_bit_error_payload be; |
196 | } u; | 182 | } u; |
197 | } __attribute__ ((packed)); | 183 | } __packed; |
198 | 184 | ||
199 | #define ZFCP_DBF_SAN_MAX_PAYLOAD 1024 | 185 | /** |
186 | * enum zfcp_dbf_scsi_id - scsi trace record identifier | ||
187 | * @ZFCP_DBF_SCSI_CMND: scsi command trace record | ||
188 | */ | ||
189 | enum zfcp_dbf_scsi_id { | ||
190 | ZFCP_DBF_SCSI_CMND = 1, | ||
191 | }; | ||
200 | 192 | ||
201 | struct zfcp_dbf_scsi_record { | 193 | /** |
202 | u8 tag[ZFCP_DBF_TAG_SIZE]; | 194 | * struct zfcp_dbf_scsi - common trace record for SCSI records |
203 | u8 tag2[ZFCP_DBF_TAG_SIZE]; | 195 | * @id: unique number of recovery record type |
196 | * @tag: identifier string specifying the location of initiation | ||
197 | * @scsi_id: scsi device id | ||
198 | * @scsi_lun: scsi device logical unit number | ||
199 | * @scsi_result: scsi result | ||
200 | * @scsi_retries: current retry number of scsi request | ||
201 | * @scsi_allowed: allowed retries | ||
202 | * @fcp_rsp_info: FCP response info | ||
203 | * @scsi_opcode: scsi opcode | ||
204 | * @fsf_req_id: request id of fsf request | ||
205 | * @host_scribble: LLD specific data attached to SCSI request | ||
206 | * @pl_len: length of paload stored as zfcp_dbf_pay | ||
207 | * @fsf_rsp: response for fsf request | ||
208 | */ | ||
209 | struct zfcp_dbf_scsi { | ||
210 | u8 id; | ||
211 | char tag[ZFCP_DBF_TAG_LEN]; | ||
204 | u32 scsi_id; | 212 | u32 scsi_id; |
205 | u32 scsi_lun; | 213 | u32 scsi_lun; |
206 | u32 scsi_result; | 214 | u32 scsi_result; |
207 | u64 scsi_cmnd; | ||
208 | #define ZFCP_DBF_SCSI_OPCODE 16 | ||
209 | u8 scsi_opcode[ZFCP_DBF_SCSI_OPCODE]; | ||
210 | u8 scsi_retries; | 215 | u8 scsi_retries; |
211 | u8 scsi_allowed; | 216 | u8 scsi_allowed; |
212 | u64 fsf_reqid; | 217 | u8 fcp_rsp_info; |
213 | u32 fsf_seqno; | 218 | #define ZFCP_DBF_SCSI_OPCODE 16 |
214 | u64 fsf_issued; | 219 | u8 scsi_opcode[ZFCP_DBF_SCSI_OPCODE]; |
215 | u64 old_fsf_reqid; | 220 | u64 fsf_req_id; |
216 | u8 rsp_validity; | 221 | u64 host_scribble; |
217 | u8 rsp_scsi_status; | 222 | u16 pl_len; |
218 | u32 rsp_resid; | 223 | struct fcp_resp_with_ext fcp_rsp; |
219 | u8 rsp_code; | 224 | } __packed; |
220 | #define ZFCP_DBF_SCSI_FCP_SNS_INFO 16 | ||
221 | #define ZFCP_DBF_SCSI_MAX_FCP_SNS_INFO 256 | ||
222 | u32 sns_info_len; | ||
223 | u8 sns_info[ZFCP_DBF_SCSI_FCP_SNS_INFO]; | ||
224 | } __attribute__ ((packed)); | ||
225 | 225 | ||
226 | /** | ||
227 | * struct zfcp_dbf_pay - trace record for unformatted payload information | ||
228 | * @area: area this record is originated from | ||
229 | * @counter: ascending record number | ||
230 | * @fsf_req_id: request id of fsf request | ||
231 | * @data: unformatted data | ||
232 | */ | ||
233 | struct zfcp_dbf_pay { | ||
234 | u8 counter; | ||
235 | char area[ZFCP_DBF_TAG_LEN]; | ||
236 | u64 fsf_req_id; | ||
237 | #define ZFCP_DBF_PAY_MAX_REC 0x100 | ||
238 | char data[ZFCP_DBF_PAY_MAX_REC]; | ||
239 | } __packed; | ||
240 | |||
241 | /** | ||
242 | * struct zfcp_dbf - main dbf trace structure | ||
243 | * @pay: reference to payload trace area | ||
244 | * @rec: reference to recovery trace area | ||
245 | * @hba: reference to hba trace area | ||
246 | * @san: reference to san trace area | ||
247 | * @scsi: reference to scsi trace area | ||
248 | * @pay_lock: lock protecting payload trace buffer | ||
249 | * @rec_lock: lock protecting recovery trace buffer | ||
250 | * @hba_lock: lock protecting hba trace buffer | ||
251 | * @san_lock: lock protecting san trace buffer | ||
252 | * @scsi_lock: lock protecting scsi trace buffer | ||
253 | * @pay_buf: pre-allocated buffer for payload | ||
254 | * @rec_buf: pre-allocated buffer for recovery | ||
255 | * @hba_buf: pre-allocated buffer for hba | ||
256 | * @san_buf: pre-allocated buffer for san | ||
257 | * @scsi_buf: pre-allocated buffer for scsi | ||
258 | */ | ||
226 | struct zfcp_dbf { | 259 | struct zfcp_dbf { |
260 | debug_info_t *pay; | ||
227 | debug_info_t *rec; | 261 | debug_info_t *rec; |
228 | debug_info_t *hba; | 262 | debug_info_t *hba; |
229 | debug_info_t *san; | 263 | debug_info_t *san; |
230 | debug_info_t *scsi; | 264 | debug_info_t *scsi; |
265 | spinlock_t pay_lock; | ||
231 | spinlock_t rec_lock; | 266 | spinlock_t rec_lock; |
232 | spinlock_t hba_lock; | 267 | spinlock_t hba_lock; |
233 | spinlock_t san_lock; | 268 | spinlock_t san_lock; |
234 | spinlock_t scsi_lock; | 269 | spinlock_t scsi_lock; |
235 | struct zfcp_dbf_rec_record rec_buf; | 270 | struct zfcp_dbf_pay pay_buf; |
236 | struct zfcp_dbf_hba_record hba_buf; | 271 | struct zfcp_dbf_rec rec_buf; |
237 | struct zfcp_dbf_san_record san_buf; | 272 | struct zfcp_dbf_hba hba_buf; |
238 | struct zfcp_dbf_scsi_record scsi_buf; | 273 | struct zfcp_dbf_san san_buf; |
239 | struct zfcp_adapter *adapter; | 274 | struct zfcp_dbf_scsi scsi_buf; |
240 | }; | 275 | }; |
241 | 276 | ||
242 | static inline | 277 | static inline |
243 | void zfcp_dbf_hba_fsf_resp(const char *tag2, int level, | 278 | void zfcp_dbf_hba_fsf_resp(char *tag, int level, struct zfcp_fsf_req *req) |
244 | struct zfcp_fsf_req *req, struct zfcp_dbf *dbf) | ||
245 | { | 279 | { |
246 | if (level <= dbf->hba->level) | 280 | if (level <= req->adapter->dbf->hba->level) |
247 | _zfcp_dbf_hba_fsf_response(tag2, level, req, dbf); | 281 | zfcp_dbf_hba_fsf_res(tag, req); |
248 | } | 282 | } |
249 | 283 | ||
250 | /** | 284 | /** |
251 | * zfcp_dbf_hba_fsf_response - trace event for request completion | 285 | * zfcp_dbf_hba_fsf_response - trace event for request completion |
252 | * @fsf_req: request that has been completed | 286 | * @req: request that has been completed |
253 | */ | 287 | */ |
254 | static inline void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req) | 288 | static inline |
289 | void zfcp_dbf_hba_fsf_response(struct zfcp_fsf_req *req) | ||
255 | { | 290 | { |
256 | struct zfcp_dbf *dbf = req->adapter->dbf; | ||
257 | struct fsf_qtcb *qtcb = req->qtcb; | 291 | struct fsf_qtcb *qtcb = req->qtcb; |
258 | 292 | ||
259 | if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) && | 293 | if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) && |
260 | (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) { | 294 | (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) { |
261 | zfcp_dbf_hba_fsf_resp("perr", 1, req, dbf); | 295 | zfcp_dbf_hba_fsf_resp("fs_perr", 1, req); |
262 | 296 | ||
263 | } else if (qtcb->header.fsf_status != FSF_GOOD) { | 297 | } else if (qtcb->header.fsf_status != FSF_GOOD) { |
264 | zfcp_dbf_hba_fsf_resp("ferr", 1, req, dbf); | 298 | zfcp_dbf_hba_fsf_resp("fs_ferr", 1, req); |
265 | 299 | ||
266 | } else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) || | 300 | } else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) || |
267 | (req->fsf_command == FSF_QTCB_OPEN_LUN)) { | 301 | (req->fsf_command == FSF_QTCB_OPEN_LUN)) { |
268 | zfcp_dbf_hba_fsf_resp("open", 4, req, dbf); | 302 | zfcp_dbf_hba_fsf_resp("fs_open", 4, req); |
269 | 303 | ||
270 | } else if (qtcb->header.log_length) { | 304 | } else if (qtcb->header.log_length) { |
271 | zfcp_dbf_hba_fsf_resp("qtcb", 5, req, dbf); | 305 | zfcp_dbf_hba_fsf_resp("fs_qtcb", 5, req); |
272 | 306 | ||
273 | } else { | 307 | } else { |
274 | zfcp_dbf_hba_fsf_resp("norm", 6, req, dbf); | 308 | zfcp_dbf_hba_fsf_resp("fs_norm", 6, req); |
275 | } | 309 | } |
276 | } | ||
277 | |||
278 | /** | ||
279 | * zfcp_dbf_hba_fsf_unsol - trace event for an unsolicited status buffer | ||
280 | * @tag: tag indicating which kind of unsolicited status has been received | ||
281 | * @dbf: reference to dbf structure | ||
282 | * @status_buffer: buffer containing payload of unsolicited status | ||
283 | */ | ||
284 | static inline | ||
285 | void zfcp_dbf_hba_fsf_unsol(const char *tag, struct zfcp_dbf *dbf, | ||
286 | struct fsf_status_read_buffer *buf) | ||
287 | { | ||
288 | int level = 2; | ||
289 | |||
290 | if (level <= dbf->hba->level) | ||
291 | _zfcp_dbf_hba_fsf_unsol(tag, level, dbf, buf); | ||
292 | } | 310 | } |
293 | 311 | ||
294 | static inline | 312 | static inline |
295 | void zfcp_dbf_scsi(const char *tag, const char *tag2, int level, | 313 | void _zfcp_dbf_scsi(char *tag, int level, struct scsi_cmnd *scmd, |
296 | struct zfcp_dbf *dbf, struct scsi_cmnd *scmd, | 314 | struct zfcp_fsf_req *req) |
297 | struct zfcp_fsf_req *req, unsigned long old_id) | ||
298 | { | 315 | { |
299 | if (level <= dbf->scsi->level) | 316 | struct zfcp_adapter *adapter = (struct zfcp_adapter *) |
300 | _zfcp_dbf_scsi(tag, tag2, level, dbf, scmd, req, old_id); | 317 | scmd->device->host->hostdata[0]; |
318 | |||
319 | if (level <= adapter->dbf->scsi->level) | ||
320 | zfcp_dbf_scsi(tag, scmd, req); | ||
301 | } | 321 | } |
302 | 322 | ||
303 | /** | 323 | /** |
304 | * zfcp_dbf_scsi_result - trace event for SCSI command completion | 324 | * zfcp_dbf_scsi_result - trace event for SCSI command completion |
305 | * @dbf: adapter dbf trace | ||
306 | * @scmd: SCSI command pointer | 325 | * @scmd: SCSI command pointer |
307 | * @req: FSF request used to issue SCSI command | 326 | * @req: FSF request used to issue SCSI command |
308 | */ | 327 | */ |
309 | static inline | 328 | static inline |
310 | void zfcp_dbf_scsi_result(struct zfcp_dbf *dbf, struct scsi_cmnd *scmd, | 329 | void zfcp_dbf_scsi_result(struct scsi_cmnd *scmd, struct zfcp_fsf_req *req) |
311 | struct zfcp_fsf_req *req) | ||
312 | { | 330 | { |
313 | if (scmd->result != 0) | 331 | if (scmd->result != 0) |
314 | zfcp_dbf_scsi("rslt", "erro", 3, dbf, scmd, req, 0); | 332 | _zfcp_dbf_scsi("rsl_err", 3, scmd, req); |
315 | else if (scmd->retries > 0) | 333 | else if (scmd->retries > 0) |
316 | zfcp_dbf_scsi("rslt", "retr", 4, dbf, scmd, req, 0); | 334 | _zfcp_dbf_scsi("rsl_ret", 4, scmd, req); |
317 | else | 335 | else |
318 | zfcp_dbf_scsi("rslt", "norm", 6, dbf, scmd, req, 0); | 336 | _zfcp_dbf_scsi("rsl_nor", 6, scmd, req); |
319 | } | 337 | } |
320 | 338 | ||
321 | /** | 339 | /** |
322 | * zfcp_dbf_scsi_fail_send - trace event for failure to send SCSI command | 340 | * zfcp_dbf_scsi_fail_send - trace event for failure to send SCSI command |
323 | * @dbf: adapter dbf trace | ||
324 | * @scmd: SCSI command pointer | 341 | * @scmd: SCSI command pointer |
325 | */ | 342 | */ |
326 | static inline | 343 | static inline |
327 | void zfcp_dbf_scsi_fail_send(struct zfcp_dbf *dbf, struct scsi_cmnd *scmd) | 344 | void zfcp_dbf_scsi_fail_send(struct scsi_cmnd *scmd) |
328 | { | 345 | { |
329 | zfcp_dbf_scsi("rslt", "fail", 4, dbf, scmd, NULL, 0); | 346 | _zfcp_dbf_scsi("rsl_fai", 4, scmd, NULL); |
330 | } | 347 | } |
331 | 348 | ||
332 | /** | 349 | /** |
333 | * zfcp_dbf_scsi_abort - trace event for SCSI command abort | 350 | * zfcp_dbf_scsi_abort - trace event for SCSI command abort |
334 | * @tag: tag indicating success or failure of abort operation | 351 | * @tag: tag indicating success or failure of abort operation |
335 | * @adapter: adapter thas has been used to issue SCSI command to be aborted | ||
336 | * @scmd: SCSI command to be aborted | 352 | * @scmd: SCSI command to be aborted |
337 | * @new_req: request containing abort (might be NULL) | 353 | * @fsf_req: request containing abort (might be NULL) |
338 | * @old_id: identifier of request containg SCSI command to be aborted | ||
339 | */ | 354 | */ |
340 | static inline | 355 | static inline |
341 | void zfcp_dbf_scsi_abort(const char *tag, struct zfcp_dbf *dbf, | 356 | void zfcp_dbf_scsi_abort(char *tag, struct scsi_cmnd *scmd, |
342 | struct scsi_cmnd *scmd, struct zfcp_fsf_req *new_req, | 357 | struct zfcp_fsf_req *fsf_req) |
343 | unsigned long old_id) | ||
344 | { | 358 | { |
345 | zfcp_dbf_scsi("abrt", tag, 1, dbf, scmd, new_req, old_id); | 359 | _zfcp_dbf_scsi(tag, 1, scmd, fsf_req); |
346 | } | 360 | } |
347 | 361 | ||
348 | /** | 362 | /** |
@@ -352,12 +366,17 @@ void zfcp_dbf_scsi_abort(const char *tag, struct zfcp_dbf *dbf, | |||
352 | * @flag: indicates type of reset (Target Reset, Logical Unit Reset) | 366 | * @flag: indicates type of reset (Target Reset, Logical Unit Reset) |
353 | */ | 367 | */ |
354 | static inline | 368 | static inline |
355 | void zfcp_dbf_scsi_devreset(const char *tag, struct scsi_cmnd *scmnd, u8 flag) | 369 | void zfcp_dbf_scsi_devreset(char *tag, struct scsi_cmnd *scmnd, u8 flag) |
356 | { | 370 | { |
357 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scmnd->device); | 371 | char tmp_tag[ZFCP_DBF_TAG_LEN]; |
372 | |||
373 | if (flag == FCP_TMF_TGT_RESET) | ||
374 | memcpy(tmp_tag, "tr_", 3); | ||
375 | else | ||
376 | memcpy(tmp_tag, "lr_", 3); | ||
358 | 377 | ||
359 | zfcp_dbf_scsi(flag == FCP_TMF_TGT_RESET ? "trst" : "lrst", tag, 1, | 378 | memcpy(&tmp_tag[3], tag, 4); |
360 | zfcp_sdev->port->adapter->dbf, scmnd, NULL, 0); | 379 | _zfcp_dbf_scsi(tmp_tag, 1, scmnd, NULL); |
361 | } | 380 | } |
362 | 381 | ||
363 | #endif /* ZFCP_DBF_H */ | 382 | #endif /* ZFCP_DBF_H */ |
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 0bcd5806bd9a..e003e306f870 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -76,9 +76,9 @@ static void zfcp_erp_action_ready(struct zfcp_erp_action *act) | |||
76 | struct zfcp_adapter *adapter = act->adapter; | 76 | struct zfcp_adapter *adapter = act->adapter; |
77 | 77 | ||
78 | list_move(&act->list, &act->adapter->erp_ready_head); | 78 | list_move(&act->list, &act->adapter->erp_ready_head); |
79 | zfcp_dbf_rec_action("erardy1", act); | 79 | zfcp_dbf_rec_run("erardy1", act); |
80 | wake_up(&adapter->erp_ready_wq); | 80 | wake_up(&adapter->erp_ready_wq); |
81 | zfcp_dbf_rec_thread("erardy2", adapter->dbf); | 81 | zfcp_dbf_rec_run("erardy2", act); |
82 | } | 82 | } |
83 | 83 | ||
84 | static void zfcp_erp_action_dismiss(struct zfcp_erp_action *act) | 84 | static void zfcp_erp_action_dismiss(struct zfcp_erp_action *act) |
@@ -236,10 +236,10 @@ static struct zfcp_erp_action *zfcp_erp_setup_act(int need, u32 act_status, | |||
236 | static int zfcp_erp_action_enqueue(int want, struct zfcp_adapter *adapter, | 236 | static int zfcp_erp_action_enqueue(int want, struct zfcp_adapter *adapter, |
237 | struct zfcp_port *port, | 237 | struct zfcp_port *port, |
238 | struct scsi_device *sdev, | 238 | struct scsi_device *sdev, |
239 | char *id, void *ref, u32 act_status) | 239 | char *id, u32 act_status) |
240 | { | 240 | { |
241 | int retval = 1, need; | 241 | int retval = 1, need; |
242 | struct zfcp_erp_action *act = NULL; | 242 | struct zfcp_erp_action *act; |
243 | 243 | ||
244 | if (!adapter->erp_thread) | 244 | if (!adapter->erp_thread) |
245 | return -EIO; | 245 | return -EIO; |
@@ -255,15 +255,14 @@ static int zfcp_erp_action_enqueue(int want, struct zfcp_adapter *adapter, | |||
255 | ++adapter->erp_total_count; | 255 | ++adapter->erp_total_count; |
256 | list_add_tail(&act->list, &adapter->erp_ready_head); | 256 | list_add_tail(&act->list, &adapter->erp_ready_head); |
257 | wake_up(&adapter->erp_ready_wq); | 257 | wake_up(&adapter->erp_ready_wq); |
258 | zfcp_dbf_rec_thread("eracte1", adapter->dbf); | ||
259 | retval = 0; | 258 | retval = 0; |
260 | out: | 259 | out: |
261 | zfcp_dbf_rec_trigger(id, ref, want, need, act, adapter, port, sdev); | 260 | zfcp_dbf_rec_trig(id, adapter, port, sdev, want, need); |
262 | return retval; | 261 | return retval; |
263 | } | 262 | } |
264 | 263 | ||
265 | static int _zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, | 264 | static int _zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, |
266 | int clear_mask, char *id, void *ref) | 265 | int clear_mask, char *id) |
267 | { | 266 | { |
268 | zfcp_erp_adapter_block(adapter, clear_mask); | 267 | zfcp_erp_adapter_block(adapter, clear_mask); |
269 | zfcp_scsi_schedule_rports_block(adapter); | 268 | zfcp_scsi_schedule_rports_block(adapter); |
@@ -275,7 +274,7 @@ static int _zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, | |||
275 | return -EIO; | 274 | return -EIO; |
276 | } | 275 | } |
277 | return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER, | 276 | return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER, |
278 | adapter, NULL, NULL, id, ref, 0); | 277 | adapter, NULL, NULL, id, 0); |
279 | } | 278 | } |
280 | 279 | ||
281 | /** | 280 | /** |
@@ -283,10 +282,8 @@ static int _zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, | |||
283 | * @adapter: Adapter to reopen. | 282 | * @adapter: Adapter to reopen. |
284 | * @clear: Status flags to clear. | 283 | * @clear: Status flags to clear. |
285 | * @id: Id for debug trace event. | 284 | * @id: Id for debug trace event. |
286 | * @ref: Reference for debug trace event. | ||
287 | */ | 285 | */ |
288 | void zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear, | 286 | void zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear, char *id) |
289 | char *id, void *ref) | ||
290 | { | 287 | { |
291 | unsigned long flags; | 288 | unsigned long flags; |
292 | 289 | ||
@@ -299,7 +296,7 @@ void zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear, | |||
299 | ZFCP_STATUS_COMMON_ERP_FAILED); | 296 | ZFCP_STATUS_COMMON_ERP_FAILED); |
300 | else | 297 | else |
301 | zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER, adapter, | 298 | zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_ADAPTER, adapter, |
302 | NULL, NULL, id, ref, 0); | 299 | NULL, NULL, id, 0); |
303 | write_unlock_irqrestore(&adapter->erp_lock, flags); | 300 | write_unlock_irqrestore(&adapter->erp_lock, flags); |
304 | } | 301 | } |
305 | 302 | ||
@@ -308,13 +305,12 @@ void zfcp_erp_adapter_reopen(struct zfcp_adapter *adapter, int clear, | |||
308 | * @adapter: Adapter to shut down. | 305 | * @adapter: Adapter to shut down. |
309 | * @clear: Status flags to clear. | 306 | * @clear: Status flags to clear. |
310 | * @id: Id for debug trace event. | 307 | * @id: Id for debug trace event. |
311 | * @ref: Reference for debug trace event. | ||
312 | */ | 308 | */ |
313 | void zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear, | 309 | void zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear, |
314 | char *id, void *ref) | 310 | char *id) |
315 | { | 311 | { |
316 | int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED; | 312 | int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED; |
317 | zfcp_erp_adapter_reopen(adapter, clear | flags, id, ref); | 313 | zfcp_erp_adapter_reopen(adapter, clear | flags, id); |
318 | } | 314 | } |
319 | 315 | ||
320 | /** | 316 | /** |
@@ -322,13 +318,11 @@ void zfcp_erp_adapter_shutdown(struct zfcp_adapter *adapter, int clear, | |||
322 | * @port: Port to shut down. | 318 | * @port: Port to shut down. |
323 | * @clear: Status flags to clear. | 319 | * @clear: Status flags to clear. |
324 | * @id: Id for debug trace event. | 320 | * @id: Id for debug trace event. |
325 | * @ref: Reference for debug trace event. | ||
326 | */ | 321 | */ |
327 | void zfcp_erp_port_shutdown(struct zfcp_port *port, int clear, char *id, | 322 | void zfcp_erp_port_shutdown(struct zfcp_port *port, int clear, char *id) |
328 | void *ref) | ||
329 | { | 323 | { |
330 | int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED; | 324 | int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED; |
331 | zfcp_erp_port_reopen(port, clear | flags, id, ref); | 325 | zfcp_erp_port_reopen(port, clear | flags, id); |
332 | } | 326 | } |
333 | 327 | ||
334 | static void zfcp_erp_port_block(struct zfcp_port *port, int clear) | 328 | static void zfcp_erp_port_block(struct zfcp_port *port, int clear) |
@@ -337,8 +331,8 @@ static void zfcp_erp_port_block(struct zfcp_port *port, int clear) | |||
337 | ZFCP_STATUS_COMMON_UNBLOCKED | clear); | 331 | ZFCP_STATUS_COMMON_UNBLOCKED | clear); |
338 | } | 332 | } |
339 | 333 | ||
340 | static void _zfcp_erp_port_forced_reopen(struct zfcp_port *port, | 334 | static void _zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear, |
341 | int clear, char *id, void *ref) | 335 | char *id) |
342 | { | 336 | { |
343 | zfcp_erp_port_block(port, clear); | 337 | zfcp_erp_port_block(port, clear); |
344 | zfcp_scsi_schedule_rport_block(port); | 338 | zfcp_scsi_schedule_rport_block(port); |
@@ -347,28 +341,26 @@ static void _zfcp_erp_port_forced_reopen(struct zfcp_port *port, | |||
347 | return; | 341 | return; |
348 | 342 | ||
349 | zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT_FORCED, | 343 | zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT_FORCED, |
350 | port->adapter, port, NULL, id, ref, 0); | 344 | port->adapter, port, NULL, id, 0); |
351 | } | 345 | } |
352 | 346 | ||
353 | /** | 347 | /** |
354 | * zfcp_erp_port_forced_reopen - Forced close of port and open again | 348 | * zfcp_erp_port_forced_reopen - Forced close of port and open again |
355 | * @port: Port to force close and to reopen. | 349 | * @port: Port to force close and to reopen. |
350 | * @clear: Status flags to clear. | ||
356 | * @id: Id for debug trace event. | 351 | * @id: Id for debug trace event. |
357 | * @ref: Reference for debug trace event. | ||
358 | */ | 352 | */ |
359 | void zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear, char *id, | 353 | void zfcp_erp_port_forced_reopen(struct zfcp_port *port, int clear, char *id) |
360 | void *ref) | ||
361 | { | 354 | { |
362 | unsigned long flags; | 355 | unsigned long flags; |
363 | struct zfcp_adapter *adapter = port->adapter; | 356 | struct zfcp_adapter *adapter = port->adapter; |
364 | 357 | ||
365 | write_lock_irqsave(&adapter->erp_lock, flags); | 358 | write_lock_irqsave(&adapter->erp_lock, flags); |
366 | _zfcp_erp_port_forced_reopen(port, clear, id, ref); | 359 | _zfcp_erp_port_forced_reopen(port, clear, id); |
367 | write_unlock_irqrestore(&adapter->erp_lock, flags); | 360 | write_unlock_irqrestore(&adapter->erp_lock, flags); |
368 | } | 361 | } |
369 | 362 | ||
370 | static int _zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id, | 363 | static int _zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id) |
371 | void *ref) | ||
372 | { | 364 | { |
373 | zfcp_erp_port_block(port, clear); | 365 | zfcp_erp_port_block(port, clear); |
374 | zfcp_scsi_schedule_rport_block(port); | 366 | zfcp_scsi_schedule_rport_block(port); |
@@ -380,24 +372,25 @@ static int _zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id, | |||
380 | } | 372 | } |
381 | 373 | ||
382 | return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT, | 374 | return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT, |
383 | port->adapter, port, NULL, id, ref, 0); | 375 | port->adapter, port, NULL, id, 0); |
384 | } | 376 | } |
385 | 377 | ||
386 | /** | 378 | /** |
387 | * zfcp_erp_port_reopen - trigger remote port recovery | 379 | * zfcp_erp_port_reopen - trigger remote port recovery |
388 | * @port: port to recover | 380 | * @port: port to recover |
389 | * @clear_mask: flags in port status to be cleared | 381 | * @clear_mask: flags in port status to be cleared |
382 | * @id: Id for debug trace event. | ||
390 | * | 383 | * |
391 | * Returns 0 if recovery has been triggered, < 0 if not. | 384 | * Returns 0 if recovery has been triggered, < 0 if not. |
392 | */ | 385 | */ |
393 | int zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id, void *ref) | 386 | int zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id) |
394 | { | 387 | { |
395 | int retval; | 388 | int retval; |
396 | unsigned long flags; | 389 | unsigned long flags; |
397 | struct zfcp_adapter *adapter = port->adapter; | 390 | struct zfcp_adapter *adapter = port->adapter; |
398 | 391 | ||
399 | write_lock_irqsave(&adapter->erp_lock, flags); | 392 | write_lock_irqsave(&adapter->erp_lock, flags); |
400 | retval = _zfcp_erp_port_reopen(port, clear, id, ref); | 393 | retval = _zfcp_erp_port_reopen(port, clear, id); |
401 | write_unlock_irqrestore(&adapter->erp_lock, flags); | 394 | write_unlock_irqrestore(&adapter->erp_lock, flags); |
402 | 395 | ||
403 | return retval; | 396 | return retval; |
@@ -410,7 +403,7 @@ static void zfcp_erp_lun_block(struct scsi_device *sdev, int clear_mask) | |||
410 | } | 403 | } |
411 | 404 | ||
412 | static void _zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id, | 405 | static void _zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id, |
413 | void *ref, u32 act_status) | 406 | u32 act_status) |
414 | { | 407 | { |
415 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | 408 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); |
416 | struct zfcp_adapter *adapter = zfcp_sdev->port->adapter; | 409 | struct zfcp_adapter *adapter = zfcp_sdev->port->adapter; |
@@ -421,17 +414,18 @@ static void _zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id, | |||
421 | return; | 414 | return; |
422 | 415 | ||
423 | zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_LUN, adapter, | 416 | zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_LUN, adapter, |
424 | zfcp_sdev->port, sdev, id, ref, act_status); | 417 | zfcp_sdev->port, sdev, id, act_status); |
425 | } | 418 | } |
426 | 419 | ||
427 | /** | 420 | /** |
428 | * zfcp_erp_lun_reopen - initiate reopen of a LUN | 421 | * zfcp_erp_lun_reopen - initiate reopen of a LUN |
429 | * @sdev: SCSI device / LUN to be reopened | 422 | * @sdev: SCSI device / LUN to be reopened |
430 | * @clear_mask: specifies flags in LUN status to be cleared | 423 | * @clear_mask: specifies flags in LUN status to be cleared |
424 | * @id: Id for debug trace event. | ||
425 | * | ||
431 | * Return: 0 on success, < 0 on error | 426 | * Return: 0 on success, < 0 on error |
432 | */ | 427 | */ |
433 | void zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id, | 428 | void zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id) |
434 | void *ref) | ||
435 | { | 429 | { |
436 | unsigned long flags; | 430 | unsigned long flags; |
437 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | 431 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); |
@@ -439,7 +433,7 @@ void zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id, | |||
439 | struct zfcp_adapter *adapter = port->adapter; | 433 | struct zfcp_adapter *adapter = port->adapter; |
440 | 434 | ||
441 | write_lock_irqsave(&adapter->erp_lock, flags); | 435 | write_lock_irqsave(&adapter->erp_lock, flags); |
442 | _zfcp_erp_lun_reopen(sdev, clear, id, ref, 0); | 436 | _zfcp_erp_lun_reopen(sdev, clear, id, 0); |
443 | write_unlock_irqrestore(&adapter->erp_lock, flags); | 437 | write_unlock_irqrestore(&adapter->erp_lock, flags); |
444 | } | 438 | } |
445 | 439 | ||
@@ -448,13 +442,11 @@ void zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id, | |||
448 | * @sdev: SCSI device / LUN to shut down. | 442 | * @sdev: SCSI device / LUN to shut down. |
449 | * @clear: Status flags to clear. | 443 | * @clear: Status flags to clear. |
450 | * @id: Id for debug trace event. | 444 | * @id: Id for debug trace event. |
451 | * @ref: Reference for debug trace event. | ||
452 | */ | 445 | */ |
453 | void zfcp_erp_lun_shutdown(struct scsi_device *sdev, int clear, char *id, | 446 | void zfcp_erp_lun_shutdown(struct scsi_device *sdev, int clear, char *id) |
454 | void *ref) | ||
455 | { | 447 | { |
456 | int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED; | 448 | int flags = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED; |
457 | zfcp_erp_lun_reopen(sdev, clear | flags, id, ref); | 449 | zfcp_erp_lun_reopen(sdev, clear | flags, id); |
458 | } | 450 | } |
459 | 451 | ||
460 | /** | 452 | /** |
@@ -476,7 +468,7 @@ void zfcp_erp_lun_shutdown_wait(struct scsi_device *sdev, char *id) | |||
476 | int clear = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED; | 468 | int clear = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED; |
477 | 469 | ||
478 | write_lock_irqsave(&adapter->erp_lock, flags); | 470 | write_lock_irqsave(&adapter->erp_lock, flags); |
479 | _zfcp_erp_lun_reopen(sdev, clear, id, NULL, ZFCP_STATUS_ERP_NO_REF); | 471 | _zfcp_erp_lun_reopen(sdev, clear, id, ZFCP_STATUS_ERP_NO_REF); |
480 | write_unlock_irqrestore(&adapter->erp_lock, flags); | 472 | write_unlock_irqrestore(&adapter->erp_lock, flags); |
481 | 473 | ||
482 | zfcp_erp_wait(adapter); | 474 | zfcp_erp_wait(adapter); |
@@ -490,14 +482,14 @@ static int status_change_set(unsigned long mask, atomic_t *status) | |||
490 | static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) | 482 | static void zfcp_erp_adapter_unblock(struct zfcp_adapter *adapter) |
491 | { | 483 | { |
492 | if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status)) | 484 | if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status)) |
493 | zfcp_dbf_rec_adapter("eraubl1", NULL, adapter->dbf); | 485 | zfcp_dbf_rec_run("eraubl1", &adapter->erp_action); |
494 | atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status); | 486 | atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &adapter->status); |
495 | } | 487 | } |
496 | 488 | ||
497 | static void zfcp_erp_port_unblock(struct zfcp_port *port) | 489 | static void zfcp_erp_port_unblock(struct zfcp_port *port) |
498 | { | 490 | { |
499 | if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status)) | 491 | if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status)) |
500 | zfcp_dbf_rec_port("erpubl1", NULL, port); | 492 | zfcp_dbf_rec_run("erpubl1", &port->erp_action); |
501 | atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status); | 493 | atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &port->status); |
502 | } | 494 | } |
503 | 495 | ||
@@ -506,14 +498,14 @@ static void zfcp_erp_lun_unblock(struct scsi_device *sdev) | |||
506 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | 498 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); |
507 | 499 | ||
508 | if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &zfcp_sdev->status)) | 500 | if (status_change_set(ZFCP_STATUS_COMMON_UNBLOCKED, &zfcp_sdev->status)) |
509 | zfcp_dbf_rec_lun("erlubl1", NULL, sdev); | 501 | zfcp_dbf_rec_run("erlubl1", &sdev_to_zfcp(sdev)->erp_action); |
510 | atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &zfcp_sdev->status); | 502 | atomic_set_mask(ZFCP_STATUS_COMMON_UNBLOCKED, &zfcp_sdev->status); |
511 | } | 503 | } |
512 | 504 | ||
513 | static void zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action) | 505 | static void zfcp_erp_action_to_running(struct zfcp_erp_action *erp_action) |
514 | { | 506 | { |
515 | list_move(&erp_action->list, &erp_action->adapter->erp_running_head); | 507 | list_move(&erp_action->list, &erp_action->adapter->erp_running_head); |
516 | zfcp_dbf_rec_action("erator1", erp_action); | 508 | zfcp_dbf_rec_run("erator1", erp_action); |
517 | } | 509 | } |
518 | 510 | ||
519 | static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act) | 511 | static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act) |
@@ -530,11 +522,11 @@ static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act) | |||
530 | if (act->status & (ZFCP_STATUS_ERP_DISMISSED | | 522 | if (act->status & (ZFCP_STATUS_ERP_DISMISSED | |
531 | ZFCP_STATUS_ERP_TIMEDOUT)) { | 523 | ZFCP_STATUS_ERP_TIMEDOUT)) { |
532 | req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; | 524 | req->status |= ZFCP_STATUS_FSFREQ_DISMISSED; |
533 | zfcp_dbf_rec_action("erscf_1", act); | 525 | zfcp_dbf_rec_run("erscf_1", act); |
534 | req->erp_action = NULL; | 526 | req->erp_action = NULL; |
535 | } | 527 | } |
536 | if (act->status & ZFCP_STATUS_ERP_TIMEDOUT) | 528 | if (act->status & ZFCP_STATUS_ERP_TIMEDOUT) |
537 | zfcp_dbf_rec_action("erscf_2", act); | 529 | zfcp_dbf_rec_run("erscf_2", act); |
538 | if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED) | 530 | if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED) |
539 | act->fsf_req_id = 0; | 531 | act->fsf_req_id = 0; |
540 | } else | 532 | } else |
@@ -585,40 +577,40 @@ static void zfcp_erp_strategy_memwait(struct zfcp_erp_action *erp_action) | |||
585 | } | 577 | } |
586 | 578 | ||
587 | static void _zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter, | 579 | static void _zfcp_erp_port_reopen_all(struct zfcp_adapter *adapter, |
588 | int clear, char *id, void *ref) | 580 | int clear, char *id) |
589 | { | 581 | { |
590 | struct zfcp_port *port; | 582 | struct zfcp_port *port; |
591 | 583 | ||
592 | read_lock(&adapter->port_list_lock); | 584 | read_lock(&adapter->port_list_lock); |
593 | list_for_each_entry(port, &adapter->port_list, list) | 585 | list_for_each_entry(port, &adapter->port_list, list) |
594 | _zfcp_erp_port_reopen(port, clear, id, ref); | 586 | _zfcp_erp_port_reopen(port, clear, id); |
595 | read_unlock(&adapter->port_list_lock); | 587 | read_unlock(&adapter->port_list_lock); |
596 | } | 588 | } |
597 | 589 | ||
598 | static void _zfcp_erp_lun_reopen_all(struct zfcp_port *port, int clear, | 590 | static void _zfcp_erp_lun_reopen_all(struct zfcp_port *port, int clear, |
599 | char *id, void *ref) | 591 | char *id) |
600 | { | 592 | { |
601 | struct scsi_device *sdev; | 593 | struct scsi_device *sdev; |
602 | 594 | ||
603 | shost_for_each_device(sdev, port->adapter->scsi_host) | 595 | shost_for_each_device(sdev, port->adapter->scsi_host) |
604 | if (sdev_to_zfcp(sdev)->port == port) | 596 | if (sdev_to_zfcp(sdev)->port == port) |
605 | _zfcp_erp_lun_reopen(sdev, clear, id, ref, 0); | 597 | _zfcp_erp_lun_reopen(sdev, clear, id, 0); |
606 | } | 598 | } |
607 | 599 | ||
608 | static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act) | 600 | static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act) |
609 | { | 601 | { |
610 | switch (act->action) { | 602 | switch (act->action) { |
611 | case ZFCP_ERP_ACTION_REOPEN_ADAPTER: | 603 | case ZFCP_ERP_ACTION_REOPEN_ADAPTER: |
612 | _zfcp_erp_adapter_reopen(act->adapter, 0, "ersff_1", NULL); | 604 | _zfcp_erp_adapter_reopen(act->adapter, 0, "ersff_1"); |
613 | break; | 605 | break; |
614 | case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: | 606 | case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: |
615 | _zfcp_erp_port_forced_reopen(act->port, 0, "ersff_2", NULL); | 607 | _zfcp_erp_port_forced_reopen(act->port, 0, "ersff_2"); |
616 | break; | 608 | break; |
617 | case ZFCP_ERP_ACTION_REOPEN_PORT: | 609 | case ZFCP_ERP_ACTION_REOPEN_PORT: |
618 | _zfcp_erp_port_reopen(act->port, 0, "ersff_3", NULL); | 610 | _zfcp_erp_port_reopen(act->port, 0, "ersff_3"); |
619 | break; | 611 | break; |
620 | case ZFCP_ERP_ACTION_REOPEN_LUN: | 612 | case ZFCP_ERP_ACTION_REOPEN_LUN: |
621 | _zfcp_erp_lun_reopen(act->sdev, 0, "ersff_4", NULL, 0); | 613 | _zfcp_erp_lun_reopen(act->sdev, 0, "ersff_4", 0); |
622 | break; | 614 | break; |
623 | } | 615 | } |
624 | } | 616 | } |
@@ -627,13 +619,13 @@ static void zfcp_erp_strategy_followup_success(struct zfcp_erp_action *act) | |||
627 | { | 619 | { |
628 | switch (act->action) { | 620 | switch (act->action) { |
629 | case ZFCP_ERP_ACTION_REOPEN_ADAPTER: | 621 | case ZFCP_ERP_ACTION_REOPEN_ADAPTER: |
630 | _zfcp_erp_port_reopen_all(act->adapter, 0, "ersfs_1", NULL); | 622 | _zfcp_erp_port_reopen_all(act->adapter, 0, "ersfs_1"); |
631 | break; | 623 | break; |
632 | case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: | 624 | case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED: |
633 | _zfcp_erp_port_reopen(act->port, 0, "ersfs_2", NULL); | 625 | _zfcp_erp_port_reopen(act->port, 0, "ersfs_2"); |
634 | break; | 626 | break; |
635 | case ZFCP_ERP_ACTION_REOPEN_PORT: | 627 | case ZFCP_ERP_ACTION_REOPEN_PORT: |
636 | _zfcp_erp_lun_reopen_all(act->port, 0, "ersfs_3", NULL); | 628 | _zfcp_erp_lun_reopen_all(act->port, 0, "ersfs_3"); |
637 | break; | 629 | break; |
638 | } | 630 | } |
639 | } | 631 | } |
@@ -652,17 +644,6 @@ static void zfcp_erp_wakeup(struct zfcp_adapter *adapter) | |||
652 | read_unlock_irqrestore(&adapter->erp_lock, flags); | 644 | read_unlock_irqrestore(&adapter->erp_lock, flags); |
653 | } | 645 | } |
654 | 646 | ||
655 | static int zfcp_erp_adapter_strategy_open_qdio(struct zfcp_erp_action *act) | ||
656 | { | ||
657 | struct zfcp_qdio *qdio = act->adapter->qdio; | ||
658 | |||
659 | if (zfcp_qdio_open(qdio)) | ||
660 | return ZFCP_ERP_FAILED; | ||
661 | init_waitqueue_head(&qdio->req_q_wq); | ||
662 | atomic_set_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &act->adapter->status); | ||
663 | return ZFCP_ERP_SUCCEEDED; | ||
664 | } | ||
665 | |||
666 | static void zfcp_erp_enqueue_ptp_port(struct zfcp_adapter *adapter) | 647 | static void zfcp_erp_enqueue_ptp_port(struct zfcp_adapter *adapter) |
667 | { | 648 | { |
668 | struct zfcp_port *port; | 649 | struct zfcp_port *port; |
@@ -670,7 +651,7 @@ static void zfcp_erp_enqueue_ptp_port(struct zfcp_adapter *adapter) | |||
670 | adapter->peer_d_id); | 651 | adapter->peer_d_id); |
671 | if (IS_ERR(port)) /* error or port already attached */ | 652 | if (IS_ERR(port)) /* error or port already attached */ |
672 | return; | 653 | return; |
673 | _zfcp_erp_port_reopen(port, 0, "ereptp1", NULL); | 654 | _zfcp_erp_port_reopen(port, 0, "ereptp1"); |
674 | } | 655 | } |
675 | 656 | ||
676 | static int zfcp_erp_adapter_strat_fsf_xconf(struct zfcp_erp_action *erp_action) | 657 | static int zfcp_erp_adapter_strat_fsf_xconf(struct zfcp_erp_action *erp_action) |
@@ -693,10 +674,8 @@ static int zfcp_erp_adapter_strat_fsf_xconf(struct zfcp_erp_action *erp_action) | |||
693 | return ZFCP_ERP_FAILED; | 674 | return ZFCP_ERP_FAILED; |
694 | } | 675 | } |
695 | 676 | ||
696 | zfcp_dbf_rec_thread_lock("erasfx1", adapter->dbf); | ||
697 | wait_event(adapter->erp_ready_wq, | 677 | wait_event(adapter->erp_ready_wq, |
698 | !list_empty(&adapter->erp_ready_head)); | 678 | !list_empty(&adapter->erp_ready_head)); |
699 | zfcp_dbf_rec_thread_lock("erasfx2", adapter->dbf); | ||
700 | if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) | 679 | if (erp_action->status & ZFCP_STATUS_ERP_TIMEDOUT) |
701 | break; | 680 | break; |
702 | 681 | ||
@@ -735,10 +714,10 @@ static int zfcp_erp_adapter_strategy_open_fsf_xport(struct zfcp_erp_action *act) | |||
735 | if (ret) | 714 | if (ret) |
736 | return ZFCP_ERP_FAILED; | 715 | return ZFCP_ERP_FAILED; |
737 | 716 | ||
738 | zfcp_dbf_rec_thread_lock("erasox1", adapter->dbf); | 717 | zfcp_dbf_rec_run("erasox1", act); |
739 | wait_event(adapter->erp_ready_wq, | 718 | wait_event(adapter->erp_ready_wq, |
740 | !list_empty(&adapter->erp_ready_head)); | 719 | !list_empty(&adapter->erp_ready_head)); |
741 | zfcp_dbf_rec_thread_lock("erasox2", adapter->dbf); | 720 | zfcp_dbf_rec_run("erasox2", act); |
742 | if (act->status & ZFCP_STATUS_ERP_TIMEDOUT) | 721 | if (act->status & ZFCP_STATUS_ERP_TIMEDOUT) |
743 | return ZFCP_ERP_FAILED; | 722 | return ZFCP_ERP_FAILED; |
744 | 723 | ||
@@ -788,7 +767,7 @@ static int zfcp_erp_adapter_strategy_open(struct zfcp_erp_action *act) | |||
788 | { | 767 | { |
789 | struct zfcp_adapter *adapter = act->adapter; | 768 | struct zfcp_adapter *adapter = act->adapter; |
790 | 769 | ||
791 | if (zfcp_erp_adapter_strategy_open_qdio(act)) { | 770 | if (zfcp_qdio_open(adapter->qdio)) { |
792 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK | | 771 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK | |
793 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, | 772 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, |
794 | &adapter->status); | 773 | &adapter->status); |
@@ -1166,7 +1145,7 @@ static int zfcp_erp_strategy_statechange(struct zfcp_erp_action *act, int ret) | |||
1166 | if (zfcp_erp_strat_change_det(&adapter->status, erp_status)) { | 1145 | if (zfcp_erp_strat_change_det(&adapter->status, erp_status)) { |
1167 | _zfcp_erp_adapter_reopen(adapter, | 1146 | _zfcp_erp_adapter_reopen(adapter, |
1168 | ZFCP_STATUS_COMMON_ERP_FAILED, | 1147 | ZFCP_STATUS_COMMON_ERP_FAILED, |
1169 | "ersscg1", NULL); | 1148 | "ersscg1"); |
1170 | return ZFCP_ERP_EXIT; | 1149 | return ZFCP_ERP_EXIT; |
1171 | } | 1150 | } |
1172 | break; | 1151 | break; |
@@ -1176,7 +1155,7 @@ static int zfcp_erp_strategy_statechange(struct zfcp_erp_action *act, int ret) | |||
1176 | if (zfcp_erp_strat_change_det(&port->status, erp_status)) { | 1155 | if (zfcp_erp_strat_change_det(&port->status, erp_status)) { |
1177 | _zfcp_erp_port_reopen(port, | 1156 | _zfcp_erp_port_reopen(port, |
1178 | ZFCP_STATUS_COMMON_ERP_FAILED, | 1157 | ZFCP_STATUS_COMMON_ERP_FAILED, |
1179 | "ersscg2", NULL); | 1158 | "ersscg2"); |
1180 | return ZFCP_ERP_EXIT; | 1159 | return ZFCP_ERP_EXIT; |
1181 | } | 1160 | } |
1182 | break; | 1161 | break; |
@@ -1186,7 +1165,7 @@ static int zfcp_erp_strategy_statechange(struct zfcp_erp_action *act, int ret) | |||
1186 | if (zfcp_erp_strat_change_det(&zfcp_sdev->status, erp_status)) { | 1165 | if (zfcp_erp_strat_change_det(&zfcp_sdev->status, erp_status)) { |
1187 | _zfcp_erp_lun_reopen(sdev, | 1166 | _zfcp_erp_lun_reopen(sdev, |
1188 | ZFCP_STATUS_COMMON_ERP_FAILED, | 1167 | ZFCP_STATUS_COMMON_ERP_FAILED, |
1189 | "ersscg3", NULL, 0); | 1168 | "ersscg3", 0); |
1190 | return ZFCP_ERP_EXIT; | 1169 | return ZFCP_ERP_EXIT; |
1191 | } | 1170 | } |
1192 | break; | 1171 | break; |
@@ -1206,7 +1185,7 @@ static void zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action) | |||
1206 | } | 1185 | } |
1207 | 1186 | ||
1208 | list_del(&erp_action->list); | 1187 | list_del(&erp_action->list); |
1209 | zfcp_dbf_rec_action("eractd1", erp_action); | 1188 | zfcp_dbf_rec_run("eractd1", erp_action); |
1210 | 1189 | ||
1211 | switch (erp_action->action) { | 1190 | switch (erp_action->action) { |
1212 | case ZFCP_ERP_ACTION_REOPEN_LUN: | 1191 | case ZFCP_ERP_ACTION_REOPEN_LUN: |
@@ -1313,7 +1292,7 @@ static int zfcp_erp_strategy(struct zfcp_erp_action *erp_action) | |||
1313 | erp_action->status |= ZFCP_STATUS_ERP_LOWMEM; | 1292 | erp_action->status |= ZFCP_STATUS_ERP_LOWMEM; |
1314 | } | 1293 | } |
1315 | if (adapter->erp_total_count == adapter->erp_low_mem_count) | 1294 | if (adapter->erp_total_count == adapter->erp_low_mem_count) |
1316 | _zfcp_erp_adapter_reopen(adapter, 0, "erstgy1", NULL); | 1295 | _zfcp_erp_adapter_reopen(adapter, 0, "erstgy1"); |
1317 | else { | 1296 | else { |
1318 | zfcp_erp_strategy_memwait(erp_action); | 1297 | zfcp_erp_strategy_memwait(erp_action); |
1319 | retval = ZFCP_ERP_CONTINUES; | 1298 | retval = ZFCP_ERP_CONTINUES; |
@@ -1357,11 +1336,9 @@ static int zfcp_erp_thread(void *data) | |||
1357 | unsigned long flags; | 1336 | unsigned long flags; |
1358 | 1337 | ||
1359 | for (;;) { | 1338 | for (;;) { |
1360 | zfcp_dbf_rec_thread_lock("erthrd1", adapter->dbf); | ||
1361 | wait_event_interruptible(adapter->erp_ready_wq, | 1339 | wait_event_interruptible(adapter->erp_ready_wq, |
1362 | !list_empty(&adapter->erp_ready_head) || | 1340 | !list_empty(&adapter->erp_ready_head) || |
1363 | kthread_should_stop()); | 1341 | kthread_should_stop()); |
1364 | zfcp_dbf_rec_thread_lock("erthrd2", adapter->dbf); | ||
1365 | 1342 | ||
1366 | if (kthread_should_stop()) | 1343 | if (kthread_should_stop()) |
1367 | break; | 1344 | break; |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index bf8f3e514839..6e325284fbe7 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
@@ -45,47 +45,33 @@ extern void zfcp_cfdc_adapter_access_changed(struct zfcp_adapter *); | |||
45 | 45 | ||
46 | /* zfcp_dbf.c */ | 46 | /* zfcp_dbf.c */ |
47 | extern int zfcp_dbf_adapter_register(struct zfcp_adapter *); | 47 | extern int zfcp_dbf_adapter_register(struct zfcp_adapter *); |
48 | extern void zfcp_dbf_adapter_unregister(struct zfcp_dbf *); | 48 | extern void zfcp_dbf_adapter_unregister(struct zfcp_adapter *); |
49 | extern void zfcp_dbf_rec_thread(char *, struct zfcp_dbf *); | 49 | extern void zfcp_dbf_rec_trig(char *, struct zfcp_adapter *, |
50 | extern void zfcp_dbf_rec_thread_lock(char *, struct zfcp_dbf *); | 50 | struct zfcp_port *, struct scsi_device *, u8, u8); |
51 | extern void zfcp_dbf_rec_adapter(char *, void *, struct zfcp_dbf *); | 51 | extern void zfcp_dbf_rec_run(char *, struct zfcp_erp_action *); |
52 | extern void zfcp_dbf_rec_port(char *, void *, struct zfcp_port *); | 52 | extern void zfcp_dbf_hba_fsf_uss(char *, struct zfcp_fsf_req *); |
53 | extern void zfcp_dbf_rec_lun(char *, void *, struct scsi_device *); | 53 | extern void zfcp_dbf_hba_fsf_res(char *, struct zfcp_fsf_req *); |
54 | extern void zfcp_dbf_rec_trigger(char *, void *, u8, u8, void *, | 54 | extern void zfcp_dbf_hba_bit_err(char *, struct zfcp_fsf_req *); |
55 | struct zfcp_adapter *, struct zfcp_port *, | ||
56 | struct scsi_device *); | ||
57 | extern void zfcp_dbf_rec_action(char *, struct zfcp_erp_action *); | ||
58 | extern void _zfcp_dbf_hba_fsf_response(const char *, int, struct zfcp_fsf_req *, | ||
59 | struct zfcp_dbf *); | ||
60 | extern void _zfcp_dbf_hba_fsf_unsol(const char *, int level, struct zfcp_dbf *, | ||
61 | struct fsf_status_read_buffer *); | ||
62 | extern void zfcp_dbf_hba_qdio(struct zfcp_dbf *, unsigned int, int, int); | ||
63 | extern void zfcp_dbf_hba_berr(struct zfcp_dbf *, struct zfcp_fsf_req *); | 55 | extern void zfcp_dbf_hba_berr(struct zfcp_dbf *, struct zfcp_fsf_req *); |
64 | extern void zfcp_dbf_san_ct_request(struct zfcp_fsf_req *, u32); | 56 | extern void zfcp_dbf_san_req(char *, struct zfcp_fsf_req *, u32); |
65 | extern void zfcp_dbf_san_ct_response(struct zfcp_fsf_req *); | 57 | extern void zfcp_dbf_san_res(char *, struct zfcp_fsf_req *); |
66 | extern void zfcp_dbf_san_els_request(struct zfcp_fsf_req *); | 58 | extern void zfcp_dbf_san_in_els(char *, struct zfcp_fsf_req *); |
67 | extern void zfcp_dbf_san_els_response(struct zfcp_fsf_req *); | 59 | extern void zfcp_dbf_scsi(char *, struct scsi_cmnd *, struct zfcp_fsf_req *); |
68 | extern void zfcp_dbf_san_incoming_els(struct zfcp_fsf_req *); | ||
69 | extern void _zfcp_dbf_scsi(const char *, const char *, int, struct zfcp_dbf *, | ||
70 | struct scsi_cmnd *, struct zfcp_fsf_req *, | ||
71 | unsigned long); | ||
72 | 60 | ||
73 | /* zfcp_erp.c */ | 61 | /* zfcp_erp.c */ |
74 | extern void zfcp_erp_set_adapter_status(struct zfcp_adapter *, u32); | 62 | extern void zfcp_erp_set_adapter_status(struct zfcp_adapter *, u32); |
75 | extern void zfcp_erp_clear_adapter_status(struct zfcp_adapter *, u32); | 63 | extern void zfcp_erp_clear_adapter_status(struct zfcp_adapter *, u32); |
76 | extern void zfcp_erp_adapter_reopen(struct zfcp_adapter *, int, char *, void *); | 64 | extern void zfcp_erp_adapter_reopen(struct zfcp_adapter *, int, char *); |
77 | extern void zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int, char *, | 65 | extern void zfcp_erp_adapter_shutdown(struct zfcp_adapter *, int, char *); |
78 | void *); | ||
79 | extern void zfcp_erp_set_port_status(struct zfcp_port *, u32); | 66 | extern void zfcp_erp_set_port_status(struct zfcp_port *, u32); |
80 | extern void zfcp_erp_clear_port_status(struct zfcp_port *, u32); | 67 | extern void zfcp_erp_clear_port_status(struct zfcp_port *, u32); |
81 | extern int zfcp_erp_port_reopen(struct zfcp_port *, int, char *, void *); | 68 | extern int zfcp_erp_port_reopen(struct zfcp_port *, int, char *); |
82 | extern void zfcp_erp_port_shutdown(struct zfcp_port *, int, char *, void *); | 69 | extern void zfcp_erp_port_shutdown(struct zfcp_port *, int, char *); |
83 | extern void zfcp_erp_port_forced_reopen(struct zfcp_port *, int, char *, | 70 | extern void zfcp_erp_port_forced_reopen(struct zfcp_port *, int, char *); |
84 | void *); | ||
85 | extern void zfcp_erp_set_lun_status(struct scsi_device *, u32); | 71 | extern void zfcp_erp_set_lun_status(struct scsi_device *, u32); |
86 | extern void zfcp_erp_clear_lun_status(struct scsi_device *, u32); | 72 | extern void zfcp_erp_clear_lun_status(struct scsi_device *, u32); |
87 | extern void zfcp_erp_lun_reopen(struct scsi_device *, int, char *, void *); | 73 | extern void zfcp_erp_lun_reopen(struct scsi_device *, int, char *); |
88 | extern void zfcp_erp_lun_shutdown(struct scsi_device *, int, char *, void *); | 74 | extern void zfcp_erp_lun_shutdown(struct scsi_device *, int, char *); |
89 | extern void zfcp_erp_lun_shutdown_wait(struct scsi_device *, char *); | 75 | extern void zfcp_erp_lun_shutdown_wait(struct scsi_device *, char *); |
90 | extern int zfcp_erp_thread_setup(struct zfcp_adapter *); | 76 | extern int zfcp_erp_thread_setup(struct zfcp_adapter *); |
91 | extern void zfcp_erp_thread_kill(struct zfcp_adapter *); | 77 | extern void zfcp_erp_thread_kill(struct zfcp_adapter *); |
@@ -149,6 +135,8 @@ extern int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *, struct zfcp_qdio_req *, | |||
149 | extern int zfcp_qdio_open(struct zfcp_qdio *); | 135 | extern int zfcp_qdio_open(struct zfcp_qdio *); |
150 | extern void zfcp_qdio_close(struct zfcp_qdio *); | 136 | extern void zfcp_qdio_close(struct zfcp_qdio *); |
151 | extern void zfcp_qdio_siosl(struct zfcp_adapter *); | 137 | extern void zfcp_qdio_siosl(struct zfcp_adapter *); |
138 | extern struct zfcp_fsf_req *zfcp_fsf_get_req(struct zfcp_qdio *, | ||
139 | struct qdio_buffer *); | ||
152 | 140 | ||
153 | /* zfcp_scsi.c */ | 141 | /* zfcp_scsi.c */ |
154 | extern struct zfcp_data zfcp_data; | 142 | extern struct zfcp_data zfcp_data; |
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index 86fd905df48b..30cf91a787a3 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
@@ -174,7 +174,7 @@ static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range, | |||
174 | if (!port->d_id) | 174 | if (!port->d_id) |
175 | zfcp_erp_port_reopen(port, | 175 | zfcp_erp_port_reopen(port, |
176 | ZFCP_STATUS_COMMON_ERP_FAILED, | 176 | ZFCP_STATUS_COMMON_ERP_FAILED, |
177 | "fcrscn1", NULL); | 177 | "fcrscn1"); |
178 | } | 178 | } |
179 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | 179 | read_unlock_irqrestore(&adapter->port_list_lock, flags); |
180 | } | 180 | } |
@@ -215,7 +215,7 @@ static void zfcp_fc_incoming_wwpn(struct zfcp_fsf_req *req, u64 wwpn) | |||
215 | read_lock_irqsave(&adapter->port_list_lock, flags); | 215 | read_lock_irqsave(&adapter->port_list_lock, flags); |
216 | list_for_each_entry(port, &adapter->port_list, list) | 216 | list_for_each_entry(port, &adapter->port_list, list) |
217 | if (port->wwpn == wwpn) { | 217 | if (port->wwpn == wwpn) { |
218 | zfcp_erp_port_forced_reopen(port, 0, "fciwwp1", req); | 218 | zfcp_erp_port_forced_reopen(port, 0, "fciwwp1"); |
219 | break; | 219 | break; |
220 | } | 220 | } |
221 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | 221 | read_unlock_irqrestore(&adapter->port_list_lock, flags); |
@@ -251,7 +251,7 @@ void zfcp_fc_incoming_els(struct zfcp_fsf_req *fsf_req) | |||
251 | (struct fsf_status_read_buffer *) fsf_req->data; | 251 | (struct fsf_status_read_buffer *) fsf_req->data; |
252 | unsigned int els_type = status_buffer->payload.data[0]; | 252 | unsigned int els_type = status_buffer->payload.data[0]; |
253 | 253 | ||
254 | zfcp_dbf_san_incoming_els(fsf_req); | 254 | zfcp_dbf_san_in_els("fciels1", fsf_req); |
255 | if (els_type == ELS_PLOGI) | 255 | if (els_type == ELS_PLOGI) |
256 | zfcp_fc_incoming_plogi(fsf_req); | 256 | zfcp_fc_incoming_plogi(fsf_req); |
257 | else if (els_type == ELS_LOGO) | 257 | else if (els_type == ELS_LOGO) |
@@ -360,7 +360,7 @@ void zfcp_fc_port_did_lookup(struct work_struct *work) | |||
360 | ret = zfcp_fc_ns_gid_pn(port); | 360 | ret = zfcp_fc_ns_gid_pn(port); |
361 | if (ret) { | 361 | if (ret) { |
362 | /* could not issue gid_pn for some reason */ | 362 | /* could not issue gid_pn for some reason */ |
363 | zfcp_erp_adapter_reopen(port->adapter, 0, "fcgpn_1", NULL); | 363 | zfcp_erp_adapter_reopen(port->adapter, 0, "fcgpn_1"); |
364 | goto out; | 364 | goto out; |
365 | } | 365 | } |
366 | 366 | ||
@@ -369,7 +369,7 @@ void zfcp_fc_port_did_lookup(struct work_struct *work) | |||
369 | goto out; | 369 | goto out; |
370 | } | 370 | } |
371 | 371 | ||
372 | zfcp_erp_port_reopen(port, 0, "fcgpn_3", NULL); | 372 | zfcp_erp_port_reopen(port, 0, "fcgpn_3"); |
373 | out: | 373 | out: |
374 | put_device(&port->dev); | 374 | put_device(&port->dev); |
375 | } | 375 | } |
@@ -426,7 +426,7 @@ static void zfcp_fc_adisc_handler(void *data) | |||
426 | if (adisc->els.status) { | 426 | if (adisc->els.status) { |
427 | /* request rejected or timed out */ | 427 | /* request rejected or timed out */ |
428 | zfcp_erp_port_forced_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, | 428 | zfcp_erp_port_forced_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, |
429 | "fcadh_1", NULL); | 429 | "fcadh_1"); |
430 | goto out; | 430 | goto out; |
431 | } | 431 | } |
432 | 432 | ||
@@ -436,7 +436,7 @@ static void zfcp_fc_adisc_handler(void *data) | |||
436 | if ((port->wwpn != adisc_resp->adisc_wwpn) || | 436 | if ((port->wwpn != adisc_resp->adisc_wwpn) || |
437 | !(atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN)) { | 437 | !(atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN)) { |
438 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, | 438 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, |
439 | "fcadh_2", NULL); | 439 | "fcadh_2"); |
440 | goto out; | 440 | goto out; |
441 | } | 441 | } |
442 | 442 | ||
@@ -507,7 +507,7 @@ void zfcp_fc_link_test_work(struct work_struct *work) | |||
507 | 507 | ||
508 | /* send of ADISC was not possible */ | 508 | /* send of ADISC was not possible */ |
509 | atomic_clear_mask(ZFCP_STATUS_PORT_LINK_TEST, &port->status); | 509 | atomic_clear_mask(ZFCP_STATUS_PORT_LINK_TEST, &port->status); |
510 | zfcp_erp_port_forced_reopen(port, 0, "fcltwk1", NULL); | 510 | zfcp_erp_port_forced_reopen(port, 0, "fcltwk1"); |
511 | 511 | ||
512 | out: | 512 | out: |
513 | put_device(&port->dev); | 513 | put_device(&port->dev); |
@@ -659,7 +659,7 @@ static int zfcp_fc_eval_gpn_ft(struct zfcp_fc_gpn_ft *gpn_ft, | |||
659 | port = zfcp_port_enqueue(adapter, acc->fp_wwpn, | 659 | port = zfcp_port_enqueue(adapter, acc->fp_wwpn, |
660 | ZFCP_STATUS_COMMON_NOESC, d_id); | 660 | ZFCP_STATUS_COMMON_NOESC, d_id); |
661 | if (!IS_ERR(port)) | 661 | if (!IS_ERR(port)) |
662 | zfcp_erp_port_reopen(port, 0, "fcegpf1", NULL); | 662 | zfcp_erp_port_reopen(port, 0, "fcegpf1"); |
663 | else if (PTR_ERR(port) != -EEXIST) | 663 | else if (PTR_ERR(port) != -EEXIST) |
664 | ret = PTR_ERR(port); | 664 | ret = PTR_ERR(port); |
665 | } | 665 | } |
@@ -671,7 +671,7 @@ static int zfcp_fc_eval_gpn_ft(struct zfcp_fc_gpn_ft *gpn_ft, | |||
671 | write_unlock_irqrestore(&adapter->port_list_lock, flags); | 671 | write_unlock_irqrestore(&adapter->port_list_lock, flags); |
672 | 672 | ||
673 | list_for_each_entry_safe(port, tmp, &remove_lh, list) { | 673 | list_for_each_entry_safe(port, tmp, &remove_lh, list) { |
674 | zfcp_erp_port_shutdown(port, 0, "fcegpf2", NULL); | 674 | zfcp_erp_port_shutdown(port, 0, "fcegpf2"); |
675 | zfcp_device_unregister(&port->dev, &zfcp_sysfs_port_attrs); | 675 | zfcp_device_unregister(&port->dev, &zfcp_sysfs_port_attrs); |
676 | } | 676 | } |
677 | 677 | ||
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 2eb7dd56ab80..60ff9d172c79 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -23,7 +23,7 @@ static void zfcp_fsf_request_timeout_handler(unsigned long data) | |||
23 | struct zfcp_adapter *adapter = (struct zfcp_adapter *) data; | 23 | struct zfcp_adapter *adapter = (struct zfcp_adapter *) data; |
24 | zfcp_qdio_siosl(adapter); | 24 | zfcp_qdio_siosl(adapter); |
25 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, | 25 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, |
26 | "fsrth_1", NULL); | 26 | "fsrth_1"); |
27 | } | 27 | } |
28 | 28 | ||
29 | static void zfcp_fsf_start_timer(struct zfcp_fsf_req *fsf_req, | 29 | static void zfcp_fsf_start_timer(struct zfcp_fsf_req *fsf_req, |
@@ -65,7 +65,7 @@ static void zfcp_fsf_class_not_supp(struct zfcp_fsf_req *req) | |||
65 | { | 65 | { |
66 | dev_err(&req->adapter->ccw_device->dev, "FCP device not " | 66 | dev_err(&req->adapter->ccw_device->dev, "FCP device not " |
67 | "operational because of an unsupported FC class\n"); | 67 | "operational because of an unsupported FC class\n"); |
68 | zfcp_erp_adapter_shutdown(req->adapter, 0, "fscns_1", req); | 68 | zfcp_erp_adapter_shutdown(req->adapter, 0, "fscns_1"); |
69 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 69 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
70 | } | 70 | } |
71 | 71 | ||
@@ -98,7 +98,7 @@ static void zfcp_fsf_status_read_port_closed(struct zfcp_fsf_req *req) | |||
98 | read_lock_irqsave(&adapter->port_list_lock, flags); | 98 | read_lock_irqsave(&adapter->port_list_lock, flags); |
99 | list_for_each_entry(port, &adapter->port_list, list) | 99 | list_for_each_entry(port, &adapter->port_list, list) |
100 | if (port->d_id == d_id) { | 100 | if (port->d_id == d_id) { |
101 | zfcp_erp_port_reopen(port, 0, "fssrpc1", req); | 101 | zfcp_erp_port_reopen(port, 0, "fssrpc1"); |
102 | break; | 102 | break; |
103 | } | 103 | } |
104 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | 104 | read_unlock_irqrestore(&adapter->port_list_lock, flags); |
@@ -211,13 +211,13 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req) | |||
211 | struct fsf_status_read_buffer *sr_buf = req->data; | 211 | struct fsf_status_read_buffer *sr_buf = req->data; |
212 | 212 | ||
213 | if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED) { | 213 | if (req->status & ZFCP_STATUS_FSFREQ_DISMISSED) { |
214 | zfcp_dbf_hba_fsf_unsol("dism", adapter->dbf, sr_buf); | 214 | zfcp_dbf_hba_fsf_uss("fssrh_1", req); |
215 | mempool_free(sr_buf, adapter->pool.status_read_data); | 215 | mempool_free(sr_buf, adapter->pool.status_read_data); |
216 | zfcp_fsf_req_free(req); | 216 | zfcp_fsf_req_free(req); |
217 | return; | 217 | return; |
218 | } | 218 | } |
219 | 219 | ||
220 | zfcp_dbf_hba_fsf_unsol("read", adapter->dbf, sr_buf); | 220 | zfcp_dbf_hba_fsf_uss("fssrh_2", req); |
221 | 221 | ||
222 | switch (sr_buf->status_type) { | 222 | switch (sr_buf->status_type) { |
223 | case FSF_STATUS_READ_PORT_CLOSED: | 223 | case FSF_STATUS_READ_PORT_CLOSED: |
@@ -232,7 +232,7 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req) | |||
232 | dev_warn(&adapter->ccw_device->dev, | 232 | dev_warn(&adapter->ccw_device->dev, |
233 | "The error threshold for checksum statistics " | 233 | "The error threshold for checksum statistics " |
234 | "has been exceeded\n"); | 234 | "has been exceeded\n"); |
235 | zfcp_dbf_hba_berr(adapter->dbf, req); | 235 | zfcp_dbf_hba_bit_err("fssrh_3", req); |
236 | break; | 236 | break; |
237 | case FSF_STATUS_READ_LINK_DOWN: | 237 | case FSF_STATUS_READ_LINK_DOWN: |
238 | zfcp_fsf_status_read_link_down(req); | 238 | zfcp_fsf_status_read_link_down(req); |
@@ -247,7 +247,7 @@ static void zfcp_fsf_status_read_handler(struct zfcp_fsf_req *req) | |||
247 | zfcp_erp_adapter_reopen(adapter, | 247 | zfcp_erp_adapter_reopen(adapter, |
248 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | | 248 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | |
249 | ZFCP_STATUS_COMMON_ERP_FAILED, | 249 | ZFCP_STATUS_COMMON_ERP_FAILED, |
250 | "fssrh_2", req); | 250 | "fssrh_2"); |
251 | zfcp_fc_enqueue_event(adapter, FCH_EVT_LINKUP, 0); | 251 | zfcp_fc_enqueue_event(adapter, FCH_EVT_LINKUP, 0); |
252 | 252 | ||
253 | break; | 253 | break; |
@@ -287,7 +287,7 @@ static void zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *req) | |||
287 | "The FCP adapter reported a problem " | 287 | "The FCP adapter reported a problem " |
288 | "that cannot be recovered\n"); | 288 | "that cannot be recovered\n"); |
289 | zfcp_qdio_siosl(req->adapter); | 289 | zfcp_qdio_siosl(req->adapter); |
290 | zfcp_erp_adapter_shutdown(req->adapter, 0, "fsfsqe1", req); | 290 | zfcp_erp_adapter_shutdown(req->adapter, 0, "fsfsqe1"); |
291 | break; | 291 | break; |
292 | } | 292 | } |
293 | /* all non-return stats set FSFREQ_ERROR*/ | 293 | /* all non-return stats set FSFREQ_ERROR*/ |
@@ -304,7 +304,7 @@ static void zfcp_fsf_fsfstatus_eval(struct zfcp_fsf_req *req) | |||
304 | dev_err(&req->adapter->ccw_device->dev, | 304 | dev_err(&req->adapter->ccw_device->dev, |
305 | "The FCP adapter does not recognize the command 0x%x\n", | 305 | "The FCP adapter does not recognize the command 0x%x\n", |
306 | req->qtcb->header.fsf_command); | 306 | req->qtcb->header.fsf_command); |
307 | zfcp_erp_adapter_shutdown(req->adapter, 0, "fsfse_1", req); | 307 | zfcp_erp_adapter_shutdown(req->adapter, 0, "fsfse_1"); |
308 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 308 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
309 | break; | 309 | break; |
310 | case FSF_ADAPTER_STATUS_AVAILABLE: | 310 | case FSF_ADAPTER_STATUS_AVAILABLE: |
@@ -335,17 +335,17 @@ static void zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *req) | |||
335 | "QTCB version 0x%x not supported by FCP adapter " | 335 | "QTCB version 0x%x not supported by FCP adapter " |
336 | "(0x%x to 0x%x)\n", FSF_QTCB_CURRENT_VERSION, | 336 | "(0x%x to 0x%x)\n", FSF_QTCB_CURRENT_VERSION, |
337 | psq->word[0], psq->word[1]); | 337 | psq->word[0], psq->word[1]); |
338 | zfcp_erp_adapter_shutdown(adapter, 0, "fspse_1", req); | 338 | zfcp_erp_adapter_shutdown(adapter, 0, "fspse_1"); |
339 | break; | 339 | break; |
340 | case FSF_PROT_ERROR_STATE: | 340 | case FSF_PROT_ERROR_STATE: |
341 | case FSF_PROT_SEQ_NUMB_ERROR: | 341 | case FSF_PROT_SEQ_NUMB_ERROR: |
342 | zfcp_erp_adapter_reopen(adapter, 0, "fspse_2", req); | 342 | zfcp_erp_adapter_reopen(adapter, 0, "fspse_2"); |
343 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 343 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
344 | break; | 344 | break; |
345 | case FSF_PROT_UNSUPP_QTCB_TYPE: | 345 | case FSF_PROT_UNSUPP_QTCB_TYPE: |
346 | dev_err(&adapter->ccw_device->dev, | 346 | dev_err(&adapter->ccw_device->dev, |
347 | "The QTCB type is not supported by the FCP adapter\n"); | 347 | "The QTCB type is not supported by the FCP adapter\n"); |
348 | zfcp_erp_adapter_shutdown(adapter, 0, "fspse_3", req); | 348 | zfcp_erp_adapter_shutdown(adapter, 0, "fspse_3"); |
349 | break; | 349 | break; |
350 | case FSF_PROT_HOST_CONNECTION_INITIALIZING: | 350 | case FSF_PROT_HOST_CONNECTION_INITIALIZING: |
351 | atomic_set_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT, | 351 | atomic_set_mask(ZFCP_STATUS_ADAPTER_HOST_CON_INIT, |
@@ -355,12 +355,12 @@ static void zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *req) | |||
355 | dev_err(&adapter->ccw_device->dev, | 355 | dev_err(&adapter->ccw_device->dev, |
356 | "0x%Lx is an ambiguous request identifier\n", | 356 | "0x%Lx is an ambiguous request identifier\n", |
357 | (unsigned long long)qtcb->bottom.support.req_handle); | 357 | (unsigned long long)qtcb->bottom.support.req_handle); |
358 | zfcp_erp_adapter_shutdown(adapter, 0, "fspse_4", req); | 358 | zfcp_erp_adapter_shutdown(adapter, 0, "fspse_4"); |
359 | break; | 359 | break; |
360 | case FSF_PROT_LINK_DOWN: | 360 | case FSF_PROT_LINK_DOWN: |
361 | zfcp_fsf_link_down_info_eval(req, &psq->link_down_info); | 361 | zfcp_fsf_link_down_info_eval(req, &psq->link_down_info); |
362 | /* go through reopen to flush pending requests */ | 362 | /* go through reopen to flush pending requests */ |
363 | zfcp_erp_adapter_reopen(adapter, 0, "fspse_6", req); | 363 | zfcp_erp_adapter_reopen(adapter, 0, "fspse_6"); |
364 | break; | 364 | break; |
365 | case FSF_PROT_REEST_QUEUE: | 365 | case FSF_PROT_REEST_QUEUE: |
366 | /* All ports should be marked as ready to run again */ | 366 | /* All ports should be marked as ready to run again */ |
@@ -369,14 +369,14 @@ static void zfcp_fsf_protstatus_eval(struct zfcp_fsf_req *req) | |||
369 | zfcp_erp_adapter_reopen(adapter, | 369 | zfcp_erp_adapter_reopen(adapter, |
370 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | | 370 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | |
371 | ZFCP_STATUS_COMMON_ERP_FAILED, | 371 | ZFCP_STATUS_COMMON_ERP_FAILED, |
372 | "fspse_8", req); | 372 | "fspse_8"); |
373 | break; | 373 | break; |
374 | default: | 374 | default: |
375 | dev_err(&adapter->ccw_device->dev, | 375 | dev_err(&adapter->ccw_device->dev, |
376 | "0x%x is not a valid transfer protocol status\n", | 376 | "0x%x is not a valid transfer protocol status\n", |
377 | qtcb->prefix.prot_status); | 377 | qtcb->prefix.prot_status); |
378 | zfcp_qdio_siosl(adapter); | 378 | zfcp_qdio_siosl(adapter); |
379 | zfcp_erp_adapter_shutdown(adapter, 0, "fspse_9", req); | 379 | zfcp_erp_adapter_shutdown(adapter, 0, "fspse_9"); |
380 | } | 380 | } |
381 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 381 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
382 | } | 382 | } |
@@ -482,7 +482,7 @@ static int zfcp_fsf_exchange_config_evaluate(struct zfcp_fsf_req *req) | |||
482 | dev_err(&adapter->ccw_device->dev, | 482 | dev_err(&adapter->ccw_device->dev, |
483 | "Unknown or unsupported arbitrated loop " | 483 | "Unknown or unsupported arbitrated loop " |
484 | "fibre channel topology detected\n"); | 484 | "fibre channel topology detected\n"); |
485 | zfcp_erp_adapter_shutdown(adapter, 0, "fsece_1", req); | 485 | zfcp_erp_adapter_shutdown(adapter, 0, "fsece_1"); |
486 | return -EIO; | 486 | return -EIO; |
487 | } | 487 | } |
488 | 488 | ||
@@ -518,7 +518,7 @@ static void zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *req) | |||
518 | "FCP adapter maximum QTCB size (%d bytes) " | 518 | "FCP adapter maximum QTCB size (%d bytes) " |
519 | "is too small\n", | 519 | "is too small\n", |
520 | bottom->max_qtcb_size); | 520 | bottom->max_qtcb_size); |
521 | zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh1", req); | 521 | zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh1"); |
522 | return; | 522 | return; |
523 | } | 523 | } |
524 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, | 524 | atomic_set_mask(ZFCP_STATUS_ADAPTER_XCONFIG_OK, |
@@ -536,7 +536,7 @@ static void zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *req) | |||
536 | &qtcb->header.fsf_status_qual.link_down_info); | 536 | &qtcb->header.fsf_status_qual.link_down_info); |
537 | break; | 537 | break; |
538 | default: | 538 | default: |
539 | zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh3", req); | 539 | zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh3"); |
540 | return; | 540 | return; |
541 | } | 541 | } |
542 | 542 | ||
@@ -552,14 +552,14 @@ static void zfcp_fsf_exchange_config_data_handler(struct zfcp_fsf_req *req) | |||
552 | dev_err(&adapter->ccw_device->dev, | 552 | dev_err(&adapter->ccw_device->dev, |
553 | "The FCP adapter only supports newer " | 553 | "The FCP adapter only supports newer " |
554 | "control block versions\n"); | 554 | "control block versions\n"); |
555 | zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh4", req); | 555 | zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh4"); |
556 | return; | 556 | return; |
557 | } | 557 | } |
558 | if (FSF_QTCB_CURRENT_VERSION > bottom->high_qtcb_version) { | 558 | if (FSF_QTCB_CURRENT_VERSION > bottom->high_qtcb_version) { |
559 | dev_err(&adapter->ccw_device->dev, | 559 | dev_err(&adapter->ccw_device->dev, |
560 | "The FCP adapter only supports older " | 560 | "The FCP adapter only supports older " |
561 | "control block versions\n"); | 561 | "control block versions\n"); |
562 | zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh5", req); | 562 | zfcp_erp_adapter_shutdown(adapter, 0, "fsecdh5"); |
563 | } | 563 | } |
564 | } | 564 | } |
565 | 565 | ||
@@ -700,7 +700,7 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req) | |||
700 | del_timer(&req->timer); | 700 | del_timer(&req->timer); |
701 | /* lookup request again, list might have changed */ | 701 | /* lookup request again, list might have changed */ |
702 | zfcp_reqlist_find_rm(adapter->req_list, req_id); | 702 | zfcp_reqlist_find_rm(adapter->req_list, req_id); |
703 | zfcp_erp_adapter_reopen(adapter, 0, "fsrs__1", req); | 703 | zfcp_erp_adapter_reopen(adapter, 0, "fsrs__1"); |
704 | return -EIO; | 704 | return -EIO; |
705 | } | 705 | } |
706 | 706 | ||
@@ -754,10 +754,11 @@ int zfcp_fsf_status_read(struct zfcp_qdio *qdio) | |||
754 | goto out; | 754 | goto out; |
755 | 755 | ||
756 | failed_req_send: | 756 | failed_req_send: |
757 | req->data = NULL; | ||
757 | mempool_free(sr_buf, adapter->pool.status_read_data); | 758 | mempool_free(sr_buf, adapter->pool.status_read_data); |
758 | failed_buf: | 759 | failed_buf: |
760 | zfcp_dbf_hba_fsf_uss("fssr__1", req); | ||
759 | zfcp_fsf_req_free(req); | 761 | zfcp_fsf_req_free(req); |
760 | zfcp_dbf_hba_fsf_unsol("fail", adapter->dbf, NULL); | ||
761 | out: | 762 | out: |
762 | spin_unlock_irq(&qdio->req_q_lock); | 763 | spin_unlock_irq(&qdio->req_q_lock); |
763 | return retval; | 764 | return retval; |
@@ -776,14 +777,13 @@ static void zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *req) | |||
776 | case FSF_PORT_HANDLE_NOT_VALID: | 777 | case FSF_PORT_HANDLE_NOT_VALID: |
777 | if (fsq->word[0] == fsq->word[1]) { | 778 | if (fsq->word[0] == fsq->word[1]) { |
778 | zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, | 779 | zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, |
779 | "fsafch1", req); | 780 | "fsafch1"); |
780 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 781 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
781 | } | 782 | } |
782 | break; | 783 | break; |
783 | case FSF_LUN_HANDLE_NOT_VALID: | 784 | case FSF_LUN_HANDLE_NOT_VALID: |
784 | if (fsq->word[0] == fsq->word[1]) { | 785 | if (fsq->word[0] == fsq->word[1]) { |
785 | zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fsafch2", | 786 | zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fsafch2"); |
786 | req); | ||
787 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 787 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
788 | } | 788 | } |
789 | break; | 789 | break; |
@@ -794,14 +794,13 @@ static void zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *req) | |||
794 | zfcp_erp_set_port_status(zfcp_sdev->port, | 794 | zfcp_erp_set_port_status(zfcp_sdev->port, |
795 | ZFCP_STATUS_COMMON_ACCESS_BOXED); | 795 | ZFCP_STATUS_COMMON_ACCESS_BOXED); |
796 | zfcp_erp_port_reopen(zfcp_sdev->port, | 796 | zfcp_erp_port_reopen(zfcp_sdev->port, |
797 | ZFCP_STATUS_COMMON_ERP_FAILED, "fsafch3", | 797 | ZFCP_STATUS_COMMON_ERP_FAILED, "fsafch3"); |
798 | req); | ||
799 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 798 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
800 | break; | 799 | break; |
801 | case FSF_LUN_BOXED: | 800 | case FSF_LUN_BOXED: |
802 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ACCESS_BOXED); | 801 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ACCESS_BOXED); |
803 | zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED, | 802 | zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED, |
804 | "fsafch4", req); | 803 | "fsafch4"); |
805 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 804 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
806 | break; | 805 | break; |
807 | case FSF_ADAPTER_STATUS_AVAILABLE: | 806 | case FSF_ADAPTER_STATUS_AVAILABLE: |
@@ -882,7 +881,7 @@ static void zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *req) | |||
882 | 881 | ||
883 | switch (header->fsf_status) { | 882 | switch (header->fsf_status) { |
884 | case FSF_GOOD: | 883 | case FSF_GOOD: |
885 | zfcp_dbf_san_ct_response(req); | 884 | zfcp_dbf_san_res("fsscth1", req); |
886 | ct->status = 0; | 885 | ct->status = 0; |
887 | break; | 886 | break; |
888 | case FSF_SERVICE_CLASS_NOT_SUPPORTED: | 887 | case FSF_SERVICE_CLASS_NOT_SUPPORTED: |
@@ -902,7 +901,7 @@ static void zfcp_fsf_send_ct_handler(struct zfcp_fsf_req *req) | |||
902 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 901 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
903 | break; | 902 | break; |
904 | case FSF_PORT_HANDLE_NOT_VALID: | 903 | case FSF_PORT_HANDLE_NOT_VALID: |
905 | zfcp_erp_adapter_reopen(adapter, 0, "fsscth1", req); | 904 | zfcp_erp_adapter_reopen(adapter, 0, "fsscth1"); |
906 | /* fall through */ | 905 | /* fall through */ |
907 | case FSF_GENERIC_COMMAND_REJECTED: | 906 | case FSF_GENERIC_COMMAND_REJECTED: |
908 | case FSF_PAYLOAD_SIZE_MISMATCH: | 907 | case FSF_PAYLOAD_SIZE_MISMATCH: |
@@ -1025,7 +1024,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, | |||
1025 | req->qtcb->header.port_handle = wka_port->handle; | 1024 | req->qtcb->header.port_handle = wka_port->handle; |
1026 | req->data = ct; | 1025 | req->data = ct; |
1027 | 1026 | ||
1028 | zfcp_dbf_san_ct_request(req, wka_port->d_id); | 1027 | zfcp_dbf_san_req("fssct_1", req, wka_port->d_id); |
1029 | 1028 | ||
1030 | ret = zfcp_fsf_req_send(req); | 1029 | ret = zfcp_fsf_req_send(req); |
1031 | if (ret) | 1030 | if (ret) |
@@ -1053,7 +1052,7 @@ static void zfcp_fsf_send_els_handler(struct zfcp_fsf_req *req) | |||
1053 | 1052 | ||
1054 | switch (header->fsf_status) { | 1053 | switch (header->fsf_status) { |
1055 | case FSF_GOOD: | 1054 | case FSF_GOOD: |
1056 | zfcp_dbf_san_els_response(req); | 1055 | zfcp_dbf_san_res("fsselh1", req); |
1057 | send_els->status = 0; | 1056 | send_els->status = 0; |
1058 | break; | 1057 | break; |
1059 | case FSF_SERVICE_CLASS_NOT_SUPPORTED: | 1058 | case FSF_SERVICE_CLASS_NOT_SUPPORTED: |
@@ -1127,7 +1126,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, | |||
1127 | req->handler = zfcp_fsf_send_els_handler; | 1126 | req->handler = zfcp_fsf_send_els_handler; |
1128 | req->data = els; | 1127 | req->data = els; |
1129 | 1128 | ||
1130 | zfcp_dbf_san_els_request(req); | 1129 | zfcp_dbf_san_req("fssels1", req, d_id); |
1131 | 1130 | ||
1132 | ret = zfcp_fsf_req_send(req); | 1131 | ret = zfcp_fsf_req_send(req); |
1133 | if (ret) | 1132 | if (ret) |
@@ -1448,7 +1447,7 @@ static void zfcp_fsf_close_port_handler(struct zfcp_fsf_req *req) | |||
1448 | 1447 | ||
1449 | switch (req->qtcb->header.fsf_status) { | 1448 | switch (req->qtcb->header.fsf_status) { |
1450 | case FSF_PORT_HANDLE_NOT_VALID: | 1449 | case FSF_PORT_HANDLE_NOT_VALID: |
1451 | zfcp_erp_adapter_reopen(port->adapter, 0, "fscph_1", req); | 1450 | zfcp_erp_adapter_reopen(port->adapter, 0, "fscph_1"); |
1452 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1451 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1453 | break; | 1452 | break; |
1454 | case FSF_ADAPTER_STATUS_AVAILABLE: | 1453 | case FSF_ADAPTER_STATUS_AVAILABLE: |
@@ -1580,7 +1579,7 @@ static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req) | |||
1580 | 1579 | ||
1581 | if (req->qtcb->header.fsf_status == FSF_PORT_HANDLE_NOT_VALID) { | 1580 | if (req->qtcb->header.fsf_status == FSF_PORT_HANDLE_NOT_VALID) { |
1582 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1581 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1583 | zfcp_erp_adapter_reopen(wka_port->adapter, 0, "fscwph1", req); | 1582 | zfcp_erp_adapter_reopen(wka_port->adapter, 0, "fscwph1"); |
1584 | } | 1583 | } |
1585 | 1584 | ||
1586 | wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE; | 1585 | wka_port->status = ZFCP_FC_WKA_PORT_OFFLINE; |
@@ -1638,7 +1637,7 @@ static void zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *req) | |||
1638 | 1637 | ||
1639 | switch (header->fsf_status) { | 1638 | switch (header->fsf_status) { |
1640 | case FSF_PORT_HANDLE_NOT_VALID: | 1639 | case FSF_PORT_HANDLE_NOT_VALID: |
1641 | zfcp_erp_adapter_reopen(port->adapter, 0, "fscpph1", req); | 1640 | zfcp_erp_adapter_reopen(port->adapter, 0, "fscpph1"); |
1642 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1641 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1643 | break; | 1642 | break; |
1644 | case FSF_ACCESS_DENIED: | 1643 | case FSF_ACCESS_DENIED: |
@@ -1654,7 +1653,7 @@ static void zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *req) | |||
1654 | &sdev_to_zfcp(sdev)->status); | 1653 | &sdev_to_zfcp(sdev)->status); |
1655 | zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_ACCESS_BOXED); | 1654 | zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_ACCESS_BOXED); |
1656 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, | 1655 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, |
1657 | "fscpph2", req); | 1656 | "fscpph2"); |
1658 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1657 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1659 | break; | 1658 | break; |
1660 | case FSF_ADAPTER_STATUS_AVAILABLE: | 1659 | case FSF_ADAPTER_STATUS_AVAILABLE: |
@@ -1743,7 +1742,7 @@ static void zfcp_fsf_open_lun_handler(struct zfcp_fsf_req *req) | |||
1743 | switch (header->fsf_status) { | 1742 | switch (header->fsf_status) { |
1744 | 1743 | ||
1745 | case FSF_PORT_HANDLE_NOT_VALID: | 1744 | case FSF_PORT_HANDLE_NOT_VALID: |
1746 | zfcp_erp_adapter_reopen(adapter, 0, "fsouh_1", req); | 1745 | zfcp_erp_adapter_reopen(adapter, 0, "fsouh_1"); |
1747 | /* fall through */ | 1746 | /* fall through */ |
1748 | case FSF_LUN_ALREADY_OPEN: | 1747 | case FSF_LUN_ALREADY_OPEN: |
1749 | break; | 1748 | break; |
@@ -1755,8 +1754,7 @@ static void zfcp_fsf_open_lun_handler(struct zfcp_fsf_req *req) | |||
1755 | zfcp_erp_set_port_status(zfcp_sdev->port, | 1754 | zfcp_erp_set_port_status(zfcp_sdev->port, |
1756 | ZFCP_STATUS_COMMON_ACCESS_BOXED); | 1755 | ZFCP_STATUS_COMMON_ACCESS_BOXED); |
1757 | zfcp_erp_port_reopen(zfcp_sdev->port, | 1756 | zfcp_erp_port_reopen(zfcp_sdev->port, |
1758 | ZFCP_STATUS_COMMON_ERP_FAILED, "fsouh_2", | 1757 | ZFCP_STATUS_COMMON_ERP_FAILED, "fsouh_2"); |
1759 | req); | ||
1760 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1758 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1761 | break; | 1759 | break; |
1762 | case FSF_LUN_SHARING_VIOLATION: | 1760 | case FSF_LUN_SHARING_VIOLATION: |
@@ -1852,20 +1850,18 @@ static void zfcp_fsf_close_lun_handler(struct zfcp_fsf_req *req) | |||
1852 | 1850 | ||
1853 | switch (req->qtcb->header.fsf_status) { | 1851 | switch (req->qtcb->header.fsf_status) { |
1854 | case FSF_PORT_HANDLE_NOT_VALID: | 1852 | case FSF_PORT_HANDLE_NOT_VALID: |
1855 | zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fscuh_1", | 1853 | zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fscuh_1"); |
1856 | req); | ||
1857 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1854 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1858 | break; | 1855 | break; |
1859 | case FSF_LUN_HANDLE_NOT_VALID: | 1856 | case FSF_LUN_HANDLE_NOT_VALID: |
1860 | zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fscuh_2", req); | 1857 | zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fscuh_2"); |
1861 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1858 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1862 | break; | 1859 | break; |
1863 | case FSF_PORT_BOXED: | 1860 | case FSF_PORT_BOXED: |
1864 | zfcp_erp_set_port_status(zfcp_sdev->port, | 1861 | zfcp_erp_set_port_status(zfcp_sdev->port, |
1865 | ZFCP_STATUS_COMMON_ACCESS_BOXED); | 1862 | ZFCP_STATUS_COMMON_ACCESS_BOXED); |
1866 | zfcp_erp_port_reopen(zfcp_sdev->port, | 1863 | zfcp_erp_port_reopen(zfcp_sdev->port, |
1867 | ZFCP_STATUS_COMMON_ERP_FAILED, "fscuh_3", | 1864 | ZFCP_STATUS_COMMON_ERP_FAILED, "fscuh_3"); |
1868 | req); | ||
1869 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 1865 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
1870 | break; | 1866 | break; |
1871 | case FSF_ADAPTER_STATUS_AVAILABLE: | 1867 | case FSF_ADAPTER_STATUS_AVAILABLE: |
@@ -2002,13 +1998,12 @@ static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req) | |||
2002 | switch (header->fsf_status) { | 1998 | switch (header->fsf_status) { |
2003 | case FSF_HANDLE_MISMATCH: | 1999 | case FSF_HANDLE_MISMATCH: |
2004 | case FSF_PORT_HANDLE_NOT_VALID: | 2000 | case FSF_PORT_HANDLE_NOT_VALID: |
2005 | zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fssfch1", | 2001 | zfcp_erp_adapter_reopen(zfcp_sdev->port->adapter, 0, "fssfch1"); |
2006 | req); | ||
2007 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2002 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2008 | break; | 2003 | break; |
2009 | case FSF_FCPLUN_NOT_VALID: | 2004 | case FSF_FCPLUN_NOT_VALID: |
2010 | case FSF_LUN_HANDLE_NOT_VALID: | 2005 | case FSF_LUN_HANDLE_NOT_VALID: |
2011 | zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fssfch2", req); | 2006 | zfcp_erp_port_reopen(zfcp_sdev->port, 0, "fssfch2"); |
2012 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2007 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2013 | break; | 2008 | break; |
2014 | case FSF_SERVICE_CLASS_NOT_SUPPORTED: | 2009 | case FSF_SERVICE_CLASS_NOT_SUPPORTED: |
@@ -2026,7 +2021,7 @@ static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req) | |||
2026 | (unsigned long long)zfcp_scsi_dev_lun(sdev), | 2021 | (unsigned long long)zfcp_scsi_dev_lun(sdev), |
2027 | (unsigned long long)zfcp_sdev->port->wwpn); | 2022 | (unsigned long long)zfcp_sdev->port->wwpn); |
2028 | zfcp_erp_adapter_shutdown(zfcp_sdev->port->adapter, 0, | 2023 | zfcp_erp_adapter_shutdown(zfcp_sdev->port->adapter, 0, |
2029 | "fssfch3", req); | 2024 | "fssfch3"); |
2030 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2025 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2031 | break; | 2026 | break; |
2032 | case FSF_CMND_LENGTH_NOT_VALID: | 2027 | case FSF_CMND_LENGTH_NOT_VALID: |
@@ -2037,21 +2032,20 @@ static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req) | |||
2037 | (unsigned long long)zfcp_scsi_dev_lun(sdev), | 2032 | (unsigned long long)zfcp_scsi_dev_lun(sdev), |
2038 | (unsigned long long)zfcp_sdev->port->wwpn); | 2033 | (unsigned long long)zfcp_sdev->port->wwpn); |
2039 | zfcp_erp_adapter_shutdown(zfcp_sdev->port->adapter, 0, | 2034 | zfcp_erp_adapter_shutdown(zfcp_sdev->port->adapter, 0, |
2040 | "fssfch4", req); | 2035 | "fssfch4"); |
2041 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2036 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2042 | break; | 2037 | break; |
2043 | case FSF_PORT_BOXED: | 2038 | case FSF_PORT_BOXED: |
2044 | zfcp_erp_set_port_status(zfcp_sdev->port, | 2039 | zfcp_erp_set_port_status(zfcp_sdev->port, |
2045 | ZFCP_STATUS_COMMON_ACCESS_BOXED); | 2040 | ZFCP_STATUS_COMMON_ACCESS_BOXED); |
2046 | zfcp_erp_port_reopen(zfcp_sdev->port, | 2041 | zfcp_erp_port_reopen(zfcp_sdev->port, |
2047 | ZFCP_STATUS_COMMON_ERP_FAILED, "fssfch5", | 2042 | ZFCP_STATUS_COMMON_ERP_FAILED, "fssfch5"); |
2048 | req); | ||
2049 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2043 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2050 | break; | 2044 | break; |
2051 | case FSF_LUN_BOXED: | 2045 | case FSF_LUN_BOXED: |
2052 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ACCESS_BOXED); | 2046 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_ACCESS_BOXED); |
2053 | zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED, | 2047 | zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED, |
2054 | "fssfch6", req); | 2048 | "fssfch6"); |
2055 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; | 2049 | req->status |= ZFCP_STATUS_FSFREQ_ERROR; |
2056 | break; | 2050 | break; |
2057 | case FSF_ADAPTER_STATUS_AVAILABLE: | 2051 | case FSF_ADAPTER_STATUS_AVAILABLE: |
@@ -2104,7 +2098,7 @@ static void zfcp_fsf_fcp_cmnd_handler(struct zfcp_fsf_req *req) | |||
2104 | 2098 | ||
2105 | skip_fsfstatus: | 2099 | skip_fsfstatus: |
2106 | zfcp_fsf_req_trace(req, scpnt); | 2100 | zfcp_fsf_req_trace(req, scpnt); |
2107 | zfcp_dbf_scsi_result(req->adapter->dbf, scpnt, req); | 2101 | zfcp_dbf_scsi_result(scpnt, req); |
2108 | 2102 | ||
2109 | scpnt->host_scribble = NULL; | 2103 | scpnt->host_scribble = NULL; |
2110 | (scpnt->scsi_done) (scpnt); | 2104 | (scpnt->scsi_done) (scpnt); |
@@ -2420,3 +2414,12 @@ void zfcp_fsf_reqid_check(struct zfcp_qdio *qdio, int sbal_idx) | |||
2420 | break; | 2414 | break; |
2421 | } | 2415 | } |
2422 | } | 2416 | } |
2417 | |||
2418 | struct zfcp_fsf_req *zfcp_fsf_get_req(struct zfcp_qdio *qdio, | ||
2419 | struct qdio_buffer *sbal) | ||
2420 | { | ||
2421 | struct qdio_buffer_element *sbale = &sbal->element[0]; | ||
2422 | u64 req_id = (unsigned long) sbale->addr; | ||
2423 | |||
2424 | return zfcp_reqlist_find(qdio->adapter->req_list, req_id); | ||
2425 | } | ||
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index a0554beb4179..2511f92302dd 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
@@ -41,7 +41,7 @@ static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id, | |||
41 | zfcp_qdio_siosl(adapter); | 41 | zfcp_qdio_siosl(adapter); |
42 | zfcp_erp_adapter_reopen(adapter, | 42 | zfcp_erp_adapter_reopen(adapter, |
43 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | | 43 | ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | |
44 | ZFCP_STATUS_COMMON_ERP_FAILED, id, NULL); | 44 | ZFCP_STATUS_COMMON_ERP_FAILED, id); |
45 | } | 45 | } |
46 | 46 | ||
47 | static void zfcp_qdio_zero_sbals(struct qdio_buffer *sbal[], int first, int cnt) | 47 | static void zfcp_qdio_zero_sbals(struct qdio_buffer *sbal[], int first, int cnt) |
@@ -74,7 +74,6 @@ static void zfcp_qdio_int_req(struct ccw_device *cdev, unsigned int qdio_err, | |||
74 | struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; | 74 | struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; |
75 | 75 | ||
76 | if (unlikely(qdio_err)) { | 76 | if (unlikely(qdio_err)) { |
77 | zfcp_dbf_hba_qdio(qdio->adapter->dbf, qdio_err, idx, count); | ||
78 | zfcp_qdio_handler_error(qdio, "qdireq1", qdio_err); | 77 | zfcp_qdio_handler_error(qdio, "qdireq1", qdio_err); |
79 | return; | 78 | return; |
80 | } | 79 | } |
@@ -97,7 +96,6 @@ static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err, | |||
97 | int sbal_idx, sbal_no; | 96 | int sbal_idx, sbal_no; |
98 | 97 | ||
99 | if (unlikely(qdio_err)) { | 98 | if (unlikely(qdio_err)) { |
100 | zfcp_dbf_hba_qdio(qdio->adapter->dbf, qdio_err, idx, count); | ||
101 | zfcp_qdio_handler_error(qdio, "qdires1", qdio_err); | 99 | zfcp_qdio_handler_error(qdio, "qdires1", qdio_err); |
102 | return; | 100 | return; |
103 | } | 101 | } |
@@ -116,7 +114,7 @@ static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err, | |||
116 | * put SBALs back to response queue | 114 | * put SBALs back to response queue |
117 | */ | 115 | */ |
118 | if (do_QDIO(cdev, QDIO_FLAG_SYNC_INPUT, 0, idx, count)) | 116 | if (do_QDIO(cdev, QDIO_FLAG_SYNC_INPUT, 0, idx, count)) |
119 | zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2", NULL); | 117 | zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2"); |
120 | } | 118 | } |
121 | 119 | ||
122 | static struct qdio_buffer_element * | 120 | static struct qdio_buffer_element * |
@@ -236,7 +234,7 @@ int zfcp_qdio_sbal_get(struct zfcp_qdio *qdio) | |||
236 | if (!ret) { | 234 | if (!ret) { |
237 | atomic_inc(&qdio->req_q_full); | 235 | atomic_inc(&qdio->req_q_full); |
238 | /* assume hanging outbound queue, try queue recovery */ | 236 | /* assume hanging outbound queue, try queue recovery */ |
239 | zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1", NULL); | 237 | zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdsbg_1"); |
240 | } | 238 | } |
241 | 239 | ||
242 | spin_lock_irq(&qdio->req_q_lock); | 240 | spin_lock_irq(&qdio->req_q_lock); |
@@ -309,6 +307,7 @@ static int zfcp_qdio_allocate(struct zfcp_qdio *qdio) | |||
309 | return -ENOMEM; | 307 | return -ENOMEM; |
310 | 308 | ||
311 | zfcp_qdio_setup_init_data(&init_data, qdio); | 309 | zfcp_qdio_setup_init_data(&init_data, qdio); |
310 | init_waitqueue_head(&qdio->req_q_wq); | ||
312 | 311 | ||
313 | return qdio_allocate(&init_data); | 312 | return qdio_allocate(&init_data); |
314 | } | 313 | } |
@@ -393,6 +392,7 @@ int zfcp_qdio_open(struct zfcp_qdio *qdio) | |||
393 | /* set index of first avalable SBALS / number of available SBALS */ | 392 | /* set index of first avalable SBALS / number of available SBALS */ |
394 | qdio->req_q_idx = 0; | 393 | qdio->req_q_idx = 0; |
395 | atomic_set(&qdio->req_q_free, QDIO_MAX_BUFFERS_PER_Q); | 394 | atomic_set(&qdio->req_q_free, QDIO_MAX_BUFFERS_PER_Q); |
395 | atomic_set_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status); | ||
396 | 396 | ||
397 | return 0; | 397 | return 0; |
398 | 398 | ||
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 63529ed801eb..ddb5800823a9 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -30,6 +30,10 @@ module_param_named(dif, enable_dif, bool, 0600); | |||
30 | MODULE_PARM_DESC(dif, "Enable DIF/DIX data integrity support"); | 30 | MODULE_PARM_DESC(dif, "Enable DIF/DIX data integrity support"); |
31 | #endif | 31 | #endif |
32 | 32 | ||
33 | static bool allow_lun_scan = 1; | ||
34 | module_param(allow_lun_scan, bool, 0600); | ||
35 | MODULE_PARM_DESC(allow_lun_scan, "For NPIV, scan and attach all storage LUNs"); | ||
36 | |||
33 | static int zfcp_scsi_change_queue_depth(struct scsi_device *sdev, int depth, | 37 | static int zfcp_scsi_change_queue_depth(struct scsi_device *sdev, int depth, |
34 | int reason) | 38 | int reason) |
35 | { | 39 | { |
@@ -68,11 +72,8 @@ static int zfcp_scsi_slave_configure(struct scsi_device *sdp) | |||
68 | 72 | ||
69 | static void zfcp_scsi_command_fail(struct scsi_cmnd *scpnt, int result) | 73 | static void zfcp_scsi_command_fail(struct scsi_cmnd *scpnt, int result) |
70 | { | 74 | { |
71 | struct zfcp_adapter *adapter = | ||
72 | (struct zfcp_adapter *) scpnt->device->host->hostdata[0]; | ||
73 | |||
74 | set_host_byte(scpnt, result); | 75 | set_host_byte(scpnt, result); |
75 | zfcp_dbf_scsi_fail_send(adapter->dbf, scpnt); | 76 | zfcp_dbf_scsi_fail_send(scpnt); |
76 | scpnt->scsi_done(scpnt); | 77 | scpnt->scsi_done(scpnt); |
77 | } | 78 | } |
78 | 79 | ||
@@ -80,7 +81,6 @@ static | |||
80 | int zfcp_scsi_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scpnt) | 81 | int zfcp_scsi_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scpnt) |
81 | { | 82 | { |
82 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device); | 83 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device); |
83 | struct zfcp_adapter *adapter = zfcp_sdev->port->adapter; | ||
84 | struct fc_rport *rport = starget_to_rport(scsi_target(scpnt->device)); | 84 | struct fc_rport *rport = starget_to_rport(scsi_target(scpnt->device)); |
85 | int status, scsi_result, ret; | 85 | int status, scsi_result, ret; |
86 | 86 | ||
@@ -91,7 +91,7 @@ int zfcp_scsi_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scpnt) | |||
91 | scsi_result = fc_remote_port_chkready(rport); | 91 | scsi_result = fc_remote_port_chkready(rport); |
92 | if (unlikely(scsi_result)) { | 92 | if (unlikely(scsi_result)) { |
93 | scpnt->result = scsi_result; | 93 | scpnt->result = scsi_result; |
94 | zfcp_dbf_scsi_fail_send(adapter->dbf, scpnt); | 94 | zfcp_dbf_scsi_fail_send(scpnt); |
95 | scpnt->scsi_done(scpnt); | 95 | scpnt->scsi_done(scpnt); |
96 | return 0; | 96 | return 0; |
97 | } | 97 | } |
@@ -134,6 +134,7 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdev) | |||
134 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); | 134 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev); |
135 | struct zfcp_port *port; | 135 | struct zfcp_port *port; |
136 | struct zfcp_unit *unit; | 136 | struct zfcp_unit *unit; |
137 | int npiv = adapter->connection_features & FSF_FEATURE_NPIV_MODE; | ||
137 | 138 | ||
138 | port = zfcp_get_port_by_wwpn(adapter, rport->port_name); | 139 | port = zfcp_get_port_by_wwpn(adapter, rport->port_name); |
139 | if (!port) | 140 | if (!port) |
@@ -143,7 +144,7 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdev) | |||
143 | if (unit) | 144 | if (unit) |
144 | put_device(&unit->dev); | 145 | put_device(&unit->dev); |
145 | 146 | ||
146 | if (!unit && !(adapter->connection_features & FSF_FEATURE_NPIV_MODE)) { | 147 | if (!unit && !(allow_lun_scan && npiv)) { |
147 | put_device(&port->dev); | 148 | put_device(&port->dev); |
148 | return -ENXIO; | 149 | return -ENXIO; |
149 | } | 150 | } |
@@ -158,7 +159,7 @@ static int zfcp_scsi_slave_alloc(struct scsi_device *sdev) | |||
158 | spin_lock_init(&zfcp_sdev->latencies.lock); | 159 | spin_lock_init(&zfcp_sdev->latencies.lock); |
159 | 160 | ||
160 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_RUNNING); | 161 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_RUNNING); |
161 | zfcp_erp_lun_reopen(sdev, 0, "scsla_1", NULL); | 162 | zfcp_erp_lun_reopen(sdev, 0, "scsla_1"); |
162 | zfcp_erp_wait(port->adapter); | 163 | zfcp_erp_wait(port->adapter); |
163 | 164 | ||
164 | return 0; | 165 | return 0; |
@@ -182,8 +183,7 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) | |||
182 | old_req = zfcp_reqlist_find(adapter->req_list, old_reqid); | 183 | old_req = zfcp_reqlist_find(adapter->req_list, old_reqid); |
183 | if (!old_req) { | 184 | if (!old_req) { |
184 | write_unlock_irqrestore(&adapter->abort_lock, flags); | 185 | write_unlock_irqrestore(&adapter->abort_lock, flags); |
185 | zfcp_dbf_scsi_abort("lte1", adapter->dbf, scpnt, NULL, | 186 | zfcp_dbf_scsi_abort("abrt_or", scpnt, NULL); |
186 | old_reqid); | ||
187 | return FAILED; /* completion could be in progress */ | 187 | return FAILED; /* completion could be in progress */ |
188 | } | 188 | } |
189 | old_req->data = NULL; | 189 | old_req->data = NULL; |
@@ -198,29 +198,32 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt) | |||
198 | 198 | ||
199 | zfcp_erp_wait(adapter); | 199 | zfcp_erp_wait(adapter); |
200 | ret = fc_block_scsi_eh(scpnt); | 200 | ret = fc_block_scsi_eh(scpnt); |
201 | if (ret) | 201 | if (ret) { |
202 | zfcp_dbf_scsi_abort("abrt_bl", scpnt, NULL); | ||
202 | return ret; | 203 | return ret; |
204 | } | ||
203 | if (!(atomic_read(&adapter->status) & | 205 | if (!(atomic_read(&adapter->status) & |
204 | ZFCP_STATUS_COMMON_RUNNING)) { | 206 | ZFCP_STATUS_COMMON_RUNNING)) { |
205 | zfcp_dbf_scsi_abort("nres", adapter->dbf, scpnt, NULL, | 207 | zfcp_dbf_scsi_abort("abrt_ru", scpnt, NULL); |
206 | old_reqid); | ||
207 | return SUCCESS; | 208 | return SUCCESS; |
208 | } | 209 | } |
209 | } | 210 | } |
210 | if (!abrt_req) | 211 | if (!abrt_req) { |
212 | zfcp_dbf_scsi_abort("abrt_ar", scpnt, NULL); | ||
211 | return FAILED; | 213 | return FAILED; |
214 | } | ||
212 | 215 | ||
213 | wait_for_completion(&abrt_req->completion); | 216 | wait_for_completion(&abrt_req->completion); |
214 | 217 | ||
215 | if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED) | 218 | if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED) |
216 | dbf_tag = "okay"; | 219 | dbf_tag = "abrt_ok"; |
217 | else if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED) | 220 | else if (abrt_req->status & ZFCP_STATUS_FSFREQ_ABORTNOTNEEDED) |
218 | dbf_tag = "lte2"; | 221 | dbf_tag = "abrt_nn"; |
219 | else { | 222 | else { |
220 | dbf_tag = "fail"; | 223 | dbf_tag = "abrt_fa"; |
221 | retval = FAILED; | 224 | retval = FAILED; |
222 | } | 225 | } |
223 | zfcp_dbf_scsi_abort(dbf_tag, adapter->dbf, scpnt, abrt_req, old_reqid); | 226 | zfcp_dbf_scsi_abort(dbf_tag, scpnt, abrt_req); |
224 | zfcp_fsf_req_free(abrt_req); | 227 | zfcp_fsf_req_free(abrt_req); |
225 | return retval; | 228 | return retval; |
226 | } | 229 | } |
@@ -280,7 +283,7 @@ static int zfcp_scsi_eh_host_reset_handler(struct scsi_cmnd *scpnt) | |||
280 | struct zfcp_adapter *adapter = zfcp_sdev->port->adapter; | 283 | struct zfcp_adapter *adapter = zfcp_sdev->port->adapter; |
281 | int ret; | 284 | int ret; |
282 | 285 | ||
283 | zfcp_erp_adapter_reopen(adapter, 0, "schrh_1", scpnt); | 286 | zfcp_erp_adapter_reopen(adapter, 0, "schrh_1"); |
284 | zfcp_erp_wait(adapter); | 287 | zfcp_erp_wait(adapter); |
285 | ret = fc_block_scsi_eh(scpnt); | 288 | ret = fc_block_scsi_eh(scpnt); |
286 | if (ret) | 289 | if (ret) |
@@ -518,7 +521,7 @@ static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport) | |||
518 | port = zfcp_get_port_by_wwpn(adapter, rport->port_name); | 521 | port = zfcp_get_port_by_wwpn(adapter, rport->port_name); |
519 | 522 | ||
520 | if (port) { | 523 | if (port) { |
521 | zfcp_erp_port_forced_reopen(port, 0, "sctrpi1", NULL); | 524 | zfcp_erp_port_forced_reopen(port, 0, "sctrpi1"); |
522 | put_device(&port->dev); | 525 | put_device(&port->dev); |
523 | } | 526 | } |
524 | } | 527 | } |
diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c index 2f2c54f4718f..cdc4ff78a7ba 100644 --- a/drivers/s390/scsi/zfcp_sysfs.c +++ b/drivers/s390/scsi/zfcp_sysfs.c | |||
@@ -105,8 +105,7 @@ static ssize_t zfcp_sysfs_port_failed_store(struct device *dev, | |||
105 | return -EINVAL; | 105 | return -EINVAL; |
106 | 106 | ||
107 | zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_RUNNING); | 107 | zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_RUNNING); |
108 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, "sypfai2", | 108 | zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, "sypfai2"); |
109 | NULL); | ||
110 | zfcp_erp_wait(port->adapter); | 109 | zfcp_erp_wait(port->adapter); |
111 | 110 | ||
112 | return count; | 111 | return count; |
@@ -148,7 +147,7 @@ static ssize_t zfcp_sysfs_unit_failed_store(struct device *dev, | |||
148 | if (sdev) { | 147 | if (sdev) { |
149 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_RUNNING); | 148 | zfcp_erp_set_lun_status(sdev, ZFCP_STATUS_COMMON_RUNNING); |
150 | zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED, | 149 | zfcp_erp_lun_reopen(sdev, ZFCP_STATUS_COMMON_ERP_FAILED, |
151 | "syufai2", NULL); | 150 | "syufai2"); |
152 | zfcp_erp_wait(unit->port->adapter); | 151 | zfcp_erp_wait(unit->port->adapter); |
153 | } else | 152 | } else |
154 | zfcp_unit_scsi_scan(unit); | 153 | zfcp_unit_scsi_scan(unit); |
@@ -198,7 +197,7 @@ static ssize_t zfcp_sysfs_adapter_failed_store(struct device *dev, | |||
198 | 197 | ||
199 | zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING); | 198 | zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING); |
200 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, | 199 | zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, |
201 | "syafai2", NULL); | 200 | "syafai2"); |
202 | zfcp_erp_wait(adapter); | 201 | zfcp_erp_wait(adapter); |
203 | out: | 202 | out: |
204 | zfcp_ccw_adapter_put(adapter); | 203 | zfcp_ccw_adapter_put(adapter); |
@@ -256,7 +255,7 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, | |||
256 | 255 | ||
257 | put_device(&port->dev); | 256 | put_device(&port->dev); |
258 | 257 | ||
259 | zfcp_erp_port_shutdown(port, 0, "syprs_1", NULL); | 258 | zfcp_erp_port_shutdown(port, 0, "syprs_1"); |
260 | zfcp_device_unregister(&port->dev, &zfcp_sysfs_port_attrs); | 259 | zfcp_device_unregister(&port->dev, &zfcp_sysfs_port_attrs); |
261 | out: | 260 | out: |
262 | zfcp_ccw_adapter_put(adapter); | 261 | zfcp_ccw_adapter_put(adapter); |