ehea: error handling improvement
Subsystems (2)
PATCH 1/2 ehea: error handling improvement
Reset a port's resources only if they're actually in an error state
---
Patch created against 2.6.34-rc4
/drivers/net/ehea/ehea_main.c +26 -5
@@ -791,11 +791,17 @@ static struct ehea_cqe *ehea_proc_cqes(s cqe_counter++;rmb ();if (cqe->status &EHEA_CQE_STAT_ERR_MASK ) { -ehea_error ("Send Completion Error: Resetting port" ); +ehea_error ("Bad send completion status=0x%04X" , + cqe->status); +if (netif_msg_tx_err (pr->port))ehea_dump (cqe,sizeof (*cqe),"Send CQE" ); -ehea_schedule_port_reset (pr->port); -break ; + +if (cqe->status &EHEA_CQE_STAT_RESET_MASK ) { +ehea_error ("Resetting port" ); +ehea_schedule_port_reset (pr->port); +break ; + } }if (netif_msg_tx_done (pr->port))
@@ -901,6 +907,8 @@ static irqreturn_t ehea_qp_aff_irq_handlstruct ehea_eqe *eqe;struct ehea_qp *qp;u32 qp_token; +u64 resource_type, aer, aerr; +int reset_port =0 ; eqe =ehea_poll_eq (port->qp_eq);
@@ -910,11 +918,24 @@ static irqreturn_t ehea_qp_aff_irq_handl eqe->entry, qp_token); qp = port->port_res[qp_token].qp; -ehea_error_data (port->adapter, qp->fw_handle); + + resource_type =ehea_error_data (port->adapter, qp->fw_handle, + &aer, &aerr); + +if (resource_type ==EHEA_AER_RESTYPE_QP ) { +if ((aer &EHEA_AER_RESET_MASK ) || + (aerr &EHEA_AERR_RESET_MASK )) + reset_port =1 ; + }else + reset_port =1 ;/* Reset in case of CQ or EQ error */ + eqe =ehea_poll_eq (port->qp_eq); } -ehea_schedule_port_reset (port); +if (reset_port) { +ehea_error ("Resetting port" ); +ehea_schedule_port_reset (port); + }return IRQ_HANDLED ; }
/drivers/net/ehea/ehea_qmr.c +23 -20
107 lines not on this page · raw message
/drivers/net/ehea/ehea_qmr.h +13 -1
@@ -154,6 +154,9 @@ struct ehea_rwqe {#define EHEA_CQE_STAT_ERR_IP 0x2000#define EHEA_CQE_STAT_ERR_CRC 0x1000 +/* Defines which bad send cqe stati lead to a port reset */ +#define EHEA_CQE_STAT_RESET_MASK 0x0002 +struct ehea_cqe {u64 wr_id;/* work request ID from WQE */ u8 type;
@@ -187,6 +190,14 @@ struct ehea_cqe {#define EHEA_EQE_SM_MECH_NUMBER EHEA_BMASK_IBM(48, 55)#define EHEA_EQE_SM_PORT_NUMBER EHEA_BMASK_IBM(56, 63) +#define EHEA_AER_RESTYPE_QP 0x8 +#define EHEA_AER_RESTYPE_CQ 0x4 +#define EHEA_AER_RESTYPE_EQ 0x3 + +/* Defines which affiliated errors lead to a port reset */ +#define EHEA_AER_RESET_MASK 0xFFFFFFFFFEFFFFFFULL +#define EHEA_AERR_RESET_MASK 0xFFFFFFFFFFFFFFFFULL +struct ehea_eqe {u64 entry; };
@@ -379,7 +390,8 @@ int ehea_gen_smr(struct ehea_adapter *adint ehea_rem_mr (struct ehea_mr *mr); -void ehea_error_data (struct ehea_adapter *adapter,u64 res_handle); +u64 ehea_error_data (struct ehea_adapter *adapter,u64 res_handle, +u64 *aer,u64 *aerr);int ehea_add_sect_bmap (unsigned long pfn,unsigned long nr_pages);int ehea_rem_sect_bmap (unsigned long pfn,unsigned long nr_pages);
David Miller
maintainerFrom: Thomas Klein <[email protected]>
Date: Mon, 19 Apr 2010 14:08:11 +0200
Quoted 6 lines
Reset a port's resources only if they're actually in an error state
Signed-off-by Thomas Klein <[email protected]>---
Patch created against 2.6.34-rc4
There are several problems with these patches:
1) They are corrupted by your email client, lines unchanged begin with one space character instead of two. Therefore even 'patch' wouldn't accept these changes.
2) The double slash in the patch file paths make git not accept the change. Please don't put double-slashes in your patch paths as that canonically means "/".
3) These are not appropriate for net-2.6 as we are deep in the -rcX series at this point and only the most diabolical bug fixes are appropriate. Therefore, please generate these against net-next-2.6, thanks.