bfa_ioc.h 19.7 KB
Newer Older
1
/*
K
Krishna Gudipati 已提交
2
 * Copyright (c) 2005-2010 Brocade Communications Systems, Inc.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 * All rights reserved
 * www.brocade.com
 *
 * Linux driver for Brocade Fibre Channel Host Bus Adapter.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License (GPL) Version 2 as
 * published by the Free Software Foundation
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 */

#ifndef __BFA_IOC_H__
#define __BFA_IOC_H__

M
Maggie Zhang 已提交
21
#include "bfad_drv.h"
K
Krishna Gudipati 已提交
22 23 24
#include "bfa_cs.h"
#include "bfi.h"

25 26 27 28 29
#define BFA_DBG_FWTRC_ENTS	(BFI_IOC_TRC_ENTS)
#define BFA_DBG_FWTRC_LEN					\
	(BFA_DBG_FWTRC_ENTS * sizeof(struct bfa_trc_s) +	\
	(sizeof(struct bfa_trc_mod_s) -				\
	BFA_TRC_MAX * sizeof(struct bfa_trc_s)))
30
/*
K
Krishna Gudipati 已提交
31 32 33 34
 * BFA timer declarations
 */
typedef void (*bfa_timer_cbfn_t)(void *);

35
/*
K
Krishna Gudipati 已提交
36 37 38 39 40 41
 * BFA timer data structure
 */
struct bfa_timer_s {
	struct list_head	qe;
	bfa_timer_cbfn_t timercb;
	void		*arg;
42
	int		timeout;	/* in millisecs */
K
Krishna Gudipati 已提交
43 44
};

45
/*
K
Krishna Gudipati 已提交
46 47 48 49 50 51
 * Timer module structure
 */
struct bfa_timer_mod_s {
	struct list_head timer_q;
};

52
#define BFA_TIMER_FREQ 200 /* specified in millisecs */
K
Krishna Gudipati 已提交
53 54 55 56 57 58 59

void bfa_timer_beat(struct bfa_timer_mod_s *mod);
void bfa_timer_begin(struct bfa_timer_mod_s *mod, struct bfa_timer_s *timer,
			bfa_timer_cbfn_t timercb, void *arg,
			unsigned int timeout);
void bfa_timer_stop(struct bfa_timer_s *timer);

60
/*
K
Krishna Gudipati 已提交
61 62 63 64 65 66 67 68
 * Generic Scatter Gather Element used by driver
 */
struct bfa_sge_s {
	u32	sg_len;
	void		*sg_addr;
};

#define bfa_sge_word_swap(__sge) do {					     \
69 70 71
	((u32 *)(__sge))[0] = swab32(((u32 *)(__sge))[0]);      \
	((u32 *)(__sge))[1] = swab32(((u32 *)(__sge))[1]);      \
	((u32 *)(__sge))[2] = swab32(((u32 *)(__sge))[2]);      \
K
Krishna Gudipati 已提交
72 73 74 75 76
} while (0)

#define bfa_swap_words(_x)  (	\
	((_x) << 32) | ((_x) >> 32))

M
Maggie Zhang 已提交
77
#ifdef __BIG_ENDIAN
K
Krishna Gudipati 已提交
78 79 80 81 82 83 84 85
#define bfa_sge_to_be(_x)
#define bfa_sge_to_le(_x)	bfa_sge_word_swap(_x)
#define bfa_sgaddr_le(_x)	bfa_swap_words(_x)
#else
#define	bfa_sge_to_be(_x)	bfa_sge_word_swap(_x)
#define bfa_sge_to_le(_x)
#define bfa_sgaddr_le(_x)	(_x)
#endif
86

87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
/*
 * BFA memory resources
 */
struct bfa_mem_dma_s {
	struct list_head qe;		/* Queue of DMA elements */
	u32		mem_len;	/* Total Length in Bytes */
	u8		*kva;		/* kernel virtual address */
	u64		dma;		/* dma address if DMA memory */
	u8		*kva_curp;	/* kva allocation cursor */
	u64		dma_curp;	/* dma allocation cursor */
};
#define bfa_mem_dma_t struct bfa_mem_dma_s

