static void dispatch_port_event(struct ehca_shca *shca, int port_num, enum ib_event_type type, const char *msg) { struct ib_event event; ehca_info(&shca->ib_device, "port %d %s.", port_num, msg); event.device = &shca->ib_device; event.event = type; event.element.port_num = port_num; ib_dispatch_event(&event); }
static void parse_identifier(struct ehca_shca *shca, u64 eqe) { u8 identifier = EHCA_BMASK_GET(EQE_EE_IDENTIFIER, eqe); switch (identifier) { case 0x02: /* path migrated */ qp_event_callback(shca, eqe, IB_EVENT_PATH_MIG, 0); break; case 0x03: /* communication established */ qp_event_callback(shca, eqe, IB_EVENT_COMM_EST, 0); break; case 0x04: /* send queue drained */ qp_event_callback(shca, eqe, IB_EVENT_SQ_DRAINED, 0); break; case 0x05: /* QP error */ case 0x06: /* QP error */ qp_event_callback(shca, eqe, IB_EVENT_QP_FATAL, 1); break; case 0x07: /* CQ error */ case 0x08: /* CQ error */ cq_event_callback(shca, eqe); break; case 0x09: /* MRMWPTE error */ ehca_err(&shca->ib_device, "MRMWPTE error."); break; case 0x0A: /* port event */ ehca_err(&shca->ib_device, "Port event."); break; case 0x0B: /* MR access error */ ehca_err(&shca->ib_device, "MR access error."); break; case 0x0C: /* EQ error */ ehca_err(&shca->ib_device, "EQ error."); break; case 0x0D: /* P/Q_Key mismatch */ ehca_err(&shca->ib_device, "P/Q_Key mismatch."); break; case 0x10: /* sampling complete */ ehca_err(&shca->ib_device, "Sampling complete."); break; case 0x11: /* unaffiliated access error */ ehca_err(&shca->ib_device, "Unaffiliated access error."); break; case 0x12: /* path migrating */ ehca_err(&shca->ib_device, "Path migrating."); break; case 0x13: /* interface trace stopped */ ehca_err(&shca->ib_device, "Interface trace stopped."); break; case 0x14: /* first error capture info available */ ehca_info(&shca->ib_device, "First error capture available"); break; case 0x15: /* SRQ limit reached */ qp_event_callback(shca, eqe, IB_EVENT_SRQ_LIMIT_REACHED, 0); break; default: ehca_err(&shca->ib_device, "Unknown identifier: %x on %s.", identifier, shca->ib_device.name); break; } return; }
static void parse_ec(struct ehca_shca *shca, u64 eqe) { struct ib_event event; u8 ec = EHCA_BMASK_GET(NEQE_EVENT_CODE, eqe); u8 port = EHCA_BMASK_GET(NEQE_PORT_NUMBER, eqe); switch (ec) { case 0x30: /* port availability change */ if (EHCA_BMASK_GET(NEQE_PORT_AVAILABILITY, eqe)) { ehca_info(&shca->ib_device, "port %x is active.", port); event.device = &shca->ib_device; event.event = IB_EVENT_PORT_ACTIVE; event.element.port_num = port; shca->sport[port - 1].port_state = IB_PORT_ACTIVE; ib_dispatch_event(&event); } else { ehca_info(&shca->ib_device, "port %x is inactive.", port); event.device = &shca->ib_device; event.event = IB_EVENT_PORT_ERR; event.element.port_num = port; shca->sport[port - 1].port_state = IB_PORT_DOWN; ib_dispatch_event(&event); } break; case 0x31: /* port configuration change * disruptive change is caused by * LID, PKEY or SM change */ ehca_warn(&shca->ib_device, "disruptive port %x configuration change", port); ehca_info(&shca->ib_device, "port %x is inactive.", port); event.device = &shca->ib_device; event.event = IB_EVENT_PORT_ERR; event.element.port_num = port; shca->sport[port - 1].port_state = IB_PORT_DOWN; ib_dispatch_event(&event); ehca_info(&shca->ib_device, "port %x is active.", port); event.device = &shca->ib_device; event.event = IB_EVENT_PORT_ACTIVE; event.element.port_num = port; shca->sport[port - 1].port_state = IB_PORT_ACTIVE; ib_dispatch_event(&event); break; case 0x32: /* adapter malfunction */ ehca_err(&shca->ib_device, "Adapter malfunction."); break; case 0x33: /* trace stopped */ ehca_err(&shca->ib_device, "Traced stopped."); break; default: ehca_err(&shca->ib_device, "Unknown event code: %x on %s.", ec, shca->ib_device.name); break; } return; }