linux/drivers/infiniband/hw/amso1100/c2_wr.h
<<
>>
Prefs
   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