1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_SCSI_LPFC_DEBUG_FS)
24#define CONFIG_SCSI_LPFC_DEBUG_FS
25#endif
26
27
28struct lpfc_hba;
29struct lpfc_vport;
30
31
32typedef enum _lpfc_ctx_cmd {
33 LPFC_CTX_LUN,
34 LPFC_CTX_TGT,
35 LPFC_CTX_HOST
36} lpfc_ctx_cmd;
37
38struct lpfc_cq_event {
39 struct list_head list;
40 uint16_t hdwq;
41 union {
42 struct lpfc_mcqe mcqe_cmpl;
43 struct lpfc_acqe_link acqe_link;
44 struct lpfc_acqe_fip acqe_fip;
45 struct lpfc_acqe_dcbx acqe_dcbx;
46 struct lpfc_acqe_grp5 acqe_grp5;
47 struct lpfc_acqe_fc_la acqe_fc;
48 struct lpfc_acqe_sli acqe_sli;
49 struct lpfc_rcqe rcqe_cmpl;
50 struct sli4_wcqe_xri_aborted wcqe_axri;
51 struct lpfc_wcqe_complete wcqe_cmpl;
52 } cqe;
53};
54
55
56struct lpfc_iocbq {
57
58 struct list_head list;
59 struct list_head clist;
60 struct list_head dlist;
61 uint16_t iotag;
62 uint16_t sli4_lxritag;
63 uint16_t sli4_xritag;
64 uint16_t hba_wqidx;
65 struct lpfc_cq_event cq_event;
66 struct lpfc_wcqe_complete wcqe_cmpl;
67 uint64_t isr_timestamp;
68
69 union lpfc_wqe128 wqe;
70 IOCB_t iocb;
71
72 uint8_t rsvd2;
73 uint8_t priority;
74 uint8_t retry;
75 uint32_t iocb_flag;
76#define LPFC_IO_LIBDFC 1
77#define LPFC_IO_WAKE 2
78#define LPFC_IO_WAKE_TMO LPFC_IO_WAKE
79#define LPFC_IO_FCP 4
80#define LPFC_DRIVER_ABORTED 8
81#define LPFC_IO_FABRIC 0x10
82#define LPFC_DELAY_MEM_FREE 0x20
83#define LPFC_EXCHANGE_BUSY 0x40
84#define LPFC_USE_FCPWQIDX 0x80
85#define DSS_SECURITY_OP 0x100
86#define LPFC_IO_ON_TXCMPLQ 0x200
87#define LPFC_IO_DIF_PASS 0x400
88#define LPFC_IO_DIF_STRIP 0x800
89#define LPFC_IO_DIF_INSERT 0x1000
90#define LPFC_IO_CMD_OUTSTANDING 0x2000
91
92#define LPFC_FIP_ELS_ID_MASK 0xc000
93#define LPFC_FIP_ELS_ID_SHIFT 14
94
95#define LPFC_IO_OAS 0x10000
96#define LPFC_IO_FOF 0x20000
97#define LPFC_IO_LOOPBACK 0x40000
98#define LPFC_PRLI_NVME_REQ 0x80000
99#define LPFC_PRLI_FCP_REQ 0x100000
100#define LPFC_IO_NVME 0x200000
101#define LPFC_IO_NVME_LS 0x400000
102#define LPFC_IO_NVMET 0x800000
103
104 uint32_t drvrTimeout;
105 struct lpfc_vport *vport;
106 void *context1;
107 void *context2;
108 void *context3;
109 union {
110 wait_queue_head_t *wait_queue;
111 struct lpfc_iocbq *rsp_iocb;
112 struct lpfcMboxq *mbox;
113 struct lpfc_nodelist *ndlp;
114 struct lpfc_node_rrq *rrq;
115 } context_un;
116
117 void (*fabric_iocb_cmpl)(struct lpfc_hba *, struct lpfc_iocbq *,
118 struct lpfc_iocbq *);
119 void (*wait_iocb_cmpl)(struct lpfc_hba *, struct lpfc_iocbq *,
120 struct lpfc_iocbq *);
121 void (*iocb_cmpl)(struct lpfc_hba *, struct lpfc_iocbq *,
122 struct lpfc_iocbq *);
123 void (*wqe_cmpl)(struct lpfc_hba *, struct lpfc_iocbq *,
124 struct lpfc_wcqe_complete *);
125};
126
127#define SLI_IOCB_RET_IOCB 1
128
129#define IOCB_SUCCESS 0
130#define IOCB_BUSY 1
131#define IOCB_ERROR 2
132#define IOCB_TIMEDOUT 3
133
134#define SLI_WQE_RET_WQE 1
135
136#define WQE_SUCCESS 0
137#define WQE_BUSY 1
138#define WQE_ERROR 2
139#define WQE_TIMEDOUT 3
140#define WQE_ABORTED 4
141
142#define LPFC_MBX_WAKE 1
143#define LPFC_MBX_IMED_UNREG 2
144
145typedef struct lpfcMboxq {
146
147 struct list_head list;
148 union {
149 MAILBOX_t mb;
150 struct lpfc_mqe mqe;
151 } u;
152 struct lpfc_vport *vport;
153 void *ctx_ndlp;
154 void *ctx_buf;
155 void *context3;
156
157 void (*mbox_cmpl) (struct lpfc_hba *, struct lpfcMboxq *);
158 uint8_t mbox_flag;
159 uint16_t in_ext_byte_len;
160 uint16_t out_ext_byte_len;
161 uint8_t mbox_offset_word;
162 struct lpfc_mcqe mcqe;
163 struct lpfc_mbx_nembed_sge_virt *sge_array;
164} LPFC_MBOXQ_t;
165
166#define MBX_POLL 1
167
168#define MBX_NOWAIT 2
169
170#define LPFC_MAX_RING_MASK 5
171
172#define LPFC_SLI3_MAX_RING 4
173
174
175
176struct lpfc_sli_ring;
177
178struct lpfc_sli_ring_mask {
179 uint8_t profile;
180 uint8_t rctl;
181 uint8_t type;
182 uint8_t rsvd;
183
184 void (*lpfc_sli_rcv_unsol_event) (struct lpfc_hba *,
185 struct lpfc_sli_ring *,
186 struct lpfc_iocbq *);
187};
188
189
190
191struct lpfc_sli_ring_stat {
192 uint64_t iocb_event;
193 uint64_t iocb_cmd;
194 uint64_t iocb_rsp;
195 uint64_t iocb_cmd_delay;
196 uint64_t iocb_cmd_full;
197 uint64_t iocb_cmd_empty;
198 uint64_t iocb_rsp_full;
199};
200
201struct lpfc_sli3_ring {
202 uint32_t local_getidx;
203 uint32_t next_cmdidx;
204 uint32_t rspidx;
205 uint32_t cmdidx;
206 uint16_t numCiocb;
207 uint16_t numRiocb;
208 uint16_t sizeCiocb;
209 uint16_t sizeRiocb;
210 uint32_t *cmdringaddr;
211 uint32_t *rspringaddr;
212};
213
214struct lpfc_sli4_ring {
215 struct lpfc_queue *wqp;
216};
217
218
219
220struct lpfc_sli_ring {
221 uint16_t flag;
222#define LPFC_DEFERRED_RING_EVENT 0x001
223#define LPFC_CALL_RING_AVAILABLE 0x002
224#define LPFC_STOP_IOCB_EVENT 0x020
225 uint16_t abtsiotag;
226
227 uint8_t rsvd;
228 uint8_t ringno;
229
230 spinlock_t ring_lock;
231
232 uint32_t fast_iotag;
233 uint32_t iotag_ctr;
234 uint32_t iotag_max;
235 struct list_head txq;
236 uint16_t txq_cnt;
237 uint16_t txq_max;
238 struct list_head txcmplq;
239 uint16_t txcmplq_cnt;
240 uint16_t txcmplq_max;
241 uint32_t missbufcnt;
242 struct list_head postbufq;
243 uint16_t postbufq_cnt;
244 uint16_t postbufq_max;
245 struct list_head iocb_continueq;
246 uint16_t iocb_continueq_cnt;
247 uint16_t iocb_continueq_max;
248 struct list_head iocb_continue_saveq;
249
250 struct lpfc_sli_ring_mask prt[LPFC_MAX_RING_MASK];
251 uint32_t num_mask;
252 void (*lpfc_sli_rcv_async_status) (struct lpfc_hba *,
253 struct lpfc_sli_ring *, struct lpfc_iocbq *);
254
255 struct lpfc_sli_ring_stat stats;
256
257
258 void (*lpfc_sli_cmd_available) (struct lpfc_hba *,
259 struct lpfc_sli_ring *);
260 union {
261 struct lpfc_sli3_ring sli3;
262 struct lpfc_sli4_ring sli4;
263 } sli;
264};
265
266
267struct lpfc_hbq_init {
268 uint32_t rn;
269 uint32_t entry_count;
270 uint32_t headerLen;
271 uint32_t logEntry;
272 uint32_t profile;
273 uint32_t ring_mask;
274
275 uint32_t hbq_index;
276
277 uint32_t seqlenoff;
278 uint32_t maxlen;
279 uint32_t seqlenbcnt;
280 uint32_t cmdcodeoff;
281 uint32_t cmdmatch[8];
282 uint32_t mask_count;
283 struct hbq_mask hbqMasks[6];
284
285
286 uint32_t buffer_count;
287 uint32_t init_count;
288 uint32_t add_count;
289} ;
290
291
292struct lpfc_sli_stat {
293 uint64_t mbox_stat_err;
294 uint64_t mbox_cmd;
295 uint64_t sli_intr;
296 uint64_t sli_prev_intr;
297 uint64_t sli_ips;
298 uint32_t err_attn_event;
299 uint32_t link_event;
300 uint32_t mbox_event;
301 uint32_t mbox_busy;
302};
303
304
305struct lpfc_lnk_stat {
306 uint32_t link_failure_count;
307 uint32_t loss_of_sync_count;
308 uint32_t loss_of_signal_count;
309 uint32_t prim_seq_protocol_err_count;
310 uint32_t invalid_tx_word_count;
311 uint32_t invalid_crc_count;
312 uint32_t error_frames;
313 uint32_t link_events;
314};
315
316
317struct lpfc_sli {
318 uint32_t num_rings;
319 uint32_t sli_flag;
320
321
322#define LPFC_SLI_MBOX_ACTIVE 0x100
323#define LPFC_SLI_ACTIVE 0x200
324#define LPFC_PROCESS_LA 0x400
325#define LPFC_BLOCK_MGMT_IO 0x800
326#define LPFC_MENLO_MAINT 0x1000
327#define LPFC_SLI_ASYNC_MBX_BLK 0x2000
328#define LPFC_SLI_SUPPRESS_RSP 0x4000
329#define LPFC_SLI_USE_EQDR 0x8000
330#define LPFC_QUEUE_FREE_INIT 0x10000
331#define LPFC_QUEUE_FREE_WAIT 0x20000
332
333
334
335 struct lpfc_sli_ring *sli3_ring;
336
337 struct lpfc_sli_stat slistat;
338 struct list_head mboxq;
339 uint16_t mboxq_cnt;
340 uint16_t mboxq_max;
341 LPFC_MBOXQ_t *mbox_active;
342 struct list_head mboxq_cmpl;
343
344 struct timer_list mbox_tmo;
345
346
347#define LPFC_IOCBQ_LOOKUP_INCREMENT 1024
348 struct lpfc_iocbq ** iocbq_lookup;
349 size_t iocbq_lookup_len;
350 uint16_t last_iotag;
351 time64_t stats_start;
352 struct lpfc_lnk_stat lnk_stat_offsets;
353};
354
355
356#define LPFC_MBOX_TMO 30
357
358#define LPFC_MBOX_SLI4_CONFIG_TMO 60
359
360#define LPFC_MBOX_SLI4_CONFIG_EXTENDED_TMO 300
361
362#define LPFC_MBOX_TMO_FLASH_CMD 300
363
364struct lpfc_io_buf {
365
366 struct list_head list;
367 void *data;
368
369 dma_addr_t dma_handle;
370 dma_addr_t dma_phys_sgl;
371
372 struct sli4_sge *dma_sgl;
373
374
375 struct list_head dma_sgl_xtra_list;
376
377
378 struct list_head dma_cmd_rsp_list;
379
380 struct lpfc_iocbq cur_iocbq;
381 struct lpfc_sli4_hdw_queue *hdwq;
382 uint16_t hdwq_no;
383 uint16_t cpu;
384
385 struct lpfc_nodelist *ndlp;
386 uint32_t timeout;
387 uint16_t flags;
388#define LPFC_SBUF_XBUSY 0x1
389#define LPFC_SBUF_BUMP_QDEPTH 0x2
390
391#define LPFC_SBUF_NORMAL_DIF 0x4
392#define LPFC_SBUF_PASS_DIF 0x8
393#define LPFC_SBUF_NOT_POSTED 0x10
394 uint16_t status;
395 uint32_t result;
396
397 uint32_t seg_cnt;
398
399
400
401 unsigned long start_time;
402 spinlock_t buf_lock;
403 bool expedite;
404
405 union {
406
407 struct {
408 struct scsi_cmnd *pCmd;
409 struct lpfc_rport_data *rdata;
410 uint32_t prot_seg_cnt;
411
412
413
414
415
416
417
418
419
420 struct fcp_cmnd *fcp_cmnd;
421 struct fcp_rsp *fcp_rsp;
422
423 wait_queue_head_t *waitq;
424
425#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
426
427
428
429 void *prot_data_segment;
430 uint32_t prot_data;
431 uint32_t prot_data_type;
432#define LPFC_INJERR_REFTAG 1
433#define LPFC_INJERR_APPTAG 2
434#define LPFC_INJERR_GUARD 3
435#endif
436 };
437
438
439 struct {
440 struct nvmefc_fcp_req *nvmeCmd;
441 uint16_t qidx;
442 };
443 };
444#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
445 uint64_t ts_cmd_start;
446 uint64_t ts_last_cmd;
447 uint64_t ts_cmd_wqput;
448 uint64_t ts_isr_cmpl;
449 uint64_t ts_data_io;
450#endif
451};
452