diff options
Diffstat (limited to 'drivers/net/ehea/ehea_main.c')
-rw-r--r-- | drivers/net/ehea/ehea_main.c | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index 3f445efa9482..c35d1e3631d1 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -791,11 +791,17 @@ static struct ehea_cqe *ehea_proc_cqes(struct ehea_port_res *pr, int my_quota) | |||
791 | cqe_counter++; | 791 | cqe_counter++; |
792 | rmb(); | 792 | rmb(); |
793 | if (cqe->status & EHEA_CQE_STAT_ERR_MASK) { | 793 | if (cqe->status & EHEA_CQE_STAT_ERR_MASK) { |
794 | ehea_error("Send Completion Error: Resetting port"); | 794 | ehea_error("Bad send completion status=0x%04X", |
795 | cqe->status); | ||
796 | |||
795 | if (netif_msg_tx_err(pr->port)) | 797 | if (netif_msg_tx_err(pr->port)) |
796 | ehea_dump(cqe, sizeof(*cqe), "Send CQE"); | 798 | ehea_dump(cqe, sizeof(*cqe), "Send CQE"); |
797 | ehea_schedule_port_reset(pr->port); | 799 | |
798 | break; | 800 | if (cqe->status & EHEA_CQE_STAT_RESET_MASK) { |
801 | ehea_error("Resetting port"); | ||
802 | ehea_schedule_port_reset(pr->port); | ||
803 | break; | ||
804 | } | ||
799 | } | 805 | } |
800 | 806 | ||
801 | if (netif_msg_tx_done(pr->port)) | 807 | if (netif_msg_tx_done(pr->port)) |
@@ -901,6 +907,8 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param) | |||
901 | struct ehea_eqe *eqe; | 907 | struct ehea_eqe *eqe; |
902 | struct ehea_qp *qp; | 908 | struct ehea_qp *qp; |
903 | u32 qp_token; | 909 | u32 qp_token; |
910 | u64 resource_type, aer, aerr; | ||
911 | int reset_port = 0; | ||
904 | 912 | ||
905 | eqe = ehea_poll_eq(port->qp_eq); | 913 | eqe = ehea_poll_eq(port->qp_eq); |
906 | 914 | ||
@@ -910,11 +918,24 @@ static irqreturn_t ehea_qp_aff_irq_handler(int irq, void *param) | |||
910 | eqe->entry, qp_token); | 918 | eqe->entry, qp_token); |
911 | 919 | ||
912 | qp = port->port_res[qp_token].qp; | 920 | qp = port->port_res[qp_token].qp; |
913 | ehea_error_data(port->adapter, qp->fw_handle); | 921 | |
922 | resource_type = ehea_error_data(port->adapter, qp->fw_handle, | ||
923 | &aer, &aerr); | ||
924 | |||
925 | if (resource_type == EHEA_AER_RESTYPE_QP) { | ||
926 | if ((aer & EHEA_AER_RESET_MASK) || | ||
927 | (aerr & EHEA_AERR_RESET_MASK)) | ||
928 | reset_port = 1; | ||
929 | } else | ||
930 | reset_port = 1; /* Reset in case of CQ or EQ error */ | ||
931 | |||
914 | eqe = ehea_poll_eq(port->qp_eq); | 932 | eqe = ehea_poll_eq(port->qp_eq); |
915 | } | 933 | } |
916 | 934 | ||
917 | ehea_schedule_port_reset(port); | 935 | if (reset_port) { |
936 | ehea_error("Resetting port"); | ||
937 | ehea_schedule_port_reset(port); | ||
938 | } | ||
918 | 939 | ||
919 | return IRQ_HANDLED; | 940 | return IRQ_HANDLED; |
920 | } | 941 | } |