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