/*
 * Copyright (c) 2005 Ammasso, Inc. All rights reserved.
 * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
 *
 * This software is available to you under a choice of one of two
 * licenses.  You may choose to be licensed under the terms of the GNU
 * General Public License (GPL) Version 2, available from the file
 * COPYING in the main directory of this source tree, or the
 * OpenIB.org BSD license below:
 *
 *     Redistribution and use in source and binary forms, with or
 *     without modification, are permitted provided that the following
 *     conditions are met:
 *
 *      - Redistributions of source code must retain the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer.
 *
 *      - Redistributions in binary form must reproduce the above
 *        copyright notice, this list of conditions and the following
 *        disclaimer in the documentation and/or other materials
 *        provided with the distribution.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#include "c2.h"
#include <rdma/iw_cm.h>
#include "c2_status.h"
#include "c2_ae.h"

static int c2_convert_cm_status(u32 c2_status)
{
	switch (c2_status) {
	case C2_CONN_STATUS_SUCCESS:
		return 0;
	case C2_CONN_STATUS_REJECTED:
		return -ENETRESET;
	case C2_CONN_STATUS_REFUSED:
		return -ECONNREFUSED;
	case C2_CONN_STATUS_TIMEDOUT:
		return -ETIMEDOUT;
	case C2_CONN_STATUS_NETUNREACH:
		return -ENETUNREACH;
	case C2_CONN_STATUS_HOSTUNREACH:
		return -EHOSTUNREACH;
	case C2_CONN_STATUS_INVALID_RNIC:
		return -EINVAL;
	case C2_CONN_STATUS_INVALID_QP:
		return -EINVAL;
	case C2_CONN_STATUS_INVALID_QP_STATE:
		return -EINVAL;
	case C2_CONN_STATUS_ADDR_NOT_AVAIL:
		return -EADDRNOTAVAIL;
	default:
		printk(KERN_ERR PFX
		       "%s - Unable to convert CM status: %d\n",
		       __func__, c2_status);
		return -EIO;
	}
}

static const char* to_event_str(int event)
{
	static const char* event_str[] = {
		"CCAE_REMOTE_SHUTDOWN",
		"CCAE_ACTIVE_CONNECT_RESULTS",
		"CCAE_CONNECTION_REQUEST",
		"CCAE_LLP_CLOSE_COMPLETE",
		"CCAE_TERMINATE_MESSAGE_RECEIVED",
		"CCAE_LLP_CONNECTION_RESET",
		"CCAE_LLP_CONNECTION_LOST",
		"CCAE_LLP_SEGMENT_SIZE_INVALID",
		"CCAE_LLP_INVALID_CRC",
		"CCAE_LLP_BAD_FPDU",
		"CCAE_INVALID_DDP_VERSION",
		"CCAE_INVALID_RDMA_VERSION",
		"CCAE_UNEXPECTED_OPCODE",
		"CCAE_INVALID_DDP_QUEUE_NUMBER",
		"CCAE_RDMA_READ_NOT_ENABLED",
		"CCAE_RDMA_WRITE_NOT_ENABLED",
		"CCAE_RDMA_READ_TOO_SMALL",
		"CCAE_NO_L_BIT",
		"CCAE_TAGGED_INVALID_STAG",
		"CCAE_TAGGED_BASE_BOUNDS_VIOLATION",
		"CCAE_TAGGED_ACCESS_RIGHTS_VIOLATION",
		"CCAE_TAGGED_INVALID_PD",
		"CCAE_WRAP_ERROR",
		"CCAE_BAD_CLOSE",
		"CCAE_BAD_LLP_CLOSE",
		"CCAE_INVALID_MSN_RANGE",
		"CCAE_INVALID_MSN_GAP",
		"CCAE_IRRQ_OVERFLOW",
		"CCAE_IRRQ_MSN_GAP",
		"CCAE_IRRQ_MSN_RANGE",
		"CCAE_IRRQ_INVALID_STAG",
		"CCAE_IRRQ_BASE_BOUNDS_VIOLATION",
		"CCAE_IRRQ_ACCESS_RIGHTS_VIOLATION",
		"CCAE_IRRQ_INVALID_PD",
		"CCAE_IRRQ_WRAP_ERROR",
		"CCAE_CQ_SQ_COMPLETION_OVERFLOW",
		"CCAE_CQ_RQ_COMPLETION_ERROR",
		"CCAE_QP_SRQ_WQE_ERROR",
		"CCAE_QP_LOCAL_CATASTROPHIC_ERROR",
		"CCAE_CQ_OVERFLOW",
		"CCAE_CQ_OPERATION_ERROR",
		"CCAE_SRQ_LIMIT_REACHED",
		"CCAE_QP_RQ_LIMIT_REACHED",
		"CCAE_SRQ_CATASTROPHIC_ERROR",
		"CCAE_RNIC_CATASTROPHIC_ERROR"
	};

	if (event < CCAE_REMOTE_SHUTDOWN ||
	    event > CCAE_RNIC_CATASTROPHIC_ERROR)
		return "<invalid event>";

	event -= CCAE_REMOTE_SHUTDOWN;
	return event_str[event];
}

static const char *to_qp_state_str(int state)
{
	switch (state) {
	case C2_QP_STATE_IDLE:
		return "C2_QP_STATE_IDLE";
	case C2_QP_STATE_CONNECTING:
		return "C2_QP_STATE_CONNECTING";
	case C2_QP_STATE_RTS:
		return "C2_QP_STATE_RTS";
	case C2_QP_STATE_CLOSING:
		return "C2_QP_STATE_CLOSING";
	case C2_QP_STATE_TERMINATE:
		return "C2_QP_STATE_TERMINATE";
	case C2_QP_STATE_ERROR:
		return "C2_QP_STATE_ERROR";
	default:
		return "<invalid QP state>";
	}
}

void c2_ae_event(struct c2_dev *c2dev, u32 mq_index)
{
	struct c2_mq *mq = c2dev->qptr_array[mq_index];
	union c2wr *wr;
	void *resource_user_context;
	struct iw_cm_event cm_event;
	struct ib_event ib_event;
	enum c2_resource_indicator resource_indicator;
	enum c2_event_id event_id;
	unsigned long flags;
	int status;
	struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_event.local_addr;
	struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_event.remote_addr;

	/*
	 * retrieve the message
	 */
	wr = c2_mq_consume(mq);
	if (!wr)
		return;

	memset(&ib_event, 0, sizeof(ib_event));
	memset(&cm_event, 0, sizeof(cm_event));

	event_id = c2_wr_get_id(wr);
	resource_indicator = be32_to_cpu(wr->ae.ae_generic.resource_type);
	resource_user_context =
	    (void *) (unsigned long) wr->ae.ae_generic.user_context;

	status = cm_event.status = c2_convert_cm_status(c2_wr_get_result(wr));

	pr_debug("event received c2_dev=%p, event_id=%d, "
		"resource_indicator=%d, user_context=%p, status = %d\n",
		c2dev, event_id, resource_indicator, resource_user_context,
		status);

	switch (resource_indicator) {
	case C2_RES_IND_QP:{

		struct c2_qp *qp = (struct c2_qp *)resource_user_context;
		struct iw_cm_id *cm_id = qp->cm_id;
		struct c2wr_ae_active_connect_results *res;

		if (!cm_id) {
			pr_debug("event received, but cm_id is <nul>, qp=%p!\n",
				qp);
			goto ignore_it;
		}
		pr_debug("%s: event = %s, user_context=%llx, "
			"resource_type=%x, "
			"resource=%x, qp_state=%s\n",
			__func__,
			to_event_str(event_id),
			(unsigned long long) wr->ae.ae_generic.user_context,
			be32_to_cpu(wr->ae.ae_generic.resource_type),
			be32_to_cpu(wr->ae.ae_generic.resource),
			to_qp_state_str(be32_to_cpu(wr->ae.ae_generic.qp_state)));

		c2_set_qp_state(qp, be32_to_cpu(wr->ae.ae_generic.qp_state));

		switch (event_id) {
		case CCAE_ACTIVE_CONNECT_RESULTS:
			res = &wr->ae.ae_active_connect_results;
			cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
			laddr->sin_addr.s_addr = res->laddr;
			raddr->sin_addr.s_addr = res->raddr;
			laddr->sin_port = res->lport;
			raddr->sin_port = res->rport;
			if (status == 0) {
				cm_event.private_data_len =
					be32_to_cpu(res->private_data_length);
				cm_event.private_data = res->private_data;
			} else {
				spin_lock_irqsave(&qp->lock, flags);
				if (qp->cm_id) {
					qp->cm_id->rem_ref(qp->cm_id);
					qp->cm_id = NULL;
				}
				spin_unlock_irqrestore(&qp->lock, flags);
				cm_event.private_data_len = 0;
				cm_event.private_data = NULL;
			}
			if (cm_id->event_handler)
				cm_id->event_handler(cm_id, &cm_event);
			break;
		case CCAE_TERMINATE_MESSAGE_RECEIVED:
		case CCAE_CQ_SQ_COMPLETION_OVERFLOW:
			ib_event.device = &c2dev->ibdev;
			ib_event.element.qp = &qp->ibqp;
			ib_event.event = IB_EVENT_QP_REQ_ERR;

			if (qp->ibqp.event_handler)
				qp->ibqp.event_handler(&ib_event,
						       qp->ibqp.
						       qp_context);
			break;
		case CCAE_BAD_CLOSE:
		case CCAE_LLP_CLOSE_COMPLETE:
		case CCAE_LLP_CONNECTION_RESET:
		case CCAE_LLP_CONNECTION_LOST:
			BUG_ON(cm_id->event_handler==(void*)0x6b6b6b6b);

			spin_lock_irqsave(&qp->lock, flags);
			if (qp->cm_id) {
				qp->cm_id->rem_ref(qp->cm_id);
				qp->cm_id = NULL;
			}
			spin_unlock_irqrestore(&qp->lock, flags);
			cm_event.event = IW_CM_EVENT_CLOSE;
			cm_event.status = 0;
			if (cm_id->event_handler)
				cm_id->event_handler(cm_id, &cm_event);
			break;
		default:
			BUG_ON(1);
			pr_debug("%s:%d Unexpected event_id=%d on QP=%p, "
				"CM_ID=%p\n",
				__func__, __LINE__,
				event_id, qp, cm_id);
			break;
		}
		break;
	}

	case C2_RES_IND_EP:{

		struct c2wr_ae_connection_request *req =
			&wr->ae.ae_connection_request;
		struct iw_cm_id *cm_id =
			(struct iw_cm_id *)resource_user_context;

		pr_debug("C2_RES_IND_EP event_id=%d\n", event_id);
		if (event_id != CCAE_CONNECTION_REQUEST) {
			pr_debug("%s: Invalid event_id: %d\n",
				__func__, event_id);
			break;
		}
		cm_event.event = IW_CM_EVENT_CONNECT_REQUEST;
		cm_event.provider_data = (void*)(unsigned long)req->cr_handle;
		laddr->sin_addr.s_addr = req->laddr;
		raddr->sin_addr.s_addr = req->raddr;
		laddr->sin_port = req->lport;
		raddr->sin_port = req->rport;
		cm_event.private_data_len =
			be32_to_cpu(req->private_data_length);
		cm_event.private_data = req->private_data;
		/*
		 * Until ird/ord negotiation via MPAv2 support is added, send
		 * max supported values
		 */
		cm_event.ird = cm_event.ord = 128;

		if (cm_id->event_handler)
			cm_id->event_handler(cm_id, &cm_event);
		break;
	}

	case C2_RES_IND_CQ:{
		struct c2_cq *cq =
		    (struct c2_cq *) resource_user_context;

		pr_debug("IB_EVENT_CQ_ERR\n");
		ib_event.device = &c2dev->ibdev;
		ib_event.element.cq = &cq->ibcq;
		ib_event.event = IB_EVENT_CQ_ERR;

		if (cq->ibcq.event_handler)
			cq->ibcq.event_handler(&ib_event,
					       cq->ibcq.cq_context);
		break;
	}

	default:
		printk("Bad resource indicator = %d\n",
		       resource_indicator);
		break;
	}

 ignore_it:
	c2_mq_free(mq);
}
