lpfc_sli.h revision 2e0fef85e098f6794956b8b80b111179fbb4cbb7
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 *                                                                 *
8 * This program is free software; you can redistribute it and/or   *
9 * modify it under the terms of version 2 of the GNU General       *
10 * Public License as published by the Free Software Foundation.    *
11 * This program is distributed in the hope that it will be useful. *
12 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND          *
13 * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,  *
14 * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE      *
15 * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD *
16 * TO BE LEGALLY INVALID.  See the GNU General Public License for  *
17 * more details, a copy of which can be found in the file COPYING  *
18 * included with this package.                                     *
19 *******************************************************************/
20
21/* forward declaration for LPFC_IOCB_t's use */
22struct lpfc_hba;
23struct lpfc_vport;
24
25/* Define the context types that SLI handles for abort and sums. */
26typedef enum _lpfc_ctx_cmd {
27	LPFC_CTX_LUN,
28	LPFC_CTX_TGT,
29	LPFC_CTX_CTX,
30	LPFC_CTX_HOST
31} lpfc_ctx_cmd;
32
33/* This structure is used to handle IOCB requests / responses */
34struct lpfc_iocbq {
35	/* lpfc_iocbqs are used in double linked lists */
36	struct list_head list;
37	uint16_t iotag;         /* pre-assigned IO tag */
38	uint16_t rsvd1;
39
40	IOCB_t iocb;		/* IOCB cmd */
41	uint8_t retry;		/* retry counter for IOCB cmd - if needed */
42	uint8_t iocb_flag;
43#define LPFC_IO_LIBDFC		1	/* libdfc iocb */
44#define LPFC_IO_WAKE		2	/* High Priority Queue signal flag */
45#define LPFC_IO_FCP		4	/* FCP command -- iocbq in scsi_buf */
46#define LPFC_DRIVER_ABORTED	8	/* driver aborted this request */
47
48	uint8_t abort_count;
49	uint8_t rsvd2;
50	uint32_t drvrTimeout;	/* driver timeout in seconds */
51	struct lpfc_vport *vport;/* virtual port pointer */
52	void *context1;		/* caller context information */
53	void *context2;		/* caller context information */
54	void *context3;		/* caller context information */
55	union {
56		wait_queue_head_t  *wait_queue;
57		struct lpfc_iocbq  *rsp_iocb;
58		struct lpfcMboxq   *mbox;
59	} context_un;
60
61	void (*iocb_cmpl) (struct lpfc_hba *, struct lpfc_iocbq *,
62			   struct lpfc_iocbq *);
63
64};
65
66#define SLI_IOCB_RET_IOCB      1	/* Return IOCB if cmd ring full */
67
68#define IOCB_SUCCESS        0
69#define IOCB_BUSY           1
70#define IOCB_ERROR          2
71#define IOCB_TIMEDOUT       3
72
73#define LPFC_MBX_WAKE	1
74
75typedef struct lpfcMboxq {
76	/* MBOXQs are used in single linked lists */
77	struct list_head list;	/* ptr to next mailbox command */
78	MAILBOX_t mb;		/* Mailbox cmd */
79	struct lpfc_vport *vport;/* virutal port pointer */
80	void *context1;		/* caller context information */
81	void *context2;		/* caller context information */
82
83	void (*mbox_cmpl) (struct lpfc_hba *, struct lpfcMboxq *);
84	uint8_t mbox_flag;
85
86} LPFC_MBOXQ_t;
87
88#define MBX_POLL        1	/* poll mailbox till command done, then
89				   return */
90#define MBX_NOWAIT      2	/* issue command then return immediately */
91#define MBX_STOP_IOCB   4	/* Stop iocb processing till mbox cmds
92				   complete */
93
94#define LPFC_MAX_RING_MASK  4	/* max num of rctl/type masks allowed per
95				   ring */
96#define LPFC_MAX_RING       4	/* max num of SLI rings used by driver */
97
98struct lpfc_sli_ring;
99
100struct lpfc_sli_ring_mask {
101	uint8_t profile;	/* profile associated with ring */
102	uint8_t rctl;	/* rctl / type pair configured for ring */
103	uint8_t type;	/* rctl / type pair configured for ring */
104	uint8_t rsvd;
105	/* rcv'd unsol event */
106	void (*lpfc_sli_rcv_unsol_event) (struct lpfc_hba *,
107					 struct lpfc_sli_ring *,
108					 struct lpfc_iocbq *);
109};
110
111
112/* Structure used to hold SLI statistical counters and info */
113struct lpfc_sli_ring_stat {
114	uint64_t iocb_event;	 /* IOCB event counters */
115	uint64_t iocb_cmd;	 /* IOCB cmd issued */
116	uint64_t iocb_rsp;	 /* IOCB rsp received */
117	uint64_t iocb_cmd_delay; /* IOCB cmd ring delay */
118	uint64_t iocb_cmd_full;	 /* IOCB cmd ring full */
119	uint64_t iocb_cmd_empty; /* IOCB cmd ring is now empty */
120	uint64_t iocb_rsp_full;	 /* IOCB rsp ring full */
121};
122
123/* Structure used to hold SLI ring information */
124struct lpfc_sli_ring {
125	uint16_t flag;		/* ring flags */
126#define LPFC_DEFERRED_RING_EVENT 0x001	/* Deferred processing a ring event */
127#define LPFC_CALL_RING_AVAILABLE 0x002	/* indicates cmd was full */
128#define LPFC_STOP_IOCB_MBX       0x010	/* Stop processing IOCB cmds mbox */
129#define LPFC_STOP_IOCB_EVENT     0x020	/* Stop processing IOCB cmds event */
130#define LPFC_STOP_IOCB_MASK      0x030	/* Stop processing IOCB cmds mask */
131	uint16_t abtsiotag;	/* tracks next iotag to use for ABTS */
132
133	uint32_t local_getidx;   /* last available cmd index (from cmdGetInx) */
134	uint32_t next_cmdidx;    /* next_cmd index */
135	uint32_t rspidx;	/* current index in response ring */
136	uint32_t cmdidx;	/* current index in command ring */
137	uint8_t rsvd;
138	uint8_t ringno;		/* ring number */
139	uint16_t numCiocb;	/* number of command iocb's per ring */
140	uint16_t numRiocb;	/* number of rsp iocb's per ring */
141
142	uint32_t fast_iotag;	/* max fastlookup based iotag           */
143	uint32_t iotag_ctr;	/* keeps track of the next iotag to use */
144	uint32_t iotag_max;	/* max iotag value to use               */
145	struct list_head txq;
146	uint16_t txq_cnt;	/* current length of queue */
147	uint16_t txq_max;	/* max length */
148	struct list_head txcmplq;
149	uint16_t txcmplq_cnt;	/* current length of queue */
150	uint16_t txcmplq_max;	/* max length */
151	uint32_t *cmdringaddr;	/* virtual address for cmd rings */
152	uint32_t *rspringaddr;	/* virtual address for rsp rings */
153	uint32_t missbufcnt;	/* keep track of buffers to post */
154	struct list_head postbufq;
155	uint16_t postbufq_cnt;	/* current length of queue */
156	uint16_t postbufq_max;	/* max length */
157	struct list_head iocb_continueq;
158	uint16_t iocb_continueq_cnt;	/* current length of queue */
159	uint16_t iocb_continueq_max;	/* max length */
160
161	struct lpfc_sli_ring_mask prt[LPFC_MAX_RING_MASK];
162	uint32_t num_mask;	/* number of mask entries in prt array */
163
164	struct lpfc_sli_ring_stat stats;	/* SLI statistical info */
165
166	/* cmd ring available */
167	void (*lpfc_sli_cmd_available) (struct lpfc_hba *,
168					struct lpfc_sli_ring *);
169};
170
171/* Structure used to hold SLI statistical counters and info */
172struct lpfc_sli_stat {
173	uint64_t mbox_stat_err;  /* Mbox cmds completed status error */
174	uint64_t mbox_cmd;       /* Mailbox commands issued */
175	uint64_t sli_intr;       /* Count of Host Attention interrupts */
176	uint32_t err_attn_event; /* Error Attn event counters */
177	uint32_t link_event;     /* Link event counters */
178	uint32_t mbox_event;     /* Mailbox event counters */
179	uint32_t mbox_busy;	 /* Mailbox cmd busy */
180};
181
182/* Structure to store link status values when port stats are reset */
183struct lpfc_lnk_stat {
184	uint32_t link_failure_count;
185	uint32_t loss_of_sync_count;
186	uint32_t loss_of_signal_count;
187	uint32_t prim_seq_protocol_err_count;
188	uint32_t invalid_tx_word_count;
189	uint32_t invalid_crc_count;
190	uint32_t error_frames;
191	uint32_t link_events;
192};
193
194/* Structure used to hold SLI information */
195struct lpfc_sli {
196	uint32_t num_rings;
197	uint32_t sli_flag;
198
199	/* Additional sli_flags */
200#define LPFC_SLI_MBOX_ACTIVE      0x100	/* HBA mailbox is currently active */
201#define LPFC_SLI2_ACTIVE          0x200	/* SLI2 overlay in firmware is active */
202#define LPFC_PROCESS_LA           0x400	/* Able to process link attention */
203#define LPFC_BLOCK_MGMT_IO        0x800	/* Don't allow mgmt mbx or iocb cmds */
204
205	struct lpfc_sli_ring ring[LPFC_MAX_RING];
206	int fcp_ring;		/* ring used for FCP initiator commands */
207	int next_ring;
208
209	int extra_ring;		/* extra ring used for other protocols */
210
211	struct lpfc_sli_stat slistat;	/* SLI statistical info */
212	struct list_head mboxq;
213	uint16_t mboxq_cnt;	/* current length of queue */
214	uint16_t mboxq_max;	/* max length */
215	LPFC_MBOXQ_t *mbox_active;	/* active mboxq information */
216
217	struct timer_list mbox_tmo;	/* Hold clk to timeout active mbox
218					   cmd */
219
220#define LPFC_IOCBQ_LOOKUP_INCREMENT  1024
221	struct lpfc_iocbq ** iocbq_lookup; /* array to lookup IOCB by IOTAG */
222	size_t iocbq_lookup_len;           /* current lengs of the array */
223	uint16_t  last_iotag;              /* last allocated IOTAG */
224	unsigned long  stats_start;        /* in seconds */
225	struct lpfc_lnk_stat lnk_stat_offsets;
226};
227
228/* Given a pointer to the start of the ring, and the slot number of
229 * the desired iocb entry, calc a pointer to that entry.
230 * (assume iocb entry size is 32 bytes, or 8 words)
231 */
232#define IOCB_ENTRY(ring,slot) ((IOCB_t *)(((char *)(ring)) + ((slot) * 32)))
233
234#define LPFC_MBOX_TMO           30	/* Sec tmo for outstanding mbox
235					   command */
236#define LPFC_MBOX_TMO_FLASH_CMD 300     /* Sec tmo for outstanding FLASH write
237					 * or erase cmds. This is especially
238					 * long because of the potential of
239					 * multiple flash erases that can be
240					 * spawned.
241					 */
242