struct bfa_mem_kva_s {
	struct list_head qe;		/* Queue of KVA elements */
	u32		mem_len;	/* Total Length in Bytes */
	u8		*kva;		/* kernel virtual address */
	u8		*kva_curp;	/* kva allocation cursor */
};
#define bfa_mem_kva_t struct bfa_mem_kva_s

struct bfa_meminfo_s {
	struct bfa_mem_dma_s dma_info;
	struct bfa_mem_kva_s kva_info;
};

/* BFA memory segment setup macros */
#define bfa_mem_dma_setup(_meminfo, _dm_ptr, _seg_sz) do {	\
	((bfa_mem_dma_t *)(_dm_ptr))->mem_len = (_seg_sz);	\
	if (_seg_sz)						\
		list_add_tail(&((bfa_mem_dma_t *)_dm_ptr)->qe,	\
			      &(_meminfo)->dma_info.qe);	\
} while (0)

#define bfa_mem_kva_setup(_meminfo, _kva_ptr, _seg_sz) do {	\
	((bfa_mem_kva_t *)(_kva_ptr))->mem_len = (_seg_sz);	\
	if (_seg_sz)						\
		list_add_tail(&((bfa_mem_kva_t *)_kva_ptr)->qe,	\
			      &(_meminfo)->kva_info.qe);	\
} while (0)

/* BFA dma memory segments iterator */
#define bfa_mem_dma_sptr(_mod, _i)	(&(_mod)->dma_seg[(_i)])
#define bfa_mem_dma_seg_iter(_mod, _sptr, _nr, _i)			\
	for (_i = 0, _sptr = bfa_mem_dma_sptr(_mod, _i); _i < (_nr);	\
	     _i++, _sptr = bfa_mem_dma_sptr(_mod, _i))

#define bfa_mem_kva_curp(_mod)	((_mod)->kva_seg.kva_curp)
#define bfa_mem_dma_virt(_sptr)	((_sptr)->kva_curp)
#define bfa_mem_dma_phys(_sptr)	((_sptr)->dma_curp)
#define bfa_mem_dma_len(_sptr)	((_sptr)->mem_len)

/* Get the corresponding dma buf kva for a req - from the tag */
#define bfa_mem_get_dmabuf_kva(_mod, _tag, _rqsz)			      \
	(((u8 *)(_mod)->dma_seg[BFI_MEM_SEG_FROM_TAG(_tag, _rqsz)].kva_curp) +\
	 BFI_MEM_SEG_REQ_OFFSET(_tag, _rqsz) * (_rqsz))

/* Get the corresponding dma buf pa for a req - from the tag */
#define bfa_mem_get_dmabuf_pa(_mod, _tag, _rqsz)			\
	((_mod)->dma_seg[BFI_MEM_SEG_FROM_TAG(_tag, _rqsz)].dma_curp +	\
	 BFI_MEM_SEG_REQ_OFFSET(_tag, _rqsz) * (_rqsz))

149
/*
150 151 152
 * PCI device information required by IOC
 */
struct bfa_pcidev_s {
K
Krishna Gudipati 已提交
153 154
	int		pci_slot;
	u8		pci_func;
155
	u16		device_id;
156
	u16		ssid;
157
	void __iomem	*pci_bar_kva;
158 159
};

160
/*
161 162 163 164
 * Structure used to remember the DMA-able memory block's KVA and Physical
 * Address
 */
struct bfa_dma_s {
K
Krishna Gudipati 已提交
165 166
	void		*kva;	/* ! Kernel virtual address	*/
	u64	pa;	/* ! Physical address		*/
167 168 169 170 171
};

#define BFA_DMA_ALIGN_SZ	256
#define BFA_ROUNDUP(_l, _s)	(((_l) + ((_s) - 1)) & ~((_s) - 1))

172
/*
K
Krishna Gudipati 已提交
173 174 175 176
 * smem size for Crossbow and Catapult
 */
#define BFI_SMEM_CB_SIZE	0x200000U	/* ! 2MB for crossbow	*/
#define BFI_SMEM_CT_SIZE	0x280000U	/* ! 2.5MB for catapult	*/
177 178 179 180 181 182

#define bfa_dma_be_addr_set(dma_addr, pa)	\
		__bfa_dma_be_addr_set(&dma_addr, (u64)pa)
