2022-06-07 17:11:24 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2009-04-18 05:33:26 +04:00
/*
* Copyright 2008 Cisco Systems , Inc . All rights reserved .
* Copyright 2007 Nuova Systems , Inc . All rights reserved .
*/
# 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_ */