static void parse_ec(struct ehca_shca *shca, u64 eqe) { u8 ec = EHCA_BMASK_GET(NEQE_EVENT_CODE, eqe); u8 port = EHCA_BMASK_GET(NEQE_PORT_NUMBER, eqe); u8 spec_event; struct ehca_sport *sport = &shca->sport[port - 1]; unsigned long flags; switch (ec) { case 0x30: /* port availability change */ if (EHCA_BMASK_GET(NEQE_PORT_AVAILABILITY, eqe)) { int suppress_event; /* replay modify_qp for sqps */ spin_lock_irqsave(&sport->mod_sqp_lock, flags); suppress_event = !sport->ibqp_sqp[IB_QPT_GSI]; if (sport->ibqp_sqp[IB_QPT_SMI]) ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_SMI]); if (!suppress_event) ehca_recover_sqp(sport->ibqp_sqp[IB_QPT_GSI]); spin_unlock_irqrestore(&sport->mod_sqp_lock, flags); /* AQP1 was destroyed, ignore this event */ if (suppress_event) break; sport->port_state = IB_PORT_ACTIVE; dispatch_port_event(shca, port, IB_EVENT_PORT_ACTIVE, "is active"); ehca_query_sma_attr(shca, port, &sport->saved_attr); } else { sport->port_state = IB_PORT_DOWN; dispatch_port_event(shca, port, IB_EVENT_PORT_ERR, "is inactive"); } break; case 0x31: /* port configuration change * disruptive change is caused by * LID, PKEY or SM change */ if (EHCA_BMASK_GET(NEQE_DISRUPTIVE, eqe)) { ehca_warn(&shca->ib_device, "disruptive port " "%d configuration change", port); sport->port_state = IB_PORT_DOWN; dispatch_port_event(shca, port, IB_EVENT_PORT_ERR, "is inactive"); sport->port_state = IB_PORT_ACTIVE; dispatch_port_event(shca, port, IB_EVENT_PORT_ACTIVE, "is active"); ehca_query_sma_attr(shca, port, &sport->saved_attr); } else notify_port_conf_change(shca, port); 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; case 0x34: /* util async event */ spec_event = EHCA_BMASK_GET(NEQE_SPECIFIC_EVENT, eqe); if (spec_event == 0x80) /* client reregister required */ dispatch_port_event(shca, port, IB_EVENT_CLIENT_REREGISTER, "client reregister req."); else ehca_warn(&shca->ib_device, "Unknown util async " "event %x on port %x", spec_event, port); break; default: ehca_err(&shca->ib_device, "Unknown event code: %x on %s.", ec, shca->ib_device.name); break; } return; }
static void parse_ec(struct ehca_shca *shca, u64 eqe) { u8 ec = EHCA_BMASK_GET(NEQE_EVENT_CODE, eqe); u8 port = EHCA_BMASK_GET(NEQE_PORT_NUMBER, eqe); u8 spec_event; struct ehca_sport *sport = &shca->sport[port - 1]; switch (ec) { case 0x30: /* port availability change */ if (EHCA_BMASK_GET(NEQE_PORT_AVAILABILITY, eqe)) { /* only replay modify_qp calls in autodetect mode; * if AQP1 was destroyed, the port is already down * again and we can drop the event. */ if (ehca_nr_ports < 0) if (replay_modify_qp(sport)) break; sport->port_state = IB_PORT_ACTIVE; dispatch_port_event(shca, port, IB_EVENT_PORT_ACTIVE, "is active"); ehca_query_sma_attr(shca, port, &sport->saved_attr); } else { sport->port_state = IB_PORT_DOWN; dispatch_port_event(shca, port, IB_EVENT_PORT_ERR, "is inactive"); } break; case 0x31: /* port configuration change * disruptive change is caused by * LID, PKEY or SM change */ if (EHCA_BMASK_GET(NEQE_DISRUPTIVE, eqe)) { ehca_warn(&shca->ib_device, "disruptive port " "%d configuration change", port); sport->port_state = IB_PORT_DOWN; dispatch_port_event(shca, port, IB_EVENT_PORT_ERR, "is inactive"); sport->port_state = IB_PORT_ACTIVE; dispatch_port_event(shca, port, IB_EVENT_PORT_ACTIVE, "is active"); ehca_query_sma_attr(shca, port, &sport->saved_attr); } else notify_port_conf_change(shca, port); 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; case 0x34: /* util async event */ spec_event = EHCA_BMASK_GET(NEQE_SPECIFIC_EVENT, eqe); if (spec_event == 0x80) /* client reregister required */ dispatch_port_event(shca, port, IB_EVENT_CLIENT_REREGISTER, "client reregister req."); else ehca_warn(&shca->ib_device, "Unknown util async " "event %x on port %x", spec_event, port); break; default: ehca_err(&shca->ib_device, "Unknown event code: %x on %s.", ec, 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; }