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 * $Id: ib_mad.h 5596 2006-03-03 01:00:07Z sean.hefty $ 37 */ 38 39 #if !defined( IB_MAD_H ) 40 #define IB_MAD_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 /* RMPP information */ 81 #define IB_MGMT_RMPP_VERSION 1 82 83 #define IB_MGMT_RMPP_TYPE_DATA 1 84 #define IB_MGMT_RMPP_TYPE_ACK 2 85 #define IB_MGMT_RMPP_TYPE_STOP 3 86 #define IB_MGMT_RMPP_TYPE_ABORT 4 87 88 #define IB_MGMT_RMPP_FLAG_ACTIVE 1 89 #define IB_MGMT_RMPP_FLAG_FIRST (1<<1) 90 #define IB_MGMT_RMPP_FLAG_LAST (1<<2) 91 92 #define IB_MGMT_RMPP_NO_RESPTIME 0x1F 93 94 #define IB_MGMT_RMPP_STATUS_SUCCESS 0 95 #define IB_MGMT_RMPP_STATUS_RESX 1 96 #define IB_MGMT_RMPP_STATUS_ABORT_MIN 118 97 #define IB_MGMT_RMPP_STATUS_T2L 118 98 #define IB_MGMT_RMPP_STATUS_BAD_LEN 119 99 #define IB_MGMT_RMPP_STATUS_BAD_SEG 120 100 #define IB_MGMT_RMPP_STATUS_BADT 121 101 #define IB_MGMT_RMPP_STATUS_W2S 122 102 #define IB_MGMT_RMPP_STATUS_S2B 123 103 #define IB_MGMT_RMPP_STATUS_BAD_STATUS 124 104 #define IB_MGMT_RMPP_STATUS_UNV 125 105 #define IB_MGMT_RMPP_STATUS_TMR 126 106 #define IB_MGMT_RMPP_STATUS_UNSPEC 127 107 #define IB_MGMT_RMPP_STATUS_ABORT_MAX 127 108 109 #define IB_QP0 0 110 #define IB_QP1 __constant_htonl(1) 111 #define IB_QP1_QKEY 0x80010000 112 #define IB_QP_SET_QKEY 0x80000000 113 114 enum { 115 IB_MGMT_MAD_HDR = 24, 116 IB_MGMT_MAD_DATA = 232, 117 IB_MGMT_RMPP_HDR = 36, 118 IB_MGMT_RMPP_DATA = 220, 119 IB_MGMT_VENDOR_HDR = 40, 120 IB_MGMT_VENDOR_DATA = 216, 121 IB_MGMT_SA_HDR = 56, 122 IB_MGMT_SA_DATA = 200, 123 IB_MGMT_DEVICE_HDR = 64, 124 IB_MGMT_DEVICE_DATA = 192, 125 }; 126 127 struct ib_mad_hdr { 128 u8 base_version; 129 u8 mgmt_class; 130 u8 class_version; 131 u8 method; 132 __be16 status; 133 __be16 class_specific; 134 __be64 tid; 135 __be16 attr_id; 136 __be16 resv; 137 __be32 attr_mod; 138 }; 139 140 struct ib_rmpp_hdr { 141 u8 rmpp_version; 142 u8 rmpp_type; 143 u8 rmpp_rtime_flags; 144 u8 rmpp_status; 145 __be32 seg_num; 146 __be32 paylen_newwin; 147 }; 148 149 typedef u64 __bitwise ib_sa_comp_mask; 150 151 #define IB_SA_COMP_MASK(n) ((__force ib_sa_comp_mask) cpu_to_be64(1ull << n)) 152 153 /* 154 * ib_sa_hdr and ib_sa_mad structures must be packed because they have 155 * 64-bit fields that are only 32-bit aligned. 64-bit architectures will 156 * lay them out wrong otherwise. (And unfortunately they are sent on 157 * the wire so we can't change the layout) 158 */ 159 struct ib_sa_hdr { 160 __be64 sm_key; 161 __be16 attr_offset; 162 __be16 reserved; 163 ib_sa_comp_mask comp_mask; 164 } __attribute__ ((packed)); 165 166 struct ib_mad { 167 struct ib_mad_hdr mad_hdr; 168 u8 data[IB_MGMT_MAD_DATA]; 169 }; 170 171 struct ib_rmpp_mad { 172 struct ib_mad_hdr mad_hdr; 173 struct ib_rmpp_hdr rmpp_hdr; 174 u8 data[IB_MGMT_RMPP_DATA]; 175 }; 176 177 struct ib_sa_mad { 178 struct ib_mad_hdr mad_hdr; 179 struct ib_rmpp_hdr rmpp_hdr; 180 struct ib_sa_hdr sa_hdr; 181 u8 data[IB_MGMT_SA_DATA]; 182 } __attribute__ ((packed)); 183 184 struct ib_vendor_mad { 185 struct ib_mad_hdr mad_hdr; 186 struct ib_rmpp_hdr rmpp_hdr; 187 u8 reserved; 188 u8 oui[3]; 189 u8 data[IB_MGMT_VENDOR_DATA]; 190 }; 191 192 struct ib_class_port_info 193 { 194 u8 base_version; 195 u8 class_version; 196 __be16 capability_mask; 197 u8 reserved[3]; 198 u8 resp_time_value; 199 u8 redirect_gid[16]; 200 __be32 redirect_tcslfl; 201 __be16 redirect_lid; 202 __be16 redirect_pkey; 203 __be32 redirect_qp; 204 __be32 redirect_qkey; 205 u8 trap_gid[16]; 206 __be32 trap_tcslfl; 207 __be16 trap_lid; 208 __be16 trap_pkey; 209 __be32 trap_hlqp; 210 __be32 trap_qkey; 211 }; 212 213 /** 214 * ib_mad_send_buf - MAD data buffer and work request for sends. 215 * @next: A pointer used to chain together MADs for posting. 216 * @mad: References an allocated MAD data buffer for MADs that do not have 217 * RMPP active. For MADs using RMPP, references the common and management 218 * class specific headers. 219 * @mad_agent: MAD agent that allocated the buffer. 220 * @ah: The address handle to use when sending the MAD. 221 * @context: User-controlled context fields. 222 * @hdr_len: Indicates the size of the data header of the MAD. This length 223 * includes the common MAD, RMPP, and class specific headers. 224 * @data_len: Indicates the total size of user-transferred data. 225 * @seg_count: The number of RMPP segments allocated for this send. 226 * @seg_size: Size of each RMPP segment. 227 * @timeout_ms: Time to wait for a response. 228 * @retries: Number of times to retry a request for a response. 229 * 230 * Users are responsible for initializing the MAD buffer itself, with the 231 * exception of any RMPP header. Additional segment buffer space allocated 232 * beyond data_len is padding. 233 */ 234 struct ib_mad_send_buf { 235 struct ib_mad_send_buf *next; 236 void *mad; 237 struct ib_mad_agent *mad_agent; 238 struct ib_ah *ah; 239 void *context[2]; 240 int hdr_len; 241 int data_len; 242 int seg_count; 243 int seg_size; 244 int timeout_ms; 245 int retries; 246 }; 247 248 /** 249 * ib_response_mad - Returns if the specified MAD has been generated in 250 * response to a sent request or trap. 251 */ 252 int ib_response_mad(struct ib_mad *mad); 253 254 /** 255 * ib_get_rmpp_resptime - Returns the RMPP response time. 256 * @rmpp_hdr: An RMPP header. 257 */ 258 static inline u8 ib_get_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr) 259 { 260 return rmpp_hdr->rmpp_rtime_flags >> 3; 261 } 262 263 /** 264 * ib_get_rmpp_flags - Returns the RMPP flags. 265 * @rmpp_hdr: An RMPP header. 266 */ 267 static inline u8 ib_get_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr) 268 { 269 return rmpp_hdr->rmpp_rtime_flags & 0x7; 270 } 271 272 /** 273 * ib_set_rmpp_resptime - Sets the response time in an RMPP header. 274 * @rmpp_hdr: An RMPP header. 275 * @rtime: The response time to set. 276 */ 277 static inline void ib_set_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr, u8 rtime) 278 { 279 rmpp_hdr->rmpp_rtime_flags = ib_get_rmpp_flags(rmpp_hdr) | (rtime << 3); 280 } 281 282 /** 283 * ib_set_rmpp_flags - Sets the flags in an RMPP header. 284 * @rmpp_hdr: An RMPP header. 285 * @flags: The flags to set. 286 */ 287 static inline void ib_set_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr, u8 flags) 288 { 289 rmpp_hdr->rmpp_rtime_flags = (rmpp_hdr->rmpp_rtime_flags & 0xF1) | 290 (flags & 0x7); 291 } 292 293 struct ib_mad_agent; 294 struct ib_mad_send_wc; 295 struct ib_mad_recv_wc; 296 297 /** 298 * ib_mad_send_handler - callback handler for a sent MAD. 299 * @mad_agent: MAD agent that sent the MAD. 300 * @mad_send_wc: Send work completion information on the sent MAD. 301 */ 302 typedef void (*ib_mad_send_handler)(struct ib_mad_agent *mad_agent, 303 struct ib_mad_send_wc *mad_send_wc); 304 305 /** 306 * ib_mad_snoop_handler - Callback handler for snooping sent MADs. 307 * @mad_agent: MAD agent that snooped the MAD. 308 * @send_wr: Work request information on the sent MAD. 309 * @mad_send_wc: Work completion information on the sent MAD. Valid 310 * only for snooping that occurs on a send completion. 311 * 312 * Clients snooping MADs should not modify data referenced by the @send_wr 313 * or @mad_send_wc. 314 */ 315 typedef void (*ib_mad_snoop_handler)(struct ib_mad_agent *mad_agent, 316 struct ib_mad_send_buf *send_buf, 317 struct ib_mad_send_wc *mad_send_wc); 318 319 /** 320 * ib_mad_recv_handler - callback handler for a received MAD. 321 * @mad_agent: MAD agent requesting the received MAD. 322 * @mad_recv_wc: Received work completion information on the received MAD. 323 * 324 * MADs received in response to a send request operation will be handed to 325 * the user before the send operation completes. All data buffers given 326 * to registered agents through this routine are owned by the receiving 327 * client, except for snooping agents. Clients snooping MADs should not 328 * modify the data referenced by @mad_recv_wc. 329 */ 330 typedef void (*ib_mad_recv_handler)(struct ib_mad_agent *mad_agent, 331 struct ib_mad_recv_wc *mad_recv_wc); 332 333 /** 334 * ib_mad_agent - Used to track MAD registration with the access layer. 335 * @device: Reference to device registration is on. 336 * @qp: Reference to QP used for sending and receiving MADs. 337 * @mr: Memory region for system memory usable for DMA. 338 * @recv_handler: Callback handler for a received MAD. 339 * @send_handler: Callback handler for a sent MAD. 340 * @snoop_handler: Callback handler for snooped sent MADs. 341 * @context: User-specified context associated with this registration. 342 * @hi_tid: Access layer assigned transaction ID for this client. 343 * Unsolicited MADs sent by this client will have the upper 32-bits 344 * of their TID set to this value. 345 * @port_num: Port number on which QP is registered 346 * @rmpp_version: If set, indicates the RMPP version used by this agent. 347 */ 348 struct ib_mad_agent { 349 struct ib_device *device; 350 struct ib_qp *qp; 351 struct ib_mr *mr; 352 ib_mad_recv_handler recv_handler; 353 ib_mad_send_handler send_handler; 354 ib_mad_snoop_handler snoop_handler; 355 void *context; 356 u32 hi_tid; 357 u8 port_num; 358 u8 rmpp_version; 359 }; 360 361 /** 362 * ib_mad_send_wc - MAD send completion information. 363 * @send_buf: Send MAD data buffer associated with the send MAD request. 364 * @status: Completion status. 365 * @vendor_err: Optional vendor error information returned with a failed 366 * request. 367 */ 368 struct ib_mad_send_wc { 369 struct ib_mad_send_buf *send_buf; 370 enum ib_wc_status status; 371 u32 vendor_err; 372 }; 373 374 /** 375 * ib_mad_recv_buf - received MAD buffer information. 376 * @list: Reference to next data buffer for a received RMPP MAD. 377 * @grh: References a data buffer containing the global route header. 378 * The data refereced by this buffer is only valid if the GRH is 379 * valid. 380 * @mad: References the start of the received MAD. 381 */ 382 struct ib_mad_recv_buf { 383 struct list_head list; 384 struct ib_grh *grh; 385 struct ib_mad *mad; 386 }; 387 388 /** 389 * ib_mad_recv_wc - received MAD information. 390 * @wc: Completion information for the received data. 391 * @recv_buf: Specifies the location of the received data buffer(s). 392 * @rmpp_list: Specifies a list of RMPP reassembled received MAD buffers. 393 * @mad_len: The length of the received MAD, without duplicated headers. 394 * 395 * For received response, the wr_id contains a pointer to the ib_mad_send_buf 396 * for the corresponding send request. 397 */ 398 struct ib_mad_recv_wc { 399 struct ib_wc *wc; 400 struct ib_mad_recv_buf recv_buf; 401 struct list_head rmpp_list; 402 int mad_len; 403 }; 404 405 /** 406 * ib_mad_reg_req - MAD registration request 407 * @mgmt_class: Indicates which management class of MADs should be receive 408 * by the caller. This field is only required if the user wishes to 409 * receive unsolicited MADs, otherwise it should be 0. 410 * @mgmt_class_version: Indicates which version of MADs for the given 411 * management class to receive. 412 * @oui: Indicates IEEE OUI when mgmt_class is a vendor class 413 * in the range from 0x30 to 0x4f. Otherwise not used. 414 * @method_mask: The caller will receive unsolicited MADs for any method 415 * where @method_mask = 1. 416 */ 417 struct ib_mad_reg_req { 418 u8 mgmt_class; 419 u8 mgmt_class_version; 420 u8 oui[3]; 421 DECLARE_BITMAP(method_mask, IB_MGMT_MAX_METHODS); 422 }; 423 424 /** 425 * ib_register_mad_agent - Register to send/receive MADs. 426 * @device: The device to register with. 427 * @port_num: The port on the specified device to use. 428 * @qp_type: Specifies which QP to access. Must be either 429 * IB_QPT_SMI or IB_QPT_GSI. 430 * @mad_reg_req: Specifies which unsolicited MADs should be received 431 * by the caller. This parameter may be NULL if the caller only 432 * wishes to receive solicited responses. 433 * @rmpp_version: If set, indicates that the client will send 434 * and receive MADs that contain the RMPP header for the given version. 435 * If set to 0, indicates that RMPP is not used by this client. 436 * @send_handler: The completion callback routine invoked after a send 437 * request has completed. 438 * @recv_handler: The completion callback routine invoked for a received 439 * MAD. 440 * @context: User specified context associated with the registration. 441 */ 442 struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device, 443 u8 port_num, 444 enum ib_qp_type qp_type, 445 struct ib_mad_reg_req *mad_reg_req, 446 u8 rmpp_version, 447 ib_mad_send_handler send_handler, 448 ib_mad_recv_handler recv_handler, 449 void *context); 450 451 enum ib_mad_snoop_flags { 452 /*IB_MAD_SNOOP_POSTED_SENDS = 1,*/ 453 /*IB_MAD_SNOOP_RMPP_SENDS = (1<<1),*/ 454 IB_MAD_SNOOP_SEND_COMPLETIONS = (1<<2), 455 /*IB_MAD_SNOOP_RMPP_SEND_COMPLETIONS = (1<<3),*/ 456 IB_MAD_SNOOP_RECVS = (1<<4) 457 /*IB_MAD_SNOOP_RMPP_RECVS = (1<<5),*/ 458 /*IB_MAD_SNOOP_REDIRECTED_QPS = (1<<6)*/ 459 }; 460 461 /** 462 * ib_register_mad_snoop - Register to snoop sent and received MADs. 463 * @device: The device to register with. 464 * @port_num: The port on the specified device to use. 465 * @qp_type: Specifies which QP traffic to snoop. Must be either 466 * IB_QPT_SMI or IB_QPT_GSI. 467 * @mad_snoop_flags: Specifies information where snooping occurs. 468 * @send_handler: The callback routine invoked for a snooped send. 469 * @recv_handler: The callback routine invoked for a snooped receive. 470 * @context: User specified context associated with the registration. 471 */ 472 struct ib_mad_agent *ib_register_mad_snoop(struct ib_device *device, 473 u8 port_num, 474 enum ib_qp_type qp_type, 475 int mad_snoop_flags, 476 ib_mad_snoop_handler snoop_handler, 477 ib_mad_recv_handler recv_handler, 478 void *context); 479 480 /** 481 * ib_unregister_mad_agent - Unregisters a client from using MAD services. 482 * @mad_agent: Corresponding MAD registration request to deregister. 483 * 484 * After invoking this routine, MAD services are no longer usable by the 485 * client on the associated QP. 486 */ 487 int ib_unregister_mad_agent(struct ib_mad_agent *mad_agent); 488 489 /** 490 * ib_post_send_mad - Posts MAD(s) to the send queue of the QP associated 491 * with the registered client. 492 * @send_buf: Specifies the information needed to send the MAD(s). 493 * @bad_send_buf: Specifies the MAD on which an error was encountered. This 494 * parameter is optional if only a single MAD is posted. 495 * 496 * Sent MADs are not guaranteed to complete in the order that they were posted. 497 * 498 * If the MAD requires RMPP, the data buffer should contain a single copy 499 * of the common MAD, RMPP, and class specific headers, followed by the class 500 * defined data. If the class defined data would not divide evenly into 501 * RMPP segments, then space must be allocated at the end of the referenced 502 * buffer for any required padding. To indicate the amount of class defined 503 * data being transferred, the paylen_newwin field in the RMPP header should 504 * be set to the size of the class specific header plus the amount of class 505 * defined data being transferred. The paylen_newwin field should be 506 * specified in network-byte order. 507 */ 508 int ib_post_send_mad(struct ib_mad_send_buf *send_buf, 509 struct ib_mad_send_buf **bad_send_buf); 510 511 512 /** 513 * ib_free_recv_mad - Returns data buffers used to receive a MAD. 514 * @mad_recv_wc: Work completion information for a received MAD. 515 * 516 * Clients receiving MADs through their ib_mad_recv_handler must call this 517 * routine to return the work completion buffers to the access layer. 518 */ 519 void ib_free_recv_mad(struct ib_mad_recv_wc *mad_recv_wc); 520 521 /** 522 * ib_cancel_mad - Cancels an outstanding send MAD operation. 523 * @mad_agent: Specifies the registration associated with sent MAD. 524 * @send_buf: Indicates the MAD to cancel. 525 * 526 * MADs will be returned to the user through the corresponding 527 * ib_mad_send_handler. 528 */ 529 void ib_cancel_mad(struct ib_mad_agent *mad_agent, 530 struct ib_mad_send_buf *send_buf); 531 532 /** 533 * ib_modify_mad - Modifies an outstanding send MAD operation. 534 * @mad_agent: Specifies the registration associated with sent MAD. 535 * @send_buf: Indicates the MAD to modify. 536 * @timeout_ms: New timeout value for sent MAD. 537 * 538 * This call will reset the timeout value for a sent MAD to the specified 539 * value. 540 */ 541 int ib_modify_mad(struct ib_mad_agent *mad_agent, 542 struct ib_mad_send_buf *send_buf, u32 timeout_ms); 543 544 /** 545 * ib_redirect_mad_qp - Registers a QP for MAD services. 546 * @qp: Reference to a QP that requires MAD services. 547 * @rmpp_version: If set, indicates that the client will send 548 * and receive MADs that contain the RMPP header for the given version. 549 * If set to 0, indicates that RMPP is not used by this client. 550 * @send_handler: The completion callback routine invoked after a send 551 * request has completed. 552 * @recv_handler: The completion callback routine invoked for a received 553 * MAD. 554 * @context: User specified context associated with the registration. 555 * 556 * Use of this call allows clients to use MAD services, such as RMPP, 557 * on user-owned QPs. After calling this routine, users may send 558 * MADs on the specified QP by calling ib_mad_post_send. 559 */ 560 struct ib_mad_agent *ib_redirect_mad_qp(struct ib_qp *qp, 561 u8 rmpp_version, 562 ib_mad_send_handler send_handler, 563 ib_mad_recv_handler recv_handler, 564 void *context); 565 566 /** 567 * ib_process_mad_wc - Processes a work completion associated with a 568 * MAD sent or received on a redirected QP. 569 * @mad_agent: Specifies the registered MAD service using the redirected QP. 570 * @wc: References a work completion associated with a sent or received 571 * MAD segment. 572 * 573 * This routine is used to complete or continue processing on a MAD request. 574 * If the work completion is associated with a send operation, calling 575 * this routine is required to continue an RMPP transfer or to wait for a 576 * corresponding response, if it is a request. If the work completion is 577 * associated with a receive operation, calling this routine is required to 578 * process an inbound or outbound RMPP transfer, or to match a response MAD 579 * with its corresponding request. 580 */ 581 int ib_process_mad_wc(struct ib_mad_agent *mad_agent, 582 struct ib_wc *wc); 583 584 /** 585 * ib_create_send_mad - Allocate and initialize a data buffer and work request 586 * for sending a MAD. 587 * @mad_agent: Specifies the registered MAD service to associate with the MAD. 588 * @remote_qpn: Specifies the QPN of the receiving node. 589 * @pkey_index: Specifies which PKey the MAD will be sent using. This field 590 * is valid only if the remote_qpn is QP 1. 591 * @rmpp_active: Indicates if the send will enable RMPP. 592 * @hdr_len: Indicates the size of the data header of the MAD. This length 593 * should include the common MAD header, RMPP header, plus any class 594 * specific header. 595 * @data_len: Indicates the size of any user-transferred data. The call will 596 * automatically adjust the allocated buffer size to account for any 597 * additional padding that may be necessary. 598 * @gfp_mask: GFP mask used for the memory allocation. 599 * 600 * This routine allocates a MAD for sending. The returned MAD send buffer 601 * will reference a data buffer usable for sending a MAD, along 602 * with an initialized work request structure. Users may modify the returned 603 * MAD data buffer before posting the send. 604 * 605 * The returned MAD header, class specific headers, and any padding will be 606 * cleared. Users are responsible for initializing the common MAD header, 607 * any class specific header, and MAD data area. 608 * If @rmpp_active is set, the RMPP header will be initialized for sending. 609 */ 610 struct ib_mad_send_buf * ib_create_send_mad(struct ib_mad_agent *mad_agent, 611 u32 remote_qpn, u16 pkey_index, 612 int rmpp_active, 613 int hdr_len, int data_len, 614 gfp_t gfp_mask); 615 616 /** 617 * ib_is_mad_class_rmpp - returns whether given management class 618 * supports RMPP. 619 * @mgmt_class: management class 620 * 621 * This routine returns whether the management class supports RMPP. 622 */ 623 int ib_is_mad_class_rmpp(u8 mgmt_class); 624 625 /** 626 * ib_get_mad_data_offset - returns the data offset for a given 627 * management class. 628 * @mgmt_class: management class 629 * 630 * This routine returns the data offset in the MAD for the management 631 * class requested. 632 */ 633 int ib_get_mad_data_offset(u8 mgmt_class); 634 635 /** 636 * ib_get_rmpp_segment - returns the data buffer for a given RMPP segment. 637 * @send_buf: Previously allocated send data buffer. 638 * @seg_num: number of segment to return 639 * 640 * This routine returns a pointer to the data buffer of an RMPP MAD. 641 * Users must provide synchronization to @send_buf around this call. 642 */ 643 void *ib_get_rmpp_segment(struct ib_mad_send_buf *send_buf, int seg_num); 644 645 /** 646 * ib_free_send_mad - Returns data buffers used to send a MAD. 647 * @send_buf: Previously allocated send data buffer. 648 */ 649 void ib_free_send_mad(struct ib_mad_send_buf *send_buf); 650 651 #endif /* IB_MAD_H */ 652