Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ib_mad.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2004 Mellanox Technologies Ltd. All rights reserved.
3  * Copyright (c) 2004 Infinicon Corporation. All rights reserved.
4  * Copyright (c) 2004 Intel Corporation. All rights reserved.
5  * Copyright (c) 2004 Topspin Corporation. All rights reserved.
6  * Copyright (c) 2004-2006 Voltaire Corporation. All rights reserved.
7  *
8  * This software is available to you under a choice of one of two
9  * licenses. You may choose to be licensed under the terms of the GNU
10  * General Public License (GPL) Version 2, available from the file
11  * COPYING in the main directory of this source tree, or the
12  * OpenIB.org BSD license below:
13  *
14  * Redistribution and use in source and binary forms, with or
15  * without modification, are permitted provided that the following
16  * conditions are met:
17  *
18  * - Redistributions of source code must retain the above
19  * copyright notice, this list of conditions and the following
20  * disclaimer.
21  *
22  * - Redistributions in binary form must reproduce the above
23  * copyright notice, this list of conditions and the following
24  * disclaimer in the documentation and/or other materials
25  * provided with the distribution.
26  *
27  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
32  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34  * SOFTWARE.
35  */
36 
37 #if !defined(IB_MAD_H)
38 #define IB_MAD_H
39 
40 #include <linux/list.h>
41 
42 #include <rdma/ib_verbs.h>
43 
44 /* Management base version */
45 #define IB_MGMT_BASE_VERSION 1
46 
47 /* Management classes */
48 #define IB_MGMT_CLASS_SUBN_LID_ROUTED 0x01
49 #define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE 0x81
50 #define IB_MGMT_CLASS_SUBN_ADM 0x03
51 #define IB_MGMT_CLASS_PERF_MGMT 0x04
52 #define IB_MGMT_CLASS_BM 0x05
53 #define IB_MGMT_CLASS_DEVICE_MGMT 0x06
54 #define IB_MGMT_CLASS_CM 0x07
55 #define IB_MGMT_CLASS_SNMP 0x08
56 #define IB_MGMT_CLASS_DEVICE_ADM 0x10
57 #define IB_MGMT_CLASS_BOOT_MGMT 0x11
58 #define IB_MGMT_CLASS_BIS 0x12
59 #define IB_MGMT_CLASS_CONG_MGMT 0x21
60 #define IB_MGMT_CLASS_VENDOR_RANGE2_START 0x30
61 #define IB_MGMT_CLASS_VENDOR_RANGE2_END 0x4F
62 
63 #define IB_OPENIB_OUI (0x001405)
64 
65 /* Management methods */
66 #define IB_MGMT_METHOD_GET 0x01
67 #define IB_MGMT_METHOD_SET 0x02
68 #define IB_MGMT_METHOD_GET_RESP 0x81
69 #define IB_MGMT_METHOD_SEND 0x03
70 #define IB_MGMT_METHOD_TRAP 0x05
71 #define IB_MGMT_METHOD_REPORT 0x06
72 #define IB_MGMT_METHOD_REPORT_RESP 0x86
73 #define IB_MGMT_METHOD_TRAP_REPRESS 0x07
74 
75 #define IB_MGMT_METHOD_RESP 0x80
76 #define IB_BM_ATTR_MOD_RESP cpu_to_be32(1)
77 
78 #define IB_MGMT_MAX_METHODS 128
79 
80 /* MAD Status field bit masks */
81 #define IB_MGMT_MAD_STATUS_SUCCESS 0x0000
82 #define IB_MGMT_MAD_STATUS_BUSY 0x0001
83 #define IB_MGMT_MAD_STATUS_REDIRECT_REQD 0x0002
84 #define IB_MGMT_MAD_STATUS_BAD_VERSION 0x0004
85 #define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD 0x0008
86 #define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB 0x000c
87 #define IB_MGMT_MAD_STATUS_INVALID_ATTRIB_VALUE 0x001c
88 
89 /* RMPP information */
90 #define IB_MGMT_RMPP_VERSION 1
91 
92 #define IB_MGMT_RMPP_TYPE_DATA 1
93 #define IB_MGMT_RMPP_TYPE_ACK 2
94 #define IB_MGMT_RMPP_TYPE_STOP 3
95 #define IB_MGMT_RMPP_TYPE_ABORT 4
96 
97 #define IB_MGMT_RMPP_FLAG_ACTIVE 1
98 #define IB_MGMT_RMPP_FLAG_FIRST (1<<1)
99 #define IB_MGMT_RMPP_FLAG_LAST (1<<2)
100 
101 #define IB_MGMT_RMPP_NO_RESPTIME 0x1F
102 
103 #define IB_MGMT_RMPP_STATUS_SUCCESS 0
104 #define IB_MGMT_RMPP_STATUS_RESX 1
105 #define IB_MGMT_RMPP_STATUS_ABORT_MIN 118
106 #define IB_MGMT_RMPP_STATUS_T2L 118
107 #define IB_MGMT_RMPP_STATUS_BAD_LEN 119
108 #define IB_MGMT_RMPP_STATUS_BAD_SEG 120
109 #define IB_MGMT_RMPP_STATUS_BADT 121
110 #define IB_MGMT_RMPP_STATUS_W2S 122
111 #define IB_MGMT_RMPP_STATUS_S2B 123
112 #define IB_MGMT_RMPP_STATUS_BAD_STATUS 124
113 #define IB_MGMT_RMPP_STATUS_UNV 125
114 #define IB_MGMT_RMPP_STATUS_TMR 126
115 #define IB_MGMT_RMPP_STATUS_UNSPEC 127
116 #define IB_MGMT_RMPP_STATUS_ABORT_MAX 127
117 
118 #define IB_QP0 0
119 #define IB_QP1 cpu_to_be32(1)
120 #define IB_QP1_QKEY 0x80010000
121 #define IB_QP_SET_QKEY 0x80000000
122 
123 #define IB_DEFAULT_PKEY_PARTIAL 0x7FFF
124 #define IB_DEFAULT_PKEY_FULL 0xFFFF
125 
126 enum {
137 };
138 
139 struct ib_mad_hdr {
150 };
151 
152 struct ib_rmpp_hdr {
159 };
160 
162 
163 #define IB_SA_COMP_MASK(n) ((__force ib_sa_comp_mask) cpu_to_be64(1ull << (n)))
164 
165 /*
166  * ib_sa_hdr and ib_sa_mad structures must be packed because they have
167  * 64-bit fields that are only 32-bit aligned. 64-bit architectures will
168  * lay them out wrong otherwise. (And unfortunately they are sent on
169  * the wire so we can't change the layout)
170  */
171 struct ib_sa_hdr {
176 } __attribute__ ((packed));
178 struct ib_mad {
181 };
182 
183 struct ib_rmpp_mad {
187 };
188 
189 struct ib_sa_mad {
194 } __attribute__ ((packed));
200  u8 oui[3];
202 };
203 
222 };
223 
249  void *mad;
251  struct ib_ah *ah;
252  void *context[2];
253  int hdr_len;
254  int data_len;
256  int seg_size;
258  int retries;
259 };
260 
265 int ib_response_mad(struct ib_mad *mad);
266 
271 static inline u8 ib_get_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr)
272 {
273  return rmpp_hdr->rmpp_rtime_flags >> 3;
274 }
275 
280 static inline u8 ib_get_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr)
281 {
282  return rmpp_hdr->rmpp_rtime_flags & 0x7;
283 }
284 
290 static inline void ib_set_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr, u8 rtime)
291 {
292  rmpp_hdr->rmpp_rtime_flags = ib_get_rmpp_flags(rmpp_hdr) | (rtime << 3);
293 }
294 
300 static inline void ib_set_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr, u8 flags)
301 {
302  rmpp_hdr->rmpp_rtime_flags = (rmpp_hdr->rmpp_rtime_flags & 0xF8) |
303  (flags & 0x7);
304 }
305 
306 struct ib_mad_agent;
307 struct ib_mad_send_wc;
308 struct ib_mad_recv_wc;
309 
315 typedef void (*ib_mad_send_handler)(struct ib_mad_agent *mad_agent,
316  struct ib_mad_send_wc *mad_send_wc);
317 
328 typedef void (*ib_mad_snoop_handler)(struct ib_mad_agent *mad_agent,
329  struct ib_mad_send_buf *send_buf,
330  struct ib_mad_send_wc *mad_send_wc);
331 
343 typedef void (*ib_mad_recv_handler)(struct ib_mad_agent *mad_agent,
344  struct ib_mad_recv_wc *mad_recv_wc);
345 
361 struct ib_mad_agent {
362  struct ib_device *device;
363  struct ib_qp *qp;
364  struct ib_mr *mr;
368  void *context;
372 };
373 
385 };
386 
396  struct list_head list;
397  struct ib_grh *grh;
398  struct ib_mad *mad;
399 };
400 
412  struct ib_wc *wc;
415  int mad_len;
416 };
417 
433  u8 oui[3];
434  DECLARE_BITMAP(method_mask, IB_MGMT_MAX_METHODS);
435 };
436 
456  u8 port_num,
457  enum ib_qp_type qp_type,
458  struct ib_mad_reg_req *mad_reg_req,
462  void *context);
463 
465  /*IB_MAD_SNOOP_POSTED_SENDS = 1,*/
466  /*IB_MAD_SNOOP_RMPP_SENDS = (1<<1),*/
468  /*IB_MAD_SNOOP_RMPP_SEND_COMPLETIONS = (1<<3),*/
470  /*IB_MAD_SNOOP_RMPP_RECVS = (1<<5),*/
471  /*IB_MAD_SNOOP_REDIRECTED_QPS = (1<<6)*/
472 };
473 
486  u8 port_num,
487  enum ib_qp_type qp_type,
488  int mad_snoop_flags,
491  void *context);
492 
500 int ib_unregister_mad_agent(struct ib_mad_agent *mad_agent);
501 
521 int ib_post_send_mad(struct ib_mad_send_buf *send_buf,
522  struct ib_mad_send_buf **bad_send_buf);
523 
524 
532 void ib_free_recv_mad(struct ib_mad_recv_wc *mad_recv_wc);
533 
542 void ib_cancel_mad(struct ib_mad_agent *mad_agent,
543  struct ib_mad_send_buf *send_buf);
544 
554 int ib_modify_mad(struct ib_mad_agent *mad_agent,
555  struct ib_mad_send_buf *send_buf, u32 timeout_ms);
556 
573 struct ib_mad_agent *ib_redirect_mad_qp(struct ib_qp *qp,
577  void *context);
578 
594 int ib_process_mad_wc(struct ib_mad_agent *mad_agent,
595  struct ib_wc *wc);
596 
623 struct ib_mad_send_buf *ib_create_send_mad(struct ib_mad_agent *mad_agent,
624  u32 remote_qpn, u16 pkey_index,
625  int rmpp_active,
626  int hdr_len, int data_len,
627  gfp_t gfp_mask);
628 
637 
647 
656 void *ib_get_rmpp_segment(struct ib_mad_send_buf *send_buf, int seg_num);
657 
662 void ib_free_send_mad(struct ib_mad_send_buf *send_buf);
663 
664 #endif /* IB_MAD_H */