Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
drivers
scsi
lpfc
lpfc.h
Go to the documentation of this file.
1
/*******************************************************************
2
* This file is part of the Emulex Linux Device Driver for *
3
* Fibre Channel Host Bus Adapters. *
4
* Copyright (C) 2004-2012 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
22
#include <
scsi/scsi_host.h
>
23
24
#if defined(CONFIG_DEBUG_FS) && !defined(CONFIG_SCSI_LPFC_DEBUG_FS)
25
#define CONFIG_SCSI_LPFC_DEBUG_FS
26
#endif
27
28
struct
lpfc_sli2_slim
;
29
30
#define ELX_MODEL_NAME_SIZE 80
31
32
#define LPFC_PCI_DEV_LP 0x1
33
#define LPFC_PCI_DEV_OC 0x2
34
35
#define LPFC_SLI_REV2 2
36
#define LPFC_SLI_REV3 3
37
#define LPFC_SLI_REV4 4
38
39
#define LPFC_MAX_TARGET 4096
/* max number of targets supported */
40
#define LPFC_MAX_DISC_THREADS 64
/* max outstanding discovery els
41
requests */
42
#define LPFC_MAX_NS_RETRY 3
/* Number of retry attempts to contact
43
the NameServer before giving up. */
44
#define LPFC_CMD_PER_LUN 3
/* max outstanding cmds per lun */
45
#define LPFC_DEFAULT_SG_SEG_CNT 64
/* sg element count per scsi cmnd */
46
#define LPFC_DEFAULT_MENLO_SG_SEG_CNT 128
/* sg element count per scsi
47
cmnd for menlo needs nearly twice as for firmware
48
downloads using bsg */
49
#define LPFC_DEFAULT_PROT_SG_SEG_CNT 4096
/* sg protection elements count */
50
#define LPFC_MAX_SG_SEG_CNT 4096
/* sg element count per scsi cmnd */
51
#define LPFC_MAX_SGE_SIZE 0x80000000
/* Maximum data allowed in a SGE */
52
#define LPFC_MAX_PROT_SG_SEG_CNT 4096
/* prot sg element count per scsi cmd*/
53
#define LPFC_IOCB_LIST_CNT 2250
/* list of IOCBs for fast-path usage. */
54
#define LPFC_Q_RAMP_UP_INTERVAL 120
/* lun q_depth ramp up interval */
55
#define LPFC_VNAME_LEN 100
/* vport symbolic name length */
56
#define LPFC_TGTQ_INTERVAL 40000
/* Min amount of time between tgt
57
queue depth change in millisecs */
58
#define LPFC_TGTQ_RAMPUP_PCENT 5
/* Target queue rampup in percentage */
59
#define LPFC_MIN_TGT_QDEPTH 10
60
#define LPFC_MAX_TGT_QDEPTH 0xFFFF
61
62
#define LPFC_MAX_BUCKET_COUNT 20
/* Maximum no. of buckets for stat data
63
collection. */
64
/*
65
* Following time intervals are used of adjusting SCSI device
66
* queue depths when there are driver resource error or Firmware
67
* resource error.
68
*/
69
#define QUEUE_RAMP_DOWN_INTERVAL (1 * HZ)
/* 1 Second */
70
#define QUEUE_RAMP_UP_INTERVAL (300 * HZ)
/* 5 minutes */
71
72
/* Number of exchanges reserved for discovery to complete */
73
#define LPFC_DISC_IOCB_BUFF_COUNT 20
74
75
#define LPFC_HB_MBOX_INTERVAL 5
/* Heart beat interval in seconds. */
76
#define LPFC_HB_MBOX_TIMEOUT 30
/* Heart beat timeout in seconds. */
77
78
#define LPFC_LOOK_AHEAD_OFF 0
/* Look ahead logic is turned off */
79
80
/* Error Attention event polling interval */
81
#define LPFC_ERATT_POLL_INTERVAL 5
/* EATT poll interval in seconds */
82
83
/* Define macros for 64 bit support */
84
#define putPaddrLow(addr) ((uint32_t) (0xffffffff & (u64)(addr)))
85
#define putPaddrHigh(addr) ((uint32_t) (0xffffffff & (((u64)(addr))>>32)))
86
#define getPaddr(high, low) ((dma_addr_t)( \
87
(( (u64)(high)<<16 ) << 16)|( (u64)(low))))
88
/* Provide maximum configuration definitions. */
89
#define LPFC_DRVR_TIMEOUT 16
/* driver iocb timeout value in sec */
90
#define FC_MAX_ADPTMSG 64
91
92
#define MAX_HBAEVT 32
93
94
/* Number of MSI-X vectors the driver uses */
95
#define LPFC_MSIX_VECTORS 2
96
97
/* lpfc wait event data ready flag */
98
#define LPFC_DATA_READY (1<<0)
99
100
/* queue dump line buffer size */
101
#define LPFC_LBUF_SZ 128
102
103
/* mailbox system shutdown options */
104
#define LPFC_MBX_NO_WAIT 0
105
#define LPFC_MBX_WAIT 1
106
107
enum
lpfc_polling_flags
{
108
ENABLE_FCP_RING_POLLING
= 0x1,
109
DISABLE_FCP_RING_INT
= 0x2
110
};
111
112
/* Provide DMA memory definitions the driver uses per port instance. */
113
struct
lpfc_dmabuf
{
114
struct
list_head
list
;
115
void
*
virt
;
/* virtual address ptr */
116
dma_addr_t
phys
;
/* mapped address */
117
uint32_t
buffer_tag
;
/* used for tagged queue ring */
118
};
119
120
struct
lpfc_dma_pool
{
121
struct
lpfc_dmabuf
*
elements
;
122
uint32_t
max_count
;
123
uint32_t
current_count
;
124
};
125
126
struct
hbq_dmabuf
{
127
struct
lpfc_dmabuf
hbuf;
128
struct
lpfc_dmabuf
dbuf;
129
uint32_t
size
;
130
uint32_t
tag
;
131
struct
lpfc_cq_event
cq_event
;
132
unsigned
long
time_stamp
;
133
};
134
135
/* Priority bit. Set value to exceed low water mark in lpfc_mem. */
136
#define MEM_PRI 0x100
137
138
139
/****************************************************************************/
140
/* Device VPD save area */
141
/****************************************************************************/
142
typedef
struct
lpfc_vpd
{
143
uint32_t
status
;
/* vpd status value */
144
uint32_t
length
;
/* number of bytes actually returned */
145
struct
{
146
uint32_t
rsvd1
;
/* Revision numbers */
147
uint32_t
biuRev
;
148
uint32_t
smRev
;
149
uint32_t
smFwRev
;
150
uint32_t
endecRev
;
151
uint16_t
rBit
;
152
uint8_t
fcphHigh
;
153
uint8_t
fcphLow
;
154
uint8_t
feaLevelHigh
;
155
uint8_t
feaLevelLow
;
156
uint32_t
postKernRev
;
157
uint32_t
opFwRev
;
158
uint8_t
opFwName
[16];
159
uint32_t
sli1FwRev
;
160
uint8_t
sli1FwName
[16];
161
uint32_t
sli2FwRev
;
162
uint8_t
sli2FwName
[16];
163
}
rev
;
164
struct
{
165
#ifdef __BIG_ENDIAN_BITFIELD
166
uint32_t
rsvd3
:19;
/* Reserved */
167
uint32_t
cdss
: 1;
/* Configure Data Security SLI */
168
uint32_t
rsvd2
: 3;
/* Reserved */
169
uint32_t
cbg
: 1;
/* Configure BlockGuard */
170
uint32_t
cmv
: 1;
/* Configure Max VPIs */
171
uint32_t
ccrp
: 1;
/* Config Command Ring Polling */
172
uint32_t
csah
: 1;
/* Configure Synchronous Abort Handling */
173
uint32_t
chbs
: 1;
/* Cofigure Host Backing store */
174
uint32_t
cinb
: 1;
/* Enable Interrupt Notification Block */
175
uint32_t
cerbm
: 1;
/* Configure Enhanced Receive Buf Mgmt */
176
uint32_t
cmx
: 1;
/* Configure Max XRIs */
177
uint32_t
cmr
: 1;
/* Configure Max RPIs */
178
#else
/* __LITTLE_ENDIAN */
179
uint32_t
cmr
: 1;
/* Configure Max RPIs */
180
uint32_t
cmx
: 1;
/* Configure Max XRIs */
181
uint32_t
cerbm
: 1;
/* Configure Enhanced Receive Buf Mgmt */
182
uint32_t
cinb
: 1;
/* Enable Interrupt Notification Block */
183
uint32_t
chbs
: 1;
/* Cofigure Host Backing store */
184
uint32_t
csah
: 1;
/* Configure Synchronous Abort Handling */
185
uint32_t
ccrp
: 1;
/* Config Command Ring Polling */
186
uint32_t
cmv
: 1;
/* Configure Max VPIs */
187
uint32_t
cbg
: 1;
/* Configure BlockGuard */
188
uint32_t
rsvd2
: 3;
/* Reserved */
189
uint32_t
cdss
: 1;
/* Configure Data Security SLI */
190
uint32_t
rsvd3
:19;
/* Reserved */
191
#endif
192
}
sli3Feat
;
193
}
lpfc_vpd_t
;
194
195
struct
lpfc_scsi_buf
;
196
197
198
/*
199
* lpfc stat counters
200
*/
201
struct
lpfc_stats
{
202
/* Statistics for ELS commands */
203
uint32_t
elsLogiCol
;
204
uint32_t
elsRetryExceeded
;
205
uint32_t
elsXmitRetry
;
206
uint32_t
elsDelayRetry
;
207
uint32_t
elsRcvDrop
;
208
uint32_t
elsRcvFrame
;
209
uint32_t
elsRcvRSCN
;
210
uint32_t
elsRcvRNID
;
211
uint32_t
elsRcvFARP
;
212
uint32_t
elsRcvFARPR
;
213
uint32_t
elsRcvFLOGI
;
214
uint32_t
elsRcvPLOGI
;
215
uint32_t
elsRcvADISC
;
216
uint32_t
elsRcvPDISC
;
217
uint32_t
elsRcvFAN
;
218
uint32_t
elsRcvLOGO
;
219
uint32_t
elsRcvPRLO
;
220
uint32_t
elsRcvPRLI
;
221
uint32_t
elsRcvLIRR
;
222
uint32_t
elsRcvRLS
;
223
uint32_t
elsRcvRPS
;
224
uint32_t
elsRcvRPL
;
225
uint32_t
elsRcvRRQ
;
226
uint32_t
elsRcvRTV
;
227
uint32_t
elsRcvECHO
;
228
uint32_t
elsXmitFLOGI
;
229
uint32_t
elsXmitFDISC
;
230
uint32_t
elsXmitPLOGI
;
231
uint32_t
elsXmitPRLI
;
232
uint32_t
elsXmitADISC
;
233
uint32_t
elsXmitLOGO
;
234
uint32_t
elsXmitSCR
;
235
uint32_t
elsXmitRNID
;
236
uint32_t
elsXmitFARP
;
237
uint32_t
elsXmitFARPR
;
238
uint32_t
elsXmitACC
;
239
uint32_t
elsXmitLSRJT
;
240
241
uint32_t
frameRcvBcast
;
242
uint32_t
frameRcvMulti
;
243
uint32_t
strayXmitCmpl
;
244
uint32_t
frameXmitDelay
;
245
uint32_t
xriCmdCmpl
;
246
uint32_t
xriStatErr
;
247
uint32_t
LinkUp
;
248
uint32_t
LinkDown
;
249
uint32_t
LinkMultiEvent
;
250
uint32_t
NoRcvBuf
;
251
uint32_t
fcpCmd
;
252
uint32_t
fcpCmpl
;
253
uint32_t
fcpRspErr
;
254
uint32_t
fcpRemoteStop
;
255
uint32_t
fcpPortRjt
;
256
uint32_t
fcpPortBusy
;
257
uint32_t
fcpError
;
258
uint32_t
fcpLocalErr
;
259
};
260
261
struct
lpfc_hba
;
262
263
264
enum
discovery_state
{
265
LPFC_VPORT_UNKNOWN
= 0,
/* vport state is unknown */
266
LPFC_VPORT_FAILED
= 1,
/* vport has failed */
267
LPFC_LOCAL_CFG_LINK
= 6,
/* local NPORT Id configured */
268
LPFC_FLOGI
= 7,
/* FLOGI sent to Fabric */
269
LPFC_FDISC
= 8,
/* FDISC sent for vport */
270
LPFC_FABRIC_CFG_LINK
= 9,
/* Fabric assigned NPORT Id
271
* configured */
272
LPFC_NS_REG
= 10,
/* Register with NameServer */
273
LPFC_NS_QRY
= 11,
/* Query NameServer for NPort ID list */
274
LPFC_BUILD_DISC_LIST
= 12,
/* Build ADISC and PLOGI lists for
275
* device authentication / discovery */
276
LPFC_DISC_AUTH
= 13,
/* Processing ADISC list */
277
LPFC_VPORT_READY
= 32,
278
};
279
280
enum
hba_state
{
281
LPFC_LINK_UNKNOWN
= 0,
/* HBA state is unknown */
282
LPFC_WARM_START
= 1,
/* HBA state after selective reset */
283
LPFC_INIT_START
= 2,
/* Initial state after board reset */
284
LPFC_INIT_MBX_CMDS
= 3,
/* Initialize HBA with mbox commands */
285
LPFC_LINK_DOWN
= 4,
/* HBA initialized, link is down */
286
LPFC_LINK_UP
= 5,
/* Link is up - issue READ_LA */
287
LPFC_CLEAR_LA
= 6,
/* authentication cmplt - issue
288
* CLEAR_LA */
289
LPFC_HBA_READY
= 32,
290
LPFC_HBA_ERROR
= -1
291
};
292
293
struct
lpfc_vport
{
294
struct
lpfc_hba
*
phba
;
295
struct
list_head
listentry
;
296
uint8_t
port_type
;
297
#define LPFC_PHYSICAL_PORT 1
298
#define LPFC_NPIV_PORT 2
299
#define LPFC_FABRIC_PORT 3
300
enum
discovery_state
port_state
;
301
302
uint16_t
vpi
;
303
uint16_t
vfi
;
304
uint8_t
vpi_state
;
305
#define LPFC_VPI_REGISTERED 0x1
306
307
uint32_t
fc_flag
;
/* FC flags */
308
/* Several of these flags are HBA centric and should be moved to
309
* phba->link_flag (e.g. FC_PTP, FC_PUBLIC_LOOP)
310
*/
311
#define FC_PT2PT 0x1
/* pt2pt with no fabric */
312
#define FC_PT2PT_PLOGI 0x2
/* pt2pt initiate PLOGI */
313
#define FC_DISC_TMO 0x4
/* Discovery timer running */
314
#define FC_PUBLIC_LOOP 0x8
/* Public loop */
315
#define FC_LBIT 0x10
/* LOGIN bit in loopinit set */
316
#define FC_RSCN_MODE 0x20
/* RSCN cmd rcv'ed */
317
#define FC_NLP_MORE 0x40
/* More node to process in node tbl */
318
#define FC_OFFLINE_MODE 0x80
/* Interface is offline for diag */
319
#define FC_FABRIC 0x100
/* We are fabric attached */
320
#define FC_VPORT_LOGO_RCVD 0x200
/* LOGO received on vport */
321
#define FC_RSCN_DISCOVERY 0x400
/* Auth all devices after RSCN */
322
#define FC_LOGO_RCVD_DID_CHNG 0x800
/* FDISC on phys port detect DID chng*/
323
#define FC_SCSI_SCAN_TMO 0x4000
/* scsi scan timer running */
324
#define FC_ABORT_DISCOVERY 0x8000
/* we want to abort discovery */
325
#define FC_NDISC_ACTIVE 0x10000
/* NPort discovery active */
326
#define FC_BYPASSED_MODE 0x20000
/* NPort is in bypassed mode */
327
#define FC_VPORT_NEEDS_REG_VPI 0x80000
/* Needs to have its vpi registered */
328
#define FC_RSCN_DEFERRED 0x100000
/* A deferred RSCN being processed */
329
#define FC_VPORT_NEEDS_INIT_VPI 0x200000
/* Need to INIT_VPI before FDISC */
330
#define FC_VPORT_CVL_RCVD 0x400000
/* VLink failed due to CVL */
331
#define FC_VFI_REGISTERED 0x800000
/* VFI is registered */
332
#define FC_FDISC_COMPLETED 0x1000000
/* FDISC completed */
333
#define FC_DISC_DELAYED 0x2000000
/* Delay NPort discovery */
334
335
uint32_t
ct_flags
;
336
#define FC_CT_RFF_ID 0x1
/* RFF_ID accepted by switch */
337
#define FC_CT_RNN_ID 0x2
/* RNN_ID accepted by switch */
338
#define FC_CT_RSNN_NN 0x4
/* RSNN_NN accepted by switch */
339
#define FC_CT_RSPN_ID 0x8
/* RSPN_ID accepted by switch */
340
#define FC_CT_RFT_ID 0x10
/* RFT_ID accepted by switch */
341
342
struct
list_head
fc_nodes
;
343
344
/* Keep counters for the number of entries in each list. */
345
uint16_t
fc_plogi_cnt
;
346
uint16_t
fc_adisc_cnt
;
347
uint16_t
fc_reglogin_cnt
;
348
uint16_t
fc_prli_cnt
;
349
uint16_t
fc_unmap_cnt
;
350
uint16_t
fc_map_cnt
;
351
uint16_t
fc_npr_cnt
;
352
uint16_t
fc_unused_cnt
;
353
struct
serv_parm
fc_sparam
;
/* buffer for our service parameters */
354
355
uint32_t
fc_myDID
;
/* fibre channel S_ID */
356
uint32_t
fc_prevDID
;
/* previous fibre channel S_ID */
357
struct
lpfc_name
fabric_portname
;
358
struct
lpfc_name
fabric_nodename
;
359
360
int32_t
stopped
;
/* HBA has not been restarted since last ERATT */
361
uint8_t
fc_linkspeed
;
/* Link speed after last READ_LA */
362
363
uint32_t
num_disc_nodes
;
/*in addition to hba_state */
364
365
uint32_t
fc_nlp_cnt
;
/* outstanding NODELIST requests */
366
uint32_t
fc_rscn_id_cnt
;
/* count of RSCNs payloads in list */
367
uint32_t
fc_rscn_flush
;
/* flag use of fc_rscn_id_list */
368
struct
lpfc_dmabuf
*
fc_rscn_id_list
[
FC_MAX_HOLD_RSCN
];
369
struct
lpfc_name
fc_nodename
;
/* fc nodename */
370
struct
lpfc_name
fc_portname
;
/* fc portname */
371
372
struct
lpfc_work_evt
disc_timeout_evt
;
373
374
struct
timer_list
fc_disctmo
;
/* Discovery rescue timer */
375
uint8_t
fc_ns_retry
;
/* retries for fabric nameserver */
376
uint32_t
fc_prli_sent
;
/* cntr for outstanding PRLIs */
377
378
spinlock_t
work_port_lock
;
379
uint32_t
work_port_events
;
/* Timeout to be handled */
380
#define WORKER_DISC_TMO 0x1
/* vport: Discovery timeout */
381
#define WORKER_ELS_TMO 0x2
/* vport: ELS timeout */
382
#define WORKER_FDMI_TMO 0x4
/* vport: FDMI timeout */
383
#define WORKER_DELAYED_DISC_TMO 0x8
/* vport: delayed discovery */
384
385
#define WORKER_MBOX_TMO 0x100
/* hba: MBOX timeout */
386
#define WORKER_HB_TMO 0x200
/* hba: Heart beat timeout */
387
#define WORKER_FABRIC_BLOCK_TMO 0x400
/* hba: fabric block timeout */
388
#define WORKER_RAMP_DOWN_QUEUE 0x800
/* hba: Decrease Q depth */
389
#define WORKER_RAMP_UP_QUEUE 0x1000
/* hba: Increase Q depth */
390
#define WORKER_SERVICE_TXQ 0x2000
/* hba: IOCBs on the txq */
391
392
struct
timer_list
fc_fdmitmo
;
393
struct
timer_list
els_tmofunc
;
394
struct
timer_list
delayed_disc_tmo
;
395
396
int
unreg_vpi_cmpl
;
397
398
uint8_t
load_flag
;
399
#define FC_LOADING 0x1
/* HBA in process of loading drvr */
400
#define FC_UNLOADING 0x2
/* HBA in process of unloading drvr */
401
/* Vport Config Parameters */
402
uint32_t
cfg_scan_down
;
403
uint32_t
cfg_lun_queue_depth
;
404
uint32_t
cfg_nodev_tmo
;
405
uint32_t
cfg_devloss_tmo
;
406
uint32_t
cfg_restrict_login
;
407
uint32_t
cfg_peer_port_login
;
408
uint32_t
cfg_fcp_class
;
409
uint32_t
cfg_use_adisc
;
410
uint32_t
cfg_fdmi_on
;
411
uint32_t
cfg_discovery_threads
;
412
uint32_t
cfg_log_verbose
;
413
uint32_t
cfg_max_luns
;
414
uint32_t
cfg_enable_da_id
;
415
uint32_t
cfg_max_scsicmpl_time
;
416
uint32_t
cfg_tgt_queue_depth
;
417
418
uint32_t
dev_loss_tmo_changed
;
419
420
struct
fc_vport
*
fc_vport
;
421
422
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
423
struct
dentry
*debug_disc_trc;
424
struct
dentry
*debug_nodelist;
425
struct
dentry
*vport_debugfs_root;
426
struct
lpfc_debugfs_trc *disc_trc;
427
atomic_t
disc_trc_cnt;
428
#endif
429
uint8_t
stat_data_enabled
;
430
uint8_t
stat_data_blocked
;
431
struct
list_head
rcv_buffer_list
;
432
unsigned
long
rcv_buffer_time_stamp
;
433
uint32_t
vport_flag
;
434
#define STATIC_VPORT 1
435
};
436
437
struct
hbq_s
{
438
uint16_t
entry_count
;
/* Current number of HBQ slots */
439
uint16_t
buffer_count
;
/* Current number of buffers posted */
440
uint32_t
next_hbqPutIdx
;
/* Index to next HBQ slot to use */
441
uint32_t
hbqPutIdx
;
/* HBQ slot to use */
442
uint32_t
local_hbqGetIdx
;
/* Local copy of Get index from Port */
443
void
*
hbq_virt
;
/* Virtual ptr to this hbq */
444
struct
list_head
hbq_buffer_list
;
/* buffers assigned to this HBQ */
445
/* Callback for HBQ buffer allocation */
446
struct
hbq_dmabuf
*(*hbq_alloc_buffer) (
struct
lpfc_hba
*);
447
/* Callback for HBQ buffer free */
448
void
(*
hbq_free_buffer
) (
struct
lpfc_hba
*,
449
struct
hbq_dmabuf
*);
450
};
451
452
#define LPFC_MAX_HBQS 4
453
/* this matches the position in the lpfc_hbq_defs array */
454
#define LPFC_ELS_HBQ 0
455
#define LPFC_EXTRA_HBQ 1
456
457
enum
hba_temp_state
{
458
HBA_NORMAL_TEMP
,
459
HBA_OVER_TEMP
460
};
461
462
enum
intr_type_t
{
463
NONE
= 0,
464
INTx
,
465
MSI
,
466
MSIX
,
467
};
468
469
struct
unsol_rcv_ct_ctx
{
470
uint32_t
ctxt_id
;
471
uint32_t
SID
;
472
uint32_t
flags
;
473
#define UNSOL_VALID 0x00000001
474
uint16_t
oxid
;
475
uint16_t
rxid
;
476
};
477
478
#define LPFC_USER_LINK_SPEED_AUTO 0
/* auto select (default)*/
479
#define LPFC_USER_LINK_SPEED_1G 1
/* 1 Gigabaud */
480
#define LPFC_USER_LINK_SPEED_2G 2
/* 2 Gigabaud */
481
#define LPFC_USER_LINK_SPEED_4G 4
/* 4 Gigabaud */
482
#define LPFC_USER_LINK_SPEED_8G 8
/* 8 Gigabaud */
483
#define LPFC_USER_LINK_SPEED_10G 10
/* 10 Gigabaud */
484
#define LPFC_USER_LINK_SPEED_16G 16
/* 16 Gigabaud */
485
#define LPFC_USER_LINK_SPEED_MAX LPFC_USER_LINK_SPEED_16G
486
#define LPFC_USER_LINK_SPEED_BITMAP ((1 << LPFC_USER_LINK_SPEED_16G) | \
487
(1 << LPFC_USER_LINK_SPEED_10G) | \
488
(1 << LPFC_USER_LINK_SPEED_8G) | \
489
(1 << LPFC_USER_LINK_SPEED_4G) | \
490
(1 << LPFC_USER_LINK_SPEED_2G) | \
491
(1 << LPFC_USER_LINK_SPEED_1G) | \
492
(1 << LPFC_USER_LINK_SPEED_AUTO))
493
#define LPFC_LINK_SPEED_STRING "0, 1, 2, 4, 8, 10, 16"
494
495
enum
nemb_type
{
496
nemb_mse
= 1,
497
nemb_hbd
498
};
499
500
enum
mbox_type
{
501
mbox_rd
= 1,
502
mbox_wr
503
};
504
505
enum
dma_type
{
506
dma_mbox
= 1,
507
dma_ebuf
508
};
509
510
enum
sta_type
{
511
sta_pre_addr
= 1,
512
sta_pos_addr
513
};
514
515
struct
lpfc_mbox_ext_buf_ctx
{
516
uint32_t
state
;
517
#define LPFC_BSG_MBOX_IDLE 0
518
#define LPFC_BSG_MBOX_HOST 1
519
#define LPFC_BSG_MBOX_PORT 2
520
#define LPFC_BSG_MBOX_DONE 3
521
#define LPFC_BSG_MBOX_ABTS 4
522
enum
nemb_type
nembType
;
523
enum
mbox_type
mboxType
;
524
uint32_t
numBuf
;
525
uint32_t
mbxTag
;
526
uint32_t
seqNum
;
527
struct
lpfc_dmabuf
*
mbx_dmabuf
;
528
struct
list_head
ext_dmabuf_list
;
529
};
530
531
struct
lpfc_hba
{
532
/* SCSI interface function jump table entries */
533
int
(*
lpfc_new_scsi_buf
)
534
(
struct
lpfc_vport
*,
int
);
535
struct
lpfc_scsi_buf
* (*lpfc_get_scsi_buf)
536
(
struct
lpfc_hba
*,
struct
lpfc_nodelist
*);
537
int
(*
lpfc_scsi_prep_dma_buf
)
538
(
struct
lpfc_hba
*,
struct
lpfc_scsi_buf
*);
539
void
(*
lpfc_scsi_unprep_dma_buf
)
540
(
struct
lpfc_hba
*,
struct
lpfc_scsi_buf
*);
541
void
(*
lpfc_release_scsi_buf
)
542
(
struct
lpfc_hba
*,
struct
lpfc_scsi_buf
*);
543
void
(*
lpfc_rampdown_queue_depth
)
544
(
struct
lpfc_hba
*);
545
void
(*
lpfc_scsi_prep_cmnd
)
546
(
struct
lpfc_vport
*,
struct
lpfc_scsi_buf
*,
547
struct
lpfc_nodelist
*);
548
549
/* IOCB interface function jump table entries */
550
int
(*
__lpfc_sli_issue_iocb
)
551
(
struct
lpfc_hba
*,
uint32_t
,
552
struct
lpfc_iocbq
*,
uint32_t
);
553
void
(*
__lpfc_sli_release_iocbq
)(
struct
lpfc_hba
*,
554
struct
lpfc_iocbq
*);
555
int
(*
lpfc_hba_down_post
)(
struct
lpfc_hba
*phba);
556
IOCB_t
* (*lpfc_get_iocb_from_iocbq)
557
(
struct
lpfc_iocbq
*);
558
void
(*
lpfc_scsi_cmd_iocb_cmpl
)
559
(
struct
lpfc_hba
*,
struct
lpfc_iocbq
*,
struct
lpfc_iocbq
*);
560
561
/* MBOX interface function jump table entries */
562
int
(*
lpfc_sli_issue_mbox
)
563
(
struct
lpfc_hba
*,
LPFC_MBOXQ_t
*,
uint32_t
);
564
565
/* Slow-path IOCB process function jump table entries */
566
void
(*
lpfc_sli_handle_slow_ring_event
)
567
(
struct
lpfc_hba
*phba,
struct
lpfc_sli_ring
*pring,
568
uint32_t
mask
);
569
570
/* INIT device interface function jump table entries */
571
int
(*
lpfc_sli_hbq_to_firmware
)
572
(
struct
lpfc_hba
*,
uint32_t
,
struct
hbq_dmabuf
*);
573
int
(*
lpfc_sli_brdrestart
)
574
(
struct
lpfc_hba
*);
575
int
(*
lpfc_sli_brdready
)
576
(
struct
lpfc_hba
*,
uint32_t
);
577
void
(*
lpfc_handle_eratt
)
578
(
struct
lpfc_hba
*);
579
void
(*
lpfc_stop_port
)
580
(
struct
lpfc_hba
*);
581
int
(*
lpfc_hba_init_link
)
582
(
struct
lpfc_hba
*,
uint32_t
);
583
int
(*
lpfc_hba_down_link
)
584
(
struct
lpfc_hba
*,
uint32_t
);
585
int
(*
lpfc_selective_reset
)
586
(
struct
lpfc_hba
*);
587
588
int
(*
lpfc_bg_scsi_prep_dma_buf
)
589
(
struct
lpfc_hba
*,
struct
lpfc_scsi_buf
*);
590
/* Add new entries here */
591
592
/* SLI4 specific HBA data structure */
593
struct
lpfc_sli4_hba
sli4_hba
;
594
595
struct
lpfc_sli
sli
;
596
uint8_t
pci_dev_grp
;
/* lpfc PCI dev group: 0x0, 0x1, 0x2,... */
597
uint32_t
sli_rev
;
/* SLI2, SLI3, or SLI4 */
598
uint32_t
sli3_options
;
/* Mask of enabled SLI3 options */
599
#define LPFC_SLI3_HBQ_ENABLED 0x01
600
#define LPFC_SLI3_NPIV_ENABLED 0x02
601
#define LPFC_SLI3_VPORT_TEARDOWN 0x04
602
#define LPFC_SLI3_CRP_ENABLED 0x08
603
#define LPFC_SLI3_BG_ENABLED 0x20
604
#define LPFC_SLI3_DSS_ENABLED 0x40
605
#define LPFC_SLI4_PERFH_ENABLED 0x80
606
#define LPFC_SLI4_PHWQ_ENABLED 0x100
607
uint32_t
iocb_cmd_size
;
608
uint32_t
iocb_rsp_size
;
609
610
enum
hba_state
link_state
;
611
uint32_t
link_flag
;
/* link state flags */
612
#define LS_LOOPBACK_MODE 0x1
/* NPort is in Loopback mode */
613
/* This flag is set while issuing */
614
/* INIT_LINK mailbox command */
615
#define LS_NPIV_FAB_SUPPORTED 0x2
/* Fabric supports NPIV */
616
#define LS_IGNORE_ERATT 0x4
/* intr handler should ignore ERATT */
617
618
uint32_t
hba_flag
;
/* hba generic flags */
619
#define HBA_ERATT_HANDLED 0x1
/* This flag is set when eratt handled */
620
#define DEFER_ERATT 0x2
/* Deferred error attention in progress */
621
#define HBA_FCOE_MODE 0x4
/* HBA function in FCoE Mode */
622
#define HBA_SP_QUEUE_EVT 0x8
/* Slow-path qevt posted to worker thread*/
623
#define HBA_POST_RECEIVE_BUFFER 0x10
/* Rcv buffers need to be posted */
624
#define FCP_XRI_ABORT_EVENT 0x20
625
#define ELS_XRI_ABORT_EVENT 0x40
626
#define ASYNC_EVENT 0x80
627
#define LINK_DISABLED 0x100
/* Link disabled by user */
628
#define FCF_TS_INPROG 0x200
/* FCF table scan in progress */
629
#define FCF_RR_INPROG 0x400
/* FCF roundrobin flogi in progress */
630
#define HBA_FIP_SUPPORT 0x800
/* FIP support in HBA */
631
#define HBA_AER_ENABLED 0x1000
/* AER enabled with HBA */
632
#define HBA_DEVLOSS_TMO 0x2000
/* HBA in devloss timeout */
633
#define HBA_RRQ_ACTIVE 0x4000
/* process the rrq active list */
634
#define HBA_FCP_IOQ_FLUSH 0x8000
/* FCP I/O queues being flushed */
635
uint32_t
fcp_ring_in_use
;
/* When polling test if intr-hndlr active*/
636
struct
lpfc_dmabuf
slim2p
;
637
638
MAILBOX_t
*
mbox
;
639
uint32_t
*
mbox_ext
;
640
struct
lpfc_mbox_ext_buf_ctx
mbox_ext_buf_ctx
;
641
uint32_t
ha_copy
;
642
struct
_PCB
*
pcb
;
643
struct
_IOCB
*
IOCBs
;
644
645
struct
lpfc_dmabuf
hbqslimp
;
646
647
uint16_t
pci_cfg_value
;
648
649
uint8_t
fc_linkspeed
;
/* Link speed after last READ_LA */
650
651
uint32_t
fc_eventTag
;
/* event tag for link attention */
652
uint32_t
link_events
;
653
654
/* These fields used to be binfo */
655
uint32_t
fc_pref_DID
;
/* preferred D_ID */
656
uint8_t
fc_pref_ALPA
;
/* preferred AL_PA */
657
uint32_t
fc_edtovResol
;
/* E_D_TOV timer resolution */
658
uint32_t
fc_edtov
;
/* E_D_TOV timer value */
659
uint32_t
fc_arbtov
;
/* ARB_TOV timer value */
660
uint32_t
fc_ratov
;
/* R_A_TOV timer value */
661
uint32_t
fc_rttov
;
/* R_T_TOV timer value */
662
uint32_t
fc_altov
;
/* AL_TOV timer value */
663
uint32_t
fc_crtov
;
/* C_R_TOV timer value */
664
uint32_t
fc_citov
;
/* C_I_TOV timer value */
665
666
struct
serv_parm
fc_fabparam
;
/* fabric service parameters buffer */
667
uint8_t
alpa_map
[128];
/* AL_PA map from READ_LA */
668
669
uint32_t
lmt
;
670
671
uint32_t
fc_topology
;
/* link topology, from LINK INIT */
672
673
struct
lpfc_stats
fc_stat
;
674
675
struct
lpfc_nodelist
fc_fcpnodev
;
/* nodelist entry for no device */
676
uint32_t
nport_event_cnt
;
/* timestamp for nlplist entry */
677
678
uint8_t
wwnn
[8];
679
uint8_t
wwpn
[8];
680
uint32_t
RandomData
[7];
681
682
/* HBA Config Parameters */
683
uint32_t
cfg_ack0
;
684
uint32_t
cfg_enable_npiv
;
685
uint32_t
cfg_enable_rrq
;
686
uint32_t
cfg_topology
;
687
uint32_t
cfg_link_speed
;
688
#define LPFC_FCF_FOV 1
/* Fast fcf failover */
689
#define LPFC_FCF_PRIORITY 2
/* Priority fcf failover */
690
uint32_t
cfg_fcf_failover_policy
;
691
uint32_t
cfg_fcp_io_sched
;
692
uint32_t
cfg_cr_delay
;
693
uint32_t
cfg_cr_count
;
694
uint32_t
cfg_multi_ring_support
;
695
uint32_t
cfg_multi_ring_rctl
;
696
uint32_t
cfg_multi_ring_type
;
697
uint32_t
cfg_poll
;
698
uint32_t
cfg_poll_tmo
;
699
uint32_t
cfg_use_msi
;
700
uint32_t
cfg_fcp_imax
;
701
uint32_t
cfg_fcp_wq_count
;
702
uint32_t
cfg_fcp_eq_count
;
703
uint32_t
cfg_fcp_io_channel
;
704
uint32_t
cfg_sg_seg_cnt
;
705
uint32_t
cfg_prot_sg_seg_cnt
;
706
uint32_t
cfg_sg_dma_buf_size
;
707
uint64_t
cfg_soft_wwnn
;
708
uint64_t
cfg_soft_wwpn
;
709
uint32_t
cfg_hba_queue_depth
;
710
uint32_t
cfg_enable_hba_reset
;
711
uint32_t
cfg_enable_hba_heartbeat
;
712
uint32_t
cfg_enable_bg
;
713
uint32_t
cfg_hostmem_hgp
;
714
uint32_t
cfg_log_verbose
;
715
uint32_t
cfg_aer_support
;
716
uint32_t
cfg_sriov_nr_virtfn
;
717
uint32_t
cfg_iocb_cnt
;
718
uint32_t
cfg_suppress_link_up
;
719
#define LPFC_INITIALIZE_LINK 0
/* do normal init_link mbox */
720
#define LPFC_DELAY_INIT_LINK 1
/* layered driver hold off */
721
#define LPFC_DELAY_INIT_LINK_INDEFINITELY 2
/* wait, manual intervention */
722
uint32_t
cfg_enable_dss
;
723
lpfc_vpd_t
vpd
;
/* vital product data */
724
725
struct
pci_dev
*
pcidev
;
726
struct
list_head
work_list
;
727
uint32_t
work_ha
;
/* Host Attention Bits for WT */
728
uint32_t
work_ha_mask
;
/* HA Bits owned by WT */
729
uint32_t
work_hs
;
/* HS stored in case of ERRAT */
730
uint32_t
work_status
[2];
/* Extra status from SLIM */
731
732
wait_queue_head_t
work_waitq
;
733
struct
task_struct
*
worker_thread
;
734
unsigned
long
data_flags
;
735
736
uint32_t
hbq_in_use
;
/* HBQs in use flag */
737
struct
list_head
rb_pend_list
;
/* Received buffers to be processed */
738
uint32_t
hbq_count
;
/* Count of configured HBQs */
739
struct
hbq_s
hbqs
[
LPFC_MAX_HBQS
];
/* local copy of hbq indicies */
740
741
atomic_t
fcp_qidx
;
/* next work queue to post work to */
742
743
unsigned
long
pci_bar0_map
;
/* Physical address for PCI BAR0 */
744
unsigned
long
pci_bar1_map
;
/* Physical address for PCI BAR1 */
745
unsigned
long
pci_bar2_map
;
/* Physical address for PCI BAR2 */
746
void
__iomem
*
slim_memmap_p
;
/* Kernel memory mapped address for
747
PCI BAR0 */
748
void
__iomem
*
ctrl_regs_memmap_p
;
/* Kernel memory mapped address for
749
PCI BAR2 */
750
751
void
__iomem
*
MBslimaddr
;
/* virtual address for mbox cmds */
752
void
__iomem
*
HAregaddr
;
/* virtual address for host attn reg */
753
void
__iomem
*
CAregaddr
;
/* virtual address for chip attn reg */
754
void
__iomem
*
HSregaddr
;
/* virtual address for host status
755
reg */
756
void
__iomem
*
HCregaddr
;
/* virtual address for host ctl reg */
757
758
struct
lpfc_hgp
__iomem
*
host_gp
;
/* Host side get/put pointers */
759
struct
lpfc_pgp
*
port_gp
;
760
uint32_t
__iomem
*
hbq_put
;
/* Address in SLIM to HBQ put ptrs */
761
uint32_t
*
hbq_get
;
/* Host mem address of HBQ get ptrs */
762
763
int
brd_no
;
/* FC board number */
764
char
SerialNumber
[32];
/* adapter Serial Number */
765
char
OptionROMVersion
[32];
/* adapter BIOS / Fcode version */
766
char
ModelDesc
[256];
/* Model Description */
767
char
ModelName
[80];
/* Model Name */
768
char
ProgramType
[256];
/* Program Type */
769
char
Port
[20];
/* Port No */
770
uint8_t
vpd_flag
;
/* VPD data flag */
771
772
#define VPD_MODEL_DESC 0x1
/* valid vpd model description */
773
#define VPD_MODEL_NAME 0x2
/* valid vpd model name */
774
#define VPD_PROGRAM_TYPE 0x4
/* valid vpd program type */
775
#define VPD_PORT 0x8
/* valid vpd port data */
776
#define VPD_MASK 0xf
/* mask for any vpd data */
777
778
uint8_t
soft_wwn_enable
;
779
780
struct
timer_list
fcp_poll_timer
;
781
struct
timer_list
eratt_poll
;
782
783
/*
784
* stat counters
785
*/
786
uint64_t
fc4InputRequests
;
787
uint64_t
fc4OutputRequests
;
788
uint64_t
fc4ControlRequests
;
789
uint64_t
bg_guard_err_cnt
;
790
uint64_t
bg_apptag_err_cnt
;
791
uint64_t
bg_reftag_err_cnt
;
792
793
/* fastpath list. */
794
spinlock_t
scsi_buf_list_lock
;
795
struct
list_head
lpfc_scsi_buf_list
;
796
uint32_t
total_scsi_bufs
;
797
struct
list_head
lpfc_iocb_list
;
798
uint32_t
total_iocbq_bufs
;
799
struct
list_head
active_rrq_list
;
800
spinlock_t
hbalock
;
801
802
/* pci_mem_pools */
803
struct
pci_pool *
lpfc_scsi_dma_buf_pool
;
804
struct
pci_pool *
lpfc_mbuf_pool
;
805
struct
pci_pool *
lpfc_hrb_pool
;
/* header receive buffer pool */
806
struct
pci_pool *
lpfc_drb_pool
;
/* data receive buffer pool */
807
struct
pci_pool *
lpfc_hbq_pool
;
/* SLI3 hbq buffer pool */
808
struct
lpfc_dma_pool
lpfc_mbuf_safety_pool
;
809
810
mempool_t
*
mbox_mem_pool
;
811
mempool_t
*
nlp_mem_pool
;
812
mempool_t
*
rrq_pool
;
813
814
struct
fc_host_statistics
link_stats
;
815
enum
intr_type_t
intr_type
;
816
uint32_t
intr_mode
;
817
#define LPFC_INTR_ERROR 0xFFFFFFFF
818
struct
msix_entry
msix_entries
[
LPFC_MSIX_VECTORS
];
819
820
struct
list_head
port_list
;
821
struct
lpfc_vport
*
pport
;
/* physical lpfc_vport pointer */
822
uint16_t
max_vpi
;
/* Maximum virtual nports */
823
#define LPFC_MAX_VPI 0xFFFF
/* Max number of VPI supported */
824
uint16_t
max_vports
;
/*
825
* For IOV HBAs max_vpi can change
826
* after a reset. max_vports is max
827
* number of vports present. This can
828
* be greater than max_vpi.
829
*/
830
uint16_t
vpi_base
;
831
uint16_t
vfi_base
;
832
unsigned
long
*
vpi_bmask
;
/* vpi allocation table */
833
uint16_t
*
vpi_ids
;
834
uint16_t
vpi_count
;
835
struct
list_head
lpfc_vpi_blk_list
;
836
837
/* Data structure used by fabric iocb scheduler */
838
struct
list_head
fabric_iocb_list
;
839
atomic_t
fabric_iocb_count
;
840
struct
timer_list
fabric_block_timer
;
841
unsigned
long
bit_flags
;
842
#define FABRIC_COMANDS_BLOCKED 0
843
atomic_t
num_rsrc_err
;
844
atomic_t
num_cmd_success
;
845
unsigned
long
last_rsrc_error_time
;
846
unsigned
long
last_ramp_down_time
;
847
unsigned
long
last_ramp_up_time
;
848
#ifdef CONFIG_SCSI_LPFC_DEBUG_FS
849
struct
dentry
*hba_debugfs_root;
850
atomic_t
debugfs_vport_count;
851
struct
dentry
*debug_hbqinfo;
852
struct
dentry
*debug_dumpHostSlim;
853
struct
dentry
*debug_dumpHBASlim;
854
struct
dentry
*debug_dumpData;
/* BlockGuard BPL */
855
struct
dentry
*debug_dumpDif;
/* BlockGuard BPL */
856
struct
dentry
*debug_InjErrLBA;
/* LBA to inject errors at */
857
struct
dentry
*debug_InjErrNPortID;
/* NPortID to inject errors at */
858
struct
dentry
*debug_InjErrWWPN;
/* WWPN to inject errors at */
859
struct
dentry
*debug_writeGuard;
/* inject write guard_tag errors */
860
struct
dentry
*debug_writeApp;
/* inject write app_tag errors */
861
struct
dentry
*debug_writeRef;
/* inject write ref_tag errors */
862
struct
dentry
*debug_readGuard;
/* inject read guard_tag errors */
863
struct
dentry
*debug_readApp;
/* inject read app_tag errors */
864
struct
dentry
*debug_readRef;
/* inject read ref_tag errors */
865
866
/* T10 DIF error injection */
867
uint32_t
lpfc_injerr_wgrd_cnt;
868
uint32_t
lpfc_injerr_wapp_cnt;
869
uint32_t
lpfc_injerr_wref_cnt;
870
uint32_t
lpfc_injerr_rgrd_cnt;
871
uint32_t
lpfc_injerr_rapp_cnt;
872
uint32_t
lpfc_injerr_rref_cnt;
873
uint32_t
lpfc_injerr_nportid;
874
struct
lpfc_name
lpfc_injerr_wwpn;
875
sector_t
lpfc_injerr_lba;
876
#define LPFC_INJERR_LBA_OFF (sector_t)(-1)
877
878
struct
dentry
*debug_slow_ring_trc;
879
struct
lpfc_debugfs_trc *slow_ring_trc;
880
atomic_t
slow_ring_trc_cnt;
881
/* iDiag debugfs sub-directory */
882
struct
dentry
*idiag_root;
883
struct
dentry
*idiag_pci_cfg;
884
struct
dentry
*idiag_bar_acc;
885
struct
dentry
*idiag_que_info;
886
struct
dentry
*idiag_que_acc;
887
struct
dentry
*idiag_drb_acc;
888
struct
dentry
*idiag_ctl_acc;
889
struct
dentry
*idiag_mbx_acc;
890
struct
dentry
*idiag_ext_acc;
891
#endif
892
893
/* Used for deferred freeing of ELS data buffers */
894
struct
list_head
elsbuf
;
895
int
elsbuf_cnt
;
896
int
elsbuf_prev_cnt
;
897
898
uint8_t
temp_sensor_support
;
899
/* Fields used for heart beat. */
900
unsigned
long
last_completion_time
;
901
unsigned
long
skipped_hb
;
902
struct
timer_list
hb_tmofunc
;
903
uint8_t
hb_outstanding
;
904
struct
timer_list
rrq_tmr
;
905
enum
hba_temp_state
over_temp_state
;
906
/* ndlp reference management */
907
spinlock_t
ndlp_lock
;
908
/*
909
* Following bit will be set for all buffer tags which are not
910
* associated with any HBQ.
911
*/
912
#define QUE_BUFTAG_BIT (1<<31)
913
uint32_t
buffer_tag_count
;
914
int
wait_4_mlo_maint_flg
;
915
wait_queue_head_t
wait_4_mlo_m_q
;
916
/* data structure used for latency data collection */
917
#define LPFC_NO_BUCKET 0
918
#define LPFC_LINEAR_BUCKET 1
919
#define LPFC_POWER2_BUCKET 2
920
uint8_t
bucket_type
;
921
uint32_t
bucket_base
;
922
uint32_t
bucket_step
;
923
924
/* Maximum number of events that can be outstanding at any time*/
925
#define LPFC_MAX_EVT_COUNT 512
926
atomic_t
fast_event_count
;
927
uint32_t
fcoe_eventtag
;
928
uint32_t
fcoe_eventtag_at_fcf_scan
;
929
uint32_t
fcoe_cvl_eventtag
;
930
uint32_t
fcoe_cvl_eventtag_attn
;
931
struct
lpfc_fcf
fcf
;
932
uint8_t
fc_map
[3];
933
uint8_t
valid_vlan
;
934
uint16_t
vlan_id
;
935
struct
list_head
fcf_conn_rec_list
;
936
937
spinlock_t
ct_ev_lock
;
/* synchronize access to ct_ev_waiters */
938
struct
list_head
ct_ev_waiters
;
939
struct
unsol_rcv_ct_ctx
ct_ctx
[64];
940
uint32_t
ctx_idx
;
941
942
uint8_t
menlo_flag
;
/* menlo generic flags */
943
#define HBA_MENLO_SUPPORT 0x1
/* HBA supports menlo commands */
944
uint32_t
iocb_cnt
;
945
uint32_t
iocb_max
;
946
atomic_t
sdev_cnt
;
947
uint8_t
fips_spec_rev
;
948
uint8_t
fips_level
;
949
};
950
951
static
inline
struct
Scsi_Host
*
952
lpfc_shost_from_vport(
struct
lpfc_vport
*
vport
)
953
{
954
return
container_of
((
void
*) vport,
struct
Scsi_Host
,
hostdata
[0]);
955
}
956
957
static
inline
void
958
lpfc_set_loopback_flag(
struct
lpfc_hba
*phba)
959
{
960
if
(phba->
cfg_topology
==
FLAGS_LOCAL_LB
)
961
phba->
link_flag
|=
LS_LOOPBACK_MODE
;
962
else
963
phba->
link_flag
&= ~
LS_LOOPBACK_MODE
;
964
}
965
966
static
inline
int
967
lpfc_is_link_up(
struct
lpfc_hba
*phba)
968
{
969
return
phba->
link_state
==
LPFC_LINK_UP
||
970
phba->
link_state
==
LPFC_CLEAR_LA
||
971
phba->
link_state
==
LPFC_HBA_READY
;
972
}
973
974
static
inline
void
975
lpfc_worker_wake_up
(
struct
lpfc_hba
*phba)
976
{
977
/* Set the lpfc data pending flag */
978
set_bit
(
LPFC_DATA_READY
, &phba->
data_flags
);
979
980
/* Wake up worker thread */
981
wake_up
(&phba->
work_waitq
);
982
return
;
983
}
984
985
static
inline
int
986
lpfc_readl(
void
__iomem
*
addr
,
uint32_t
*
data
)
987
{
988
uint32_t
temp
;
989
temp =
readl
(addr);
990
if
(temp == 0xffffffff)
991
return
-
EIO
;
992
*data =
temp
;
993
return
0;
994
}
995
996
static
inline
int
997
lpfc_sli_read_hs(
struct
lpfc_hba
*phba)
998
{
999
/*
1000
* There was a link/board error. Read the status register to retrieve
1001
* the error event and process it.
1002
*/
1003
phba->
sli
.slistat.err_attn_event++;
1004
1005
/* Save status info and check for unplug error */
1006
if
(lpfc_readl(phba->
HSregaddr
, &phba->
work_hs
) ||
1007
lpfc_readl(phba->
MBslimaddr
+ 0xa8, &phba->
work_status
[0]) ||
1008
lpfc_readl(phba->
MBslimaddr
+ 0xac, &phba->
work_status
[1])) {
1009
return
-
EIO
;
1010
}
1011
1012
/* Clear chip Host Attention error bit */
1013
writel
(
HA_ERATT
, phba->
HAregaddr
);
1014
readl
(phba->
HAregaddr
);
/* flush */
1015
phba->
pport
->stopped = 1;
1016
1017
return
0;
1018
}
Generated on Thu Jan 10 2013 14:21:38 for Linux Kernel by
1.8.2