static inline void
__bfa_dma_be_addr_set(union bfi_addr_u *dma_addr, u64 pa)
{
183
	dma_addr->a32.addr_lo = cpu_to_be32(pa);
M
Maggie Zhang 已提交
184
	dma_addr->a32.addr_hi = cpu_to_be32(pa >> 32);
185 186
}

187 188 189 190 191 192 193 194 195 196
#define bfa_alen_set(__alen, __len, __pa)	\
	__bfa_alen_set(__alen, __len, (u64)__pa)

static inline void
__bfa_alen_set(struct bfi_alen_s *alen, u32 len, u64 pa)
{
	alen->al_len = cpu_to_be32(len);
	bfa_dma_be_addr_set(alen->al_addr, pa);
}

197
struct bfa_ioc_regs_s {
198 199 200 201
	void __iomem *hfn_mbox_cmd;
	void __iomem *hfn_mbox;
	void __iomem *lpu_mbox_cmd;
	void __iomem *lpu_mbox;
202
	void __iomem *lpu_read_stat;
203 204 205 206 207 208 209 210 211 212 213
	void __iomem *pss_ctl_reg;
	void __iomem *pss_err_status_reg;
	void __iomem *app_pll_fast_ctl_reg;
	void __iomem *app_pll_slow_ctl_reg;
	void __iomem *ioc_sem_reg;
	void __iomem *ioc_usage_sem_reg;
	void __iomem *ioc_init_sem_reg;
	void __iomem *ioc_usage_reg;
	void __iomem *host_page_num_fn;
	void __iomem *heartbeat;
	void __iomem *ioc_fwstate;
214
	void __iomem *alt_ioc_fwstate;
215
	void __iomem *ll_halt;
216
	void __iomem *alt_ll_halt;
217
	void __iomem *err_set;
218
	void __iomem *ioc_fail_sync;
219 220 221
	void __iomem *shirq_isr_next;
	void __iomem *shirq_msk_next;
	void __iomem *smem_page_start;
222 223 224
	u32	smem_pg0;
};

225
#define bfa_mem_read(_raddr, _off)	swab32(readl(((_raddr) + (_off))))
226
#define bfa_mem_write(_raddr, _off, _val)	\
227
			writel(swab32((_val)), ((_raddr) + (_off)))
228
/*
229 230 231
 * IOC Mailbox structures
 */
struct bfa_mbox_cmd_s {
K
Krishna Gudipati 已提交
232
	struct list_head	qe;
233 234 235
	u32	msg[BFI_IOC_MSGSZ];
};

236
/*
237 238 239 240
 * IOC mailbox module
 */
typedef void (*bfa_ioc_mbox_mcfunc_t)(void *cbarg, struct bfi_mbmsg_s *m);
struct bfa_ioc_mbox_mod_s {
K
Krishna Gudipati 已提交
241 242
	struct list_head		cmd_q;	/*  pending mbox queue	*/
	int			nmclass;	/*  number of handlers */
243 244 245 246 247 248
	struct {
		bfa_ioc_mbox_mcfunc_t	cbfn;	/*  message handlers	*/
		void			*cbarg;
	} mbhdlr[BFI_MC_MAX];
};

249
/*
250 251 252 253 254 255 256 257 258 259 260 261 262
 * IOC callback function interfaces
 */
typedef void (*bfa_ioc_enable_cbfn_t)(void *bfa, enum bfa_status status);
typedef void (*bfa_ioc_disable_cbfn_t)(void *bfa);
typedef void (*bfa_ioc_hbfail_cbfn_t)(void *bfa);
typedef void (*bfa_ioc_reset_cbfn_t)(void *bfa);
struct bfa_ioc_cbfn_s {
	bfa_ioc_enable_cbfn_t	enable_cbfn;
	bfa_ioc_disable_cbfn_t	disable_cbfn;
	bfa_ioc_hbfail_cbfn_t	hbfail_cbfn;
	bfa_ioc_reset_cbfn_t	reset_cbfn;
};

263
/*
264
 * IOC event notification mechanism.
265
 */
266 267 268 269 270 271 272 273 274
enum bfa_ioc_event_e {
	BFA_IOC_E_ENABLED	= 1,
	BFA_IOC_E_DISABLED	= 2,
	BFA_IOC_E_FAILED	= 3,
};

