[IPoIB] Report receives with NDIS_STATUS_RESOURCES when below a RQ
[mirror/winof/.git] / ulp / ipoib / kernel / ipoib_adapter.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenIB.org BSD license\r
5  * below:\r
6  *\r
7  *     Redistribution and use in source and binary forms, with or\r
8  *     without modification, are permitted provided that the following\r
9  *     conditions are met:\r
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\r
15  *      - Redistributions in binary form must reproduce the above\r
16  *        copyright notice, this list of conditions and the following\r
17  *        disclaimer in the documentation and/or other materials\r
18  *        provided with the distribution.\r
19  *\r
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
27  * SOFTWARE.\r
28  *\r
29  * $Id$\r
30  */\r
31 \r
32 \r
33 #ifndef _IPOIB_ADAPTER_H_\r
34 #define _IPOIB_ADAPTER_H_\r
35 \r
36 #include <iba/ipoib_ifc.h>\r
37 #include <iba/ib_al.h>\r
38 #include <complib/cl_obj.h>\r
39 #include <complib/cl_spinlock.h>\r
40 #include <complib/cl_mutex.h>\r
41 #include <complib/cl_qpool.h>\r
42 #include <complib/cl_atomic.h>\r
43 #include <complib/cl_perf.h>\r
44 #include <complib/cl_vector.h>\r
45 #include "ip_packet.h"\r
46 #include "ip_stats.h"\r
47 \r
48 \r
49 /*\r
50  * Definitions\r
51  */\r
52 #define MAX_MCAST                               32\r
53 \r
54 #define IPV4_ADDR_SIZE                  4\r
55 \r
56 #define PORT_NUM_INDEX_IN_GUID  3 /* 0 based index into big endian GUID to get port number */\r
57 \r
58 /*\r
59  * Macros\r
60  */\r
61 \r
62 \r
63 typedef struct _ipoib_params\r
64 {\r
65         int32_t         rq_depth;\r
66         int32_t         rq_low_watermark;\r
67         int32_t         sq_depth;\r
68         boolean_t       send_chksum_offload;\r
69         boolean_t       recv_chksum_offload;\r
70         boolean_t       wsdp_enabled;\r
71         uint16_t        static_lid;\r
72         uint32_t        sa_timeout;\r
73         uint32_t        sa_retry_cnt;\r
74         uint32_t        recv_pool_ratio;\r
75         boolean_t       recv_growth;\r
76         mac_addr_t      conf_mac;\r
77 \r
78 }       ipoib_params_t;\r
79 /*\r
80 * FIELDS\r
81 *       rq_depth\r
82 *               Number of receive WQEs to allocate.\r
83 *\r
84 *       rq_low_watermark\r
85 *               Receives are indicated with NDIS_STATUS_RESOURCES when the number of\r
86 *               receives posted to the RQ falls bellow this value.\r
87 *\r
88 *       sq_depth\r
89 *               Number of send WQEs to allocate.\r
90 *\r
91 *       send_chksum_offload\r
92 *               Flag to indicate whether to offload send checksums.  This will make it\r
93 *               so that IPoIB packets should never be forwarded out of the IB subnet\r
94 *               without recalculating the checksum.\r
95 *\r
96 *       recv_chksum_offload\r
97 *               Flag to indicate whether to offload recv checksums.\r
98 *\r
99 *       wsdp_enabled\r
100 *               Flag to indicate whether WSDP is enabled for an adapter adapter.\r
101 *\r
102 *       static_lid\r
103 *               LID to assign to the port if that port is down (not init) and has none.\r
104 *               This feature allows a LID to be assigned, alowing locally targetted\r
105 *               traffic to occur even on ports that are not plugged in.\r
106 *\r
107 *       sa_timeout\r
108 *               Time, in milliseconds, to wait for a response before retransmitting an\r
109 *               SA query request.\r
110 *\r
111 *       sa_retry_cnt\r
112 *               Number of times to retry an SA query request.\r
113 *\r
114 *       recv_pool_ratio\r
115 *               Initial ratio of receive pool size to receive queue depth.\r
116 *\r
117 *       grow_thresh\r
118 *               Threshold at which to grow the receive pool.  Valid values start are\r
119 *               powers of 2, excluding 1.  When zero, grows only when the pool is\r
120 *               exhausted.  Other values indicate fractional values\r
121 *               (i.e. 2 indicates 1/2, 4 indicates 1/4, etc.)\r
122 *********/\r
123 \r
124 \r
125 typedef struct _pending_oid\r
126 {\r
127         NDIS_OID                        oid;\r
128         PVOID                           p_buf;\r
129         ULONG                           buf_len;\r
130         PULONG                          p_bytes_used;\r
131         PULONG                          p_bytes_needed;\r
132 \r
133 }       pending_oid_t;\r
134 \r
135 \r
136 typedef struct _ipoib_adapter\r
137 {\r
138         cl_obj_t                                obj;\r
139         NDIS_HANDLE                             h_adapter;\r
140         ipoib_ifc_data_t                guids;\r
141 \r
142         cl_list_item_t                  entry;\r
143 \r
144         ib_al_handle_t                  h_al;\r
145         ib_pnp_handle_t                 h_pnp;\r
146 \r
147         ib_pnp_event_t                  state;\r
148         boolean_t                               hung;\r
149         boolean_t                               reset;\r
150         boolean_t                               registering;\r
151 \r
152         boolean_t                               pending_query;\r
153         pending_oid_t                   query_oid;\r
154         boolean_t                               pending_set;\r
155         pending_oid_t                   set_oid;\r
156 \r
157         struct _ipoib_port              *p_port;\r
158 \r
159         uint32_t                                rate;\r
160 \r
161         ipoib_params_t                  params;\r
162         cl_spinlock_t                   recv_stat_lock;\r
163         ip_stats_t                              recv_stats;\r
164         cl_spinlock_t                   send_stat_lock;\r
165         ip_stats_t                              send_stats;\r
166 \r
167         boolean_t                               is_primary;\r
168         struct _ipoib_adapter   *p_primary;\r
169 \r
170         uint32_t                                packet_filter;\r
171 \r
172         mac_addr_t                              mac;\r
173         mac_addr_t                              mcast_array[MAX_MCAST];\r
174         uint8_t                                 mcast_array_size;\r
175 \r
176         cl_qpool_t                              item_pool;\r
177 \r
178         KMUTEX                                  mutex;\r
179 \r
180         cl_vector_t                             ip_vector;\r
181 \r
182         cl_perf_t                               perf;\r
183         ib_al_ifc_t                             *p_ifc;\r
184 \r
185 }       ipoib_adapter_t;\r
186 /*\r
187 * FIELDS\r
188 *       obj\r
189 *               Complib object for reference counting and destruction synchronization.\r
190 *\r
191 *       h_adapter\r
192 *               NDIS adapter handle.\r
193 *\r
194 *       guids\r
195 *               CA and port GUIDs returned by the bus driver.\r
196 *\r
197 *       entry\r
198 *               List item for storing all adapters in a list for address translation.\r
199 *               We add adapters when their packet filter is set to a non-zero value,\r
200 *               and remove them when their packet filter is cleared.  This is needed\r
201 *               since user-mode removal events are generated after the packet filter\r
202 *               is cleared, but before the adapter is destroyed.\r
203 *\r
204 *       h_al\r
205 *               AL handle for all IB resources.\r
206 *\r
207 *       h_pnp\r
208 *               PNP registration handle for port events.\r
209 *\r
210 *       state\r
211 *               State of the adapter.  IB_PNP_PORT_ADD indicates that the adapter\r
212 *               is ready to transfer data.\r
213 *\r
214 *       hung\r
215 *               Boolean flag used to return whether we are hung or not.\r
216 *\r
217 *       p_port\r
218 *               Pointer to an ipoib_port_t representing all resources for moving data\r
219 *               on the IB fabric.\r
220 *\r
221 *       rate\r
222 *               Rate, in 100bps increments, of the link.\r
223 *\r
224 *       params\r
225 *               Configuration parameters.\r
226 *\r
227 *       pending_query\r
228 *               Indicates that an query OID request is being processed asynchronously.\r
229 *\r
230 *       query_oid\r
231 *               Information about the pended query OID request.\r
232 *               Valid only if pending_query is TRUE.\r
233 *\r
234 *       pending_set\r
235 *               Indicates that an set OID request is being processed asynchronously.\r
236 *\r
237 *       set_oid\r
238 *               Information about the pended set OID request.\r
239 *               Valid only if pending_set is TRUE.\r
240 *\r
241 *       recv_lock\r
242 *               Spinlock protecting receive processing.\r
243 *\r
244 *       recv_stats\r
245 *               Receive statistics.\r
246 *\r
247 *       send_lock\r
248 *               Spinlock protecting send processing.\r
249 *\r
250 *       send_stats\r
251 *               Send statistics.\r
252 *\r
253 *       is_primary\r
254 *               Boolean flag to indicate if an adapter is the primary adapter\r
255 *               of a bundle.\r
256 *\r
257 *       p_primary\r
258 *               Pointer to the primary adapter for a bundle.\r
259 *\r
260 *       packet_filter\r
261 *               Packet filter set by NDIS.\r
262 *\r
263 *       mac_addr\r
264 *               Ethernet MAC address reported to NDIS.\r
265 *\r
266 *       mcast_array\r
267 *               List of multicast MAC addresses programmed by NDIS.\r
268 *\r
269 *       mcast_array_size\r
270 *               Number of entries in the multicat MAC address array;\r
271 *\r
272 *       item_pool\r
273 *               Pool of cl_pool_obj_t structures to use for queueing pending\r
274 *               packets for transmission.\r
275 *\r
276 *       mutex\r
277 *               Mutex to synchronized PnP callbacks with destruction.\r
278 *\r
279 *       ip_vector\r
280 *               Vector of assigned IP addresses.\r
281 *\r
282 *       p_ifc\r
283 *               Pointer to transport interface.\r
284 *\r
285 *********/\r
286 \r
287 \r
288 typedef struct _ats_reg\r
289 {\r
290         ipoib_adapter_t         *p_adapter;\r
291         ib_reg_svc_handle_t     h_reg_svc;\r
292 \r
293 }       ats_reg_t;\r
294 /*\r
295 * FIELDS\r
296 *       p_adapter\r
297 *               Pointer to the adapter to which this address is assigned.\r
298 *\r
299 *       h_reg_svc\r
300 *               Service registration handle.\r
301 *********/\r
302 \r
303 \r
304 typedef struct _net_address_item\r
305 {\r
306         ats_reg_t                       *p_reg;\r
307         union _net_address_item_address\r
308         {\r
309                 ULONG                   as_ulong;\r
310                 UCHAR                   as_bytes[IPV4_ADDR_SIZE];\r
311         }       address;\r
312 \r
313 }       net_address_item_t;\r
314 /*\r
315 * FIELDS\r
316 *       p_reg\r
317 *               Pointer to the ATS registration assigned to this address.\r
318 *\r
319 *       address\r
320 *               Union representing the IP address as an unsigned long or as\r
321 *               an array of bytes.\r
322 *\r
323 *       as_ulong\r
324 *               The IP address represented as an unsigned long.  Windows stores\r
325 *               IPs this way.\r
326 *\r
327 *       as_bytes\r
328 *               The IP address represented as an array of bytes.\r
329 *********/\r
330 \r
331 \r
332 ib_api_status_t\r
333 ipoib_create_adapter(\r
334         IN              NDIS_HANDLE                     wrapper_config_context,\r
335         IN              void* const                     h_adapter,\r
336         OUT             ipoib_adapter_t**  const        pp_adapter );\r
337 \r
338 \r
339 ib_api_status_t\r
340 ipoib_start_adapter(\r
341         IN                              ipoib_adapter_t* const          p_adapter );\r
342 \r
343 \r
344 void\r
345 ipoib_destroy_adapter(\r
346         IN                              ipoib_adapter_t* const          p_adapter );\r
347 \r
348 \r
349 /* Joins/leaves mcast groups based on currently programmed mcast MACs. */\r
350 void\r
351 ipoib_refresh_mcast(\r
352         IN                              ipoib_adapter_t* const          p_adapter,\r
353         IN                              mac_addr_t* const                       p_mac_array,\r
354         IN              const   uint8_t                                         num_macs );\r
355 /*\r
356 * PARAMETERS\r
357 *       p_adapter\r
358 *               Instance whose multicast MAC address list to modify.\r
359 *\r
360 *       p_mac_array\r
361 *               Array of multicast MAC addresses assigned to the adapter.\r
362 *\r
363 *       num_macs\r
364 *               Number of MAC addresses in the array.\r
365 *********/\r
366 \r
367 \r
368 NDIS_STATUS\r
369 ipoib_get_recv_stat(\r
370         IN                              ipoib_adapter_t* const          p_adapter,\r
371         IN              const   ip_stat_sel_t                           stat_sel,\r
372         IN                              pending_oid_t* const            p_oid_info );\r
373 \r
374 \r
375 void\r
376 ipoib_inc_recv_stat(\r
377         IN                              ipoib_adapter_t* const          p_adapter,\r
378         IN              const   ip_stat_sel_t                           stat_sel,\r
379         IN              const   size_t                                          bytes OPTIONAL );\r
380 \r
381 \r
382 NDIS_STATUS\r
383 ipoib_get_send_stat(\r
384         IN                              ipoib_adapter_t* const          p_adapter,\r
385         IN              const   ip_stat_sel_t                           stat_sel,\r
386         IN                              pending_oid_t* const            p_oid_info );\r
387 \r
388 \r
389 void\r
390 ipoib_inc_send_stat(\r
391         IN                              ipoib_adapter_t* const          p_adapter,\r
392         IN              const   ip_stat_sel_t                           stat_sel,\r
393         IN              const   size_t                                          bytes OPTIONAL );\r
394 \r
395 \r
396 void\r
397 ipoib_set_rate(\r
398         IN                              ipoib_adapter_t* const          p_adapter,\r
399         IN              const   uint8_t                                         link_width,\r
400         IN              const   uint8_t                                         link_speed );\r
401 \r
402 \r
403 void\r
404 ipoib_set_active(\r
405         IN                              ipoib_adapter_t* const          p_adapter );\r
406 \r
407 void\r
408 ipoib_set_inactive(\r
409         IN                              ipoib_adapter_t* const          p_adapter );\r
410 \r
411 ib_api_status_t\r
412 ipoib_reset_adapter(\r
413         IN                              ipoib_adapter_t* const          p_adapter );\r
414 \r
415 void\r
416 ipoib_reg_addrs(\r
417         IN                              ipoib_adapter_t* const          p_adapter );\r
418 \r
419 void\r
420 ipoib_dereg_addrs(\r
421         IN                              ipoib_adapter_t* const          p_adapter );\r
422 \r
423 #endif  /* _IPOIB_ADAPTER_H_ */\r