1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at 9 * http://www.opensource.org/licenses/cddl1.txt. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright (c) 2004-2011 Emulex. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _EMLXS_IOCB_H 28 #define _EMLXS_IOCB_H 29 30 #ifdef __cplusplus 31 extern "C" { 32 #endif 33 34 /* ==== IOCB Commands ==== */ 35 36 #define CMD_RCV_SEQUENCE_CX 0x01 37 #define CMD_XMIT_SEQUENCE_CR 0x02 38 #define CMD_XMIT_SEQUENCE_CX 0x03 39 #define CMD_XMIT_BCAST_CN 0x04 40 #define CMD_XMIT_BCAST_CX 0x05 41 #define CMD_QUE_RING_BUF_CN 0x06 42 #define CMD_QUE_XRI_BUF_CX 0x07 43 #define CMD_IOCB_CONTINUE_CN 0x08 44 #define CMD_RET_XRI_BUF_CX 0x09 45 #define CMD_ELS_REQUEST_CR 0x0A 46 #define CMD_ELS_REQUEST_CX 0x0B 47 #define CMD_RCV_ELS_REQ_CX 0x0D 48 #define CMD_ABORT_XRI_CN 0x0E 49 #define CMD_ABORT_XRI_CX 0x0F 50 #define CMD_CLOSE_XRI_CN 0x10 51 #define CMD_CLOSE_XRI_CX 0x11 52 #define CMD_CREATE_XRI_CR 0x12 53 #define CMD_CREATE_XRI_CX 0x13 54 #define CMD_GET_RPI_CN 0x14 55 #define CMD_XMIT_ELS_RSP_CX 0x15 56 #define CMD_GET_RPI_CR 0x16 57 #define CMD_XRI_ABORTED_CX 0x17 58 #define CMD_FCP_IWRITE_CR 0x18 59 #define CMD_FCP_IWRITE_CX 0x19 60 #define CMD_FCP_IREAD_CR 0x1A 61 #define CMD_FCP_IREAD_CX 0x1B 62 #define CMD_FCP_ICMND_CR 0x1C 63 #define CMD_FCP_ICMND_CX 0x1D 64 #define CMD_FCP_TSEND_CX 0x1F /* FCP_TARGET_MODE */ 65 #define CMD_ADAPTER_MSG 0x20 66 #define CMD_FCP_TRECEIVE_CX 0x21 /* FCP_TARGET_MODE */ 67 #define CMD_ADAPTER_DUMP 0x22 68 #define CMD_FCP_TRSP_CX 0x23 /* FCP_TARGET_MODE */ 69 #define CMD_FCP_AUTO_TRSP_CX 0x29 /* FCP_TARGET_MODE */ 70 71 /* LP3000 gasket IOCB Command Set */ 72 73 #define CMD_BPL_IWRITE_CR 0x48 74 #define CMD_BPL_IWRITE_CX 0x49 75 #define CMD_BPL_IREAD_CR 0x4A 76 #define CMD_BPL_IREAD_CX 0x4B 77 #define CMD_BPL_ICMND_CR 0x4C 78 #define CMD_BPL_ICMND_CX 0x4D 79 80 #define CMD_ASYNC_STATUS 0x7C 81 82 /* SLI_2 IOCB Command Set */ 83 #define CMD_RCV_SEQUENCE64_CX 0x81 84 #define CMD_XMIT_SEQUENCE64_CR 0x82 85 #define CMD_XMIT_SEQUENCE64_CX 0x83 86 #define CMD_XMIT_BCAST64_CN 0x84 87 #define CMD_XMIT_BCAST64_CX 0x85 88 #define CMD_QUE_RING_BUF64_CN 0x86 89 #define CMD_QUE_XRI_BUF64_CX 0x87 90 #define CMD_IOCB_CONTINUE64_CN 0x88 91 #define CMD_RET_XRI_BUF64_CX 0x89 92 #define CMD_ELS_REQUEST64_CR 0x8A 93 #define CMD_ELS_REQUEST64_CX 0x8B 94 #define CMD_RCV_ELS_REQ64_CX 0x8D 95 #define CMD_XMIT_ELS_RSP64_CX 0x95 96 #define CMD_XMIT_BLS_RSP64_CX 0x97 97 #define CMD_FCP_IWRITE64_CR 0x98 98 #define CMD_FCP_IWRITE64_CX 0x99 99 #define CMD_FCP_IREAD64_CR 0x9A 100 #define CMD_FCP_IREAD64_CX 0x9B 101 #define CMD_FCP_ICMND64_CR 0x9C 102 #define CMD_FCP_ICMND64_CX 0x9D 103 #define CMD_FCP_TSEND64_CX 0x9F /* FCP_TARGET_MODE */ 104 #define CMD_FCP_TRECEIVE64_CX 0xA1 /* FCP_TARGET_MODE */ 105 #define CMD_FCP_TRSP64_CX 0xA3 /* FCP_TARGET_MODE */ 106 #define CMD_RCV_SEQ64_CX 0xB5 /* SLI3 */ 107 #define CMD_RCV_ELS64_CX 0xB7 /* SLI3 */ 108 #define CMD_RCV_CONT64_CX 0xBB /* SLI3 */ 109 #define CMD_RCV_SEQ_LIST64_CX 0xC1 110 #define CMD_GEN_REQUEST64_CR 0xC2 111 #define CMD_GEN_REQUEST64_CX 0xC3 112 #define CMD_QUE_RING_LIST64_CN 0xC6 113 114 115 /* 116 * Begin Structure Definitions for IOCB Commands 117 */ 118 119 typedef struct 120 { 121 #ifdef EMLXS_BIG_ENDIAN 122 uint8_t statAction; 123 uint8_t statRsn; 124 uint8_t statBaExp; 125 uint8_t statLocalError; 126 #endif 127 #ifdef EMLXS_LITTLE_ENDIAN 128 uint8_t statLocalError; 129 uint8_t statBaExp; 130 uint8_t statRsn; 131 uint8_t statAction; 132 #endif 133 /* statAction FBSY reason codes */ 134 #define FBSY_RSN_MASK 0xF0 /* Rsn stored in upper nibble */ 135 #define FBSY_FABRIC_BSY 0x10 /* F_bsy due to Fabric BSY */ 136 #define FBSY_NPORT_BSY 0x30 /* F_bsy due to N_port BSY */ 137 138 /* statAction PBSY action codes */ 139 #define PBSY_ACTION1 0x01 /* Sequence terminated - retry */ 140 #define PBSY_ACTION2 0x02 /* Sequence active - retry */ 141 142 /* statAction P/FRJT action codes */ 143 #define RJT_RETRYABLE 0x01 /* Retryable class of error */ 144 #define RJT_NO_RETRY 0x02 /* Non-Retryable class of error */ 145 146 /* statRsn LS_RJT reason codes defined in LS_RJT structure */ 147 148 /* statRsn P_BSY reason codes */ 149 #define PBSY_NPORT_BSY 0x01 /* Physical N_port BSY */ 150 #define PBSY_RESRCE_BSY 0x03 /* N_port resource BSY */ 151 #define PBSY_VU_BSY 0xFF /* See VU field for rsn */ 152 153 /* statRsn P/F_RJT reason codes */ 154 #define RJT_BAD_D_ID 0x01 /* Invalid D_ID field */ 155 #define RJT_BAD_S_ID 0x02 /* Invalid S_ID field */ 156 #define RJT_UNAVAIL_TEMP 0x03 /* N_Port unavailable temp. */ 157 #define RJT_UNAVAIL_PERM 0x04 /* N_Port unavailable perm. */ 158 #define RJT_UNSUP_CLASS 0x05 /* Class not supported */ 159 #define RJT_DELIM_ERR 0x06 /* Delimiter usage error */ 160 #define RJT_UNSUP_TYPE 0x07 /* Type not supported */ 161 #define RJT_BAD_CONTROL 0x08 /* Invalid link conrtol */ 162 #define RJT_BAD_RCTL 0x09 /* R_CTL invalid */ 163 #define RJT_BAD_FCTL 0x0A /* F_CTL invalid */ 164 #define RJT_BAD_OXID 0x0B /* OX_ID invalid */ 165 #define RJT_BAD_RXID 0x0C /* RX_ID invalid */ 166 #define RJT_BAD_SEQID 0x0D /* SEQ_ID invalid */ 167 #define RJT_BAD_DFCTL 0x0E /* DF_CTL invalid */ 168 #define RJT_BAD_SEQCNT 0x0F /* SEQ_CNT invalid */ 169 #define RJT_BAD_PARM 0x10 /* Param. field invalid */ 170 #define RJT_XCHG_ERR 0x11 /* Exchange error */ 171 #define RJT_PROT_ERR 0x12 /* Protocol error */ 172 #define RJT_BAD_LENGTH 0x13 /* Invalid Length */ 173 #define RJT_UNEXPECTED_ACK 0x14 /* Unexpected ACK */ 174 #define RJT_LOGIN_REQUIRED 0x16 /* Login required */ 175 #define RJT_TOO_MANY_SEQ 0x17 /* Excessive sequences */ 176 #define RJT_XCHG_NOT_STRT 0x18 /* Exchange not started */ 177 #define RJT_UNSUP_SEC_HDR 0x19 /* Security hdr not supported */ 178 #define RJT_UNAVAIL_PATH 0x1A /* Fabric Path not available */ 179 #define RJT_VENDOR_UNIQUE 0xFF /* Vendor unique error */ 180 181 /* statRsn BA_RJT reason codes */ 182 #define BARJT_BAD_CMD_CODE 0x01 /* Invalid command code */ 183 #define BARJT_LOGICAL_ERR 0x03 /* Logical error */ 184 #define BARJT_LOGICAL_BSY 0x05 /* Logical busy */ 185 #define BARJT_PROTOCOL_ERR 0x07 /* Protocol error */ 186 #define BARJT_VU_ERR 0xFF /* Vendor unique error */ 187 188 /* LS_RJT reason explanation defined in LS_RJT structure */ 189 190 /* BA_RJT reason explanation */ 191 #define BARJT_EXP_INVALID_ID 0x01 /* Invalid OX_ID/RX_ID */ 192 #define BARJT_EXP_ABORT_SEQ 0x05 /* Abort SEQ, no more info */ 193 194 /* Local Reject errors */ 195 #define IOERR_SUCCESS 0x00 196 #define IOERR_MISSING_CONTINUE 0x01 197 #define IOERR_SEQUENCE_TIMEOUT 0x02 198 #define IOERR_INTERNAL_ERROR 0x03 199 #define IOERR_INVALID_RPI 0x04 200 #define IOERR_NO_XRI 0x05 201 #define IOERR_ILLEGAL_COMMAND 0x06 202 #define IOERR_XCHG_DROPPED 0x07 203 #define IOERR_ILLEGAL_FIELD 0x08 204 /* RESERVED 0x09 */ 205 /* RESERVED 0x0A */ 206 #define IOERR_RCV_BUFFER_WAITING 0x0B 207 /* RESERVED 0x0C */ 208 #define IOERR_TX_DMA_FAILED 0x0D 209 #define IOERR_RX_DMA_FAILED 0x0E 210 #define IOERR_ILLEGAL_FRAME 0x0F 211 212 /* RESERVED 0x10 */ 213 #define IOERR_NO_RESOURCES 0x11 214 /* RESERVED 0x12 */ 215 #define IOERR_ILLEGAL_LENGTH 0x13 216 #define IOERR_UNSUPPORTED_FEATURE 0x14 217 #define IOERR_ABORT_IN_PROGRESS 0x15 218 #define IOERR_ABORT_REQUESTED 0x16 219 #define IOERR_RCV_BUFFER_TIMEOUT 0x17 220 #define IOERR_LOOP_OPEN_FAILURE 0x18 221 #define IOERR_RING_RESET 0x19 222 #define IOERR_LINK_DOWN 0x1A 223 #define IOERR_CORRUPTED_DATA 0x1B 224 #define IOERR_CORRUPTED_RPI 0x1C 225 #define IOERR_OUT_OF_ORDER_DATA 0x1D 226 #define IOERR_OUT_OF_ORDER_ACK 0x1E 227 #define IOERR_DUP_FRAME 0x1F 228 229 #define IOERR_LINK_CONTROL_FRAME 0x20 /* ACK_N received */ 230 #define IOERR_BAD_HOST_ADDRESS 0x21 231 #define IOERR_RCV_HDRBUF_WAITING 0x22 232 #define IOERR_MISSING_HDR_BUFFER 0x23 233 #define IOERR_MSEQ_CHAIN_CORRUPTED 0x24 234 #define IOERR_ABORTMULT_REQUESTED 0x25 235 /* RESERVED 0x26 */ 236 /* RESERVED 0x27 */ 237 #define IOERR_BUFFER_SHORTAGE 0x28 238 #define IOERR_XRIBUF_WAITING 0x29 239 /* RESERVED 0x2A */ 240 #define IOERR_MISSING_HBQ_ENTRY 0x2B 241 #define IOERR_ABORT_EXT_REQ 0x2C 242 #define IOERR_CLOSE_EXT_REQ 0x2D 243 #define IOERR_INVALID_VPI 0x2E 244 /* RESERVED 0x2F */ 245 246 #define IOERR_XRIBUF_MISSING 0x30 247 #define IOERR_ASSI_RSP_SUPPRESSED 0x31 248 /* RESERVED 0x32 - 0x3F */ 249 250 #define IOERR_ROFFSET_INVAL 0x40 251 #define IOERR_ROFFSET_MISSING 0x41 252 #define IOERR_INSUF_BUFFER 0x42 253 #define IOERR_MISSING_SI 0x43 254 #define IOERR_MISSING_ES 0x44 255 #define IOERR_INCOMP_XFER 0x45 256 /* RESERVED 0x46 - 0xFF */ 257 258 /* Driver defined */ 259 #define IOERR_ABORT_TIMEOUT 0xF0 260 } PARM_ERR; 261 262 typedef union 263 { 264 struct 265 { 266 #ifdef EMLXS_BIG_ENDIAN 267 uint8_t Rctl; /* R_CTL field */ 268 uint8_t Type; /* TYPE field */ 269 uint8_t Dfctl; /* DF_CTL field */ 270 uint8_t Fctl; /* Bits 0-7 of IOCB word 5 */ 271 #endif 272 #ifdef EMLXS_LITTLE_ENDIAN 273 uint8_t Fctl; /* Bits 0-7 of IOCB word 5 */ 274 uint8_t Dfctl; /* DF_CTL field */ 275 uint8_t Type; /* TYPE field */ 276 uint8_t Rctl; /* R_CTL field */ 277 #endif 278 #define FCP_RTYPE 0x08 /* FCP_TARGET_MODE Type - Rctl */ 279 280 #define BC 0x02 /* Broadcast Received - Fctl */ 281 #define SI 0x04 /* Sequence Initiative */ 282 #define LA 0x08 /* Ignore Link Attention state */ 283 #define FSEQ 0x40 /* First Sequence */ 284 #define LSEQ 0x80 /* Last Sequence */ 285 } hcsw; 286 uint32_t reserved; 287 } WORD5; 288 289 290 /* IOCB Command template for a generic response */ 291 typedef struct 292 { 293 uint32_t reserved[4]; 294 PARM_ERR perr; 295 } GENERIC_RSP; 296 297 298 /* IOCB Command template for XMIT / XMIT_BCAST / RCV_SEQUENCE / XMIT_ELS */ 299 typedef struct 300 { 301 ULP_BDE xrsqbde[2]; 302 uint32_t xrsqRo; /* Starting Relative Offset */ 303 WORD5 w5; /* Header control/status word */ 304 } XR_SEQ_FIELDS; 305 306 /* IOCB Command template for ELS_REQUEST */ 307 typedef struct 308 { 309 ULP_BDE elsReq; 310 ULP_BDE elsRsp; 311 #ifdef EMLXS_BIG_ENDIAN 312 uint32_t word4Rsvd:7; 313 uint32_t fl:1; 314 uint32_t myID:24; 315 316 uint32_t word5Rsvd:8; 317 uint32_t remoteID:24; 318 #endif 319 #ifdef EMLXS_LITTLE_ENDIAN 320 uint32_t myID:24; 321 uint32_t fl:1; 322 uint32_t word4Rsvd:7; 323 324 uint32_t remoteID:24; 325 uint32_t word5Rsvd:8; 326 #endif 327 } ELS_REQUEST; 328 329 /* IOCB Command template for RCV_ELS_REQ */ 330 typedef struct 331 { 332 ULP_BDE elsReq[2]; 333 uint32_t parmRo; 334 #ifdef EMLXS_BIG_ENDIAN 335 uint32_t word5Rsvd:8; 336 uint32_t remoteID:24; 337 #endif 338 #ifdef EMLXS_LITTLE_ENDIAN 339 uint32_t remoteID:24; 340 uint32_t word5Rsvd:8; 341 #endif 342 } RCV_ELS_REQ; 343 344 /* IOCB Command template for ABORT / CLOSE_XRI */ 345 typedef struct 346 { 347 uint32_t rsvd[3]; 348 uint32_t abortType; 349 #define ABORT_TYPE_ABTX 0x00000000 350 #define ABORT_TYPE_ABTS 0x00000001 351 uint32_t parm; 352 #ifdef EMLXS_BIG_ENDIAN 353 uint16_t abortContextTag; /* ulpContext from command to */ 354 /* abort/close */ 355 uint16_t abortIoTag; /* ulpIoTag from command to */ 356 /* abort/close */ 357 #endif 358 #ifdef EMLXS_LITTLE_ENDIAN 359 uint16_t abortIoTag; /* ulpIoTag from command to */ 360 /* abort/close */ 361 uint16_t abortContextTag; /* ulpContext from command to */ 362 /* abort/close */ 363 #endif 364 } AC_XRI; 365 366 /* IOCB Command template for GET_RPI */ 367 typedef struct 368 { 369 uint32_t rsvd[4]; 370 uint32_t parmRo; 371 #ifdef EMLXS_BIG_ENDIAN 372 uint32_t word5Rsvd:8; 373 uint32_t remoteID:24; 374 #endif 375 #ifdef EMLXS_LITTLE_ENDIAN 376 uint32_t remoteID:24; 377 uint32_t word5Rsvd:8; 378 #endif 379 } GET_RPI; 380 381 /* IOCB Command template for all FCP Initiator commands */ 382 typedef struct 383 { 384 ULP_BDE fcpi_cmnd; /* FCP_CMND payload descriptor */ 385 ULP_BDE fcpi_rsp; /* Rcv buffer */ 386 uint32_t fcpi_parm; 387 uint32_t fcpi_XRdy; /* transfer ready for IWRITE */ 388 } FCPI_FIELDS; 389 390 /* IOCB Command template for all FCP Target commands */ 391 typedef struct 392 { 393 ULP_BDE fcpt_Buffer[2]; /* FCP_CMND payload descriptor */ 394 uint32_t fcpt_Offset; 395 uint32_t fcpt_Length; /* transfer ready for IWRITE */ 396 } FCPT_FIELDS; 397 398 /* SLI-2 IOCB structure definitions */ 399 400 /* IOCB Command template for 64 bit XMIT / XMIT_BCAST / XMIT_ELS */ 401 typedef struct 402 { 403 ULP_BDL bdl; 404 uint32_t xrsqRo; /* Starting Relative Offset */ 405 WORD5 w5; /* Header control/status word */ 406 } XMT_SEQ_FIELDS64; 407 408 409 /* IOCB Command template for 64 bit RCV_SEQUENCE64 */ 410 typedef struct 411 { 412 ULP_BDE64 rcvBde; 413 uint32_t rsvd1; 414 uint32_t xrsqRo; /* Starting Relative Offset */ 415 WORD5 w5; /* Header control/status word */ 416 } RCV_SEQ_FIELDS64; 417 418 /* IOCB Command template for ELS_REQUEST64 */ 419 typedef struct 420 { 421 ULP_BDL bdl; 422 #ifdef EMLXS_BIG_ENDIAN 423 uint32_t word4Rsvd:7; 424 uint32_t fl:1; 425 uint32_t myID:24; 426 427 uint32_t word5Rsvd:8; 428 uint32_t remoteID:24; 429 #endif 430 #ifdef EMLXS_LITTLE_ENDIAN 431 uint32_t myID:24; 432 uint32_t fl:1; 433 uint32_t word4Rsvd:7; 434 435 uint32_t remoteID:24; 436 uint32_t word5Rsvd:8; 437 #endif 438 } ELS_REQUEST64; 439 440 441 /* IOCB Command template for ASYNC_STATUS */ 442 typedef struct 443 { 444 ULP_BDL resv; 445 uint32_t parameter; 446 #ifdef EMLXS_BIG_ENDIAN 447 uint16_t EventCode; 448 uint16_t SubContext; 449 #endif 450 #ifdef EMLXS_LITTLE_ENDIAN 451 uint16_t SubContext; 452 uint16_t EventCode; 453 #endif 454 } ASYNC_STATUS; 455 456 457 /* IOCB Command template for QUE_RING_LIST64 */ 458 typedef struct 459 { 460 ULP_BDL bdl; 461 uint32_t rsvd1; 462 uint32_t rsvd2; 463 } QUE_RING_LIST64; 464 465 466 /* IOCB Command template for GEN_REQUEST64 */ 467 typedef struct 468 { 469 ULP_BDL bdl; 470 uint32_t param; /* Starting Relative Offset */ 471 WORD5 w5; /* Header control/status word */ 472 } GEN_REQUEST64; 473 474 /* IOCB Command template for RCV_ELS_REQ64 */ 475 typedef struct 476 { 477 ULP_BDE64 elsReq; 478 uint32_t rsvd1; 479 uint32_t parmRo; 480 #ifdef EMLXS_BIG_ENDIAN 481 uint32_t word5Rsvd:8; 482 uint32_t remoteID:24; 483 #endif 484 #ifdef EMLXS_LITTLE_ENDIAN 485 uint32_t remoteID:24; 486 uint32_t word5Rsvd:8; 487 #endif 488 } RCV_ELS_REQ64; 489 490 /* IOCB Command template for all 64 bit FCP Initiator commands */ 491 typedef struct 492 { 493 ULP_BDL bdl; 494 uint32_t fcpi_parm; 495 uint32_t fcpi_XRdy; /* transfer ready for IWRITE */ 496 } FCPI_FIELDS64; 497 498 /* IOCB Command template for all 64 bit FCP Target commands */ 499 typedef struct 500 { 501 ULP_BDL bdl; 502 uint32_t fcpt_Offset; 503 uint32_t fcpt_Length; /* transfer ready for IWRITE */ 504 } FCPT_FIELDS64; 505 506 /* IOCB Command template for all 64 bit FCP Target commands */ 507 typedef struct 508 { 509 uint32_t rsp_length; 510 uint32_t rsvd1; 511 uint32_t rsvd2; 512 uint32_t iotag32; 513 uint32_t status; 514 #ifdef EMLXS_BIG_ENDIAN 515 uint32_t rsvd:30; 516 uint32_t lnk:1; 517 #endif /* EMLXS_BIG_ENDIAN */ 518 519 #ifdef EMLXS_LITTLE_ENDIAN 520 uint32_t lnk:1; 521 uint32_t rsvd:30; 522 #endif /* EMLXS_LITTLE_ENDIAN */ 523 } AUTO_TRSP; 524 525 526 typedef struct 527 { 528 uint32_t io_tag64_low; /* Word 8 */ 529 uint32_t io_tag64_high; /* Word 9 */ 530 #ifdef EMLXS_BIG_ENDIAN 531 uint32_t cs_ctl:8; /* Word 10, bit 31:24 */ 532 uint32_t cs_en:1; /* Word 10, bit 23 */ 533 uint32_t rsv:15; /* Word 10, bit 22:8 */ 534 uint32_t ebde_count:8; /* Word 10, bit 7:0 */ 535 #endif 536 #ifdef EMLXS_LITTLE_ENDIAN 537 uint32_t ebde_count:8; /* Word 10, bit 7:0 */ 538 uint32_t rsv:15; /* Word 10, bit 22:8 */ 539 uint32_t cs_en:1; /* Word 10, bit 23 */ 540 uint32_t cs_ctl:8; /* Word 10, bit 31:24 */ 541 #endif 542 uint32_t rsplen; /* Word 11 */ 543 ULP_BDE64 ebde1; /* Word 12:14 */ 544 ULP_BDE64 ebde2; /* Word 15:17 */ 545 ULP_BDE64 ebde3; /* Word 18:20 */ 546 ULP_BDE64 ebde4; /* Word 21:23 */ 547 ULP_BDE64 ebde5; /* Word 24:26 */ 548 ULP_BDE64 ebde6; /* Word 27:29 */ 549 } GENERIC_EXT_IOCB; 550 551 /* 552 * IOCB Command Extension template for 553 * CMD_RCV_ELS64_CX (0xB7) or CMD_RCV_SEQ64_CX (0xB5) 554 */ 555 556 typedef struct 557 { 558 #ifdef EMLXS_BIG_ENDIAN 559 uint16_t oxid; /* word 8 */ 560 uint16_t seq_cnt; 561 562 uint16_t vpi; /* word 9 */ 563 uint16_t buddy_xri; 564 565 uint32_t ccp:8; /* word 10 */ 566 uint32_t ccpe:1; 567 uint32_t rsvd:23; 568 #endif 569 #ifdef EMLXS_LITTLE_ENDIAN 570 uint16_t seq_cnt; /* word 8 */ 571 uint16_t oxid; 572 573 uint16_t buddy_xri; /* word 9 */ 574 uint16_t vpi; 575 576 uint32_t rsvd:23; /* word 10 */ 577 uint32_t ccpe:1; 578 uint32_t ccp:8; 579 #endif 580 uint32_t seq_len; /* received sequence length */ 581 ULP_BDL bde2; /* total 4 words */ 582 } RCV_SEQ_ELS_64_SLI3_EXT; 583 584 585 typedef volatile struct emlxs_iocb 586 { /* IOCB structure */ 587 union 588 { 589 GENERIC_RSP grsp; /* Generic response */ 590 XR_SEQ_FIELDS xrseq; /* XMIT/BCAST/RCV_SEQ */ 591 ULP_BDE cont[3]; /* up to 3 cont BDEs */ 592 ELS_REQUEST elsreq; /* ELS_REQ template */ 593 RCV_ELS_REQ rcvels; /* RCV_ELS_REQ */ 594 /* template */ 595 AC_XRI acxri; /* ABORT/CLOSE_XRI */ 596 /* template */ 597 GET_RPI getrpi; /* GET_RPI template */ 598 FCPI_FIELDS fcpi; /* FCP Initiator */ 599 /* template */ 600 FCPT_FIELDS fcpt; /* FCP target */ 601 /* template */ 602 603 /* SLI-2 structures */ 604 605 ULP_BDE64 cont64[2]; /* up to 2 64 bit */ 606 /* cont BDE_64s */ 607 ELS_REQUEST64 elsreq64; /* ELS_REQ64 template */ 608 QUE_RING_LIST64 qringlist64; /* QUE RING LIST64 */ 609 /* template */ 610 GEN_REQUEST64 genreq64; /* GEN_REQUEST64 */ 611 /* template */ 612 RCV_ELS_REQ64 rcvels64; /* RCV_ELS_REQ */ 613 /* template */ 614 XMT_SEQ_FIELDS64 xseq64; /* XMIT / BCAST cmd */ 615 FCPI_FIELDS64 fcpi64; /* FCP 64 bit */ 616 /* Initiator template */ 617 FCPT_FIELDS64 fcpt64; /* FCP 64 bit target */ 618 /* template */ 619 AUTO_TRSP atrsp; /* FCP 64 bit target */ 620 /* template */ 621 622 RCV_SEQ_FIELDS64 rcvseq64; 623 ASYNC_STATUS astat; 624 625 uint32_t ulpWord[6]; /* generic 6 'words' */ 626 } un; 627 union 628 { 629 struct 630 { 631 #ifdef EMLXS_BIG_ENDIAN 632 uint16_t ulpContext; /* High order bits */ 633 /* word6 */ 634 uint16_t ulpIoTag; /* Low order bits */ 635 /* word6 */ 636 #endif 637 #ifdef EMLXS_LITTLE_ENDIAN 638 uint16_t ulpIoTag; /* Low order bits */ 639 /* word6 */ 640 uint16_t ulpContext; /* High order bits */ 641 /* word6 */ 642 #endif 643 } t1; 644 struct 645 { 646 #ifdef EMLXS_BIG_ENDIAN 647 uint16_t ulpContext; /* High order bits */ 648 /* word6 */ 649 uint16_t ulpIoTag1:2; /* Low order bits */ 650 /* word6 */ 651 uint16_t ulpIoTag0:14; /* Low order bits */ 652 /* word6 */ 653 #endif 654 #ifdef EMLXS_LITTLE_ENDIAN 655 uint16_t ulpIoTag0:14; /* Low order bits */ 656 /* word6 */ 657 uint16_t ulpIoTag1:2; /* Low order bits */ 658 /* word6 */ 659 uint16_t ulpContext; /* High order bits */ 660 /* word6 */ 661 #endif 662 } t2; 663 664 uint32_t ulpWord; 665 } un1; 666 #define ULPCONTEXT un1.t1.ulpContext 667 #define ULPIOTAG un1.t1.ulpIoTag 668 #define ULPIOTAG0 un1.t2.ulpIoTag0 669 #define ULPDELAYXMIT un1.t2.ulpIoTag1 670 671 #define IOCB_DELAYXMIT_MSK 0x3000 672 673 674 union 675 { 676 struct 677 { 678 #ifdef EMLXS_BIG_ENDIAN 679 uint32_t ulpRsvdByte:8; 680 uint32_t ulpXS:1; 681 uint32_t ulpFCP2Rcvy:1; 682 uint32_t ulpPU:2; 683 uint32_t ulpIr:1; 684 uint32_t ulpClass:3; 685 uint32_t ulpCommand:8; 686 uint32_t ulpStatus:4; 687 uint32_t ulpBdeCount:2; 688 uint32_t ulpLe:1; 689 uint32_t ulpOwner:1; /* Low order bit */ 690 /* word 7 */ 691 #endif 692 #ifdef EMLXS_LITTLE_ENDIAN 693 uint32_t ulpOwner:1; /* Low order bit */ 694 /* word 7 */ 695 uint32_t ulpLe:1; 696 uint32_t ulpBdeCount:2; 697 uint32_t ulpStatus:4; 698 uint32_t ulpCommand:8; 699 uint32_t ulpClass:3; 700 uint32_t ulpIr:1; 701 uint32_t ulpPU:2; 702 uint32_t ulpFCP2Rcvy:1; 703 uint32_t ulpXS:1; 704 uint32_t ulpRsvdByte:8; 705 #endif 706 } t1; 707 708 struct 709 { 710 #ifdef EMLXS_BIG_ENDIAN 711 uint32_t ulpRsvdByte:8; 712 uint32_t ulpCT:2; 713 uint32_t ulpPU:2; 714 uint32_t ulpIr:1; 715 uint32_t ulpClass:3; 716 uint32_t ulpCommand:8; 717 uint32_t ulpStatus:4; 718 uint32_t ulpBdeCount:2; 719 uint32_t ulpLe:1; 720 uint32_t ulpOwner:1; /* Low order bit */ 721 /* word 7 */ 722 #endif 723 #ifdef EMLXS_LITTLE_ENDIAN 724 uint32_t ulpOwner:1; /* Low order bit */ 725 /* word 7 */ 726 uint32_t ulpLe:1; 727 uint32_t ulpBdeCount:2; 728 uint32_t ulpStatus:4; 729 uint32_t ulpCommand:8; 730 uint32_t ulpClass:3; 731 uint32_t ulpIr:1; 732 uint32_t ulpPU:2; 733 uint32_t ulpCT:2; 734 uint32_t ulpRsvdByte:8; 735 #endif 736 } t2; 737 738 uint32_t ulpWord; 739 } un2; 740 741 #define ULPCT un2.t2.ulpCT 742 #define ULPRSVDBYTE un2.t1.ulpRsvdByte 743 #define ULPXS un2.t1.ulpXS 744 #define ULPFCP2RCVY un2.t1.ulpFCP2Rcvy 745 #define ULPPU un2.t1.ulpPU 746 #define ULPIR un2.t1.ulpIr 747 #define ULPCLASS un2.t1.ulpClass 748 #define ULPCOMMAND un2.t1.ulpCommand 749 #define ULPSTATUS un2.t1.ulpStatus 750 #define ULPBDECOUNT un2.t1.ulpBdeCount 751 #define ULPLE un2.t1.ulpLe 752 #define ULPOWNER un2.t1.ulpOwner 753 /* 32 bytes at this point */ 754 755 /* SLI4 */ 756 #define RXFCHDR un.ulpWord 757 #define RXSEQCNT un1.ulpWord 758 #define RXSEQLEN un2.ulpWord 759 760 union 761 { 762 GENERIC_EXT_IOCB ext_iocb; 763 RCV_SEQ_ELS_64_SLI3_EXT ext_rcv; 764 uint32_t sli3Words[24]; /* 96 extra bytes */ 765 /* for SLI-3 */ 766 } unsli3; 767 /* 128 bytes at this point */ 768 769 #define IOCB_FCP 1 /* IOCB is used for */ 770 /* FCP ELS cmds - ulpRsvByte */ 771 #define IOCB_IP 2 /* IOCB is used for IP ELS cmds */ 772 #define PARM_UNUSED 0 /* PU field (Word 4) not used */ 773 #define PARM_REL_OFF 1 /* PU field (Word 4) = R. O. */ 774 #define PARM_XFER_CHECK 2 /* PU field (Word 4) = Data Xfer Len */ 775 #define CLASS1 0 /* Class 1 */ 776 #define CLASS2 1 /* Class 2 */ 777 #define CLASS3 2 /* Class 3 */ 778 #define CLASS_FCP_INTERMIX 7 /* FCP Data->Cls 1, all else->Cls 2 */ 779 780 #define IOSTAT_SUCCESS 0x0 /* ulpStatus */ 781 #define IOSTAT_FCP_RSP_ERROR 0x1 782 #define IOSTAT_REMOTE_STOP 0x2 783 #define IOSTAT_LOCAL_REJECT 0x3 784 #define IOSTAT_NPORT_RJT 0x4 785 #define IOSTAT_FABRIC_RJT 0x5 786 #define IOSTAT_NPORT_BSY 0x6 787 #define IOSTAT_FABRIC_BSY 0x7 788 #define IOSTAT_INTERMED_RSP 0x8 789 #define IOSTAT_LS_RJT 0x9 790 #define IOSTAT_RESERVED_A 0xA 791 #define IOSTAT_CMD_REJECT 0xB 792 #define IOSTAT_FCP_TGT_LENCHK 0xC 793 #define IOSTAT_RESERVED_D 0xD 794 #define IOSTAT_RESERVED_E 0xE 795 #define IOSTAT_NEED_BUFF_ENTRY 0xF 796 797 /* Special error codes */ 798 #define IOSTAT_DATA_OVERRUN 0x10 /* Added for resid handling */ 799 #define IOSTAT_DATA_UNDERRUN 0x11 /* Added for resid handling */ 800 #define IOSTAT_RSP_INVALID 0x12 /* Added for resp checking */ 801 } emlxs_iocb_t; 802 typedef emlxs_iocb_t IOCB; 803 804 805 typedef struct emlxs_iocbq 806 { 807 emlxs_iocb_t iocb; 808 emlxs_wqe_t wqe; /* SLI4 */ 809 810 struct emlxs_iocbq *next; 811 812 void *bp; /* ptr to data buffer structure */ 813 void *port; /* Board info pointer */ 814 void *channel; /* IO Channel pointer */ 815 void *node; /* Node pointer */ 816 void *sbp; /* Pkt pointer */ 817 uint32_t flag; 818 819 #define IOCB_POOL_ALLOCATED 0x00000001 820 #define IOCB_PRIORITY 0x00000002 821 #define IOCB_SPECIAL 0x00000004 822 #define IOCB_FCP_CMD 0x00000008 823 #define IOCB_FCT_DATA 0x00000020 /* tgt-mode */ 824 825 } emlxs_iocbq_t; 826 typedef emlxs_iocbq_t IOCBQ; 827 828 829 #ifdef __cplusplus 830 } 831 #endif 832 833 #endif /* _EMLXS_IOCB_H */ 834