1/* 2 * Copyright (c) 2005 Ammasso, Inc. All rights reserved. 3 * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved. 4 * 5 * This software is available to you under a choice of one of two 6 * licenses. You may choose to be licensed under the terms of the GNU 7 * General Public License (GPL) Version 2, available from the file 8 * COPYING in the main directory of this source tree, or the 9 * OpenIB.org BSD license below: 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions are met: 14 * 15 * - Redistributions of source code must retain the above 16 * copyright notice, this list of conditions and the following 17 * disclaimer. 18 * 19 * - Redistributions in binary form must reproduce the above 20 * copyright notice, this list of conditions and the following 21 * disclaimer in the documentation and/or other materials 22 * provided with the distribution. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 28 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 29 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 30 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 31 * SOFTWARE. 32 */ 33#ifndef _C2_WR_H_ 34#define _C2_WR_H_ 35 36#ifdef CCDEBUG 37#define CCWR_MAGIC 0xb07700b0 38#endif 39 40#define C2_QP_NO_ATTR_CHANGE 0xFFFFFFFF 41 42/* Maximum allowed size in bytes of private_data exchange 43 * on connect. 44 */ 45#define C2_MAX_PRIVATE_DATA_SIZE 200 46 47/* 48 * These types are shared among the adapter, host, and CCIL consumer. 49 */ 50enum c2_cq_notification_type { 51 C2_CQ_NOTIFICATION_TYPE_NONE = 1, 52 C2_CQ_NOTIFICATION_TYPE_NEXT, 53 C2_CQ_NOTIFICATION_TYPE_NEXT_SE 54}; 55 56enum c2_setconfig_cmd { 57 C2_CFG_ADD_ADDR = 1, 58 C2_CFG_DEL_ADDR = 2, 59 C2_CFG_ADD_ROUTE = 3, 60 C2_CFG_DEL_ROUTE = 4 61}; 62 63enum c2_getconfig_cmd { 64 C2_GETCONFIG_ROUTES = 1, 65 C2_GETCONFIG_ADDRS 66}; 67 68/* 69 * CCIL Work Request Identifiers 70 */ 71enum c2wr_ids { 72 CCWR_RNIC_OPEN = 1, 73 CCWR_RNIC_QUERY, 74 CCWR_RNIC_SETCONFIG, 75 CCWR_RNIC_GETCONFIG, 76 CCWR_RNIC_CLOSE, 77 CCWR_CQ_CREATE, 78 CCWR_CQ_QUERY, 79 CCWR_CQ_MODIFY, 80 CCWR_CQ_DESTROY, 81 CCWR_QP_CONNECT, 82 CCWR_PD_ALLOC, 83 CCWR_PD_DEALLOC, 84 CCWR_SRQ_CREATE, 85 CCWR_SRQ_QUERY, 86 CCWR_SRQ_MODIFY, 87 CCWR_SRQ_DESTROY, 88 CCWR_QP_CREATE, 89 CCWR_QP_QUERY, 90 CCWR_QP_MODIFY, 91 CCWR_QP_DESTROY, 92 CCWR_NSMR_STAG_ALLOC, 93 CCWR_NSMR_REGISTER, 94 CCWR_NSMR_PBL, 95 CCWR_STAG_DEALLOC, 96 CCWR_NSMR_REREGISTER, 97 CCWR_SMR_REGISTER, 98 CCWR_MR_QUERY, 99 CCWR_MW_ALLOC, 100 CCWR_MW_QUERY, 101 CCWR_EP_CREATE, 102 CCWR_EP_GETOPT, 103 CCWR_EP_SETOPT, 104 CCWR_EP_DESTROY, 105 CCWR_EP_BIND, 106 CCWR_EP_CONNECT, 107 CCWR_EP_LISTEN, 108 CCWR_EP_SHUTDOWN, 109 CCWR_EP_LISTEN_CREATE, 110 CCWR_EP_LISTEN_DESTROY, 111 CCWR_EP_QUERY, 112 CCWR_CR_ACCEPT, 113 CCWR_CR_REJECT, 114 CCWR_CONSOLE, 115 CCWR_TERM, 116 CCWR_FLASH_INIT, 117 CCWR_FLASH, 118 CCWR_BUF_ALLOC, 119 CCWR_BUF_FREE, 120 CCWR_FLASH_WRITE, 121 CCWR_INIT, /* WARNING: Don't move this ever again! */ 122 123 124 125 /* Add new IDs here */ 126 127 128 129 /* 130 * WARNING: CCWR_LAST must always be the last verbs id defined! 131 * All the preceding IDs are fixed, and must not change. 132 * You can add new IDs, but must not remove or reorder 133 * any IDs. If you do, YOU will ruin any hope of 134 * compatability between versions. 135 */ 136 CCWR_LAST, 137 138 /* 139 * Start over at 1 so that arrays indexed by user wr id's 140 * begin at 1. This is OK since the verbs and user wr id's 141 * are always used on disjoint sets of queues. 142 */ 143 /* 144 * The order of the CCWR_SEND_XX verbs must 145 * match the order of the RDMA_OPs 146 */ 147 CCWR_SEND = 1, 148 CCWR_SEND_INV, 149 CCWR_SEND_SE, 150 CCWR_SEND_SE_INV, 151 CCWR_RDMA_WRITE, 152 CCWR_RDMA_READ, 153 CCWR_RDMA_READ_INV, 154 CCWR_MW_BIND, 155 CCWR_NSMR_FASTREG, 156 CCWR_STAG_INVALIDATE, 157 CCWR_RECV, 158 CCWR_NOP, 159 CCWR_UNIMPL, 160/* WARNING: This must always be the last user wr id defined! */ 161}; 162#define RDMA_SEND_OPCODE_FROM_WR_ID(x) (x+2) 163 164/* 165 * SQ/RQ Work Request Types 166 */ 167enum c2_wr_type { 168 C2_WR_TYPE_SEND = CCWR_SEND, 169 C2_WR_TYPE_SEND_SE = CCWR_SEND_SE, 170 C2_WR_TYPE_SEND_INV = CCWR_SEND_INV, 171 C2_WR_TYPE_SEND_SE_INV = CCWR_SEND_SE_INV, 172 C2_WR_TYPE_RDMA_WRITE = CCWR_RDMA_WRITE, 173 C2_WR_TYPE_RDMA_READ = CCWR_RDMA_READ, 174 C2_WR_TYPE_RDMA_READ_INV_STAG = CCWR_RDMA_READ_INV, 175 C2_WR_TYPE_BIND_MW = CCWR_MW_BIND, 176 C2_WR_TYPE_FASTREG_NSMR = CCWR_NSMR_FASTREG, 177 C2_WR_TYPE_INV_STAG = CCWR_STAG_INVALIDATE, 178 C2_WR_TYPE_RECV = CCWR_RECV, 179 C2_WR_TYPE_NOP = CCWR_NOP, 180}; 181 182struct c2_netaddr { 183 __be32 ip_addr; 184 __be32 netmask; 185 u32 mtu; 186}; 187 188struct c2_route { 189 u32 ip_addr; /* 0 indicates the default route */ 190 u32 netmask; /* netmask associated with dst */ 191 u32 flags; 192 union { 193 u32 ipaddr; /* address of the nexthop interface */ 194 u8 enaddr[6]; 195 } nexthop; 196}; 197 198/* 199 * A Scatter Gather Entry. 200 */ 201struct c2_data_addr { 202 __be32 stag; 203 __be32 length; 204 __be64 to; 205}; 206 207/* 208 * MR and MW flags used by the consumer, RI, and RNIC. 209 */ 210enum c2_mm_flags { 211 MEM_REMOTE = 0x0001, /* allow mw binds with remote access. */ 212 MEM_VA_BASED = 0x0002, /* Not Zero-based */ 213 MEM_PBL_COMPLETE = 0x0004, /* PBL array is complete in this msg */ 214 MEM_LOCAL_READ = 0x0008, /* allow local reads */ 215 MEM_LOCAL_WRITE = 0x0010, /* allow local writes */ 216 MEM_REMOTE_READ = 0x0020, /* allow remote reads */ 217 MEM_REMOTE_WRITE = 0x0040, /* allow remote writes */ 218 MEM_WINDOW_BIND = 0x0080, /* binds allowed */ 219 MEM_SHARED = 0x0100, /* set if MR is shared */ 220 MEM_STAG_VALID = 0x0200 /* set if STAG is in valid state */ 221}; 222 223/* 224 * CCIL API ACF flags defined in terms of the low level mem flags. 225 * This minimizes translation needed in the user API 226 */ 227enum c2_acf { 228 C2_ACF_LOCAL_READ = MEM_LOCAL_READ, 229 C2_ACF_LOCAL_WRITE = MEM_LOCAL_WRITE, 230 C2_ACF_REMOTE_READ = MEM_REMOTE_READ, 231 C2_ACF_REMOTE_WRITE = MEM_REMOTE_WRITE, 232 C2_ACF_WINDOW_BIND = MEM_WINDOW_BIND 233}; 234 235/* 236 * Image types of objects written to flash 237 */ 238#define C2_FLASH_IMG_BITFILE 1 239#define C2_FLASH_IMG_OPTION_ROM 2 240#define C2_FLASH_IMG_VPD 3 241 242/* 243 * to fix bug 1815 we define the max size allowable of the 244 * terminate message (per the IETF spec).Refer to the IETF 245 * protocal specification, section 12.1.6, page 64) 246 * The message is prefixed by 20 types of DDP info. 247 * 248 * Then the message has 6 bytes for the terminate control 249 * and DDP segment length info plus a DDP header (either 250 * 14 or 18 byts) plus 28 bytes for the RDMA header. 251 * Thus the max size in: 252 * 20 + (6 + 18 + 28) = 72 253 */ 254#define C2_MAX_TERMINATE_MESSAGE_SIZE (72) 255 256/* 257 * Build String Length. It must be the same as C2_BUILD_STR_LEN in ccil_api.h 258 */ 259#define WR_BUILD_STR_LEN 64 260 261/* 262 * WARNING: All of these structs need to align any 64bit types on 263 * 64 bit boundaries! 64bit types include u64 and u64. 264 */ 265 266/* 267 * Clustercore Work Request Header. Be sensitive to field layout 268 * and alignment. 269 */ 270struct c2wr_hdr { 271 /* wqe_count is part of the cqe. It is put here so the 272 * adapter can write to it while the wr is pending without 273 * clobbering part of the wr. This word need not be dma'd 274 * from the host to adapter by libccil, but we copy it anyway 275 * to make the memcpy to the adapter better aligned. 276 */ 277 __be32 wqe_count; 278 279 /* Put these fields next so that later 32- and 64-bit 280 * quantities are naturally aligned. 281 */ 282 u8 id; 283 u8 result; /* adapter -> host */ 284 u8 sge_count; /* host -> adapter */ 285 u8 flags; /* host -> adapter */ 286 287 u64 context; 288#ifdef CCMSGMAGIC 289 u32 magic; 290 u32 pad; 291#endif 292} __attribute__((packed)); 293 294/* 295 *------------------------ RNIC ------------------------ 296 */ 297 298/* 299 * WR_RNIC_OPEN 300 */ 301 302/* 303 * Flags for the RNIC WRs 304 */ 305enum c2_rnic_flags { 306 RNIC_IRD_STATIC = 0x0001, 307 RNIC_ORD_STATIC = 0x0002, 308 RNIC_QP_STATIC = 0x0004, 309 RNIC_SRQ_SUPPORTED = 0x0008, 310 RNIC_PBL_BLOCK_MODE = 0x0010, 311 RNIC_SRQ_MODEL_ARRIVAL = 0x0020, 312 RNIC_CQ_OVF_DETECTED = 0x0040, 313 RNIC_PRIV_MODE = 0x0080 314}; 315 316struct c2wr_rnic_open_req { 317 struct c2wr_hdr hdr; 318 u64 user_context; 319 __be16 flags; /* See enum c2_rnic_flags */ 320 __be16 port_num; 321} __attribute__((packed)); 322 323struct c2wr_rnic_open_rep { 324 struct c2wr_hdr hdr; 325 u32 rnic_handle; 326} __attribute__((packed)); 327 328union c2wr_rnic_open { 329 struct c2wr_rnic_open_req req; 330 struct c2wr_rnic_open_rep rep; 331} __attribute__((packed)); 332 333struct c2wr_rnic_query_req { 334 struct c2wr_hdr hdr; 335 u32 rnic_handle; 336} __attribute__((packed)); 337 338/* 339 * WR_RNIC_QUERY 340 */ 341struct c2wr_rnic_query_rep { 342 struct c2wr_hdr hdr; 343 u64 user_context; 344 __be32 vendor_id; 345 __be32 part_number; 346 __be32 hw_version; 347 __be32 fw_ver_major; 348 __be32 fw_ver_minor; 349 __be32 fw_ver_patch; 350 char fw_ver_build_str[WR_BUILD_STR_LEN]; 351 __be32 max_qps; 352 __be32 max_qp_depth; 353 u32 max_srq_depth; 354 u32 max_send_sgl_depth; 355 u32 max_rdma_sgl_depth; 356 __be32 max_cqs; 357 __be32 max_cq_depth; 358 u32 max_cq_event_handlers; 359 __be32 max_mrs; 360 u32 max_pbl_depth; 361 __be32 max_pds; 362 __be32 max_global_ird; 363 u32 max_global_ord; 364 __be32 max_qp_ird; 365 __be32 max_qp_ord; 366 u32 flags; 367 __be32 max_mws; 368 u32 pbe_range_low; 369 u32 pbe_range_high; 370 u32 max_srqs; 371 u32 page_size; 372} __attribute__((packed)); 373 374union c2wr_rnic_query { 375 struct c2wr_rnic_query_req req; 376 struct c2wr_rnic_query_rep rep; 377} __attribute__((packed)); 378 379/* 380 * WR_RNIC_GETCONFIG 381 */ 382 383struct c2wr_rnic_getconfig_req { 384 struct c2wr_hdr hdr; 385 u32 rnic_handle; 386 u32 option; /* see c2_getconfig_cmd_t */ 387 u64 reply_buf; 388 u32 reply_buf_len; 389} __attribute__((packed)) ; 390 391struct c2wr_rnic_getconfig_rep { 392 struct c2wr_hdr hdr; 393 u32 option; /* see c2_getconfig_cmd_t */ 394 u32 count_len; /* length of the number of addresses configured */ 395} __attribute__((packed)) ; 396 397union c2wr_rnic_getconfig { 398 struct c2wr_rnic_getconfig_req req; 399 struct c2wr_rnic_getconfig_rep rep; 400} __attribute__((packed)) ; 401 402/* 403 * WR_RNIC_SETCONFIG 404 */ 405struct c2wr_rnic_setconfig_req { 406 struct c2wr_hdr hdr; 407 u32 rnic_handle; 408 __be32 option; /* See c2_setconfig_cmd_t */ 409 /* variable data and pad. See c2_netaddr and c2_route */ 410 u8 data[0]; 411} __attribute__((packed)) ; 412 413struct c2wr_rnic_setconfig_rep { 414 struct c2wr_hdr hdr; 415} __attribute__((packed)) ; 416 417union c2wr_rnic_setconfig { 418 struct c2wr_rnic_setconfig_req req; 419 struct c2wr_rnic_setconfig_rep rep; 420} __attribute__((packed)) ; 421 422/* 423 * WR_RNIC_CLOSE 424 */ 425struct c2wr_rnic_close_req { 426 struct c2wr_hdr hdr; 427 u32 rnic_handle; 428} __attribute__((packed)) ; 429 430struct c2wr_rnic_close_rep { 431 struct c2wr_hdr hdr; 432} __attribute__((packed)) ; 433 434union c2wr_rnic_close { 435 struct c2wr_rnic_close_req req; 436 struct c2wr_rnic_close_rep rep; 437} __attribute__((packed)) ; 438 439/* 440 *------------------------ CQ ------------------------ 441 */ 442struct c2wr_cq_create_req { 443 struct c2wr_hdr hdr; 444 __be64 shared_ht; 445 u64 user_context; 446 __be64 msg_pool; 447 u32 rnic_handle; 448 __be32 msg_size; 449 __be32 depth; 450} __attribute__((packed)) ; 451 452struct c2wr_cq_create_rep { 453 struct c2wr_hdr hdr; 454 __be32 mq_index; 455 __be32 adapter_shared; 456 u32 cq_handle; 457} __attribute__((packed)) ; 458 459union c2wr_cq_create { 460 struct c2wr_cq_create_req req; 461 struct c2wr_cq_create_rep rep; 462} __attribute__((packed)) ; 463 464struct c2wr_cq_modify_req { 465 struct c2wr_hdr hdr; 466 u32 rnic_handle; 467 u32 cq_handle; 468 u32 new_depth; 469 u64 new_msg_pool; 470} __attribute__((packed)) ; 471 472struct c2wr_cq_modify_rep { 473 struct c2wr_hdr hdr; 474} __attribute__((packed)) ; 475 476union c2wr_cq_modify { 477 struct c2wr_cq_modify_req req; 478 struct c2wr_cq_modify_rep rep; 479} __attribute__((packed)) ; 480 481struct c2wr_cq_destroy_req { 482 struct c2wr_hdr hdr; 483 u32 rnic_handle; 484 u32 cq_handle; 485} __attribute__((packed)) ; 486 487struct c2wr_cq_destroy_rep { 488 struct c2wr_hdr hdr; 489} __attribute__((packed)) ; 490 491union c2wr_cq_destroy { 492 struct c2wr_cq_destroy_req req; 493 struct c2wr_cq_destroy_rep rep; 494} __attribute__((packed)) ; 495 496/* 497 *------------------------ PD ------------------------ 498 */ 499struct c2wr_pd_alloc_req { 500 struct c2wr_hdr hdr; 501 u32 rnic_handle; 502 u32 pd_id; 503} __attribute__((packed)) ; 504 505struct c2wr_pd_alloc_rep { 506 struct c2wr_hdr hdr; 507} __attribute__((packed)) ; 508 509union c2wr_pd_alloc { 510 struct c2wr_pd_alloc_req req; 511 struct c2wr_pd_alloc_rep rep; 512} __attribute__((packed)) ; 513 514struct c2wr_pd_dealloc_req { 515 struct c2wr_hdr hdr; 516 u32 rnic_handle; 517 u32 pd_id; 518} __attribute__((packed)) ; 519 520struct c2wr_pd_dealloc_rep { 521 struct c2wr_hdr hdr; 522} __attribute__((packed)) ; 523 524union c2wr_pd_dealloc { 525 struct c2wr_pd_dealloc_req req; 526 struct c2wr_pd_dealloc_rep rep; 527} __attribute__((packed)) ; 528 529/* 530 *------------------------ SRQ ------------------------ 531 */ 532struct c2wr_srq_create_req { 533 struct c2wr_hdr hdr; 534 u64 shared_ht; 535 u64 user_context; 536 u32 rnic_handle; 537 u32 srq_depth; 538 u32 srq_limit; 539 u32 sgl_depth; 540 u32 pd_id; 541} __attribute__((packed)) ; 542 543struct c2wr_srq_create_rep { 544 struct c2wr_hdr hdr; 545 u32 srq_depth; 546 u32 sgl_depth; 547 u32 msg_size; 548 u32 mq_index; 549 u32 mq_start; 550 u32 srq_handle; 551} __attribute__((packed)) ; 552 553union c2wr_srq_create { 554 struct c2wr_srq_create_req req; 555 struct c2wr_srq_create_rep rep; 556} __attribute__((packed)) ; 557 558struct c2wr_srq_destroy_req { 559 struct c2wr_hdr hdr; 560 u32 rnic_handle; 561 u32 srq_handle; 562} __attribute__((packed)) ; 563 564struct c2wr_srq_destroy_rep { 565 struct c2wr_hdr hdr; 566} __attribute__((packed)) ; 567 568union c2wr_srq_destroy { 569 struct c2wr_srq_destroy_req req; 570 struct c2wr_srq_destroy_rep rep; 571} __attribute__((packed)) ; 572 573/* 574 *------------------------ QP ------------------------ 575 */ 576enum c2wr_qp_flags { 577 QP_RDMA_READ = 0x00000001, /* RDMA read enabled? */ 578 QP_RDMA_WRITE = 0x00000002, /* RDMA write enabled? */ 579 QP_MW_BIND = 0x00000004, /* MWs enabled */ 580 QP_ZERO_STAG = 0x00000008, /* enabled? */ 581 QP_REMOTE_TERMINATION = 0x00000010, /* remote end terminated */ 582 QP_RDMA_READ_RESPONSE = 0x00000020 /* Remote RDMA read */ 583 /* enabled? */ 584}; 585 586struct c2wr_qp_create_req { 587 struct c2wr_hdr hdr; 588 __be64 shared_sq_ht; 589 __be64 shared_rq_ht; 590 u64 user_context; 591 u32 rnic_handle; 592 u32 sq_cq_handle; 593 u32 rq_cq_handle; 594 __be32 sq_depth; 595 __be32 rq_depth; 596 u32 srq_handle; 597 u32 srq_limit; 598 __be32 flags; /* see enum c2wr_qp_flags */ 599 __be32 send_sgl_depth; 600 __be32 recv_sgl_depth; 601 __be32 rdma_write_sgl_depth; 602 __be32 ord; 603 __be32 ird; 604 u32 pd_id; 605} __attribute__((packed)) ; 606 607struct c2wr_qp_create_rep { 608 struct c2wr_hdr hdr; 609 __be32 sq_depth; 610 __be32 rq_depth; 611 u32 send_sgl_depth; 612 u32 recv_sgl_depth; 613 u32 rdma_write_sgl_depth; 614 u32 ord; 615 u32 ird; 616 __be32 sq_msg_size; 617 __be32 sq_mq_index; 618 __be32 sq_mq_start; 619 __be32 rq_msg_size; 620 __be32 rq_mq_index; 621 __be32 rq_mq_start; 622 u32 qp_handle; 623} __attribute__((packed)) ; 624 625union c2wr_qp_create { 626 struct c2wr_qp_create_req req; 627 struct c2wr_qp_create_rep rep; 628} __attribute__((packed)) ; 629 630struct c2wr_qp_query_req { 631 struct c2wr_hdr hdr; 632 u32 rnic_handle; 633 u32 qp_handle; 634} __attribute__((packed)) ; 635 636struct c2wr_qp_query_rep { 637 struct c2wr_hdr hdr; 638 u64 user_context; 639 u32 rnic_handle; 640 u32 sq_depth; 641 u32 rq_depth; 642 u32 send_sgl_depth; 643 u32 rdma_write_sgl_depth; 644 u32 recv_sgl_depth; 645 u32 ord; 646 u32 ird; 647 u16 qp_state; 648 u16 flags; /* see c2wr_qp_flags_t */ 649 u32 qp_id; 650 u32 local_addr; 651 u32 remote_addr; 652 u16 local_port; 653 u16 remote_port; 654 u32 terminate_msg_length; /* 0 if not present */ 655 u8 data[0]; 656 /* Terminate Message in-line here. */ 657} __attribute__((packed)) ; 658 659union c2wr_qp_query { 660 struct c2wr_qp_query_req req; 661 struct c2wr_qp_query_rep rep; 662} __attribute__((packed)) ; 663 664struct c2wr_qp_modify_req { 665 struct c2wr_hdr hdr; 666 u64 stream_msg; 667 u32 stream_msg_length; 668 u32 rnic_handle; 669 u32 qp_handle; 670 __be32 next_qp_state; 671 __be32 ord; 672 __be32 ird; 673 __be32 sq_depth; 674 __be32 rq_depth; 675 u32 llp_ep_handle; 676} __attribute__((packed)) ; 677 678struct c2wr_qp_modify_rep { 679 struct c2wr_hdr hdr; 680 u32 ord; 681 u32 ird; 682 u32 sq_depth; 683 u32 rq_depth; 684 u32 sq_msg_size; 685 u32 sq_mq_index; 686 u32 sq_mq_start; 687 u32 rq_msg_size; 688 u32 rq_mq_index; 689 u32 rq_mq_start; 690} __attribute__((packed)) ; 691 692union c2wr_qp_modify { 693 struct c2wr_qp_modify_req req; 694 struct c2wr_qp_modify_rep rep; 695} __attribute__((packed)) ; 696 697struct c2wr_qp_destroy_req { 698 struct c2wr_hdr hdr; 699 u32 rnic_handle; 700 u32 qp_handle; 701} __attribute__((packed)) ; 702 703struct c2wr_qp_destroy_rep { 704 struct c2wr_hdr hdr; 705} __attribute__((packed)) ; 706 707union c2wr_qp_destroy { 708 struct c2wr_qp_destroy_req req; 709 struct c2wr_qp_destroy_rep rep; 710} __attribute__((packed)) ; 711 712/* 713 * The CCWR_QP_CONNECT msg is posted on the verbs request queue. It can 714 * only be posted when a QP is in IDLE state. After the connect request is 715 * submitted to the LLP, the adapter moves the QP to CONNECT_PENDING state. 716 * No synchronous reply from adapter to this WR. The results of 717 * connection are passed back in an async event CCAE_ACTIVE_CONNECT_RESULTS 718 * See c2wr_ae_active_connect_results_t 719 */ 720struct c2wr_qp_connect_req { 721 struct c2wr_hdr hdr; 722 u32 rnic_handle; 723 u32 qp_handle; 724 __be32 remote_addr; 725 __be16 remote_port; 726 u16 pad; 727 __be32 private_data_length; 728 u8 private_data[0]; /* Private data in-line. */ 729} __attribute__((packed)) ; 730 731struct c2wr_qp_connect { 732 struct c2wr_qp_connect_req req; 733 /* no synchronous reply. */ 734} __attribute__((packed)) ; 735 736 737/* 738 *------------------------ MM ------------------------ 739 */ 740 741struct c2wr_nsmr_stag_alloc_req { 742 struct c2wr_hdr hdr; 743 u32 rnic_handle; 744 u32 pbl_depth; 745 u32 pd_id; 746 u32 flags; 747} __attribute__((packed)) ; 748 749struct c2wr_nsmr_stag_alloc_rep { 750 struct c2wr_hdr hdr; 751 u32 pbl_depth; 752 u32 stag_index; 753} __attribute__((packed)) ; 754 755union c2wr_nsmr_stag_alloc { 756 struct c2wr_nsmr_stag_alloc_req req; 757 struct c2wr_nsmr_stag_alloc_rep rep; 758} __attribute__((packed)) ; 759 760struct c2wr_nsmr_register_req { 761 struct c2wr_hdr hdr; 762 __be64 va; 763 u32 rnic_handle; 764 __be16 flags; 765 u8 stag_key; 766 u8 pad; 767 u32 pd_id; 768 __be32 pbl_depth; 769 __be32 pbe_size; 770 __be32 fbo; 771 __be32 length; 772 __be32 addrs_length; 773 /* array of paddrs (must be aligned on a 64bit boundary) */ 774 __be64 paddrs[0]; 775} __attribute__((packed)) ; 776 777struct c2wr_nsmr_register_rep { 778 struct c2wr_hdr hdr; 779 u32 pbl_depth; 780 __be32 stag_index; 781} __attribute__((packed)) ; 782 783union c2wr_nsmr_register { 784 struct c2wr_nsmr_register_req req; 785 struct c2wr_nsmr_register_rep rep; 786} __attribute__((packed)) ; 787 788struct c2wr_nsmr_pbl_req { 789 struct c2wr_hdr hdr; 790 u32 rnic_handle; 791 __be32 flags; 792 __be32 stag_index; 793 __be32 addrs_length; 794 /* array of paddrs (must be aligned on a 64bit boundary) */ 795 __be64 paddrs[0]; 796} __attribute__((packed)) ; 797 798struct c2wr_nsmr_pbl_rep { 799 struct c2wr_hdr hdr; 800} __attribute__((packed)) ; 801 802union c2wr_nsmr_pbl { 803 struct c2wr_nsmr_pbl_req req; 804 struct c2wr_nsmr_pbl_rep rep; 805} __attribute__((packed)) ; 806 807struct c2wr_mr_query_req { 808 struct c2wr_hdr hdr; 809 u32 rnic_handle; 810 u32 stag_index; 811} __attribute__((packed)) ; 812 813struct c2wr_mr_query_rep { 814 struct c2wr_hdr hdr; 815 u8 stag_key; 816 u8 pad[3]; 817 u32 pd_id; 818 u32 flags; 819 u32 pbl_depth; 820} __attribute__((packed)) ; 821 822union c2wr_mr_query { 823 struct c2wr_mr_query_req req; 824 struct c2wr_mr_query_rep rep; 825} __attribute__((packed)) ; 826 827struct c2wr_mw_query_req { 828 struct c2wr_hdr hdr; 829 u32 rnic_handle; 830 u32 stag_index; 831} __attribute__((packed)) ; 832 833struct c2wr_mw_query_rep { 834 struct c2wr_hdr hdr; 835 u8 stag_key; 836 u8 pad[3]; 837 u32 pd_id; 838 u32 flags; 839} __attribute__((packed)) ; 840 841union c2wr_mw_query { 842 struct c2wr_mw_query_req req; 843 struct c2wr_mw_query_rep rep; 844} __attribute__((packed)) ; 845 846 847struct c2wr_stag_dealloc_req { 848 struct c2wr_hdr hdr; 849 u32 rnic_handle; 850 __be32 stag_index; 851} __attribute__((packed)) ; 852 853struct c2wr_stag_dealloc_rep { 854 struct c2wr_hdr hdr; 855} __attribute__((packed)) ; 856 857union c2wr_stag_dealloc { 858 struct c2wr_stag_dealloc_req req; 859 struct c2wr_stag_dealloc_rep rep; 860} __attribute__((packed)) ; 861 862struct c2wr_nsmr_reregister_req { 863 struct c2wr_hdr hdr; 864 u64 va; 865 u32 rnic_handle; 866 u16 flags; 867 u8 stag_key; 868 u8 pad; 869 u32 stag_index; 870 u32 pd_id; 871 u32 pbl_depth; 872 u32 pbe_size; 873 u32 fbo; 874 u32 length; 875 u32 addrs_length; 876 u32 pad1; 877 /* array of paddrs (must be aligned on a 64bit boundary) */ 878 u64 paddrs[0]; 879} __attribute__((packed)) ; 880 881struct c2wr_nsmr_reregister_rep { 882 struct c2wr_hdr hdr; 883 u32 pbl_depth; 884 u32 stag_index; 885} __attribute__((packed)) ; 886 887union c2wr_nsmr_reregister { 888 struct c2wr_nsmr_reregister_req req; 889 struct c2wr_nsmr_reregister_rep rep; 890} __attribute__((packed)) ; 891 892struct c2wr_smr_register_req { 893 struct c2wr_hdr hdr; 894 u64 va; 895 u32 rnic_handle; 896 u16 flags; 897 u8 stag_key; 898 u8 pad; 899 u32 stag_index; 900 u32 pd_id; 901} __attribute__((packed)) ; 902 903struct c2wr_smr_register_rep { 904 struct c2wr_hdr hdr; 905 u32 stag_index; 906} __attribute__((packed)) ; 907 908union c2wr_smr_register { 909 struct c2wr_smr_register_req req; 910 struct c2wr_smr_register_rep rep; 911} __attribute__((packed)) ; 912 913struct c2wr_mw_alloc_req { 914 struct c2wr_hdr hdr; 915 u32 rnic_handle; 916 u32 pd_id; 917} __attribute__((packed)) ; 918 919struct c2wr_mw_alloc_rep { 920 struct c2wr_hdr hdr; 921 u32 stag_index; 922} __attribute__((packed)) ; 923 924union c2wr_mw_alloc { 925 struct c2wr_mw_alloc_req req; 926 struct c2wr_mw_alloc_rep rep; 927} __attribute__((packed)) ; 928 929/* 930 *------------------------ WRs ----------------------- 931 */ 932 933struct c2wr_user_hdr { 934 struct c2wr_hdr hdr; /* Has status and WR Type */ 935} __attribute__((packed)) ; 936 937enum c2_qp_state { 938 C2_QP_STATE_IDLE = 0x01, 939 C2_QP_STATE_CONNECTING = 0x02, 940 C2_QP_STATE_RTS = 0x04, 941 C2_QP_STATE_CLOSING = 0x08, 942 C2_QP_STATE_TERMINATE = 0x10, 943 C2_QP_STATE_ERROR = 0x20, 944}; 945 946/* Completion queue entry. */ 947struct c2wr_ce { 948 struct c2wr_hdr hdr; /* Has status and WR Type */ 949 u64 qp_user_context; /* c2_user_qp_t * */ 950 u32 qp_state; /* Current QP State */ 951 u32 handle; /* QPID or EP Handle */ 952 __be32 bytes_rcvd; /* valid for RECV WCs */ 953 u32 stag; 954} __attribute__((packed)) ; 955 956 957/* 958 * Flags used for all post-sq WRs. These must fit in the flags 959 * field of the struct c2wr_hdr (eight bits). 960 */ 961enum { 962 SQ_SIGNALED = 0x01, 963 SQ_READ_FENCE = 0x02, 964 SQ_FENCE = 0x04, 965}; 966 967/* 968 * Common fields for all post-sq WRs. Namely the standard header and a 969 * secondary header with fields common to all post-sq WRs. 970 */ 971struct c2_sq_hdr { 972 struct c2wr_user_hdr user_hdr; 973} __attribute__((packed)); 974 975/* 976 * Same as above but for post-rq WRs. 977 */ 978struct c2_rq_hdr { 979 struct c2wr_user_hdr user_hdr; 980} __attribute__((packed)); 981 982/* 983 * use the same struct for all sends. 984 */ 985struct c2wr_send_req { 986 struct c2_sq_hdr sq_hdr; 987 __be32 sge_len; 988 __be32 remote_stag; 989 u8 data[0]; /* SGE array */ 990} __attribute__((packed)); 991 992union c2wr_send { 993 struct c2wr_send_req req; 994 struct c2wr_ce rep; 995} __attribute__((packed)); 996 997struct c2wr_rdma_write_req { 998 struct c2_sq_hdr sq_hdr; 999 __be64 remote_to; 1000 __be32 remote_stag; 1001 __be32 sge_len; 1002 u8 data[0]; /* SGE array */ 1003} __attribute__((packed)); 1004 1005union c2wr_rdma_write { 1006 struct c2wr_rdma_write_req req; 1007 struct c2wr_ce rep; 1008} __attribute__((packed)); 1009 1010struct c2wr_rdma_read_req { 1011 struct c2_sq_hdr sq_hdr; 1012 __be64 local_to; 1013 __be64 remote_to; 1014 __be32 local_stag; 1015 __be32 remote_stag; 1016 __be32 length; 1017} __attribute__((packed)); 1018 1019union c2wr_rdma_read { 1020 struct c2wr_rdma_read_req req; 1021 struct c2wr_ce rep; 1022} __attribute__((packed)); 1023 1024struct c2wr_mw_bind_req { 1025 struct c2_sq_hdr sq_hdr; 1026 u64 va; 1027 u8 stag_key; 1028 u8 pad[3]; 1029 u32 mw_stag_index; 1030 u32 mr_stag_index; 1031 u32 length; 1032 u32 flags; 1033} __attribute__((packed)); 1034 1035union c2wr_mw_bind { 1036 struct c2wr_mw_bind_req req; 1037 struct c2wr_ce rep; 1038} __attribute__((packed)); 1039 1040struct c2wr_nsmr_fastreg_req { 1041 struct c2_sq_hdr sq_hdr; 1042 u64 va; 1043 u8 stag_key; 1044 u8 pad[3]; 1045 u32 stag_index; 1046 u32 pbe_size; 1047 u32 fbo; 1048 u32 length; 1049 u32 addrs_length; 1050 /* array of paddrs (must be aligned on a 64bit boundary) */ 1051 u64 paddrs[0]; 1052} __attribute__((packed)); 1053 1054union c2wr_nsmr_fastreg { 1055 struct c2wr_nsmr_fastreg_req req; 1056 struct c2wr_ce rep; 1057} __attribute__((packed)); 1058 1059struct c2wr_stag_invalidate_req { 1060 struct c2_sq_hdr sq_hdr; 1061 u8 stag_key; 1062 u8 pad[3]; 1063 u32 stag_index; 1064} __attribute__((packed)); 1065 1066union c2wr_stag_invalidate { 1067 struct c2wr_stag_invalidate_req req; 1068 struct c2wr_ce rep; 1069} __attribute__((packed)); 1070 1071union c2wr_sqwr { 1072 struct c2_sq_hdr sq_hdr; 1073 struct c2wr_send_req send; 1074 struct c2wr_send_req send_se; 1075 struct c2wr_send_req send_inv; 1076 struct c2wr_send_req send_se_inv; 1077 struct c2wr_rdma_write_req rdma_write; 1078 struct c2wr_rdma_read_req rdma_read; 1079 struct c2wr_mw_bind_req mw_bind; 1080 struct c2wr_nsmr_fastreg_req nsmr_fastreg; 1081 struct c2wr_stag_invalidate_req stag_inv; 1082} __attribute__((packed)); 1083 1084 1085/* 1086 * RQ WRs 1087 */ 1088struct c2wr_rqwr { 1089 struct c2_rq_hdr rq_hdr; 1090 u8 data[0]; /* array of SGEs */ 1091} __attribute__((packed)); 1092 1093union c2wr_recv { 1094 struct c2wr_rqwr req; 1095 struct c2wr_ce rep; 1096} __attribute__((packed)); 1097 1098/* 1099 * All AEs start with this header. Most AEs only need to convey the 1100 * information in the header. Some, like LLP connection events, need 1101 * more info. The union typdef c2wr_ae_t has all the possible AEs. 1102 * 1103 * hdr.context is the user_context from the rnic_open WR. NULL If this 1104 * is not affiliated with an rnic 1105 * 1106 * hdr.id is the AE identifier (eg; CCAE_REMOTE_SHUTDOWN, 1107 * CCAE_LLP_CLOSE_COMPLETE) 1108 * 1109 * resource_type is one of: C2_RES_IND_QP, C2_RES_IND_CQ, C2_RES_IND_SRQ 1110 * 1111 * user_context is the context passed down when the host created the resource. 1112 */ 1113struct c2wr_ae_hdr { 1114 struct c2wr_hdr hdr; 1115 u64 user_context; /* user context for this res. */ 1116 __be32 resource_type; /* see enum c2_resource_indicator */ 1117 __be32 resource; /* handle for resource */ 1118 __be32 qp_state; /* current QP State */ 1119} __attribute__((packed)); 1120 1121/* 1122 * After submitting the CCAE_ACTIVE_CONNECT_RESULTS message on the AEQ, 1123 * the adapter moves the QP into RTS state 1124 */ 1125struct c2wr_ae_active_connect_results { 1126 struct c2wr_ae_hdr ae_hdr; 1127 __be32 laddr; 1128 __be32 raddr; 1129 __be16 lport; 1130 __be16 rport; 1131 __be32 private_data_length; 1132 u8 private_data[0]; /* data is in-line in the msg. */ 1133} __attribute__((packed)); 1134 1135/* 1136 * When connections are established by the stack (and the private data 1137 * MPA frame is received), the adapter will generate an event to the host. 1138 * The details of the connection, any private data, and the new connection 1139 * request handle is passed up via the CCAE_CONNECTION_REQUEST msg on the 1140 * AE queue: 1141 */ 1142struct c2wr_ae_connection_request { 1143 struct c2wr_ae_hdr ae_hdr; 1144 u32 cr_handle; /* connreq handle (sock ptr) */ 1145 __be32 laddr; 1146 __be32 raddr; 1147 __be16 lport; 1148 __be16 rport; 1149 __be32 private_data_length; 1150 u8 private_data[0]; /* data is in-line in the msg. */ 1151} __attribute__((packed)); 1152 1153union c2wr_ae { 1154 struct c2wr_ae_hdr ae_generic; 1155 struct c2wr_ae_active_connect_results ae_active_connect_results; 1156 struct c2wr_ae_connection_request ae_connection_request; 1157} __attribute__((packed)); 1158 1159struct c2wr_init_req { 1160 struct c2wr_hdr hdr; 1161 __be64 hint_count; 1162 __be64 q0_host_shared; 1163 __be64 q1_host_shared; 1164 __be64 q1_host_msg_pool; 1165 __be64 q2_host_shared; 1166 __be64 q2_host_msg_pool; 1167} __attribute__((packed)); 1168 1169struct c2wr_init_rep { 1170 struct c2wr_hdr hdr; 1171} __attribute__((packed)); 1172 1173union c2wr_init { 1174 struct c2wr_init_req req; 1175 struct c2wr_init_rep rep; 1176} __attribute__((packed)); 1177 1178/* 1179 * For upgrading flash. 1180 */ 1181 1182struct c2wr_flash_init_req { 1183 struct c2wr_hdr hdr; 1184 u32 rnic_handle; 1185} __attribute__((packed)); 1186 1187struct c2wr_flash_init_rep { 1188 struct c2wr_hdr hdr; 1189 u32 adapter_flash_buf_offset; 1190 u32 adapter_flash_len; 1191} __attribute__((packed)); 1192 1193union c2wr_flash_init { 1194 struct c2wr_flash_init_req req; 1195 struct c2wr_flash_init_rep rep; 1196} __attribute__((packed)); 1197 1198struct c2wr_flash_req { 1199 struct c2wr_hdr hdr; 1200 u32 rnic_handle; 1201 u32 len; 1202} __attribute__((packed)); 1203 1204struct c2wr_flash_rep { 1205 struct c2wr_hdr hdr; 1206 u32 status; 1207} __attribute__((packed)); 1208 1209union c2wr_flash { 1210 struct c2wr_flash_req req; 1211 struct c2wr_flash_rep rep; 1212} __attribute__((packed)); 1213 1214struct c2wr_buf_alloc_req { 1215 struct c2wr_hdr hdr; 1216 u32 rnic_handle; 1217 u32 size; 1218} __attribute__((packed)); 1219 1220struct c2wr_buf_alloc_rep { 1221 struct c2wr_hdr hdr; 1222 u32 offset; /* 0 if mem not available */ 1223 u32 size; /* 0 if mem not available */ 1224} __attribute__((packed)); 1225 1226union c2wr_buf_alloc { 1227 struct c2wr_buf_alloc_req req; 1228 struct c2wr_buf_alloc_rep rep; 1229} __attribute__((packed)); 1230 1231struct c2wr_buf_free_req { 1232 struct c2wr_hdr hdr; 1233 u32 rnic_handle; 1234 u32 offset; /* Must match value from alloc */ 1235 u32 size; /* Must match value from alloc */ 1236} __attribute__((packed)); 1237 1238struct c2wr_buf_free_rep { 1239 struct c2wr_hdr hdr; 1240} __attribute__((packed)); 1241 1242union c2wr_buf_free { 1243 struct c2wr_buf_free_req req; 1244 struct c2wr_ce rep; 1245} __attribute__((packed)); 1246 1247struct c2wr_flash_write_req { 1248 struct c2wr_hdr hdr; 1249 u32 rnic_handle; 1250 u32 offset; 1251 u32 size; 1252 u32 type; 1253 u32 flags; 1254} __attribute__((packed)); 1255 1256struct c2wr_flash_write_rep { 1257 struct c2wr_hdr hdr; 1258 u32 status; 1259} __attribute__((packed)); 1260 1261union c2wr_flash_write { 1262 struct c2wr_flash_write_req req; 1263 struct c2wr_flash_write_rep rep; 1264} __attribute__((packed)); 1265 1266/* 1267 * Messages for LLP connection setup. 1268 */ 1269 1270/* 1271 * Listen Request. This allocates a listening endpoint to allow passive 1272 * connection setup. Newly established LLP connections are passed up 1273 * via an AE. See c2wr_ae_connection_request_t 1274 */ 1275struct c2wr_ep_listen_create_req { 1276 struct c2wr_hdr hdr; 1277 u64 user_context; /* returned in AEs. */ 1278 u32 rnic_handle; 1279 __be32 local_addr; /* local addr, or 0 */ 1280 __be16 local_port; /* 0 means "pick one" */ 1281 u16 pad; 1282 __be32 backlog; /* tradional tcp listen bl */ 1283} __attribute__((packed)); 1284 1285struct c2wr_ep_listen_create_rep { 1286 struct c2wr_hdr hdr; 1287 u32 ep_handle; /* handle to new listening ep */ 1288 u16 local_port; /* resulting port... */ 1289 u16 pad; 1290} __attribute__((packed)); 1291 1292union c2wr_ep_listen_create { 1293 struct c2wr_ep_listen_create_req req; 1294 struct c2wr_ep_listen_create_rep rep; 1295} __attribute__((packed)); 1296 1297struct c2wr_ep_listen_destroy_req { 1298 struct c2wr_hdr hdr; 1299 u32 rnic_handle; 1300 u32 ep_handle; 1301} __attribute__((packed)); 1302 1303struct c2wr_ep_listen_destroy_rep { 1304 struct c2wr_hdr hdr; 1305} __attribute__((packed)); 1306 1307union c2wr_ep_listen_destroy { 1308 struct c2wr_ep_listen_destroy_req req; 1309 struct c2wr_ep_listen_destroy_rep rep; 1310} __attribute__((packed)); 1311 1312struct c2wr_ep_query_req { 1313 struct c2wr_hdr hdr; 1314 u32 rnic_handle; 1315 u32 ep_handle; 1316} __attribute__((packed)); 1317 1318struct c2wr_ep_query_rep { 1319 struct c2wr_hdr hdr; 1320 u32 rnic_handle; 1321 u32 local_addr; 1322 u32 remote_addr; 1323 u16 local_port; 1324 u16 remote_port; 1325} __attribute__((packed)); 1326 1327union c2wr_ep_query { 1328 struct c2wr_ep_query_req req; 1329 struct c2wr_ep_query_rep rep; 1330} __attribute__((packed)); 1331 1332 1333/* 1334 * The host passes this down to indicate acceptance of a pending iWARP 1335 * connection. The cr_handle was obtained from the CONNECTION_REQUEST 1336 * AE passed up by the adapter. See c2wr_ae_connection_request_t. 1337 */ 1338struct c2wr_cr_accept_req { 1339 struct c2wr_hdr hdr; 1340 u32 rnic_handle; 1341 u32 qp_handle; /* QP to bind to this LLP conn */ 1342 u32 ep_handle; /* LLP handle to accept */ 1343 __be32 private_data_length; 1344 u8 private_data[0]; /* data in-line in msg. */ 1345} __attribute__((packed)); 1346 1347/* 1348 * adapter sends reply when private data is successfully submitted to 1349 * the LLP. 1350 */ 1351struct c2wr_cr_accept_rep { 1352 struct c2wr_hdr hdr; 1353} __attribute__((packed)); 1354 1355union c2wr_cr_accept { 1356 struct c2wr_cr_accept_req req; 1357 struct c2wr_cr_accept_rep rep; 1358} __attribute__((packed)); 1359 1360/* 1361 * The host sends this down if a given iWARP connection request was 1362 * rejected by the consumer. The cr_handle was obtained from a 1363 * previous c2wr_ae_connection_request_t AE sent by the adapter. 1364 */ 1365struct c2wr_cr_reject_req { 1366 struct c2wr_hdr hdr; 1367 u32 rnic_handle; 1368 u32 ep_handle; /* LLP handle to reject */ 1369} __attribute__((packed)); 1370 1371/* 1372 * Dunno if this is needed, but we'll add it for now. The adapter will 1373 * send the reject_reply after the LLP endpoint has been destroyed. 1374 */ 1375struct c2wr_cr_reject_rep { 1376 struct c2wr_hdr hdr; 1377} __attribute__((packed)); 1378 1379union c2wr_cr_reject { 1380 struct c2wr_cr_reject_req req; 1381 struct c2wr_cr_reject_rep rep; 1382} __attribute__((packed)); 1383 1384/* 1385 * console command. Used to implement a debug console over the verbs 1386 * request and reply queues. 1387 */ 1388 1389/* 1390 * Console request message. It contains: 1391 * - message hdr with id = CCWR_CONSOLE 1392 * - the physaddr/len of host memory to be used for the reply. 1393 * - the command string. eg: "netstat -s" or "zoneinfo" 1394 */ 1395struct c2wr_console_req { 1396 struct c2wr_hdr hdr; /* id = CCWR_CONSOLE */ 1397 u64 reply_buf; /* pinned host buf for reply */ 1398 u32 reply_buf_len; /* length of reply buffer */ 1399 u8 command[0]; /* NUL terminated ascii string */ 1400 /* containing the command req */ 1401} __attribute__((packed)); 1402 1403/* 1404 * flags used in the console reply. 1405 */ 1406enum c2_console_flags { 1407 CONS_REPLY_TRUNCATED = 0x00000001 /* reply was truncated */ 1408} __attribute__((packed)); 1409 1410/* 1411 * Console reply message. 1412 * hdr.result contains the c2_status_t error if the reply was _not_ generated, 1413 * or C2_OK if the reply was generated. 1414 */ 1415struct c2wr_console_rep { 1416 struct c2wr_hdr hdr; /* id = CCWR_CONSOLE */ 1417 u32 flags; 1418} __attribute__((packed)); 1419 1420union c2wr_console { 1421 struct c2wr_console_req req; 1422 struct c2wr_console_rep rep; 1423} __attribute__((packed)); 1424 1425 1426/* 1427 * Giant union with all WRs. Makes life easier... 1428 */ 1429union c2wr { 1430 struct c2wr_hdr hdr; 1431 struct c2wr_user_hdr user_hdr; 1432 union c2wr_rnic_open rnic_open; 1433 union c2wr_rnic_query rnic_query; 1434 union c2wr_rnic_getconfig rnic_getconfig; 1435 union c2wr_rnic_setconfig rnic_setconfig; 1436 union c2wr_rnic_close rnic_close; 1437 union c2wr_cq_create cq_create; 1438 union c2wr_cq_modify cq_modify; 1439 union c2wr_cq_destroy cq_destroy; 1440 union c2wr_pd_alloc pd_alloc; 1441 union c2wr_pd_dealloc pd_dealloc; 1442 union c2wr_srq_create srq_create; 1443 union c2wr_srq_destroy srq_destroy; 1444 union c2wr_qp_create qp_create; 1445 union c2wr_qp_query qp_query; 1446 union c2wr_qp_modify qp_modify; 1447 union c2wr_qp_destroy qp_destroy; 1448 struct c2wr_qp_connect qp_connect; 1449 union c2wr_nsmr_stag_alloc nsmr_stag_alloc; 1450 union c2wr_nsmr_register nsmr_register; 1451 union c2wr_nsmr_pbl nsmr_pbl; 1452 union c2wr_mr_query mr_query; 1453 union c2wr_mw_query mw_query; 1454 union c2wr_stag_dealloc stag_dealloc; 1455 union c2wr_sqwr sqwr; 1456 struct c2wr_rqwr rqwr; 1457 struct c2wr_ce ce; 1458 union c2wr_ae ae; 1459 union c2wr_init init; 1460 union c2wr_ep_listen_create ep_listen_create; 1461 union c2wr_ep_listen_destroy ep_listen_destroy; 1462 union c2wr_cr_accept cr_accept; 1463 union c2wr_cr_reject cr_reject; 1464 union c2wr_console console; 1465 union c2wr_flash_init flash_init; 1466 union c2wr_flash flash; 1467 union c2wr_buf_alloc buf_alloc; 1468 union c2wr_buf_free buf_free; 1469 union c2wr_flash_write flash_write; 1470} __attribute__((packed)); 1471 1472 1473/* 1474 * Accessors for the wr fields that are packed together tightly to 1475 * reduce the wr message size. The wr arguments are void* so that 1476 * either a struct c2wr*, a struct c2wr_hdr*, or a pointer to any of the types 1477 * in the struct c2wr union can be passed in. 1478 */ 1479static __inline__ u8 c2_wr_get_id(void *wr) 1480{ 1481 return ((struct c2wr_hdr *) wr)->id; 1482} 1483static __inline__ void c2_wr_set_id(void *wr, u8 id) 1484{ 1485 ((struct c2wr_hdr *) wr)->id = id; 1486} 1487static __inline__ u8 c2_wr_get_result(void *wr) 1488{ 1489 return ((struct c2wr_hdr *) wr)->result; 1490} 1491static __inline__ void c2_wr_set_result(void *wr, u8 result) 1492{ 1493 ((struct c2wr_hdr *) wr)->result = result; 1494} 1495static __inline__ u8 c2_wr_get_flags(void *wr) 1496{ 1497 return ((struct c2wr_hdr *) wr)->flags; 1498} 1499static __inline__ void c2_wr_set_flags(void *wr, u8 flags) 1500{ 1501 ((struct c2wr_hdr *) wr)->flags = flags; 1502} 1503static __inline__ u8 c2_wr_get_sge_count(void *wr) 1504{ 1505 return ((struct c2wr_hdr *) wr)->sge_count; 1506} 1507static __inline__ void c2_wr_set_sge_count(void *wr, u8 sge_count) 1508{ 1509 ((struct c2wr_hdr *) wr)->sge_count = sge_count; 1510} 1511static __inline__ __be32 c2_wr_get_wqe_count(void *wr) 1512{ 1513 return ((struct c2wr_hdr *) wr)->wqe_count; 1514} 1515static __inline__ void c2_wr_set_wqe_count(void *wr, u32 wqe_count) 1516{ 1517 ((struct c2wr_hdr *) wr)->wqe_count = wqe_count; 1518} 1519 1520#endif /* _C2_WR_H_ */ 1521