brintos

brintos / linux-shallow public Read only

0
0
Text · 33.8 KiB · 3ec1050 Raw
1088 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.4 * Copyright (c) 2014- QLogic Corporation.5 * All rights reserved6 * www.qlogic.com7 *8 * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.9 */10 11#ifndef __BFA_IOC_H__12#define __BFA_IOC_H__13 14#include "bfad_drv.h"15#include "bfa_cs.h"16#include "bfi.h"17 18#define BFA_DBG_FWTRC_ENTS	(BFI_IOC_TRC_ENTS)19#define BFA_DBG_FWTRC_LEN					\20	(BFA_DBG_FWTRC_ENTS * sizeof(struct bfa_trc_s) +	\21	(sizeof(struct bfa_trc_mod_s) -				\22	BFA_TRC_MAX * sizeof(struct bfa_trc_s)))23/*24 * BFA timer declarations25 */26typedef void (*bfa_timer_cbfn_t)(void *);27 28/*29 * BFA timer data structure30 */31struct bfa_timer_s {32	struct list_head	qe;33	bfa_timer_cbfn_t timercb;34	void		*arg;35	int		timeout;	/* in millisecs */36};37 38/*39 * Timer module structure40 */41struct bfa_timer_mod_s {42	struct list_head timer_q;43};44 45#define BFA_TIMER_FREQ 200 /* specified in millisecs */46 47void bfa_timer_beat(struct bfa_timer_mod_s *mod);48void bfa_timer_begin(struct bfa_timer_mod_s *mod, struct bfa_timer_s *timer,49			bfa_timer_cbfn_t timercb, void *arg,50			unsigned int timeout);51void bfa_timer_stop(struct bfa_timer_s *timer);52 53/*54 * Generic Scatter Gather Element used by driver55 */56struct bfa_sge_s {57	u32	sg_len;58	void		*sg_addr;59};60 61#define bfa_sge_word_swap(__sge) do {					     \62	((u32 *)(__sge))[0] = swab32(((u32 *)(__sge))[0]);      \63	((u32 *)(__sge))[1] = swab32(((u32 *)(__sge))[1]);      \64	((u32 *)(__sge))[2] = swab32(((u32 *)(__sge))[2]);      \65} while (0)66 67#define bfa_swap_words(_x)  (	\68	((u64)(_x) << 32) | ((u64)(_x) >> 32))69 70#ifdef __BIG_ENDIAN71#define bfa_sge_to_be(_x)72#define bfa_sge_to_le(_x)	bfa_sge_word_swap(_x)73#define bfa_sgaddr_le(_x)	bfa_swap_words(_x)74#else75#define	bfa_sge_to_be(_x)	bfa_sge_word_swap(_x)76#define bfa_sge_to_le(_x)77#define bfa_sgaddr_le(_x)	(_x)78#endif79 80/*81 * BFA memory resources82 */83struct bfa_mem_dma_s {84	struct list_head qe;		/* Queue of DMA elements */85	u32		mem_len;	/* Total Length in Bytes */86	u8		*kva;		/* kernel virtual address */87	u64		dma;		/* dma address if DMA memory */88	u8		*kva_curp;	/* kva allocation cursor */89	u64		dma_curp;	/* dma allocation cursor */90};91#define bfa_mem_dma_t struct bfa_mem_dma_s92 93struct bfa_mem_kva_s {94	struct list_head qe;		/* Queue of KVA elements */95	u32		mem_len;	/* Total Length in Bytes */96	u8		*kva;		/* kernel virtual address */97	u8		*kva_curp;	/* kva allocation cursor */98};99#define bfa_mem_kva_t struct bfa_mem_kva_s100 101struct bfa_meminfo_s {102	struct bfa_mem_dma_s dma_info;103	struct bfa_mem_kva_s kva_info;104};105 106/* BFA memory segment setup helpers */107static inline void bfa_mem_dma_setup(struct bfa_meminfo_s *meminfo,108				     struct bfa_mem_dma_s *dm_ptr,109				     size_t seg_sz)110{111	dm_ptr->mem_len = seg_sz;112	if (seg_sz)113		list_add_tail(&dm_ptr->qe, &meminfo->dma_info.qe);114}115 116static inline void bfa_mem_kva_setup(struct bfa_meminfo_s *meminfo,117				     struct bfa_mem_kva_s *kva_ptr,118				     size_t seg_sz)119{120	kva_ptr->mem_len = seg_sz;121	if (seg_sz)122		list_add_tail(&kva_ptr->qe, &meminfo->kva_info.qe);123}124 125/* BFA dma memory segments iterator */126#define bfa_mem_dma_sptr(_mod, _i)	(&(_mod)->dma_seg[(_i)])127#define bfa_mem_dma_seg_iter(_mod, _sptr, _nr, _i)			\128	for (_i = 0, _sptr = bfa_mem_dma_sptr(_mod, _i); _i < (_nr);	\129	     _i++, _sptr = bfa_mem_dma_sptr(_mod, _i))130 131#define bfa_mem_kva_curp(_mod)	((_mod)->kva_seg.kva_curp)132#define bfa_mem_dma_virt(_sptr)	((_sptr)->kva_curp)133#define bfa_mem_dma_phys(_sptr)	((_sptr)->dma_curp)134#define bfa_mem_dma_len(_sptr)	((_sptr)->mem_len)135 136/* Get the corresponding dma buf kva for a req - from the tag */137#define bfa_mem_get_dmabuf_kva(_mod, _tag, _rqsz)			      \138	(((u8 *)(_mod)->dma_seg[BFI_MEM_SEG_FROM_TAG(_tag, _rqsz)].kva_curp) +\139	 BFI_MEM_SEG_REQ_OFFSET(_tag, _rqsz) * (_rqsz))140 141/* Get the corresponding dma buf pa for a req - from the tag */142#define bfa_mem_get_dmabuf_pa(_mod, _tag, _rqsz)			\143	((_mod)->dma_seg[BFI_MEM_SEG_FROM_TAG(_tag, _rqsz)].dma_curp +	\144	 BFI_MEM_SEG_REQ_OFFSET(_tag, _rqsz) * (_rqsz))145 146/*147 * PCI device information required by IOC148 */149struct bfa_pcidev_s {150	int		pci_slot;151	u8		pci_func;152	u16		device_id;153	u16		ssid;154	void __iomem	*pci_bar_kva;155};156 157/*158 * Structure used to remember the DMA-able memory block's KVA and Physical159 * Address160 */161struct bfa_dma_s {162	void		*kva;	/* ! Kernel virtual address	*/163	u64	pa;	/* ! Physical address		*/164};165 166#define BFA_DMA_ALIGN_SZ	256167#define BFA_ROUNDUP(_l, _s)	(((_l) + ((_s) - 1)) & ~((_s) - 1))168 169/*170 * smem size for Crossbow and Catapult171 */172#define BFI_SMEM_CB_SIZE	0x200000U	/* ! 2MB for crossbow	*/173#define BFI_SMEM_CT_SIZE	0x280000U	/* ! 2.5MB for catapult	*/174 175#define bfa_dma_be_addr_set(dma_addr, pa)	\176		__bfa_dma_be_addr_set(&dma_addr, (u64)pa)177static inline void178__bfa_dma_be_addr_set(union bfi_addr_u *dma_addr, u64 pa)179{180	dma_addr->a32.addr_lo = cpu_to_be32(pa);181	dma_addr->a32.addr_hi = cpu_to_be32(pa >> 32);182}183 184#define bfa_alen_set(__alen, __len, __pa)	\185	__bfa_alen_set(__alen, __len, (u64)__pa)186 187static inline void188__bfa_alen_set(struct bfi_alen_s *alen, u32 len, u64 pa)189{190	alen->al_len = cpu_to_be32(len);191	bfa_dma_be_addr_set(alen->al_addr, pa);192}193 194struct bfa_ioc_regs_s {195	void __iomem *hfn_mbox_cmd;196	void __iomem *hfn_mbox;197	void __iomem *lpu_mbox_cmd;198	void __iomem *lpu_mbox;199	void __iomem *lpu_read_stat;200	void __iomem *pss_ctl_reg;201	void __iomem *pss_err_status_reg;202	void __iomem *app_pll_fast_ctl_reg;203	void __iomem *app_pll_slow_ctl_reg;204	void __iomem *ioc_sem_reg;205	void __iomem *ioc_usage_sem_reg;206	void __iomem *ioc_init_sem_reg;207	void __iomem *ioc_usage_reg;208	void __iomem *host_page_num_fn;209	void __iomem *heartbeat;210	void __iomem *ioc_fwstate;211	void __iomem *alt_ioc_fwstate;212	void __iomem *ll_halt;213	void __iomem *alt_ll_halt;214	void __iomem *err_set;215	void __iomem *ioc_fail_sync;216	void __iomem *shirq_isr_next;217	void __iomem *shirq_msk_next;218	void __iomem *smem_page_start;219	u32	smem_pg0;220};221 222#define bfa_mem_read(_raddr, _off)	swab32(readl(((_raddr) + (_off))))223#define bfa_mem_write(_raddr, _off, _val)	\224			writel(swab32((_val)), ((_raddr) + (_off)))225/*226 * IOC Mailbox structures227 */228struct bfa_mbox_cmd_s {229	struct list_head	qe;230	u32	msg[BFI_IOC_MSGSZ];231};232 233/*234 * IOC mailbox module235 */236typedef void (*bfa_ioc_mbox_mcfunc_t)(void *cbarg, struct bfi_mbmsg_s *m);237struct bfa_ioc_mbox_mod_s {238	struct list_head		cmd_q;	/*  pending mbox queue	*/239	int			nmclass;	/*  number of handlers */240	struct {241		bfa_ioc_mbox_mcfunc_t	cbfn;	/*  message handlers	*/242		void			*cbarg;243	} mbhdlr[BFI_MC_MAX];244};245 246/*247 * IOC callback function interfaces248 */249typedef void (*bfa_ioc_enable_cbfn_t)(void *bfa, enum bfa_status status);250typedef void (*bfa_ioc_disable_cbfn_t)(void *bfa);251typedef void (*bfa_ioc_hbfail_cbfn_t)(void *bfa);252typedef void (*bfa_ioc_reset_cbfn_t)(void *bfa);253struct bfa_ioc_cbfn_s {254	bfa_ioc_enable_cbfn_t	enable_cbfn;255	bfa_ioc_disable_cbfn_t	disable_cbfn;256	bfa_ioc_hbfail_cbfn_t	hbfail_cbfn;257	bfa_ioc_reset_cbfn_t	reset_cbfn;258};259 260/*261 * IOC event notification mechanism.262 */263enum ioc_event {264	IOC_E_RESET		= 1,	/*  IOC reset request		*/265	IOC_E_ENABLE		= 2,	/*  IOC enable request		*/266	IOC_E_DISABLE		= 3,	/*  IOC disable request	*/267	IOC_E_DETACH		= 4,	/*  driver detach cleanup	*/268	IOC_E_ENABLED		= 5,	/*  f/w enabled		*/269	IOC_E_FWRSP_GETATTR	= 6,	/*  IOC get attribute response	*/270	IOC_E_DISABLED		= 7,	/*  f/w disabled		*/271	IOC_E_PFFAILED		= 8,	/*  failure notice by iocpf sm	*/272	IOC_E_HBFAIL		= 9,	/*  heartbeat failure		*/273	IOC_E_HWERROR		= 10,	/*  hardware error interrupt	*/274	IOC_E_TIMEOUT		= 11,	/*  timeout			*/275	IOC_E_HWFAILED		= 12,	/*  PCI mapping failure notice	*/276};277 278struct bfa_ioc_s;279typedef void (*bfa_ioc_sm_t)(struct bfa_ioc_s *fsm, enum ioc_event);280 281enum bfa_ioc_event_e {282	BFA_IOC_E_ENABLED	= 1,283	BFA_IOC_E_DISABLED	= 2,284	BFA_IOC_E_FAILED	= 3,285};286 287typedef void (*bfa_ioc_notify_cbfn_t)(void *, enum bfa_ioc_event_e);288 289struct bfa_ioc_notify_s {290	struct list_head		qe;291	bfa_ioc_notify_cbfn_t	cbfn;292	void			*cbarg;293};294 295/*296 * Initialize a IOC event notification structure297 */298#define bfa_ioc_notify_init(__notify, __cbfn, __cbarg) do {	\299	(__notify)->cbfn = (__cbfn);      \300	(__notify)->cbarg = (__cbarg);      \301} while (0)302 303/*304 * IOCPF state machine events305 */306enum iocpf_event {307	IOCPF_E_ENABLE		= 1,	/*  IOCPF enable request	*/308	IOCPF_E_DISABLE		= 2,	/*  IOCPF disable request	*/309	IOCPF_E_STOP		= 3,	/*  stop on driver detach	*/310	IOCPF_E_FWREADY		= 4,	/*  f/w initialization done	*/311	IOCPF_E_FWRSP_ENABLE	= 5,	/*  enable f/w response	*/312	IOCPF_E_FWRSP_DISABLE	= 6,	/*  disable f/w response	*/313	IOCPF_E_FAIL		= 7,	/*  failure notice by ioc sm	*/314	IOCPF_E_INITFAIL	= 8,	/*  init fail notice by ioc sm	*/315	IOCPF_E_GETATTRFAIL	= 9,	/*  init fail notice by ioc sm	*/316	IOCPF_E_SEMLOCKED	= 10,	/*  h/w semaphore is locked	*/317	IOCPF_E_TIMEOUT		= 11,	/*  f/w response timeout	*/318	IOCPF_E_SEM_ERROR	= 12,	/*  h/w sem mapping error	*/319};320 321struct bfa_iocpf_s;322typedef void (*bfa_iocpf_sm_t)(struct bfa_iocpf_s *fsm, enum iocpf_event);323 324struct bfa_iocpf_s {325	bfa_iocpf_sm_t		fsm;326	struct bfa_ioc_s	*ioc;327	bfa_boolean_t		fw_mismatch_notified;328	bfa_boolean_t		auto_recover;329	u32			poll_time;330};331 332struct bfa_ioc_s {333	bfa_ioc_sm_t		fsm;334	struct bfa_s		*bfa;335	struct bfa_pcidev_s	pcidev;336	struct bfa_timer_mod_s	*timer_mod;337	struct bfa_timer_s	ioc_timer;338	struct bfa_timer_s	sem_timer;339	struct bfa_timer_s	hb_timer;340	u32		hb_count;341	struct list_head	notify_q;342	void			*dbg_fwsave;343	int			dbg_fwsave_len;344	bfa_boolean_t		dbg_fwsave_once;345	enum bfi_pcifn_class	clscode;346	struct bfa_ioc_regs_s	ioc_regs;347	struct bfa_trc_mod_s	*trcmod;348	struct bfa_ioc_drv_stats_s	stats;349	bfa_boolean_t		fcmode;350	bfa_boolean_t		pllinit;351	bfa_boolean_t		stats_busy;	/*  outstanding stats */352	u8			port_id;353	struct bfa_dma_s	attr_dma;354	struct bfi_ioc_attr_s	*attr;355	struct bfa_ioc_cbfn_s	*cbfn;356	struct bfa_ioc_mbox_mod_s mbox_mod;357	struct bfa_ioc_hwif_s	*ioc_hwif;358	struct bfa_iocpf_s	iocpf;359	enum bfi_asic_gen	asic_gen;360	enum bfi_asic_mode	asic_mode;361	enum bfi_port_mode	port0_mode;362	enum bfi_port_mode	port1_mode;363	enum bfa_mode_s		port_mode;364	u8			ad_cap_bm;	/* adapter cap bit mask */365	u8			port_mode_cfg;	/* config port mode */366	int			ioc_aen_seq;367};368 369struct bfa_ioc_hwif_s {370	bfa_status_t (*ioc_pll_init) (void __iomem *rb, enum bfi_asic_mode m);371	bfa_boolean_t	(*ioc_firmware_lock)	(struct bfa_ioc_s *ioc);372	void		(*ioc_firmware_unlock)	(struct bfa_ioc_s *ioc);373	void		(*ioc_reg_init)	(struct bfa_ioc_s *ioc);374	void		(*ioc_map_port)	(struct bfa_ioc_s *ioc);375	void		(*ioc_isr_mode_set)	(struct bfa_ioc_s *ioc,376					bfa_boolean_t msix);377	void		(*ioc_notify_fail)	(struct bfa_ioc_s *ioc);378	void		(*ioc_ownership_reset)	(struct bfa_ioc_s *ioc);379	bfa_boolean_t   (*ioc_sync_start)       (struct bfa_ioc_s *ioc);380	void		(*ioc_sync_join)	(struct bfa_ioc_s *ioc);381	void		(*ioc_sync_leave)	(struct bfa_ioc_s *ioc);382	void		(*ioc_sync_ack)		(struct bfa_ioc_s *ioc);383	bfa_boolean_t	(*ioc_sync_complete)	(struct bfa_ioc_s *ioc);384	bfa_boolean_t	(*ioc_lpu_read_stat)	(struct bfa_ioc_s *ioc);385	void		(*ioc_set_fwstate)	(struct bfa_ioc_s *ioc,386					enum bfi_ioc_state fwstate);387	enum bfi_ioc_state	(*ioc_get_fwstate)	(struct bfa_ioc_s *ioc);388	void		(*ioc_set_alt_fwstate)	(struct bfa_ioc_s *ioc,389					enum bfi_ioc_state fwstate);390	enum bfi_ioc_state	(*ioc_get_alt_fwstate)	(struct bfa_ioc_s *ioc);391};392 393/*394 * Queue element to wait for room in request queue. FIFO order is395 * maintained when fullfilling requests.396 */397struct bfa_reqq_wait_s {398	struct list_head	qe;399	void	(*qresume) (void *cbarg);400	void	*cbarg;401};402 403typedef void (*bfa_cb_cbfn_t) (void *cbarg, bfa_boolean_t complete);404typedef void (*bfa_cb_cbfn_status_t) (void *cbarg, bfa_status_t status);405 406/*407 * Generic BFA callback element.408 */409struct bfa_cb_qe_s {410	struct list_head	qe;411	union {412		bfa_cb_cbfn_status_t	cbfn_status;413		bfa_cb_cbfn_t		cbfn;414	};415	bfa_boolean_t	once;416	bfa_boolean_t	pre_rmv;	/* set for stack based qe(s) */417	bfa_status_t	fw_status;	/* to access fw status in comp proc */418	void		*cbarg;419};420 421/*422 * ASIC block configurtion related423 */424 425typedef void (*bfa_ablk_cbfn_t)(void *, enum bfa_status);426 427struct bfa_ablk_s {428	struct bfa_ioc_s	*ioc;429	struct bfa_ablk_cfg_s	*cfg;430	u16			*pcifn;431	struct bfa_dma_s	dma_addr;432	bfa_boolean_t		busy;433	struct bfa_mbox_cmd_s	mb;434	bfa_ablk_cbfn_t		cbfn;435	void			*cbarg;436	struct bfa_ioc_notify_s	ioc_notify;437	struct bfa_mem_dma_s	ablk_dma;438};439#define BFA_MEM_ABLK_DMA(__bfa)		(&((__bfa)->modules.ablk.ablk_dma))440 441/*442 *	SFP module specific443 */444typedef void	(*bfa_cb_sfp_t) (void *cbarg, bfa_status_t status);445 446struct bfa_sfp_s {447	void	*dev;448	struct bfa_ioc_s	*ioc;449	struct bfa_trc_mod_s	*trcmod;450	struct sfp_mem_s	*sfpmem;451	bfa_cb_sfp_t		cbfn;452	void			*cbarg;453	enum bfi_sfp_mem_e	memtype; /* mem access type   */454	u32			status;455	struct bfa_mbox_cmd_s	mbcmd;456	u8			*dbuf_kva; /* dma buf virtual address */457	u64			dbuf_pa;   /* dma buf physical address */458	struct bfa_ioc_notify_s	ioc_notify;459	enum bfa_defs_sfp_media_e *media;460	enum bfa_port_speed	portspeed;461	bfa_cb_sfp_t		state_query_cbfn;462	void			*state_query_cbarg;463	u8			lock;464	u8			data_valid; /* data in dbuf is valid */465	u8			state;	    /* sfp state  */466	u8			state_query_lock;467	struct bfa_mem_dma_s	sfp_dma;468	u8			is_elb;	    /* eloopback  */469};470 471#define BFA_SFP_MOD(__bfa)	(&(__bfa)->modules.sfp)472#define BFA_MEM_SFP_DMA(__bfa)	(&(BFA_SFP_MOD(__bfa)->sfp_dma))473 474u32	bfa_sfp_meminfo(void);475 476void	bfa_sfp_attach(struct bfa_sfp_s *sfp, struct bfa_ioc_s *ioc,477			void *dev, struct bfa_trc_mod_s *trcmod);478 479void	bfa_sfp_memclaim(struct bfa_sfp_s *diag, u8 *dm_kva, u64 dm_pa);480void	bfa_sfp_intr(void *bfaarg, struct bfi_mbmsg_s *msg);481 482bfa_status_t	bfa_sfp_show(struct bfa_sfp_s *sfp, struct sfp_mem_s *sfpmem,483			     bfa_cb_sfp_t cbfn, void *cbarg);484 485bfa_status_t	bfa_sfp_media(struct bfa_sfp_s *sfp,486			enum bfa_defs_sfp_media_e *media,487			bfa_cb_sfp_t cbfn, void *cbarg);488 489bfa_status_t	bfa_sfp_speed(struct bfa_sfp_s *sfp,490			enum bfa_port_speed portspeed,491			bfa_cb_sfp_t cbfn, void *cbarg);492 493/*494 *	Flash module specific495 */496typedef void	(*bfa_cb_flash_t) (void *cbarg, bfa_status_t status);497 498struct bfa_flash_s {499	struct bfa_ioc_s *ioc;		/* back pointer to ioc */500	struct bfa_trc_mod_s *trcmod;501	u32		type;           /* partition type */502	u8		instance;       /* partition instance */503	u8		rsv[3];504	u32		op_busy;        /*  operation busy flag */505	u32		residue;        /*  residual length */506	u32		offset;         /*  offset */507	bfa_status_t	status;         /*  status */508	u8		*dbuf_kva;      /*  dma buf virtual address */509	u64		dbuf_pa;        /*  dma buf physical address */510	struct bfa_reqq_wait_s	reqq_wait; /*  to wait for room in reqq */511	bfa_cb_flash_t	cbfn;           /*  user callback function */512	void		*cbarg;         /*  user callback arg */513	u8		*ubuf;          /*  user supplied buffer */514	struct bfa_cb_qe_s	hcb_qe; /*  comp: BFA callback qelem */515	u32		addr_off;       /*  partition address offset */516	struct bfa_mbox_cmd_s	mb;       /*  mailbox */517	struct bfa_ioc_notify_s	ioc_notify; /*  ioc event notify */518	struct bfa_mem_dma_s	flash_dma;519};520 521#define BFA_FLASH(__bfa)		(&(__bfa)->modules.flash)522#define BFA_MEM_FLASH_DMA(__bfa)	(&(BFA_FLASH(__bfa)->flash_dma))523 524bfa_status_t bfa_flash_get_attr(struct bfa_flash_s *flash,525			struct bfa_flash_attr_s *attr,526			bfa_cb_flash_t cbfn, void *cbarg);527bfa_status_t bfa_flash_erase_part(struct bfa_flash_s *flash,528			enum bfa_flash_part_type type, u8 instance,529			bfa_cb_flash_t cbfn, void *cbarg);530bfa_status_t bfa_flash_update_part(struct bfa_flash_s *flash,531			enum bfa_flash_part_type type, u8 instance,532			void *buf, u32 len, u32 offset,533			bfa_cb_flash_t cbfn, void *cbarg);534bfa_status_t bfa_flash_read_part(struct bfa_flash_s *flash,535			enum bfa_flash_part_type type, u8 instance, void *buf,536			u32 len, u32 offset, bfa_cb_flash_t cbfn, void *cbarg);537u32	bfa_flash_meminfo(bfa_boolean_t mincfg);538void bfa_flash_attach(struct bfa_flash_s *flash, struct bfa_ioc_s *ioc,539		void *dev, struct bfa_trc_mod_s *trcmod, bfa_boolean_t mincfg);540void bfa_flash_memclaim(struct bfa_flash_s *flash,541		u8 *dm_kva, u64 dm_pa, bfa_boolean_t mincfg);542bfa_status_t    bfa_flash_raw_read(void __iomem *pci_bar_kva,543				u32 offset, char *buf, u32 len);544 545/*546 *	DIAG module specific547 */548 549typedef void (*bfa_cb_diag_t) (void *cbarg, bfa_status_t status);550typedef void (*bfa_cb_diag_beacon_t) (void *dev, bfa_boolean_t beacon,551			bfa_boolean_t link_e2e_beacon);552 553/*554 *      Firmware ping test results555 */556struct bfa_diag_results_fwping {557	u32     data;   /* store the corrupted data */558	u32     status;559	u32     dmastatus;560	u8      rsvd[4];561};562 563struct bfa_diag_qtest_result_s {564	u32	status;565	u16	count;	/* successful queue test count */566	u8	queue;567	u8	rsvd;	/* 64-bit align */568};569 570/*571 * Firmware ping test results572 */573struct bfa_diag_fwping_s {574	struct bfa_diag_results_fwping *result;575	bfa_cb_diag_t  cbfn;576	void            *cbarg;577	u32             data;578	u8              lock;579	u8              rsv[3];580	u32             status;581	u32             count;582	struct bfa_mbox_cmd_s   mbcmd;583	u8              *dbuf_kva;      /* dma buf virtual address */584	u64             dbuf_pa;        /* dma buf physical address */585};586 587/*588 *      Temperature sensor query results589 */590struct bfa_diag_results_tempsensor_s {591	u32     status;592	u16     temp;           /* 10-bit A/D value */593	u16     brd_temp;       /* 9-bit board temp */594	u8      ts_junc;        /* show junction tempsensor   */595	u8      ts_brd;         /* show board tempsensor      */596	u8      rsvd[6];        /* keep 8 bytes alignment     */597};598 599struct bfa_diag_tsensor_s {600	bfa_cb_diag_t   cbfn;601	void            *cbarg;602	struct bfa_diag_results_tempsensor_s *temp;603	u8              lock;604	u8              rsv[3];605	u32             status;606	struct bfa_mbox_cmd_s   mbcmd;607};608 609struct bfa_diag_sfpshow_s {610	struct sfp_mem_s        *sfpmem;611	bfa_cb_diag_t           cbfn;612	void                    *cbarg;613	u8      lock;614	u8      static_data;615	u8      rsv[2];616	u32     status;617	struct bfa_mbox_cmd_s    mbcmd;618	u8      *dbuf_kva;      /* dma buf virtual address */619	u64     dbuf_pa;        /* dma buf physical address */620};621 622struct bfa_diag_led_s {623	struct bfa_mbox_cmd_s   mbcmd;624	bfa_boolean_t   lock;   /* 1: ledtest is operating */625};626 627struct bfa_diag_beacon_s {628	struct bfa_mbox_cmd_s   mbcmd;629	bfa_boolean_t   state;          /* port beacon state */630	bfa_boolean_t   link_e2e;       /* link beacon state */631};632 633struct bfa_diag_s {634	void	*dev;635	struct bfa_ioc_s		*ioc;636	struct bfa_trc_mod_s		*trcmod;637	struct bfa_diag_fwping_s	fwping;638	struct bfa_diag_tsensor_s	tsensor;639	struct bfa_diag_sfpshow_s	sfpshow;640	struct bfa_diag_led_s		ledtest;641	struct bfa_diag_beacon_s	beacon;642	void	*result;643	struct bfa_timer_s timer;644	bfa_cb_diag_beacon_t  cbfn_beacon;645	bfa_cb_diag_t  cbfn;646	void		*cbarg;647	u8		block;648	u8		timer_active;649	u8		rsvd[2];650	u32		status;651	struct bfa_ioc_notify_s	ioc_notify;652	struct bfa_mem_dma_s	diag_dma;653};654 655#define BFA_DIAG_MOD(__bfa)     (&(__bfa)->modules.diag_mod)656#define BFA_MEM_DIAG_DMA(__bfa) (&(BFA_DIAG_MOD(__bfa)->diag_dma))657 658u32	bfa_diag_meminfo(void);659void bfa_diag_memclaim(struct bfa_diag_s *diag, u8 *dm_kva, u64 dm_pa);660void bfa_diag_attach(struct bfa_diag_s *diag, struct bfa_ioc_s *ioc, void *dev,661		     bfa_cb_diag_beacon_t cbfn_beacon,662		     struct bfa_trc_mod_s *trcmod);663bfa_status_t	bfa_diag_reg_read(struct bfa_diag_s *diag, u32 offset,664			u32 len, u32 *buf, u32 force);665bfa_status_t	bfa_diag_reg_write(struct bfa_diag_s *diag, u32 offset,666			u32 len, u32 value, u32 force);667bfa_status_t	bfa_diag_tsensor_query(struct bfa_diag_s *diag,668			struct bfa_diag_results_tempsensor_s *result,669			bfa_cb_diag_t cbfn, void *cbarg);670bfa_status_t	bfa_diag_fwping(struct bfa_diag_s *diag, u32 cnt,671			u32 pattern, struct bfa_diag_results_fwping *result,672			bfa_cb_diag_t cbfn, void *cbarg);673bfa_status_t	bfa_diag_sfpshow(struct bfa_diag_s *diag,674			struct sfp_mem_s *sfpmem, u8 static_data,675			bfa_cb_diag_t cbfn, void *cbarg);676bfa_status_t	bfa_diag_memtest(struct bfa_diag_s *diag,677			struct bfa_diag_memtest_s *memtest, u32 pattern,678			struct bfa_diag_memtest_result *result,679			bfa_cb_diag_t cbfn, void *cbarg);680bfa_status_t	bfa_diag_ledtest(struct bfa_diag_s *diag,681			struct bfa_diag_ledtest_s *ledtest);682bfa_status_t	bfa_diag_beacon_port(struct bfa_diag_s *diag,683			bfa_boolean_t beacon, bfa_boolean_t link_e2e_beacon,684			u32 sec);685 686/*687 *	PHY module specific688 */689typedef void (*bfa_cb_phy_t) (void *cbarg, bfa_status_t status);690 691struct bfa_phy_s {692	struct bfa_ioc_s *ioc;          /* back pointer to ioc */693	struct bfa_trc_mod_s *trcmod;   /* trace module */694	u8	instance;       /* port instance */695	u8	op_busy;        /* operation busy flag */696	u8	rsv[2];697	u32	residue;        /* residual length */698	u32	offset;         /* offset */699	bfa_status_t	status;         /* status */700	u8	*dbuf_kva;      /* dma buf virtual address */701	u64	dbuf_pa;        /* dma buf physical address */702	struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */703	bfa_cb_phy_t	cbfn;           /* user callback function */704	void		*cbarg;         /* user callback arg */705	u8		*ubuf;          /* user supplied buffer */706	struct bfa_cb_qe_s	hcb_qe; /* comp: BFA callback qelem */707	u32	addr_off;       /* phy address offset */708	struct bfa_mbox_cmd_s	mb;       /* mailbox */709	struct bfa_ioc_notify_s	ioc_notify; /* ioc event notify */710	struct bfa_mem_dma_s	phy_dma;711};712#define BFA_PHY(__bfa)	(&(__bfa)->modules.phy)713#define BFA_MEM_PHY_DMA(__bfa)	(&(BFA_PHY(__bfa)->phy_dma))714 715bfa_boolean_t bfa_phy_busy(struct bfa_ioc_s *ioc);716bfa_status_t bfa_phy_get_attr(struct bfa_phy_s *phy, u8 instance,717			struct bfa_phy_attr_s *attr,718			bfa_cb_phy_t cbfn, void *cbarg);719bfa_status_t bfa_phy_get_stats(struct bfa_phy_s *phy, u8 instance,720			struct bfa_phy_stats_s *stats,721			bfa_cb_phy_t cbfn, void *cbarg);722bfa_status_t bfa_phy_update(struct bfa_phy_s *phy, u8 instance,723			void *buf, u32 len, u32 offset,724			bfa_cb_phy_t cbfn, void *cbarg);725bfa_status_t bfa_phy_read(struct bfa_phy_s *phy, u8 instance,726			void *buf, u32 len, u32 offset,727			bfa_cb_phy_t cbfn, void *cbarg);728 729u32	bfa_phy_meminfo(bfa_boolean_t mincfg);730void bfa_phy_attach(struct bfa_phy_s *phy, struct bfa_ioc_s *ioc,731		void *dev, struct bfa_trc_mod_s *trcmod, bfa_boolean_t mincfg);732void bfa_phy_memclaim(struct bfa_phy_s *phy,733		u8 *dm_kva, u64 dm_pa, bfa_boolean_t mincfg);734void bfa_phy_intr(void *phyarg, struct bfi_mbmsg_s *msg);735 736/*737 * FRU module specific738 */739typedef void (*bfa_cb_fru_t) (void *cbarg, bfa_status_t status);740 741struct bfa_fru_s {742	struct bfa_ioc_s *ioc;		/* back pointer to ioc */743	struct bfa_trc_mod_s *trcmod;	/* trace module */744	u8		op_busy;	/* operation busy flag */745	u8		rsv[3];746	u32		residue;	/* residual length */747	u32		offset;		/* offset */748	bfa_status_t	status;		/* status */749	u8		*dbuf_kva;	/* dma buf virtual address */750	u64		dbuf_pa;	/* dma buf physical address */751	struct bfa_reqq_wait_s reqq_wait; /* to wait for room in reqq */752	bfa_cb_fru_t	cbfn;		/* user callback function */753	void		*cbarg;		/* user callback arg */754	u8		*ubuf;		/* user supplied buffer */755	struct bfa_cb_qe_s	hcb_qe;	/* comp: BFA callback qelem */756	u32		addr_off;	/* fru address offset */757	struct bfa_mbox_cmd_s mb;	/* mailbox */758	struct bfa_ioc_notify_s ioc_notify; /* ioc event notify */759	struct bfa_mem_dma_s	fru_dma;760	u8		trfr_cmpl;761};762 763#define BFA_FRU(__bfa)	(&(__bfa)->modules.fru)764#define BFA_MEM_FRU_DMA(__bfa)	(&(BFA_FRU(__bfa)->fru_dma))765 766bfa_status_t bfa_fruvpd_update(struct bfa_fru_s *fru,767			void *buf, u32 len, u32 offset,768			bfa_cb_fru_t cbfn, void *cbarg, u8 trfr_cmpl);769bfa_status_t bfa_fruvpd_read(struct bfa_fru_s *fru,770			void *buf, u32 len, u32 offset,771			bfa_cb_fru_t cbfn, void *cbarg);772bfa_status_t bfa_fruvpd_get_max_size(struct bfa_fru_s *fru, u32 *max_size);773bfa_status_t bfa_tfru_write(struct bfa_fru_s *fru,774			void *buf, u32 len, u32 offset,775			bfa_cb_fru_t cbfn, void *cbarg);776bfa_status_t bfa_tfru_read(struct bfa_fru_s *fru,777			void *buf, u32 len, u32 offset,778			bfa_cb_fru_t cbfn, void *cbarg);779u32	bfa_fru_meminfo(bfa_boolean_t mincfg);780void bfa_fru_attach(struct bfa_fru_s *fru, struct bfa_ioc_s *ioc,781		void *dev, struct bfa_trc_mod_s *trcmod, bfa_boolean_t mincfg);782void bfa_fru_memclaim(struct bfa_fru_s *fru,783		u8 *dm_kva, u64 dm_pa, bfa_boolean_t mincfg);784void bfa_fru_intr(void *fruarg, struct bfi_mbmsg_s *msg);785 786/*787 * Driver Config( dconf) specific788 */789#define BFI_DCONF_SIGNATURE	0xabcdabcd790#define BFI_DCONF_VERSION	1791 792#pragma pack(1)793struct bfa_dconf_hdr_s {794	u32	signature;795	u32	version;796};797 798struct bfa_dconf_s {799	struct bfa_dconf_hdr_s		hdr;800	struct bfa_lunmask_cfg_s	lun_mask;801	struct bfa_throttle_cfg_s	throttle_cfg;802};803#pragma pack()804 805/*806 * DCONF state machine events807 */808enum bfa_dconf_event {809	BFA_DCONF_SM_INIT		= 1,	/* dconf Init */810	BFA_DCONF_SM_FLASH_COMP		= 2,	/* read/write to flash */811	BFA_DCONF_SM_WR			= 3,	/* binding change, map */812	BFA_DCONF_SM_TIMEOUT		= 4,	/* Start timer */813	BFA_DCONF_SM_EXIT		= 5,	/* exit dconf module */814	BFA_DCONF_SM_IOCDISABLE		= 6,	/* IOC disable event */815};816 817struct bfa_dconf_mod_s;818typedef void (*bfa_dconf_sm_t)(struct bfa_dconf_mod_s *fsm, enum bfa_dconf_event);819 820struct bfa_dconf_mod_s {821	bfa_dconf_sm_t		sm;822	u8			instance;823	bfa_boolean_t		read_data_valid;824	bfa_boolean_t		min_cfg;825	struct bfa_timer_s	timer;826	struct bfa_s		*bfa;827	void			*bfad;828	void			*trcmod;829	struct bfa_dconf_s	*dconf;830	struct bfa_mem_kva_s	kva_seg;831};832 833#define BFA_DCONF_MOD(__bfa)	\834	(&(__bfa)->modules.dconf_mod)835#define BFA_MEM_DCONF_KVA(__bfa)	(&(BFA_DCONF_MOD(__bfa)->kva_seg))836#define bfa_dconf_read_data_valid(__bfa)	\837	(BFA_DCONF_MOD(__bfa)->read_data_valid)838#define BFA_DCONF_UPDATE_TOV	5000	/* memtest timeout in msec */839#define bfa_dconf_get_min_cfg(__bfa)	\840	(BFA_DCONF_MOD(__bfa)->min_cfg)841 842void	bfa_dconf_modinit(struct bfa_s *bfa);843void	bfa_dconf_modexit(struct bfa_s *bfa);844bfa_status_t	bfa_dconf_update(struct bfa_s *bfa);845 846/*847 *	IOC specfic macros848 */849#define bfa_ioc_pcifn(__ioc)		((__ioc)->pcidev.pci_func)850#define bfa_ioc_devid(__ioc)		((__ioc)->pcidev.device_id)851#define bfa_ioc_bar0(__ioc)		((__ioc)->pcidev.pci_bar_kva)852#define bfa_ioc_portid(__ioc)		((__ioc)->port_id)853#define bfa_ioc_asic_gen(__ioc)		((__ioc)->asic_gen)854#define bfa_ioc_is_cna(__ioc)	\855	((bfa_ioc_get_type(__ioc) == BFA_IOC_TYPE_FCoE) ||	\856	 (bfa_ioc_get_type(__ioc) == BFA_IOC_TYPE_LL))857#define bfa_ioc_fetch_stats(__ioc, __stats) \858		(((__stats)->drv_stats) = (__ioc)->stats)859#define bfa_ioc_clr_stats(__ioc)	\860		memset(&(__ioc)->stats, 0, sizeof((__ioc)->stats))861#define bfa_ioc_maxfrsize(__ioc)	((__ioc)->attr->maxfrsize)862#define bfa_ioc_rx_bbcredit(__ioc)	((__ioc)->attr->rx_bbcredit)863#define bfa_ioc_speed_sup(__ioc)	\864	((bfa_ioc_is_cna(__ioc)) ? BFA_PORT_SPEED_10GBPS :	\865	 BFI_ADAPTER_GETP(SPEED, (__ioc)->attr->adapter_prop))866#define bfa_ioc_get_nports(__ioc)	\867	BFI_ADAPTER_GETP(NPORTS, (__ioc)->attr->adapter_prop)868 869#define bfa_ioc_stats(_ioc, _stats)	((_ioc)->stats._stats++)870#define BFA_IOC_FWIMG_MINSZ	(16 * 1024)871#define BFA_IOC_FW_SMEM_SIZE(__ioc)			\872	((bfa_ioc_asic_gen(__ioc) == BFI_ASIC_GEN_CB)	\873	 ? BFI_SMEM_CB_SIZE : BFI_SMEM_CT_SIZE)874#define BFA_IOC_FLASH_CHUNK_NO(off)		(off / BFI_FLASH_CHUNK_SZ_WORDS)875#define BFA_IOC_FLASH_OFFSET_IN_CHUNK(off)	(off % BFI_FLASH_CHUNK_SZ_WORDS)876#define BFA_IOC_FLASH_CHUNK_ADDR(chunkno)  (chunkno * BFI_FLASH_CHUNK_SZ_WORDS)877 878/*879 * IOC mailbox interface880 */881void bfa_ioc_mbox_queue(struct bfa_ioc_s *ioc, struct bfa_mbox_cmd_s *cmd);882void bfa_ioc_mbox_register(struct bfa_ioc_s *ioc,883		bfa_ioc_mbox_mcfunc_t *mcfuncs);884void bfa_ioc_mbox_isr(struct bfa_ioc_s *ioc);885void bfa_ioc_mbox_send(struct bfa_ioc_s *ioc, void *ioc_msg, int len);886bfa_boolean_t bfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg);887void bfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc,888		bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg);889 890/*891 * IOC interfaces892 */893 894#define bfa_ioc_pll_init_asic(__ioc) \895	((__ioc)->ioc_hwif->ioc_pll_init((__ioc)->pcidev.pci_bar_kva, \896			   (__ioc)->asic_mode))897 898bfa_status_t bfa_ioc_pll_init(struct bfa_ioc_s *ioc);899bfa_status_t bfa_ioc_cb_pll_init(void __iomem *rb, enum bfi_asic_mode mode);900bfa_status_t bfa_ioc_ct_pll_init(void __iomem *rb, enum bfi_asic_mode mode);901bfa_status_t bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode mode);902 903#define bfa_ioc_isr_mode_set(__ioc, __msix) do {			\904	if ((__ioc)->ioc_hwif->ioc_isr_mode_set)			\905		((__ioc)->ioc_hwif->ioc_isr_mode_set(__ioc, __msix));	\906} while (0)907#define	bfa_ioc_ownership_reset(__ioc)				\908			((__ioc)->ioc_hwif->ioc_ownership_reset(__ioc))909#define bfa_ioc_get_fcmode(__ioc)	((__ioc)->fcmode)910#define bfa_ioc_lpu_read_stat(__ioc) do {			\911	if ((__ioc)->ioc_hwif->ioc_lpu_read_stat)		\912		((__ioc)->ioc_hwif->ioc_lpu_read_stat(__ioc));	\913} while (0)914 915void bfa_ioc_set_cb_hwif(struct bfa_ioc_s *ioc);916void bfa_ioc_set_ct_hwif(struct bfa_ioc_s *ioc);917void bfa_ioc_set_ct2_hwif(struct bfa_ioc_s *ioc);918void bfa_ioc_ct2_poweron(struct bfa_ioc_s *ioc);919 920void bfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa,921		struct bfa_ioc_cbfn_s *cbfn, struct bfa_timer_mod_s *timer_mod);922void bfa_ioc_auto_recover(bfa_boolean_t auto_recover);923void bfa_ioc_detach(struct bfa_ioc_s *ioc);924void bfa_ioc_suspend(struct bfa_ioc_s *ioc);925void bfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev,926		enum bfi_pcifn_class clscode);927void bfa_ioc_mem_claim(struct bfa_ioc_s *ioc,  u8 *dm_kva, u64 dm_pa);928void bfa_ioc_enable(struct bfa_ioc_s *ioc);929void bfa_ioc_disable(struct bfa_ioc_s *ioc);930bfa_boolean_t bfa_ioc_intx_claim(struct bfa_ioc_s *ioc);931 932bfa_status_t bfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type,933		u32 boot_env);934void bfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *msg);935void bfa_ioc_error_isr(struct bfa_ioc_s *ioc);936bfa_boolean_t bfa_ioc_is_operational(struct bfa_ioc_s *ioc);937bfa_boolean_t bfa_ioc_is_initialized(struct bfa_ioc_s *ioc);938bfa_boolean_t bfa_ioc_is_disabled(struct bfa_ioc_s *ioc);939bfa_boolean_t bfa_ioc_is_acq_addr(struct bfa_ioc_s *ioc);940bfa_boolean_t bfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc);941bfa_boolean_t bfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc);942void bfa_ioc_reset_fwstate(struct bfa_ioc_s *ioc);943enum bfa_ioc_type_e bfa_ioc_get_type(struct bfa_ioc_s *ioc);944void bfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num);945void bfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver);946void bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver);947void bfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model);948void bfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc,949		char *manufacturer);950void bfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev);951enum bfa_ioc_state bfa_ioc_get_state(struct bfa_ioc_s *ioc);952 953void bfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr);954void bfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc,955		struct bfa_adapter_attr_s *ad_attr);956void bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave);957bfa_status_t bfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata,958		int *trclen);959bfa_status_t bfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata,960				 int *trclen);961bfa_status_t bfa_ioc_debug_fwcore(struct bfa_ioc_s *ioc, void *buf,962	u32 *offset, int *buflen);963bfa_status_t bfa_ioc_fwsig_invalidate(struct bfa_ioc_s *ioc);964bfa_boolean_t bfa_ioc_sem_get(void __iomem *sem_reg);965void bfa_ioc_fwver_get(struct bfa_ioc_s *ioc,966			struct bfi_ioc_image_hdr_s *fwhdr);967bfa_boolean_t bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc,968			struct bfi_ioc_image_hdr_s *fwhdr);969void bfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event);970bfa_status_t bfa_ioc_fw_stats_get(struct bfa_ioc_s *ioc, void *stats);971bfa_status_t bfa_ioc_fw_stats_clear(struct bfa_ioc_s *ioc);972void bfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc);973 974/*975 * asic block configuration related APIs976 */977u32	bfa_ablk_meminfo(void);978void bfa_ablk_memclaim(struct bfa_ablk_s *ablk, u8 *dma_kva, u64 dma_pa);979void bfa_ablk_attach(struct bfa_ablk_s *ablk, struct bfa_ioc_s *ioc);980bfa_status_t bfa_ablk_query(struct bfa_ablk_s *ablk,981		struct bfa_ablk_cfg_s *ablk_cfg,982		bfa_ablk_cbfn_t cbfn, void *cbarg);983bfa_status_t bfa_ablk_adapter_config(struct bfa_ablk_s *ablk,984		enum bfa_mode_s mode, int max_pf, int max_vf,985		bfa_ablk_cbfn_t cbfn, void *cbarg);986bfa_status_t bfa_ablk_port_config(struct bfa_ablk_s *ablk, int port,987		enum bfa_mode_s mode, int max_pf, int max_vf,988		bfa_ablk_cbfn_t cbfn, void *cbarg);989bfa_status_t bfa_ablk_pf_create(struct bfa_ablk_s *ablk, u16 *pcifn,990		u8 port, enum bfi_pcifn_class personality,991		u16 bw_min, u16 bw_max, bfa_ablk_cbfn_t cbfn, void *cbarg);992bfa_status_t bfa_ablk_pf_delete(struct bfa_ablk_s *ablk, int pcifn,993		bfa_ablk_cbfn_t cbfn, void *cbarg);994bfa_status_t bfa_ablk_pf_update(struct bfa_ablk_s *ablk, int pcifn,995		u16 bw_min, u16 bw_max, bfa_ablk_cbfn_t cbfn, void *cbarg);996bfa_status_t bfa_ablk_optrom_en(struct bfa_ablk_s *ablk,997		bfa_ablk_cbfn_t cbfn, void *cbarg);998bfa_status_t bfa_ablk_optrom_dis(struct bfa_ablk_s *ablk,999		bfa_ablk_cbfn_t cbfn, void *cbarg);1000 1001bfa_status_t bfa_ioc_flash_img_get_chnk(struct bfa_ioc_s *ioc, u32 off,1002				u32 *fwimg);1003/*1004 * bfa mfg wwn API functions1005 */1006mac_t bfa_ioc_get_mac(struct bfa_ioc_s *ioc);1007mac_t bfa_ioc_get_mfg_mac(struct bfa_ioc_s *ioc);1008 1009/*1010 * F/W Image Size & Chunk1011 */1012extern u32 bfi_image_cb_size;1013extern u32 bfi_image_ct_size;1014extern u32 bfi_image_ct2_size;1015extern u32 *bfi_image_cb;1016extern u32 *bfi_image_ct;1017extern u32 *bfi_image_ct2;1018 1019static inline u32 *1020bfi_image_cb_get_chunk(u32 off)1021{1022	return (u32 *)(bfi_image_cb + off);1023}1024 1025static inline u32 *1026bfi_image_ct_get_chunk(u32 off)1027{1028	return (u32 *)(bfi_image_ct + off);1029}1030 1031static inline u32 *1032bfi_image_ct2_get_chunk(u32 off)1033{1034	return (u32 *)(bfi_image_ct2 + off);1035}1036 1037static inline u32*1038bfa_cb_image_get_chunk(enum bfi_asic_gen asic_gen, u32 off)1039{1040	switch (asic_gen) {1041	case BFI_ASIC_GEN_CB:1042		return bfi_image_cb_get_chunk(off);1043		break;1044	case BFI_ASIC_GEN_CT:1045		return bfi_image_ct_get_chunk(off);1046		break;1047	case BFI_ASIC_GEN_CT2:1048		return bfi_image_ct2_get_chunk(off);1049		break;1050	default:1051		return NULL;1052	}1053}1054 1055static inline u321056bfa_cb_image_get_size(enum bfi_asic_gen asic_gen)1057{1058	switch (asic_gen) {1059	case BFI_ASIC_GEN_CB:1060		return bfi_image_cb_size;1061		break;1062	case BFI_ASIC_GEN_CT:1063		return bfi_image_ct_size;1064		break;1065	case BFI_ASIC_GEN_CT2:1066		return bfi_image_ct2_size;1067		break;1068	default:1069		return 0;1070	}1071}1072 1073/*1074 * CNA TRCMOD declaration1075 */1076/*1077 * !!! Only append to the enums defined here to avoid any versioning1078 * !!! needed between trace utility and driver version1079 */1080enum {1081	BFA_TRC_CNA_PORT	= 1,1082	BFA_TRC_CNA_IOC		= 2,1083	BFA_TRC_CNA_IOC_CB	= 3,1084	BFA_TRC_CNA_IOC_CT	= 4,1085};1086 1087#endif /* __BFA_IOC_H__ */1088