e6550b3ee1
Based on the normalized pattern: this program is free software you may redistribute it and/or modify it under the terms of the gnu general public license as published by the free software foundation version 2 of the license the software is provided as is without warranty of any kind express or implied including but not limited to the warranties of merchantability fitness for a particular purpose and noninfringement in no event shall the authors or copyright holders be liable for any claim damages or other liability whether in an action of contract tort or otherwise arising from out of or in connection with the software or the use or other dealings in the software extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
769 lines
22 KiB
C
769 lines
22 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* 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_ */
|