123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780 |
- /*
- * Copyright 2008 Cisco Systems, Inc. All rights reserved.
- * Copyright 2007 Nuova Systems, Inc. All rights reserved.
- *
- * This program is free software; you may redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
- #ifndef _FCPIO_H_
- #define _FCPIO_H_
- #include <linux/if_ether.h>
- /*
- * This header file includes all of the data structures used for
- * communication by the host driver to the fcp firmware.
- */
- /*
- * Exchange and sequence id space allocated to the host driver
- */
- #define FCPIO_HOST_EXCH_RANGE_START 0x1000
- #define FCPIO_HOST_EXCH_RANGE_END 0x1fff
- #define FCPIO_HOST_SEQ_ID_RANGE_START 0x80
- #define FCPIO_HOST_SEQ_ID_RANGE_END 0xff
- /*
- * Command entry type
- */
- enum fcpio_type {
- /*
- * Initiator request types
- */
- FCPIO_ICMND_16 = 0x1,
- FCPIO_ICMND_32,
- FCPIO_ICMND_CMPL,
- FCPIO_ITMF,
- FCPIO_ITMF_CMPL,
- /*
- * Target request types
- */
- FCPIO_TCMND_16 = 0x11,
- FCPIO_TCMND_32,
- FCPIO_TDATA,
- FCPIO_TXRDY,
- FCPIO_TRSP,
- FCPIO_TDRSP_CMPL,
- FCPIO_TTMF,
- FCPIO_TTMF_ACK,
- FCPIO_TABORT,
- FCPIO_TABORT_CMPL,
- /*
- * Misc request types
- */
- FCPIO_ACK = 0x20,
- FCPIO_RESET,
- FCPIO_RESET_CMPL,
- FCPIO_FLOGI_REG,
- FCPIO_FLOGI_REG_CMPL,
- FCPIO_ECHO,
- FCPIO_ECHO_CMPL,
- FCPIO_LUNMAP_CHNG,
- FCPIO_LUNMAP_REQ,
- FCPIO_LUNMAP_REQ_CMPL,
- FCPIO_FLOGI_FIP_REG,
- FCPIO_FLOGI_FIP_REG_CMPL,
- };
- /*
- * Header status codes from the firmware
- */
- enum fcpio_status {
- FCPIO_SUCCESS = 0, /* request was successful */
- /*
- * If a request to the firmware is rejected, the original request
- * header will be returned with the status set to one of the following:
- */
- FCPIO_INVALID_HEADER, /* header contains invalid data */
- FCPIO_OUT_OF_RESOURCE, /* out of resources to complete request */
- FCPIO_INVALID_PARAM, /* some parameter in request is invalid */
- FCPIO_REQ_NOT_SUPPORTED, /* request type is not supported */
- FCPIO_IO_NOT_FOUND, /* requested I/O was not found */
- /*
- * Once a request is processed, the firmware will usually return
- * a cmpl message type. In cases where errors occurred,
- * the header status field would be filled in with one of the following:
- */
- FCPIO_ABORTED = 0x41, /* request was aborted */
- FCPIO_TIMEOUT, /* request was timed out */
- FCPIO_SGL_INVALID, /* request was aborted due to sgl error */
- FCPIO_MSS_INVALID, /* request was aborted due to mss error */
- FCPIO_DATA_CNT_MISMATCH, /* recv/sent more/less data than exp. */
- FCPIO_FW_ERR, /* request was terminated due to fw error */
- FCPIO_ITMF_REJECTED, /* itmf req was rejected by remote node */
- FCPIO_ITMF_FAILED, /* itmf req was failed by remote node */
- FCPIO_ITMF_INCORRECT_LUN, /* itmf req targeted incorrect LUN */
- FCPIO_CMND_REJECTED, /* request was invalid and rejected */
- FCPIO_NO_PATH_AVAIL, /* no paths to the lun was available */
- FCPIO_PATH_FAILED, /* i/o sent to current path failed */
- FCPIO_LUNMAP_CHNG_PEND, /* i/o rejected due to lunmap change */
- };
- /*
- * The header command tag. All host requests will use the "tag" field
- * to mark commands with a unique tag. When the firmware responds to
- * a host request, it will copy the tag field into the response.
- *
- * The only firmware requests that will use the rx_id/ox_id fields instead
- * of the tag field will be the target command and target task management
- * requests. These two requests do not have corresponding host requests
- * since they come directly from the FC initiator on the network.
- */
- struct fcpio_tag {
- union {
- u32 req_id;
- struct {
- u16 rx_id;
- u16 ox_id;
- } ex_id;
- } u;
- };
- static inline void
- fcpio_tag_id_enc(struct fcpio_tag *tag, u32 id)
- {
- tag->u.req_id = id;
- }
- static inline void
- fcpio_tag_id_dec(struct fcpio_tag *tag, u32 *id)
- {
- *id = tag->u.req_id;
- }
- static inline void
- fcpio_tag_exid_enc(struct fcpio_tag *tag, u16 ox_id, u16 rx_id)
- {
- tag->u.ex_id.rx_id = rx_id;
- tag->u.ex_id.ox_id = ox_id;
- }
- static inline void
- fcpio_tag_exid_dec(struct fcpio_tag *tag, u16 *ox_id, u16 *rx_id)
- {
- *rx_id = tag->u.ex_id.rx_id;
- *ox_id = tag->u.ex_id.ox_id;
- }
- /*
- * The header for an fcpio request, whether from the firmware or from the
- * host driver
- */
- struct fcpio_header {
- u8 type; /* enum fcpio_type */
- u8 status; /* header status entry */
- u16 _resvd; /* reserved */
- struct fcpio_tag tag; /* header tag */
- };
- static inline void
- fcpio_header_enc(struct fcpio_header *hdr,
- u8 type, u8 status,
- struct fcpio_tag tag)
- {
- hdr->type = type;
- hdr->status = status;
- hdr->_resvd = 0;
- hdr->tag = tag;
- }
- static inline void
- fcpio_header_dec(struct fcpio_header *hdr,
- u8 *type, u8 *status,
- struct fcpio_tag *tag)
- {
- *type = hdr->type;
- *status = hdr->status;
- *tag = hdr->tag;
- }
- #define CDB_16 16
- #define CDB_32 32
- #define LUN_ADDRESS 8
- /*
- * fcpio_icmnd_16: host -> firmware request
- *
- * used for sending out an initiator SCSI 16-byte command
- */
- struct fcpio_icmnd_16 {
- u32 lunmap_id; /* index into lunmap table */
- u8 special_req_flags; /* special exchange request flags */
- u8 _resvd0[3]; /* reserved */
- u32 sgl_cnt; /* scatter-gather list count */
- u32 sense_len; /* sense buffer length */
- u64 sgl_addr; /* scatter-gather list addr */
- u64 sense_addr; /* sense buffer address */
- u8 crn; /* SCSI Command Reference No. */
- u8 pri_ta; /* SCSI Priority and Task attribute */
- u8 _resvd1; /* reserved: should be 0 */
- u8 flags; /* command flags */
- u8 scsi_cdb[CDB_16]; /* SCSI Cmnd Descriptor Block */
- u32 data_len; /* length of data expected */
- u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */
- u8 _resvd2; /* reserved */
- u8 d_id[3]; /* FC vNIC only: Target D_ID */
- u16 mss; /* FC vNIC only: max burst */
- u16 _resvd3; /* reserved */
- u32 r_a_tov; /* FC vNIC only: Res. Alloc Timeout */
- u32 e_d_tov; /* FC vNIC only: Err Detect Timeout */
- };
- /*
- * Special request flags
- */
- #define FCPIO_ICMND_SRFLAG_RETRY 0x01 /* Enable Retry handling on exchange */
- /*
- * Priority/Task Attribute settings
- */
- #define FCPIO_ICMND_PTA_SIMPLE 0 /* simple task attribute */
- #define FCPIO_ICMND_PTA_HEADQ 1 /* head of queue task attribute */
- #define FCPIO_ICMND_PTA_ORDERED 2 /* ordered task attribute */
- #define FCPIO_ICMND_PTA_ACA 4 /* auto contingent allegiance */
- #define FCPIO_ICMND_PRI_SHIFT 3 /* priority field starts in bit 3 */
- /*
- * Command flags
- */
- #define FCPIO_ICMND_RDDATA 0x02 /* read data */
- #define FCPIO_ICMND_WRDATA 0x01 /* write data */
- /*
- * fcpio_icmnd_32: host -> firmware request
- *
- * used for sending out an initiator SCSI 32-byte command
- */
- struct fcpio_icmnd_32 {
- u32 lunmap_id; /* index into lunmap table */
- u8 special_req_flags; /* special exchange request flags */
- u8 _resvd0[3]; /* reserved */
- u32 sgl_cnt; /* scatter-gather list count */
- u32 sense_len; /* sense buffer length */
- u64 sgl_addr; /* scatter-gather list addr */
- u64 sense_addr; /* sense buffer address */
- u8 crn; /* SCSI Command Reference No. */
- u8 pri_ta; /* SCSI Priority and Task attribute */
- u8 _resvd1; /* reserved: should be 0 */
- u8 flags; /* command flags */
- u8 scsi_cdb[CDB_32]; /* SCSI Cmnd Descriptor Block */
- u32 data_len; /* length of data expected */
- u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */
- u8 _resvd2; /* reserved */
- u8 d_id[3]; /* FC vNIC only: Target D_ID */
- u16 mss; /* FC vNIC only: max burst */
- u16 _resvd3; /* reserved */
- u32 r_a_tov; /* FC vNIC only: Res. Alloc Timeout */
- u32 e_d_tov; /* FC vNIC only: Error Detect Timeout */
- };
- /*
- * fcpio_itmf: host -> firmware request
- *
- * used for requesting the firmware to abort a request and/or send out
- * a task management function
- *
- * The t_tag field is only needed when the request type is ABT_TASK.
- */
- struct fcpio_itmf {
- u32 lunmap_id; /* index into lunmap table */
- u32 tm_req; /* SCSI Task Management request */
- u32 t_tag; /* header tag of fcpio to be aborted */
- u32 _resvd; /* _reserved */
- u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */
- u8 _resvd1; /* reserved */
- u8 d_id[3]; /* FC vNIC only: Target D_ID */
- u32 r_a_tov; /* FC vNIC only: R_A_TOV in msec */
- u32 e_d_tov; /* FC vNIC only: E_D_TOV in msec */
- };
- /*
- * Task Management request
- */
- enum fcpio_itmf_tm_req_type {
- FCPIO_ITMF_ABT_TASK_TERM = 0x01, /* abort task and terminate */
- FCPIO_ITMF_ABT_TASK, /* abort task and issue abts */
- FCPIO_ITMF_ABT_TASK_SET, /* abort task set */
- FCPIO_ITMF_CLR_TASK_SET, /* clear task set */
- FCPIO_ITMF_LUN_RESET, /* logical unit reset task mgmt */
- FCPIO_ITMF_CLR_ACA, /* Clear ACA condition */
- };
- /*
- * fcpio_tdata: host -> firmware request
- *
- * used for requesting the firmware to send out a read data transfer for a
- * target command
- */
- struct fcpio_tdata {
- u16 rx_id; /* FC rx_id of target command */
- u16 flags; /* command flags */
- u32 rel_offset; /* data sequence relative offset */
- u32 sgl_cnt; /* scatter-gather list count */
- u32 data_len; /* length of data expected to send */
- u64 sgl_addr; /* scatter-gather list address */
- };
- /*
- * Command flags
- */
- #define FCPIO_TDATA_SCSI_RSP 0x01 /* send a scsi resp. after last frame */
- /*
- * fcpio_txrdy: host -> firmware request
- *
- * used for requesting the firmware to send out a write data transfer for a
- * target command
- */
- struct fcpio_txrdy {
- u16 rx_id; /* FC rx_id of target command */
- u16 _resvd0; /* reserved */
- u32 rel_offset; /* data sequence relative offset */
- u32 sgl_cnt; /* scatter-gather list count */
- u32 data_len; /* length of data expected to send */
- u64 sgl_addr; /* scatter-gather list address */
- };
- /*
- * fcpio_trsp: host -> firmware request
- *
- * used for requesting the firmware to send out a response for a target
- * command
- */
- struct fcpio_trsp {
- u16 rx_id; /* FC rx_id of target command */
- u16 _resvd0; /* reserved */
- u32 sense_len; /* sense data buffer length */
- u64 sense_addr; /* sense data buffer address */
- u16 _resvd1; /* reserved */
- u8 flags; /* response request flags */
- u8 scsi_status; /* SCSI status */
- u32 residual; /* SCSI data residual value of I/O */
- };
- /*
- * resposnse request flags
- */
- #define FCPIO_TRSP_RESID_UNDER 0x08 /* residual is valid and is underflow */
- #define FCPIO_TRSP_RESID_OVER 0x04 /* residual is valid and is overflow */
- /*
- * fcpio_ttmf_ack: host -> firmware response
- *
- * used by the host to indicate to the firmware it has received and processed
- * the target tmf request
- */
- struct fcpio_ttmf_ack {
- u16 rx_id; /* FC rx_id of target command */
- u16 _resvd0; /* reserved */
- u32 tmf_status; /* SCSI task management status */
- };
- /*
- * fcpio_tabort: host -> firmware request
- *
- * used by the host to request the firmware to abort a target request that was
- * received by the firmware
- */
- struct fcpio_tabort {
- u16 rx_id; /* rx_id of the target request */
- };
- /*
- * fcpio_reset: host -> firmware request
- *
- * used by the host to signal a reset of the driver to the firmware
- * and to request firmware to clean up all outstanding I/O
- */
- struct fcpio_reset {
- u32 _resvd;
- };
- enum fcpio_flogi_reg_format_type {
- FCPIO_FLOGI_REG_DEF_DEST = 0, /* Use the oui | s_id mac format */
- FCPIO_FLOGI_REG_GW_DEST, /* Use the fixed gateway mac */
- };
- /*
- * fcpio_flogi_reg: host -> firmware request
- *
- * fc vnic only
- * used by the host to notify the firmware of the lif's s_id
- * and destination mac address format
- */
- struct fcpio_flogi_reg {
- u8 format;
- u8 s_id[3]; /* FC vNIC only: Source S_ID */
- u8 gateway_mac[ETH_ALEN]; /* Destination gateway mac */
- u16 _resvd;
- u32 r_a_tov; /* R_A_TOV in msec */
- u32 e_d_tov; /* E_D_TOV in msec */
- };
- /*
- * fcpio_echo: host -> firmware request
- *
- * sends a heartbeat echo request to the firmware
- */
- struct fcpio_echo {
- u32 _resvd;
- };
- /*
- * fcpio_lunmap_req: host -> firmware request
- *
- * scsi vnic only
- * sends a request to retrieve the lunmap table for scsi vnics
- */
- struct fcpio_lunmap_req {
- u64 addr; /* address of the buffer */
- u32 len; /* len of the buffer */
- };
- /*
- * fcpio_flogi_fip_reg: host -> firmware request
- *
- * fc vnic only
- * used by the host to notify the firmware of the lif's s_id
- * and destination mac address format
- */
- struct fcpio_flogi_fip_reg {
- u8 _resvd0;
- u8 s_id[3]; /* FC vNIC only: Source S_ID */
- u8 fcf_mac[ETH_ALEN]; /* FCF Target destination mac */
- u16 _resvd1;
- u32 r_a_tov; /* R_A_TOV in msec */
- u32 e_d_tov; /* E_D_TOV in msec */
- u8 ha_mac[ETH_ALEN]; /* Host adapter source mac */
- u16 _resvd2;
- };
- /*
- * Basic structure for all fcpio structures that are sent from the host to the
- * firmware. They are 128 bytes per structure.
- */
- #define FCPIO_HOST_REQ_LEN 128 /* expected length of host requests */
- struct fcpio_host_req {
- struct fcpio_header hdr;
- union {
- /*
- * Defines space needed for request
- */
- u8 buf[FCPIO_HOST_REQ_LEN - sizeof(struct fcpio_header)];
- /*
- * Initiator host requests
- */
- struct fcpio_icmnd_16 icmnd_16;
- struct fcpio_icmnd_32 icmnd_32;
- struct fcpio_itmf itmf;
- /*
- * Target host requests
- */
- struct fcpio_tdata tdata;
- struct fcpio_txrdy txrdy;
- struct fcpio_trsp trsp;
- struct fcpio_ttmf_ack ttmf_ack;
- struct fcpio_tabort tabort;
- /*
- * Misc requests
- */
- struct fcpio_reset reset;
- struct fcpio_flogi_reg flogi_reg;
- struct fcpio_echo echo;
- struct fcpio_lunmap_req lunmap_req;
- struct fcpio_flogi_fip_reg flogi_fip_reg;
- } u;
- };
- /*
- * fcpio_icmnd_cmpl: firmware -> host response
- *
- * used for sending the host a response to an initiator command
- */
- struct fcpio_icmnd_cmpl {
- u8 _resvd0[6]; /* reserved */
- u8 flags; /* response flags */
- u8 scsi_status; /* SCSI status */
- u32 residual; /* SCSI data residual length */
- u32 sense_len; /* SCSI sense length */
- };
- /*
- * response flags
- */
- #define FCPIO_ICMND_CMPL_RESID_UNDER 0x08 /* resid under and valid */
- #define FCPIO_ICMND_CMPL_RESID_OVER 0x04 /* resid over and valid */
- /*
- * fcpio_itmf_cmpl: firmware -> host response
- *
- * used for sending the host a response for a itmf request
- */
- struct fcpio_itmf_cmpl {
- u32 _resvd; /* reserved */
- };
- /*
- * fcpio_tcmnd_16: firmware -> host request
- *
- * used by the firmware to notify the host of an incoming target SCSI 16-Byte
- * request
- */
- struct fcpio_tcmnd_16 {
- u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */
- u8 crn; /* SCSI Command Reference No. */
- u8 pri_ta; /* SCSI Priority and Task attribute */
- u8 _resvd2; /* reserved: should be 0 */
- u8 flags; /* command flags */
- u8 scsi_cdb[CDB_16]; /* SCSI Cmnd Descriptor Block */
- u32 data_len; /* length of data expected */
- u8 _resvd1; /* reserved */
- u8 s_id[3]; /* FC vNIC only: Source S_ID */
- };
- /*
- * Priority/Task Attribute settings
- */
- #define FCPIO_TCMND_PTA_SIMPLE 0 /* simple task attribute */
- #define FCPIO_TCMND_PTA_HEADQ 1 /* head of queue task attribute */
- #define FCPIO_TCMND_PTA_ORDERED 2 /* ordered task attribute */
- #define FCPIO_TCMND_PTA_ACA 4 /* auto contingent allegiance */
- #define FCPIO_TCMND_PRI_SHIFT 3 /* priority field starts in bit 3 */
- /*
- * Command flags
- */
- #define FCPIO_TCMND_RDDATA 0x02 /* read data */
- #define FCPIO_TCMND_WRDATA 0x01 /* write data */
- /*
- * fcpio_tcmnd_32: firmware -> host request
- *
- * used by the firmware to notify the host of an incoming target SCSI 32-Byte
- * request
- */
- struct fcpio_tcmnd_32 {
- u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */
- u8 crn; /* SCSI Command Reference No. */
- u8 pri_ta; /* SCSI Priority and Task attribute */
- u8 _resvd2; /* reserved: should be 0 */
- u8 flags; /* command flags */
- u8 scsi_cdb[CDB_32]; /* SCSI Cmnd Descriptor Block */
- u32 data_len; /* length of data expected */
- u8 _resvd0; /* reserved */
- u8 s_id[3]; /* FC vNIC only: Source S_ID */
- };
- /*
- * fcpio_tdrsp_cmpl: firmware -> host response
- *
- * used by the firmware to notify the host of a response to a host target
- * command
- */
- struct fcpio_tdrsp_cmpl {
- u16 rx_id; /* rx_id of the target request */
- u16 _resvd0; /* reserved */
- };
- /*
- * fcpio_ttmf: firmware -> host request
- *
- * used by the firmware to notify the host of an incoming task management
- * function request
- */
- struct fcpio_ttmf {
- u8 _resvd0; /* reserved */
- u8 s_id[3]; /* FC vNIC only: Source S_ID */
- u8 lun[LUN_ADDRESS]; /* FC vNIC only: LUN address */
- u8 crn; /* SCSI Command Reference No. */
- u8 _resvd2[3]; /* reserved */
- u32 tmf_type; /* task management request type */
- };
- /*
- * Task Management request
- */
- #define FCPIO_TTMF_CLR_ACA 0x40 /* Clear ACA condition */
- #define FCPIO_TTMF_LUN_RESET 0x10 /* logical unit reset task mgmt */
- #define FCPIO_TTMF_CLR_TASK_SET 0x04 /* clear task set */
- #define FCPIO_TTMF_ABT_TASK_SET 0x02 /* abort task set */
- #define FCPIO_TTMF_ABT_TASK 0x01 /* abort task */
- /*
- * fcpio_tabort_cmpl: firmware -> host response
- *
- * used by the firmware to respond to a host's tabort request
- */
- struct fcpio_tabort_cmpl {
- u16 rx_id; /* rx_id of the target request */
- u16 _resvd0; /* reserved */
- };
- /*
- * fcpio_ack: firmware -> host response
- *
- * used by firmware to notify the host of the last work request received
- */
- struct fcpio_ack {
- u16 request_out; /* last host entry received */
- u16 _resvd;
- };
- /*
- * fcpio_reset_cmpl: firmware -> host response
- *
- * use by firmware to respond to the host's reset request
- */
- struct fcpio_reset_cmpl {
- u16 vnic_id;
- };
- /*
- * fcpio_flogi_reg_cmpl: firmware -> host response
- *
- * fc vnic only
- * response to the fcpio_flogi_reg request
- */
- struct fcpio_flogi_reg_cmpl {
- u32 _resvd;
- };
- /*
- * fcpio_echo_cmpl: firmware -> host response
- *
- * response to the fcpio_echo request
- */
- struct fcpio_echo_cmpl {
- u32 _resvd;
- };
- /*
- * fcpio_lunmap_chng: firmware -> host notification
- *
- * scsi vnic only
- * notifies the host that the lunmap tables have changed
- */
- struct fcpio_lunmap_chng {
- u32 _resvd;
- };
- /*
- * fcpio_lunmap_req_cmpl: firmware -> host response
- *
- * scsi vnic only
- * response for lunmap table request from the host
- */
- struct fcpio_lunmap_req_cmpl {
- u32 _resvd;
- };
- /*
- * Basic structure for all fcpio structures that are sent from the firmware to
- * the host. They are 64 bytes per structure.
- */
- #define FCPIO_FW_REQ_LEN 64 /* expected length of fw requests */
- struct fcpio_fw_req {
- struct fcpio_header hdr;
- union {
- /*
- * Defines space needed for request
- */
- u8 buf[FCPIO_FW_REQ_LEN - sizeof(struct fcpio_header)];
- /*
- * Initiator firmware responses
- */
- struct fcpio_icmnd_cmpl icmnd_cmpl;
- struct fcpio_itmf_cmpl itmf_cmpl;
- /*
- * Target firmware new requests
- */
- struct fcpio_tcmnd_16 tcmnd_16;
- struct fcpio_tcmnd_32 tcmnd_32;
- /*
- * Target firmware responses
- */
- struct fcpio_tdrsp_cmpl tdrsp_cmpl;
- struct fcpio_ttmf ttmf;
- struct fcpio_tabort_cmpl tabort_cmpl;
- /*
- * Firmware response to work received
- */
- struct fcpio_ack ack;
- /*
- * Misc requests
- */
- struct fcpio_reset_cmpl reset_cmpl;
- struct fcpio_flogi_reg_cmpl flogi_reg_cmpl;
- struct fcpio_echo_cmpl echo_cmpl;
- struct fcpio_lunmap_chng lunmap_chng;
- struct fcpio_lunmap_req_cmpl lunmap_req_cmpl;
- } u;
- };
- /*
- * Access routines to encode and decode the color bit, which is the most
- * significant bit of the MSB of the structure
- */
- static inline void fcpio_color_enc(struct fcpio_fw_req *fw_req, u8 color)
- {
- u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1;
- if (color)
- *c |= 0x80;
- else
- *c &= ~0x80;
- }
- static inline void fcpio_color_dec(struct fcpio_fw_req *fw_req, u8 *color)
- {
- u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1;
- *color = *c >> 7;
- /*
- * Make sure color bit is read from desc *before* other fields
- * are read from desc. Hardware guarantees color bit is last
- * bit (byte) written. Adding the rmb() prevents the compiler
- * and/or CPU from reordering the reads which would potentially
- * result in reading stale values.
- */
- rmb();
- }
- /*
- * Lunmap table entry for scsi vnics
- */
- #define FCPIO_LUNMAP_TABLE_SIZE 256
- #define FCPIO_FLAGS_LUNMAP_VALID 0x80
- #define FCPIO_FLAGS_BOOT 0x01
- struct fcpio_lunmap_entry {
- u8 bus;
- u8 target;
- u8 lun;
- u8 path_cnt;
- u16 flags;
- u16 update_cnt;
- };
- struct fcpio_lunmap_tbl {
- u32 update_cnt;
- struct fcpio_lunmap_entry lunmaps[FCPIO_LUNMAP_TABLE_SIZE];
- };
- #endif /* _FCPIO_H_ */
|