1f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker/* 2f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * Copyright (c) 2005 Ammasso, Inc. All rights reserved. 3f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. 4f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * 5f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * This software is available to you under a choice of one of two 6f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * licenses. You may choose to be licensed under the terms of the GNU 7f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * General Public License (GPL) Version 2, available from the file 8f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * COPYING in the main directory of this source tree, or the 9f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * OpenIB.org BSD license below: 10f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * 11f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * Redistribution and use in source and binary forms, with or 12f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * without modification, are permitted provided that the following 13f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * conditions are met: 14f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * 15f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * - Redistributions of source code must retain the above 16f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * copyright notice, this list of conditions and the following 17f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * disclaimer. 18f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * 19f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * - Redistributions in binary form must reproduce the above 20f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * copyright notice, this list of conditions and the following 21f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * disclaimer in the documentation and/or other materials 22f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * provided with the distribution. 23f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * 24f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker * SOFTWARE. 32f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker */ 33f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker#include "c2.h" 34f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker#include <rdma/iw_cm.h> 35f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker#include "c2_status.h" 36f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker#include "c2_ae.h" 37f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 38f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tuckerstatic int c2_convert_cm_status(u32 c2_status) 39f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker{ 40f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker switch (c2_status) { 41f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_SUCCESS: 42f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return 0; 43f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_REJECTED: 44f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -ENETRESET; 45f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_REFUSED: 46f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -ECONNREFUSED; 47f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_TIMEDOUT: 48f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -ETIMEDOUT; 49f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_NETUNREACH: 50f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -ENETUNREACH; 51f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_HOSTUNREACH: 52f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -EHOSTUNREACH; 53f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_INVALID_RNIC: 54f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -EINVAL; 55f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_INVALID_QP: 56f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -EINVAL; 57f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_INVALID_QP_STATE: 58f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -EINVAL; 59f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_CONN_STATUS_ADDR_NOT_AVAIL: 60f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -EADDRNOTAVAIL; 61f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker default: 62f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker printk(KERN_ERR PFX 63f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "%s - Unable to convert CM status: %d\n", 643371836383d63b627b228875f5ac63023cbf11d2Harvey Harrison __func__, c2_status); 65f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return -EIO; 66f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 67f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker} 68f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 69f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tuckerstatic const char* to_event_str(int event) 70f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker{ 71f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker static const char* event_str[] = { 72f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_REMOTE_SHUTDOWN", 73f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_ACTIVE_CONNECT_RESULTS", 74f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_CONNECTION_REQUEST", 75f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_LLP_CLOSE_COMPLETE", 76f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_TERMINATE_MESSAGE_RECEIVED", 77f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_LLP_CONNECTION_RESET", 78f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_LLP_CONNECTION_LOST", 79f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_LLP_SEGMENT_SIZE_INVALID", 80f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_LLP_INVALID_CRC", 81f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_LLP_BAD_FPDU", 82f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_INVALID_DDP_VERSION", 83f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_INVALID_RDMA_VERSION", 84f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_UNEXPECTED_OPCODE", 85f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_INVALID_DDP_QUEUE_NUMBER", 86f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_RDMA_READ_NOT_ENABLED", 87f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_RDMA_WRITE_NOT_ENABLED", 88f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_RDMA_READ_TOO_SMALL", 89f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_NO_L_BIT", 90f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_TAGGED_INVALID_STAG", 91f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_TAGGED_BASE_BOUNDS_VIOLATION", 92f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_TAGGED_ACCESS_RIGHTS_VIOLATION", 93f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_TAGGED_INVALID_PD", 94f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_WRAP_ERROR", 95f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_BAD_CLOSE", 96f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_BAD_LLP_CLOSE", 97f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_INVALID_MSN_RANGE", 98f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_INVALID_MSN_GAP", 99f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_IRRQ_OVERFLOW", 100f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_IRRQ_MSN_GAP", 101f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_IRRQ_MSN_RANGE", 102f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_IRRQ_INVALID_STAG", 103f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_IRRQ_BASE_BOUNDS_VIOLATION", 104f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_IRRQ_ACCESS_RIGHTS_VIOLATION", 105f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_IRRQ_INVALID_PD", 106f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_IRRQ_WRAP_ERROR", 107f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_CQ_SQ_COMPLETION_OVERFLOW", 108f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_CQ_RQ_COMPLETION_ERROR", 109f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_QP_SRQ_WQE_ERROR", 110f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_QP_LOCAL_CATASTROPHIC_ERROR", 111f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_CQ_OVERFLOW", 112f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_CQ_OPERATION_ERROR", 113f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_SRQ_LIMIT_REACHED", 114f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_QP_RQ_LIMIT_REACHED", 115f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_SRQ_CATASTROPHIC_ERROR", 116f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CCAE_RNIC_CATASTROPHIC_ERROR" 117f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker }; 118f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 119f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (event < CCAE_REMOTE_SHUTDOWN || 120f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker event > CCAE_RNIC_CATASTROPHIC_ERROR) 121f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return "<invalid event>"; 122f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 123f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker event -= CCAE_REMOTE_SHUTDOWN; 124f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return event_str[event]; 125f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker} 126f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 127f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tuckerstatic const char *to_qp_state_str(int state) 128f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker{ 129f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker switch (state) { 130f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_QP_STATE_IDLE: 131f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return "C2_QP_STATE_IDLE"; 132f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_QP_STATE_CONNECTING: 133f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return "C2_QP_STATE_CONNECTING"; 134f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_QP_STATE_RTS: 135f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return "C2_QP_STATE_RTS"; 136f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_QP_STATE_CLOSING: 137f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return "C2_QP_STATE_CLOSING"; 138f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_QP_STATE_TERMINATE: 139f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return "C2_QP_STATE_TERMINATE"; 140f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_QP_STATE_ERROR: 141f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return "C2_QP_STATE_ERROR"; 142f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker default: 143f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return "<invalid QP state>"; 1442b50176d11866e59208a4ed1623b3fc0ca322690Joe Perches } 145f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker} 146f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 147f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tuckervoid c2_ae_event(struct c2_dev *c2dev, u32 mq_index) 148f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker{ 149f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker struct c2_mq *mq = c2dev->qptr_array[mq_index]; 150f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker union c2wr *wr; 151f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker void *resource_user_context; 152f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker struct iw_cm_event cm_event; 153f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker struct ib_event ib_event; 154f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker enum c2_resource_indicator resource_indicator; 155f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker enum c2_event_id event_id; 156f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker unsigned long flags; 157f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker int status; 15824d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_event.local_addr; 15924d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_event.remote_addr; 160f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 161f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker /* 16225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * retrieve the message 163f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker */ 164f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker wr = c2_mq_consume(mq); 165f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (!wr) 166f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker return; 167f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 168f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker memset(&ib_event, 0, sizeof(ib_event)); 169f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker memset(&cm_event, 0, sizeof(cm_event)); 170f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 171f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker event_id = c2_wr_get_id(wr); 172f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker resource_indicator = be32_to_cpu(wr->ae.ae_generic.resource_type); 173f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker resource_user_context = 174f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker (void *) (unsigned long) wr->ae.ae_generic.user_context; 175f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 176f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker status = cm_event.status = c2_convert_cm_status(c2_wr_get_result(wr)); 177f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 178f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker pr_debug("event received c2_dev=%p, event_id=%d, " 179f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "resource_indicator=%d, user_context=%p, status = %d\n", 180f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker c2dev, event_id, resource_indicator, resource_user_context, 181f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker status); 182f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 183f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker switch (resource_indicator) { 184f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_RES_IND_QP:{ 185f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 186f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker struct c2_qp *qp = (struct c2_qp *)resource_user_context; 187f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker struct iw_cm_id *cm_id = qp->cm_id; 188f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker struct c2wr_ae_active_connect_results *res; 189f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 190f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (!cm_id) { 191f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker pr_debug("event received, but cm_id is <nul>, qp=%p!\n", 192f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker qp); 193f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker goto ignore_it; 194f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 195f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker pr_debug("%s: event = %s, user_context=%llx, " 196f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "resource_type=%x, " 197f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "resource=%x, qp_state=%s\n", 1983371836383d63b627b228875f5ac63023cbf11d2Harvey Harrison __func__, 199f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker to_event_str(event_id), 200dc544bc9cb8aa91c5d7fc9116a302f88a8a97250Roland Dreier (unsigned long long) wr->ae.ae_generic.user_context, 201f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker be32_to_cpu(wr->ae.ae_generic.resource_type), 202f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker be32_to_cpu(wr->ae.ae_generic.resource), 203f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker to_qp_state_str(be32_to_cpu(wr->ae.ae_generic.qp_state))); 204f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 205f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker c2_set_qp_state(qp, be32_to_cpu(wr->ae.ae_generic.qp_state)); 206f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 207f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker switch (event_id) { 208f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case CCAE_ACTIVE_CONNECT_RESULTS: 209f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker res = &wr->ae.ae_active_connect_results; 210f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.event = IW_CM_EVENT_CONNECT_REPLY; 21124d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise laddr->sin_addr.s_addr = res->laddr; 21224d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise raddr->sin_addr.s_addr = res->raddr; 21324d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise laddr->sin_port = res->lport; 21424d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise raddr->sin_port = res->rport; 215f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (status == 0) { 216f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.private_data_len = 217f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker be32_to_cpu(res->private_data_length); 218f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.private_data = res->private_data; 219f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } else { 220f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker spin_lock_irqsave(&qp->lock, flags); 221f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (qp->cm_id) { 222f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker qp->cm_id->rem_ref(qp->cm_id); 223f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker qp->cm_id = NULL; 224f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 225f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker spin_unlock_irqrestore(&qp->lock, flags); 226f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.private_data_len = 0; 227f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.private_data = NULL; 228f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 229f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (cm_id->event_handler) 230f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_id->event_handler(cm_id, &cm_event); 231f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker break; 232f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case CCAE_TERMINATE_MESSAGE_RECEIVED: 233f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case CCAE_CQ_SQ_COMPLETION_OVERFLOW: 234f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker ib_event.device = &c2dev->ibdev; 235f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker ib_event.element.qp = &qp->ibqp; 236f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker ib_event.event = IB_EVENT_QP_REQ_ERR; 237f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 238f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (qp->ibqp.event_handler) 239f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker qp->ibqp.event_handler(&ib_event, 240f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker qp->ibqp. 241f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker qp_context); 242f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker break; 243f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case CCAE_BAD_CLOSE: 244f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case CCAE_LLP_CLOSE_COMPLETE: 245f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case CCAE_LLP_CONNECTION_RESET: 246f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case CCAE_LLP_CONNECTION_LOST: 247f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker BUG_ON(cm_id->event_handler==(void*)0x6b6b6b6b); 248f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 249f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker spin_lock_irqsave(&qp->lock, flags); 250f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (qp->cm_id) { 251f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker qp->cm_id->rem_ref(qp->cm_id); 252f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker qp->cm_id = NULL; 253f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 254f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker spin_unlock_irqrestore(&qp->lock, flags); 255f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.event = IW_CM_EVENT_CLOSE; 256f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.status = 0; 257f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (cm_id->event_handler) 258f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_id->event_handler(cm_id, &cm_event); 259f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker break; 260f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker default: 261f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker BUG_ON(1); 262f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker pr_debug("%s:%d Unexpected event_id=%d on QP=%p, " 263f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker "CM_ID=%p\n", 2643371836383d63b627b228875f5ac63023cbf11d2Harvey Harrison __func__, __LINE__, 265f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker event_id, qp, cm_id); 266f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker break; 267f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 268f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker break; 269f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 270f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 271f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_RES_IND_EP:{ 272f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 273f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker struct c2wr_ae_connection_request *req = 274f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker &wr->ae.ae_connection_request; 275f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker struct iw_cm_id *cm_id = 276f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker (struct iw_cm_id *)resource_user_context; 277f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 278f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker pr_debug("C2_RES_IND_EP event_id=%d\n", event_id); 279f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (event_id != CCAE_CONNECTION_REQUEST) { 280f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker pr_debug("%s: Invalid event_id: %d\n", 2813371836383d63b627b228875f5ac63023cbf11d2Harvey Harrison __func__, event_id); 282f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker break; 283f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 284f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.event = IW_CM_EVENT_CONNECT_REQUEST; 285f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.provider_data = (void*)(unsigned long)req->cr_handle; 28624d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise laddr->sin_addr.s_addr = req->laddr; 28724d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise raddr->sin_addr.s_addr = req->raddr; 28824d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise laddr->sin_port = req->lport; 28924d44a391f1b5d56e9c7a4fc1edd085687864ff9Steve Wise raddr->sin_port = req->rport; 290f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.private_data_len = 291f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker be32_to_cpu(req->private_data_length); 292f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_event.private_data = req->private_data; 29356da00fc92e6f227874bba36f127ffc8847ee1f8Kumar Sanghvi /* 29456da00fc92e6f227874bba36f127ffc8847ee1f8Kumar Sanghvi * Until ird/ord negotiation via MPAv2 support is added, send 29556da00fc92e6f227874bba36f127ffc8847ee1f8Kumar Sanghvi * max supported values 29656da00fc92e6f227874bba36f127ffc8847ee1f8Kumar Sanghvi */ 29756da00fc92e6f227874bba36f127ffc8847ee1f8Kumar Sanghvi cm_event.ird = cm_event.ord = 128; 298f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 299f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (cm_id->event_handler) 300f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cm_id->event_handler(cm_id, &cm_event); 301f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker break; 302f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 303f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 304f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker case C2_RES_IND_CQ:{ 305f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker struct c2_cq *cq = 306f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker (struct c2_cq *) resource_user_context; 307f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 308f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker pr_debug("IB_EVENT_CQ_ERR\n"); 309f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker ib_event.device = &c2dev->ibdev; 310f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker ib_event.element.cq = &cq->ibcq; 311f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker ib_event.event = IB_EVENT_CQ_ERR; 312f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 313f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker if (cq->ibcq.event_handler) 314f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cq->ibcq.event_handler(&ib_event, 315f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker cq->ibcq.cq_context); 316c9795bd708e37ed4154e838a1f4576192eeeaccaAlan Cox break; 317f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 318f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 319f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker default: 320f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker printk("Bad resource indicator = %d\n", 321f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker resource_indicator); 322f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker break; 323f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker } 324f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker 325f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker ignore_it: 326f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker c2_mq_free(mq); 327f94b533d091a42da92d908eb7b3f9ade1923f90dTom Tucker} 328