162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Linux network driver for QLogic BR-series Converged Network Adapter.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci/*
662306a36Sopenharmony_ci * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
762306a36Sopenharmony_ci * Copyright (c) 2014-2015 QLogic Corporation
862306a36Sopenharmony_ci * All rights reserved
962306a36Sopenharmony_ci * www.qlogic.com
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci#ifndef __BNAD_H__
1262306a36Sopenharmony_ci#define __BNAD_H__
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include <linux/rtnetlink.h>
1562306a36Sopenharmony_ci#include <linux/workqueue.h>
1662306a36Sopenharmony_ci#include <linux/ipv6.h>
1762306a36Sopenharmony_ci#include <linux/etherdevice.h>
1862306a36Sopenharmony_ci#include <linux/mutex.h>
1962306a36Sopenharmony_ci#include <linux/firmware.h>
2062306a36Sopenharmony_ci#include <linux/if_vlan.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/* Fix for IA64 */
2362306a36Sopenharmony_ci#include <asm/checksum.h>
2462306a36Sopenharmony_ci#include <net/ip6_checksum.h>
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#include <net/ip.h>
2762306a36Sopenharmony_ci#include <net/tcp.h>
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#include "bna.h"
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define BNAD_TXQ_DEPTH		2048
3262306a36Sopenharmony_ci#define BNAD_RXQ_DEPTH		2048
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define BNAD_MAX_TX		1
3562306a36Sopenharmony_ci#define BNAD_MAX_TXQ_PER_TX	8	/* 8 priority queues */
3662306a36Sopenharmony_ci#define BNAD_TXQ_NUM		1
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define BNAD_MAX_RX		1
3962306a36Sopenharmony_ci#define BNAD_MAX_RXP_PER_RX	16
4062306a36Sopenharmony_ci#define BNAD_MAX_RXQ_PER_RXP	2
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/*
4362306a36Sopenharmony_ci * Control structure pointed to ccb->ctrl, which
4462306a36Sopenharmony_ci * determines the NAPI / LRO behavior CCB
4562306a36Sopenharmony_ci * There is 1:1 corres. between ccb & ctrl
4662306a36Sopenharmony_ci */
4762306a36Sopenharmony_cistruct bnad_rx_ctrl {
4862306a36Sopenharmony_ci	struct bna_ccb *ccb;
4962306a36Sopenharmony_ci	struct bnad *bnad;
5062306a36Sopenharmony_ci	unsigned long  flags;
5162306a36Sopenharmony_ci	struct napi_struct	napi;
5262306a36Sopenharmony_ci	u64		rx_intr_ctr;
5362306a36Sopenharmony_ci	u64		rx_poll_ctr;
5462306a36Sopenharmony_ci	u64		rx_schedule;
5562306a36Sopenharmony_ci	u64		rx_keep_poll;
5662306a36Sopenharmony_ci	u64		rx_complete;
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci#define BNAD_RXMODE_PROMISC_DEFAULT	BNA_RXMODE_PROMISC
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/*
6262306a36Sopenharmony_ci * GLOBAL #defines (CONSTANTS)
6362306a36Sopenharmony_ci */
6462306a36Sopenharmony_ci#define BNAD_NAME			"bna"
6562306a36Sopenharmony_ci#define BNAD_NAME_LEN			64
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define BNAD_MAILBOX_MSIX_INDEX		0
6862306a36Sopenharmony_ci#define BNAD_MAILBOX_MSIX_VECTORS	1
6962306a36Sopenharmony_ci#define BNAD_INTX_TX_IB_BITMASK		0x1
7062306a36Sopenharmony_ci#define BNAD_INTX_RX_IB_BITMASK		0x2
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define BNAD_STATS_TIMER_FREQ		1000	/* in msecs */
7362306a36Sopenharmony_ci#define BNAD_DIM_TIMER_FREQ		1000	/* in msecs */
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#define BNAD_IOCETH_TIMEOUT	     10000
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#define BNAD_MIN_Q_DEPTH		512
7862306a36Sopenharmony_ci#define BNAD_MAX_RXQ_DEPTH		16384
7962306a36Sopenharmony_ci#define BNAD_MAX_TXQ_DEPTH		2048
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#define BNAD_JUMBO_MTU			9000
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci#define BNAD_NETIF_WAKE_THRESHOLD	8
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#define BNAD_RXQ_REFILL_THRESHOLD_SHIFT	3
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci/* Bit positions for tcb->flags */
8862306a36Sopenharmony_ci#define BNAD_TXQ_FREE_SENT		0
8962306a36Sopenharmony_ci#define BNAD_TXQ_TX_STARTED		1
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* Bit positions for rcb->flags */
9262306a36Sopenharmony_ci#define BNAD_RXQ_STARTED		0
9362306a36Sopenharmony_ci#define BNAD_RXQ_POST_OK		1
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci/* Resource limits */
9662306a36Sopenharmony_ci#define BNAD_NUM_TXQ			(bnad->num_tx * bnad->num_txq_per_tx)
9762306a36Sopenharmony_ci#define BNAD_NUM_RXP			(bnad->num_rx * bnad->num_rxp_per_rx)
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci#define BNAD_FRAME_SIZE(_mtu) \
10062306a36Sopenharmony_ci	(ETH_HLEN + VLAN_HLEN + (_mtu) + ETH_FCS_LEN)
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci/*
10362306a36Sopenharmony_ci * DATA STRUCTURES
10462306a36Sopenharmony_ci */
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/* enums */
10762306a36Sopenharmony_cienum bnad_intr_source {
10862306a36Sopenharmony_ci	BNAD_INTR_TX		= 1,
10962306a36Sopenharmony_ci	BNAD_INTR_RX		= 2
11062306a36Sopenharmony_ci};
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_cienum bnad_link_state {
11362306a36Sopenharmony_ci	BNAD_LS_DOWN		= 0,
11462306a36Sopenharmony_ci	BNAD_LS_UP		= 1
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistruct bnad_iocmd_comp {
11862306a36Sopenharmony_ci	struct bnad		*bnad;
11962306a36Sopenharmony_ci	struct completion	comp;
12062306a36Sopenharmony_ci	int			comp_status;
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistruct bnad_completion {
12462306a36Sopenharmony_ci	struct completion	ioc_comp;
12562306a36Sopenharmony_ci	struct completion	ucast_comp;
12662306a36Sopenharmony_ci	struct completion	mcast_comp;
12762306a36Sopenharmony_ci	struct completion	tx_comp;
12862306a36Sopenharmony_ci	struct completion	rx_comp;
12962306a36Sopenharmony_ci	struct completion	stats_comp;
13062306a36Sopenharmony_ci	struct completion	enet_comp;
13162306a36Sopenharmony_ci	struct completion	mtu_comp;
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	u8			ioc_comp_status;
13462306a36Sopenharmony_ci	u8			ucast_comp_status;
13562306a36Sopenharmony_ci	u8			mcast_comp_status;
13662306a36Sopenharmony_ci	u8			tx_comp_status;
13762306a36Sopenharmony_ci	u8			rx_comp_status;
13862306a36Sopenharmony_ci	u8			stats_comp_status;
13962306a36Sopenharmony_ci	u8			port_comp_status;
14062306a36Sopenharmony_ci	u8			mtu_comp_status;
14162306a36Sopenharmony_ci};
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci/* Tx Rx Control Stats */
14462306a36Sopenharmony_cistruct bnad_drv_stats {
14562306a36Sopenharmony_ci	u64		netif_queue_stop;
14662306a36Sopenharmony_ci	u64		netif_queue_wakeup;
14762306a36Sopenharmony_ci	u64		netif_queue_stopped;
14862306a36Sopenharmony_ci	u64		tso4;
14962306a36Sopenharmony_ci	u64		tso6;
15062306a36Sopenharmony_ci	u64		tso_err;
15162306a36Sopenharmony_ci	u64		tcpcsum_offload;
15262306a36Sopenharmony_ci	u64		udpcsum_offload;
15362306a36Sopenharmony_ci	u64		csum_help;
15462306a36Sopenharmony_ci	u64		tx_skb_too_short;
15562306a36Sopenharmony_ci	u64		tx_skb_stopping;
15662306a36Sopenharmony_ci	u64		tx_skb_max_vectors;
15762306a36Sopenharmony_ci	u64		tx_skb_mss_too_long;
15862306a36Sopenharmony_ci	u64		tx_skb_tso_too_short;
15962306a36Sopenharmony_ci	u64		tx_skb_tso_prepare;
16062306a36Sopenharmony_ci	u64		tx_skb_non_tso_too_long;
16162306a36Sopenharmony_ci	u64		tx_skb_tcp_hdr;
16262306a36Sopenharmony_ci	u64		tx_skb_udp_hdr;
16362306a36Sopenharmony_ci	u64		tx_skb_csum_err;
16462306a36Sopenharmony_ci	u64		tx_skb_headlen_too_long;
16562306a36Sopenharmony_ci	u64		tx_skb_headlen_zero;
16662306a36Sopenharmony_ci	u64		tx_skb_frag_zero;
16762306a36Sopenharmony_ci	u64		tx_skb_len_mismatch;
16862306a36Sopenharmony_ci	u64		tx_skb_map_failed;
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci	u64		hw_stats_updates;
17162306a36Sopenharmony_ci	u64		netif_rx_dropped;
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci	u64		link_toggle;
17462306a36Sopenharmony_ci	u64		cee_toggle;
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	u64		rxp_info_alloc_failed;
17762306a36Sopenharmony_ci	u64		mbox_intr_disabled;
17862306a36Sopenharmony_ci	u64		mbox_intr_enabled;
17962306a36Sopenharmony_ci	u64		tx_unmap_q_alloc_failed;
18062306a36Sopenharmony_ci	u64		rx_unmap_q_alloc_failed;
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	u64		rxbuf_alloc_failed;
18362306a36Sopenharmony_ci	u64		rxbuf_map_failed;
18462306a36Sopenharmony_ci};
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci/* Complete driver stats */
18762306a36Sopenharmony_cistruct bnad_stats {
18862306a36Sopenharmony_ci	struct bnad_drv_stats drv_stats;
18962306a36Sopenharmony_ci	struct bna_stats *bna_stats;
19062306a36Sopenharmony_ci};
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci/* Tx / Rx Resources */
19362306a36Sopenharmony_cistruct bnad_tx_res_info {
19462306a36Sopenharmony_ci	struct bna_res_info res_info[BNA_TX_RES_T_MAX];
19562306a36Sopenharmony_ci};
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_cistruct bnad_rx_res_info {
19862306a36Sopenharmony_ci	struct bna_res_info res_info[BNA_RX_RES_T_MAX];
19962306a36Sopenharmony_ci};
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistruct bnad_tx_info {
20262306a36Sopenharmony_ci	struct bna_tx *tx; /* 1:1 between tx_info & tx */
20362306a36Sopenharmony_ci	struct bna_tcb *tcb[BNAD_MAX_TXQ_PER_TX];
20462306a36Sopenharmony_ci	u32 tx_id;
20562306a36Sopenharmony_ci	struct delayed_work tx_cleanup_work;
20662306a36Sopenharmony_ci} ____cacheline_aligned;
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_cistruct bnad_rx_info {
20962306a36Sopenharmony_ci	struct bna_rx *rx; /* 1:1 between rx_info & rx */
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci	struct bnad_rx_ctrl rx_ctrl[BNAD_MAX_RXP_PER_RX];
21262306a36Sopenharmony_ci	u32 rx_id;
21362306a36Sopenharmony_ci	struct work_struct rx_cleanup_work;
21462306a36Sopenharmony_ci} ____cacheline_aligned;
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_cistruct bnad_tx_vector {
21762306a36Sopenharmony_ci	DEFINE_DMA_UNMAP_ADDR(dma_addr);
21862306a36Sopenharmony_ci	DEFINE_DMA_UNMAP_LEN(dma_len);
21962306a36Sopenharmony_ci};
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_cistruct bnad_tx_unmap {
22262306a36Sopenharmony_ci	struct sk_buff		*skb;
22362306a36Sopenharmony_ci	u32			nvecs;
22462306a36Sopenharmony_ci	struct bnad_tx_vector	vectors[BFI_TX_MAX_VECTORS_PER_WI];
22562306a36Sopenharmony_ci};
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_cistruct bnad_rx_vector {
22862306a36Sopenharmony_ci	DEFINE_DMA_UNMAP_ADDR(dma_addr);
22962306a36Sopenharmony_ci	u32			len;
23062306a36Sopenharmony_ci};
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_cistruct bnad_rx_unmap {
23362306a36Sopenharmony_ci	struct page		*page;
23462306a36Sopenharmony_ci	struct sk_buff		*skb;
23562306a36Sopenharmony_ci	struct bnad_rx_vector	vector;
23662306a36Sopenharmony_ci	u32			page_offset;
23762306a36Sopenharmony_ci};
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_cienum bnad_rxbuf_type {
24062306a36Sopenharmony_ci	BNAD_RXBUF_NONE		= 0,
24162306a36Sopenharmony_ci	BNAD_RXBUF_SK_BUFF	= 1,
24262306a36Sopenharmony_ci	BNAD_RXBUF_PAGE		= 2,
24362306a36Sopenharmony_ci	BNAD_RXBUF_MULTI_BUFF	= 3
24462306a36Sopenharmony_ci};
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_ci#define BNAD_RXBUF_IS_SK_BUFF(_type)	((_type) == BNAD_RXBUF_SK_BUFF)
24762306a36Sopenharmony_ci#define BNAD_RXBUF_IS_MULTI_BUFF(_type)	((_type) == BNAD_RXBUF_MULTI_BUFF)
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_cistruct bnad_rx_unmap_q {
25062306a36Sopenharmony_ci	int			reuse_pi;
25162306a36Sopenharmony_ci	int			alloc_order;
25262306a36Sopenharmony_ci	u32			map_size;
25362306a36Sopenharmony_ci	enum bnad_rxbuf_type	type;
25462306a36Sopenharmony_ci	struct bnad_rx_unmap	unmap[] ____cacheline_aligned;
25562306a36Sopenharmony_ci};
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci#define BNAD_PCI_DEV_IS_CAT2(_bnad) \
25862306a36Sopenharmony_ci	((_bnad)->pcidev->device == BFA_PCI_DEVICE_ID_CT2)
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci/* Bit mask values for bnad->cfg_flags */
26162306a36Sopenharmony_ci#define	BNAD_CF_DIM_ENABLED		0x01	/* DIM */
26262306a36Sopenharmony_ci#define	BNAD_CF_PROMISC			0x02
26362306a36Sopenharmony_ci#define BNAD_CF_ALLMULTI		0x04
26462306a36Sopenharmony_ci#define	BNAD_CF_DEFAULT			0x08
26562306a36Sopenharmony_ci#define	BNAD_CF_MSIX			0x10	/* If in MSIx mode */
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci/* Defines for run_flags bit-mask */
26862306a36Sopenharmony_ci/* Set, tested & cleared using xxx_bit() functions */
26962306a36Sopenharmony_ci/* Values indicated bit positions */
27062306a36Sopenharmony_ci#define BNAD_RF_CEE_RUNNING		0
27162306a36Sopenharmony_ci#define BNAD_RF_MTU_SET		1
27262306a36Sopenharmony_ci#define BNAD_RF_MBOX_IRQ_DISABLED	2
27362306a36Sopenharmony_ci#define BNAD_RF_NETDEV_REGISTERED	3
27462306a36Sopenharmony_ci#define BNAD_RF_DIM_TIMER_RUNNING	4
27562306a36Sopenharmony_ci#define BNAD_RF_STATS_TIMER_RUNNING	5
27662306a36Sopenharmony_ci#define BNAD_RF_TX_PRIO_SET		6
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_cistruct bnad {
27962306a36Sopenharmony_ci	struct net_device	*netdev;
28062306a36Sopenharmony_ci	u32			id;
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci	/* Data path */
28362306a36Sopenharmony_ci	struct bnad_tx_info tx_info[BNAD_MAX_TX];
28462306a36Sopenharmony_ci	struct bnad_rx_info rx_info[BNAD_MAX_RX];
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
28762306a36Sopenharmony_ci	/*
28862306a36Sopenharmony_ci	 * These q numbers are global only because
28962306a36Sopenharmony_ci	 * they are used to calculate MSIx vectors.
29062306a36Sopenharmony_ci	 * Actually the exact # of queues are per Tx/Rx
29162306a36Sopenharmony_ci	 * object.
29262306a36Sopenharmony_ci	 */
29362306a36Sopenharmony_ci	u32		num_tx;
29462306a36Sopenharmony_ci	u32		num_rx;
29562306a36Sopenharmony_ci	u32		num_txq_per_tx;
29662306a36Sopenharmony_ci	u32		num_rxp_per_rx;
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	u32		txq_depth;
29962306a36Sopenharmony_ci	u32		rxq_depth;
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci	u8			tx_coalescing_timeo;
30262306a36Sopenharmony_ci	u8			rx_coalescing_timeo;
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci	struct bna_rx_config rx_config[BNAD_MAX_RX] ____cacheline_aligned;
30562306a36Sopenharmony_ci	struct bna_tx_config tx_config[BNAD_MAX_TX] ____cacheline_aligned;
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	void __iomem		*bar0;	/* BAR0 address */
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	struct bna bna;
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	u32		cfg_flags;
31262306a36Sopenharmony_ci	unsigned long		run_flags;
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci	struct pci_dev		*pcidev;
31562306a36Sopenharmony_ci	u64		mmio_start;
31662306a36Sopenharmony_ci	u64		mmio_len;
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	u32		msix_num;
31962306a36Sopenharmony_ci	struct msix_entry	*msix_table;
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci	struct mutex		conf_mutex;
32262306a36Sopenharmony_ci	spinlock_t		bna_lock ____cacheline_aligned;
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci	/* Timers */
32562306a36Sopenharmony_ci	struct timer_list	ioc_timer;
32662306a36Sopenharmony_ci	struct timer_list	dim_timer;
32762306a36Sopenharmony_ci	struct timer_list	stats_timer;
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	/* Control path resources, memory & irq */
33062306a36Sopenharmony_ci	struct bna_res_info res_info[BNA_RES_T_MAX];
33162306a36Sopenharmony_ci	struct bna_res_info mod_res_info[BNA_MOD_RES_T_MAX];
33262306a36Sopenharmony_ci	struct bnad_tx_res_info tx_res_info[BNAD_MAX_TX];
33362306a36Sopenharmony_ci	struct bnad_rx_res_info rx_res_info[BNAD_MAX_RX];
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	struct bnad_completion bnad_completions;
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci	/* Burnt in MAC address */
33862306a36Sopenharmony_ci	u8			perm_addr[ETH_ALEN];
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci	struct workqueue_struct *work_q;
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	/* Statistics */
34362306a36Sopenharmony_ci	struct bnad_stats stats;
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	struct bnad_diag *diag;
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci	char			adapter_name[BNAD_NAME_LEN];
34862306a36Sopenharmony_ci	char			port_name[BNAD_NAME_LEN];
34962306a36Sopenharmony_ci	char			mbox_irq_name[BNAD_NAME_LEN];
35062306a36Sopenharmony_ci	char			wq_name[BNAD_NAME_LEN];
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci	/* debugfs specific data */
35362306a36Sopenharmony_ci	char	*regdata;
35462306a36Sopenharmony_ci	u32	reglen;
35562306a36Sopenharmony_ci	struct dentry *bnad_dentry_files[5];
35662306a36Sopenharmony_ci	struct dentry *port_debugfs_root;
35762306a36Sopenharmony_ci};
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_cistruct bnad_drvinfo {
36062306a36Sopenharmony_ci	struct bfa_ioc_attr  ioc_attr;
36162306a36Sopenharmony_ci	struct bfa_cee_attr  cee_attr;
36262306a36Sopenharmony_ci	struct bfa_flash_attr flash_attr;
36362306a36Sopenharmony_ci	u32	cee_status;
36462306a36Sopenharmony_ci	u32	flash_status;
36562306a36Sopenharmony_ci};
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci/*
36862306a36Sopenharmony_ci * EXTERN VARIABLES
36962306a36Sopenharmony_ci */
37062306a36Sopenharmony_ciextern const struct firmware *bfi_fw;
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_ci/*
37362306a36Sopenharmony_ci * EXTERN PROTOTYPES
37462306a36Sopenharmony_ci */
37562306a36Sopenharmony_ciu32 *cna_get_firmware_buf(struct pci_dev *pdev);
37662306a36Sopenharmony_ci/* Netdev entry point prototypes */
37762306a36Sopenharmony_civoid bnad_set_rx_mode(struct net_device *netdev);
37862306a36Sopenharmony_cistruct net_device_stats *bnad_get_netdev_stats(struct net_device *netdev);
37962306a36Sopenharmony_ciint bnad_mac_addr_set_locked(struct bnad *bnad, const u8 *mac_addr);
38062306a36Sopenharmony_ciint bnad_enable_default_bcast(struct bnad *bnad);
38162306a36Sopenharmony_civoid bnad_restore_vlans(struct bnad *bnad, u32 rx_id);
38262306a36Sopenharmony_civoid bnad_set_ethtool_ops(struct net_device *netdev);
38362306a36Sopenharmony_civoid bnad_cb_completion(void *arg, enum bfa_status status);
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci/* Configuration & setup */
38662306a36Sopenharmony_civoid bnad_tx_coalescing_timeo_set(struct bnad *bnad);
38762306a36Sopenharmony_civoid bnad_rx_coalescing_timeo_set(struct bnad *bnad);
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ciint bnad_setup_rx(struct bnad *bnad, u32 rx_id);
39062306a36Sopenharmony_ciint bnad_setup_tx(struct bnad *bnad, u32 tx_id);
39162306a36Sopenharmony_civoid bnad_destroy_tx(struct bnad *bnad, u32 tx_id);
39262306a36Sopenharmony_civoid bnad_destroy_rx(struct bnad *bnad, u32 rx_id);
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci/* Timer start/stop protos */
39562306a36Sopenharmony_civoid bnad_dim_timer_start(struct bnad *bnad);
39662306a36Sopenharmony_ci
39762306a36Sopenharmony_ci/* Statistics */
39862306a36Sopenharmony_civoid bnad_netdev_qstats_fill(struct bnad *bnad,
39962306a36Sopenharmony_ci			     struct rtnl_link_stats64 *stats);
40062306a36Sopenharmony_civoid bnad_netdev_hwstats_fill(struct bnad *bnad,
40162306a36Sopenharmony_ci			      struct rtnl_link_stats64 *stats);
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci/* Debugfs */
40462306a36Sopenharmony_civoid bnad_debugfs_init(struct bnad *bnad);
40562306a36Sopenharmony_civoid bnad_debugfs_uninit(struct bnad *bnad);
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci/* MACROS */
40862306a36Sopenharmony_ci/* To set & get the stats counters */
40962306a36Sopenharmony_ci#define BNAD_UPDATE_CTR(_bnad, _ctr)				\
41062306a36Sopenharmony_ci				(((_bnad)->stats.drv_stats._ctr)++)
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci#define BNAD_GET_CTR(_bnad, _ctr) ((_bnad)->stats.drv_stats._ctr)
41362306a36Sopenharmony_ci
41462306a36Sopenharmony_ci#define bnad_enable_rx_irq_unsafe(_ccb)			\
41562306a36Sopenharmony_ci{							\
41662306a36Sopenharmony_ci	if (likely(test_bit(BNAD_RXQ_STARTED, &(_ccb)->rcb[0]->flags))) {\
41762306a36Sopenharmony_ci		bna_ib_coalescing_timer_set((_ccb)->i_dbell,	\
41862306a36Sopenharmony_ci			(_ccb)->rx_coalescing_timeo);		\
41962306a36Sopenharmony_ci		bna_ib_ack((_ccb)->i_dbell, 0);			\
42062306a36Sopenharmony_ci	}							\
42162306a36Sopenharmony_ci}
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci#endif /* __BNAD_H__ */
424