[DAPL2] DAPL Counters & 2.0.3 extensions to support counter retrieval.
[mirror/winof/.git] / ulp / dapl2 / dapl / common / dapl_srq_free.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_srq_free.c\r
31  *\r
32  * PURPOSE: Shared Receive Queue management\r
33  * Description: Interfaces in this file are completely described in\r
34  *              the DAPL 1.1 API, Chapter 6, section 5.5\r
35  *\r
36  * $Id:$\r
37  **********************************************************************/\r
38 \r
39 #include "dapl.h"\r
40 #include "dapl_ia_util.h"\r
41 #include "dapl_srq_util.h"\r
42 #include "dapl_adapter_util.h"\r
43 \r
44 /*\r
45  * dapl_srq_free\r
46  *\r
47  * DAPL Version 1.2, 6.5.5\r
48  *\r
49  * Destroy an instance of an SRQ\r
50  *\r
51  * Input:\r
52  *      srq_handle\r
53  *\r
54  * Output:\r
55  *      none\r
56  *\r
57  * Returns:\r
58  *      DAT_SUCCESS\r
59  *      DAT_INVALID_PARAMETER\r
60  *      DAT_INVALID_STATE\r
61  */\r
62 DAT_RETURN DAT_API\r
63 dapl_srq_free (\r
64         IN      DAT_SRQ_HANDLE     srq_handle)\r
65 {\r
66     DAPL_SRQ            *srq_ptr;\r
67     DAPL_IA             *ia_ptr;\r
68     DAT_SRQ_PARAM       *param;\r
69     DAT_RETURN          dat_status;\r
70 \r
71     dat_status = DAT_SUCCESS;\r
72 \r
73     dapl_dbg_log (DAPL_DBG_TYPE_API, "dapl_srq_free (%p)\n", srq_handle);\r
74 \r
75     srq_ptr = (DAPL_SRQ *) srq_handle;\r
76     param = &srq_ptr->param;\r
77 \r
78     /*\r
79      * Verify parameter & state\r
80      */\r
81     if ( DAPL_BAD_HANDLE (srq_ptr, DAPL_MAGIC_SRQ ) )\r
82     {\r
83         dat_status = DAT_ERROR (DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_SRQ);\r
84         goto bail;\r
85     }\r
86 \r
87     if (dapl_os_atomic_read (&srq_ptr->srq_ref_count) != 0)\r
88     {\r
89         /*\r
90          * The DAPL 1.2 spec says to return DAT_SRQ_IN_USE, which does\r
91          * not exist. Have filed the following as an errata.\r
92          */\r
93         dat_status = DAT_ERROR (DAT_INVALID_STATE,DAT_INVALID_STATE_SRQ_IN_USE);\r
94         goto bail;\r
95     }\r
96 \r
97     ia_ptr = srq_ptr->header.owner_ia;\r
98 \r
99     DAPL_CNTR(ia_ptr, DCNT_IA_SRQ_FREE);\r
100 \r
101     /*\r
102      * Do verification of parameters and the state change atomically.\r
103      */\r
104     dapl_os_lock ( &srq_ptr->header.lock );\r
105 \r
106     /* Remove the SRQ from the IA */\r
107     dapl_ia_unlink_srq ( ia_ptr, srq_ptr );\r
108 \r
109     dapl_os_unlock (&srq_ptr->header.lock);\r
110 \r
111     /*\r
112      * Finish tearing everything down.\r
113      */\r
114 \r
115     /*\r
116      * Take care of the transport resource\r
117      */\r
118 \r
119     /* XXX Put provider code here!!! */\r
120 \r
121     /* Free the resource */\r
122     dapl_srq_dealloc (srq_ptr);\r
123 \r
124 bail:\r
125     return dat_status;\r
126 \r
127 }\r
128 \r
129 /*\r
130  * Local variables:\r
131  *  c-indent-level: 4\r
132  *  c-basic-offset: 4\r
133  *  tab-width: 8\r
134  * End:\r
135  */\r