typedef void (*bfa_ioc_notify_cbfn_t)(void *, enum bfa_ioc_event_e);

struct bfa_ioc_notify_s {
275
	struct list_head		qe;
276
	bfa_ioc_notify_cbfn_t	cbfn;
277 278 279
	void			*cbarg;
};

280
/*
281
 * Initialize a IOC event notification structure
282
 */
283
#define bfa_ioc_notify_init(__notify, __cbfn, __cbarg) do {	\
284 285 286 287
	(__notify)->cbfn = (__cbfn);      \
	(__notify)->cbarg = (__cbarg);      \
} while (0)

K
Krishna Gudipati 已提交
288 289 290
struct bfa_iocpf_s {
	bfa_fsm_t		fsm;
	struct bfa_ioc_s	*ioc;
291
	bfa_boolean_t		fw_mismatch_notified;
K
Krishna Gudipati 已提交
292
	bfa_boolean_t		auto_recover;
293
	u32			poll_time;
K
Krishna Gudipati 已提交
294 295
};

296 297 298 299
struct bfa_ioc_s {
	bfa_fsm_t		fsm;
	struct bfa_s		*bfa;
	struct bfa_pcidev_s	pcidev;
K
Krishna Gudipati 已提交
300 301 302 303
	struct bfa_timer_mod_s	*timer_mod;
	struct bfa_timer_s	ioc_timer;
	struct bfa_timer_s	sem_timer;
	struct bfa_timer_s	hb_timer;
304
	u32		hb_count;
305
	struct list_head	notify_q;
306 307 308
	void			*dbg_fwsave;
	int			dbg_fwsave_len;
	bfa_boolean_t		dbg_fwsave_once;
309
	enum bfi_pcifn_class	clscode;
K
Krishna Gudipati 已提交
310
	struct bfa_ioc_regs_s	ioc_regs;
311 312 313 314
	struct bfa_trc_mod_s	*trcmod;
	struct bfa_ioc_drv_stats_s	stats;
	bfa_boolean_t		fcmode;
	bfa_boolean_t		pllinit;
K
Krishna Gudipati 已提交
315
	bfa_boolean_t		stats_busy;	/*  outstanding stats */
316 317 318 319 320
	u8			port_id;
	struct bfa_dma_s	attr_dma;
	struct bfi_ioc_attr_s	*attr;
	struct bfa_ioc_cbfn_s	*cbfn;
	struct bfa_ioc_mbox_mod_s mbox_mod;
K
Krishna Gudipati 已提交
321 322
	struct bfa_ioc_hwif_s	*ioc_hwif;
	struct bfa_iocpf_s	iocpf;
323 324 325 326
	enum bfi_asic_gen	asic_gen;
	enum bfi_asic_mode	asic_mode;
	enum bfi_port_mode	port0_mode;
	enum bfi_port_mode	port1_mode;
327 328 329
	enum bfa_mode_s		port_mode;
	u8			ad_cap_bm;	/* adapter cap bit mask */
	u8			port_mode_cfg;	/* config port mode */
330 331 332
};

struct bfa_ioc_hwif_s {
333
	bfa_status_t (*ioc_pll_init) (void __iomem *rb, enum bfi_asic_mode m);
K
Krishna Gudipati 已提交
334 335 336 337 338 339
	bfa_boolean_t	(*ioc_firmware_lock)	(struct bfa_ioc_s *ioc);
	void		(*ioc_firmware_unlock)	(struct bfa_ioc_s *ioc);
	void		(*ioc_reg_init)	(struct bfa_ioc_s *ioc);
	void		(*ioc_map_port)	(struct bfa_ioc_s *ioc);
	void		(*ioc_isr_mode_set)	(struct bfa_ioc_s *ioc,
					bfa_boolean_t msix);
340
	void		(*ioc_notify_fail)	(struct bfa_ioc_s *ioc);
K
Krishna Gudipati 已提交
341
	void		(*ioc_ownership_reset)	(struct bfa_ioc_s *ioc);
J
Jing Huang 已提交
342
	bfa_boolean_t   (*ioc_sync_start)       (struct bfa_ioc_s *ioc);
343 344 345 346
	void		(*ioc_sync_join)	(struct bfa_ioc_s *ioc);
	void		(*ioc_sync_leave)	(struct bfa_ioc_s *ioc);
	void		(*ioc_sync_ack)		(struct bfa_ioc_s *ioc);
	bfa_boolean_t	(*ioc_sync_complete)	(struct bfa_ioc_s *ioc);
347
	bfa_boolean_t	(*ioc_lpu_read_stat)	(struct bfa_ioc_s *ioc);
348 349
};

