xref: /kernel/linux/linux-6.6/drivers/scsi/fnic/fcpio.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2008 Cisco Systems, Inc.  All rights reserved.
462306a36Sopenharmony_ci * Copyright 2007 Nuova Systems, Inc.  All rights reserved.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#ifndef _FCPIO_H_
762306a36Sopenharmony_ci#define _FCPIO_H_
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/if_ether.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/*
1262306a36Sopenharmony_ci * This header file includes all of the data structures used for
1362306a36Sopenharmony_ci * communication by the host driver to the fcp firmware.
1462306a36Sopenharmony_ci */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/*
1762306a36Sopenharmony_ci * Exchange and sequence id space allocated to the host driver
1862306a36Sopenharmony_ci */
1962306a36Sopenharmony_ci#define FCPIO_HOST_EXCH_RANGE_START         0x1000
2062306a36Sopenharmony_ci#define FCPIO_HOST_EXCH_RANGE_END           0x1fff
2162306a36Sopenharmony_ci#define FCPIO_HOST_SEQ_ID_RANGE_START       0x80
2262306a36Sopenharmony_ci#define FCPIO_HOST_SEQ_ID_RANGE_END         0xff
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/*
2562306a36Sopenharmony_ci * Command entry type
2662306a36Sopenharmony_ci */
2762306a36Sopenharmony_cienum fcpio_type {
2862306a36Sopenharmony_ci	/*
2962306a36Sopenharmony_ci	 * Initiator request types
3062306a36Sopenharmony_ci	 */
3162306a36Sopenharmony_ci	FCPIO_ICMND_16 = 0x1,
3262306a36Sopenharmony_ci	FCPIO_ICMND_32,
3362306a36Sopenharmony_ci	FCPIO_ICMND_CMPL,
3462306a36Sopenharmony_ci	FCPIO_ITMF,
3562306a36Sopenharmony_ci	FCPIO_ITMF_CMPL,
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	/*
3862306a36Sopenharmony_ci	 * Target request types
3962306a36Sopenharmony_ci	 */
4062306a36Sopenharmony_ci	FCPIO_TCMND_16 = 0x11,
4162306a36Sopenharmony_ci	FCPIO_TCMND_32,
4262306a36Sopenharmony_ci	FCPIO_TDATA,
4362306a36Sopenharmony_ci	FCPIO_TXRDY,
4462306a36Sopenharmony_ci	FCPIO_TRSP,
4562306a36Sopenharmony_ci	FCPIO_TDRSP_CMPL,
4662306a36Sopenharmony_ci	FCPIO_TTMF,
4762306a36Sopenharmony_ci	FCPIO_TTMF_ACK,
4862306a36Sopenharmony_ci	FCPIO_TABORT,
4962306a36Sopenharmony_ci	FCPIO_TABORT_CMPL,
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	/*
5262306a36Sopenharmony_ci	 * Misc request types
5362306a36Sopenharmony_ci	 */
5462306a36Sopenharmony_ci	FCPIO_ACK = 0x20,
5562306a36Sopenharmony_ci	FCPIO_RESET,
5662306a36Sopenharmony_ci	FCPIO_RESET_CMPL,
5762306a36Sopenharmony_ci	FCPIO_FLOGI_REG,
5862306a36Sopenharmony_ci	FCPIO_FLOGI_REG_CMPL,
5962306a36Sopenharmony_ci	FCPIO_ECHO,
6062306a36Sopenharmony_ci	FCPIO_ECHO_CMPL,
6162306a36Sopenharmony_ci	FCPIO_LUNMAP_CHNG,
6262306a36Sopenharmony_ci	FCPIO_LUNMAP_REQ,
6362306a36Sopenharmony_ci	FCPIO_LUNMAP_REQ_CMPL,
6462306a36Sopenharmony_ci	FCPIO_FLOGI_FIP_REG,
6562306a36Sopenharmony_ci	FCPIO_FLOGI_FIP_REG_CMPL,
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/*
6962306a36Sopenharmony_ci * Header status codes from the firmware
7062306a36Sopenharmony_ci */
7162306a36Sopenharmony_cienum fcpio_status {
7262306a36Sopenharmony_ci	FCPIO_SUCCESS = 0,              /* request was successful */
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	/*
7562306a36Sopenharmony_ci	 * If a request to the firmware is rejected, the original request
7662306a36Sopenharmony_ci	 * header will be returned with the status set to one of the following:
7762306a36Sopenharmony_ci	 */
7862306a36Sopenharmony_ci	FCPIO_INVALID_HEADER,    /* header contains invalid data */
7962306a36Sopenharmony_ci	FCPIO_OUT_OF_RESOURCE,   /* out of resources to complete request */
8062306a36Sopenharmony_ci	FCPIO_INVALID_PARAM,     /* some parameter in request is invalid */
8162306a36Sopenharmony_ci	FCPIO_REQ_NOT_SUPPORTED, /* request type is not supported */
8262306a36Sopenharmony_ci	FCPIO_IO_NOT_FOUND,      /* requested I/O was not found */
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	/*
8562306a36Sopenharmony_ci	 * Once a request is processed, the firmware will usually return
8662306a36Sopenharmony_ci	 * a cmpl message type.  In cases where errors occurred,
8762306a36Sopenharmony_ci	 * the header status field would be filled in with one of the following:
8862306a36Sopenharmony_ci	 */
8962306a36Sopenharmony_ci	FCPIO_ABORTED = 0x41,     /* request was aborted */
9062306a36Sopenharmony_ci	FCPIO_TIMEOUT,            /* request was timed out */
9162306a36Sopenharmony_ci	FCPIO_SGL_INVALID,        /* request was aborted due to sgl error */
9262306a36Sopenharmony_ci	FCPIO_MSS_INVALID,        /* request was aborted due to mss error */
9362306a36Sopenharmony_ci	FCPIO_DATA_CNT_MISMATCH,  /* recv/sent more/less data than exp. */
9462306a36Sopenharmony_ci	FCPIO_FW_ERR,             /* request was terminated due to fw error */
9562306a36Sopenharmony_ci	FCPIO_ITMF_REJECTED,      /* itmf req was rejected by remote node */
9662306a36Sopenharmony_ci	FCPIO_ITMF_FAILED,        /* itmf req was failed by remote node */
9762306a36Sopenharmony_ci	FCPIO_ITMF_INCORRECT_LUN, /* itmf req targeted incorrect LUN */
9862306a36Sopenharmony_ci	FCPIO_CMND_REJECTED,      /* request was invalid and rejected */
9962306a36Sopenharmony_ci	FCPIO_NO_PATH_AVAIL,      /* no paths to the lun was available */
10062306a36Sopenharmony_ci	FCPIO_PATH_FAILED,        /* i/o sent to current path failed */
10162306a36Sopenharmony_ci	FCPIO_LUNMAP_CHNG_PEND,   /* i/o rejected due to lunmap change */
10262306a36Sopenharmony_ci};
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/*
10562306a36Sopenharmony_ci * The header command tag.  All host requests will use the "tag" field
10662306a36Sopenharmony_ci * to mark commands with a unique tag.  When the firmware responds to
10762306a36Sopenharmony_ci * a host request, it will copy the tag field into the response.
10862306a36Sopenharmony_ci *
10962306a36Sopenharmony_ci * The only firmware requests that will use the rx_id/ox_id fields instead
11062306a36Sopenharmony_ci * of the tag field will be the target command and target task management
11162306a36Sopenharmony_ci * requests.  These two requests do not have corresponding host requests
11262306a36Sopenharmony_ci * since they come directly from the FC initiator on the network.
11362306a36Sopenharmony_ci */
11462306a36Sopenharmony_cistruct fcpio_tag {
11562306a36Sopenharmony_ci	union {
11662306a36Sopenharmony_ci		u32 req_id;
11762306a36Sopenharmony_ci		struct {
11862306a36Sopenharmony_ci			u16 rx_id;
11962306a36Sopenharmony_ci			u16 ox_id;
12062306a36Sopenharmony_ci		} ex_id;
12162306a36Sopenharmony_ci	} u;
12262306a36Sopenharmony_ci};
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_cistatic inline void
12562306a36Sopenharmony_cifcpio_tag_id_enc(struct fcpio_tag *tag, u32 id)
12662306a36Sopenharmony_ci{
12762306a36Sopenharmony_ci	tag->u.req_id = id;
12862306a36Sopenharmony_ci}
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_cistatic inline void
13162306a36Sopenharmony_cifcpio_tag_id_dec(struct fcpio_tag *tag, u32 *id)
13262306a36Sopenharmony_ci{
13362306a36Sopenharmony_ci	*id = tag->u.req_id;
13462306a36Sopenharmony_ci}
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cistatic inline void
13762306a36Sopenharmony_cifcpio_tag_exid_enc(struct fcpio_tag *tag, u16 ox_id, u16 rx_id)
13862306a36Sopenharmony_ci{
13962306a36Sopenharmony_ci	tag->u.ex_id.rx_id = rx_id;
14062306a36Sopenharmony_ci	tag->u.ex_id.ox_id = ox_id;
14162306a36Sopenharmony_ci}
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_cistatic inline void
14462306a36Sopenharmony_cifcpio_tag_exid_dec(struct fcpio_tag *tag, u16 *ox_id, u16 *rx_id)
14562306a36Sopenharmony_ci{
14662306a36Sopenharmony_ci	*rx_id = tag->u.ex_id.rx_id;
14762306a36Sopenharmony_ci	*ox_id = tag->u.ex_id.ox_id;
14862306a36Sopenharmony_ci}
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci/*
15162306a36Sopenharmony_ci * The header for an fcpio request, whether from the firmware or from the
15262306a36Sopenharmony_ci * host driver
15362306a36Sopenharmony_ci */
15462306a36Sopenharmony_cistruct fcpio_header {
15562306a36Sopenharmony_ci	u8            type;           /* enum fcpio_type */
15662306a36Sopenharmony_ci	u8            status;         /* header status entry */
15762306a36Sopenharmony_ci	u16           _resvd;         /* reserved */
15862306a36Sopenharmony_ci	struct fcpio_tag    tag;      /* header tag */
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cistatic inline void
16262306a36Sopenharmony_cifcpio_header_enc(struct fcpio_header *hdr,
16362306a36Sopenharmony_ci		 u8 type, u8 status,
16462306a36Sopenharmony_ci		 struct fcpio_tag tag)
16562306a36Sopenharmony_ci{
16662306a36Sopenharmony_ci	hdr->type = type;
16762306a36Sopenharmony_ci	hdr->status = status;
16862306a36Sopenharmony_ci	hdr->_resvd = 0;
16962306a36Sopenharmony_ci	hdr->tag = tag;
17062306a36Sopenharmony_ci}
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_cistatic inline void
17362306a36Sopenharmony_cifcpio_header_dec(struct fcpio_header *hdr,
17462306a36Sopenharmony_ci		 u8 *type, u8 *status,
17562306a36Sopenharmony_ci		 struct fcpio_tag *tag)
17662306a36Sopenharmony_ci{
17762306a36Sopenharmony_ci	*type = hdr->type;
17862306a36Sopenharmony_ci	*status = hdr->status;
17962306a36Sopenharmony_ci	*tag = hdr->tag;
18062306a36Sopenharmony_ci}
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci#define CDB_16      16
18362306a36Sopenharmony_ci#define CDB_32      32
18462306a36Sopenharmony_ci#define LUN_ADDRESS 8
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci/*
18762306a36Sopenharmony_ci * fcpio_icmnd_16: host -> firmware request
18862306a36Sopenharmony_ci *
18962306a36Sopenharmony_ci * used for sending out an initiator SCSI 16-byte command
19062306a36Sopenharmony_ci */
19162306a36Sopenharmony_cistruct fcpio_icmnd_16 {
19262306a36Sopenharmony_ci	u32	  lunmap_id;		/* index into lunmap table */
19362306a36Sopenharmony_ci	u8	  special_req_flags;	/* special exchange request flags */
19462306a36Sopenharmony_ci	u8	  _resvd0[3];	        /* reserved */
19562306a36Sopenharmony_ci	u32	  sgl_cnt;		/* scatter-gather list count */
19662306a36Sopenharmony_ci	u32	  sense_len;		/* sense buffer length */
19762306a36Sopenharmony_ci	u64	  sgl_addr;		/* scatter-gather list addr */
19862306a36Sopenharmony_ci	u64	  sense_addr;		/* sense buffer address */
19962306a36Sopenharmony_ci	u8	  crn;			/* SCSI Command Reference No. */
20062306a36Sopenharmony_ci	u8	  pri_ta;		/* SCSI Priority and Task attribute */
20162306a36Sopenharmony_ci	u8	  _resvd1;		/* reserved: should be 0 */
20262306a36Sopenharmony_ci	u8	  flags;		/* command flags */
20362306a36Sopenharmony_ci	u8	  scsi_cdb[CDB_16];	/* SCSI Cmnd Descriptor Block */
20462306a36Sopenharmony_ci	u32	  data_len;		/* length of data expected */
20562306a36Sopenharmony_ci	u8	  lun[LUN_ADDRESS];	/* FC vNIC only: LUN address */
20662306a36Sopenharmony_ci	u8	  _resvd2;		/* reserved */
20762306a36Sopenharmony_ci	u8	  d_id[3];		/* FC vNIC only: Target D_ID */
20862306a36Sopenharmony_ci	u16	  mss;			/* FC vNIC only: max burst */
20962306a36Sopenharmony_ci	u16	  _resvd3;		/* reserved */
21062306a36Sopenharmony_ci	u32	  r_a_tov;		/* FC vNIC only: Res. Alloc Timeout */
21162306a36Sopenharmony_ci	u32	  e_d_tov;	        /* FC vNIC only: Err Detect Timeout */
21262306a36Sopenharmony_ci};
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci/*
21562306a36Sopenharmony_ci * Special request flags
21662306a36Sopenharmony_ci */
21762306a36Sopenharmony_ci#define FCPIO_ICMND_SRFLAG_RETRY 0x01   /* Enable Retry handling on exchange */
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci/*
22062306a36Sopenharmony_ci * Priority/Task Attribute settings
22162306a36Sopenharmony_ci */
22262306a36Sopenharmony_ci#define FCPIO_ICMND_PTA_SIMPLE      0   /* simple task attribute */
22362306a36Sopenharmony_ci#define FCPIO_ICMND_PTA_HEADQ       1   /* head of queue task attribute */
22462306a36Sopenharmony_ci#define FCPIO_ICMND_PTA_ORDERED     2   /* ordered task attribute */
22562306a36Sopenharmony_ci#define FCPIO_ICMND_PTA_ACA         4   /* auto contingent allegiance */
22662306a36Sopenharmony_ci#define FCPIO_ICMND_PRI_SHIFT       3   /* priority field starts in bit 3 */
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci/*
22962306a36Sopenharmony_ci * Command flags
23062306a36Sopenharmony_ci */
23162306a36Sopenharmony_ci#define FCPIO_ICMND_RDDATA      0x02    /* read data */
23262306a36Sopenharmony_ci#define FCPIO_ICMND_WRDATA      0x01    /* write data */
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci/*
23562306a36Sopenharmony_ci * fcpio_icmnd_32: host -> firmware request
23662306a36Sopenharmony_ci *
23762306a36Sopenharmony_ci * used for sending out an initiator SCSI 32-byte command
23862306a36Sopenharmony_ci */
23962306a36Sopenharmony_cistruct fcpio_icmnd_32 {
24062306a36Sopenharmony_ci	u32   lunmap_id;              /* index into lunmap table */
24162306a36Sopenharmony_ci	u8    special_req_flags;      /* special exchange request flags */
24262306a36Sopenharmony_ci	u8    _resvd0[3];             /* reserved */
24362306a36Sopenharmony_ci	u32   sgl_cnt;                /* scatter-gather list count */
24462306a36Sopenharmony_ci	u32   sense_len;              /* sense buffer length */
24562306a36Sopenharmony_ci	u64   sgl_addr;               /* scatter-gather list addr */
24662306a36Sopenharmony_ci	u64   sense_addr;             /* sense buffer address */
24762306a36Sopenharmony_ci	u8    crn;                    /* SCSI Command Reference No. */
24862306a36Sopenharmony_ci	u8    pri_ta;                 /* SCSI Priority and Task attribute */
24962306a36Sopenharmony_ci	u8    _resvd1;                /* reserved: should be 0 */
25062306a36Sopenharmony_ci	u8    flags;                  /* command flags */
25162306a36Sopenharmony_ci	u8    scsi_cdb[CDB_32];       /* SCSI Cmnd Descriptor Block */
25262306a36Sopenharmony_ci	u32   data_len;               /* length of data expected */
25362306a36Sopenharmony_ci	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
25462306a36Sopenharmony_ci	u8    _resvd2;                /* reserved */
25562306a36Sopenharmony_ci	u8    d_id[3];		      /* FC vNIC only: Target D_ID */
25662306a36Sopenharmony_ci	u16   mss;                    /* FC vNIC only: max burst */
25762306a36Sopenharmony_ci	u16   _resvd3;                /* reserved */
25862306a36Sopenharmony_ci	u32   r_a_tov;                /* FC vNIC only: Res. Alloc Timeout */
25962306a36Sopenharmony_ci	u32   e_d_tov;                /* FC vNIC only: Error Detect Timeout */
26062306a36Sopenharmony_ci};
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci/*
26362306a36Sopenharmony_ci * fcpio_itmf: host -> firmware request
26462306a36Sopenharmony_ci *
26562306a36Sopenharmony_ci * used for requesting the firmware to abort a request and/or send out
26662306a36Sopenharmony_ci * a task management function
26762306a36Sopenharmony_ci *
26862306a36Sopenharmony_ci * The t_tag field is only needed when the request type is ABT_TASK.
26962306a36Sopenharmony_ci */
27062306a36Sopenharmony_cistruct fcpio_itmf {
27162306a36Sopenharmony_ci	u32   lunmap_id;              /* index into lunmap table */
27262306a36Sopenharmony_ci	u32   tm_req;                 /* SCSI Task Management request */
27362306a36Sopenharmony_ci	u32   t_tag;                  /* header tag of fcpio to be aborted */
27462306a36Sopenharmony_ci	u32   _resvd;                 /* _reserved */
27562306a36Sopenharmony_ci	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
27662306a36Sopenharmony_ci	u8    _resvd1;                /* reserved */
27762306a36Sopenharmony_ci	u8    d_id[3];		      /* FC vNIC only: Target D_ID */
27862306a36Sopenharmony_ci	u32   r_a_tov;                /* FC vNIC only: R_A_TOV in msec */
27962306a36Sopenharmony_ci	u32   e_d_tov;                /* FC vNIC only: E_D_TOV in msec */
28062306a36Sopenharmony_ci};
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci/*
28362306a36Sopenharmony_ci * Task Management request
28462306a36Sopenharmony_ci */
28562306a36Sopenharmony_cienum fcpio_itmf_tm_req_type {
28662306a36Sopenharmony_ci	FCPIO_ITMF_ABT_TASK_TERM = 0x01,    /* abort task and terminate */
28762306a36Sopenharmony_ci	FCPIO_ITMF_ABT_TASK,                /* abort task and issue abts */
28862306a36Sopenharmony_ci	FCPIO_ITMF_ABT_TASK_SET,            /* abort task set */
28962306a36Sopenharmony_ci	FCPIO_ITMF_CLR_TASK_SET,            /* clear task set */
29062306a36Sopenharmony_ci	FCPIO_ITMF_LUN_RESET,               /* logical unit reset task mgmt */
29162306a36Sopenharmony_ci	FCPIO_ITMF_CLR_ACA,                 /* Clear ACA condition */
29262306a36Sopenharmony_ci};
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci/*
29562306a36Sopenharmony_ci * fcpio_tdata: host -> firmware request
29662306a36Sopenharmony_ci *
29762306a36Sopenharmony_ci * used for requesting the firmware to send out a read data transfer for a
29862306a36Sopenharmony_ci * target command
29962306a36Sopenharmony_ci */
30062306a36Sopenharmony_cistruct fcpio_tdata {
30162306a36Sopenharmony_ci	u16   rx_id;                  /* FC rx_id of target command */
30262306a36Sopenharmony_ci	u16   flags;                  /* command flags */
30362306a36Sopenharmony_ci	u32   rel_offset;             /* data sequence relative offset */
30462306a36Sopenharmony_ci	u32   sgl_cnt;                /* scatter-gather list count */
30562306a36Sopenharmony_ci	u32   data_len;               /* length of data expected to send */
30662306a36Sopenharmony_ci	u64   sgl_addr;               /* scatter-gather list address */
30762306a36Sopenharmony_ci};
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci/*
31062306a36Sopenharmony_ci * Command flags
31162306a36Sopenharmony_ci */
31262306a36Sopenharmony_ci#define FCPIO_TDATA_SCSI_RSP    0x01    /* send a scsi resp. after last frame */
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci/*
31562306a36Sopenharmony_ci * fcpio_txrdy: host -> firmware request
31662306a36Sopenharmony_ci *
31762306a36Sopenharmony_ci * used for requesting the firmware to send out a write data transfer for a
31862306a36Sopenharmony_ci * target command
31962306a36Sopenharmony_ci */
32062306a36Sopenharmony_cistruct fcpio_txrdy {
32162306a36Sopenharmony_ci	u16   rx_id;                  /* FC rx_id of target command */
32262306a36Sopenharmony_ci	u16   _resvd0;                /* reserved */
32362306a36Sopenharmony_ci	u32   rel_offset;             /* data sequence relative offset */
32462306a36Sopenharmony_ci	u32   sgl_cnt;                /* scatter-gather list count */
32562306a36Sopenharmony_ci	u32   data_len;               /* length of data expected to send */
32662306a36Sopenharmony_ci	u64   sgl_addr;               /* scatter-gather list address */
32762306a36Sopenharmony_ci};
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci/*
33062306a36Sopenharmony_ci * fcpio_trsp: host -> firmware request
33162306a36Sopenharmony_ci *
33262306a36Sopenharmony_ci * used for requesting the firmware to send out a response for a target
33362306a36Sopenharmony_ci * command
33462306a36Sopenharmony_ci */
33562306a36Sopenharmony_cistruct fcpio_trsp {
33662306a36Sopenharmony_ci	u16   rx_id;                  /* FC rx_id of target command */
33762306a36Sopenharmony_ci	u16   _resvd0;                /* reserved */
33862306a36Sopenharmony_ci	u32   sense_len;              /* sense data buffer length */
33962306a36Sopenharmony_ci	u64   sense_addr;             /* sense data buffer address */
34062306a36Sopenharmony_ci	u16   _resvd1;                /* reserved */
34162306a36Sopenharmony_ci	u8    flags;                  /* response request flags */
34262306a36Sopenharmony_ci	u8    scsi_status;            /* SCSI status */
34362306a36Sopenharmony_ci	u32   residual;               /* SCSI data residual value of I/O */
34462306a36Sopenharmony_ci};
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci/*
34762306a36Sopenharmony_ci * resposnse request flags
34862306a36Sopenharmony_ci */
34962306a36Sopenharmony_ci#define FCPIO_TRSP_RESID_UNDER  0x08   /* residual is valid and is underflow */
35062306a36Sopenharmony_ci#define FCPIO_TRSP_RESID_OVER   0x04   /* residual is valid and is overflow */
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci/*
35362306a36Sopenharmony_ci * fcpio_ttmf_ack: host -> firmware response
35462306a36Sopenharmony_ci *
35562306a36Sopenharmony_ci * used by the host to indicate to the firmware it has received and processed
35662306a36Sopenharmony_ci * the target tmf request
35762306a36Sopenharmony_ci */
35862306a36Sopenharmony_cistruct fcpio_ttmf_ack {
35962306a36Sopenharmony_ci	u16   rx_id;                  /* FC rx_id of target command */
36062306a36Sopenharmony_ci	u16   _resvd0;                /* reserved */
36162306a36Sopenharmony_ci	u32   tmf_status;             /* SCSI task management status */
36262306a36Sopenharmony_ci};
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci/*
36562306a36Sopenharmony_ci * fcpio_tabort: host -> firmware request
36662306a36Sopenharmony_ci *
36762306a36Sopenharmony_ci * used by the host to request the firmware to abort a target request that was
36862306a36Sopenharmony_ci * received by the firmware
36962306a36Sopenharmony_ci */
37062306a36Sopenharmony_cistruct fcpio_tabort {
37162306a36Sopenharmony_ci	u16   rx_id;                  /* rx_id of the target request */
37262306a36Sopenharmony_ci};
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci/*
37562306a36Sopenharmony_ci * fcpio_reset: host -> firmware request
37662306a36Sopenharmony_ci *
37762306a36Sopenharmony_ci * used by the host to signal a reset of the driver to the firmware
37862306a36Sopenharmony_ci * and to request firmware to clean up all outstanding I/O
37962306a36Sopenharmony_ci */
38062306a36Sopenharmony_cistruct fcpio_reset {
38162306a36Sopenharmony_ci	u32   _resvd;
38262306a36Sopenharmony_ci};
38362306a36Sopenharmony_ci
38462306a36Sopenharmony_cienum fcpio_flogi_reg_format_type {
38562306a36Sopenharmony_ci	FCPIO_FLOGI_REG_DEF_DEST = 0,    /* Use the oui | s_id mac format */
38662306a36Sopenharmony_ci	FCPIO_FLOGI_REG_GW_DEST,         /* Use the fixed gateway mac */
38762306a36Sopenharmony_ci};
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci/*
39062306a36Sopenharmony_ci * fcpio_flogi_reg: host -> firmware request
39162306a36Sopenharmony_ci *
39262306a36Sopenharmony_ci * fc vnic only
39362306a36Sopenharmony_ci * used by the host to notify the firmware of the lif's s_id
39462306a36Sopenharmony_ci * and destination mac address format
39562306a36Sopenharmony_ci */
39662306a36Sopenharmony_cistruct fcpio_flogi_reg {
39762306a36Sopenharmony_ci	u8 format;
39862306a36Sopenharmony_ci	u8 s_id[3];			/* FC vNIC only: Source S_ID */
39962306a36Sopenharmony_ci	u8 gateway_mac[ETH_ALEN];	/* Destination gateway mac */
40062306a36Sopenharmony_ci	u16 _resvd;
40162306a36Sopenharmony_ci	u32 r_a_tov;			/* R_A_TOV in msec */
40262306a36Sopenharmony_ci	u32 e_d_tov;			/* E_D_TOV in msec */
40362306a36Sopenharmony_ci};
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci/*
40662306a36Sopenharmony_ci * fcpio_echo: host -> firmware request
40762306a36Sopenharmony_ci *
40862306a36Sopenharmony_ci * sends a heartbeat echo request to the firmware
40962306a36Sopenharmony_ci */
41062306a36Sopenharmony_cistruct fcpio_echo {
41162306a36Sopenharmony_ci	u32 _resvd;
41262306a36Sopenharmony_ci};
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci/*
41562306a36Sopenharmony_ci * fcpio_lunmap_req: host -> firmware request
41662306a36Sopenharmony_ci *
41762306a36Sopenharmony_ci * scsi vnic only
41862306a36Sopenharmony_ci * sends a request to retrieve the lunmap table for scsi vnics
41962306a36Sopenharmony_ci */
42062306a36Sopenharmony_cistruct fcpio_lunmap_req {
42162306a36Sopenharmony_ci	u64 addr;                     /* address of the buffer */
42262306a36Sopenharmony_ci	u32 len;                      /* len of the buffer */
42362306a36Sopenharmony_ci};
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_ci/*
42662306a36Sopenharmony_ci * fcpio_flogi_fip_reg: host -> firmware request
42762306a36Sopenharmony_ci *
42862306a36Sopenharmony_ci * fc vnic only
42962306a36Sopenharmony_ci * used by the host to notify the firmware of the lif's s_id
43062306a36Sopenharmony_ci * and destination mac address format
43162306a36Sopenharmony_ci */
43262306a36Sopenharmony_cistruct fcpio_flogi_fip_reg {
43362306a36Sopenharmony_ci	u8    _resvd0;
43462306a36Sopenharmony_ci	u8     s_id[3];               /* FC vNIC only: Source S_ID */
43562306a36Sopenharmony_ci	u8     fcf_mac[ETH_ALEN];     /* FCF Target destination mac */
43662306a36Sopenharmony_ci	u16   _resvd1;
43762306a36Sopenharmony_ci	u32   r_a_tov;                /* R_A_TOV in msec */
43862306a36Sopenharmony_ci	u32   e_d_tov;                /* E_D_TOV in msec */
43962306a36Sopenharmony_ci	u8    ha_mac[ETH_ALEN];       /* Host adapter source mac */
44062306a36Sopenharmony_ci	u16   _resvd2;
44162306a36Sopenharmony_ci};
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci/*
44462306a36Sopenharmony_ci * Basic structure for all fcpio structures that are sent from the host to the
44562306a36Sopenharmony_ci * firmware.  They are 128 bytes per structure.
44662306a36Sopenharmony_ci */
44762306a36Sopenharmony_ci#define FCPIO_HOST_REQ_LEN      128     /* expected length of host requests */
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_cistruct fcpio_host_req {
45062306a36Sopenharmony_ci	struct fcpio_header hdr;
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	union {
45362306a36Sopenharmony_ci		/*
45462306a36Sopenharmony_ci		 * Defines space needed for request
45562306a36Sopenharmony_ci		 */
45662306a36Sopenharmony_ci		u8 buf[FCPIO_HOST_REQ_LEN - sizeof(struct fcpio_header)];
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci		/*
45962306a36Sopenharmony_ci		 * Initiator host requests
46062306a36Sopenharmony_ci		 */
46162306a36Sopenharmony_ci		struct fcpio_icmnd_16               icmnd_16;
46262306a36Sopenharmony_ci		struct fcpio_icmnd_32               icmnd_32;
46362306a36Sopenharmony_ci		struct fcpio_itmf                   itmf;
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci		/*
46662306a36Sopenharmony_ci		 * Target host requests
46762306a36Sopenharmony_ci		 */
46862306a36Sopenharmony_ci		struct fcpio_tdata                  tdata;
46962306a36Sopenharmony_ci		struct fcpio_txrdy                  txrdy;
47062306a36Sopenharmony_ci		struct fcpio_trsp                   trsp;
47162306a36Sopenharmony_ci		struct fcpio_ttmf_ack               ttmf_ack;
47262306a36Sopenharmony_ci		struct fcpio_tabort                 tabort;
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ci		/*
47562306a36Sopenharmony_ci		 * Misc requests
47662306a36Sopenharmony_ci		 */
47762306a36Sopenharmony_ci		struct fcpio_reset                  reset;
47862306a36Sopenharmony_ci		struct fcpio_flogi_reg              flogi_reg;
47962306a36Sopenharmony_ci		struct fcpio_echo                   echo;
48062306a36Sopenharmony_ci		struct fcpio_lunmap_req             lunmap_req;
48162306a36Sopenharmony_ci		struct fcpio_flogi_fip_reg          flogi_fip_reg;
48262306a36Sopenharmony_ci	} u;
48362306a36Sopenharmony_ci};
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci/*
48662306a36Sopenharmony_ci * fcpio_icmnd_cmpl: firmware -> host response
48762306a36Sopenharmony_ci *
48862306a36Sopenharmony_ci * used for sending the host a response to an initiator command
48962306a36Sopenharmony_ci */
49062306a36Sopenharmony_cistruct fcpio_icmnd_cmpl {
49162306a36Sopenharmony_ci	u8    _resvd0[6];             /* reserved */
49262306a36Sopenharmony_ci	u8    flags;                  /* response flags */
49362306a36Sopenharmony_ci	u8    scsi_status;            /* SCSI status */
49462306a36Sopenharmony_ci	u32   residual;               /* SCSI data residual length */
49562306a36Sopenharmony_ci	u32   sense_len;              /* SCSI sense length */
49662306a36Sopenharmony_ci};
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci/*
49962306a36Sopenharmony_ci * response flags
50062306a36Sopenharmony_ci */
50162306a36Sopenharmony_ci#define FCPIO_ICMND_CMPL_RESID_UNDER    0x08    /* resid under and valid */
50262306a36Sopenharmony_ci#define FCPIO_ICMND_CMPL_RESID_OVER     0x04    /* resid over and valid */
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci/*
50562306a36Sopenharmony_ci * fcpio_itmf_cmpl: firmware -> host response
50662306a36Sopenharmony_ci *
50762306a36Sopenharmony_ci * used for sending the host a response for a itmf request
50862306a36Sopenharmony_ci */
50962306a36Sopenharmony_cistruct fcpio_itmf_cmpl {
51062306a36Sopenharmony_ci	u32    _resvd;                /* reserved */
51162306a36Sopenharmony_ci};
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci/*
51462306a36Sopenharmony_ci * fcpio_tcmnd_16: firmware -> host request
51562306a36Sopenharmony_ci *
51662306a36Sopenharmony_ci * used by the firmware to notify the host of an incoming target SCSI 16-Byte
51762306a36Sopenharmony_ci * request
51862306a36Sopenharmony_ci */
51962306a36Sopenharmony_cistruct fcpio_tcmnd_16 {
52062306a36Sopenharmony_ci	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
52162306a36Sopenharmony_ci	u8    crn;                    /* SCSI Command Reference No. */
52262306a36Sopenharmony_ci	u8    pri_ta;                 /* SCSI Priority and Task attribute */
52362306a36Sopenharmony_ci	u8    _resvd2;                /* reserved: should be 0 */
52462306a36Sopenharmony_ci	u8    flags;                  /* command flags */
52562306a36Sopenharmony_ci	u8    scsi_cdb[CDB_16];       /* SCSI Cmnd Descriptor Block */
52662306a36Sopenharmony_ci	u32   data_len;               /* length of data expected */
52762306a36Sopenharmony_ci	u8    _resvd1;                /* reserved */
52862306a36Sopenharmony_ci	u8    s_id[3];		      /* FC vNIC only: Source S_ID */
52962306a36Sopenharmony_ci};
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci/*
53262306a36Sopenharmony_ci * Priority/Task Attribute settings
53362306a36Sopenharmony_ci */
53462306a36Sopenharmony_ci#define FCPIO_TCMND_PTA_SIMPLE      0   /* simple task attribute */
53562306a36Sopenharmony_ci#define FCPIO_TCMND_PTA_HEADQ       1   /* head of queue task attribute */
53662306a36Sopenharmony_ci#define FCPIO_TCMND_PTA_ORDERED     2   /* ordered task attribute */
53762306a36Sopenharmony_ci#define FCPIO_TCMND_PTA_ACA         4   /* auto contingent allegiance */
53862306a36Sopenharmony_ci#define FCPIO_TCMND_PRI_SHIFT       3   /* priority field starts in bit 3 */
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_ci/*
54162306a36Sopenharmony_ci * Command flags
54262306a36Sopenharmony_ci */
54362306a36Sopenharmony_ci#define FCPIO_TCMND_RDDATA      0x02    /* read data */
54462306a36Sopenharmony_ci#define FCPIO_TCMND_WRDATA      0x01    /* write data */
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci/*
54762306a36Sopenharmony_ci * fcpio_tcmnd_32: firmware -> host request
54862306a36Sopenharmony_ci *
54962306a36Sopenharmony_ci * used by the firmware to notify the host of an incoming target SCSI 32-Byte
55062306a36Sopenharmony_ci * request
55162306a36Sopenharmony_ci */
55262306a36Sopenharmony_cistruct fcpio_tcmnd_32 {
55362306a36Sopenharmony_ci	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
55462306a36Sopenharmony_ci	u8    crn;                    /* SCSI Command Reference No. */
55562306a36Sopenharmony_ci	u8    pri_ta;                 /* SCSI Priority and Task attribute */
55662306a36Sopenharmony_ci	u8    _resvd2;                /* reserved: should be 0 */
55762306a36Sopenharmony_ci	u8    flags;                  /* command flags */
55862306a36Sopenharmony_ci	u8    scsi_cdb[CDB_32];       /* SCSI Cmnd Descriptor Block */
55962306a36Sopenharmony_ci	u32   data_len;               /* length of data expected */
56062306a36Sopenharmony_ci	u8    _resvd0;                /* reserved */
56162306a36Sopenharmony_ci	u8    s_id[3];		      /* FC vNIC only: Source S_ID */
56262306a36Sopenharmony_ci};
56362306a36Sopenharmony_ci
56462306a36Sopenharmony_ci/*
56562306a36Sopenharmony_ci * fcpio_tdrsp_cmpl: firmware -> host response
56662306a36Sopenharmony_ci *
56762306a36Sopenharmony_ci * used by the firmware to notify the host of a response to a host target
56862306a36Sopenharmony_ci * command
56962306a36Sopenharmony_ci */
57062306a36Sopenharmony_cistruct fcpio_tdrsp_cmpl {
57162306a36Sopenharmony_ci	u16   rx_id;                  /* rx_id of the target request */
57262306a36Sopenharmony_ci	u16   _resvd0;                /* reserved */
57362306a36Sopenharmony_ci};
57462306a36Sopenharmony_ci
57562306a36Sopenharmony_ci/*
57662306a36Sopenharmony_ci * fcpio_ttmf: firmware -> host request
57762306a36Sopenharmony_ci *
57862306a36Sopenharmony_ci * used by the firmware to notify the host of an incoming task management
57962306a36Sopenharmony_ci * function request
58062306a36Sopenharmony_ci */
58162306a36Sopenharmony_cistruct fcpio_ttmf {
58262306a36Sopenharmony_ci	u8    _resvd0;                /* reserved */
58362306a36Sopenharmony_ci	u8    s_id[3];		      /* FC vNIC only: Source S_ID */
58462306a36Sopenharmony_ci	u8    lun[LUN_ADDRESS];       /* FC vNIC only: LUN address */
58562306a36Sopenharmony_ci	u8    crn;                    /* SCSI Command Reference No. */
58662306a36Sopenharmony_ci	u8    _resvd2[3];             /* reserved */
58762306a36Sopenharmony_ci	u32   tmf_type;               /* task management request type */
58862306a36Sopenharmony_ci};
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ci/*
59162306a36Sopenharmony_ci * Task Management request
59262306a36Sopenharmony_ci */
59362306a36Sopenharmony_ci#define FCPIO_TTMF_CLR_ACA      0x40    /* Clear ACA condition */
59462306a36Sopenharmony_ci#define FCPIO_TTMF_LUN_RESET    0x10    /* logical unit reset task mgmt */
59562306a36Sopenharmony_ci#define FCPIO_TTMF_CLR_TASK_SET 0x04    /* clear task set */
59662306a36Sopenharmony_ci#define FCPIO_TTMF_ABT_TASK_SET 0x02    /* abort task set */
59762306a36Sopenharmony_ci#define FCPIO_TTMF_ABT_TASK     0x01    /* abort task */
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci/*
60062306a36Sopenharmony_ci * fcpio_tabort_cmpl: firmware -> host response
60162306a36Sopenharmony_ci *
60262306a36Sopenharmony_ci * used by the firmware to respond to a host's tabort request
60362306a36Sopenharmony_ci */
60462306a36Sopenharmony_cistruct fcpio_tabort_cmpl {
60562306a36Sopenharmony_ci	u16   rx_id;                  /* rx_id of the target request */
60662306a36Sopenharmony_ci	u16   _resvd0;                /* reserved */
60762306a36Sopenharmony_ci};
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci/*
61062306a36Sopenharmony_ci * fcpio_ack: firmware -> host response
61162306a36Sopenharmony_ci *
61262306a36Sopenharmony_ci * used by firmware to notify the host of the last work request received
61362306a36Sopenharmony_ci */
61462306a36Sopenharmony_cistruct fcpio_ack {
61562306a36Sopenharmony_ci	u16  request_out;             /* last host entry received */
61662306a36Sopenharmony_ci	u16  _resvd;
61762306a36Sopenharmony_ci};
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ci/*
62062306a36Sopenharmony_ci * fcpio_reset_cmpl: firmware -> host response
62162306a36Sopenharmony_ci *
62262306a36Sopenharmony_ci * use by firmware to respond to the host's reset request
62362306a36Sopenharmony_ci */
62462306a36Sopenharmony_cistruct fcpio_reset_cmpl {
62562306a36Sopenharmony_ci	u16   vnic_id;
62662306a36Sopenharmony_ci};
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_ci/*
62962306a36Sopenharmony_ci * fcpio_flogi_reg_cmpl: firmware -> host response
63062306a36Sopenharmony_ci *
63162306a36Sopenharmony_ci * fc vnic only
63262306a36Sopenharmony_ci * response to the fcpio_flogi_reg request
63362306a36Sopenharmony_ci */
63462306a36Sopenharmony_cistruct fcpio_flogi_reg_cmpl {
63562306a36Sopenharmony_ci	u32 _resvd;
63662306a36Sopenharmony_ci};
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci/*
63962306a36Sopenharmony_ci * fcpio_echo_cmpl: firmware -> host response
64062306a36Sopenharmony_ci *
64162306a36Sopenharmony_ci * response to the fcpio_echo request
64262306a36Sopenharmony_ci */
64362306a36Sopenharmony_cistruct fcpio_echo_cmpl {
64462306a36Sopenharmony_ci	u32 _resvd;
64562306a36Sopenharmony_ci};
64662306a36Sopenharmony_ci
64762306a36Sopenharmony_ci/*
64862306a36Sopenharmony_ci * fcpio_lunmap_chng: firmware -> host notification
64962306a36Sopenharmony_ci *
65062306a36Sopenharmony_ci * scsi vnic only
65162306a36Sopenharmony_ci * notifies the host that the lunmap tables have changed
65262306a36Sopenharmony_ci */
65362306a36Sopenharmony_cistruct fcpio_lunmap_chng {
65462306a36Sopenharmony_ci	u32 _resvd;
65562306a36Sopenharmony_ci};
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci/*
65862306a36Sopenharmony_ci * fcpio_lunmap_req_cmpl: firmware -> host response
65962306a36Sopenharmony_ci *
66062306a36Sopenharmony_ci * scsi vnic only
66162306a36Sopenharmony_ci * response for lunmap table request from the host
66262306a36Sopenharmony_ci */
66362306a36Sopenharmony_cistruct fcpio_lunmap_req_cmpl {
66462306a36Sopenharmony_ci	u32 _resvd;
66562306a36Sopenharmony_ci};
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci/*
66862306a36Sopenharmony_ci * Basic structure for all fcpio structures that are sent from the firmware to
66962306a36Sopenharmony_ci * the host.  They are 64 bytes per structure.
67062306a36Sopenharmony_ci */
67162306a36Sopenharmony_ci#define FCPIO_FW_REQ_LEN        64      /* expected length of fw requests */
67262306a36Sopenharmony_cistruct fcpio_fw_req {
67362306a36Sopenharmony_ci	struct fcpio_header hdr;
67462306a36Sopenharmony_ci
67562306a36Sopenharmony_ci	union {
67662306a36Sopenharmony_ci		/*
67762306a36Sopenharmony_ci		 * Defines space needed for request
67862306a36Sopenharmony_ci		 */
67962306a36Sopenharmony_ci		u8 buf[FCPIO_FW_REQ_LEN - sizeof(struct fcpio_header)];
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci		/*
68262306a36Sopenharmony_ci		 * Initiator firmware responses
68362306a36Sopenharmony_ci		 */
68462306a36Sopenharmony_ci		struct fcpio_icmnd_cmpl         icmnd_cmpl;
68562306a36Sopenharmony_ci		struct fcpio_itmf_cmpl          itmf_cmpl;
68662306a36Sopenharmony_ci
68762306a36Sopenharmony_ci		/*
68862306a36Sopenharmony_ci		 * Target firmware new requests
68962306a36Sopenharmony_ci		 */
69062306a36Sopenharmony_ci		struct fcpio_tcmnd_16           tcmnd_16;
69162306a36Sopenharmony_ci		struct fcpio_tcmnd_32           tcmnd_32;
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci		/*
69462306a36Sopenharmony_ci		 * Target firmware responses
69562306a36Sopenharmony_ci		 */
69662306a36Sopenharmony_ci		struct fcpio_tdrsp_cmpl         tdrsp_cmpl;
69762306a36Sopenharmony_ci		struct fcpio_ttmf               ttmf;
69862306a36Sopenharmony_ci		struct fcpio_tabort_cmpl        tabort_cmpl;
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci		/*
70162306a36Sopenharmony_ci		 * Firmware response to work received
70262306a36Sopenharmony_ci		 */
70362306a36Sopenharmony_ci		struct fcpio_ack                ack;
70462306a36Sopenharmony_ci
70562306a36Sopenharmony_ci		/*
70662306a36Sopenharmony_ci		 * Misc requests
70762306a36Sopenharmony_ci		 */
70862306a36Sopenharmony_ci		struct fcpio_reset_cmpl         reset_cmpl;
70962306a36Sopenharmony_ci		struct fcpio_flogi_reg_cmpl     flogi_reg_cmpl;
71062306a36Sopenharmony_ci		struct fcpio_echo_cmpl          echo_cmpl;
71162306a36Sopenharmony_ci		struct fcpio_lunmap_chng        lunmap_chng;
71262306a36Sopenharmony_ci		struct fcpio_lunmap_req_cmpl    lunmap_req_cmpl;
71362306a36Sopenharmony_ci	} u;
71462306a36Sopenharmony_ci};
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci/*
71762306a36Sopenharmony_ci * Access routines to encode and decode the color bit, which is the most
71862306a36Sopenharmony_ci * significant bit of the MSB of the structure
71962306a36Sopenharmony_ci */
72062306a36Sopenharmony_cistatic inline void fcpio_color_enc(struct fcpio_fw_req *fw_req, u8 color)
72162306a36Sopenharmony_ci{
72262306a36Sopenharmony_ci	u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1;
72362306a36Sopenharmony_ci
72462306a36Sopenharmony_ci	if (color)
72562306a36Sopenharmony_ci		*c |= 0x80;
72662306a36Sopenharmony_ci	else
72762306a36Sopenharmony_ci		*c &= ~0x80;
72862306a36Sopenharmony_ci}
72962306a36Sopenharmony_ci
73062306a36Sopenharmony_cistatic inline void fcpio_color_dec(struct fcpio_fw_req *fw_req, u8 *color)
73162306a36Sopenharmony_ci{
73262306a36Sopenharmony_ci	u8 *c = ((u8 *) fw_req) + sizeof(struct fcpio_fw_req) - 1;
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_ci	*color = *c >> 7;
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci	/*
73762306a36Sopenharmony_ci	 * Make sure color bit is read from desc *before* other fields
73862306a36Sopenharmony_ci	 * are read from desc.  Hardware guarantees color bit is last
73962306a36Sopenharmony_ci	 * bit (byte) written.  Adding the rmb() prevents the compiler
74062306a36Sopenharmony_ci	 * and/or CPU from reordering the reads which would potentially
74162306a36Sopenharmony_ci	 * result in reading stale values.
74262306a36Sopenharmony_ci	 */
74362306a36Sopenharmony_ci
74462306a36Sopenharmony_ci	rmb();
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci}
74762306a36Sopenharmony_ci
74862306a36Sopenharmony_ci/*
74962306a36Sopenharmony_ci * Lunmap table entry for scsi vnics
75062306a36Sopenharmony_ci */
75162306a36Sopenharmony_ci#define FCPIO_LUNMAP_TABLE_SIZE     256
75262306a36Sopenharmony_ci#define FCPIO_FLAGS_LUNMAP_VALID    0x80
75362306a36Sopenharmony_ci#define FCPIO_FLAGS_BOOT            0x01
75462306a36Sopenharmony_cistruct fcpio_lunmap_entry {
75562306a36Sopenharmony_ci	u8    bus;
75662306a36Sopenharmony_ci	u8    target;
75762306a36Sopenharmony_ci	u8    lun;
75862306a36Sopenharmony_ci	u8    path_cnt;
75962306a36Sopenharmony_ci	u16   flags;
76062306a36Sopenharmony_ci	u16   update_cnt;
76162306a36Sopenharmony_ci};
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_cistruct fcpio_lunmap_tbl {
76462306a36Sopenharmony_ci	u32                   update_cnt;
76562306a36Sopenharmony_ci	struct fcpio_lunmap_entry   lunmaps[FCPIO_LUNMAP_TABLE_SIZE];
76662306a36Sopenharmony_ci};
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci#endif /* _FCPIO_H_ */
769