xref: /OK3568_Linux_fs/kernel/drivers/scsi/qla2xxx/qla_bsg.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * QLogic Fibre Channel HBA Driver
4*4882a593Smuzhiyun  * Copyright (c)  2003-2014 QLogic Corporation
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun #ifndef __QLA_BSG_H
7*4882a593Smuzhiyun #define __QLA_BSG_H
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun /* BSG Vendor specific commands */
10*4882a593Smuzhiyun #define QL_VND_LOOPBACK		0x01
11*4882a593Smuzhiyun #define QL_VND_A84_RESET	0x02
12*4882a593Smuzhiyun #define QL_VND_A84_UPDATE_FW	0x03
13*4882a593Smuzhiyun #define QL_VND_A84_MGMT_CMD	0x04
14*4882a593Smuzhiyun #define QL_VND_IIDMA		0x05
15*4882a593Smuzhiyun #define QL_VND_FCP_PRIO_CFG_CMD	0x06
16*4882a593Smuzhiyun #define QL_VND_READ_FLASH	0x07
17*4882a593Smuzhiyun #define QL_VND_UPDATE_FLASH	0x08
18*4882a593Smuzhiyun #define QL_VND_SET_FRU_VERSION	0x0B
19*4882a593Smuzhiyun #define QL_VND_READ_FRU_STATUS	0x0C
20*4882a593Smuzhiyun #define QL_VND_WRITE_FRU_STATUS	0x0D
21*4882a593Smuzhiyun #define QL_VND_DIAG_IO_CMD	0x0A
22*4882a593Smuzhiyun #define QL_VND_WRITE_I2C	0x10
23*4882a593Smuzhiyun #define QL_VND_READ_I2C		0x11
24*4882a593Smuzhiyun #define QL_VND_FX00_MGMT_CMD	0x12
25*4882a593Smuzhiyun #define QL_VND_SERDES_OP	0x13
26*4882a593Smuzhiyun #define	QL_VND_SERDES_OP_EX	0x14
27*4882a593Smuzhiyun #define QL_VND_GET_FLASH_UPDATE_CAPS    0x15
28*4882a593Smuzhiyun #define QL_VND_SET_FLASH_UPDATE_CAPS    0x16
29*4882a593Smuzhiyun #define QL_VND_GET_BBCR_DATA    0x17
30*4882a593Smuzhiyun #define QL_VND_GET_PRIV_STATS	0x18
31*4882a593Smuzhiyun #define QL_VND_DPORT_DIAGNOSTICS	0x19
32*4882a593Smuzhiyun #define QL_VND_GET_PRIV_STATS_EX	0x1A
33*4882a593Smuzhiyun #define QL_VND_SS_GET_FLASH_IMAGE_STATUS	0x1E
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /* BSG Vendor specific subcode returns */
36*4882a593Smuzhiyun #define EXT_STATUS_OK			0
37*4882a593Smuzhiyun #define EXT_STATUS_ERR			1
38*4882a593Smuzhiyun #define EXT_STATUS_BUSY			2
39*4882a593Smuzhiyun #define EXT_STATUS_INVALID_PARAM	6
40*4882a593Smuzhiyun #define EXT_STATUS_DATA_OVERRUN		7
41*4882a593Smuzhiyun #define EXT_STATUS_DATA_UNDERRUN	8
42*4882a593Smuzhiyun #define EXT_STATUS_MAILBOX		11
43*4882a593Smuzhiyun #define EXT_STATUS_NO_MEMORY		17
44*4882a593Smuzhiyun #define EXT_STATUS_DEVICE_OFFLINE	22
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun /*
47*4882a593Smuzhiyun  * To support bidirectional iocb
48*4882a593Smuzhiyun  * BSG Vendor specific returns
49*4882a593Smuzhiyun  */
50*4882a593Smuzhiyun #define EXT_STATUS_NOT_SUPPORTED	27
51*4882a593Smuzhiyun #define EXT_STATUS_INVALID_CFG		28
52*4882a593Smuzhiyun #define EXT_STATUS_DMA_ERR		29
53*4882a593Smuzhiyun #define EXT_STATUS_TIMEOUT		30
54*4882a593Smuzhiyun #define EXT_STATUS_THREAD_FAILED	31
55*4882a593Smuzhiyun #define EXT_STATUS_DATA_CMP_FAILED	32
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /* BSG definations for interpreting CommandSent field */
58*4882a593Smuzhiyun #define INT_DEF_LB_LOOPBACK_CMD         0
59*4882a593Smuzhiyun #define INT_DEF_LB_ECHO_CMD             1
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun /* Loopback related definations */
62*4882a593Smuzhiyun #define INTERNAL_LOOPBACK		0xF1
63*4882a593Smuzhiyun #define EXTERNAL_LOOPBACK		0xF2
64*4882a593Smuzhiyun #define ENABLE_INTERNAL_LOOPBACK	0x02
65*4882a593Smuzhiyun #define ENABLE_EXTERNAL_LOOPBACK	0x04
66*4882a593Smuzhiyun #define INTERNAL_LOOPBACK_MASK		0x000E
67*4882a593Smuzhiyun #define MAX_ELS_FRAME_PAYLOAD		252
68*4882a593Smuzhiyun #define ELS_OPCODE_BYTE			0x10
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun /* BSG Vendor specific definations */
71*4882a593Smuzhiyun #define A84_ISSUE_WRITE_TYPE_CMD        0
72*4882a593Smuzhiyun #define A84_ISSUE_READ_TYPE_CMD         1
73*4882a593Smuzhiyun #define A84_CLEANUP_CMD                 2
74*4882a593Smuzhiyun #define A84_ISSUE_RESET_OP_FW           3
75*4882a593Smuzhiyun #define A84_ISSUE_RESET_DIAG_FW         4
76*4882a593Smuzhiyun #define A84_ISSUE_UPDATE_OPFW_CMD       5
77*4882a593Smuzhiyun #define A84_ISSUE_UPDATE_DIAGFW_CMD     6
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun struct qla84_mgmt_param {
80*4882a593Smuzhiyun 	union {
81*4882a593Smuzhiyun 		struct {
82*4882a593Smuzhiyun 			uint32_t start_addr;
83*4882a593Smuzhiyun 		} mem; /* for QLA84_MGMT_READ/WRITE_MEM */
84*4882a593Smuzhiyun 		struct {
85*4882a593Smuzhiyun 			uint32_t id;
86*4882a593Smuzhiyun #define QLA84_MGMT_CONFIG_ID_UIF        1
87*4882a593Smuzhiyun #define QLA84_MGMT_CONFIG_ID_FCOE_COS   2
88*4882a593Smuzhiyun #define QLA84_MGMT_CONFIG_ID_PAUSE      3
89*4882a593Smuzhiyun #define QLA84_MGMT_CONFIG_ID_TIMEOUTS   4
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 		uint32_t param0;
92*4882a593Smuzhiyun 		uint32_t param1;
93*4882a593Smuzhiyun 	} config; /* for QLA84_MGMT_CHNG_CONFIG */
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	struct {
96*4882a593Smuzhiyun 		uint32_t type;
97*4882a593Smuzhiyun #define QLA84_MGMT_INFO_CONFIG_LOG_DATA         1 /* Get Config Log Data */
98*4882a593Smuzhiyun #define QLA84_MGMT_INFO_LOG_DATA                2 /* Get Log Data */
99*4882a593Smuzhiyun #define QLA84_MGMT_INFO_PORT_STAT               3 /* Get Port Statistics */
100*4882a593Smuzhiyun #define QLA84_MGMT_INFO_LIF_STAT                4 /* Get LIF Statistics  */
101*4882a593Smuzhiyun #define QLA84_MGMT_INFO_ASIC_STAT               5 /* Get ASIC Statistics */
102*4882a593Smuzhiyun #define QLA84_MGMT_INFO_CONFIG_PARAMS           6 /* Get Config Parameters */
103*4882a593Smuzhiyun #define QLA84_MGMT_INFO_PANIC_LOG               7 /* Get Panic Log */
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 		uint32_t context;
106*4882a593Smuzhiyun /*
107*4882a593Smuzhiyun * context definitions for QLA84_MGMT_INFO_CONFIG_LOG_DATA
108*4882a593Smuzhiyun */
109*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_DEBUG_LOG                    0
110*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_LEARN_LOG                    1
111*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_FC_ACL_INGRESS_LOG           2
112*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_FC_ACL_EGRESS_LOG            3
113*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_ETHERNET_ACL_INGRESS_LOG     4
114*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_ETHERNET_ACL_EGRESS_LOG      5
115*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_MESSAGE_TRANSMIT_LOG         6
116*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_MESSAGE_RECEIVE_LOG          7
117*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_LINK_EVENT_LOG               8
118*4882a593Smuzhiyun #define IC_LOG_DATA_LOG_ID_DCX_LOG                      9
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun /*
121*4882a593Smuzhiyun * context definitions for QLA84_MGMT_INFO_PORT_STAT
122*4882a593Smuzhiyun */
123*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_ETHERNET_PORT0   0
124*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_ETHERNET_PORT1   1
125*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_NSL_PORT0        2
126*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_NSL_PORT1        3
127*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_FC_PORT0         4
128*4882a593Smuzhiyun #define IC_PORT_STATISTICS_PORT_NUMBER_FC_PORT1         5
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun /*
132*4882a593Smuzhiyun * context definitions for QLA84_MGMT_INFO_LIF_STAT
133*4882a593Smuzhiyun */
134*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_ETHERNET_PORT0     0
135*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_ETHERNET_PORT1     1
136*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_FC_PORT0           2
137*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_FC_PORT1           3
138*4882a593Smuzhiyun #define IC_LIF_STATISTICS_LIF_NUMBER_CPU                6
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 		} info; /* for QLA84_MGMT_GET_INFO */
141*4882a593Smuzhiyun 	} u;
142*4882a593Smuzhiyun };
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun struct qla84_msg_mgmt {
145*4882a593Smuzhiyun 	uint16_t cmd;
146*4882a593Smuzhiyun #define QLA84_MGMT_READ_MEM     0x00
147*4882a593Smuzhiyun #define QLA84_MGMT_WRITE_MEM    0x01
148*4882a593Smuzhiyun #define QLA84_MGMT_CHNG_CONFIG  0x02
149*4882a593Smuzhiyun #define QLA84_MGMT_GET_INFO     0x03
150*4882a593Smuzhiyun 	uint16_t rsrvd;
151*4882a593Smuzhiyun 	struct qla84_mgmt_param mgmtp;/* parameters for cmd */
152*4882a593Smuzhiyun 	uint32_t len; /* bytes in payload following this struct */
153*4882a593Smuzhiyun 	uint8_t payload[0]; /* payload for cmd */
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun struct qla_bsg_a84_mgmt {
157*4882a593Smuzhiyun 	struct qla84_msg_mgmt mgmt;
158*4882a593Smuzhiyun } __attribute__ ((packed));
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun struct qla_scsi_addr {
161*4882a593Smuzhiyun 	uint16_t bus;
162*4882a593Smuzhiyun 	uint16_t target;
163*4882a593Smuzhiyun } __attribute__ ((packed));
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun struct qla_ext_dest_addr {
166*4882a593Smuzhiyun 	union {
167*4882a593Smuzhiyun 		uint8_t wwnn[8];
168*4882a593Smuzhiyun 		uint8_t wwpn[8];
169*4882a593Smuzhiyun 		uint8_t id[4];
170*4882a593Smuzhiyun 		struct qla_scsi_addr scsi_addr;
171*4882a593Smuzhiyun 	} dest_addr;
172*4882a593Smuzhiyun 	uint16_t dest_type;
173*4882a593Smuzhiyun #define	EXT_DEF_TYPE_WWPN	2
174*4882a593Smuzhiyun 	uint16_t lun;
175*4882a593Smuzhiyun 	uint16_t padding[2];
176*4882a593Smuzhiyun } __attribute__ ((packed));
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun struct qla_port_param {
179*4882a593Smuzhiyun 	struct qla_ext_dest_addr fc_scsi_addr;
180*4882a593Smuzhiyun 	uint16_t mode;
181*4882a593Smuzhiyun 	uint16_t speed;
182*4882a593Smuzhiyun } __attribute__ ((packed));
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun /* FRU VPD */
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun #define MAX_FRU_SIZE	36
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun struct qla_field_address {
190*4882a593Smuzhiyun 	uint16_t offset;
191*4882a593Smuzhiyun 	uint16_t device;
192*4882a593Smuzhiyun 	uint16_t option;
193*4882a593Smuzhiyun } __packed;
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun struct qla_field_info {
196*4882a593Smuzhiyun 	uint8_t version[MAX_FRU_SIZE];
197*4882a593Smuzhiyun } __packed;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun struct qla_image_version {
200*4882a593Smuzhiyun 	struct qla_field_address field_address;
201*4882a593Smuzhiyun 	struct qla_field_info field_info;
202*4882a593Smuzhiyun } __packed;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun struct qla_image_version_list {
205*4882a593Smuzhiyun 	uint32_t count;
206*4882a593Smuzhiyun 	struct qla_image_version version[0];
207*4882a593Smuzhiyun } __packed;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun struct qla_status_reg {
210*4882a593Smuzhiyun 	struct qla_field_address field_address;
211*4882a593Smuzhiyun 	uint8_t status_reg;
212*4882a593Smuzhiyun 	uint8_t reserved[7];
213*4882a593Smuzhiyun } __packed;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun struct qla_i2c_access {
216*4882a593Smuzhiyun 	uint16_t device;
217*4882a593Smuzhiyun 	uint16_t offset;
218*4882a593Smuzhiyun 	uint16_t option;
219*4882a593Smuzhiyun 	uint16_t length;
220*4882a593Smuzhiyun 	uint8_t  buffer[0x40];
221*4882a593Smuzhiyun } __packed;
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /* 26xx serdes register interface */
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun /* serdes reg commands */
226*4882a593Smuzhiyun #define INT_SC_SERDES_READ_REG		1
227*4882a593Smuzhiyun #define INT_SC_SERDES_WRITE_REG		2
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun struct qla_serdes_reg {
230*4882a593Smuzhiyun 	uint16_t cmd;
231*4882a593Smuzhiyun 	uint16_t addr;
232*4882a593Smuzhiyun 	uint16_t val;
233*4882a593Smuzhiyun } __packed;
234*4882a593Smuzhiyun 
235*4882a593Smuzhiyun struct qla_serdes_reg_ex {
236*4882a593Smuzhiyun 	uint16_t cmd;
237*4882a593Smuzhiyun 	uint32_t addr;
238*4882a593Smuzhiyun 	uint32_t val;
239*4882a593Smuzhiyun } __packed;
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun struct qla_flash_update_caps {
242*4882a593Smuzhiyun 	uint64_t  capabilities;
243*4882a593Smuzhiyun 	uint32_t  outage_duration;
244*4882a593Smuzhiyun 	uint8_t   reserved[20];
245*4882a593Smuzhiyun } __packed;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun /* BB_CR Status */
248*4882a593Smuzhiyun #define QLA_BBCR_STATUS_DISABLED       0
249*4882a593Smuzhiyun #define QLA_BBCR_STATUS_ENABLED        1
250*4882a593Smuzhiyun #define QLA_BBCR_STATUS_UNKNOWN        2
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun /* BB_CR State */
253*4882a593Smuzhiyun #define QLA_BBCR_STATE_OFFLINE         0
254*4882a593Smuzhiyun #define QLA_BBCR_STATE_ONLINE          1
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun /* BB_CR Offline Reason Code */
257*4882a593Smuzhiyun #define QLA_BBCR_REASON_PORT_SPEED     1
258*4882a593Smuzhiyun #define QLA_BBCR_REASON_PEER_PORT      2
259*4882a593Smuzhiyun #define QLA_BBCR_REASON_SWITCH         3
260*4882a593Smuzhiyun #define QLA_BBCR_REASON_LOGIN_REJECT   4
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun struct  qla_bbcr_data {
263*4882a593Smuzhiyun 	uint8_t   status;         /* 1 - enabled, 0 - Disabled */
264*4882a593Smuzhiyun 	uint8_t   state;          /* 1 - online, 0 - offline */
265*4882a593Smuzhiyun 	uint8_t   configured_bbscn;       /* 0-15 */
266*4882a593Smuzhiyun 	uint8_t   negotiated_bbscn;       /* 0-15 */
267*4882a593Smuzhiyun 	uint8_t   offline_reason_code;
268*4882a593Smuzhiyun 	uint16_t  mbx1;			/* Port state */
269*4882a593Smuzhiyun 	uint8_t   reserved[9];
270*4882a593Smuzhiyun } __packed;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun struct qla_dport_diag {
273*4882a593Smuzhiyun 	uint16_t options;
274*4882a593Smuzhiyun 	uint32_t buf[16];
275*4882a593Smuzhiyun 	uint8_t  unused[62];
276*4882a593Smuzhiyun } __packed;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /* D_Port options */
279*4882a593Smuzhiyun #define QLA_DPORT_RESULT	0x0
280*4882a593Smuzhiyun #define QLA_DPORT_START		0x2
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun /* active images in flash */
283*4882a593Smuzhiyun struct qla_active_regions {
284*4882a593Smuzhiyun 	uint8_t global_image;
285*4882a593Smuzhiyun 	uint8_t board_config;
286*4882a593Smuzhiyun 	uint8_t vpd_nvram;
287*4882a593Smuzhiyun 	uint8_t npiv_config_0_1;
288*4882a593Smuzhiyun 	uint8_t npiv_config_2_3;
289*4882a593Smuzhiyun 	uint8_t reserved[32];
290*4882a593Smuzhiyun } __packed;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun #endif
293