1*aa0a1e58SJeff Roberson /* 2*aa0a1e58SJeff Roberson * Copyright (c) 2005 Topspin Communications. All rights reserved. 3*aa0a1e58SJeff Roberson * 4*aa0a1e58SJeff Roberson * This software is available to you under a choice of one of two 5*aa0a1e58SJeff Roberson * licenses. You may choose to be licensed under the terms of the GNU 6*aa0a1e58SJeff Roberson * General Public License (GPL) Version 2, available from the file 7*aa0a1e58SJeff Roberson * COPYING in the main directory of this source tree, or the 8*aa0a1e58SJeff Roberson * OpenIB.org BSD license below: 9*aa0a1e58SJeff Roberson * 10*aa0a1e58SJeff Roberson * Redistribution and use in source and binary forms, with or 11*aa0a1e58SJeff Roberson * without modification, are permitted provided that the following 12*aa0a1e58SJeff Roberson * conditions are met: 13*aa0a1e58SJeff Roberson * 14*aa0a1e58SJeff Roberson * - Redistributions of source code must retain the above 15*aa0a1e58SJeff Roberson * copyright notice, this list of conditions and the following 16*aa0a1e58SJeff Roberson * disclaimer. 17*aa0a1e58SJeff Roberson * 18*aa0a1e58SJeff Roberson * - Redistributions in binary form must reproduce the above 19*aa0a1e58SJeff Roberson * copyright notice, this list of conditions and the following 20*aa0a1e58SJeff Roberson * disclaimer in the documentation and/or other materials 21*aa0a1e58SJeff Roberson * provided with the distribution. 22*aa0a1e58SJeff Roberson * 23*aa0a1e58SJeff Roberson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24*aa0a1e58SJeff Roberson * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25*aa0a1e58SJeff Roberson * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26*aa0a1e58SJeff Roberson * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27*aa0a1e58SJeff Roberson * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28*aa0a1e58SJeff Roberson * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29*aa0a1e58SJeff Roberson * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30*aa0a1e58SJeff Roberson * SOFTWARE. 31*aa0a1e58SJeff Roberson */ 32*aa0a1e58SJeff Roberson 33*aa0a1e58SJeff Roberson #if HAVE_CONFIG_H 34*aa0a1e58SJeff Roberson # include <config.h> 35*aa0a1e58SJeff Roberson #endif /* HAVE_CONFIG_H */ 36*aa0a1e58SJeff Roberson 37*aa0a1e58SJeff Roberson #include <stdio.h> 38*aa0a1e58SJeff Roberson #include <endian.h> 39*aa0a1e58SJeff Roberson #include <byteswap.h> 40*aa0a1e58SJeff Roberson 41*aa0a1e58SJeff Roberson #include <infiniband/verbs.h> 42*aa0a1e58SJeff Roberson 43*aa0a1e58SJeff Roberson static const char *event_name_str(enum ibv_event_type event_type) 44*aa0a1e58SJeff Roberson { 45*aa0a1e58SJeff Roberson switch (event_type) { 46*aa0a1e58SJeff Roberson case IBV_EVENT_DEVICE_FATAL: 47*aa0a1e58SJeff Roberson return "IBV_EVENT_DEVICE_FATAL"; 48*aa0a1e58SJeff Roberson case IBV_EVENT_PORT_ACTIVE: 49*aa0a1e58SJeff Roberson return "IBV_EVENT_PORT_ACTIVE"; 50*aa0a1e58SJeff Roberson case IBV_EVENT_PORT_ERR: 51*aa0a1e58SJeff Roberson return "IBV_EVENT_PORT_ERR"; 52*aa0a1e58SJeff Roberson case IBV_EVENT_LID_CHANGE: 53*aa0a1e58SJeff Roberson return "IBV_EVENT_LID_CHANGE"; 54*aa0a1e58SJeff Roberson case IBV_EVENT_PKEY_CHANGE: 55*aa0a1e58SJeff Roberson return "IBV_EVENT_PKEY_CHANGE"; 56*aa0a1e58SJeff Roberson case IBV_EVENT_SM_CHANGE: 57*aa0a1e58SJeff Roberson return "IBV_EVENT_SM_CHANGE"; 58*aa0a1e58SJeff Roberson case IBV_EVENT_CLIENT_REREGISTER: 59*aa0a1e58SJeff Roberson return "IBV_EVENT_CLIENT_REREGISTER"; 60*aa0a1e58SJeff Roberson case IBV_EVENT_GID_CHANGE: 61*aa0a1e58SJeff Roberson return "IBV_EVENT_GID_CHANGE"; 62*aa0a1e58SJeff Roberson 63*aa0a1e58SJeff Roberson case IBV_EVENT_CQ_ERR: 64*aa0a1e58SJeff Roberson case IBV_EVENT_QP_FATAL: 65*aa0a1e58SJeff Roberson case IBV_EVENT_QP_REQ_ERR: 66*aa0a1e58SJeff Roberson case IBV_EVENT_QP_ACCESS_ERR: 67*aa0a1e58SJeff Roberson case IBV_EVENT_COMM_EST: 68*aa0a1e58SJeff Roberson case IBV_EVENT_SQ_DRAINED: 69*aa0a1e58SJeff Roberson case IBV_EVENT_PATH_MIG: 70*aa0a1e58SJeff Roberson case IBV_EVENT_PATH_MIG_ERR: 71*aa0a1e58SJeff Roberson case IBV_EVENT_SRQ_ERR: 72*aa0a1e58SJeff Roberson case IBV_EVENT_SRQ_LIMIT_REACHED: 73*aa0a1e58SJeff Roberson case IBV_EVENT_QP_LAST_WQE_REACHED: 74*aa0a1e58SJeff Roberson default: 75*aa0a1e58SJeff Roberson return "unexpected"; 76*aa0a1e58SJeff Roberson } 77*aa0a1e58SJeff Roberson } 78*aa0a1e58SJeff Roberson 79*aa0a1e58SJeff Roberson int main(int argc, char *argv[]) 80*aa0a1e58SJeff Roberson { 81*aa0a1e58SJeff Roberson struct ibv_device **dev_list; 82*aa0a1e58SJeff Roberson struct ibv_context *context; 83*aa0a1e58SJeff Roberson struct ibv_async_event event; 84*aa0a1e58SJeff Roberson 85*aa0a1e58SJeff Roberson /* Force line-buffering in case stdout is redirected */ 86*aa0a1e58SJeff Roberson setvbuf(stdout, NULL, _IOLBF, 0); 87*aa0a1e58SJeff Roberson 88*aa0a1e58SJeff Roberson dev_list = ibv_get_device_list(NULL); 89*aa0a1e58SJeff Roberson if (!dev_list) { 90*aa0a1e58SJeff Roberson perror("Failed to get IB devices list"); 91*aa0a1e58SJeff Roberson return 1; 92*aa0a1e58SJeff Roberson } 93*aa0a1e58SJeff Roberson 94*aa0a1e58SJeff Roberson if (!*dev_list) { 95*aa0a1e58SJeff Roberson fprintf(stderr, "No IB devices found\n"); 96*aa0a1e58SJeff Roberson return 1; 97*aa0a1e58SJeff Roberson } 98*aa0a1e58SJeff Roberson 99*aa0a1e58SJeff Roberson context = ibv_open_device(*dev_list); 100*aa0a1e58SJeff Roberson if (!context) { 101*aa0a1e58SJeff Roberson fprintf(stderr, "Couldn't get context for %s\n", 102*aa0a1e58SJeff Roberson ibv_get_device_name(*dev_list)); 103*aa0a1e58SJeff Roberson return 1; 104*aa0a1e58SJeff Roberson } 105*aa0a1e58SJeff Roberson 106*aa0a1e58SJeff Roberson printf("%s: async event FD %d\n", 107*aa0a1e58SJeff Roberson ibv_get_device_name(*dev_list), context->async_fd); 108*aa0a1e58SJeff Roberson 109*aa0a1e58SJeff Roberson while (1) { 110*aa0a1e58SJeff Roberson if (ibv_get_async_event(context, &event)) 111*aa0a1e58SJeff Roberson return 1; 112*aa0a1e58SJeff Roberson 113*aa0a1e58SJeff Roberson printf(" event_type %s (%d), port %d\n", 114*aa0a1e58SJeff Roberson event_name_str(event.event_type), 115*aa0a1e58SJeff Roberson event.event_type, event.element.port_num); 116*aa0a1e58SJeff Roberson 117*aa0a1e58SJeff Roberson ibv_ack_async_event(&event); 118*aa0a1e58SJeff Roberson } 119*aa0a1e58SJeff Roberson 120*aa0a1e58SJeff Roberson return 0; 121*aa0a1e58SJeff Roberson } 122