1/*******************************************************************
2 * This file is part of the Emulex Linux Device Driver for         *
3 * Fibre Channel Host Bus Adapters.                                *
4 * Copyright (C) 2004-2007 Emulex.  All rights reserved.           *
5 * EMULEX and SLI are trademarks of Emulex.                        *
6 * www.emulex.com                                                  *
7 * Portions Copyright (C) 2004-2005 Christoph Hellwig              *
8 *                                                                 *
9 * This program is free software; you can redistribute it and/or   *
10 * modify it under the terms of version 2 of the GNU General       *
11 * Public License as published by the Free Software Foundation.    *
12 * This program is distributed in the hope that it will be useful. *
13 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
14 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
15 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
16 * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
17 * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
18 * more details, a copy of which can be found in the file COPYING  *
19 * included with this package.                                     *
20 *******************************************************************/
21
22struct lpfc_sli2_slim;
23
24
25#define LPFC_MAX_TARGET		256	/* max number of targets supported */
26#define LPFC_MAX_DISC_THREADS	64	/* max outstanding discovery els
27					   requests */
28#define LPFC_MAX_NS_RETRY	3	/* Number of retry attempts to contact
29					   the NameServer  before giving up. */
30#define LPFC_CMD_PER_LUN	3	/* max outstanding cmds per lun */
31#define LPFC_SG_SEG_CNT		64	/* sg element count per scsi cmnd */
32#define LPFC_IOCB_LIST_CNT	2250	/* list of IOCBs for fast-path usage. */
33#define LPFC_Q_RAMP_UP_INTERVAL 120     /* lun q_depth ramp up interval */
34
35/* Define macros for 64 bit support */
36#define putPaddrLow(addr)    ((uint32_t) (0xffffffff & (u64)(addr)))
37#define putPaddrHigh(addr)   ((uint32_t) (0xffffffff & (((u64)(addr))>>32)))
38#define getPaddr(high, low)  ((dma_addr_t)( \
39			     (( (u64)(high)<<16 ) << 16)|( (u64)(low))))
40/* Provide maximum configuration definitions. */
41#define LPFC_DRVR_TIMEOUT	16	/* driver iocb timeout value in sec */
42#define FC_MAX_ADPTMSG		64
43
44#define MAX_HBAEVT	32
45
46enum lpfc_polling_flags {
47	ENABLE_FCP_RING_POLLING = 0x1,
48	DISABLE_FCP_RING_INT    = 0x2
49};
50
51/* Provide DMA memory definitions the driver uses per port instance. */
52struct lpfc_dmabuf {
53	struct list_head list;
54	void *virt;		/* virtual address ptr */
55	dma_addr_t phys;	/* mapped address */
56};
57
58struct lpfc_dma_pool {
59	struct lpfc_dmabuf   *elements;
60	uint32_t    max_count;
61	uint32_t    current_count;
62};
63
64/* Priority bit.  Set value to exceed low water mark in lpfc_mem. */
65#define MEM_PRI		0x100
66
67
68/****************************************************************************/
69/*      Device VPD save area                                                */
70/****************************************************************************/
71typedef struct lpfc_vpd {
72	uint32_t status;	/* vpd status value */
73	uint32_t length;	/* number of bytes actually returned */
74	struct {
75		uint32_t rsvd1;	/* Revision numbers */
76		uint32_t biuRev;
77		uint32_t smRev;
78		uint32_t smFwRev;
79		uint32_t endecRev;
80		uint16_t rBit;
81		uint8_t fcphHigh;
82		uint8_t fcphLow;
83		uint8_t feaLevelHigh;
84		uint8_t feaLevelLow;
85		uint32_t postKernRev;
86		uint32_t opFwRev;
87		uint8_t opFwName[16];
88		uint32_t sli1FwRev;
89		uint8_t sli1FwName[16];
90		uint32_t sli2FwRev;
91		uint8_t sli2FwName[16];
92	} rev;
93} lpfc_vpd_t;
94
95struct lpfc_scsi_buf;
96
97
98/*
99 * lpfc stat counters
100 */
101struct lpfc_stats {
102	/* Statistics for ELS commands */
103	uint32_t elsLogiCol;
104	uint32_t elsRetryExceeded;
105	uint32_t elsXmitRetry;
106	uint32_t elsDelayRetry;
107	uint32_t elsRcvDrop;
108	uint32_t elsRcvFrame;
109	uint32_t elsRcvRSCN;
110	uint32_t elsRcvRNID;
111	uint32_t elsRcvFARP;
112	uint32_t elsRcvFARPR;
113	uint32_t elsRcvFLOGI;
114	uint32_t elsRcvPLOGI;
115	uint32_t elsRcvADISC;
116	uint32_t elsRcvPDISC;
117	uint32_t elsRcvFAN;
118	uint32_t elsRcvLOGO;
119	uint32_t elsRcvPRLO;
120	uint32_t elsRcvPRLI;
121	uint32_t elsRcvLIRR;
122	uint32_t elsRcvRPS;
123	uint32_t elsRcvRPL;
124	uint32_t elsXmitFLOGI;
125	uint32_t elsXmitPLOGI;
126	uint32_t elsXmitPRLI;
127	uint32_t elsXmitADISC;
128	uint32_t elsXmitLOGO;
129	uint32_t elsXmitSCR;
130	uint32_t elsXmitRNID;
131	uint32_t elsXmitFARP;
132	uint32_t elsXmitFARPR;
133	uint32_t elsXmitACC;
134	uint32_t elsXmitLSRJT;
135
136	uint32_t frameRcvBcast;
137	uint32_t frameRcvMulti;
138	uint32_t strayXmitCmpl;
139	uint32_t frameXmitDelay;
140	uint32_t xriCmdCmpl;
141	uint32_t xriStatErr;
142	uint32_t LinkUp;
143	uint32_t LinkDown;
144	uint32_t LinkMultiEvent;
145	uint32_t NoRcvBuf;
146	uint32_t fcpCmd;
147	uint32_t fcpCmpl;
148	uint32_t fcpRspErr;
149	uint32_t fcpRemoteStop;
150	uint32_t fcpPortRjt;
151	uint32_t fcpPortBusy;
152	uint32_t fcpError;
153	uint32_t fcpLocalErr;
154};
155
156enum sysfs_mbox_state {
157	SMBOX_IDLE,
158	SMBOX_WRITING,
159	SMBOX_READING
160};
161
162struct lpfc_sysfs_mbox {
163	enum sysfs_mbox_state state;
164	size_t                offset;
165	struct lpfcMboxq *    mbox;
166};
167
168struct lpfc_hba {
169	struct lpfc_sli sli;
170	struct lpfc_sli2_slim *slim2p;
171	dma_addr_t slim2p_mapping;
172	uint16_t pci_cfg_value;
173
174	int32_t hba_state;
175
176#define LPFC_STATE_UNKNOWN        0    /* HBA state is unknown */
177#define LPFC_WARM_START           1    /* HBA state after selective reset */
178#define LPFC_INIT_START           2    /* Initial state after board reset */
179#define LPFC_INIT_MBX_CMDS        3    /* Initialize HBA with mbox commands */
180#define LPFC_LINK_DOWN            4    /* HBA initialized, link is down */
181#define LPFC_LINK_UP              5    /* Link is up  - issue READ_LA */
182#define LPFC_LOCAL_CFG_LINK       6    /* local NPORT Id configured */
183#define LPFC_FLOGI                7    /* FLOGI sent to Fabric */
184#define LPFC_FABRIC_CFG_LINK      8    /* Fabric assigned NPORT Id
185					   configured */
186#define LPFC_NS_REG               9	/* Register with NameServer */
187#define LPFC_NS_QRY               10	/* Query NameServer for NPort ID list */
188#define LPFC_BUILD_DISC_LIST      11	/* Build ADISC and PLOGI lists for
189					 * device authentication / discovery */
190#define LPFC_DISC_AUTH            12	/* Processing ADISC list */
191#define LPFC_CLEAR_LA             13	/* authentication cmplt - issue
192					   CLEAR_LA */
193#define LPFC_HBA_READY            32
194#define LPFC_HBA_ERROR            -1
195
196	int32_t stopped;   /* HBA has not been restarted since last ERATT */
197	uint8_t fc_linkspeed;	/* Link speed after last READ_LA */
198
199	uint32_t fc_eventTag;	/* event tag for link attention */
200	uint32_t fc_prli_sent;	/* cntr for outstanding PRLIs */
201
202	uint32_t num_disc_nodes;	/*in addition to hba_state */
203
204	struct timer_list fc_estabtmo;	/* link establishment timer */
205	struct timer_list fc_disctmo;	/* Discovery rescue timer */
206	struct timer_list fc_fdmitmo;	/* fdmi timer */
207	/* These fields used to be binfo */
208	struct lpfc_name fc_nodename;	/* fc nodename */
209	struct lpfc_name fc_portname;	/* fc portname */
210	uint32_t fc_pref_DID;	/* preferred D_ID */
211	uint8_t fc_pref_ALPA;	/* preferred AL_PA */
212	uint32_t fc_edtov;	/* E_D_TOV timer value */
213	uint32_t fc_arbtov;	/* ARB_TOV timer value */
214	uint32_t fc_ratov;	/* R_A_TOV timer value */
215	uint32_t fc_rttov;	/* R_T_TOV timer value */
216	uint32_t fc_altov;	/* AL_TOV timer value */
217	uint32_t fc_crtov;	/* C_R_TOV timer value */
218	uint32_t fc_citov;	/* C_I_TOV timer value */
219	uint32_t fc_myDID;	/* fibre channel S_ID */
220	uint32_t fc_prevDID;	/* previous fibre channel S_ID */
221
222	struct serv_parm fc_sparam;	/* buffer for our service parameters */
223	struct serv_parm fc_fabparam;	/* fabric service parameters buffer */
224	uint8_t alpa_map[128];	/* AL_PA map from READ_LA */
225
226	uint8_t fc_ns_retry;	/* retries for fabric nameserver */
227	uint32_t fc_nlp_cnt;	/* outstanding NODELIST requests */
228	uint32_t fc_rscn_id_cnt;	/* count of RSCNs payloads in list */
229	struct lpfc_dmabuf *fc_rscn_id_list[FC_MAX_HOLD_RSCN];
230	uint32_t lmt;
231	uint32_t fc_flag;	/* FC flags */
232#define FC_PT2PT                0x1	/* pt2pt with no fabric */
233#define FC_PT2PT_PLOGI          0x2	/* pt2pt initiate PLOGI */
234#define FC_DISC_TMO             0x4	/* Discovery timer running */
235#define FC_PUBLIC_LOOP          0x8	/* Public loop */
236#define FC_LBIT                 0x10	/* LOGIN bit in loopinit set */
237#define FC_RSCN_MODE            0x20	/* RSCN cmd rcv'ed */
238#define FC_NLP_MORE             0x40	/* More node to process in node tbl */
239#define FC_OFFLINE_MODE         0x80	/* Interface is offline for diag */
240#define FC_FABRIC               0x100	/* We are fabric attached */
241#define FC_ESTABLISH_LINK       0x200	/* Reestablish Link */
242#define FC_RSCN_DISCOVERY       0x400	/* Authenticate all devices after RSCN*/
243#define FC_BLOCK_MGMT_IO        0x800   /* Don't allow mgmt mbx or iocb cmds */
244#define FC_LOADING		0x1000	/* HBA in process of loading drvr */
245#define FC_UNLOADING		0x2000	/* HBA in process of unloading drvr */
246#define FC_SCSI_SCAN_TMO        0x4000	/* scsi scan timer running */
247#define FC_ABORT_DISCOVERY      0x8000	/* we want to abort discovery */
248#define FC_NDISC_ACTIVE         0x10000	/* NPort discovery active */
249#define FC_BYPASSED_MODE        0x20000	/* NPort is in bypassed mode */
250#define FC_LOOPBACK_MODE        0x40000	/* NPort is in Loopback mode */
251					/* This flag is set while issuing */
252					/* INIT_LINK mailbox command */
253#define FC_IGNORE_ERATT         0x80000	/* intr handler should ignore ERATT */
254
255	uint32_t fc_topology;	/* link topology, from LINK INIT */
256
257	struct lpfc_stats fc_stat;
258
259	struct list_head fc_nodes;
260
261	/* Keep counters for the number of entries in each list. */
262	uint16_t fc_plogi_cnt;
263	uint16_t fc_adisc_cnt;
264	uint16_t fc_reglogin_cnt;
265	uint16_t fc_prli_cnt;
266	uint16_t fc_unmap_cnt;
267	uint16_t fc_map_cnt;
268	uint16_t fc_npr_cnt;
269	uint16_t fc_unused_cnt;
270	struct lpfc_nodelist fc_fcpnodev; /* nodelist entry for no device */
271	uint32_t nport_event_cnt;	/* timestamp for nlplist entry */
272
273	uint32_t wwnn[2];
274	uint32_t RandomData[7];
275
276	uint32_t cfg_log_verbose;
277	uint32_t cfg_lun_queue_depth;
278	uint32_t cfg_nodev_tmo;
279	uint32_t cfg_devloss_tmo;
280	uint32_t cfg_hba_queue_depth;
281	uint32_t cfg_fcp_class;
282	uint32_t cfg_use_adisc;
283	uint32_t cfg_ack0;
284	uint32_t cfg_topology;
285	uint32_t cfg_scan_down;
286	uint32_t cfg_link_speed;
287	uint32_t cfg_cr_delay;
288	uint32_t cfg_cr_count;
289	uint32_t cfg_multi_ring_support;
290	uint32_t cfg_multi_ring_rctl;
291	uint32_t cfg_multi_ring_type;
292	uint32_t cfg_fdmi_on;
293	uint32_t cfg_discovery_threads;
294	uint32_t cfg_max_luns;
295	uint32_t cfg_poll;
296	uint32_t cfg_poll_tmo;
297	uint32_t cfg_use_msi;
298	uint32_t cfg_sg_seg_cnt;
299	uint32_t cfg_sg_dma_buf_size;
300	uint64_t cfg_soft_wwnn;
301	uint64_t cfg_soft_wwpn;
302
303	uint32_t dev_loss_tmo_changed;
304
305	lpfc_vpd_t vpd;		/* vital product data */
306
307	struct Scsi_Host *host;
308	struct pci_dev *pcidev;
309	struct list_head      work_list;
310	uint32_t              work_ha;      /* Host Attention Bits for WT */
311	uint32_t              work_ha_mask; /* HA Bits owned by WT        */
312	uint32_t              work_hs;      /* HS stored in case of ERRAT */
313	uint32_t              work_status[2]; /* Extra status from SLIM */
314	uint32_t              work_hba_events; /* Timeout to be handled  */
315#define WORKER_DISC_TMO                0x1	/* Discovery timeout */
316#define WORKER_ELS_TMO                 0x2	/* ELS timeout */
317#define WORKER_MBOX_TMO                0x4	/* MBOX timeout */
318#define WORKER_FDMI_TMO                0x8	/* FDMI timeout */
319
320	wait_queue_head_t    *work_wait;
321	struct task_struct   *worker_thread;
322
323	unsigned long pci_bar0_map;     /* Physical address for PCI BAR0 */
324	unsigned long pci_bar2_map;     /* Physical address for PCI BAR2 */
325	void __iomem *slim_memmap_p;	/* Kernel memory mapped address for
326					   PCI BAR0 */
327	void __iomem *ctrl_regs_memmap_p;/* Kernel memory mapped address for
328					    PCI BAR2 */
329
330	void __iomem *MBslimaddr;	/* virtual address for mbox cmds */
331	void __iomem *HAregaddr;	/* virtual address for host attn reg */
332	void __iomem *CAregaddr;	/* virtual address for chip attn reg */
333	void __iomem *HSregaddr;	/* virtual address for host status
334					   reg */
335	void __iomem *HCregaddr;	/* virtual address for host ctl reg */
336
337	int brd_no;			/* FC board number */
338
339	char SerialNumber[32];		/* adapter Serial Number */
340	char OptionROMVersion[32];	/* adapter BIOS / Fcode version */
341	char ModelDesc[256];		/* Model Description */
342	char ModelName[80];		/* Model Name */
343	char ProgramType[256];		/* Program Type */
344	char Port[20];			/* Port No */
345	uint8_t vpd_flag;               /* VPD data flag */
346
347#define VPD_MODEL_DESC      0x1         /* valid vpd model description */
348#define VPD_MODEL_NAME      0x2         /* valid vpd model name */
349#define VPD_PROGRAM_TYPE    0x4         /* valid vpd program type */
350#define VPD_PORT            0x8         /* valid vpd port data */
351#define VPD_MASK            0xf         /* mask for any vpd data */
352
353	uint8_t soft_wwn_enable;
354
355	struct timer_list fcp_poll_timer;
356	struct timer_list els_tmofunc;
357
358	/*
359	 * stat  counters
360	 */
361	uint64_t fc4InputRequests;
362	uint64_t fc4OutputRequests;
363	uint64_t fc4ControlRequests;
364
365	struct lpfc_sysfs_mbox sysfs_mbox;
366
367	/* fastpath list. */
368	spinlock_t scsi_buf_list_lock;
369	struct list_head lpfc_scsi_buf_list;
370	uint32_t total_scsi_bufs;
371	struct list_head lpfc_iocb_list;
372	uint32_t total_iocbq_bufs;
373
374	/* pci_mem_pools */
375	struct pci_pool *lpfc_scsi_dma_buf_pool;
376	struct pci_pool *lpfc_mbuf_pool;
377	struct lpfc_dma_pool lpfc_mbuf_safety_pool;
378
379	mempool_t *mbox_mem_pool;
380	mempool_t *nlp_mem_pool;
381
382	struct fc_host_statistics link_stats;
383};
384
385static inline void
386lpfc_set_loopback_flag(struct lpfc_hba *phba) {
387	if (phba->cfg_topology == FLAGS_LOCAL_LB)
388		phba->fc_flag |= FC_LOOPBACK_MODE;
389	else
390		phba->fc_flag &= ~FC_LOOPBACK_MODE;
391}
392
393struct rnidrsp {
394	void *buf;
395	uint32_t uniqueid;
396	struct list_head list;
397	uint32_t data;
398};
399
400#define FC_REG_DUMP_EVENT	0x10	/* Register for Dump events */
401