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