[ipoib,core] Improve support for partitioning.
[mirror/winof/.git] / ulp / ipoib / kernel / ipoib_port.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 \r
36 #ifndef _IPOIB_PORT_H_\r
37 #define _IPOIB_PORT_H_\r
38 \r
39 \r
40 #include <iba/ib_al.h>\r
41 #include <complib/cl_obj.h>\r
42 #include <complib/cl_qmap.h>\r
43 #include <complib/cl_fleximap.h>\r
44 #include <ip_packet.h>\r
45 #include "ipoib_endpoint.h"\r
46 #include "ipoib_xfr_mgr.h"\r
47 \r
48 \r
49 /*\r
50  * Define to place receive buffer inline in receive descriptor.\r
51  */\r
52 #define IPOIB_INLINE_RECV       1\r
53 \r
54 \r
55 /* Max send data segment list size. */\r
56 #define MAX_SEND_SGE    8\r
57 \r
58 \r
59 /* \r
60  *  Invalid pkey index\r
61  */\r
62 #define PKEY_INVALID_INDEX      0xFFFF\r
63 \r
64 /*\r
65  * Define to control how transfers are done.  When defined as 1, causes\r
66  * packets to be sent using NDIS DMA facilities (getting the SGL from the\r
67  * packet).  When defined as 0, uses the NDIS_BUFFER structures as MDLs\r
68  * to get the physical page mappings of the buffers.\r
69  */\r
70 #define IPOIB_USE_DMA   1\r
71 \r
72 \r
73 #define IPOIB_PORT_FROM_PACKET( P )     \\r
74         (((ipoib_port_t**)P->MiniportReservedEx)[0])\r
75 #define IPOIB_ENDPT_FROM_PACKET( P )    \\r
76         (((ipoib_endpt_t**)P->MiniportReservedEx)[1])\r
77 #define IPOIB_RECV_FROM_PACKET( P )     \\r
78         (((ipoib_recv_desc_t**)P->MiniportReservedEx)[1])\r
79 #define IPOIB_SEND_FROM_PACKET( P )             \\r
80         (((send_buf_t**)P->MiniportReservedEx)[2])\r
81 #define IPOIB_PACKET_FROM_LIST_ITEM( I ) \\r
82         (PARENT_STRUCT( I, NDIS_PACKET, MiniportReservedEx ))\r
83 #define IPOIB_LIST_ITEM_FROM_PACKET( P ) \\r
84         ((cl_list_item_t*)P->MiniportReservedEx)\r
85 \r
86 \r
87 typedef struct _ipoib_ib_mgr\r
88 {\r
89         ib_ca_handle_t                  h_ca;\r
90         ib_pd_handle_t                  h_pd;\r
91         ib_cq_handle_t                  h_recv_cq;\r
92         ib_cq_handle_t                  h_send_cq;\r
93         ib_qp_handle_t                  h_qp;\r
94         ib_query_handle_t               h_query;\r
95         net32_t                                 qpn;\r
96 \r
97         ib_mr_handle_t                  h_mr;\r
98         net32_t                                 lkey;\r
99 \r
100         uint8_t                                 rate;\r
101         ib_member_rec_t                 bcast_rec;\r
102 \r
103 }       ipoib_ib_mgr_t;\r
104 /*\r
105 * FIELDS\r
106 *       h_ca\r
107 *               CA handle for all IB resources.\r
108 *\r
109 *       h_pd\r
110 *               PD handle for all IB resources.\r
111 *\r
112 *       h_recv_cq\r
113 *               Recv CQ handle.\r
114 *\r
115 *       h_send_cq\r
116 *               Send CQ handle.\r
117 *\r
118 *       h_qp\r
119 *               QP handle for data transfers.\r
120 *\r
121 *       h_query\r
122 *               Query handle for cancelling SA queries.\r
123 *\r
124 *       h_mr\r
125 *               Registration handle for all of physical memory.  Used for\r
126 *               send/receive buffers to simplify growing the receive pool.\r
127 *\r
128 *       lkey\r
129 *               LKey for the memory region.\r
130 *\r
131 *       bcast_rec\r
132 *               Cached information about the broadcast group, used to specify\r
133 *               parameters used to join other multicast groups.\r
134 *********/\r
135 \r
136 \r
137 #include <complib/cl_packon.h>\r
138 /****s* IPoIB Driver/ipoib_hdr_t\r
139 * NAME\r
140 *       ipoib_hdr_t\r
141 *\r
142 * DESCRIPTION\r
143 *       IPoIB packet header.\r
144 *\r
145 * SYNOPSIS\r
146 */\r
147 typedef struct _ipoib_hdr\r
148 {\r
149         net16_t                 type;\r
150         net16_t                 resv;\r
151 \r
152 }       PACK_SUFFIX ipoib_hdr_t;\r
153 /*\r
154 * FIELDS\r
155 *       type\r
156 *               Protocol type.\r
157 *\r
158 *       resv\r
159 *               Reserved portion of IPoIB header.\r
160 *********/\r
161 \r
162 typedef struct _ipoib_arp_pkt\r
163 {\r
164         net16_t                 hw_type;\r
165         net16_t                 prot_type;\r
166         uint8_t                 hw_size;\r
167         uint8_t                 prot_size;\r
168         net16_t                 op;\r
169         ipoib_hw_addr_t src_hw;\r
170         net32_t                 src_ip;\r
171         ipoib_hw_addr_t dst_hw;\r
172         net32_t                 dst_ip;\r
173 \r
174 }       PACK_SUFFIX ipoib_arp_pkt_t;\r
175 \r
176 \r
177 /****s* IPoIB Driver/ipoib_pkt_t\r
178 * NAME\r
179 *       ipoib_pkt_t\r
180 *\r
181 * DESCRIPTION\r
182 *       Represents an IPoIB packet with no GRH.\r
183 *\r
184 * SYNOPSIS\r
185 */\r
186 typedef struct _ipoib_pkt\r
187 {\r
188         ipoib_hdr_t             hdr;\r
189         union _payload\r
190         {\r
191                 uint8_t                 data[MAX_PAYLOAD_MTU];\r
192                 ipoib_arp_pkt_t arp;\r
193                 ip_pkt_t                ip;\r
194 \r
195         }       PACK_SUFFIX type;\r
196 \r
197 }       PACK_SUFFIX ipoib_pkt_t;\r
198 /*\r
199 * FIELDS\r
200 *       hdr\r
201 *               IPoIB header.\r
202 *\r
203 *       type\r
204 *               Union for different types of payloads.\r
205 *\r
206 *       type.data\r
207 *               raw packet.\r
208 *\r
209 *       type.ib_arp\r
210 *               IPoIB ARP packet.\r
211 *\r
212 *       type.arp\r
213 *               Ethernet ARP packet.\r
214 *\r
215 *       type.ip\r
216 *               IP packet.\r
217 *********/\r
218 \r
219 \r
220 /****s* IPoIB Driver/recv_buf_t\r
221 * NAME\r
222 *       recv_buf_t\r
223 *\r
224 * DESCRIPTION\r
225 *       Represents a receive buffer, including the ethernet header\r
226 *       used to indicate the receive to the OS.\r
227 *\r
228 * SYNOPSIS\r
229 */\r
230 typedef union _recv_buf\r
231 {\r
232         struct _recv_buf_type_eth\r
233         {\r
234                 uint8_t                 pad[sizeof(ib_grh_t) +\r
235                                                         sizeof(ipoib_hdr_t) -\r
236                                                         sizeof(eth_hdr_t)];\r
237                 eth_pkt_t               pkt;    /* data starts at sizeof(grh)+sizeof(eth_hdr) */\r
238 \r
239         }       PACK_SUFFIX eth;\r
240 \r
241         struct _recv_buf_type_ib\r
242         {\r
243                 ib_grh_t                grh;    /* Must be same offset as lcl_rt.ib.pkt */\r
244                 ipoib_pkt_t             pkt;    /* data starts at 10+grh+4 */\r
245 \r
246         }       PACK_SUFFIX ib;\r
247 \r
248 }       PACK_SUFFIX recv_buf_t;\r
249 /*\r
250 * FIELDS\r
251 *       eth.pkt\r
252 *               Ethernet packet, used to indicate the receive to the OS.\r
253 *\r
254 *       ib.grh\r
255 *               GRH for a globally routed received packet.\r
256 *\r
257 *       ib.pkt\r
258 *               IPOIB packet representing a globally routed received packet.\r
259 *\r
260 * NOTES\r
261 *       When posting the work request, the address of ib.grh is used.\r
262 *\r
263 *       TODO: Do we need a pad to offset the header so that the data ends up\r
264 *       aligned on a pointer boundary?\r
265 *********/\r
266 \r
267 /****s* IPoIB Driver/send_buf_t\r
268 * NAME\r
269 *       send_buf_t\r
270 *\r
271 * DESCRIPTION\r
272 *       Represents a send buffer, used to convert packets to IPoIB format.\r
273 *\r
274 * SYNOPSIS\r
275 */\r
276 typedef union _send_buf\r
277 {\r
278         uint8_t                 data[MAX_PAYLOAD_MTU];\r
279         ipoib_arp_pkt_t arp;\r
280         ip_pkt_t                ip;\r
281 \r
282 }       PACK_SUFFIX send_buf_t;\r
283 /*\r
284 * FIELDS\r
285 *       data\r
286 *               IP/ARP packet.\r
287 *\r
288 * NOTES\r
289 *       TODO: Do we need a pad to offset the header so that the data ends up\r
290 *       aligned on a pointer boundary?\r
291 *********/\r
292 #include <complib/cl_packoff.h>\r
293 \r
294 \r
295 typedef struct _ipoib_buf_mgr\r
296 {\r
297         cl_qpool_t                      recv_pool;\r
298 \r
299         NDIS_HANDLE                     h_packet_pool;\r
300         NDIS_HANDLE                     h_buffer_pool;\r
301 \r
302         NPAGED_LOOKASIDE_LIST   send_buf_list;\r
303         NDIS_HANDLE                     h_send_pkt_pool;\r
304         NDIS_HANDLE                     h_send_buf_pool;\r
305 \r
306 }       ipoib_buf_mgr_t;\r
307 /*\r
308 * FIELDS\r
309 *       recv_pool\r
310 *               Pool of ipoib_recv_desc_t structures.\r
311 *\r
312 *       h_packet_pool\r
313 *               NDIS packet pool, used to indicate receives to NDIS.\r
314 *\r
315 *       h_buffer_pool\r
316 *               NDIS buffer pool, used to indicate receives to NDIS.\r
317 *\r
318 *       send_buf_list\r
319 *               Lookaside list for dynamically allocating send buffers for send\r
320 *               that require copies (ARP, DHCP, and any with more physical pages\r
321 *               than can fit in the local data segments).\r
322 *********/\r
323 \r
324 \r
325 typedef enum _ipoib_pkt_type\r
326 {\r
327         PKT_TYPE_UCAST,\r
328         PKT_TYPE_BCAST,\r
329         PKT_TYPE_MCAST\r
330 \r
331 }       ipoib_pkt_type_t;\r
332 \r
333 \r
334 typedef struct _ipoib_recv_desc\r
335 {\r
336         cl_pool_item_t          item;   /* Must be first. */\r
337         uint32_t                        len;\r
338         ipoib_pkt_type_t        type;\r
339         ib_recv_wr_t            wr;\r
340         ib_local_ds_t           local_ds[2];\r
341         NDIS_TCP_IP_CHECKSUM_PACKET_INFO        ndis_csum;\r
342 #if IPOIB_INLINE_RECV\r
343         recv_buf_t                      buf;\r
344 #else\r
345         recv_buf_t                      *p_buf;\r
346 #endif\r
347 \r
348 }       ipoib_recv_desc_t;\r
349 /*\r
350 * FIELDS\r
351 *       item\r
352 *               Pool item for storing descriptors in a pool.\r
353 *\r
354 *       len\r
355 *               Length to indicate to NDIS.  This is different than the length of the\r
356 *               received data as some data is IPoIB specific and filtered out.\r
357 *\r
358 *       type\r
359 *               Type of packet, used in filtering received packets against the packet\r
360 *               filter.  Also used to update stats.\r
361 *\r
362 *       wr\r
363 *               Receive work request.\r
364 *\r
365 *       local_ds\r
366 *               Local data segments.  The second segment is only used if a buffer\r
367 *               spans physical pages.\r
368 *\r
369 *       buf\r
370 *               Buffer for the receive.\r
371 *\r
372 * NOTES\r
373 *       The pool item is always first to allow casting form a cl_pool_item_t or\r
374 *       cl_list_item_t to the descriptor.\r
375 *********/\r
376 \r
377 \r
378 typedef struct _ipoib_send_desc\r
379 {\r
380         NDIS_PACKET                     *p_pkt;\r
381         ipoib_endpt_t           *p_endpt;\r
382         send_buf_t                      *p_buf;\r
383         ib_send_wr_t            wr;\r
384         ipoib_hdr_t                     pkt_hdr;\r
385         ib_local_ds_t           local_ds[MAX_SEND_SGE]; /* Must be last. */\r
386 \r
387 }       ipoib_send_desc_t;\r
388 /*\r
389 * FIELDS\r
390 *       p_pkt\r
391 *               Pointer to the NDIS_PACKET associated with the send operation.\r
392 *\r
393 *       p_endpt\r
394 *               Endpoint for this send.\r
395 *\r
396 *       p_buf\r
397 *               Buffer for the send, if allocated.\r
398 *\r
399 *       wr\r
400 *               Send work request.\r
401 *\r
402 *       pkt_hdr\r
403 *               IPoIB packet header, pointed to by the first local datasegment.\r
404 *\r
405 *       local_ds\r
406 *               Local data segment array.  Placed last to allow allocating beyond the\r
407 *               end of the descriptor for additional datasegments.\r
408 *\r
409 * NOTES\r
410 *       The pool item is always first to allow casting form a cl_pool_item_t or\r
411 *       cl_list_item_t to the descriptor.\r
412 *********/\r
413 \r
414 \r
415 typedef struct _ipoib_recv_mgr\r
416 {\r
417         int32_t                 depth;\r
418 \r
419         NDIS_PACKET             **recv_pkt_array;\r
420 \r
421         cl_qlist_t              done_list;\r
422 \r
423 }       ipoib_recv_mgr_t;\r
424 /*\r
425 * FIELDS\r
426 *       depth\r
427 *               Current number of WRs posted.\r
428 *\r
429 *       p_head\r
430 *               Pointer to work completion in descriptor at the head of the QP.\r
431 *\r
432 *       p_tail\r
433 *               Pointer to the work completion in the descriptor at the tail of the QP.\r
434 *\r
435 *       recv_pkt_array\r
436 *               Array of pointers to NDIS_PACKET used to indicate receives.\r
437 *\r
438 *       done_list\r
439 *               List of receive descriptors that need to be indicated to NDIS.\r
440 *********/\r
441 \r
442 \r
443 typedef struct _ipoib_send_mgr\r
444 {\r
445         atomic32_t              depth;\r
446         cl_qlist_t              pending_list;\r
447 \r
448 }       ipoib_send_mgr_t;\r
449 /*\r
450 * FIELDS\r
451 *       depth\r
452 *               Current number of WRs posted, used to queue pending requests.\r
453 *\r
454 *       pending_list\r
455 *               List of NDIS_PACKET structures that are awaiting available WRs to send.\r
456 *********/\r
457 \r
458 \r
459 typedef struct _ipoib_endpt_mgr\r
460 {\r
461         cl_qmap_t                               mac_endpts;\r
462         cl_fmap_t                               gid_endpts;\r
463         cl_qmap_t                               lid_endpts;\r
464 \r
465 }       ipoib_endpt_mgr_t;\r
466 /*\r
467 * FIELDS\r
468 *       mac_endpts\r
469 *               Map of enpoints, keyed by MAC address.\r
470 *\r
471 *       gid_endpts\r
472 *               Map of enpoints, keyed by GID.\r
473 *\r
474 *       lid_endpts\r
475 *               Map of enpoints, keyed by LID.  Only enpoints on the same subnet\r
476 *               are inserted in the LID map.\r
477 *********/\r
478 \r
479 \r
480 typedef struct _ipoib_port\r
481 {\r
482         cl_obj_t                                obj;\r
483         cl_obj_rel_t                    rel;\r
484 \r
485         ib_qp_state_t                   state;\r
486 \r
487         cl_spinlock_t                   recv_lock;\r
488         cl_spinlock_t                   send_lock;\r
489 \r
490         struct _ipoib_adapter   *p_adapter;\r
491         uint8_t                                 port_num;\r
492 \r
493         KEVENT                                  sa_event;\r
494 \r
495         atomic32_t                              mcast_cnt;\r
496         KEVENT                                  leave_mcast_event;\r
497         \r
498         ipoib_ib_mgr_t                  ib_mgr;\r
499 \r
500         ipoib_buf_mgr_t                 buf_mgr;\r
501 \r
502         ipoib_recv_mgr_t                recv_mgr;\r
503         ipoib_send_mgr_t                send_mgr;\r
504 \r
505         ipoib_endpt_mgr_t               endpt_mgr;\r
506 \r
507         ipoib_endpt_t                   *p_local_endpt;\r
508 \r
509 #if DBG\r
510         atomic32_t                              ref[ref_array_size];\r
511 #endif\r
512 \r
513         atomic32_t                              endpt_rdr;\r
514 \r
515         atomic32_t                              hdr_idx;\r
516         uint16_t                                pkey_index;\r
517         KDPC                                    gc_dpc;\r
518         KTIMER                                  gc_timer;\r
519         ipoib_hdr_t                             hdr[1]; /* Must be last! */\r
520 \r
521 }       ipoib_port_t;\r
522 /*\r
523 * FIELDS\r
524 *       obj\r
525 *               Complib object for reference counting, relationships,\r
526 *               and destruction synchronization.\r
527 *\r
528 *       rel\r
529 *               Relationship to associate the port with the adapter.\r
530 *\r
531 *       state\r
532 *               State of the port object.  Tracks QP state fairly closely.\r
533 *\r
534 *       recv_lock\r
535 *               Spinlock to protect receive operations.\r
536 *\r
537 *       send_lock\r
538 *               Spinlock to protect send operations.\r
539 *\r
540 *       p_adapter\r
541 *               Parent adapter.  Used to get AL handle.\r
542 *\r
543 *       port_num\r
544 *               Port number of this adapter.\r
545 *\r
546 *       ib_mgr\r
547 *               IB resource manager.\r
548 *\r
549 *       recv_mgr\r
550 *               Receive manager.\r
551 *\r
552 *       send_mgr\r
553 *               Send manager.\r
554 *\r
555 *       endpt_mgr\r
556 *               Endpoint manager.\r
557 *********/\r
558 \r
559 \r
560 ib_api_status_t\r
561 ipoib_create_port(\r
562         IN                              struct _ipoib_adapter* const    p_adapter,\r
563         IN                              ib_pnp_port_rec_t* const        p_pnp_rec,\r
564                 OUT                     ipoib_port_t** const            pp_port );\r
565 \r
566 void\r
567 ipoib_port_destroy(\r
568         IN                              ipoib_port_t* const                     p_port );\r
569 \r
570 void\r
571 ipoib_port_up(\r
572         IN                              ipoib_port_t* const                     p_port,\r
573         IN              const   ib_pnp_port_rec_t* const        p_pnp_rec );\r
574 \r
575 void\r
576 ipoib_port_down(\r
577         IN                              ipoib_port_t* const                     p_port );\r
578 \r
579 ib_api_status_t\r
580 ipoib_port_join_mcast(\r
581         IN                              ipoib_port_t* const                     p_port,\r
582         IN              const   mac_addr_t                              mac,\r
583         IN              const   uint8_t                                 state );\r
584 \r
585 \r
586 void\r
587 ipoib_leave_mcast_cb(\r
588         IN                              void                            *context );\r
589 \r
590 \r
591 void\r
592 ipoib_port_remove_endpt(\r
593         IN                              ipoib_port_t* const                     p_port,\r
594         IN              const   mac_addr_t                                      mac );\r
595 \r
596 void\r
597 ipoib_port_flush_endpts(\r
598         IN                              ipoib_port_t* const                     p_port );\r
599 \r
600 void\r
601 ipoib_port_send(\r
602         IN                              ipoib_port_t* const                     p_port,\r
603         IN                              NDIS_PACKET                                     **p_packet_array,\r
604         IN                              uint32_t                                        num_packets );\r
605 \r
606 void\r
607 ipoib_return_packet(\r
608         IN                              NDIS_HANDLE                                     adapter_context,\r
609         IN                              NDIS_PACKET                                     *p_packet );\r
610 \r
611 void\r
612 ipoib_port_resume(\r
613         IN                              ipoib_port_t* const                     p_port );\r
614 \r
615 NTSTATUS\r
616 ipoib_mac_to_gid(\r
617         IN                              ipoib_port_t* const                     p_port,\r
618         IN              const   mac_addr_t                                      mac,\r
619                 OUT                     ib_gid_t*                                       p_gid );\r
620 \r
621 inline void ipoib_port_ref(\r
622         IN                              ipoib_port_t *                          p_port, \r
623         IN                              int                                             type);\r
624 \r
625 inline void ipoib_port_deref(\r
626         IN                              ipoib_port_t *                          p_port,\r
627         IN                              int                                             type);\r
628 \r
629 \r
630 #endif  /* _IPOIB_PORT_H_ */\r