2 * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
6 * Linux driver for Brocade Fibre Channel Host Bus Adapter.
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License (GPL) Version 2 as
10 * published by the Free Software Foundation
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
19 * Contains base driver definitions.
23 * bfa_drv.h Linux driver data structures.
26 #ifndef __BFAD_DRV_H__
27 #define __BFAD_DRV_H__
29 #include "bfa_os_inc.h"
33 #include <fcs/bfa_fcs.h>
34 #include <defs/bfa_defs_pci.h>
35 #include <defs/bfa_defs_port.h>
36 #include <defs/bfa_defs_rport.h>
37 #include <fcs/bfa_fcs_rport.h>
38 #include <defs/bfa_defs_vport.h>
39 #include <fcs/bfa_fcs_vport.h>
41 #include <cs/bfa_plog.h>
42 #include "aen/bfa_aen.h"
43 #include <log/bfa_log_linux.h>
45 #define BFAD_DRIVER_NAME "bfa"
46 #ifdef BFA_DRIVER_VERSION
47 #define BFAD_DRIVER_VERSION BFA_DRIVER_VERSION
49 #define BFAD_DRIVER_VERSION "2.1.2.1"
53 #define BFAD_IRQ_FLAGS IRQF_SHARED
58 #define BFAD_MSIX_ON 0x00000001
59 #define BFAD_HAL_INIT_DONE 0x00000002
60 #define BFAD_DRV_INIT_DONE 0x00000004
61 #define BFAD_CFG_PPORT_DONE 0x00000008
62 #define BFAD_HAL_START_DONE 0x00000010
63 #define BFAD_PORT_ONLINE 0x00000020
64 #define BFAD_RPORT_ONLINE 0x00000040
65 #define BFAD_FCS_INIT_DONE 0x00000080
66 #define BFAD_HAL_INIT_FAIL 0x00000100
67 #define BFAD_FC4_PROBE_DONE 0x00000200
68 #define BFAD_PORT_DELETE 0x00000001
71 * BFAD related definition
73 #define SCSI_SCAN_DELAY HZ
74 #define BFAD_STOP_TIMEOUT 30
75 #define BFAD_SUSPEND_TIMEOUT BFAD_STOP_TIMEOUT
78 * BFAD configuration parameter default values
80 #define BFAD_LUN_QUEUE_DEPTH 32
81 #define BFAD_IO_MAX_SGE SG_ALL
83 #define bfad_isr_t irq_handler_t
85 #define MAX_MSIX_ENTRY 22
89 struct msix_entry msix
;
92 enum bfad_port_pvb_type
{
93 BFAD_PORT_PHYS_BASE
= 0,
94 BFAD_PORT_PHYS_VPORT
= 1,
95 BFAD_PORT_VF_BASE
= 2,
96 BFAD_PORT_VF_VPORT
= 3,
100 * PORT data structure
103 struct list_head list_entry
;
105 struct bfa_fcs_port_s
*fcs_port
;
110 enum bfad_port_pvb_type pvb_type
;
111 struct bfad_im_port_s
*im_port
; /* IM specific data */
112 struct bfad_tm_port_s
*tm_port
; /* TM specific data */
113 struct bfad_ipfc_port_s
*ipfc_port
; /* IPFC specific data */
117 * VPORT data structure
119 struct bfad_vport_s
{
120 struct bfad_port_s drv_port
;
121 struct bfa_fcs_vport_s fcs_vport
;
122 struct completion
*comp_del
;
130 struct bfad_port_s base_port
; /* base port for vf */
134 struct bfad_cfg_param_s
{
135 u32 rport_del_timeout
;
143 /* From struct bfa_adapter_attr_s */
144 char manufacturer
[BFA_ADAPTER_MFG_NAME_LEN
];
145 char serial_num
[BFA_ADAPTER_SERIAL_NUM_LEN
];
146 char model
[BFA_ADAPTER_MODEL_NAME_LEN
];
147 char fw_ver
[BFA_VERSION_LEN
];
148 char optrom_ver
[BFA_VERSION_LEN
];
150 /* From struct bfa_ioc_pci_attr_s */
151 u8 chip_rev
[BFA_IOC_CHIP_REV_LEN
]; /* chip revision */
155 * BFAD (PCI function) data structure
158 struct list_head list_entry
;
160 struct bfa_fcs_s bfa_fcs
;
161 struct pci_dev
*pcidev
;
162 const char *pci_name
;
163 struct bfa_pcidev_s hal_pcidev
;
164 struct bfa_ioc_pci_attr_s pci_attr
;
165 unsigned long pci_bar0_map
;
166 void __iomem
*pci_bar0_kva
;
167 struct completion comp
;
168 struct completion suspend
;
169 struct completion disable_comp
;
170 bfa_boolean_t disable_active
;
171 struct bfad_port_s pport
; /* physical port of the BFAD */
172 struct bfa_meminfo_s meminfo
;
173 struct bfa_iocfc_cfg_s ioc_cfg
;
174 u32 inst_no
; /* BFAD instance number */
176 spinlock_t bfad_lock
;
177 struct task_struct
*bfad_tsk
;
178 struct bfad_cfg_param_s cfg_data
;
179 struct bfad_msix_s msix_tab
[MAX_MSIX_ENTRY
];
181 char adapter_name
[BFA_ADAPTER_SYM_NAME_LEN
];
182 char port_name
[BFA_ADAPTER_SYM_NAME_LEN
];
183 struct timer_list hal_tmo
;
184 unsigned long hs_start
;
185 struct bfad_im_s
*im
; /* IM specific data */
186 struct bfad_tm_s
*tm
; /* TM specific data */
187 struct bfad_ipfc_s
*ipfc
; /* IPFC specific data */
188 struct bfa_log_mod_s log_data
;
189 struct bfa_trc_mod_s
*trcmod
;
190 struct bfa_log_mod_s
*logmod
;
191 struct bfa_aen_s
*aen
;
192 struct bfa_aen_s aen_buf
;
193 void *file_map
[BFA_AEN_MAX_APP
];
194 struct bfa_plog_s plog_buf
;
196 bfa_boolean_t ipfc_enabled
;
197 union bfad_tmp_buf tmp_buf
;
198 struct fc_host_statistics link_stats
;
202 * RPORT data structure
204 struct bfad_rport_s
{
205 struct bfa_fcs_rport_s fcs_rport
;
208 struct bfad_buf_info
{
215 struct bfad_port_s
*port
;
216 struct bfa_rport_s
*bfa_rport
;
217 bfa_status_t req_status
;
228 struct bfa_sge_s
*req_sge
;
229 struct bfa_sge_s
*rsp_sge
;
230 fcxp_send_cb_t send_cbfn
;
233 struct completion comp
;
236 struct bfad_hal_comp
{
238 struct completion comp
;
242 * Macro to obtain the immediate lower power
243 * of two for the integer.
245 #define nextLowerInt(x) \
249 for (j = 1; j < (sizeof(int) * 8); j <<= 1) \
250 (*x) = (*x) | (*x) >> j; \
256 bfa_status_t
bfad_vport_create(struct bfad_s
*bfad
, u16 vf_id
,
257 struct bfa_port_cfg_s
*port_cfg
);
258 bfa_status_t
bfad_vf_create(struct bfad_s
*bfad
, u16 vf_id
,
259 struct bfa_port_cfg_s
*port_cfg
);
260 bfa_status_t
bfad_cfg_pport(struct bfad_s
*bfad
, enum bfa_port_role role
);
261 bfa_status_t
bfad_drv_init(struct bfad_s
*bfad
);
262 bfa_status_t
bfad_start_ops(struct bfad_s
*bfad
);
263 void bfad_drv_start(struct bfad_s
*bfad
);
264 void bfad_uncfg_pport(struct bfad_s
*bfad
);
265 void bfad_drv_stop(struct bfad_s
*bfad
);
266 void bfad_remove_intr(struct bfad_s
*bfad
);
267 void bfad_hal_mem_release(struct bfad_s
*bfad
);
268 void bfad_hcb_comp(void *arg
, bfa_status_t status
);
270 int bfad_setup_intr(struct bfad_s
*bfad
);
271 void bfad_remove_intr(struct bfad_s
*bfad
);
273 void bfad_update_hal_cfg(struct bfa_iocfc_cfg_s
*bfa_cfg
);
274 bfa_status_t
bfad_hal_mem_alloc(struct bfad_s
*bfad
);
275 void bfad_bfa_tmo(unsigned long data
);
276 void bfad_init_timer(struct bfad_s
*bfad
);
277 int bfad_pci_init(struct pci_dev
*pdev
, struct bfad_s
*bfad
);
278 void bfad_pci_uninit(struct pci_dev
*pdev
, struct bfad_s
*bfad
);
279 void bfad_fcs_port_cfg(struct bfad_s
*bfad
);
280 void bfad_drv_uninit(struct bfad_s
*bfad
);
281 void bfad_drv_log_level_set(struct bfad_s
*bfad
);
282 bfa_status_t
bfad_fc4_module_init(void);
283 void bfad_fc4_module_exit(void);
284 int bfad_worker (void *ptr
);
286 void bfad_pci_remove(struct pci_dev
*pdev
);
287 int bfad_pci_probe(struct pci_dev
*pdev
, const struct pci_device_id
*pid
);
288 void bfad_os_rport_online_wait(struct bfad_s
*bfad
);
289 int bfad_os_get_linkup_delay(struct bfad_s
*bfad
);
290 int bfad_install_msix_handler(struct bfad_s
*bfad
);
292 extern struct idr bfad_im_port_index
;
293 extern struct list_head bfad_list
;
294 extern int bfa_lun_queue_depth
;
295 extern int bfad_supported_fc4s
;
296 extern int bfa_linkup_delay
;
298 #endif /* __BFAD_DRV_H__ */