1 /* 2 * Copyright 2008 Cisco Systems, Inc. All rights reserved. 3 * Copyright 2007 Nuova Systems, Inc. All rights reserved. 4 * 5 * This program is free software; you may redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; version 2 of the License. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 10 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 11 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 12 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 13 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 14 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 15 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 16 * SOFTWARE. 17 */ 18 #ifndef _FCPIO_H_ 19 #define _FCPIO_H_ 20 21 #include <linux/if_ether.h> 22 23 /* 24 * This header file includes all of the data structures used for 25 * communication by the host driver to the fcp firmware. 26 */ 27 28 /* 29 * Exchange and sequence id space allocated to the host driver 30 */ 31 #define FCPIO_HOST_EXCH_RANGE_START 0x1000 32 #define FCPIO_HOST_EXCH_RANGE_END 0x1fff 33 #define FCPIO_HOST_SEQ_ID_RANGE_START 0x80 34 #define FCPIO_HOST_SEQ_ID_RANGE_END 0xff 35 36 /* 37 * Command entry type 38 */ 39 enum fcpio_type { 40 /* 41 * Initiator request types 42 */ 43 FCPIO_ICMND_16 = 0x1, 44 FCPIO_ICMND_32, 45 FCPIO_ICMND_CMPL, 46 FCPIO_ITMF, 47 FCPIO_ITMF_CMPL, 48 49 /* 50 * Target request types 51 */ 52 FCPIO_TCMND_16 = 0x11, 53 FCPIO_TCMND_32, 54 FCPIO_TDATA, 55 FCPIO_TXRDY, 56 FCPIO_TRSP, 57 FCPIO_TDRSP_CMPL, 58 FCPIO_TTMF, 59 FCPIO_TTMF_ACK, 60 FCPIO_TABORT, 61 FCPIO_TABORT_CMPL, 62 63 /* 64 * Misc request types 65 */ 66 FCPIO_ACK = 0x20, 67 FCPIO_RESET, 68 FCPIO_RESET_CMPL, 69 FCPIO_FLOGI_REG, 70 FCPIO_FLOGI_REG_CMPL, 71 FCPIO_ECHO, 72 FCPIO_ECHO_CMPL, 73 FCPIO_LUNMAP_CHNG, 74 FCPIO_LUNMAP_REQ, 75 FCPIO_LUNMAP_REQ_CMPL, 76 FCPIO_FLOGI_FIP_REG, 77 FCPIO_FLOGI_FIP_REG_CMPL, 78 }; 79 80 /* 81 * Header status codes from the firmware 82 */ 83 enum fcpio_status { 84 FCPIO_SUCCESS = 0, /* request was successful */ 85 86 /* 87 * If a request to the firmware is rejected, the original request 88 * header will be returned with the status set to one of the following: 89 */ 90 FCPIO_INVALID_HEADER, /* header contains invalid data */ 91 FCPIO_OUT_OF_RESOURCE, /* out of resources to complete request */ 92 FCPIO_INVALID_PARAM, /* some parameter in request is invalid */ 93 FCPIO_REQ_NOT_SUPPORTED, /* request type is not supported */ 94 FCPIO_IO_NOT_FOUND, /* requested I/O was not found */ 95 96 /* 97 * Once a request is processed, the firmware will usually return 98 * a cmpl message type. In cases where errors occurred, 99 * the header status field would be filled in with one of the following: 100 */ 101 FCPIO_ABORTED = 0x41, /* request was aborted */ 102 FCPIO_TIMEOUT, /* request was timed out */ 103 FCPIO_SGL_INVALID, /* request was aborted due to sgl error */ 104 FCPIO_MSS_INVALID, /* request was aborted due to mss error */ 105 FCPIO_DATA_CNT_MISMATCH, /* recv/sent more/less data than exp. */ 106 FCPIO_FW_ERR, /* request was terminated due to fw error */ 107 FCPIO_ITMF_REJECTED, /* itmf req was rejected by remote node */ 108 FCPIO_ITMF_FAILED, /* itmf req was failed by remote node */ 109 FCPIO_ITMF_INCORRECT_LUN, /* itmf req targeted incorrect LUN */ 110 FCPIO_CMND_REJECTED, /* request was invalid and rejected */ 111 FCPIO_NO_PATH_AVAIL, /* no paths to the lun was available */ 112 FCPIO_PATH_FAILED, /* i/o sent to current path failed */ 113 FCPIO_LUNMAP_CHNG_PEND, /* i/o rejected due to lunmap change */ 114 }; 115 116 /* 117 * The header command tag. All host requests will use the "tag" field 118 * to mark commands with a unique tag. When the firmware responds to 119 * a host request, it will copy the tag field into the response. 120 * 121 * The only firmware requests that will use the rx_id/ox_id fields instead 122 * of the tag field will be the target command and target task management 123 * requests. These two requests do not have corresponding host requests 124 * since they come directly from the FC initiator on the network. 125 */ 126 struct fcpio_tag { 127 union { 128 u32 req_id; 129 struct { 130 u16 rx_id; 131 u16 ox_id; 132 } ex_id; 133 } u; 134 }; 135 136 static inline void 137 fcpio_tag_id_enc(struct fcpio_tag *tag, u32 id) 138 { 139 tag->u.req_id = id; 140 } 141 142 static inline void 143 fcpio_tag_id_dec(struct fcpio_tag *tag, u32 *id) 144 { 145 *id = tag->u.req_id; 146 } 147 148 static inline void 149 fcpio_tag_exid_enc(struct fcpio_tag *tag, u16 ox_id, u16 rx_id) 150 { 151 tag->u.ex_id.rx_id = rx_id; 152 tag->u.ex_id.ox_id = ox_id; 153 } 154 155 static inline void 156 fcpio_tag_exid_dec(struct fcpio_tag *tag, u16 *ox_id, u16 *rx_id) 157 { 158 *rx_id = tag->u.ex_id.rx_id; 159 *ox_id = tag->u.ex_id.ox_id; 160 } 161 162 /* 163 * The header for an fcpio request, whether from the firmware or from the 164 * host driver 165 */ 166 struct fcpio_header { 167 u8 type; /* enum fcpio_type */ 168 u8 status; /* header status entry */ 169 u16 _resvd; /* reserved */ 170 struct fcpio_tag tag; /* header tag */ 171 }; 172 173 static inline void 174 fcpio_header_enc(struct fcpio_header *hdr, 175 u8 type, u8 status, 176 struct fcpio_tag tag) 177 { 178 hdr->type = type; 179 hdr->status = status; 180 hdr->_resvd = 0; 181 hdr->tag = tag; 182 } 183 184 static inline void 185 fcpio_header_dec(struct fcpio_header *hdr, 186 u8 *type, u8 *status, 187 struct fcpio_tag *tag) 188 { 189 *type = hdr->type; 190 *status = hdr->status; 191 *tag = hdr->tag; 192 } 193 194 #define CDB_16 16 195 #define CDB_32 32 196 #define LUN_ADDRESS 8 197 198 /* 199 * fcpio_icmnd_16: host -> firmware request 200 * 201 * used for sending out an initiator SCSI 16-byte command 202 */ 203 struct fcpio_icmnd_16 { 204 u32 lunmap_id; /* index into lunmap table */ 205 u8 special_req_flags; /* special exchange request flags */ 206 u8 _resvd0[3]; /* reserved */ 207 u32 sgl_cnt; /* scatter-gather list count */ 208 u32 sense_len; /* sense buffer length */ 209 u64 sgl_addr; /* scatter-gather list addr */ 210 u64 sense_addr; /* sense buffer address */ 211 u8 crn; /* SCSI Command Reference No. */ 212 u8 pri_ta; /* SCSI Priority and Task attribute */ 213 u8 _resvd1; /* reserved: should be 0 */ 214 u8 flags; /* command flags */ 215 u8 scsi_cdb[CDB_16]; /* SCSI Cmnd Descriptor Block */ 216 u32 data_len; /* length of data expected */ 217 u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */ 218 u8 _resvd2; /* reserved */ 219 u8 d_id[3]; /* FC vNIC only: Target D_ID */ 220 u16 mss; /* FC vNIC only: max burst */ 221 u16 _resvd3; /* reserved */ 222 u32 r_a_tov; /* FC vNIC only: Res. Alloc Timeout */ 223 u32 e_d_tov; /* FC vNIC only: Err Detect Timeout */ 224 }; 225 226 /* 227 * Special request flags 228 */ 229 #define FCPIO_ICMND_SRFLAG_RETRY 0x01 /* Enable Retry handling on exchange */ 230 231 /* 232 * Priority/Task Attribute settings 233 */ 234 #define FCPIO_ICMND_PTA_SIMPLE 0 /* simple task attribute */ 235 #define FCPIO_ICMND_PTA_HEADQ 1 /* head of queue task attribute */ 236 #define FCPIO_ICMND_PTA_ORDERED 2 /* ordered task attribute */ 237 #define FCPIO_ICMND_PTA_ACA 4 /* auto contingent allegiance */ 238 #define FCPIO_ICMND_PRI_SHIFT 3 /* priority field starts in bit 3 */ 239 240 /* 241 * Command flags 242 */ 243 #define FCPIO_ICMND_RDDATA 0x02 /* read data */ 244 #define FCPIO_ICMND_WRDATA 0x01 /* write data */ 245 246 /* 247 * fcpio_icmnd_32: host -> firmware request 248 * 249 * used for sending out an initiator SCSI 32-byte command 250 */ 251 struct fcpio_icmnd_32 { 252 u32 lunmap_id; /* index into lunmap table */ 253 u8 special_req_flags; /* special exchange request flags */ 254 u8 _resvd0[3]; /* reserved */ 255 u32 sgl_cnt; /* scatter-gather list count */ 256 u32 sense_len; /* sense buffer length */ 257 u64 sgl_addr; /* scatter-gather list addr */ 258 u64 sense_addr; /* sense buffer address */ 259 u8 crn; /* SCSI Command Reference No. */ 260 u8 pri_ta; /* SCSI Priority and Task attribute */ 261 u8 _resvd1; /* reserved: should be 0 */ 262 u8 flags; /* command flags */ 263 u8 scsi_cdb[CDB_32]; /* SCSI Cmnd Descriptor Block */ 264 u32 data_len; /* length of data expected */ 265 u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */ 266 u8 _resvd2; /* reserved */ 267 u8 d_id[3]; /* FC vNIC only: Target D_ID */ 268 u16 mss; /* FC vNIC only: max burst */ 269 u16 _resvd3; /* reserved */ 270 u32 r_a_tov; /* FC vNIC only: Res. Alloc Timeout */ 271 u32 e_d_tov; /* FC vNIC only: Error Detect Timeout */ 272 }; 273 274 /* 275 * fcpio_itmf: host -> firmware request 276 * 277 * used for requesting the firmware to abort a request and/or send out 278 * a task management function 279 * 280 * The t_tag field is only needed when the request type is ABT_TASK. 281 */ 282 struct fcpio_itmf { 283 u32 lunmap_id; /* index into lunmap table */ 284 u32 tm_req; /* SCSI Task Management request */ 285 u32 t_tag; /* header tag of fcpio to be aborted */ 286 u32 _resvd; /* _reserved */ 287 u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */ 288 u8 _resvd1; /* reserved */ 289 u8 d_id[3]; /* FC vNIC only: Target D_ID */ 290 u32 r_a_tov; /* FC vNIC only: R_A_TOV in msec */ 291 u32 e_d_tov; /* FC vNIC only: E_D_TOV in msec */ 292 }; 293 294 /* 295 * Task Management request 296 */ 297 enum fcpio_itmf_tm_req_type { 298 FCPIO_ITMF_ABT_TASK_TERM = 0x01, /* abort task and terminate */ 299 FCPIO_ITMF_ABT_TASK, /* abort task and issue abts */ 300 FCPIO_ITMF_ABT_TASK_SET, /* abort task set */ 301 FCPIO_ITMF_CLR_TASK_SET, /* clear task set */ 302 FCPIO_ITMF_LUN_RESET, /* logical unit reset task mgmt */ 303 FCPIO_ITMF_CLR_ACA, /* Clear ACA condition */ 304 }; 305 306 /* 307 * fcpio_tdata: host -> firmware request 308 * 309 * used for requesting the firmware to send out a read data transfer for a 310 * target command 311 */ 312 struct fcpio_tdata { 313 u16 rx_id; /* FC rx_id of target command */ 314 u16 flags; /* command flags */ 315 u32 rel_offset; /* data sequence relative offset */ 316 u32 sgl_cnt; /* scatter-gather list count */ 317 u32 data_len; /* length of data expected to send */ 318 u64 sgl_addr; /* scatter-gather list address */ 319 }; 320 321 /* 322 * Command flags 323 */ 324 #define FCPIO_TDATA_SCSI_RSP 0x01 /* send a scsi resp. after last frame */ 325 326 /* 327 * fcpio_txrdy: host -> firmware request 328 * 329 * used for requesting the firmware to send out a write data transfer for a 330 * target command 331 */ 332 struct fcpio_txrdy { 333 u16 rx_id; /* FC rx_id of target command */ 334 u16 _resvd0; /* reserved */ 335 u32 rel_offset; /* data sequence relative offset */ 336 u32 sgl_cnt; /* scatter-gather list count */ 337 u32 data_len; /* length of data expected to send */ 338 u64 sgl_addr; /* scatter-gather list address */ 339 }; 340 341 /* 342 * fcpio_trsp: host -> firmware request 343 * 344 * used for requesting the firmware to send out a response for a target 345 * command 346 */ 347 struct fcpio_trsp { 348 u16 rx_id; /* FC rx_id of target command */ 349 u16 _resvd0; /* reserved */ 350 u32 sense_len; /* sense data buffer length */ 351 u64 sense_addr; /* sense data buffer address */ 352 u16 _resvd1; /* reserved */ 353 u8 flags; /* response request flags */ 354 u8 scsi_status; /* SCSI status */ 355 u32 residual; /* SCSI data residual value of I/O */ 356 }; 357 358 /* 359 * resposnse request flags 360 */ 361 #define FCPIO_TRSP_RESID_UNDER 0x08 /* residual is valid and is underflow */ 362 #define FCPIO_TRSP_RESID_OVER 0x04 /* residual is valid and is overflow */ 363 364 /* 365 * fcpio_ttmf_ack: host -> firmware response 366 * 367 * used by the host to indicate to the firmware it has received and processed 368 * the target tmf request 369 */ 370 struct fcpio_ttmf_ack { 371 u16 rx_id; /* FC rx_id of target command */ 372 u16 _resvd0; /* reserved */ 373 u32 tmf_status; /* SCSI task management status */ 374 }; 375 376 /* 377 * fcpio_tabort: host -> firmware request 378 * 379 * used by the host to request the firmware to abort a target request that was 380 * received by the firmware 381 */ 382 struct fcpio_tabort { 383 u16 rx_id; /* rx_id of the target request */ 384 }; 385 386 /* 387 * fcpio_reset: host -> firmware request 388 * 389 * used by the host to signal a reset of the driver to the firmware 390 * and to request firmware to clean up all outstanding I/O 391 */ 392 struct fcpio_reset { 393 u32 _resvd; 394 }; 395 396 enum fcpio_flogi_reg_format_type { 397 FCPIO_FLOGI_REG_DEF_DEST = 0, /* Use the oui | s_id mac format */ 398 FCPIO_FLOGI_REG_GW_DEST, /* Use the fixed gateway mac */ 399 }; 400 401 /* 402 * fcpio_flogi_reg: host -> firmware request 403 * 404 * fc vnic only 405 * used by the host to notify the firmware of the lif's s_id 406 * and destination mac address format 407 */ 408 struct fcpio_flogi_reg { 409 u8 format; 410 u8 s_id[3]; /* FC vNIC only: Source S_ID */ 411 u8 gateway_mac[ETH_ALEN]; /* Destination gateway mac */ 412 u16 _resvd; 413 u32 r_a_tov; /* R_A_TOV in msec */ 414 u32 e_d_tov; /* E_D_TOV in msec */ 415 }; 416 417 /* 418 * fcpio_echo: host -> firmware request 419 * 420 * sends a heartbeat echo request to the firmware 421 */ 422 struct fcpio_echo { 423 u32 _resvd; 424 }; 425 426 /* 427 * fcpio_lunmap_req: host -> firmware request 428 * 429 * scsi vnic only 430 * sends a request to retrieve the lunmap table for scsi vnics 431 */ 432 struct fcpio_lunmap_req { 433 u64 addr; /* address of the buffer */ 434 u32 len; /* len of the buffer */ 435 }; 436 437 /* 438 * fcpio_flogi_fip_reg: host -> firmware request 439 * 440 * fc vnic only 441 * used by the host to notify the firmware of the lif's s_id 442 * and destination mac address format 443 */ 444 struct fcpio_flogi_fip_reg { 445 u8 _resvd0; 446 u8 s_id[3]; /* FC vNIC only: Source S_ID */ 447 u8 fcf_mac[ETH_ALEN]; /* FCF Target destination mac */ 448 u16 _resvd1; 449 u32 r_a_tov; /* R_A_TOV in msec */ 450 u32 e_d_tov; /* E_D_TOV in msec */ 451 u8 ha_mac[ETH_ALEN]; /* Host adapter source mac */ 452 u16 _resvd2; 453 }; 454 455 /* 456 * Basic structure for all fcpio structures that are sent from the host to the 457 * firmware. They are 128 bytes per structure. 458 */ 459 #define FCPIO_HOST_REQ_LEN 128 /* expected length of host requests */ 460 461 struct fcpio_host_req { 462 struct fcpio_header hdr; 463 464 union { 465 /* 466 * Defines space needed for request 467 */ 468 u8 buf[FCPIO_HOST_REQ_LEN - sizeof(struct fcpio_header)]; 469 470 /* 471 * Initiator host requests 472 */ 473 struct fcpio_icmnd_16 icmnd_16; 474 struct fcpio_icmnd_32 icmnd_32; 475 struct fcpio_itmf itmf; 476 477 /* 478 * Target host requests 479 */ 480 struct fcpio_tdata tdata; 481 struct fcpio_txrdy txrdy; 482 struct fcpio_trsp trsp; 483 struct fcpio_ttmf_ack ttmf_ack; 484 struct fcpio_tabort tabort; 485 486 /* 487 * Misc requests 488 */ 489 struct fcpio_reset reset; 490 struct fcpio_flogi_reg flogi_reg; 491 struct fcpio_echo echo; 492 struct fcpio_lunmap_req lunmap_req; 493 struct fcpio_flogi_fip_reg flogi_fip_reg; 494 } u; 495 }; 496 497 /* 498 * fcpio_icmnd_cmpl: firmware -> host response 499 * 500 * used for sending the host a response to an initiator command 501 */ 502 struct fcpio_icmnd_cmpl { 503 u8 _resvd0[6]; /* reserved */ 504 u8 flags; /* response flags */ 505 u8 scsi_status; /* SCSI status */ 506 u32 residual; /* SCSI data residual length */ 507 u32 sense_len; /* SCSI sense length */ 508 }; 509 510 /* 511 * response flags 512 */ 513 #define FCPIO_ICMND_CMPL_RESID_UNDER 0x08 /* resid under and valid */ 514 #define FCPIO_ICMND_CMPL_RESID_OVER 0x04 /* resid over and valid */ 515 516 /* 517 * fcpio_itmf_cmpl: firmware -> host response 518 * 519 * used for sending the host a response for a itmf request 520 */ 521 struct fcpio_itmf_cmpl { 522 u32 _resvd; /* reserved */ 523 }; 524 525 /* 526 * fcpio_tcmnd_16: firmware -> host request 527 * 528 * used by the firmware to notify the host of an incoming target SCSI 16-Byte 529 * request 530 */ 531 struct fcpio_tcmnd_16 { 532 u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */ 533 u8 crn; /* SCSI Command Reference No. */ 534 u8 pri_ta; /* SCSI Priority and Task attribute */ 535 u8 _resvd2; /* reserved: should be 0 */ 536 u8 flags; /* command flags */ 537 u8 scsi_cdb[CDB_16]; /* SCSI Cmnd Descriptor Block */ 538 u32 data_len; /* length of data expected */ 539 u8 _resvd1; /* reserved */ 540 u8 s_id[3]; /* FC vNIC only: Source S_ID */ 541 }; 542 543 /* 544 * Priority/Task Attribute settings 545 */ 546 #define FCPIO_TCMND_PTA_SIMPLE 0 /* simple task attribute */ 547 #define FCPIO_TCMND_PTA_HEADQ 1 /* head of queue task attribute */ 548 #define FCPIO_TCMND_PTA_ORDERED 2 /* ordered task attribute */ 549 #define FCPIO_TCMND_PTA_ACA 4 /* auto contingent allegiance */ 550 #define FCPIO_TCMND_PRI_SHIFT 3 /* priority field starts in bit 3 */ 551 552 /* 553 * Command flags 554 */ 555 #define FCPIO_TCMND_RDDATA 0x02 /* read data */ 556 #define FCPIO_TCMND_WRDATA 0x01 /* write data */ 557 558 /* 559 * fcpio_tcmnd_32: firmware -> host request 560 * 561 * used by the firmware to notify the host of an incoming target SCSI 32-Byte 562 * request 563 */ 564 struct fcpio_tcmnd_32 { 565 u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */ 566 u8 crn; /* SCSI Command Reference No. */ 567 u8 pri_ta; /* SCSI Priority and Task attribute */ 568 u8 _resvd2; /* reserved: should be 0 */ 569 u8 flags; /* command flags */ 570 u8 scsi_cdb[CDB_32]; /* SCSI Cmnd Descriptor Block */ 571 u32 data_len; /* length of data expected */ 572 u8 _resvd0; /* reserved */ 573 u8 s_id[3]; /* FC vNIC only: Source S_ID */ 574 }; 575 576 /* 577 * fcpio_tdrsp_cmpl: firmware -> host response 578 * 579 * used by the firmware to notify the host of a response to a host target 580 * command 581 */ 582 struct fcpio_tdrsp_cmpl { 583 u16 rx_id; /* rx_id of the target request */ 584 u16 _resvd0; /* reserved */ 585 }; 586 587 /* 588 * fcpio_ttmf: firmware -> host request 589 * 590 * used by the firmware to notify the host of an incoming task management 591 * function request 592 */ 593 struct fcpio_ttmf { 594 u8 _resvd0; /* reserved */ 595 u8 s_id[3]; /* FC vNIC only: Source S_ID */ 596 u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */ 597 u8 crn; /* SCSI Command Reference No. */ 598 u8 _resvd2[3]; /* reserved */ 599 u32 tmf_type; /* task management request type */ 600 }; 601 602 /* 603 * Task Management request 604 */ 605 #define FCPIO_TTMF_CLR_ACA 0x40 /* Clear ACA condition */ 606 #define FCPIO_TTMF_LUN_RESET 0x10 /* logical unit reset task mgmt */ 607 #define FCPIO_TTMF_CLR_TASK_SET 0x04 /* clear task set */ 608 #define FCPIO_TTMF_ABT_TASK_SET 0x02 /* abort task set */ 609 #define FCPIO_TTMF_ABT_TASK 0x01 /* abort task */ 610 611 /* 612 * fcpio_tabort_cmpl: firmware -> host response 613 * 614 * used by the firmware to respond to a host's tabort request 615 */ 616 struct fcpio_tabort_cmpl { 617 u16 rx_id; /* rx_id of the target request */ 618 u16 _resvd0; /* reserved */ 619 }; 620 621 /* 622 * fcpio_ack: firmware -> host response 623 * 624 * used by firmware to notify the host of the last work request received 625 */ 626 struct fcpio_ack { 627 u16 request_out; /* last host entry received */ 628 u16 _resvd; 629 }; 630 631 /* 632 * fcpio_reset_cmpl: firmware -> host response 633 * 634 * use by firmware to respond to the host's reset request 635 */ 636 struct fcpio_reset_cmpl { 637 u16 vnic_id; 638 }; 639 640 /* 641 * fcpio_flogi_reg_cmpl: firmware -> host response 642 * 643 * fc vnic only 644 * response to the fcpio_flogi_reg request 645 */ 646 struct fcpio_flogi_reg_cmpl { 647 u32 _resvd; 648 }; 649 650 /* 651 * fcpio_echo_cmpl: firmware -> host response 652 * 653 * response to the fcpio_echo request 654 */ 655 struct fcpio_echo_cmpl { 656 u32 _resvd; 657 }; 658 659 /* 660 * fcpio_lunmap_chng: firmware -> host notification 661 * 662 * scsi vnic only 663 * notifies the host that the lunmap tables have changed 664 */ 665 struct fcpio_lunmap_chng { 666 u32 _resvd; 667 }; 668 669 /* 670 * fcpio_lunmap_req_cmpl: firmware -> host response 671 * 672 * scsi vnic only 673 * response for lunmap table request from the host 674 */ 675 struct fcpio_lunmap_req_cmpl { 676 u32 _resvd; 677 }; 678 679 /* 680 * Basic structure for all fcpio structures that are sent from the firmware to 681 * the host. They are 64 bytes per structure. 682 */ 683 #define FCPIO_FW_REQ_LEN 64 /* expected length of fw requests */ 684 struct fcpio_fw_req { 685 struct fcpio_header hdr; 686 687 union { 688 /* 689 * Defines space needed for request 690 */ 691 u8 buf[FCPIO_FW_REQ_LEN - sizeof(struct fcpio_header)]; 692 693 /* 694 * Initiator firmware responses 695 */ 696 struct fcpio_icmnd_cmpl icmnd_cmpl; 697 struct fcpio_itmf_cmpl itmf_cmpl; 698 699 /* 700 * Target firmware new requests 701 */ 702 struct fcpio_tcmnd_16 tcmnd_16; 703 struct fcpio_tcmnd_32 tcmnd_32; 704 705 /* 706 * Target firmware responses 707 */ 708 struct fcpio_tdrsp_cmpl tdrsp_cmpl; 709 struct fcpio_ttmf ttmf; 710 struct fcpio_tabort_cmpl tabort_cmpl; 711 712 /* 713 * Firmware response to work received 714 */ 715 struct fcpio_ack ack; 716 717 /* 718 * Misc requests 719 */ 720 struct fcpio_reset_cmpl reset_cmpl; 721 struct fcpio_flogi_reg_cmpl flogi_reg_cmpl; 722 struct fcpio_echo_cmpl echo_cmpl; 723 struct fcpio_lunmap_chng lunmap_chng; 724 struct fcpio_lunmap_req_cmpl lunmap_req_cmpl; 725 } u; 726 }; 727 728 /* 729 * Access routines to encode and decode the color bit, which is the most 730 * significant bit of the MSB of the structure 731 */ 732 static inline void fcpio_color_enc(struct fcpio_fw_req *fw_req, u8 color) 733 { 734 u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1; 735 736 if (color) 737 *c |= 0x80; 738 else 739 *c &= ~0x80; 740 } 741 742 static inline void fcpio_color_dec(struct fcpio_fw_req *fw_req, u8 *color) 743 { 744 u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1; 745 746 *color = *c >> 7; 747 748 /* 749 * Make sure color bit is read from desc *before* other fields 750 * are read from desc. Hardware guarantees color bit is last 751 * bit (byte) written. Adding the rmb() prevents the compiler 752 * and/or CPU from reordering the reads which would potentially 753 * result in reading stale values. 754 */ 755 756 rmb(); 757 758 } 759 760 /* 761 * Lunmap table entry for scsi vnics 762 */ 763 #define FCPIO_LUNMAP_TABLE_SIZE 256 764 #define FCPIO_FLAGS_LUNMAP_VALID 0x80 765 #define FCPIO_FLAGS_BOOT 0x01 766 struct fcpio_lunmap_entry { 767 u8 bus; 768 u8 target; 769 u8 lun; 770 u8 path_cnt; 771 u16 flags; 772 u16 update_cnt; 773 }; 774 775 struct fcpio_lunmap_tbl { 776 u32 update_cnt; 777 struct fcpio_lunmap_entry lunmaps[FCPIO_LUNMAP_TABLE_SIZE]; 778 }; 779 780 #endif /* _FCPIO_H_ */ 781