350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
/*
 * ASIC block configurtion related
 */

typedef void (*bfa_ablk_cbfn_t)(void *, enum bfa_status);

struct bfa_ablk_s {
	struct bfa_ioc_s	*ioc;
	struct bfa_ablk_cfg_s	*cfg;
	u16			*pcifn;
	struct bfa_dma_s	dma_addr;
	bfa_boolean_t		busy;
	struct bfa_mbox_cmd_s	mb;
	bfa_ablk_cbfn_t		cbfn;
	void			*cbarg;
	struct bfa_ioc_notify_s	ioc_notify;
366
	struct bfa_mem_dma_s	ablk_dma;
367
};
368
#define BFA_MEM_ABLK_DMA(__bfa)		(&((__bfa)->modules.ablk.ablk_dma))
369

370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421
/*
 *	SFP module specific
 */
typedef void	(*bfa_cb_sfp_t) (void *cbarg, bfa_status_t status);

struct bfa_sfp_s {
	void	*dev;
	struct bfa_ioc_s	*ioc;
	struct bfa_trc_mod_s	*trcmod;
	struct sfp_mem_s	*sfpmem;
	bfa_cb_sfp_t		cbfn;
	void			*cbarg;
	enum bfi_sfp_mem_e	memtype; /* mem access type   */
	u32			status;
	struct bfa_mbox_cmd_s	mbcmd;
	u8			*dbuf_kva; /* dma buf virtual address */
	u64			dbuf_pa;   /* dma buf physical address */
	struct bfa_ioc_notify_s	ioc_notify;
	enum bfa_defs_sfp_media_e *media;
	enum bfa_port_speed	portspeed;
	bfa_cb_sfp_t		state_query_cbfn;
	void			*state_query_cbarg;
	u8			lock;
	u8			data_valid; /* data in dbuf is valid */
	u8			state;	    /* sfp state  */
	u8			state_query_lock;
	struct bfa_mem_dma_s	sfp_dma;
	u8			is_elb;	    /* eloopback  */
};

#define BFA_SFP_MOD(__bfa)	(&(__bfa)->modules.sfp)
#define BFA_MEM_SFP_DMA(__bfa)	(&(BFA_SFP_MOD(__bfa)->sfp_dma))

u32	bfa_sfp_meminfo(void);

void	bfa_sfp_attach(struct bfa_sfp_s *sfp, struct bfa_ioc_s *ioc,
			void *dev, struct bfa_trc_mod_s *trcmod);

void	bfa_sfp_memclaim(struct bfa_sfp_s *diag, u8 *dm_kva, u64 dm_pa);
void	bfa_sfp_intr(void *bfaarg, struct bfi_mbmsg_s *msg);

bfa_status_t	bfa_sfp_show(struct bfa_sfp_s *sfp, struct sfp_mem_s *sfpmem,
			     bfa_cb_sfp_t cbfn, void *cbarg);

bfa_status_t	bfa_sfp_media(struct bfa_sfp_s *sfp,
			enum bfa_defs_sfp_media_e *media,
			bfa_cb_sfp_t cbfn, void *cbarg);

bfa_status_t	bfa_sfp_speed(struct bfa_sfp_s *sfp,
			enum bfa_port_speed portspeed,
			bfa_cb_sfp_t cbfn, void *cbarg);

422 423 424
#define bfa_ioc_pcifn(__ioc)		((__ioc)->pcidev.pci_func)
#define bfa_ioc_devid(__ioc)		((__ioc)->pcidev.device_id)
#define bfa_ioc_bar0(__ioc)		((__ioc)->pcidev.pci_bar_kva)
425
#define bfa_ioc_portid(__ioc)		((__ioc)->port_id)
426 427
#define bfa_ioc_asic_gen(__ioc)		((__ioc)->asic_gen)
#define bfa_ioc_is_cna(__ioc)	\
428 429
	((bfa_ioc_get_type(__ioc) == BFA_IOC_TYPE_FCoE) ||	\
	 (bfa_ioc_get_type(__ioc) == BFA_IOC_TYPE_LL))
