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