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