430
#define bfa_ioc_fetch_stats(__ioc, __stats) \
431
		(((__stats)->drv_stats) = (__ioc)->stats)
432
#define bfa_ioc_clr_stats(__ioc)	\
433
		memset(&(__ioc)->stats, 0, sizeof((__ioc)->stats))
434 435
#define bfa_ioc_maxfrsize(__ioc)	((__ioc)->attr->maxfrsize)
#define bfa_ioc_rx_bbcredit(__ioc)	((__ioc)->attr->rx_bbcredit)
436 437
#define bfa_ioc_speed_sup(__ioc)	\
	BFI_ADAPTER_GETP(SPEED, (__ioc)->attr->adapter_prop)
K
Krishna Gudipati 已提交
438
#define bfa_ioc_get_nports(__ioc)	\
439 440
	BFI_ADAPTER_GETP(NPORTS, (__ioc)->attr->adapter_prop)

K
Krishna Gudipati 已提交
441 442
#define bfa_ioc_stats(_ioc, _stats)	((_ioc)->stats._stats++)
#define BFA_IOC_FWIMG_MINSZ	(16 * 1024)
443 444 445
#define BFA_IOC_FW_SMEM_SIZE(__ioc)			\
	((bfa_ioc_asic_gen(__ioc) == BFI_ASIC_GEN_CB)	\
	 ? BFI_SMEM_CB_SIZE : BFI_SMEM_CT_SIZE)
K
Krishna Gudipati 已提交
446 447
#define BFA_IOC_FLASH_CHUNK_NO(off)		(off / BFI_FLASH_CHUNK_SZ_WORDS)
#define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off)	(off % BFI_FLASH_CHUNK_SZ_WORDS)
448
#define BFA_IOC_FLASH_CHUNK_ADDR(chunkno)  (chunkno * BFI_FLASH_CHUNK_SZ_WORDS)
449

450
/*
451 452 453 454 455 456 457
 * IOC mailbox interface
 */
void bfa_ioc_mbox_queue(struct bfa_ioc_s *ioc, struct bfa_mbox_cmd_s *cmd);
void bfa_ioc_mbox_register(struct bfa_ioc_s *ioc,
		bfa_ioc_mbox_mcfunc_t *mcfuncs);
void bfa_ioc_mbox_isr(struct bfa_ioc_s *ioc);
void bfa_ioc_mbox_send(struct bfa_ioc_s *ioc, void *ioc_msg, int len);
458
bfa_boolean_t bfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg);
459 460 461
void bfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc,
		bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg);

462
/*
463 464
 * IOC interfaces
 */
K
Krishna Gudipati 已提交
465 466 467

#define bfa_ioc_pll_init_asic(__ioc) \
	((__ioc)->ioc_hwif->ioc_pll_init((__ioc)->pcidev.pci_bar_kva, \
468
			   (__ioc)->asic_mode))
K
Krishna Gudipati 已提交
469 470

bfa_status_t bfa_ioc_pll_init(struct bfa_ioc_s *ioc);
471 472 473
bfa_status_t bfa_ioc_cb_pll_init(void __iomem *rb, enum bfi_asic_mode mode);
bfa_status_t bfa_ioc_ct_pll_init(void __iomem *rb, enum bfi_asic_mode mode);
bfa_status_t bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode mode);
K
Krishna Gudipati 已提交
474

475 476 477 478
#define bfa_ioc_isr_mode_set(__ioc, __msix) do {			\
	if ((__ioc)->ioc_hwif->ioc_isr_mode_set)			\
		((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix));	\
} while (0)
K
Krishna Gudipati 已提交
479
#define	bfa_ioc_ownership_reset(__ioc)				\
480
			((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc))
