1/*
2 * QLogic iSCSI HBA Driver
3 * Copyright (c)  2003-2006 QLogic Corporation
4 *
5 * See LICENSE.qla4xxx for copyright and licensing details.
6 */
7
8#ifndef _QLA4X_FW_H
9#define _QLA4X_FW_H
10
11
12#define MAX_PRST_DEV_DB_ENTRIES		64
13#define MIN_DISC_DEV_DB_ENTRY		MAX_PRST_DEV_DB_ENTRIES
14#define MAX_DEV_DB_ENTRIES 512
15
16/*************************************************************************
17 *
18 *		ISP 4010 I/O Register Set Structure and Definitions
19 *
20 *************************************************************************/
21
22struct port_ctrl_stat_regs {
23	__le32 ext_hw_conf;	/*  80 x50  R/W */
24	__le32 intChipConfiguration; /*	 84 x54 */
25	__le32 port_ctrl;	/*  88 x58 */
26	__le32 port_status;	/*  92 x5c */
27	__le32 HostPrimMACHi;	/*  96 x60 */
28	__le32 HostPrimMACLow;	/* 100 x64 */
29	__le32 HostSecMACHi;	/* 104 x68 */
30	__le32 HostSecMACLow;	/* 108 x6c */
31	__le32 EPPrimMACHi;	/* 112 x70 */
32	__le32 EPPrimMACLow;	/* 116 x74 */
33	__le32 EPSecMACHi;	/* 120 x78 */
34	__le32 EPSecMACLow;	/* 124 x7c */
35	__le32 HostPrimIPHi;	/* 128 x80 */
36	__le32 HostPrimIPMidHi; /* 132 x84 */
37	__le32 HostPrimIPMidLow;	/* 136 x88 */
38	__le32 HostPrimIPLow;	/* 140 x8c */
39	__le32 HostSecIPHi;	/* 144 x90 */
40	__le32 HostSecIPMidHi;	/* 148 x94 */
41	__le32 HostSecIPMidLow; /* 152 x98 */
42	__le32 HostSecIPLow;	/* 156 x9c */
43	__le32 EPPrimIPHi;	/* 160 xa0 */
44	__le32 EPPrimIPMidHi;	/* 164 xa4 */
45	__le32 EPPrimIPMidLow;	/* 168 xa8 */
46	__le32 EPPrimIPLow;	/* 172 xac */
47	__le32 EPSecIPHi;	/* 176 xb0 */
48	__le32 EPSecIPMidHi;	/* 180 xb4 */
49	__le32 EPSecIPMidLow;	/* 184 xb8 */
50	__le32 EPSecIPLow;	/* 188 xbc */
51	__le32 IPReassemblyTimeout; /* 192 xc0 */
52	__le32 EthMaxFramePayload; /* 196 xc4 */
53	__le32 TCPMaxWindowSize; /* 200 xc8 */
54	__le32 TCPCurrentTimestampHi; /* 204 xcc */
55	__le32 TCPCurrentTimestampLow; /* 208 xd0 */
56	__le32 LocalRAMAddress; /* 212 xd4 */
57	__le32 LocalRAMData;	/* 216 xd8 */
58	__le32 PCSReserved1;	/* 220 xdc */
59	__le32 gp_out;		/* 224 xe0 */
60	__le32 gp_in;		/* 228 xe4 */
61	__le32 ProbeMuxAddr;	/* 232 xe8 */
62	__le32 ProbeMuxData;	/* 236 xec */
63	__le32 ERMQueueBaseAddr0; /* 240 xf0 */
64	__le32 ERMQueueBaseAddr1; /* 244 xf4 */
65	__le32 MACConfiguration; /* 248 xf8 */
66	__le32 port_err_status; /* 252 xfc  COR */
67};
68
69struct host_mem_cfg_regs {
70	__le32 NetRequestQueueOut; /*  80 x50 */
71	__le32 NetRequestQueueOutAddrHi; /*  84 x54 */
72	__le32 NetRequestQueueOutAddrLow; /*  88 x58 */
73	__le32 NetRequestQueueBaseAddrHi; /*  92 x5c */
74	__le32 NetRequestQueueBaseAddrLow; /*  96 x60 */
75	__le32 NetRequestQueueLength; /* 100 x64 */
76	__le32 NetResponseQueueIn; /* 104 x68 */
77	__le32 NetResponseQueueInAddrHi; /* 108 x6c */
78	__le32 NetResponseQueueInAddrLow; /* 112 x70 */
79	__le32 NetResponseQueueBaseAddrHi; /* 116 x74 */
80	__le32 NetResponseQueueBaseAddrLow; /* 120 x78 */
81	__le32 NetResponseQueueLength; /* 124 x7c */
82	__le32 req_q_out;	/* 128 x80 */
83	__le32 RequestQueueOutAddrHi; /* 132 x84 */
84	__le32 RequestQueueOutAddrLow; /* 136 x88 */
85	__le32 RequestQueueBaseAddrHi; /* 140 x8c */
86	__le32 RequestQueueBaseAddrLow; /* 144 x90 */
87	__le32 RequestQueueLength; /* 148 x94 */
88	__le32 ResponseQueueIn; /* 152 x98 */
89	__le32 ResponseQueueInAddrHi; /* 156 x9c */
90	__le32 ResponseQueueInAddrLow; /* 160 xa0 */
91	__le32 ResponseQueueBaseAddrHi; /* 164 xa4 */
92	__le32 ResponseQueueBaseAddrLow; /* 168 xa8 */
93	__le32 ResponseQueueLength; /* 172 xac */
94	__le32 NetRxLargeBufferQueueOut; /* 176 xb0 */
95	__le32 NetRxLargeBufferQueueBaseAddrHi; /* 180 xb4 */
96	__le32 NetRxLargeBufferQueueBaseAddrLow; /* 184 xb8 */
97	__le32 NetRxLargeBufferQueueLength; /* 188 xbc */
98	__le32 NetRxLargeBufferLength; /* 192 xc0 */
99	__le32 NetRxSmallBufferQueueOut; /* 196 xc4 */
100	__le32 NetRxSmallBufferQueueBaseAddrHi; /* 200 xc8 */
101	__le32 NetRxSmallBufferQueueBaseAddrLow; /* 204 xcc */
102	__le32 NetRxSmallBufferQueueLength; /* 208 xd0 */
103	__le32 NetRxSmallBufferLength; /* 212 xd4 */
104	__le32 HMCReserved0[10]; /* 216 xd8 */
105};
106
107struct local_ram_cfg_regs {
108	__le32 BufletSize;	/*  80 x50 */
109	__le32 BufletMaxCount;	/*  84 x54 */
110	__le32 BufletCurrCount; /*  88 x58 */
111	__le32 BufletPauseThresholdCount; /*  92 x5c */
112	__le32 BufletTCPWinThresholdHi; /*  96 x60 */
113	__le32 BufletTCPWinThresholdLow; /* 100 x64 */
114	__le32 IPHashTableBaseAddr; /* 104 x68 */
115	__le32 IPHashTableSize; /* 108 x6c */
116	__le32 TCPHashTableBaseAddr; /* 112 x70 */
117	__le32 TCPHashTableSize; /* 116 x74 */
118	__le32 NCBAreaBaseAddr; /* 120 x78 */
119	__le32 NCBMaxCount;	/* 124 x7c */
120	__le32 NCBCurrCount;	/* 128 x80 */
121	__le32 DRBAreaBaseAddr; /* 132 x84 */
122	__le32 DRBMaxCount;	/* 136 x88 */
123	__le32 DRBCurrCount;	/* 140 x8c */
124	__le32 LRCReserved[28]; /* 144 x90 */
125};
126
127struct prot_stat_regs {
128	__le32 MACTxFrameCount; /*  80 x50   R */
129	__le32 MACTxByteCount;	/*  84 x54   R */
130	__le32 MACRxFrameCount; /*  88 x58   R */
131	__le32 MACRxByteCount;	/*  92 x5c   R */
132	__le32 MACCRCErrCount;	/*  96 x60   R */
133	__le32 MACEncErrCount;	/* 100 x64   R */
134	__le32 MACRxLengthErrCount; /* 104 x68	 R */
135	__le32 IPTxPacketCount; /* 108 x6c   R */
136	__le32 IPTxByteCount;	/* 112 x70   R */
137	__le32 IPTxFragmentCount; /* 116 x74   R */
138	__le32 IPRxPacketCount; /* 120 x78   R */
139	__le32 IPRxByteCount;	/* 124 x7c   R */
140	__le32 IPRxFragmentCount; /* 128 x80   R */
141	__le32 IPDatagramReassemblyCount; /* 132 x84   R */
142	__le32 IPV6RxPacketCount; /* 136 x88   R */
143	__le32 IPErrPacketCount; /* 140 x8c   R */
144	__le32 IPReassemblyErrCount; /* 144 x90	  R */
145	__le32 TCPTxSegmentCount; /* 148 x94   R */
146	__le32 TCPTxByteCount;	/* 152 x98   R */
147	__le32 TCPRxSegmentCount; /* 156 x9c   R */
148	__le32 TCPRxByteCount;	/* 160 xa0   R */
149	__le32 TCPTimerExpCount; /* 164 xa4   R */
150	__le32 TCPRxAckCount;	/* 168 xa8   R */
151	__le32 TCPTxAckCount;	/* 172 xac   R */
152	__le32 TCPRxErrOOOCount; /* 176 xb0   R */
153	__le32 PSReserved0;	/* 180 xb4 */
154	__le32 TCPRxWindowProbeUpdateCount; /* 184 xb8	 R */
155	__le32 ECCErrCorrectionCount; /* 188 xbc   R */
156	__le32 PSReserved1[16]; /* 192 xc0 */
157};
158
159
160/*  remote register set (access via PCI memory read/write) */
161struct isp_reg {
162#define MBOX_REG_COUNT 8
163	__le32 mailbox[MBOX_REG_COUNT];
164
165	__le32 flash_address;	/* 0x20 */
166	__le32 flash_data;
167	__le32 ctrl_status;
168
169	union {
170		struct {
171			__le32 nvram;
172			__le32 reserved1[2]; /* 0x30 */
173		} __attribute__ ((packed)) isp4010;
174		struct {
175			__le32 intr_mask;
176			__le32 nvram; /* 0x30 */
177			__le32 semaphore;
178		} __attribute__ ((packed)) isp4022;
179	} u1;
180
181	__le32 req_q_in;    /* SCSI Request Queue Producer Index */
182	__le32 rsp_q_out;   /* SCSI Completion Queue Consumer Index */
183
184	__le32 reserved2[4];	/* 0x40 */
185
186	union {
187		struct {
188			__le32 ext_hw_conf; /* 0x50 */
189			__le32 flow_ctrl;
190			__le32 port_ctrl;
191			__le32 port_status;
192
193			__le32 reserved3[8]; /* 0x60 */
194
195			__le32 req_q_out; /* 0x80 */
196
197			__le32 reserved4[23]; /* 0x84 */
198
199			__le32 gp_out; /* 0xe0 */
200			__le32 gp_in;
201
202			__le32 reserved5[5];
203
204			__le32 port_err_status; /* 0xfc */
205		} __attribute__ ((packed)) isp4010;
206		struct {
207			union {
208				struct port_ctrl_stat_regs p0;
209				struct host_mem_cfg_regs p1;
210				struct local_ram_cfg_regs p2;
211				struct prot_stat_regs p3;
212				__le32 r_union[44];
213			};
214
215		} __attribute__ ((packed)) isp4022;
216	} u2;
217};				/* 256 x100 */
218
219
220/* Semaphore Defines for 4010 */
221#define QL4010_DRVR_SEM_BITS	0x00000030
222#define QL4010_GPIO_SEM_BITS	0x000000c0
223#define QL4010_SDRAM_SEM_BITS	0x00000300
224#define QL4010_PHY_SEM_BITS	0x00000c00
225#define QL4010_NVRAM_SEM_BITS	0x00003000
226#define QL4010_FLASH_SEM_BITS	0x0000c000
227
228#define QL4010_DRVR_SEM_MASK	0x00300000
229#define QL4010_GPIO_SEM_MASK	0x00c00000
230#define QL4010_SDRAM_SEM_MASK	0x03000000
231#define QL4010_PHY_SEM_MASK	0x0c000000
232#define QL4010_NVRAM_SEM_MASK	0x30000000
233#define QL4010_FLASH_SEM_MASK	0xc0000000
234
235/* Semaphore Defines for 4022 */
236#define QL4022_RESOURCE_MASK_BASE_CODE 0x7
237#define QL4022_RESOURCE_BITS_BASE_CODE 0x4
238
239
240#define QL4022_DRVR_SEM_MASK	(QL4022_RESOURCE_MASK_BASE_CODE << (1+16))
241#define QL4022_DDR_RAM_SEM_MASK (QL4022_RESOURCE_MASK_BASE_CODE << (4+16))
242#define QL4022_PHY_GIO_SEM_MASK (QL4022_RESOURCE_MASK_BASE_CODE << (7+16))
243#define QL4022_NVRAM_SEM_MASK	(QL4022_RESOURCE_MASK_BASE_CODE << (10+16))
244#define QL4022_FLASH_SEM_MASK	(QL4022_RESOURCE_MASK_BASE_CODE << (13+16))
245
246
247
248/* Page # defines for 4022 */
249#define PORT_CTRL_STAT_PAGE			0	/* 4022 */
250#define HOST_MEM_CFG_PAGE			1	/* 4022 */
251#define LOCAL_RAM_CFG_PAGE			2	/* 4022 */
252#define PROT_STAT_PAGE				3	/* 4022 */
253
254/* Register Mask - sets corresponding mask bits in the upper word */
255static inline uint32_t set_rmask(uint32_t val)
256{
257	return (val & 0xffff) | (val << 16);
258}
259
260
261static inline uint32_t clr_rmask(uint32_t val)
262{
263	return 0 | (val << 16);
264}
265
266/*  ctrl_status definitions */
267#define CSR_SCSI_PAGE_SELECT			0x00000003
268#define CSR_SCSI_INTR_ENABLE			0x00000004	/* 4010 */
269#define CSR_SCSI_RESET_INTR			0x00000008
270#define CSR_SCSI_COMPLETION_INTR		0x00000010
271#define CSR_SCSI_PROCESSOR_INTR			0x00000020
272#define CSR_INTR_RISC				0x00000040
273#define CSR_BOOT_ENABLE				0x00000080
274#define CSR_NET_PAGE_SELECT			0x00000300	/* 4010 */
275#define CSR_FUNC_NUM				0x00000700	/* 4022 */
276#define CSR_NET_RESET_INTR			0x00000800	/* 4010 */
277#define CSR_FORCE_SOFT_RESET			0x00002000	/* 4022 */
278#define CSR_FATAL_ERROR				0x00004000
279#define CSR_SOFT_RESET				0x00008000
280#define ISP_CONTROL_FN_MASK			CSR_FUNC_NUM
281#define ISP_CONTROL_FN0_SCSI			0x0500
282#define ISP_CONTROL_FN1_SCSI			0x0700
283
284#define INTR_PENDING				(CSR_SCSI_COMPLETION_INTR |\
285						 CSR_SCSI_PROCESSOR_INTR |\
286						 CSR_SCSI_RESET_INTR)
287
288/* ISP InterruptMask definitions */
289#define IMR_SCSI_INTR_ENABLE			0x00000004	/* 4022 */
290
291/* ISP 4022 nvram definitions */
292#define NVR_WRITE_ENABLE			0x00000010	/* 4022 */
293
294/*  ISP port_status definitions */
295
296/*  ISP Semaphore definitions */
297
298/*  ISP General Purpose Output definitions */
299
300/*  shadow registers (DMA'd from HA to system memory.  read only) */
301struct shadow_regs {
302	/* SCSI Request Queue Consumer Index */
303	__le32 req_q_out;	/*  0 x0   R */
304
305	/* SCSI Completion Queue Producer Index */
306	__le32 rsp_q_in;	/*  4 x4   R */
307};		  /*  8 x8 */
308
309
310/*  External hardware configuration register */
311union external_hw_config_reg {
312	struct {
313		__le32 bReserved0:1;
314		__le32 bSDRAMProtectionMethod:2;
315		__le32 bSDRAMBanks:1;
316		__le32 bSDRAMChipWidth:1;
317		__le32 bSDRAMChipSize:2;
318		__le32 bParityDisable:1;
319		__le32 bExternalMemoryType:1;
320		__le32 bFlashBIOSWriteEnable:1;
321		__le32 bFlashUpperBankSelect:1;
322		__le32 bWriteBurst:2;
323		__le32 bReserved1:3;
324		__le32 bMask:16;
325	};
326	uint32_t Asuint32_t;
327};
328
329/*************************************************************************
330 *
331 *		Mailbox Commands Structures and Definitions
332 *
333 *************************************************************************/
334
335/*  Mailbox command definitions */
336#define MBOX_CMD_ABOUT_FW			0x0009
337#define MBOX_CMD_LUN_RESET			0x0016
338#define MBOX_CMD_GET_MANAGEMENT_DATA		0x001E
339#define MBOX_CMD_GET_FW_STATUS			0x001F
340#define MBOX_CMD_SET_ISNS_SERVICE		0x0021
341#define ISNS_DISABLE				0
342#define ISNS_ENABLE				1
343#define MBOX_CMD_COPY_FLASH			0x0024
344#define MBOX_CMD_WRITE_FLASH			0x0025
345#define MBOX_CMD_READ_FLASH			0x0026
346#define MBOX_CMD_CLEAR_DATABASE_ENTRY		0x0031
347#define MBOX_CMD_CONN_CLOSE_SESS_LOGOUT		0x0056
348#define LOGOUT_OPTION_CLOSE_SESSION		0x01
349#define LOGOUT_OPTION_RELOGIN			0x02
350#define MBOX_CMD_EXECUTE_IOCB_A64		0x005A
351#define MBOX_CMD_INITIALIZE_FIRMWARE		0x0060
352#define MBOX_CMD_GET_INIT_FW_CTRL_BLOCK		0x0061
353#define MBOX_CMD_REQUEST_DATABASE_ENTRY		0x0062
354#define MBOX_CMD_SET_DATABASE_ENTRY		0x0063
355#define MBOX_CMD_GET_DATABASE_ENTRY		0x0064
356#define DDB_DS_UNASSIGNED			0x00
357#define DDB_DS_NO_CONNECTION_ACTIVE		0x01
358#define DDB_DS_SESSION_ACTIVE			0x04
359#define DDB_DS_SESSION_FAILED			0x06
360#define DDB_DS_LOGIN_IN_PROCESS			0x07
361#define MBOX_CMD_GET_FW_STATE			0x0069
362#define MBOX_CMD_GET_INIT_FW_CTRL_BLOCK_DEFAULTS 0x006A
363#define MBOX_CMD_RESTORE_FACTORY_DEFAULTS	0x0087
364
365/* Mailbox 1 */
366#define FW_STATE_READY				0x0000
367#define FW_STATE_CONFIG_WAIT			0x0001
368#define FW_STATE_WAIT_LOGIN			0x0002
369#define FW_STATE_ERROR				0x0004
370#define FW_STATE_DHCP_IN_PROGRESS		0x0008
371
372/* Mailbox 3 */
373#define FW_ADDSTATE_OPTICAL_MEDIA		0x0001
374#define FW_ADDSTATE_DHCP_ENABLED		0x0002
375#define FW_ADDSTATE_LINK_UP			0x0010
376#define FW_ADDSTATE_ISNS_SVC_ENABLED		0x0020
377#define MBOX_CMD_GET_DATABASE_ENTRY_DEFAULTS	0x006B
378#define MBOX_CMD_CONN_OPEN_SESS_LOGIN		0x0074
379#define MBOX_CMD_GET_CRASH_RECORD		0x0076	/* 4010 only */
380#define MBOX_CMD_GET_CONN_EVENT_LOG		0x0077
381
382/*  Mailbox status definitions */
383#define MBOX_COMPLETION_STATUS			4
384#define MBOX_STS_BUSY				0x0007
385#define MBOX_STS_INTERMEDIATE_COMPLETION	0x1000
386#define MBOX_STS_COMMAND_COMPLETE		0x4000
387#define MBOX_STS_COMMAND_ERROR			0x4005
388
389#define MBOX_ASYNC_EVENT_STATUS			8
390#define MBOX_ASTS_SYSTEM_ERROR			0x8002
391#define MBOX_ASTS_REQUEST_TRANSFER_ERROR	0x8003
392#define MBOX_ASTS_RESPONSE_TRANSFER_ERROR	0x8004
393#define MBOX_ASTS_PROTOCOL_STATISTIC_ALARM	0x8005
394#define MBOX_ASTS_SCSI_COMMAND_PDU_REJECTED	0x8006
395#define MBOX_ASTS_LINK_UP			0x8010
396#define MBOX_ASTS_LINK_DOWN			0x8011
397#define MBOX_ASTS_DATABASE_CHANGED		0x8014
398#define MBOX_ASTS_UNSOLICITED_PDU_RECEIVED	0x8015
399#define MBOX_ASTS_SELF_TEST_FAILED		0x8016
400#define MBOX_ASTS_LOGIN_FAILED			0x8017
401#define MBOX_ASTS_DNS				0x8018
402#define MBOX_ASTS_HEARTBEAT			0x8019
403#define MBOX_ASTS_NVRAM_INVALID			0x801A
404#define MBOX_ASTS_MAC_ADDRESS_CHANGED		0x801B
405#define MBOX_ASTS_IP_ADDRESS_CHANGED		0x801C
406#define MBOX_ASTS_DHCP_LEASE_EXPIRED		0x801D
407#define MBOX_ASTS_DHCP_LEASE_ACQUIRED		0x801F
408#define MBOX_ASTS_ISNS_UNSOLICITED_PDU_RECEIVED 0x8021
409#define ISNS_EVENT_DATA_RECEIVED		0x0000
410#define ISNS_EVENT_CONNECTION_OPENED		0x0001
411#define ISNS_EVENT_CONNECTION_FAILED		0x0002
412#define MBOX_ASTS_IPSEC_SYSTEM_FATAL_ERROR	0x8022
413#define MBOX_ASTS_SUBNET_STATE_CHANGE		0x8027
414
415/*************************************************************************/
416
417/* Host Adapter Initialization Control Block (from host) */
418struct init_fw_ctrl_blk {
419	uint8_t Version;	/* 00 */
420	uint8_t Control;	/* 01 */
421
422	uint16_t FwOptions;	/* 02-03 */
423#define	 FWOPT_HEARTBEAT_ENABLE		  0x1000
424#define	 FWOPT_SESSION_MODE		  0x0040
425#define	 FWOPT_INITIATOR_MODE		  0x0020
426#define	 FWOPT_TARGET_MODE		  0x0010
427
428	uint16_t ExecThrottle;	/* 04-05 */
429	uint8_t RetryCount;	/* 06 */
430	uint8_t RetryDelay;	/* 07 */
431	uint16_t MaxEthFrPayloadSize;	/* 08-09 */
432	uint16_t AddFwOptions;	/* 0A-0B */
433
434	uint8_t HeartbeatInterval;	/* 0C */
435	uint8_t InstanceNumber; /* 0D */
436	uint16_t RES2;		/* 0E-0F */
437	uint16_t ReqQConsumerIndex;	/* 10-11 */
438	uint16_t ComplQProducerIndex;	/* 12-13 */
439	uint16_t ReqQLen;	/* 14-15 */
440	uint16_t ComplQLen;	/* 16-17 */
441	uint32_t ReqQAddrLo;	/* 18-1B */
442	uint32_t ReqQAddrHi;	/* 1C-1F */
443	uint32_t ComplQAddrLo;	/* 20-23 */
444	uint32_t ComplQAddrHi;	/* 24-27 */
445	uint32_t ShadowRegBufAddrLo;	/* 28-2B */
446	uint32_t ShadowRegBufAddrHi;	/* 2C-2F */
447
448	uint16_t iSCSIOptions;	/* 30-31 */
449
450	uint16_t TCPOptions;	/* 32-33 */
451
452	uint16_t IPOptions;	/* 34-35 */
453
454	uint16_t MaxPDUSize;	/* 36-37 */
455	uint16_t RcvMarkerInt;	/* 38-39 */
456	uint16_t SndMarkerInt;	/* 3A-3B */
457	uint16_t InitMarkerlessInt;	/* 3C-3D */
458	uint16_t FirstBurstSize;	/* 3E-3F */
459	uint16_t DefaultTime2Wait;	/* 40-41 */
460	uint16_t DefaultTime2Retain;	/* 42-43 */
461	uint16_t MaxOutStndngR2T;	/* 44-45 */
462	uint16_t KeepAliveTimeout;	/* 46-47 */
463	uint16_t PortNumber;	/* 48-49 */
464	uint16_t MaxBurstSize;	/* 4A-4B */
465	uint32_t RES4;		/* 4C-4F */
466	uint8_t IPAddr[4];	/* 50-53 */
467	uint8_t RES5[12];	/* 54-5F */
468	uint8_t SubnetMask[4];	/* 60-63 */
469	uint8_t RES6[12];	/* 64-6F */
470	uint8_t GatewayIPAddr[4];	/* 70-73 */
471	uint8_t RES7[12];	/* 74-7F */
472	uint8_t PriDNSIPAddr[4];	/* 80-83 */
473	uint8_t SecDNSIPAddr[4];	/* 84-87 */
474	uint8_t RES8[8];	/* 88-8F */
475	uint8_t Alias[32];	/* 90-AF */
476	uint8_t TargAddr[8];	/* B0-B7 */
477	uint8_t CHAPNameSecretsTable[8];	/* B8-BF */
478	uint8_t EthernetMACAddr[6];	/* C0-C5 */
479	uint16_t TargetPortalGroup;	/* C6-C7 */
480	uint8_t SendScale;	/* C8	 */
481	uint8_t RecvScale;	/* C9	 */
482	uint8_t TypeOfService;	/* CA	 */
483	uint8_t Time2Live;	/* CB	 */
484	uint16_t VLANPriority;	/* CC-CD */
485	uint16_t Reserved8;	/* CE-CF */
486	uint8_t SecIPAddr[4];	/* D0-D3 */
487	uint8_t Reserved9[12];	/* D4-DF */
488	uint8_t iSNSIPAddr[4];	/* E0-E3 */
489	uint16_t iSNSServerPortNumber;	/* E4-E5 */
490	uint8_t Reserved10[10]; /* E6-EF */
491	uint8_t SLPDAIPAddr[4]; /* F0-F3 */
492	uint8_t Reserved11[12]; /* F4-FF */
493	uint8_t iSCSINameString[256];	/* 100-1FF */
494};
495
496/*************************************************************************/
497
498struct dev_db_entry {
499	uint8_t options;	/* 00 */
500#define DDB_OPT_DISC_SESSION  0x10
501#define DDB_OPT_TARGET	      0x02 /* device is a target */
502
503	uint8_t control;	/* 01 */
504
505	uint16_t exeThrottle;	/* 02-03 */
506	uint16_t exeCount;	/* 04-05 */
507	uint8_t retryCount;	/* 06	 */
508	uint8_t retryDelay;	/* 07	 */
509	uint16_t iSCSIOptions;	/* 08-09 */
510
511	uint16_t TCPOptions;	/* 0A-0B */
512
513	uint16_t IPOptions;	/* 0C-0D */
514
515	uint16_t maxPDUSize;	/* 0E-0F */
516	uint16_t rcvMarkerInt;	/* 10-11 */
517	uint16_t sndMarkerInt;	/* 12-13 */
518	uint16_t iSCSIMaxSndDataSegLen; /* 14-15 */
519	uint16_t firstBurstSize;	/* 16-17 */
520	uint16_t minTime2Wait;	/* 18-19 : RA :default_time2wait */
521	uint16_t maxTime2Retain;	/* 1A-1B */
522	uint16_t maxOutstndngR2T;	/* 1C-1D */
523	uint16_t keepAliveTimeout;	/* 1E-1F */
524	uint8_t ISID[6];	/* 20-25 big-endian, must be converted
525				 * to little-endian */
526	uint16_t TSID;		/* 26-27 */
527	uint16_t portNumber;	/* 28-29 */
528	uint16_t maxBurstSize;	/* 2A-2B */
529	uint16_t taskMngmntTimeout;	/* 2C-2D */
530	uint16_t reserved1;	/* 2E-2F */
531	uint8_t ipAddr[0x10];	/* 30-3F */
532	uint8_t iSCSIAlias[0x20];	/* 40-5F */
533	uint8_t targetAddr[0x20];	/* 60-7F */
534	uint8_t userID[0x20];	/* 80-9F */
535	uint8_t password[0x20]; /* A0-BF */
536	uint8_t iscsiName[0x100];	/* C0-1BF : xxzzy Make this a
537					 * pointer to a string so we
538					 * don't have to reserve soooo
539					 * much RAM */
540	uint16_t ddbLink;	/* 1C0-1C1 */
541	uint16_t CHAPTableIndex; /* 1C2-1C3 */
542	uint16_t TargetPortalGroup; /* 1C4-1C5 */
543	uint16_t reserved2[2];	/* 1C6-1C7 */
544	uint32_t statSN;	/* 1C8-1CB */
545	uint32_t expStatSN;	/* 1CC-1CF */
546	uint16_t reserved3[0x2C]; /* 1D0-1FB */
547	uint16_t ddbValidCookie; /* 1FC-1FD */
548	uint16_t ddbValidSize;	/* 1FE-1FF */
549};
550
551/*************************************************************************/
552
553/* Flash definitions */
554
555#define FLASH_OFFSET_SYS_INFO	0x02000000
556#define FLASH_DEFAULTBLOCKSIZE	0x20000
557#define FLASH_EOF_OFFSET	(FLASH_DEFAULTBLOCKSIZE-8) /* 4 bytes
558							    * for EOF
559							    * signature */
560
561struct sys_info_phys_addr {
562	uint8_t address[6];	/* 00-05 */
563	uint8_t filler[2];	/* 06-07 */
564};
565
566struct flash_sys_info {
567	uint32_t cookie;	/* 00-03 */
568	uint32_t physAddrCount; /* 04-07 */
569	struct sys_info_phys_addr physAddr[4]; /* 08-27 */
570	uint8_t vendorId[128];	/* 28-A7 */
571	uint8_t productId[128]; /* A8-127 */
572	uint32_t serialNumber;	/* 128-12B */
573
574	/*  PCI Configuration values */
575	uint32_t pciDeviceVendor;	/* 12C-12F */
576	uint32_t pciDeviceId;	/* 130-133 */
577	uint32_t pciSubsysVendor;	/* 134-137 */
578	uint32_t pciSubsysId;	/* 138-13B */
579
580	/*  This validates version 1. */
581	uint32_t crumbs;	/* 13C-13F */
582
583	uint32_t enterpriseNumber;	/* 140-143 */
584
585	uint32_t mtu;		/* 144-147 */
586	uint32_t reserved0;	/* 148-14b */
587	uint32_t crumbs2;	/* 14c-14f */
588	uint8_t acSerialNumber[16];	/* 150-15f */
589	uint32_t crumbs3;	/* 160-16f */
590
591	/* Leave this last in the struct so it is declared invalid if
592	 * any new items are added.
593	 */
594	uint32_t reserved1[39]; /* 170-1ff */
595};	/* 200 */
596
597struct crash_record {
598	uint16_t fw_major_version;	/* 00 - 01 */
599	uint16_t fw_minor_version;	/* 02 - 03 */
600	uint16_t fw_patch_version;	/* 04 - 05 */
601	uint16_t fw_build_version;	/* 06 - 07 */
602
603	uint8_t build_date[16]; /* 08 - 17 */
604	uint8_t build_time[16]; /* 18 - 27 */
605	uint8_t build_user[16]; /* 28 - 37 */
606	uint8_t card_serial_num[16];	/* 38 - 47 */
607
608	uint32_t time_of_crash_in_secs; /* 48 - 4B */
609	uint32_t time_of_crash_in_ms;	/* 4C - 4F */
610
611	uint16_t out_RISC_sd_num_frames;	/* 50 - 51 */
612	uint16_t OAP_sd_num_words;	/* 52 - 53 */
613	uint16_t IAP_sd_num_frames;	/* 54 - 55 */
614	uint16_t in_RISC_sd_num_words;	/* 56 - 57 */
615
616	uint8_t reserved1[28];	/* 58 - 7F */
617
618	uint8_t out_RISC_reg_dump[256]; /* 80 -17F */
619	uint8_t in_RISC_reg_dump[256];	/*180 -27F */
620	uint8_t in_out_RISC_stack_dump[0];	/*280 - ??? */
621};
622
623struct conn_event_log_entry {
624#define MAX_CONN_EVENT_LOG_ENTRIES	100
625	uint32_t timestamp_sec; /* 00 - 03 seconds since boot */
626	uint32_t timestamp_ms;	/* 04 - 07 milliseconds since boot */
627	uint16_t device_index;	/* 08 - 09  */
628	uint16_t fw_conn_state; /* 0A - 0B  */
629	uint8_t event_type;	/* 0C - 0C  */
630	uint8_t error_code;	/* 0D - 0D  */
631	uint16_t error_code_detail;	/* 0E - 0F  */
632	uint8_t num_consecutive_events; /* 10 - 10  */
633	uint8_t rsvd[3];	/* 11 - 13  */
634};
635
636/*************************************************************************
637 *
638 *				IOCB Commands Structures and Definitions
639 *
640 *************************************************************************/
641#define IOCB_MAX_CDB_LEN	    16	/* Bytes in a CBD */
642#define IOCB_MAX_SENSEDATA_LEN	    32	/* Bytes of sense data */
643
644/* IOCB header structure */
645struct qla4_header {
646	uint8_t entryType;
647#define ET_STATUS		 0x03
648#define ET_MARKER		 0x04
649#define ET_CONT_T1		 0x0A
650#define ET_STATUS_CONTINUATION	 0x10
651#define ET_CMND_T3		 0x19
652#define ET_PASSTHRU0		 0x3A
653#define ET_PASSTHRU_STATUS	 0x3C
654
655	uint8_t entryStatus;
656	uint8_t systemDefined;
657	uint8_t entryCount;
658
659	/* SyetemDefined definition */
660};
661
662/* Generic queue entry structure*/
663struct queue_entry {
664	uint8_t data[60];
665	uint32_t signature;
666
667};
668
669/* 64 bit addressing segment counts*/
670
671#define COMMAND_SEG_A64	  1
672#define CONTINUE_SEG_A64  5
673
674/* 64 bit addressing segment definition*/
675
676struct data_seg_a64 {
677	struct {
678		uint32_t addrLow;
679		uint32_t addrHigh;
680
681	} base;
682
683	uint32_t count;
684
685};
686
687/* Command Type 3 entry structure*/
688
689struct command_t3_entry {
690	struct qla4_header hdr;	/* 00-03 */
691
692	uint32_t handle;	/* 04-07 */
693	uint16_t target;	/* 08-09 */
694	uint16_t connection_id; /* 0A-0B */
695
696	uint8_t control_flags;	/* 0C */
697
698	/* data direction  (bits 5-6) */
699#define CF_WRITE		0x20
700#define CF_READ			0x40
701#define CF_NO_DATA		0x00
702
703	/* task attributes (bits 2-0) */
704#define CF_HEAD_TAG		0x03
705#define CF_ORDERED_TAG		0x02
706#define CF_SIMPLE_TAG		0x01
707
708	/* STATE FLAGS FIELD IS A PLACE HOLDER. THE FW WILL SET BITS
709	 * IN THIS FIELD AS THE COMMAND IS PROCESSED. WHEN THE IOCB IS
710	 * CHANGED TO AN IOSB THIS FIELD WILL HAVE THE STATE FLAGS SET
711	 * PROPERLY.
712	 */
713	uint8_t state_flags;	/* 0D */
714	uint8_t cmdRefNum;	/* 0E */
715	uint8_t reserved1;	/* 0F */
716	uint8_t cdb[IOCB_MAX_CDB_LEN];	/* 10-1F */
717	struct scsi_lun lun;	/* FCP LUN (BE). */
718	uint32_t cmdSeqNum;	/* 28-2B */
719	uint16_t timeout;	/* 2C-2D */
720	uint16_t dataSegCnt;	/* 2E-2F */
721	uint32_t ttlByteCnt;	/* 30-33 */
722	struct data_seg_a64 dataseg[COMMAND_SEG_A64];	/* 34-3F */
723
724};
725
726
727/* Continuation Type 1 entry structure*/
728struct continuation_t1_entry {
729	struct qla4_header hdr;
730
731	struct data_seg_a64 dataseg[CONTINUE_SEG_A64];
732
733};
734
735/* Parameterize for 64 or 32 bits */
736#define COMMAND_SEG	COMMAND_SEG_A64
737#define CONTINUE_SEG	CONTINUE_SEG_A64
738
739#define ET_COMMAND	ET_CMND_T3
740#define ET_CONTINUE	ET_CONT_T1
741
742/* Marker entry structure*/
743struct marker_entry {
744	struct qla4_header hdr;	/* 00-03 */
745
746	uint32_t system_defined; /* 04-07 */
747	uint16_t target;	/* 08-09 */
748	uint16_t modifier;	/* 0A-0B */
749#define MM_LUN_RESET	     0
750
751	uint16_t flags;		/* 0C-0D */
752	uint16_t reserved1;	/* 0E-0F */
753	struct scsi_lun lun;	/* FCP LUN (BE). */
754	uint64_t reserved2;	/* 18-1F */
755	uint64_t reserved3;	/* 20-27 */
756	uint64_t reserved4;	/* 28-2F */
757	uint64_t reserved5;	/* 30-37 */
758	uint64_t reserved6;	/* 38-3F */
759};
760
761/* Status entry structure*/
762struct status_entry {
763	struct qla4_header hdr;	/* 00-03 */
764
765	uint32_t handle;	/* 04-07 */
766
767	uint8_t scsiStatus;	/* 08 */
768#define SCSI_CHECK_CONDITION		  0x02
769
770	uint8_t iscsiFlags;	/* 09 */
771#define ISCSI_FLAG_RESIDUAL_UNDER	  0x02
772#define ISCSI_FLAG_RESIDUAL_OVER	  0x04
773
774	uint8_t iscsiResponse;	/* 0A */
775
776	uint8_t completionStatus;	/* 0B */
777#define SCS_COMPLETE			  0x00
778#define SCS_INCOMPLETE			  0x01
779#define SCS_RESET_OCCURRED		  0x04
780#define SCS_ABORTED			  0x05
781#define SCS_TIMEOUT			  0x06
782#define SCS_DATA_OVERRUN		  0x07
783#define SCS_DATA_UNDERRUN		  0x15
784#define SCS_QUEUE_FULL			  0x1C
785#define SCS_DEVICE_UNAVAILABLE		  0x28
786#define SCS_DEVICE_LOGGED_OUT		  0x29
787
788	uint8_t reserved1;	/* 0C */
789
790	/* state_flags MUST be at the same location as state_flags in
791	 * the Command_T3/4_Entry */
792	uint8_t state_flags;	/* 0D */
793
794	uint16_t senseDataByteCnt;	/* 0E-0F */
795	uint32_t residualByteCnt;	/* 10-13 */
796	uint32_t bidiResidualByteCnt;	/* 14-17 */
797	uint32_t expSeqNum;	/* 18-1B */
798	uint32_t maxCmdSeqNum;	/* 1C-1F */
799	uint8_t senseData[IOCB_MAX_SENSEDATA_LEN];	/* 20-3F */
800
801};
802
803struct passthru0 {
804	struct qla4_header hdr;		       /* 00-03 */
805	uint32_t handle;	/* 04-07 */
806	uint16_t target;	/* 08-09 */
807	uint16_t connectionID;	/* 0A-0B */
808#define ISNS_DEFAULT_SERVER_CONN_ID	((uint16_t)0x8000)
809
810	uint16_t controlFlags;	/* 0C-0D */
811#define PT_FLAG_ETHERNET_FRAME		0x8000
812#define PT_FLAG_ISNS_PDU		0x8000
813#define PT_FLAG_SEND_BUFFER		0x0200
814#define PT_FLAG_WAIT_4_RESPONSE		0x0100
815
816	uint16_t timeout;	/* 0E-0F */
817#define PT_DEFAULT_TIMEOUT		30 /* seconds */
818
819	struct data_seg_a64 outDataSeg64;	/* 10-1B */
820	uint32_t res1;		/* 1C-1F */
821	struct data_seg_a64 inDataSeg64;	/* 20-2B */
822	uint8_t res2[20];	/* 2C-3F */
823};
824
825struct passthru_status {
826	struct qla4_header hdr;		       /* 00-03 */
827	uint32_t handle;	/* 04-07 */
828	uint16_t target;	/* 08-09 */
829	uint16_t connectionID;	/* 0A-0B */
830
831	uint8_t completionStatus;	/* 0C */
832#define PASSTHRU_STATUS_COMPLETE		0x01
833
834	uint8_t residualFlags;	/* 0D */
835
836	uint16_t timeout;	/* 0E-0F */
837	uint16_t portNumber;	/* 10-11 */
838	uint8_t res1[10];	/* 12-1B */
839	uint32_t outResidual;	/* 1C-1F */
840	uint8_t res2[12];	/* 20-2B */
841	uint32_t inResidual;	/* 2C-2F */
842	uint8_t res4[16];	/* 30-3F */
843};
844
845#endif /*  _QLA4X_FW_H */
846