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