cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fcpio.h (22899B)


      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 */
     39enum 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 */
     83enum 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 */
    126struct 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
    136static inline void
    137fcpio_tag_id_enc(struct fcpio_tag *tag, u32 id)
    138{
    139	tag->u.req_id = id;
    140}
    141
    142static inline void
    143fcpio_tag_id_dec(struct fcpio_tag *tag, u32 *id)
    144{
    145	*id = tag->u.req_id;
    146}
    147
    148static inline void
    149fcpio_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
    155static inline void
    156fcpio_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 */
    166struct 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
    173static inline void
    174fcpio_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
    184static inline void
    185fcpio_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 */
    203struct 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 */
    251struct 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 */
    282struct 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 */
    297enum 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 */
    312struct 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 */
    332struct 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 */
    347struct 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 */
    370struct 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 */
    382struct 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 */
    392struct fcpio_reset {
    393	u32   _resvd;
    394};
    395
    396enum 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 */
    408struct 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 */
    422struct 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 */
    432struct 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 */
    444struct 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
    461struct 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 */
    502struct 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 */
    521struct 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 */
    531struct 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 */
    564struct 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 */
    582struct 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 */
    593struct 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 */
    616struct 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 */
    626struct 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 */
    636struct 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 */
    646struct 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 */
    655struct 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 */
    665struct 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 */
    675struct 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 */
    684struct 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 */
    732static 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
    742static 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
    766struct 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
    775struct fcpio_lunmap_tbl {
    776	u32                   update_cnt;
    777	struct fcpio_lunmap_entry   lunmaps[FCPIO_LUNMAP_TABLE_SIZE];
    778};
    779
    780#endif /* _FCPIO_H_ */