1894 lines
54 KiB
C
1894 lines
54 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Huawei Hifc PCI Express Linux driver
|
|
* Copyright(c) 2017 Huawei Technologies Co., Ltd
|
|
*
|
|
*/
|
|
#ifndef __UNF_COMMON_H
|
|
#define __UNF_COMMON_H
|
|
|
|
#include "unf_scsi_common.h"
|
|
|
|
/* V/C version number */
|
|
#define UNF_MAJOR_VERSION "3"
|
|
/* B version, B0XX Corresponding x.x */
|
|
#define UNF_B_VERSION "5.0"
|
|
/* Indicates the minor version number of the driver */
|
|
#define UNF_DRIVER_VERSION "12"
|
|
/* version num */
|
|
#define UNF_FC_VERSION UNF_MAJOR_VERSION "." UNF_B_VERSION "." UNF_DRIVER_VERSION
|
|
extern unsigned int unf_dbg_level;
|
|
extern unsigned int hifc_dif_type;
|
|
extern unsigned int hifc_dif_enable;
|
|
extern unsigned char hifc_guard;
|
|
|
|
#define RETURN_ERROR_S32 (-1)
|
|
#define UNF_RETURN_ERROR_S32 (-1)
|
|
|
|
#define UNF_IO_SUCCESS 0x00000000
|
|
/* the host system aborted the command */
|
|
#define UNF_IO_ABORTED 0x00000001
|
|
#define UNF_IO_FAILED 0x00000002
|
|
#define UNF_IO_ABORT_ABTS 0x00000003
|
|
#define UNF_IO_ABORT_LOGIN 0x00000004 /* abort login */
|
|
/* reset event aborted the transport */
|
|
#define UNF_IO_ABORT_REET 0x00000005
|
|
#define UNF_IO_ABORT_FAILED 0x00000006 /* abort failed */
|
|
/* data out of order ,data reassembly error */
|
|
#define UNF_IO_OUTOF_ORDER 0x00000007
|
|
#define UNF_IO_FTO 0x00000008 /* frame time out */
|
|
#define UNF_IO_LINK_FAILURE 0x00000009
|
|
#define UNF_IO_OVER_FLOW 0x0000000a /* data over run */
|
|
#define UNF_IO_RSP_OVER 0x0000000b
|
|
#define UNF_IO_LOST_FRAME 0x0000000c
|
|
#define UNF_IO_UNDER_FLOW 0x0000000d /* data under run */
|
|
#define UNF_IO_HOST_PROG_ERROR 0x0000000e
|
|
#define UNF_IO_SEST_PROG_ERROR 0x0000000f
|
|
#define UNF_IO_INVALID_ENTRY 0x00000010
|
|
#define UNF_IO_ABORT_SEQ_NOT 0x00000011
|
|
#define UNF_IO_REJECT 0x00000012
|
|
#define UNF_IO_RS_INFO 0x00000013
|
|
#define UNF_IO_EDC_IN_ERROR 0x00000014
|
|
#define UNF_IO_EDC_OUT_ERROR 0x00000015
|
|
#define UNF_IO_UNINIT_KEK_ERR 0x00000016
|
|
#define UNF_IO_DEK_OUTOF_RANGE 0x00000017
|
|
#define UNF_IO_KEY_UNWRAP_ERR 0x00000018
|
|
#define UNF_IO_KEY_TAG_ERR 0x00000019
|
|
#define UNF_IO_KEY_ECC_ERR 0x0000001a
|
|
#define UNF_IO_BLOCK_SIZE_ERROR 0x0000001b
|
|
#define UNF_IO_ILLEGAL_CIPHER_MODE 0x0000001c
|
|
#define UNF_IO_CLEAN_UP 0x0000001d
|
|
#define UNF_SRR_RECEIVE 0x0000001e /* receive srr */
|
|
/* The target device sent an ABTS to abort the I/O. */
|
|
#define UNF_IO_ABORTED_BY_TARGET 0x0000001f
|
|
#define UNF_IO_TRANSPORT_ERROR 0x00000020
|
|
#define UNF_IO_LINK_FLASH 0x00000021
|
|
#define UNF_IO_TIMEOUT 0x00000022
|
|
#define UNF_IO_PORT_UNAVAILABLE 0x00000023
|
|
#define UNF_IO_PORT_LOGOUT 0x00000024
|
|
#define UNF_IO_PORT_CFG_CHG 0x00000025
|
|
#define UNF_IO_FIRMWARE_RES_UNAVAILABLE 0x00000026
|
|
#define UNF_IO_TASK_MGT_OVERRUN 0x00000027
|
|
#define UNF_IO_DMA_ERROR 0x00000028
|
|
#define UNF_IO_DIF_ERROR 0x00000029
|
|
#define UNF_IO_NO_LPORT 0x0000002a
|
|
#define UNF_IO_NO_XCHG 0x0000002b
|
|
#define UNF_IO_SOFT_ERR 0x0000002c
|
|
#define UNF_IO_XCHG_ADD_ERROR 0x0000002d
|
|
#define UNF_IO_NO_LOGIN 0x0000002e
|
|
#define UNF_IO_NO_BUFFER 0x0000002f
|
|
#define UNF_IO_DID_ERROR 0x00000030
|
|
#define UNF_IO_UNSUPPORT 0x00000031
|
|
#define UNF_IO_NOREADY 0x00000032
|
|
#define UNF_IO_NPORTID_REUSED 0x00000033
|
|
#define UNF_IO_NPORT_HANDLE_REUSED 0x00000034
|
|
#define UNF_IO_NO_NPORT_HANDLE 0x00000035
|
|
#define UNF_IO_ABORT_BY_FW 0x00000036
|
|
#define UNF_IO_ABORT_PORT_REMOVING 0x00000037
|
|
#define UNF_IO_INCOMPLETE 0x00000038
|
|
#define UNF_IO_DIF_REF_ERROR 0x00000039
|
|
#define UNF_IO_DIF_GEN_ERROR 0x0000003a
|
|
|
|
#define UNF_IO_ERREND 0xFFFFFFFF
|
|
|
|
/* define bits */
|
|
#define UNF_BIT(n) (0x1UL << (n))
|
|
#define UNF_BIT_0 UNF_BIT(0)
|
|
#define UNF_BIT_1 UNF_BIT(1)
|
|
#define UNF_BIT_2 UNF_BIT(2)
|
|
#define UNF_BIT_3 UNF_BIT(3)
|
|
#define UNF_BIT_4 UNF_BIT(4)
|
|
#define UNF_BIT_5 UNF_BIT(5)
|
|
|
|
struct buff_list_s {
|
|
u8 *vaddr;
|
|
dma_addr_t paddr;
|
|
};
|
|
|
|
struct buf_describe_s {
|
|
struct buff_list_s *buflist;
|
|
u32 buf_size;
|
|
u32 buf_num;
|
|
};
|
|
|
|
#define BUF_LIST_PAGE_SIZE (PAGE_SIZE << 8)
|
|
|
|
/* Echo macro define */
|
|
#define ECHO_MG_VERSION_LOCAL 1
|
|
#define ECHO_MG_VERSION_REMOTE 2
|
|
|
|
/* save hba info macro define */
|
|
#define SAVE_PORT_INFO_LEN 1016
|
|
|
|
#define UNF_GET_NAME_HIGH_WORD(v_name) \
|
|
(((v_name) >> 32) & 0xffffffff)
|
|
#define UNF_GET_NAME_LOW_WORD(v_name) \
|
|
((v_name) & 0xffffffff)
|
|
|
|
#define UNF_FIRST_LPORT_ID_MASK 0xffffff00
|
|
#define HIFC_MAX_COUNTER_TYPE 128
|
|
|
|
#define UNF_EVENT_ASYN 0
|
|
#define UNF_EVENT_SYN 1
|
|
#define UNF_GLOBAL_EVENT_ASYN 2
|
|
#define UNF_GLOBAL_EVENT_SYN 3
|
|
|
|
/* define sfp err */
|
|
#define UNF_SFP_PRESENT_FAIL 0x1
|
|
#define UNF_SFP_POWER_FAIL 0x2
|
|
#define UNF_9545_FAIL 0x3
|
|
|
|
/* obtain the values of board type and ID */
|
|
#define UNF_GET_BOARD_TYPE_AND_SLOT_ID_BY_PORTID(port_id) \
|
|
(((port_id) & 0x00FF00) >> 8)
|
|
|
|
#define UNF_FC_SERVER_BOARD_8_G 13 /* 8G mode */
|
|
#define UNF_FC_SERVER_BOARD_16_G 7 /* 16G mode */
|
|
#define UNF_FC_SERVER_BOARD_32_G 6 /* 32G mode */
|
|
|
|
#define UNF_PORT_TYPE_FC_QSFP 1
|
|
#define UNF_PORT_TYPE_FC_SFP 0
|
|
#define UNF_PORT_UNGRADE_FW_RESET_ACTIVE 0
|
|
#define UNF_PORT_UNGRADE_FW_RESET_INACTIVE 1
|
|
|
|
#ifndef __BIG_ENDIAN__
|
|
#define __BIG_ENDIAN__ 0x4321
|
|
#endif
|
|
|
|
#ifndef __LITTLE_ENDIAN__
|
|
#define __LITTLE_ENDIAN__ 0x1234
|
|
#endif
|
|
|
|
#ifdef __BYTE_ORDER__
|
|
#undef __BYTE_ORDER__
|
|
#endif
|
|
#define __BYTE_ORDER__ __LITTLE_ENDIAN__
|
|
|
|
#ifndef INVALID_VALUE64
|
|
#define INVALID_VALUE64 0xFFFFFFFFFFFFFFFFULL
|
|
#endif /* INVALID_VALUE64 */
|
|
|
|
#ifndef INVALID_VALUE32
|
|
#define INVALID_VALUE32 0xFFFFFFFF
|
|
#endif /* INVALID_VALUE32 */
|
|
|
|
#ifndef INVALID_VALUE16
|
|
#define INVALID_VALUE16 0xFFFF
|
|
#endif /* INVALID_VALUE16 */
|
|
|
|
#ifndef INVALID_VALUE8
|
|
#define INVALID_VALUE8 0xFF
|
|
#endif /* INVALID_VALUE8 */
|
|
|
|
#ifndef RETURN_OK
|
|
#define RETURN_OK 0
|
|
#endif
|
|
|
|
#ifndef RETURN_ERROR
|
|
#define RETURN_ERROR (~0)
|
|
#endif
|
|
#define UNF_RETURN_ERROR (~0)
|
|
|
|
#ifndef UNF_RETURN_NOT_SUPPORT
|
|
#define UNF_RETURN_NOT_SUPPORT (2)
|
|
#endif
|
|
|
|
enum int_e {
|
|
UNF_FALSE = 0,
|
|
UNF_TRUE = 1
|
|
};
|
|
|
|
#define DRV_DIF_CRC_ERR 0x1001
|
|
#define DRV_DIF_LBA_ERR 0x1002
|
|
#define DRV_DIF_APP_ERR 0x1003
|
|
|
|
#define UNF_SCSI_SENSE_DATA_LEN SCSI_SENSE_DATA_LEN
|
|
|
|
/* RPort Management information related to Rport,
|
|
* only used at the boundary between common and lowlevel
|
|
*/
|
|
struct unf_rport_info_s {
|
|
unsigned int local_nport_id;
|
|
unsigned int nport_id;
|
|
unsigned int rport_index;
|
|
unsigned long long port_name;
|
|
unsigned char rsvd0[3];
|
|
};
|
|
|
|
struct unf_cfg_item_s {
|
|
char *name;
|
|
unsigned int min_value;
|
|
unsigned int default_value;
|
|
unsigned int max_value;
|
|
};
|
|
|
|
struct unf_port_params_s {
|
|
unsigned int ra_tov;
|
|
unsigned int ed_tov;
|
|
};
|
|
|
|
/* get wwpn adn wwnn */
|
|
struct unf_get_chip_info_argout {
|
|
unsigned char board_type;
|
|
unsigned long long wwpn;
|
|
unsigned long long wwnn;
|
|
unsigned long long sys_mac;
|
|
};
|
|
|
|
/* get sfp info: present and speed */
|
|
struct unf_get_port_info_argout {
|
|
unsigned char sfp_speed;
|
|
unsigned char present;
|
|
unsigned char rsvd[2];
|
|
};
|
|
|
|
/* SFF-8436(QSFP+) Rev 4.7 */
|
|
struct sfp_plus_field_a0_s {
|
|
unsigned char identifier;
|
|
/* offset 1~2 */
|
|
struct {
|
|
unsigned char reserved;
|
|
unsigned char status;
|
|
} status_indicator;
|
|
/* offset 3~21 */
|
|
struct {
|
|
unsigned char rx_tx_los;
|
|
unsigned char tx_fault;
|
|
unsigned char all_resv;
|
|
|
|
unsigned char ini_complete : 1;
|
|
unsigned char bit_resv : 3;
|
|
unsigned char temp_low_warn : 1;
|
|
unsigned char temp_high_warn : 1;
|
|
unsigned char temp_low_alarm : 1;
|
|
unsigned char temp_high_alarm : 1;
|
|
|
|
unsigned char resv : 4;
|
|
unsigned char vcc_low_warn : 1;
|
|
unsigned char vcc_high_warn : 1;
|
|
unsigned char vcc_low_alarm : 1;
|
|
unsigned char vcc_high_alarm : 1;
|
|
|
|
unsigned char resv8;
|
|
unsigned char rx_pow[2];
|
|
unsigned char tx_bias[2];
|
|
unsigned char reserved[6];
|
|
unsigned char vendor_specifics[3];
|
|
} interrupt_flag;
|
|
/* offset 22~33 */
|
|
struct {
|
|
unsigned char temp[2];
|
|
unsigned char reserved[2];
|
|
unsigned char supply_vol[2];
|
|
unsigned char reserveds[2];
|
|
unsigned char vendor_specific[4];
|
|
} module_monitors;
|
|
/* offset 34~81 */
|
|
struct {
|
|
unsigned char rx_pow[8];
|
|
unsigned char tx_bias[8];
|
|
unsigned char reserved[16];
|
|
unsigned char vendor_specific[16];
|
|
} channel_monitor_val;
|
|
|
|
/* offset 82~85 */
|
|
unsigned char reserved[4];
|
|
|
|
/* offset 86~97 */
|
|
struct {
|
|
/* 86~88 */
|
|
unsigned char tx_disable;
|
|
unsigned char rx_rate_select;
|
|
unsigned char tx_rate_select;
|
|
|
|
/* 89~92 */
|
|
unsigned char rx_4_app_select;
|
|
unsigned char rx_3_app_select;
|
|
unsigned char rx_2_app_select;
|
|
unsigned char rx_1_app_select;
|
|
/* 93 */
|
|
unsigned char power_override : 1;
|
|
unsigned char power_set : 1;
|
|
unsigned char reserved : 6;
|
|
|
|
/* 94~97 */
|
|
unsigned char tx_4_app_select;
|
|
unsigned char tx_3_app_select;
|
|
unsigned char tx_2_app_select;
|
|
unsigned char tx_1_app_select;
|
|
/* 98~99 */
|
|
unsigned char auc_reserved[2];
|
|
} control;
|
|
/* 100~106 */
|
|
struct {
|
|
/* 100 */
|
|
unsigned char mrx_1_os : 1;
|
|
unsigned char mrx_2_los : 1;
|
|
unsigned char mrx_3_los : 1;
|
|
unsigned char mrx_4_los : 1;
|
|
unsigned char mtx_1_los : 1;
|
|
unsigned char mtx_2_los : 1;
|
|
unsigned char mtx_3_los : 1;
|
|
unsigned char mtx_4_los : 1;
|
|
/* 101 */
|
|
unsigned char mtx_1_fault : 1;
|
|
unsigned char mtx_2_fault : 1;
|
|
unsigned char mtx_3_fault : 1;
|
|
unsigned char mtx_4_fault : 1;
|
|
unsigned char reserved : 4;
|
|
/* 102 */
|
|
unsigned char uc_reserved;
|
|
/* 103 */
|
|
unsigned char mini_cmp_flag : 1;
|
|
unsigned char rsv : 3;
|
|
unsigned char mtemp_low_warn : 1;
|
|
unsigned char mtemp_high_warn : 1;
|
|
unsigned char mtemp_low_alarm : 1;
|
|
unsigned char mtemp_high_alarm : 1;
|
|
/* 104 */
|
|
unsigned char rsv1 : 4;
|
|
unsigned char mvcc_low_warn : 1;
|
|
unsigned char mvcc_high_warn : 1;
|
|
unsigned char mvcc_low_alarm : 1;
|
|
unsigned char mvcc_high_alarm : 1;
|
|
/* 105~106 */
|
|
unsigned char vendor_specific[2];
|
|
} module_channel_mask_bit;
|
|
/* 107~118 */
|
|
unsigned char auc_resv[12];
|
|
/* 119~126 */
|
|
unsigned char auc_reserved[8];
|
|
/* 127 */
|
|
unsigned char page_select;
|
|
};
|
|
|
|
/* page 00 */
|
|
struct sfp_plus_field_00_s {
|
|
/* 128~191 */
|
|
struct {
|
|
unsigned char id;
|
|
unsigned char id_ext;
|
|
unsigned char connector;
|
|
unsigned char speci_com[6];
|
|
unsigned char mode;
|
|
unsigned char speed;
|
|
unsigned char encoding;
|
|
unsigned char br_nominal;
|
|
unsigned char ext_rate_select_com;
|
|
unsigned char length_smf;
|
|
unsigned char length_om3;
|
|
unsigned char length_om2;
|
|
unsigned char length_om1;
|
|
unsigned char length_copper;
|
|
unsigned char device_tech;
|
|
unsigned char vendor_name[16];
|
|
unsigned char ex_module;
|
|
unsigned char vendor_oui[3];
|
|
unsigned char vendor_pn[16];
|
|
unsigned char vendor_rev[2];
|
|
/* Wave length or Copper cable Attenuation */
|
|
unsigned char wave_or_copper_attenuation[2];
|
|
unsigned char wave_length_toler[2]; /* Wavelength tolerance */
|
|
unsigned char max_temp;
|
|
unsigned char cc_base;
|
|
} base_id_fields;
|
|
/* 192~223 */
|
|
struct {
|
|
unsigned char options[4];
|
|
unsigned char vendor_sn[16];
|
|
unsigned char date_code[8];
|
|
unsigned char diagn_monit_type;
|
|
unsigned char enhance_opt;
|
|
unsigned char uc_reserved;
|
|
unsigned char ccext;
|
|
} ext_id_fields;
|
|
/* 224~255 */
|
|
unsigned char vendor_spec_eeprom[32];
|
|
};
|
|
|
|
/* page 01 */
|
|
struct sfp_field_01_s {
|
|
unsigned char optiona_l01[128];
|
|
};
|
|
|
|
/* page 02 */
|
|
struct sfp_field_02_s {
|
|
unsigned char optiona_l02[128];
|
|
};
|
|
|
|
/* page 03 */
|
|
struct sfp_field_03_s {
|
|
unsigned char temp_high_alarm[2];
|
|
unsigned char temp_low_alarm[2];
|
|
unsigned char temp_high_warn[2];
|
|
unsigned char temp_low_warn[2];
|
|
|
|
unsigned char reserved1[8];
|
|
|
|
unsigned char vcc_high_alarm[2];
|
|
unsigned char vcc_low_alarm[2];
|
|
unsigned char vcc_high_warn[2];
|
|
unsigned char vcc_low_warn[2];
|
|
|
|
unsigned char reserved2[8];
|
|
unsigned char vendor_specific1[16];
|
|
|
|
unsigned char pow_high_alarm[2];
|
|
unsigned char pow_low_alarm[2];
|
|
unsigned char pow_high_warn[2];
|
|
unsigned char pow_low_warn[2];
|
|
|
|
unsigned char bias_high_alarm[2];
|
|
unsigned char bias_low_alarm[2];
|
|
unsigned char bias_high_warn[2];
|
|
unsigned char bias_low_warn[2];
|
|
|
|
unsigned char tx_power_high_alarm[2];
|
|
unsigned char tx_power_low_alarm[2];
|
|
unsigned char reserved3[4];
|
|
|
|
unsigned char reserved4[8];
|
|
|
|
unsigned char vendor_specific2[16];
|
|
unsigned char reserved5[2];
|
|
unsigned char vendor_specific3[12];
|
|
unsigned char rx_ampl[2];
|
|
unsigned char rx_tx_sq_disable;
|
|
unsigned char rx_output_disable;
|
|
unsigned char chan_monit_mask[12];
|
|
unsigned char reserved6[2];
|
|
|
|
};
|
|
|
|
struct sfp_plus_info_s {
|
|
struct sfp_plus_field_a0_s sfp_plus_info_a0;
|
|
struct sfp_plus_field_00_s sfp_plus_info_00;
|
|
struct sfp_field_01_s sfp_plus_info_01;
|
|
struct sfp_field_02_s sfp_plus_info_02;
|
|
struct sfp_field_03_s sfp_plus_info_03;
|
|
};
|
|
|
|
/* SFF-8472 Rev 10.4 */
|
|
struct unf_sfp_data_field_a0_s {
|
|
/* Offset 0~63 */
|
|
struct {
|
|
unsigned char id;
|
|
unsigned char id_ext;
|
|
unsigned char connector;
|
|
unsigned char atransceiver[8];
|
|
unsigned char encoding;
|
|
/* Nominal signalling rate, units of 100MBd. */
|
|
unsigned char br_nominal;
|
|
/* Type of rate select functionality */
|
|
unsigned char rate_identifier;
|
|
/* Link length supported for single mode fiber, units of km */
|
|
unsigned char length_smf_km;
|
|
/* Link length supported for single mode fiber,
|
|
* units of 100 m
|
|
*/
|
|
unsigned char length_smf;
|
|
/* Link length supported for 50 um OM2 fiber, units of 10 m */
|
|
unsigned char length_smf_om2;
|
|
/* Link length supported for 62.5 um OM1 fiber, units of 10 m */
|
|
unsigned char length_smf_om1;
|
|
/* Link length supported for copper or direct attach cable,
|
|
* units of m
|
|
*/
|
|
unsigned char length_cable;
|
|
/* Link length supported for 50 um OM3 fiber, units of 10 m */
|
|
unsigned char length_om3;
|
|
unsigned char vendor_name[16]; /* ASCII */
|
|
/* Code for electronic or optical compatibility */
|
|
unsigned char transceiver;
|
|
unsigned char vendor_oui[3]; /* SFP vendor IEEE company ID */
|
|
/* Part number provided by SFP vendor (ASCII) */
|
|
unsigned char vendor_pn[16];
|
|
/* Revision level for part number provided by vendor (ASCII) */
|
|
unsigned char vendor_rev[4];
|
|
/* Laser wavelength (Passive/Active Cable
|
|
* Specification Compliance)
|
|
*/
|
|
unsigned char wave_length[2];
|
|
unsigned char unallocated;
|
|
/* Check code for Base ID Fields (addresses 0 to 62) */
|
|
unsigned char cc_base;
|
|
} base_id_fields;
|
|
|
|
/* Offset 64~95 */
|
|
struct {
|
|
unsigned char options[2];
|
|
unsigned char br_max;
|
|
unsigned char br_min;
|
|
unsigned char vendor_sn[16];
|
|
unsigned char date_code[8];
|
|
unsigned char diag_monitoring_type;
|
|
unsigned char enhanced_options;
|
|
unsigned char sff8472_compliance;
|
|
unsigned char cc_ext;
|
|
} ext_id_fields;
|
|
|
|
/* Offset 96~255 */
|
|
struct {
|
|
unsigned char vendor_spec_eeprom[32];
|
|
unsigned char rsvd[128];
|
|
} vendor_spec_id_fields;
|
|
};
|
|
|
|
struct unf_sfp_data_field_a2_s {
|
|
/* Offset 0~119 */
|
|
struct {
|
|
/* 0~39 */
|
|
struct {
|
|
unsigned char temp_alarm_high[2];
|
|
unsigned char temp_alarm_low[2];
|
|
unsigned char temp_warning_high[2];
|
|
unsigned char temp_warning_low[2];
|
|
|
|
unsigned char vcc_alarm_high[2];
|
|
unsigned char vcc_alarm_low[2];
|
|
unsigned char vcc_warning_high[2];
|
|
unsigned char vcc_warning_low[2];
|
|
|
|
unsigned char bias_alarm_high[2];
|
|
unsigned char bias_alarm_low[2];
|
|
unsigned char bias_warning_high[2];
|
|
unsigned char bias_warning_low[2];
|
|
|
|
unsigned char tx_alarm_high[2];
|
|
unsigned char tx_alarm_low[2];
|
|
unsigned char tx_warning_high[2];
|
|
unsigned char tx_warning_low[2];
|
|
|
|
unsigned char rx_alarm_high[2];
|
|
unsigned char rx_alarm_low[2];
|
|
unsigned char rx_warning_high[2];
|
|
unsigned char rx_warning_low[2];
|
|
} alarm_warn_th;
|
|
|
|
unsigned char unallocated0[16];
|
|
unsigned char ext_cal_constants[36];
|
|
unsigned char unallocated1[3];
|
|
unsigned char cc_dmi;
|
|
|
|
/* 96~105 */
|
|
struct {
|
|
unsigned char temp[2];
|
|
unsigned char vcc[2];
|
|
unsigned char tx_bias[2];
|
|
unsigned char tx_power[2];
|
|
unsigned char rx_power[2];
|
|
} diag;
|
|
|
|
unsigned char unallocated2[4];
|
|
|
|
struct {
|
|
unsigned char data_rdy_bar_state : 1;
|
|
unsigned char rx_los : 1;
|
|
unsigned char tx_fault_state : 1;
|
|
unsigned char soft_rate_select_state : 1;
|
|
unsigned char rate_select_state : 1;
|
|
unsigned char rs_state : 1;
|
|
unsigned char soft_tx_disable_select : 1;
|
|
unsigned char tx_disable_state : 1;
|
|
} status_ctrl;
|
|
unsigned char rsvd;
|
|
|
|
/* 112~113 */
|
|
struct {
|
|
/* 112 */
|
|
unsigned char tx_alarm_low : 1;
|
|
unsigned char tx_alarm_high : 1;
|
|
unsigned char tx_bias_alarm_low : 1;
|
|
unsigned char tx_bias_alarm_high : 1;
|
|
unsigned char vcc_alarm_low : 1;
|
|
unsigned char vcc_alarm_high : 1;
|
|
unsigned char temp_alarm_low : 1;
|
|
unsigned char temp_alarm_high : 1;
|
|
|
|
/* 113 */
|
|
unsigned char rsvd : 6;
|
|
unsigned char rx_alarm_low : 1;
|
|
unsigned char rx_alarm_high : 1;
|
|
} alarm;
|
|
|
|
unsigned char unallocated3[2];
|
|
|
|
/* 116~117 */
|
|
struct {
|
|
/* 116 */
|
|
unsigned char tx_warn_lo : 1;
|
|
unsigned char tx_warn_hi : 1;
|
|
unsigned char bias_warn_lo : 1;
|
|
unsigned char bias_warn_hi : 1;
|
|
unsigned char vcc_warn_lo : 1;
|
|
unsigned char vcc_warn_hi : 1;
|
|
unsigned char temp_warn_lo : 1;
|
|
unsigned char temp_warn_hi : 1;
|
|
|
|
/* 117 */
|
|
unsigned char rsvd : 6;
|
|
unsigned char rx_warn_lo : 1;
|
|
unsigned char rx_warn_hi : 1;
|
|
} warning;
|
|
|
|
unsigned char ext_status_and_ctrl[2];
|
|
} diag;
|
|
|
|
/* Offset 120~255 */
|
|
struct {
|
|
unsigned char vendor_spec[8];
|
|
unsigned char user_eeprom[120];
|
|
unsigned char vendor_ctrl[8];
|
|
} general_use_fields;
|
|
};
|
|
|
|
struct unf_sfp_info_s {
|
|
struct unf_sfp_data_field_a0_s sfp_info_a0;
|
|
struct unf_sfp_data_field_a2_s sfp_info_a2;
|
|
};
|
|
|
|
union unf_sfp_eeprome_info {
|
|
struct unf_sfp_info_s sfp_info;
|
|
struct sfp_plus_info_s sfp_plus_info;
|
|
};
|
|
|
|
/* sfp info end */
|
|
struct unf_lport_sfp_info {
|
|
unsigned int status;
|
|
union unf_sfp_eeprome_info sfp_eeprom_info;
|
|
};
|
|
|
|
struct unf_err_code_s {
|
|
unsigned int loss_of_signal_count;
|
|
unsigned int bad_rx_char_count;
|
|
unsigned int loss_of_sync_count;
|
|
unsigned int link_fail_count;
|
|
unsigned int rx_eo_fa_count;
|
|
unsigned int dis_frame_count;
|
|
unsigned int bad_crc_count;
|
|
unsigned int proto_error_count;
|
|
};
|
|
|
|
/* config file */
|
|
enum unf_scsi_mode_e {
|
|
UNF_PORT_MODE_UNKNOWN = 0x00,
|
|
UNF_PORT_MODE_TGT = 0x10,
|
|
UNF_PORT_MODE_INI = 0x20,
|
|
UNF_PORT_MODE_BOTH = 0x30
|
|
};
|
|
|
|
enum unf_port_upgrade_e {
|
|
UNF_PORT_UNSUPPORT_UPGRADE_REPORT = 0x00,
|
|
UNF_PORT_SUPPORT_UPGRADE_REPORT = 0x01,
|
|
UNF_PORT_UPGRADE_BUTT
|
|
};
|
|
|
|
#define UNF_BYTES_OF_DWORD 0x4
|
|
static inline void __attribute__((unused)) unf_big_end_to_cpu(
|
|
unsigned char *v_buffer, unsigned int v_size)
|
|
{
|
|
unsigned int *buffer = NULL;
|
|
unsigned int word_sum = 0;
|
|
unsigned int i = 0;
|
|
|
|
if (!v_buffer)
|
|
return;
|
|
|
|
buffer = (unsigned int *)v_buffer;
|
|
|
|
/* byte to word */
|
|
if (v_size % UNF_BYTES_OF_DWORD == 0)
|
|
word_sum = v_size / UNF_BYTES_OF_DWORD;
|
|
else
|
|
return;
|
|
|
|
/* word to byte */
|
|
while (i < word_sum) {
|
|
*buffer = be32_to_cpu(*buffer);
|
|
buffer++;
|
|
i++;
|
|
}
|
|
}
|
|
|
|
static inline void __attribute__((unused)) unf_cpu_to_big_end(
|
|
void *v_buffer, unsigned int v_size)
|
|
{
|
|
#define DWORD_BIT 32
|
|
#define BYTE_BIT 8
|
|
unsigned int *buffer = NULL;
|
|
unsigned int word_sum = 0;
|
|
unsigned int i = 0;
|
|
unsigned int tmp = 0;
|
|
|
|
if (!v_buffer)
|
|
return;
|
|
|
|
buffer = (unsigned int *)v_buffer;
|
|
|
|
/* byte to dword */
|
|
word_sum = v_size / 4;
|
|
|
|
/* dword to byte */
|
|
while (i < word_sum) {
|
|
*buffer = cpu_to_be32(*buffer);
|
|
buffer++;
|
|
i++;
|
|
}
|
|
|
|
if (v_size % 4) {
|
|
tmp = cpu_to_be32(*buffer);
|
|
tmp = tmp >> (DWORD_BIT - (v_size % 4) * BYTE_BIT);
|
|
memcpy(buffer, &tmp, (v_size % 4));
|
|
}
|
|
}
|
|
|
|
#define UNF_FUNCTION_RETURN_CHECK(ret, dstlen) \
|
|
do { \
|
|
if (((ret) <= 0) || ((ret) >= (dstlen))) { \
|
|
UNF_TRACE(UNF_EVTLOG_DRIVER_ERR, \
|
|
UNF_LOG_REG_ATT, UNF_ERR, \
|
|
"function return (%d) check invalid, dst len(%d).", \
|
|
(ret), (dstlen)); \
|
|
} \
|
|
} while (0)
|
|
|
|
#define UNF_TOP_AUTO_MASK 0x0f
|
|
|
|
#define UNF_NORMAL_MODE 0
|
|
#define UNF_SET_NOMAL_MODE(mode) (mode = UNF_NORMAL_MODE)
|
|
|
|
/*
|
|
* SCSI status
|
|
*/
|
|
#define SCSI_CHECK_CONDITION 0x02
|
|
|
|
enum unf_act_topo_e {
|
|
UNF_ACT_TOP_PUBLIC_LOOP = 0x1,
|
|
UNF_ACT_TOP_PRIVATE_LOOP = 0x2,
|
|
UNF_ACT_TOP_P2P_DIRECT = 0x4,
|
|
UNF_ACT_TOP_P2P_FABRIC = 0x8,
|
|
UNF_TOP_LOOP_MASK = 0x03,
|
|
UNF_TOP_P2P_MASK = 0x0c,
|
|
UNF_TOP_FCOE_MASK = 0x30,
|
|
UNF_ACT_TOP_UNKNOWN
|
|
};
|
|
|
|
#define UNF_FL_PORT_LOOP_ADDR 0x00
|
|
|
|
#define UNF_FC_PROTOCOL_TYPE 0x100
|
|
|
|
#define UNF_LOOP_ROLE_MASTER_OR_SLAVE 0x0
|
|
|
|
#define UNF_TOU16_CHECK(dest, src, over_action) \
|
|
do { \
|
|
if (unlikely((src) > 0xFFFF)) { \
|
|
UNF_TRACE(UNF_EVTLOG_DRIVER_ERR, UNF_LOG_REG_ATT, \
|
|
UNF_ERR, "ToU16 error, src 0x%x ", (src)); \
|
|
over_action; \
|
|
} \
|
|
((dest) = (unsigned short)(src)); \
|
|
} while (0)
|
|
|
|
#define UNF_PORT_SPEED_AUTO 0
|
|
#define UNF_PORT_SPEED_2_G 2
|
|
#define UNF_PORT_SPEED_4_G 4
|
|
#define UNF_PORT_SPEED_8_G 8
|
|
#define UNF_PORT_SPEED_10_G 10
|
|
#define UNF_PORT_SPEED_16_G 16
|
|
#define UNF_PORT_SPEED_32_G 32
|
|
|
|
#define UNF_PORT_SPEED_UNKNOWN (~0)
|
|
#define UNF_PORT_SFP_SPEED_ERR 0xFF
|
|
|
|
#define UNF_FW_VERSION_LEN 32
|
|
#define UNF_HW_VERSION_LEN 32
|
|
|
|
/* max frame size */
|
|
#define UNF_MAX_FRAME_SIZE 2112
|
|
|
|
/* default */
|
|
#define UNF_DEFAULT_FRAME_SIZE 2048
|
|
#define UNF_DEFAULT_EDTOV 2000
|
|
#define UNF_DEFAULT_RATOV 10000
|
|
#define UNF_DEFAULT_FABRIC_RATOV 10000
|
|
#define UNF_MAX_RETRY_COUNT 3
|
|
#define UNF_DEFAULT_RRTOV (10000 + 500) /* FCP-4 10.4.10 */
|
|
#define UNF_RRQ_MIN_TIMEOUT_INTERVAL 30000
|
|
#define UNF_LOGO_TIMEOUT_INTERVAL 3000
|
|
#define UNF_WRITE_RRQ_SENDERR_INTERVAL 3000
|
|
#define UNF_REC_TOV 3000
|
|
|
|
#define UNF_WAIT_SEM_TIMEOUT (5000UL)
|
|
#define UNF_WAIT_ABTS_RSP_TIMEOUT (20000UL)
|
|
|
|
#define UNF_INI_RRQ_REDUNDANT_TIME 500
|
|
#define UNF_INI_ELS_REDUNDANT_TIME 2000
|
|
|
|
/* ELS command values */
|
|
#define UNF_ELS_CMND_HIGH_MASK 0xff000000
|
|
#define UNF_ELS_CMND_RJT 0x01000000
|
|
#define UNF_ELS_CMND_ACC 0x02000000
|
|
#define UNF_ELS_CMND_PLOGI 0x03000000
|
|
#define UNF_ELS_CMND_FLOGI 0x04000000
|
|
#define UNF_ELS_CMND_LOGO 0x05000000
|
|
#define UNF_ELS_CMND_RLS 0x0F000000
|
|
#define UNF_ELS_CMND_ECHO 0x10000000
|
|
#define UNF_ELS_CMND_REC 0x13000000
|
|
#define UNF_ELS_CMND_RRQ 0x12000000
|
|
#define UNF_ELS_CMND_PRLI 0x20000000
|
|
#define UNF_ELS_CMND_PRLO 0x21000000
|
|
#define UNF_ELS_CMND_PDISC 0x50000000
|
|
#define UNF_ELS_CMND_FDISC 0x51000000
|
|
#define UNF_ELS_CMND_ADISC 0x52000000
|
|
#define UNF_ELS_CMND_FAN 0x60000000
|
|
#define UNF_ELS_CMND_RSCN 0x61000000
|
|
#define UNF_FCP_CMND_SRR 0x14000000
|
|
#define UNF_GS_CMND_SCR 0x62000000
|
|
|
|
#define UNF_PLOGI_VERSION_UPPER 0x20
|
|
#define UNF_PLOGI_VERSION_LOWER 0x20
|
|
#define UNF_PLOGI_CONCURRENT_SEQ 0x00FF
|
|
#define UNF_PLOGI_RO_CATEGORY 0x00FE
|
|
#define UNF_PLOGI_SEQ_PER_XCHG 0x0001
|
|
|
|
/* CT_IU pream defines */
|
|
#define UNF_REV_NPORTID_INIT 0x01000000
|
|
#define UNF_FSTYPE_OPT_INIT 0xfc020000
|
|
#define UNF_FSTYPE_RFT_ID 0x02170000
|
|
#define UNF_FSTYPE_GID_PT 0x01A10000
|
|
#define UNF_FSTYPE_GID_FT 0x01710000
|
|
#define UNF_FSTYPE_RFF_ID 0x021F0000
|
|
#define UNF_FSTYPE_GFF_ID 0x011F0000
|
|
#define UNF_FSTYPE_GNN_ID 0x01130000
|
|
#define UNF_FSTYPE_GPN_ID 0x01120000
|
|
|
|
#define UNF_CT_IU_RSP_MASK 0xffff0000
|
|
#define UNF_CT_IU_REASON_MASK 0x00ff0000
|
|
#define UNF_CT_IU_EXPLAN_MASK 0x0000ff00
|
|
#define UNF_CT_IU_REJECT 0x80010000
|
|
#define UNF_CT_IU_ACCEPT 0x80020000
|
|
|
|
#define UNF_FABRIC_FULL_REG 0x00000003
|
|
|
|
#define UNF_FC4_SCSI_BIT8 0x00000100
|
|
#define UNF_FC4_FCP_TYPE 0x00000008
|
|
#define UNF_FRAG_REASON_VENDOR 0
|
|
|
|
/* GID_PT, GID_FT */
|
|
#define UNF_GID_PT_TYPE 0x7F000000
|
|
#define UNF_GID_FT_TYPE 0x00000008
|
|
|
|
/*
|
|
* FC4 defines
|
|
*/
|
|
#define UNF_FC4_FRAME_PAGE_SIZE 0x10
|
|
#define UNF_FC4_FRAME_PAGE_SIZE_SHIFT 16
|
|
|
|
#define UNF_FC4_FRAME_PARM_0_FCP 0x08000000
|
|
#define UNF_FC4_FRAME_PARM_0_I_PAIR 0x00002000
|
|
#define UNF_FC4_FRAME_PARM_0_GOOD_RSP_CODE 0x00000100
|
|
|
|
#define UNF_FC4_FRAME_PARM_3_INI 0x00000020
|
|
#define UNF_FC4_FRAME_PARM_3_TGT 0x00000010
|
|
#define UNF_FC4_FRAME_PARM_3_R_XFER_DIS 0x00000002
|
|
#define UNF_FC4_FRAME_PARM_3_CONF_ALLOW 0x00000080 /* bit 7 */
|
|
#define UNF_FC4_FRAME_PARM_3_REC_SUPPORT 0x00000400 /* bit 10 */
|
|
#define UNF_FC4_FRAME_PARM_3_TASK_RETRY_ID_SUPPORT 0x00000200 /* bit 9 */
|
|
#define UNF_FC4_FRAME_PARM_3_RETRY_SUPPORT 0x00000100 /* bit 8 */
|
|
#define UNF_FC4_FRAME_PARM_3_CONF_ALLOW 0x00000080 /* bit 7 */
|
|
|
|
|
|
#define UNF_GFF_ACC_MASK 0xFF000000
|
|
|
|
/* Reject CT_IU Reason Codes */
|
|
#define UNF_CTIU_RJT_MASK 0xffff0000
|
|
#define UNF_CTIU_RJT_INVALID_COMMAND 0x00010000
|
|
#define UNF_CTIU_RJT_INVALID_VERSION 0x00020000
|
|
#define UNF_CTIU_RJT_LOGIC_ERR 0x00030000
|
|
#define UNF_CTIU_RJT_INVALID_SIZE 0x00040000
|
|
#define UNF_CTIU_RJT_LOGIC_BUSY 0x00050000
|
|
#define UNF_CTIU_RJT_PROTOCOL_ERR 0x00070000
|
|
#define UNF_CTIU_RJT_UNABLE_PERFORM 0x00090000
|
|
#define UNF_CTIU_RJT_NOT_SUPPORTED 0x000B0000
|
|
|
|
/* FS_RJT Reason code explanations, FC-GS-2 6.5 */
|
|
#define UNF_CTIU_RJT_EXP_MASK 0x0000FF00
|
|
#define UNF_CTIU_RJT_EXP_NO_ADDTION 0x00000000
|
|
#define UNF_CTIU_RJT_EXP_PORTID_NO_REG 0x00000100
|
|
#define UNF_CTIU_RJT_EXP_PORTNAME_NO_REG 0x00000200
|
|
#define UNF_CTIU_RJT_EXP_NODENAME_NO_REG 0x00000300
|
|
#define UNF_CTIU_RJT_EXP_FC4TYPE_NO_REG 0x00000700
|
|
#define UNF_CTIU_RJT_EXP_PORTTYPE_NO_REG 0x00000A00
|
|
|
|
/*
|
|
* LS_RJT defines
|
|
*/
|
|
#define UNF_FC_LS_RJT_REASON_MASK 0x00ff0000
|
|
|
|
/*
|
|
* LS_RJT reason code defines
|
|
*/
|
|
#define UNF_LS_OK 0x00000000
|
|
#define UNF_LS_RJT_INVALID_COMMAND 0x00010000
|
|
#define UNF_LS_RJT_LOGICAL_ERROR 0x00030000
|
|
#define UNF_LS_RJT_BUSY 0x00050000
|
|
#define UNF_LS_RJT_PROTOCOL_ERROR 0x00070000
|
|
#define UNF_LS_RJT_REQUEST_DENIED 0x00090000
|
|
#define UNF_LS_RJT_NOT_SUPPORTED 0x000b0000
|
|
#define UNF_LS_RJT_CLASS_ERROR 0x000c0000
|
|
|
|
/*
|
|
* LS_RJT code explanation
|
|
*/
|
|
#define UNF_LS_RJT_NO_ADDITIONAL_INFO 0x00000000
|
|
#define UNF_LS_RJT_INV_DATA_FIELD_SIZE 0x00000700
|
|
#define UNF_LS_RJT_INV_COMMON_SERV_PARAM 0x00000F00
|
|
#define UNF_LS_RJT_INVALID_OXID_RXID 0x00001700
|
|
#define UNF_LS_RJT_COMMAND_IN_PROGRESS 0x00001900
|
|
#define UNF_LS_RJT_INSUFFICIENT_RESOURCES 0x00002900
|
|
#define UNF_LS_RJT_COMMAND_NOT_SUPPORTED 0x00002C00
|
|
#define UNF_LS_RJT_UNABLE_TO_SUPLY_REQ_DATA 0x00002A00
|
|
#define UNF_LS_RJT_INVALID_PAYLOAD_LENGTH 0x00002D00
|
|
|
|
#define UNF_P2P_LOCAL_NPORT_ID 0x000000EF
|
|
#define UNF_P2P_REMOTE_NPORT_ID 0x000000D6
|
|
|
|
#define UNF_BBCREDIT_MANAGE_NFPORT 0
|
|
#define UNF_BBCREDIT_MANAGE_LPORT 1
|
|
#define UNF_BBCREDIT_LPORT 0
|
|
#define UNF_CONTIN_INCREASE_SUPPORT 1
|
|
#define UNF_CLASS_VALID 1
|
|
#define UNF_CLASS_INVALID 0
|
|
#define UNF_NOT_MEANINGFUL 0
|
|
#define UNF_NO_SERVICE_PARAMS 0
|
|
#define UNF_CLEAN_ADDRESS_DEFAULT 0
|
|
#define UNF_PRIORITY_ENABLE 1
|
|
#define UNF_PRIORITY_DISABLE 0
|
|
#define UNF_SEQUEN_DELIVERY_REQ 1 /* Sequential delivery requested */
|
|
|
|
/* RSCN */
|
|
#define UNF_RSCN_PORT_ADDR 0x0
|
|
#define UNF_RSCN_AREA_ADDR_GROUP 0x1
|
|
#define UNF_RSCN_DOMAIN_ADDR_GROUP 0x2
|
|
#define UNF_RSCN_FABRIC_ADDR_GROUP 0x3
|
|
|
|
#define UNF_GET_RSCN_PLD_LEN(v_cmnd) ((v_cmnd)&0x0000ffff)
|
|
#define UNF_RSCN_PAGE_LEN 0x4
|
|
|
|
#define UNF_PORT_LINK_UP 0x0000
|
|
#define UNF_PORT_LINK_DOWN 0x0001
|
|
#define UNF_PORT_RESET_START 0x0002
|
|
#define UNF_PORT_RESET_END 0x0003
|
|
#define UNF_PORT_LINK_UNKNOWN 0x0004
|
|
#define UNF_PORT_NOP 0x0005
|
|
#define UNF_PORT_CORE_FATAL_ERROR 0x0006
|
|
#define UNF_PORT_CORE_UNRECOVERABLE_ERROR 0x0007
|
|
#define UNF_PORT_CORE_RECOVERABLE_ERROR 0x0008
|
|
#define UNF_PORT_UPDATE_PROCESS 0x000b
|
|
#define UNF_PORT_DEBUG_DUMP 0x000c
|
|
#define UNF_PORT_GET_FWLOG 0x000d
|
|
#define UNF_PORT_CLEAN_DONE 0x000e
|
|
#define UNF_PORT_BEGIN_REMOVE 0x000f
|
|
#define UNF_PORT_RELEASE_RPORT_INDEX 0x0010
|
|
#define UNF_PORT_ABNORMAL_RESET 0x0012
|
|
|
|
#define UNF_READ 0
|
|
#define UNF_WRITE 1
|
|
#define UNF_READ_64 2
|
|
#define UNF_WRITE_64 3
|
|
/*
|
|
*SCSI begin
|
|
*/
|
|
#define SCSIOPC_TEST_UNIT_READY 0x00
|
|
#define SCSIOPC_INQUIRY 0x12
|
|
#define SCSIOPC_MODE_SENSE_6 0x1A
|
|
#define SCSIOPC_MODE_SENSE_10 0x5A
|
|
#define SCSIOPC_MODE_SELECT_6 0x15
|
|
#define SCSIOPC_RESERVE 0x16
|
|
#define SCSIOPC_RELEASE 0x17
|
|
#define SCSIOPC_START_STOP_UNIT 0x1B
|
|
#define SCSIOPC_READ_CAPACITY_10 0x25
|
|
#define SCSIOPC_READ_CAPACITY_16 0x9E
|
|
#define SCSIOPC_READ_6 0x08
|
|
#define SCSIOPC_READ_10 0x28
|
|
#define SCSIOPC_READ_12 0xA8
|
|
#define SCSIOPC_READ_16 0x88
|
|
#define SCSIOPC_WRITE_6 0x0A
|
|
#define SCSIOPC_WRITE_10 0x2A
|
|
#define SCSIOPC_WRITE_12 0xAA
|
|
#define SCSIOPC_WRITE_16 0x8A
|
|
#define SCSIOPC_WRITE_VERIFY 0x2E
|
|
#define SCSIOPC_VERIFY_10 0x2F
|
|
#define SCSIOPC_VERIFY_12 0xAF
|
|
#define SCSIOPC_VERIFY_16 0x8F
|
|
#define SCSIOPC_REQUEST_SENSE 0x03
|
|
#define SCSIOPC_REPORT_LUN 0xA0
|
|
#define SCSIOPC_FORMAT_UNIT 0x04
|
|
#define SCSIOPC_SEND_DIAGNOSTIC 0x1D
|
|
#define SCSIOPC_WRITE_SAME_10 0x41
|
|
#define SCSIOPC_WRITE_SAME_16 0x93
|
|
#define SCSIOPC_READ_BUFFER 0x3C
|
|
#define SCSIOPC_WRITE_BUFFER 0x3B
|
|
|
|
#define SCSIOPC_LOG_SENSE 0x4D
|
|
#define SCSIOPC_MODE_SELECT_10 0x55
|
|
#define SCSIOPC_SYNCHRONIZE_CACHE_10 0x35
|
|
#define SCSIOPC_SYNCHRONIZE_CACHE_16 0x91
|
|
#define SCSIOPC_WRITE_AND_VERIFY_10 0x2E
|
|
#define SCSIOPC_WRITE_AND_VERIFY_12 0xAE
|
|
#define SCSIOPC_WRITE_AND_VERIFY_16 0x8E
|
|
#define SCSIOPC_READ_MEDIA_SERIAL_NUMBER 0xAB
|
|
#define SCSIOPC_REASSIGN_BLOCKS 0x07
|
|
#define SCSIOPC_ATA_PASSTHROUGH_16 0x85
|
|
#define SCSIOPC_ATA_PASSTHROUGH_12 0xa1
|
|
|
|
/*
|
|
* SCSI end
|
|
*/
|
|
#define IS_READ_COMMAND(opcode) ((opcode) == SCSIOPC_READ_6 || \
|
|
(opcode) == SCSIOPC_READ_10 || \
|
|
(opcode) == SCSIOPC_READ_12 || \
|
|
(opcode) == SCSIOPC_READ_16)
|
|
#define IS_WRITE_COMMAND(opcode) ((opcode) == SCSIOPC_WRITE_6 || \
|
|
(opcode) == SCSIOPC_WRITE_10 || \
|
|
(opcode) == SCSIOPC_WRITE_12 || \
|
|
(opcode) == SCSIOPC_WRITE_16)
|
|
|
|
#define FCP_RSP_LEN_VALID_MASK 0x1
|
|
#define FCP_SNS_LEN_VALID_MASK 0x2
|
|
#define FCP_RESID_OVER_MASK 0x4
|
|
#define FCP_RESID_UNDER_MASK 0x8
|
|
#define FCP_CONF_REQ_MASK 0x10
|
|
#define FCP_SCSI_STATUS_GOOD 0x0
|
|
|
|
#define UNF_DELAYED_WORK_SYNC(v_ret, v_pord_id, v_work, v_work_symb) \
|
|
do { \
|
|
if (!cancel_delayed_work_sync(v_work)) { \
|
|
UNF_TRACE(UNF_EVTLOG_DRIVER_INFO, UNF_LOG_REG_ATT, \
|
|
UNF_INFO, \
|
|
"[info]LPort or RPort(0x%x) %s worker can't destroy, or no worker", \
|
|
v_pord_id, v_work_symb); \
|
|
v_ret = UNF_RETURN_ERROR; \
|
|
} else { \
|
|
v_ret = RETURN_OK; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define UNF_DELAYED_WORK(v_ret, v_pord_id, v_work, v_work_symb) \
|
|
do { \
|
|
if (!cancel_delayed_work(v_work)) { \
|
|
UNF_TRACE(UNF_EVTLOG_DRIVER_INFO, UNF_LOG_REG_ATT, \
|
|
UNF_MAJOR, \
|
|
"LPort or RPort(0x%x) %s worker can't destroy, or no worker.", \
|
|
v_pord_id, v_work_symb); \
|
|
v_ret = UNF_RETURN_ERROR; \
|
|
} else { \
|
|
v_ret = RETURN_OK; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define UNF_DELAYED_WORK_CONFUSED(v_ret, v_pord_id, v_work, v_work_symb) \
|
|
do { \
|
|
if (in_interrupt()) { \
|
|
UNF_DELAYED_WORK(v_ret, v_pord_id, v_work, \
|
|
v_work_symb) \
|
|
} else { \
|
|
UNF_DELAYED_WORK_SYNC(v_ret, v_pord_id, v_work, \
|
|
v_work_symb) \
|
|
} \
|
|
} while (0)
|
|
|
|
#define UNF_GET_IO_XCHG_TAG(v_pkg) \
|
|
((unsigned short)((v_pkg)->private[PKG_PRIVATE_XCHG_HOT_POOL_INDEX]))
|
|
|
|
#define UNF_GET_SFS_ENTRY(v_pkg) ((union unf_sfs_u *)(void *) \
|
|
(((struct unf_frame_pkg_s *)v_pkg)->unf_cmnd_pload_bl.buffer_ptr))
|
|
|
|
/* FLOGI */
|
|
#define UNF_GET_FLOGI_PAYLOAD(v_pkg) (&(((union unf_sfs_u *) \
|
|
(UNF_GET_SFS_ENTRY(v_pkg)))->flogi.flogi_payload))
|
|
#define UNF_FLOGI_PAYLOAD_LEN sizeof(struct unf_flogi_payload_s)
|
|
|
|
/* FLOGI ACC */
|
|
#define UNF_GET_FLOGI_ACC_PAYLOAD(v_pkg) (&(((union unf_sfs_u *) \
|
|
(UNF_GET_SFS_ENTRY(v_pkg)))->flogi_acc.flogi_payload))
|
|
#define UNF_FLOGI_ACC_PAYLOAD_LEN sizeof(struct unf_flogi_payload_s)
|
|
|
|
/* FDISC */
|
|
#define UNF_FDISC_PAYLOAD_LEN UNF_FLOGI_PAYLOAD_LEN
|
|
#define UNF_FDISC_ACC_PAYLOAD_LEN UNF_FLOGI_ACC_PAYLOAD_LEN
|
|
|
|
/* PLOGI */
|
|
#define UNF_GET_PLOGI_PAYLOAD(v_pkg) \
|
|
(&(((union unf_sfs_u *)(UNF_GET_SFS_ENTRY(v_pkg)))->plogi.payload))
|
|
#define UNF_PLOGI_PAYLOAD_LEN sizeof(struct unf_plogi_payload_s)
|
|
|
|
/* PLOGI ACC */
|
|
#define UNF_GET_PLOGI_ACC_PAYLOAD(v_pkg) \
|
|
(&(((union unf_sfs_u *)(UNF_GET_SFS_ENTRY(v_pkg)))->plogi_acc.payload))
|
|
#define UNF_PLOGI_ACC_PAYLOAD_LEN sizeof(struct unf_plogi_payload_s)
|
|
|
|
/* LOGO */
|
|
#define UNF_LOGO_PAYLOAD_LEN sizeof(struct unf_logo_payload_s)
|
|
|
|
/* ECHO */
|
|
#define UNF_GET_ECHO_PAYLOAD(v_pkg) \
|
|
(((union unf_sfs_u *)(UNF_GET_SFS_ENTRY(v_pkg)))->echo.echo_pld)
|
|
|
|
/* ECHO PHYADDR */
|
|
#define UNF_GET_ECHO_PAYLOAD_PHYADDR(v_pkg) \
|
|
(((union unf_sfs_u *)(UNF_GET_SFS_ENTRY(v_pkg)))->echo.phy_echo_addr)
|
|
|
|
#define UNF_ECHO_PAYLOAD_LEN sizeof(struct unf_echo_payload_s)
|
|
|
|
/* RLS */
|
|
#define UNF_RLS_PAYLOAD_LEN sizeof(struct unf_rls_payload_s)
|
|
|
|
/* ECHO ACC */
|
|
#define UNF_ECHO_ACC_PAYLOAD_LEN sizeof(struct unf_echo_payload_s)
|
|
/* REC */
|
|
#define UNF_REC_PAYLOAD_LEN sizeof(struct unf_rec_pld_s)
|
|
|
|
/* REC ACC */
|
|
#define UNF_GET_REC_ACC_PAYLOAD(v_pkg) \
|
|
(&(((union unf_sfs_u *)(UNF_GET_SFS_ENTRY(v_pkg)))->els_acc.cmnd))
|
|
|
|
#define UNF_REC_ACC_PAYLOAD_LEN (sizeof(struct unf_els_acc_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* RRQ */
|
|
#define UNF_RRQ_PAYLOAD_LEN (sizeof(struct unf_rrq_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* PRLI */
|
|
#define UNF_PRLI_PAYLOAD_LEN sizeof(struct unf_pril_payload_s)
|
|
|
|
/* PRLI ACC */
|
|
#define UNF_PRLI_ACC_PAYLOAD_LEN sizeof(struct unf_pril_payload_s)
|
|
|
|
/* PRLO */
|
|
#define UNF_PRLO_PAYLOAD_LEN sizeof(struct unf_pril_payload_s)
|
|
|
|
#define UNF_PRLO_ACC_PAYLOAD_LEN sizeof(struct unf_pril_payload_s)
|
|
|
|
/* PDISC */
|
|
#define UNF_PDISC_PAYLOAD_LEN sizeof(struct unf_plogi_payload_s)
|
|
|
|
/* PDISC ACC */
|
|
#define UNF_PDISC_ACC_PAYLOAD_LEN sizeof(struct unf_plogi_payload_s)
|
|
|
|
/* ADISC */
|
|
#define UNF_ADISC_PAYLOAD_LEN sizeof(struct unf_adisc_payload_s)
|
|
|
|
/* ADISC ACC */
|
|
#define UNF_ADISC_ACC_PAYLOAD_LEN sizeof(struct unf_adisc_payload_s)
|
|
|
|
/* RSCN ACC */
|
|
#define UNF_GET_RSCN_ACC_PAYLOAD(v_pkg) \
|
|
(&(((union unf_sfs_u *)(UNF_GET_SFS_ENTRY(v_pkg)))->els_acc.cmnd))
|
|
#define UNF_RSCN_ACC_PAYLOAD_LEN (sizeof(struct unf_els_acc_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* LOGO ACC */
|
|
#define UNF_LOGO_ACC_PAYLOAD_LEN (sizeof(struct unf_els_acc_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* RRQ ACC */
|
|
#define UNF_RRQ_ACC_PAYLOAD_LEN (sizeof(struct unf_els_acc_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* RLS ACC */
|
|
#define UNF_RLS_ACC_PAYLOAD_LEN (sizeof(struct unf_rls_acc_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* GPN_ID */
|
|
#define UNF_GPNID_PAYLOAD_LEN (sizeof(struct unf_gpnid_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
#define UNF_GPNID_RSP_PAYLOAD_LEN (sizeof(struct unf_gpnid_rsp_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* GNN_ID */
|
|
#define UNF_GNNID_PAYLOAD_LEN (sizeof(struct unf_gnnid_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
#define UNF_GNNID_RSP_PAYLOAD_LEN (sizeof(struct unf_gnnid_rsp_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* GFF_ID */
|
|
#define UNF_GFFID_PAYLOAD_LEN (sizeof(struct unf_gffid_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
#define UNF_GFFID_RSP_PAYLOAD_LEN (sizeof(struct unf_gffid_rsp_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* GID_FT/GID_PT */
|
|
#define UNF_GET_GID_PAYLOAD(v_pkg) (&(((union unf_sfs_u *) \
|
|
UNF_GET_SFS_ENTRY(v_pkg))->get_id.gid_req.ctiu_pream))
|
|
|
|
#define UNF_GID_PAYLOAD_LEN (sizeof(struct unf_ctiu_prem_s) + \
|
|
sizeof(unsigned int))
|
|
|
|
#define UNF_GID_ACC_PAYLOAD_LEN sizeof(struct unf_gif_acc_pld_s)
|
|
|
|
/* RFT_ID */
|
|
#define UNF_RFTID_PAYLOAD_LEN (sizeof(struct unf_rftid_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
#define UNF_RFTID_RSP_PAYLOAD_LEN sizeof(struct unf_ctiu_prem_s)
|
|
|
|
/* RFF_ID */
|
|
#define UNF_RFFID_PAYLOAD_LEN (sizeof(struct unf_rffid_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
#define UNF_RFFID_RSP_PAYLOAD_LEN sizeof(struct unf_ctiu_prem_s)
|
|
|
|
/* SRR */
|
|
#define UNF_SRR_PAYLOAD_LEN \
|
|
sizeof(struct unf_srr_payload_s)
|
|
|
|
/* ACC&RJT */
|
|
#define UNF_ELS_ACC_RJT_LEN (sizeof(struct unf_els_rjt_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/* SCR */
|
|
#define UNF_SCR_PAYLOAD_LEN (sizeof(struct unf_scr_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
#define UNF_SCR_RSP_PAYLOAD_LEN (sizeof(struct unf_els_acc_s) - \
|
|
sizeof(struct unf_fchead_s))
|
|
|
|
/**********************************************************/
|
|
#define UNF_GET_XCHG_TAG(v_pkg) (((struct unf_frame_pkg_s *) \
|
|
v_pkg)->private[PKG_PRIVATE_XCHG_HOT_POOL_INDEX])
|
|
|
|
#define UNF_GET_SID(v_pkg) (((struct unf_frame_pkg_s *) \
|
|
v_pkg)->frame_head.csctl_sid & UNF_NPORTID_MASK)
|
|
#define UNF_GET_DID(v_pkg) (((struct unf_frame_pkg_s *) \
|
|
v_pkg)->frame_head.rctl_did & UNF_NPORTID_MASK)
|
|
#define UNF_GET_OXID(v_pkg) (((struct unf_frame_pkg_s *) \
|
|
v_pkg)->frame_head.oxid_rxid >> 16)
|
|
#define UNF_GET_RXID(v_pkg) ((unsigned short)((struct unf_frame_pkg_s *) \
|
|
v_pkg)->frame_head.oxid_rxid)
|
|
#define UNF_GET_XFER_LEN(v_pkg) (((struct unf_frame_pkg_s *)v_pkg)->transfer_len)
|
|
|
|
/* ioc abort */
|
|
#define UNF_GETXCHGALLOCTIME(v_pkg) \
|
|
(((struct unf_frame_pkg_s *)v_pkg)->private[PKG_PRIVATE_XCHG_ALLOC_TIME])
|
|
#define UNF_SET_XCHG_ALLOC_TIME(pkg, xchg) \
|
|
(((struct unf_frame_pkg_s *)(pkg))->private[PKG_PRIVATE_XCHG_ALLOC_TIME] = \
|
|
(((struct unf_xchg_s *)(xchg))->private[PKG_PRIVATE_XCHG_ALLOC_TIME]))
|
|
#define UNF_SET_ABORT_INFO_IOTYPE(pkg, xchg) \
|
|
(((struct unf_frame_pkg_s *)(pkg))->private[PKG_PRIVATE_XCHG_ABORT_INFO] |= \
|
|
(((unsigned char)(((struct unf_xchg_s *)(xchg))->data_direction & 0x7))\
|
|
<< 2))
|
|
|
|
#define UNF_CHECK_NPORT_FPORT_BIT(els_payload) \
|
|
(((struct unf_flogi_payload_s *)els_payload)->fabric_parms.co_parms.n_port)
|
|
|
|
#define UNF_N_PORT 0
|
|
#define UNF_F_PORT 1
|
|
|
|
#define UNF_GET_RA_TOV_FROM_PARAMS(params) \
|
|
(((struct unf_fabric_parms_s *)params)->co_parms.r_a_tov)
|
|
#define UNF_GET_RT_TOV_FROM_PARAMS(params) \
|
|
(((struct unf_fabric_parms_s *)params)->co_parms.r_t_tov)
|
|
#define UNF_GET_E_D_TOV_FROM_PARAMS(params) \
|
|
(((struct unf_fabric_parms_s *)params)->co_parms.e_d_tov)
|
|
#define UNF_GET_E_D_TOV_RESOLUTION_FROM_PARAMS(params) \
|
|
(((struct unf_fabric_parms_s *)params)->co_parms.e_d_tov_resolution)
|
|
#define UNF_GET_BB_SC_N_FROM_PARAMS(params) \
|
|
(((struct unf_fabric_parms_s *)params)->co_parms.bb_scn)
|
|
#define UNF_GET_BB_CREDIT_FROM_PARAMS(params) \
|
|
(((struct unf_fabric_parms_s *)params)->co_parms.bb_credit)
|
|
enum unf_pcie_error_code_e {
|
|
UNF_PCIE_ERROR_NONE = 0,
|
|
UNF_PCIE_DATAPARITYDETECTED = 1,
|
|
UNF_PCIE_SIGNALTARGETABORT,
|
|
UNF_PCIE_RECEIVEDTARGETABORT,
|
|
UNF_PCIE_RECEIVEDMASTERABORT,
|
|
UNF_PCIE_SIGNALEDSYSTEMERROR,
|
|
UNF_PCIE_DETECTEDPARITYERROR,
|
|
UNF_PCIE_CORRECTABLEERRORDETECTED,
|
|
UNF_PCIE_NONFATALERRORDETECTED,
|
|
UNF_PCIE_FATALERRORDETECTED,
|
|
UNF_PCIE_UNSUPPORTEDREQUESTDETECTED,
|
|
UNF_PCIE_AUXILIARYPOWERDETECTED,
|
|
UNF_PCIE_TRANSACTIONSPENDING,
|
|
|
|
UNF_PCIE_UNCORRECTINTERERRSTATUS,
|
|
UNF_PCIE_UNSUPPORTREQERRSTATUS,
|
|
UNF_PCIE_ECRCERRORSTATUS,
|
|
UNF_PCIE_MALFORMEDTLPSTATUS,
|
|
UNF_PCIE_RECEIVEROVERFLOWSTATUS,
|
|
UNF_PCIE_UNEXPECTCOMPLETESTATUS,
|
|
UNF_PCIE_COMPLETERABORTSTATUS,
|
|
UNF_PCIE_COMPLETIONTIMEOUTSTATUS,
|
|
UNF_PCIE_FLOWCTRLPROTOCOLERRSTATUS,
|
|
UNF_PCIE_POISONEDTLPSTATUS,
|
|
UNF_PCIE_SURPRISEDOWNERRORSTATUS,
|
|
UNF_PCIE_DATALINKPROTOCOLERRSTATUS,
|
|
UNF_PCIE_ADVISORYNONFATALERRSTATUS,
|
|
UNF_PCIE_REPLAYTIMERTIMEOUTSTATUS,
|
|
UNF_PCIE_REPLAYNUMROLLOVERSTATUS,
|
|
UNF_PCIE_BADDLLPSTATUS,
|
|
UNF_PCIE_BADTLPSTATUS,
|
|
UNF_PCIE_RECEIVERERRORSTATUS,
|
|
|
|
UNF_PCIE_BUTT
|
|
};
|
|
|
|
#define UNF_DMA_HI32(a) (((a) >> 32) & 0xffffffff)
|
|
#define UNF_DMA_LO32(a) ((a) & 0xffffffff)
|
|
|
|
#define UNF_WWN_LEN 8
|
|
#define UNF_MAC_LEN 6
|
|
|
|
/* send BLS/ELS/BLS REPLY/ELS REPLY/GS/ */
|
|
/* rcvd BLS/ELS/REQ DONE/REPLY DONE */
|
|
#define UNF_PKG_BLS_REQ 0x0100
|
|
#define UNF_PKG_BLS_REQ_DONE 0x0101
|
|
|
|
#define UNF_PKG_ELS_REQ 0x0200
|
|
|
|
#define UNF_PKG_ELS_REQ_DONE 0x0201
|
|
|
|
#define UNF_PKG_ELS_REPLY 0x0202
|
|
|
|
#define UNF_PKG_ELS_REPLY_DONE 0x0203
|
|
|
|
#define UNF_PKG_GS_REQ 0x0300
|
|
|
|
#define UNF_PKG_GS_REQ_DONE 0x0301
|
|
|
|
#define UNF_PKG_INI_IO 0x0500
|
|
#define UNF_PKG_INI_RCV_TGT_RSP 0x0507
|
|
|
|
/* external sgl struct start */
|
|
struct unf_esgl_page_s {
|
|
unsigned long long page_address;
|
|
dma_addr_t esgl_phyaddr;
|
|
unsigned int page_size;
|
|
};
|
|
|
|
struct unf_esgl_s {
|
|
struct list_head entry_esgl;
|
|
struct unf_esgl_page_s page;
|
|
};
|
|
|
|
/* external sgl struct end */
|
|
struct unf_frame_payld_s {
|
|
unsigned char *buffer_ptr;
|
|
dma_addr_t buf_dma_addr;
|
|
unsigned int length;
|
|
};
|
|
|
|
enum pkg_private_index_e {
|
|
PKG_PRIVATE_LOWLEVEL_XCHG_ADD = 0,
|
|
PKG_PRIVATE_XCHG_HOT_POOL_INDEX = 1, /* Hot Pool Index */
|
|
PKG_PRIVATE_XCHG_RPORT_INDEX = 2, /* RPort index */
|
|
PKG_PRIVATE_XCHG_VP_INDEX = 3, /* VPort index */
|
|
PKG_PRIVATE_RPORT_RX_SIZE,
|
|
PKG_PRIVATE_XCHG_TIMEER,
|
|
PKG_PRIVATE_XCHG_ALLOC_TIME,
|
|
PKG_PRIVATE_XCHG_ABORT_INFO,
|
|
PKG_PRIVATE_ECHO_CMD_SND_TIME, /* local send echo cmd time stamp */
|
|
PKG_PRIVATE_ECHO_ACC_RCV_TIME, /* local receive echo acc time stamp */
|
|
PKG_PRIVATE_ECHO_CMD_RCV_TIME, /* remote receive echo cmd time stamp */
|
|
PKG_PRIVATE_ECHO_RSP_SND_TIME, /* remote send echo rsp time stamp */
|
|
PKG_MAX_PRIVATE_DATA_SIZE
|
|
};
|
|
|
|
extern unsigned int dix_flag;
|
|
extern unsigned int dif_sgl_mode;
|
|
extern unsigned int dif_app_esc_check;
|
|
extern unsigned int dif_ref_esc_check;
|
|
|
|
#define UNF_DIF_ACTION_NONE 0
|
|
|
|
enum unf_adm_dif_mode_e {
|
|
UNF_SWITCH_DIF_DIX = 0,
|
|
UNF_APP_REF_ESCAPE,
|
|
ALL_DIF_MODE = 20,
|
|
};
|
|
|
|
#define UNF_VERIFY_CRC_MASK (1 << 1)
|
|
#define UNF_VERIFY_APP_MASK (1 << 2)
|
|
#define UNF_VERIFY_LBA_MASK (1 << 3)
|
|
|
|
#define UNF_REPLACE_CRC_MASK (1 << 8)
|
|
#define UNF_REPLACE_APP_MASK (1 << 9)
|
|
#define UNF_REPLACE_LBA_MASK (1 << 10)
|
|
|
|
#define UNF_DIF_ACTION_MASK (0xff << 16)
|
|
#define UNF_DIF_ACTION_INSERT (0x1 << 16)
|
|
#define UNF_DIF_ACTION_VERIFY_AND_DELETE (0x2 << 16)
|
|
#define UNF_DIF_ACTION_VERIFY_AND_FORWARD (0x3 << 16)
|
|
#define UNF_DIF_ACTION_VERIFY_AND_REPLACE (0x4 << 16)
|
|
|
|
#define UNF_DIF_ACTION_NO_INCREASE_REFTAG (0x1 << 24)
|
|
|
|
#define UNF_DEFAULT_CRC_GUARD_SEED (0)
|
|
#define UNF_CAL_BLOCK_CNT(data_len, sector_size) ((data_len) / (sector_size))
|
|
|
|
#define UNF_DIF_DOUBLE_SGL (1 << 1)
|
|
#define UNF_DIF_SECTSIZE_4KB (1 << 2)
|
|
#define UNF_DIF_LBA_NONE_INCREASE (1 << 3)
|
|
#define UNF_DIF_TYPE3 (1 << 4)
|
|
|
|
#define HIFC_DIF_APP_REF_ESC_NOT_CHECK 1
|
|
#define HIFC_DIF_APP_REF_ESC_CHECK 0
|
|
|
|
enum unf_io_state_e {
|
|
UNF_INI_IO = 0,
|
|
UNF_TGT_XFER = 1,
|
|
UNF_TGT_RSP = 2
|
|
};
|
|
|
|
#define UNF_PKG_LAST_RESPONSE 0
|
|
#define UNF_PKG_NOT_LAST_RESPONSE 1
|
|
|
|
#define UNF_PKG_LAST_REQUEST 1
|
|
#define UNF_PKG_NOT_LAST_REQUEST 0
|
|
|
|
struct unf_frame_pkg_s {
|
|
/* pkt type:BLS/ELS/FC4LS/CMND/XFER/RSP */
|
|
unsigned int type;
|
|
unsigned int last_pkg_flag;
|
|
|
|
#define UNF_FCP_RESPONSE_VALID 0x01
|
|
#define UNF_FCP_SENSE_VALID 0x02
|
|
/* resp and sense vailed flag */
|
|
unsigned int response_and_sense_valid_flag;
|
|
unsigned int cmnd;
|
|
struct unf_fchead_s frame_head;
|
|
unsigned int entry_count;
|
|
void *xchg_contex;
|
|
unsigned int transfer_len;
|
|
unsigned int residus_len;
|
|
unsigned int status;
|
|
unsigned int status_sub_code;
|
|
enum unf_io_state_e io_state;
|
|
unsigned int qos_level;
|
|
|
|
unsigned int private[PKG_MAX_PRIVATE_DATA_SIZE];
|
|
|
|
unsigned char byte_orders;
|
|
|
|
struct unf_fcp_cmnd_s *fcp_cmnd;
|
|
struct unf_dif_control_info_s dif_control;
|
|
struct unf_frame_payld_s unf_cmnd_pload_bl;
|
|
struct unf_frame_payld_s unf_rsp_pload_bl;
|
|
struct unf_frame_payld_s unf_sense_pload_bl;
|
|
void *upper_cmd;
|
|
unsigned int abts_maker_status;
|
|
|
|
};
|
|
|
|
#define UNF_MAX_SFS_XCHG 2048
|
|
#define UNF_RESERVE_SFS_XCHG 128 /* times on exchange mgr num */
|
|
|
|
struct unf_lport_cfg_item_s {
|
|
unsigned int port_id;
|
|
unsigned int port_mode; /* INI(0x20) TGT(0x10) BOTH(0x30) */
|
|
unsigned int port_topology; /* 0x3:loop , 0xc:p2p ,0xf:auto */
|
|
unsigned int max_queue_depth;
|
|
unsigned int max_io; /* Recommended Value 512-4096 */
|
|
unsigned int max_login;
|
|
unsigned int max_sfs_xchg;
|
|
/* 0:auto 1:1Gbps 2:2Gbps 4:4Gbps 8:8Gbps 16:16Gbps */
|
|
unsigned int port_speed;
|
|
unsigned int tape_support; /* tape support */
|
|
unsigned int fcp_conf; /* fcp confirm support */
|
|
unsigned int bb_scn;
|
|
unsigned int sum_resource;
|
|
enum int_e res_mgmt_enabled;
|
|
};
|
|
|
|
struct unf_port_dynamic_info_s {
|
|
unsigned int sfp_posion;
|
|
unsigned int sfp_valid;
|
|
unsigned int phy_link;
|
|
unsigned int firmware_state;
|
|
unsigned int cur_speed;
|
|
unsigned int mailbox_timeout_cnt;
|
|
};
|
|
|
|
struct unf_hinicam_pkg {
|
|
unsigned int msg_format;
|
|
void *buff_in;
|
|
void *buff_out;
|
|
unsigned int in_size;
|
|
unsigned int *out_size;
|
|
};
|
|
|
|
struct unf_version_str_s {
|
|
char *buf;
|
|
unsigned int buf_len;
|
|
};
|
|
|
|
struct unf_buf_s {
|
|
unsigned char *cbuf;
|
|
unsigned int buf_len;
|
|
};
|
|
|
|
struct unf_rw_reg_param_s {
|
|
unsigned int rw_type;
|
|
unsigned int offset;
|
|
unsigned long long value;
|
|
};
|
|
|
|
/* get ucode & up ver */
|
|
#define HIFC_VER_LEN (16)
|
|
#define HIFC_COMPILE_TIME_LEN (20)
|
|
struct unf_fw_version_s {
|
|
unsigned int message_type;
|
|
unsigned char fw_version[HIFC_VER_LEN];
|
|
};
|
|
|
|
enum unf_port_config_set_op_e {
|
|
UNF_PORT_CFG_SET_SPEED,
|
|
UNF_PORT_CFG_SET_TOPO,
|
|
UNF_PORT_CFG_SET_BBSCN,
|
|
UNF_PORT_CFG_SET_MODE,
|
|
UNF_PORT_CFG_SET_SFP_SWITCH,
|
|
UNF_PORT_CFG_SET_PORT_SWITCH,
|
|
UNF_PORT_CFG_SET_POWER_STATE,
|
|
UNF_PORT_CFG_SET_PORT_STATE,
|
|
UNF_PORT_CFG_SET_INTR_COALSEC,
|
|
UNF_PORT_CFG_UPDATE_PORT,
|
|
UNF_PORT_CFG_UPDATE_WWN,
|
|
UNF_PORT_CFG_TEST_FLASH,
|
|
UNF_PORT_CFG_SET_FCP_CONF,
|
|
UNF_PORT_CFG_SET_LOOP_ROLE,
|
|
UNF_PORT_CFG_SET_INIT_REQ,
|
|
UNF_PORT_CFG_SET_MAX_SUPPORT_SPEED,
|
|
UNF_PORT_CFG_SET_MAC_ADDR,
|
|
UNF_PORT_CFG_SET_SFP_USEDTIME,
|
|
UNF_PORT_CFG_SET_PORT_TRANSFER_PARAMETER,
|
|
UNF_PORT_CFG_SET_SFP_REG_WRITE,
|
|
UNF_PORT_CFG_UPDATE_SFP,
|
|
UNF_PORT_CFG_UPDATE_FABRIC_PARAM,
|
|
UNF_PORT_CFG_UPDATE_PLOGI_PARAM,
|
|
UNF_PORT_CFG_UPDATE_FDISC_PARAM,
|
|
UNF_PORT_CFG_SAVE_HBA_INFO,
|
|
UNF_PORT_CFG_SET_HBA_BASE_INFO,
|
|
UNF_PORT_CFG_SET_FLASH_DATA_INFO,
|
|
UNF_PORT_CFG_SET_BUTT
|
|
};
|
|
|
|
enum unf_port_config_get_op_e {
|
|
UNF_PORT_CFG_GET_SPEED_CFG,
|
|
UNF_PORT_CFG_GET_SPEED_ACT,
|
|
UNF_PORT_CFG_GET_TOPO_CFG,
|
|
UNF_PORT_CFG_GET_TOPO_ACT,
|
|
UNF_PORT_CFG_GET_MODE,
|
|
UNF_PORT_CFG_GET_LOOP_MAP,
|
|
UNF_PORT_CFG_GET_TOV,
|
|
UNF_PORT_CFG_GET_SFP_PRESENT,
|
|
UNF_PORT_CFG_GET_SFP_INFO,
|
|
UNF_PORT_CFG_GET_FW_VER,
|
|
UNF_PORT_CFG_GET_HW_VER,
|
|
UNF_PORT_CFG_GET_LESB_THEN_CLR, /* Link Error Status Block, LESB */
|
|
UNF_PORT_CFG_GET_DYNAMIC_INFO,
|
|
UNF_PORT_CFG_GET_VITAL_REGS,
|
|
UNF_PORT_CFG_CLR_LESB,
|
|
UNF_PORT_CFG_GET_WORKBALE_BBCREDIT,
|
|
UNF_PORT_CFG_GET_WORKBALE_BBSCN,
|
|
UNF_PORT_CFG_GET_FC_SERDES,
|
|
UNF_PORT_CFG_GET_LOOP_ALPA,
|
|
UNF_PORT_CFG_GET_SFP_DYNAMIC_INFO,
|
|
UNF_PORT_CFG_GET_MAC_ADDR,
|
|
UNF_PORT_CFG_GET_SFP_USEDTIME,
|
|
UNF_PORT_CFG_GET_PORT_INFO,
|
|
UNF_PORT_CFG_DDT_TEST,
|
|
UNF_PORT_CFG_GET_LED_STATE,
|
|
UNF_PORT_CFG_GET_VLAN,
|
|
UNF_PORT_CFG_GET_SFP_REG_READ,
|
|
UNF_PORT_CFG_GET_SFP_VER,
|
|
UNF_PORT_CFG_GET_SFP_SUPPORT_UPDATE,
|
|
UNF_PORT_CFG_GET_SFP_LOG,
|
|
UNF_PORT_CFG_GET_FEC,
|
|
UNF_PORT_CFG_GET_PCIE_LINK_STATE,
|
|
UNF_PORT_CFG_GET_FLASH_DATA_INFO,
|
|
UNF_PORT_CFG_GET_BUTT
|
|
};
|
|
|
|
enum unf_port_diag_op_e {
|
|
UNF_PORT_DIAG_PORT_DETAIL,
|
|
UNF_PORT_DIAG_RD_WR_REG,
|
|
UNF_PORT_DIAG_BUTT
|
|
};
|
|
|
|
enum unf_port_config_state_e {
|
|
UNF_PORT_CONFIG_STATE_START,
|
|
UNF_PORT_CONFIG_STATE_STOP,
|
|
UNF_PORT_CONFIG_STATE_RESET,
|
|
UNF_PORT_CONFIG_STATE_STOP_INTR,
|
|
UNF_PORT_CONFIG_STATE_BUTT
|
|
};
|
|
|
|
struct unf_port_login_parms_s {
|
|
enum unf_act_topo_e en_act_topo;
|
|
|
|
unsigned int rport_index;
|
|
unsigned int seq_cnt : 1;
|
|
unsigned int ed_tov : 1;
|
|
unsigned int reserved : 14;
|
|
unsigned int tx_mfs : 16;
|
|
unsigned int ed_tov_timer_val;
|
|
|
|
unsigned char remote_rttov_tag;
|
|
unsigned char remote_edtov_tag;
|
|
unsigned short remote_bbcredit;
|
|
unsigned short compared_bbscn;
|
|
unsigned int compared_edtov_val;
|
|
unsigned int compared_ratov_val;
|
|
unsigned int els_cmnd_code;
|
|
};
|
|
|
|
#define HIFC_FLASH_MAX_LEN 1024 // bytes
|
|
|
|
struct unf_mbox_head_info_s {
|
|
/* mbox header */
|
|
unsigned char cmnd_type;
|
|
unsigned char length;
|
|
unsigned char port_id;
|
|
unsigned char pad0;
|
|
|
|
/* operation */
|
|
unsigned int op_code : 4;
|
|
unsigned int pad1 : 28;
|
|
};
|
|
|
|
#define HIFC_FLASH_MBOX_HEAD_MAX_LEN 8 // bytes
|
|
struct unf_mbox_head_sts_s {
|
|
/* mbox header */
|
|
unsigned char cmnd_type;
|
|
unsigned char length;
|
|
unsigned char port_id;
|
|
unsigned char pad0;
|
|
|
|
/* operation */
|
|
unsigned short pad1;
|
|
unsigned char pad2;
|
|
unsigned char status;
|
|
};
|
|
|
|
#define HIFC_FLASH_UEFI_MAX_LEN 16 // bytes
|
|
struct unf_flash_uefi_switch_s {
|
|
unsigned char writeflag;
|
|
unsigned char sanbooten;
|
|
unsigned char reserved[14];
|
|
};
|
|
|
|
#define HIFC_MGMT_UEFI_MAGIC_NUM 0xAF
|
|
#define HIFC_MGMT_TMO_MAGIC_NUM 0xAE
|
|
|
|
#define HIFC_FLASH_LINK_TMO_MAX_LEN 16 // bytes
|
|
struct unf_flash_link_tmo_s {
|
|
unsigned char writeflag;
|
|
unsigned char link_tmo0;
|
|
unsigned char link_tmo1;
|
|
unsigned char link_tmo2;
|
|
unsigned char link_tmo3;
|
|
unsigned char reserved[11];
|
|
};
|
|
|
|
#define HIFC_FLASH_DATA_MAX_LEN (HIFC_FLASH_MAX_LEN - \
|
|
HIFC_FLASH_MBOX_HEAD_MAX_LEN) // bytes
|
|
struct unf_flash_data_s {
|
|
struct unf_flash_uefi_switch_s uefi_switch; // 16 bytes
|
|
struct unf_flash_link_tmo_s link_tmo; // 16 bytes
|
|
/* once the related struct change, the reserved size needs modify */
|
|
unsigned char reserved[HIFC_FLASH_DATA_MAX_LEN - 32];
|
|
};
|
|
|
|
/* size of hifc_flash_data_mgmt not more than 1024 bytes */
|
|
struct unf_mbox_flash_data_mgmt_s {
|
|
struct unf_mbox_head_info_s mbox_head; // 8 bytes
|
|
struct unf_flash_data_s flash_data;
|
|
};
|
|
|
|
struct unf_flash_data_mgmt_sts_s {
|
|
struct unf_mbox_head_sts_s mbox_head; // 8 bytes
|
|
struct unf_flash_data_s flash_data;
|
|
};
|
|
|
|
struct unf_low_level_service_op_s {
|
|
unsigned int (*pfn_unf_els_send)(void *, struct unf_frame_pkg_s *);
|
|
unsigned int (*pfn_unf_bls_send)(void *, struct unf_frame_pkg_s *);
|
|
unsigned int (*pfn_unf_gs_send)(void *, struct unf_frame_pkg_s *);
|
|
unsigned int (*pfn_unf_fc_4_ls_send)(void *, struct unf_frame_pkg_s *);
|
|
unsigned int (*pfn_unf_cmnd_send)(void *, struct unf_frame_pkg_s *);
|
|
unsigned int (*pfn_ll_relese_xchg_res)(void *,
|
|
struct unf_frame_pkg_s *);
|
|
unsigned int (*pfn_unf_release_rport_res)(void *, struct
|
|
unf_rport_info_s *);
|
|
unsigned int (*pfn_unf_get_consumed_res)(void *,
|
|
struct unf_frame_pkg_s *);
|
|
unsigned int (*pfn_unf_flush_ini_resp_que)(void *);
|
|
unsigned int (*pfn_unf_alloc_rport_res)(void *,
|
|
struct unf_rport_info_s *);
|
|
unsigned int (*pfn_unf_rport_session_rst)(void *,
|
|
struct unf_rport_info_s *);
|
|
};
|
|
|
|
struct unf_low_level_port_mgr_op_s {
|
|
/* fcport/opcode/input parameter */
|
|
unsigned int (*pfn_ll_port_config_set)
|
|
(void *v_fc_port,
|
|
enum unf_port_config_set_op_e v_op_code,
|
|
void *v_para_in);
|
|
/* fcport/opcode/output parameter */
|
|
unsigned int (*pfn_ll_port_config_get)
|
|
(void *v_fc_port,
|
|
enum unf_port_config_get_op_e v_op_code,
|
|
void *v_para_out);
|
|
/* fcport/opcode/input parameter/output parameter */
|
|
unsigned int (*pfn_ll_port_diagnose)
|
|
(void *v_fc_port,
|
|
enum unf_port_diag_op_e v_op_code,
|
|
void *v_para);
|
|
|
|
};
|
|
|
|
struct unf_chip_info_s {
|
|
unsigned char chip_type;
|
|
unsigned char chip_work_mode;
|
|
unsigned char disable_err_flag;
|
|
};
|
|
|
|
struct unf_low_level_function_op_s {
|
|
struct unf_chip_info_s chip_info;
|
|
/* low level type */
|
|
unsigned int low_level_type;
|
|
/* low level name, fc etc. */
|
|
const char *name;
|
|
struct pci_dev *dev;
|
|
unsigned long long sys_node_name;
|
|
unsigned long long sys_port_name;
|
|
|
|
struct unf_lport_cfg_item_s lport_cfg_items;
|
|
|
|
/* low level Xchg mgr type,
|
|
* active --alloc oxid and rxid
|
|
* passtive -- not alloc oxid and rxid
|
|
*/
|
|
#define UNF_LOW_LEVEL_MGR_TYPE_ACTIVE 0
|
|
#define UNF_LOW_LEVEL_MGR_TYPE_PASSTIVE 1
|
|
const unsigned int xchg_mgr_type;
|
|
|
|
#define UNF_NO_EXTRA_ABTS_XCHG 0x0
|
|
#define UNF_LL_IOC_ABTS_XCHG 0x1
|
|
const unsigned int abts_xchg;
|
|
#define UNF_CM_RPORT_SET_QUALIFIER 0x0
|
|
#define UNF_CM_RPORT_SET_QUALIFIER_REUSE 0x1
|
|
#define UNF_CM_RPORT_SET_QUALIFIER_HIFC 0x2
|
|
/* low level pass-through flag. */
|
|
#define UNF_LOW_LEVEL_PASS_THROUGH_FIP 0x0
|
|
#define UNF_LOW_LEVEL_PASS_THROUGH_FABRIC_LOGIN 0x1
|
|
#define UNF_LOW_LEVEL_PASS_THROUGH_PORT_LOGIN 0x2
|
|
unsigned int pass_through_flag;
|
|
/* low level parameter */
|
|
unsigned int support_max_npiv_num;
|
|
unsigned int support_max_speed;
|
|
unsigned int fc_ser_max_speed;
|
|
unsigned int support_max_rport;
|
|
unsigned int support_max_xid_range;
|
|
unsigned int sfp_type;
|
|
unsigned int update_fw_reset_active;
|
|
unsigned int support_upgrade_report;
|
|
unsigned int multi_conf_support;
|
|
unsigned int port_type;
|
|
#define UNF_LOW_LEVEL_RELEASE_RPORT_SYNC 0x0
|
|
#define UNF_LOW_LEVEL_RELEASE_RPORT_ASYNC 0x1
|
|
unsigned char rport_release_type;
|
|
#define UNF_LOW_LEVEL_SIRT_PAGE_MODE_FIXED 0x0
|
|
#define UNF_LOW_LEVEL_SIRT_PAGE_MODE_XCHG 0x1
|
|
unsigned char sirt_page_mode;
|
|
unsigned char sfp_speed;
|
|
/* IO reference */
|
|
struct unf_low_level_service_op_s service_op;
|
|
/* Port Mgr reference */
|
|
struct unf_low_level_port_mgr_op_s port_mgr_op;
|
|
unsigned char chip_id;
|
|
};
|
|
|
|
struct unf_cm_handle_op_s {
|
|
/* return:L_Port */
|
|
void *(*pfn_unf_alloc_local_port)(void *,
|
|
struct unf_low_level_function_op_s *);
|
|
/* input para:L_Port */
|
|
unsigned int (*pfn_unf_release_local_port)(void *);
|
|
/* input para:lport vn2vnid,output para:ok/err */
|
|
unsigned int (*pfn_unf_set_vn2vn_id)(void *, unsigned int);
|
|
unsigned char (*pfn_unf_get_loop_id)(unsigned int v_port_id);
|
|
/* input para:L_Port, FRAME_PKG_S */
|
|
unsigned int (*pfn_unf_receive_els_pkg)(void *v_lport,
|
|
struct unf_frame_pkg_s *v_pkg);
|
|
/* input para:L_Port, FRAME_PKG_S */
|
|
unsigned int (*pfn_unf_receive_gs_pkg)(void *v_lport,
|
|
struct unf_frame_pkg_s *v_pkg);
|
|
/* input para:L_Port, FRAME_PKG_S */
|
|
unsigned int (*pfn_unf_receive_bls_pkg)(void *v_lport,
|
|
struct unf_frame_pkg_s *v_pkg);
|
|
/* input para:L_Port, FRAME_PKG_S */
|
|
unsigned int (*pfn_unf_receive_fc4_ls_pkg)(
|
|
void *v_lport,
|
|
struct unf_frame_pkg_s *v_pkg);
|
|
/* input para:L_Port, FRAME_PKG_S */
|
|
unsigned int (*pfn_unf_send_els_done)(void *v_lport,
|
|
struct unf_frame_pkg_s *v_pkg);
|
|
unsigned int (*pfn_unf_send_fc4_ls_done)(void *v_lport,
|
|
struct unf_frame_pkg_s *v_pkg);
|
|
/* input para:L_Port, FRAME_PKG_S */
|
|
unsigned int (*pfn_unf_receive_marker_status)(
|
|
void *v_lport, struct unf_frame_pkg_s *v_pkg);
|
|
unsigned int (*pfn_unf_receive_abts_marker_status)(
|
|
void *v_lport, struct unf_frame_pkg_s *v_pkg);
|
|
/* input para:L_Port, FRAME_PKG_S */
|
|
unsigned int (*pfn_unf_receive_ini_rsponse)(
|
|
void *v_lport, struct unf_frame_pkg_s *v_pkg);
|
|
int (*pfn_unf_get_cfg_parms)(char *v_section_name,
|
|
struct unf_cfg_item_s *v_cfg_parm,
|
|
unsigned int *v_cfg_value,
|
|
unsigned int v_item_num);
|
|
unsigned int (*pfn_unf_cm_get_sgl_entry)(void *v_pkg,
|
|
char **v_buf,
|
|
unsigned int *v_buf_len);
|
|
unsigned int (*pfn_unf_cm_get_dif_sgl_entry)(void *v_pkg,
|
|
char **v_buf,
|
|
unsigned int *v_buf_len);
|
|
struct unf_esgl_page_s *(*pfn_unf_get_one_free_esgl_page)(
|
|
void *v_lport, struct unf_frame_pkg_s *v_pkg);
|
|
/* input para:L_Port, EVENT */
|
|
unsigned int (*pfn_unf_fc_port_link_event)(void *v_lport,
|
|
unsigned int v_events,
|
|
void *v_input);
|
|
unsigned int (*pfn_unf_fcoe_update_fcf_name)(void *v_lport,
|
|
void *v_input);
|
|
int (*pfn_unf_ioctl_to_com_handler)(void *v_lport,
|
|
struct unf_hinicam_pkg *v_pkg);
|
|
};
|
|
|
|
unsigned int unf_get_cm_handle_op(struct unf_cm_handle_op_s *v_cm_handle);
|
|
int unf_common_init(void);
|
|
void unf_common_exit(void);
|
|
|
|
struct unf_port_info_entry_s {
|
|
unsigned int bb_scn;
|
|
unsigned int speed;
|
|
unsigned int topo;
|
|
unsigned int fec;
|
|
};
|
|
|
|
enum drv_cable_connector_type_e {
|
|
DRV_CABLE_CONNECTOR_NONE,
|
|
DRV_CABLE_CONNECTOR_OPTICAL,
|
|
DRV_CABLE_CONNECTOR_COPPER,
|
|
DRV_CABLE_CONNECTOR_INVALID,
|
|
DRV_CABLE_CONNECTOR_BUTT
|
|
};
|
|
|
|
#endif
|