diff options
author | Jan-Bernd Themann <ossthema@de.ibm.com> | 2007-02-09 03:10:51 -0500 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-02-09 16:09:46 -0500 |
commit | d2db9eea7901d83e494340c93d131fc1fd463e4c (patch) | |
tree | 061610fc0237654c38308b6b1ccdabdc5d59102a /drivers/net/ehea/ehea_qmr.c | |
parent | eaefd5fb7d793c9c1bcef1b0c0d5ec3824a85b91 (diff) |
ehea: Fixed error recovery
Error recovery for QP errors: Reset QPs and dump error information
Signed-off-by: Jan-Bernd Themann <themann@de.ibm.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/ehea/ehea_qmr.c')
-rw-r--r-- | drivers/net/ehea/ehea_qmr.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c index f143e13b229d..96ff3b679996 100644 --- a/drivers/net/ehea/ehea_qmr.c +++ b/drivers/net/ehea/ehea_qmr.c | |||
@@ -486,6 +486,7 @@ int ehea_destroy_qp(struct ehea_qp *qp) | |||
486 | if (!qp) | 486 | if (!qp) |
487 | return 0; | 487 | return 0; |
488 | 488 | ||
489 | ehea_h_disable_and_get_hea(qp->adapter->handle, qp->fw_handle); | ||
489 | hret = ehea_h_free_resource(qp->adapter->handle, qp->fw_handle); | 490 | hret = ehea_h_free_resource(qp->adapter->handle, qp->fw_handle); |
490 | if (hret != H_SUCCESS) { | 491 | if (hret != H_SUCCESS) { |
491 | ehea_error("destroy_qp failed"); | 492 | ehea_error("destroy_qp failed"); |
@@ -581,4 +582,45 @@ out: | |||
581 | return ret; | 582 | return ret; |
582 | } | 583 | } |
583 | 584 | ||
585 | void print_error_data(u64 *data) | ||
586 | { | ||
587 | int length; | ||
588 | u64 type = EHEA_BMASK_GET(ERROR_DATA_TYPE, data[2]); | ||
589 | u64 resource = data[1]; | ||
590 | |||
591 | length = EHEA_BMASK_GET(ERROR_DATA_LENGTH, data[0]); | ||
592 | |||
593 | if (length > EHEA_PAGESIZE) | ||
594 | length = EHEA_PAGESIZE; | ||
595 | |||
596 | if (type == 0x8) /* Queue Pair */ | ||
597 | ehea_error("QP (resource=%lX) state: AER=0x%lX, AERR=0x%lX, " | ||
598 | "port=%lX", resource, data[6], data[12], data[22]); | ||
599 | |||
600 | ehea_dump(data, length, "error data"); | ||
601 | } | ||
602 | |||
603 | void ehea_error_data(struct ehea_adapter *adapter, u64 res_handle) | ||
604 | { | ||
605 | unsigned long ret; | ||
606 | u64 *rblock; | ||
607 | |||
608 | rblock = kzalloc(PAGE_SIZE, GFP_KERNEL); | ||
609 | if (!rblock) { | ||
610 | ehea_error("Cannot allocate rblock memory."); | ||
611 | return; | ||
612 | } | ||
584 | 613 | ||
614 | ret = ehea_h_error_data(adapter->handle, | ||
615 | res_handle, | ||
616 | rblock); | ||
617 | |||
618 | if (ret == H_R_STATE) | ||
619 | ehea_error("No error data is available: %lX.", res_handle); | ||
620 | else if (ret == H_SUCCESS) | ||
621 | print_error_data(rblock); | ||
622 | else | ||
623 | ehea_error("Error data could not be fetched: %lX", res_handle); | ||
624 | |||
625 | kfree(rblock); | ||
626 | } | ||