481
#define bfa_ioc_get_fcmode(__ioc)	((__ioc)->fcmode)
482 483 484 485
#define bfa_ioc_lpu_read_stat(__ioc) do {			\
	if ((__ioc)->ioc_hwif->ioc_lpu_read_stat)		\
		((__ioc)->ioc_hwif->ioc_lpu_read_stat(__ioc));	\
} while (0)
K
Krishna Gudipati 已提交
486

487
void bfa_ioc_set_cb_hwif(struct bfa_ioc_s *ioc);
488 489 490
void bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc);
void bfa_ioc_set_ct2_hwif(struct bfa_ioc_s *ioc);
void bfa_ioc_ct2_poweron(struct bfa_ioc_s *ioc);
K
Krishna Gudipati 已提交
491

492
void bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa,
K
Krishna Gudipati 已提交
493 494
		struct bfa_ioc_cbfn_s *cbfn, struct bfa_timer_mod_s *timer_mod);
void bfa_ioc_auto_recover(bfa_boolean_t auto_recover);
495 496
void bfa_ioc_detach(struct bfa_ioc_s *ioc);
void bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev,
497
		enum bfi_pcifn_class clscode);
498 499 500 501 502
void bfa_ioc_mem_claim(struct bfa_ioc_s *ioc,  u8 *dm_kva, u64 dm_pa);
void bfa_ioc_enable(struct bfa_ioc_s *ioc);
void bfa_ioc_disable(struct bfa_ioc_s *ioc);
bfa_boolean_t bfa_ioc_intx_claim(struct bfa_ioc_s *ioc);

K
Krishna Gudipati 已提交
503
void bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type,
504
		u32 boot_env);
505 506 507
void bfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *msg);
void bfa_ioc_error_isr(struct bfa_ioc_s *ioc);
bfa_boolean_t bfa_ioc_is_operational(struct bfa_ioc_s *ioc);
K
Krishna Gudipati 已提交
508
bfa_boolean_t bfa_ioc_is_initialized(struct bfa_ioc_s *ioc);
509
bfa_boolean_t bfa_ioc_is_disabled(struct bfa_ioc_s *ioc);
510
bfa_boolean_t bfa_ioc_is_acq_addr(struct bfa_ioc_s *ioc);
511 512
bfa_boolean_t bfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc);
bfa_boolean_t bfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc);
513
void bfa_ioc_reset_fwstate(struct bfa_ioc_s *ioc);
514 515 516 517 518 519
enum bfa_ioc_type_e bfa_ioc_get_type(struct bfa_ioc_s *ioc);
void bfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num);
void bfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver);
void bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver);
void bfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model);
void bfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc,
K
Krishna Gudipati 已提交
520
		char *manufacturer);
521 522 523
void bfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev);
enum bfa_ioc_state bfa_ioc_get_state(struct bfa_ioc_s *ioc);

524 525 526 527 528 529 530 531
void bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr);
void bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc,
		struct bfa_adapter_attr_s *ad_attr);
void bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave);
bfa_status_t bfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata,
		int *trclen);
bfa_status_t bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata,
				 int *trclen);
K
Krishna Gudipati 已提交
532 533
bfa_status_t bfa_ioc_debug_fwcore(struct bfa_ioc_s *ioc, void *buf,
	u32 *offset, int *buflen);
534
bfa_boolean_t bfa_ioc_sem_get(void __iomem *sem_reg);
535 536 537 538
void bfa_ioc_fwver_get(struct bfa_ioc_s *ioc,
			struct bfi_ioc_image_hdr_s *fwhdr);
bfa_boolean_t bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc,
			struct bfi_ioc_image_hdr_s *fwhdr);
K
Krishna Gudipati 已提交
539 540
bfa_status_t bfa_ioc_fw_stats_get(struct bfa_ioc_s *ioc, void *stats);
bfa_status_t bfa_ioc_fw_stats_clear(struct bfa_ioc_s *ioc);
541

542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568
/*
 * asic block configuration related APIs
 */
