From: Vinay Shaw Date: Sat, 16 Jul 2016 06:32:54 +0000 (+0200) Subject: sif: xrc: Add handling for xrc_domain_violation & invalid_xrceth events X-Git-Tag: v4.1.12-92~96^2~2 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=d4cec32ea7186cb4353c690726d2d66924697bb6;p=users%2Fjedix%2Flinux-maple.git sif: xrc: Add handling for xrc_domain_violation & invalid_xrceth events XRC spec defines xrc_domain_violation and invalid_xrceth events as affiliated asynchronous error on XRC TGTQP, the QP is marked in ERROR. Map these to ofed's IB_EVENT_QP_FATAL type and qp event handler. Orabug: 24318556 Signed-off-by: Vinay Shaw Reviewed-by: Knut Omang --- diff --git a/drivers/infiniband/hw/sif/sif_eq.c b/drivers/infiniband/hw/sif/sif_eq.c index 1dfa00d5be953..bf1bc691d9762 100644 --- a/drivers/infiniband/hw/sif/sif_eq.c +++ b/drivers/infiniband/hw/sif/sif_eq.c @@ -947,7 +947,10 @@ static int dispatch_eq(struct sif_eq *eq) leqe.event_status_communication_established || leqe.event_status_path_migrated || leqe.event_status_srq_limit_reached || - leqe.event_status_srq_catastrophic_error)) { + leqe.event_status_srq_catastrophic_error || + /* Affiliated async. error on XRC TGTQP mapped to IB_EVENT_QP_FATAL */ + leqe.event_status_invalid_xrceth || + leqe.event_status_xrc_domain_violation)) { struct sif_qp *sif_qp_elem = safe_get_sif_qp(sdev, leqe.qp); bool is_srq_event = (leqe.event_status_srq_limit_reached || leqe.event_status_srq_catastrophic_error); @@ -996,7 +999,9 @@ static int dispatch_eq(struct sif_eq *eq) nevents += handle_event(eq, port_elem, IB_EVENT_CLIENT_REREGISTER); if (leqe.event_status_port_active) nevents += handle_event(eq, port_elem, IB_EVENT_PORT_ACTIVE); - if (leqe.event_status_local_work_queue_catastrophic_error) { + if (leqe.event_status_local_work_queue_catastrophic_error || + leqe.event_status_xrc_domain_violation || + leqe.event_status_invalid_xrceth) { nevents += handle_event(eq, qp_elem, IB_EVENT_QP_FATAL); dump_eq_entry(SIF_INFO, "Got Fatal error", &leqe); } @@ -1033,8 +1038,6 @@ static int dispatch_eq(struct sif_eq *eq) /* TBD: These are the ones that do not map directly to IB errors */ check_for_psif_event(event_status_port_changed); - check_for_psif_event(event_status_invalid_xrceth); - check_for_psif_event(event_status_xrc_domain_violation); if (!nevents) { sif_log(eq->ba.sdev, SIF_INTR, "eq %d: Warning: No events found for seq 0x%x",