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