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;
}
Exemple #3
0
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;
}