[DAPL2] DAPL Counters & 2.0.3 extensions to support counter retrieval.
[mirror/winof/.git] / ulp / dapl2 / dapl / common / dapl_evd_qp_async_error_callb.c
1 /*\r
2  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.\r
3  *\r
4  * This Software is licensed under one of the following licenses:\r
5  *\r
6  * 1) under the terms of the "Common Public License 1.0" a copy of which is\r
7  *    available from the Open Source Initiative, see\r
8  *    http://www.opensource.org/licenses/cpl.php.\r
9  *\r
10  * 2) under the terms of the "The BSD License" a copy of which is\r
11  *    available from the Open Source Initiative, see\r
12  *    http://www.opensource.org/licenses/bsd-license.php.\r
13  *\r
14  * 3) under the terms of the "GNU General Public License (GPL) Version 2" a\r
15  *    copy of which is available from the Open Source Initiative, see\r
16  *    http://www.opensource.org/licenses/gpl-license.php.\r
17  *\r
18  * Licensee has the right to choose one of the above licenses.\r
19  *\r
20  * Redistributions of source code must retain the above copyright\r
21  * notice and one of the license notices.\r
22  *\r
23  * Redistributions in binary form must reproduce both the above copyright\r
24  * notice, one of the license notices in the documentation\r
25  * and/or other materials provided with the distribution.\r
26  */\r
27 \r
28 /**********************************************************************\r
29  * \r
30  * MODULE: dapl_evd_qp_async_error_callback.c\r
31  *\r
32  * PURPOSE: implements QP callbacks from verbs\r
33  *\r
34  * $Id:$\r
35  **********************************************************************/\r
36 \r
37 #include "dapl.h"\r
38 #include "dapl_evd_util.h"\r
39 #include "dapl_adapter_util.h"\r
40 \r
41 /*\r
42  * dapl_evd_qp_async_error_callback\r
43  *\r
44  * The callback function registered with verbs for qp async erros\r
45  *\r
46  * Input:\r
47  *      ib_cm_handle,\r
48  *      ib_cm_event\r
49  *      cause_ptr\r
50  *      context (evd)\r
51  *\r
52  * Output:\r
53  *      None\r
54  *\r
55  */\r
56 \r
57 void \r
58 dapl_evd_qp_async_error_callback (\r
59         IN      ib_hca_handle_t         ib_hca_handle,\r
60         IN      ib_qp_handle_t          ib_qp_handle,\r
61         IN      ib_error_record_t *     cause_ptr,\r
62         IN      void *                  context)\r
63 \r
64 {\r
65     /*\r
66      * This is an affiliated error and hence should be able to \r
67      * supply us with exact information on the error type and QP. \r
68      *\r
69      * However the Mellanox and IBM APIs for registering this callback \r
70      * are different. \r
71      *\r
72      * The IBM API allows consumers to register the callback with \r
73      *\r
74      * ib_int32_t \r
75      * ib_set_qp_async_error_eh_us (\r
76      *          ib_hca_handle_t         hca_handle,\r
77      *          ib_qp_async_handler_t   handler )\r
78      *\r
79      * Notice that this function does not take a context. The context is \r
80      * specified per QP in the call to ib_qp_create_us().\r
81      *\r
82      * In contrast the Mellanox API requires that the context be specified \r
83      * when the funciton is registered:\r
84      *\r
85      * VAPI_ret_t \r
86      * VAPI_set_async_event_handler (\r
87      *          IN VAPI_hca_hndl_t              hca_hndl,\r
88      *          IN VAPI_async_event_handler_t   handler,\r
89      *          IN void*                        private_data )\r
90      *\r
91      * Therefore we always specify the context as the asyncronous EVD \r
92      * to be compatible with both APIs.\r
93      */\r
94 \r
95     DAPL_IA             *ia_ptr;\r
96     DAPL_EP             *ep_ptr;\r
97     DAPL_EVD            *async_evd;\r
98     DAT_EVENT_NUMBER    async_event;\r
99     DAT_RETURN          dat_status;\r
100 \r
101 #ifdef _VENDOR_IBAL_\r
102     dapl_dbg_log (DAPL_DBG_TYPE_ERR,"%s() IB err %s ctx %p\n", __FUNCTION__,\r
103                         ib_get_async_event_str(cause_ptr->code), context);\r
104 #else\r
105     dapl_dbg_log (DAPL_DBG_TYPE_ERR,"%s() IB async QP err - ctx=%p\n",\r
106                         __FUNCTION__, context);\r
107 #endif\r
108 \r
109     ep_ptr = (DAPL_EP *) context;\r
110     if ( !ep_ptr ) {\r
111         dapl_dbg_log (DAPL_DBG_TYPE_ERR,"%s() NULL context?\n",__FUNCTION__);\r
112         return;\r
113     }\r
114 \r
115     if (DAPL_BAD_HANDLE (ep_ptr, DAPL_MAGIC_EP )) {\r
116         dapl_dbg_log (DAPL_DBG_TYPE_ERR,\r
117                         "%s() BAD EP Handle %p\n", __FUNCTION__, ep_ptr);\r
118         return;\r
119     } \r
120 \r
121     ia_ptr    = ep_ptr->header.owner_ia;\r
122     async_evd = (DAPL_EVD *) ia_ptr->async_error_evd;\r
123     DAPL_CNTR(ia_ptr, DCNT_IA_ASYNC_QP_ERROR);\r
124 \r
125     dapl_dbg_log (\r
126         DAPL_DBG_TYPE_CALLBACK | DAPL_DBG_TYPE_EXCEPTION,\r
127         "--> %s: ep %p qp %p (%x) state %s\n", __FUNCTION__,\r
128         ep_ptr, \r
129         ep_ptr->qp_handle, \r
130         ep_ptr->qpn,\r
131         dapl_get_ep_state_str( ep_ptr->param.ep_state) );\r
132 \r
133     /*\r
134      * Transition to ERROR if we are connected; other states need to\r
135      * complete first (e.g. pending states)\r
136      */\r
137     if ( ep_ptr->param.ep_state == DAT_EP_STATE_CONNECTED)\r
138     {\r
139         ep_ptr->param.ep_state = DAT_EP_STATE_ERROR;\r
140     }\r
141 \r
142     dapl_os_assert (async_evd != NULL);\r
143 \r
144     dat_status = dapls_ib_get_async_event(cause_ptr, &async_event);\r
145     if ( dat_status == DAT_SUCCESS )\r
146     {\r
147         /*\r
148          * If dapls_ib_get_async_event is not successful,\r
149          * an event has been generated by the provide that\r
150          * we are not interested in.\r
151          */\r
152         (void) dapls_evd_post_async_error_event( async_evd,\r
153                                               async_event,\r
154                                               async_evd->header.owner_ia);\r
155     }\r
156     dapl_dbg_log (DAPL_DBG_TYPE_CALLBACK | DAPL_DBG_TYPE_EXCEPTION,\r
157                   "%s() returns %x\n",__FUNCTION__,dat_status);\r
158 }\r
159 \r
160 /*\r
161  * Local variables:\r
162  *  c-indent-level: 4\r
163  *  c-basic-offset: 4\r
164  *  tab-width: 8\r
165  * End:\r
166  */\r