u32	bfa_ablk_meminfo(void);
void bfa_ablk_memclaim(struct bfa_ablk_s *ablk, u8 *dma_kva, u64 dma_pa);
void bfa_ablk_attach(struct bfa_ablk_s *ablk, struct bfa_ioc_s *ioc);
bfa_status_t bfa_ablk_query(struct bfa_ablk_s *ablk,
		struct bfa_ablk_cfg_s *ablk_cfg,
		bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_adapter_config(struct bfa_ablk_s *ablk,
		enum bfa_mode_s mode, int max_pf, int max_vf,
		bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_port_config(struct bfa_ablk_s *ablk, int port,
		enum bfa_mode_s mode, int max_pf, int max_vf,
		bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_pf_create(struct bfa_ablk_s *ablk, u16 *pcifn,
		u8 port, enum bfi_pcifn_class personality, int bw,
		bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_pf_delete(struct bfa_ablk_s *ablk, int pcifn,
		bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_pf_update(struct bfa_ablk_s *ablk, int pcifn, int bw,
		bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_optrom_en(struct bfa_ablk_s *ablk,
		bfa_ablk_cbfn_t cbfn, void *cbarg);
bfa_status_t bfa_ablk_optrom_dis(struct bfa_ablk_s *ablk,
		bfa_ablk_cbfn_t cbfn, void *cbarg);

569 570 571 572
/*
 * bfa mfg wwn API functions
 */
mac_t bfa_ioc_get_mac(struct bfa_ioc_s *ioc);
J
Jing Huang 已提交
573
mac_t bfa_ioc_get_mfg_mac(struct bfa_ioc_s *ioc);
574

K
Krishna Gudipati 已提交
575 576 577
/*
 * F/W Image Size & Chunk
 */
578 579 580 581 582 583
extern u32 bfi_image_cb_size;
extern u32 bfi_image_ct_size;
extern u32 bfi_image_ct2_size;
extern u32 *bfi_image_cb;
extern u32 *bfi_image_ct;
extern u32 *bfi_image_ct2;
K
Krishna Gudipati 已提交
584 585

static inline u32 *
586 587 588 589
bfi_image_cb_get_chunk(u32 off)
{
	return (u32 *)(bfi_image_cb + off);
}
K
Krishna Gudipati 已提交
590 591

static inline u32 *
592 593 594 595
bfi_image_ct_get_chunk(u32 off)
{
	return (u32 *)(bfi_image_ct + off);
}
596

K
Krishna Gudipati 已提交
597
static inline u32 *
598 599 600 601
bfi_image_ct2_get_chunk(u32 off)
{
	return (u32 *)(bfi_image_ct2 + off);
}
K
Krishna Gudipati 已提交
602 603

static inline u32*
604
bfa_cb_image_get_chunk(enum bfi_asic_gen asic_gen, u32 off)
K
Krishna Gudipati 已提交
605
{
606 607 608 609 610 611 612 613 614 615 616 617
	switch (asic_gen) {
	case BFI_ASIC_GEN_CB:
		return bfi_image_cb_get_chunk(off);
		break;
	case BFI_ASIC_GEN_CT:
		return bfi_image_ct_get_chunk(off);
		break;
	case BFI_ASIC_GEN_CT2:
		return bfi_image_ct2_get_chunk(off);
		break;
	default:
		return NULL;
K
Krishna Gudipati 已提交
618 619 620 621
	}
}

static inline u32
622
bfa_cb_image_get_size(enum bfi_asic_gen asic_gen)
K
Krishna Gudipati 已提交
623
{
624 625 626 627 628 629 630 631 632 633 634 635
	switch (asic_gen) {
	case BFI_ASIC_GEN_CB:
		return bfi_image_cb_size;
		break;
	case BFI_ASIC_GEN_CT:
		return bfi_image_ct_size;
		break;
	case BFI_ASIC_GEN_CT2:
		return bfi_image_ct2_size;
		break;
	default:
		return 0;
K
Krishna Gudipati 已提交
636 637 638
	}
}

639
/*
K
Krishna Gudipati 已提交
640 641 642 643 644 645 646 647 648 649 650 651 652 653
 * CNA TRCMOD declaration
 */
/*
 * !!! Only append to the enums defined here to avoid any versioning
 * !!! needed between trace utility and driver version
 */
enum {
	BFA_TRC_CNA_PORT	= 1,
	BFA_TRC_CNA_IOC		= 2,
	BFA_TRC_CNA_IOC_CB	= 3,
	BFA_TRC_CNA_IOC_CT	= 4,
};

#endif /* __BFA_IOC_H__ */