diff options
Diffstat (limited to 'drivers/s390/scsi/zfcp_qdio.c')
-rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 68 |
1 files changed, 15 insertions, 53 deletions
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index 06e862d7bc90..24e16ec331d9 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
@@ -229,52 +229,14 @@ zfcp_qdio_handler_error_check(struct zfcp_adapter *adapter, | |||
229 | ZFCP_LOG_TRACE("status is" | 229 | ZFCP_LOG_TRACE("status is" |
230 | " QDIO_STATUS_OUTBOUND_INT \n"); | 230 | " QDIO_STATUS_OUTBOUND_INT \n"); |
231 | } | 231 | } |
232 | } // if (ZFCP_LOG_CHECK(ZFCP_LOG_LEVEL_TRACE)) | 232 | } |
233 | if (unlikely(status & QDIO_STATUS_LOOK_FOR_ERROR)) { | 233 | if (unlikely(status & QDIO_STATUS_LOOK_FOR_ERROR)) { |
234 | retval = -EIO; | 234 | retval = -EIO; |
235 | 235 | ||
236 | ZFCP_LOG_FLAGS(1, "QDIO_STATUS_LOOK_FOR_ERROR \n"); | ||
237 | |||
238 | ZFCP_LOG_INFO("QDIO problem occurred (status=0x%x, " | 236 | ZFCP_LOG_INFO("QDIO problem occurred (status=0x%x, " |
239 | "qdio_error=0x%x, siga_error=0x%x)\n", | 237 | "qdio_error=0x%x, siga_error=0x%x)\n", |
240 | status, qdio_error, siga_error); | 238 | status, qdio_error, siga_error); |
241 | 239 | ||
242 | if (status & QDIO_STATUS_ACTIVATE_CHECK_CONDITION) { | ||
243 | ZFCP_LOG_FLAGS(2, | ||
244 | "QDIO_STATUS_ACTIVATE_CHECK_CONDITION\n"); | ||
245 | } | ||
246 | if (status & QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR) { | ||
247 | ZFCP_LOG_FLAGS(2, | ||
248 | "QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR\n"); | ||
249 | } | ||
250 | if (status & QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR) { | ||
251 | ZFCP_LOG_FLAGS(2, | ||
252 | "QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR\n"); | ||
253 | } | ||
254 | |||
255 | if (siga_error & QDIO_SIGA_ERROR_ACCESS_EXCEPTION) { | ||
256 | ZFCP_LOG_FLAGS(2, "QDIO_SIGA_ERROR_ACCESS_EXCEPTION\n"); | ||
257 | } | ||
258 | |||
259 | if (siga_error & QDIO_SIGA_ERROR_B_BIT_SET) { | ||
260 | ZFCP_LOG_FLAGS(2, "QDIO_SIGA_ERROR_B_BIT_SET\n"); | ||
261 | } | ||
262 | |||
263 | switch (qdio_error) { | ||
264 | case 0: | ||
265 | ZFCP_LOG_FLAGS(3, "QDIO_OK"); | ||
266 | break; | ||
267 | case SLSB_P_INPUT_ERROR: | ||
268 | ZFCP_LOG_FLAGS(1, "SLSB_P_INPUT_ERROR\n"); | ||
269 | break; | ||
270 | case SLSB_P_OUTPUT_ERROR: | ||
271 | ZFCP_LOG_FLAGS(1, "SLSB_P_OUTPUT_ERROR\n"); | ||
272 | break; | ||
273 | default: | ||
274 | ZFCP_LOG_NORMAL("bug: unknown QDIO error 0x%x\n", | ||
275 | qdio_error); | ||
276 | break; | ||
277 | } | ||
278 | /* Restarting IO on the failed adapter from scratch */ | 240 | /* Restarting IO on the failed adapter from scratch */ |
279 | debug_text_event(adapter->erp_dbf, 1, "qdio_err"); | 241 | debug_text_event(adapter->erp_dbf, 1, "qdio_err"); |
280 | /* | 242 | /* |
@@ -484,37 +446,37 @@ int | |||
484 | zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, void *sbale_addr) | 446 | zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, void *sbale_addr) |
485 | { | 447 | { |
486 | struct zfcp_fsf_req *fsf_req; | 448 | struct zfcp_fsf_req *fsf_req; |
487 | int retval = 0; | ||
488 | 449 | ||
489 | /* invalid (per convention used in this driver) */ | 450 | /* invalid (per convention used in this driver) */ |
490 | if (unlikely(!sbale_addr)) { | 451 | if (unlikely(!sbale_addr)) { |
491 | ZFCP_LOG_NORMAL("bug: invalid reqid\n"); | 452 | ZFCP_LOG_NORMAL("bug: invalid reqid\n"); |
492 | retval = -EINVAL; | 453 | return -EINVAL; |
493 | goto out; | ||
494 | } | 454 | } |
495 | 455 | ||
496 | /* valid request id and thus (hopefully :) valid fsf_req address */ | 456 | /* valid request id and thus (hopefully :) valid fsf_req address */ |
497 | fsf_req = (struct zfcp_fsf_req *) sbale_addr; | 457 | fsf_req = (struct zfcp_fsf_req *) sbale_addr; |
498 | 458 | ||
459 | /* serialize with zfcp_fsf_req_dismiss_all */ | ||
460 | spin_lock(&adapter->fsf_req_list_lock); | ||
461 | if (list_empty(&adapter->fsf_req_list_head)) { | ||
462 | spin_unlock(&adapter->fsf_req_list_lock); | ||
463 | return 0; | ||
464 | } | ||
465 | list_del(&fsf_req->list); | ||
466 | atomic_dec(&adapter->fsf_reqs_active); | ||
467 | spin_unlock(&adapter->fsf_req_list_lock); | ||
468 | |||
499 | if (unlikely(adapter != fsf_req->adapter)) { | 469 | if (unlikely(adapter != fsf_req->adapter)) { |
500 | ZFCP_LOG_NORMAL("bug: invalid reqid (fsf_req=%p, " | 470 | ZFCP_LOG_NORMAL("bug: invalid reqid (fsf_req=%p, " |
501 | "fsf_req->adapter=%p, adapter=%p)\n", | 471 | "fsf_req->adapter=%p, adapter=%p)\n", |
502 | fsf_req, fsf_req->adapter, adapter); | 472 | fsf_req, fsf_req->adapter, adapter); |
503 | retval = -EINVAL; | 473 | return -EINVAL; |
504 | goto out; | ||
505 | } | ||
506 | |||
507 | ZFCP_LOG_TRACE("fsf_req at %p, QTCB at %p\n", fsf_req, fsf_req->qtcb); | ||
508 | if (likely(fsf_req->qtcb)) { | ||
509 | ZFCP_LOG_TRACE("hex dump of QTCB:\n"); | ||
510 | ZFCP_HEX_DUMP(ZFCP_LOG_LEVEL_TRACE, (char *) fsf_req->qtcb, | ||
511 | sizeof(struct fsf_qtcb)); | ||
512 | } | 474 | } |
513 | 475 | ||
514 | /* finish the FSF request */ | 476 | /* finish the FSF request */ |
515 | zfcp_fsf_req_complete(fsf_req); | 477 | zfcp_fsf_req_complete(fsf_req); |
516 | out: | 478 | |
517 | return retval; | 479 | return 0; |
518 | } | 480 | } |
519 | 481 | ||
520 | /** | 482 | /** |