162306a36Sopenharmony_ci/* bnx2x_sp.h: Qlogic Everest network driver.
262306a36Sopenharmony_ci *
362306a36Sopenharmony_ci * Copyright 2011-2013 Broadcom Corporation
462306a36Sopenharmony_ci * Copyright (c) 2014 QLogic Corporation
562306a36Sopenharmony_ci * All rights reserved
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Unless you and Qlogic execute a separate written software license
862306a36Sopenharmony_ci * agreement governing use of this software, this software is licensed to you
962306a36Sopenharmony_ci * under the terms of the GNU General Public License version 2, available
1062306a36Sopenharmony_ci * at http://www.gnu.org/licenses/gpl-2.0.html (the "GPL").
1162306a36Sopenharmony_ci *
1262306a36Sopenharmony_ci * Notwithstanding the above, under no circumstances may you combine this
1362306a36Sopenharmony_ci * software in any way with any other Qlogic software provided under a
1462306a36Sopenharmony_ci * license other than the GPL, without Qlogic's express prior written
1562306a36Sopenharmony_ci * consent.
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci * Maintained by: Ariel Elior <ariel.elior@qlogic.com>
1862306a36Sopenharmony_ci * Written by: Vladislav Zolotarov
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci */
2162306a36Sopenharmony_ci#ifndef BNX2X_SP_VERBS
2262306a36Sopenharmony_ci#define BNX2X_SP_VERBS
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistruct bnx2x;
2562306a36Sopenharmony_cistruct eth_context;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci/* Bits representing general command's configuration */
2862306a36Sopenharmony_cienum {
2962306a36Sopenharmony_ci	RAMROD_TX,
3062306a36Sopenharmony_ci	RAMROD_RX,
3162306a36Sopenharmony_ci	/* Wait until all pending commands complete */
3262306a36Sopenharmony_ci	RAMROD_COMP_WAIT,
3362306a36Sopenharmony_ci	/* Don't send a ramrod, only update a registry */
3462306a36Sopenharmony_ci	RAMROD_DRV_CLR_ONLY,
3562306a36Sopenharmony_ci	/* Configure HW according to the current object state */
3662306a36Sopenharmony_ci	RAMROD_RESTORE,
3762306a36Sopenharmony_ci	 /* Execute the next command now */
3862306a36Sopenharmony_ci	RAMROD_EXEC,
3962306a36Sopenharmony_ci	/* Don't add a new command and continue execution of postponed
4062306a36Sopenharmony_ci	 * commands. If not set a new command will be added to the
4162306a36Sopenharmony_ci	 * pending commands list.
4262306a36Sopenharmony_ci	 */
4362306a36Sopenharmony_ci	RAMROD_CONT,
4462306a36Sopenharmony_ci	/* If there is another pending ramrod, wait until it finishes and
4562306a36Sopenharmony_ci	 * re-try to submit this one. This flag can be set only in sleepable
4662306a36Sopenharmony_ci	 * context, and should not be set from the context that completes the
4762306a36Sopenharmony_ci	 * ramrods as deadlock will occur.
4862306a36Sopenharmony_ci	 */
4962306a36Sopenharmony_ci	RAMROD_RETRY,
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_citypedef enum {
5362306a36Sopenharmony_ci	BNX2X_OBJ_TYPE_RX,
5462306a36Sopenharmony_ci	BNX2X_OBJ_TYPE_TX,
5562306a36Sopenharmony_ci	BNX2X_OBJ_TYPE_RX_TX,
5662306a36Sopenharmony_ci} bnx2x_obj_type;
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci/* Public slow path states */
5962306a36Sopenharmony_cienum {
6062306a36Sopenharmony_ci	BNX2X_FILTER_MAC_PENDING,
6162306a36Sopenharmony_ci	BNX2X_FILTER_VLAN_PENDING,
6262306a36Sopenharmony_ci	BNX2X_FILTER_VLAN_MAC_PENDING,
6362306a36Sopenharmony_ci	BNX2X_FILTER_RX_MODE_PENDING,
6462306a36Sopenharmony_ci	BNX2X_FILTER_RX_MODE_SCHED,
6562306a36Sopenharmony_ci	BNX2X_FILTER_ISCSI_ETH_START_SCHED,
6662306a36Sopenharmony_ci	BNX2X_FILTER_ISCSI_ETH_STOP_SCHED,
6762306a36Sopenharmony_ci	BNX2X_FILTER_FCOE_ETH_START_SCHED,
6862306a36Sopenharmony_ci	BNX2X_FILTER_FCOE_ETH_STOP_SCHED,
6962306a36Sopenharmony_ci	BNX2X_FILTER_MCAST_PENDING,
7062306a36Sopenharmony_ci	BNX2X_FILTER_MCAST_SCHED,
7162306a36Sopenharmony_ci	BNX2X_FILTER_RSS_CONF_PENDING,
7262306a36Sopenharmony_ci	BNX2X_AFEX_FCOE_Q_UPDATE_PENDING,
7362306a36Sopenharmony_ci	BNX2X_AFEX_PENDING_VIFSET_MCP_ACK
7462306a36Sopenharmony_ci};
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cistruct bnx2x_raw_obj {
7762306a36Sopenharmony_ci	u8		func_id;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	/* Queue params */
8062306a36Sopenharmony_ci	u8		cl_id;
8162306a36Sopenharmony_ci	u32		cid;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	/* Ramrod data buffer params */
8462306a36Sopenharmony_ci	void		*rdata;
8562306a36Sopenharmony_ci	dma_addr_t	rdata_mapping;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	/* Ramrod state params */
8862306a36Sopenharmony_ci	int		state;   /* "ramrod is pending" state bit */
8962306a36Sopenharmony_ci	unsigned long	*pstate; /* pointer to state buffer */
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	bnx2x_obj_type	obj_type;
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	int (*wait_comp)(struct bnx2x *bp,
9462306a36Sopenharmony_ci			 struct bnx2x_raw_obj *o);
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	bool (*check_pending)(struct bnx2x_raw_obj *o);
9762306a36Sopenharmony_ci	void (*clear_pending)(struct bnx2x_raw_obj *o);
9862306a36Sopenharmony_ci	void (*set_pending)(struct bnx2x_raw_obj *o);
9962306a36Sopenharmony_ci};
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci/************************* VLAN-MAC commands related parameters ***************/
10262306a36Sopenharmony_cistruct bnx2x_mac_ramrod_data {
10362306a36Sopenharmony_ci	u8 mac[ETH_ALEN];
10462306a36Sopenharmony_ci	u8 is_inner_mac;
10562306a36Sopenharmony_ci};
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistruct bnx2x_vlan_ramrod_data {
10862306a36Sopenharmony_ci	u16 vlan;
10962306a36Sopenharmony_ci};
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_cistruct bnx2x_vlan_mac_ramrod_data {
11262306a36Sopenharmony_ci	u8 mac[ETH_ALEN];
11362306a36Sopenharmony_ci	u8 is_inner_mac;
11462306a36Sopenharmony_ci	u16 vlan;
11562306a36Sopenharmony_ci};
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ciunion bnx2x_classification_ramrod_data {
11862306a36Sopenharmony_ci	struct bnx2x_mac_ramrod_data mac;
11962306a36Sopenharmony_ci	struct bnx2x_vlan_ramrod_data vlan;
12062306a36Sopenharmony_ci	struct bnx2x_vlan_mac_ramrod_data vlan_mac;
12162306a36Sopenharmony_ci};
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci/* VLAN_MAC commands */
12462306a36Sopenharmony_cienum bnx2x_vlan_mac_cmd {
12562306a36Sopenharmony_ci	BNX2X_VLAN_MAC_ADD,
12662306a36Sopenharmony_ci	BNX2X_VLAN_MAC_DEL,
12762306a36Sopenharmony_ci	BNX2X_VLAN_MAC_MOVE,
12862306a36Sopenharmony_ci};
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_cistruct bnx2x_vlan_mac_data {
13162306a36Sopenharmony_ci	/* Requested command: BNX2X_VLAN_MAC_XX */
13262306a36Sopenharmony_ci	enum bnx2x_vlan_mac_cmd cmd;
13362306a36Sopenharmony_ci	/* used to contain the data related vlan_mac_flags bits from
13462306a36Sopenharmony_ci	 * ramrod parameters.
13562306a36Sopenharmony_ci	 */
13662306a36Sopenharmony_ci	unsigned long vlan_mac_flags;
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	/* Needed for MOVE command */
13962306a36Sopenharmony_ci	struct bnx2x_vlan_mac_obj *target_obj;
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	union bnx2x_classification_ramrod_data u;
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci/*************************** Exe Queue obj ************************************/
14562306a36Sopenharmony_ciunion bnx2x_exe_queue_cmd_data {
14662306a36Sopenharmony_ci	struct bnx2x_vlan_mac_data vlan_mac;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	struct {
14962306a36Sopenharmony_ci		/* TODO */
15062306a36Sopenharmony_ci	} mcast;
15162306a36Sopenharmony_ci};
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistruct bnx2x_exeq_elem {
15462306a36Sopenharmony_ci	struct list_head		link;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci	/* Length of this element in the exe_chunk. */
15762306a36Sopenharmony_ci	int				cmd_len;
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	union bnx2x_exe_queue_cmd_data	cmd_data;
16062306a36Sopenharmony_ci};
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ciunion bnx2x_qable_obj;
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ciunion bnx2x_exeq_comp_elem {
16562306a36Sopenharmony_ci	union event_ring_elem *elem;
16662306a36Sopenharmony_ci};
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_cistruct bnx2x_exe_queue_obj;
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_citypedef int (*exe_q_validate)(struct bnx2x *bp,
17162306a36Sopenharmony_ci			      union bnx2x_qable_obj *o,
17262306a36Sopenharmony_ci			      struct bnx2x_exeq_elem *elem);
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_citypedef int (*exe_q_remove)(struct bnx2x *bp,
17562306a36Sopenharmony_ci			    union bnx2x_qable_obj *o,
17662306a36Sopenharmony_ci			    struct bnx2x_exeq_elem *elem);
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci/* Return positive if entry was optimized, 0 - if not, negative
17962306a36Sopenharmony_ci * in case of an error.
18062306a36Sopenharmony_ci */
18162306a36Sopenharmony_citypedef int (*exe_q_optimize)(struct bnx2x *bp,
18262306a36Sopenharmony_ci			      union bnx2x_qable_obj *o,
18362306a36Sopenharmony_ci			      struct bnx2x_exeq_elem *elem);
18462306a36Sopenharmony_citypedef int (*exe_q_execute)(struct bnx2x *bp,
18562306a36Sopenharmony_ci			     union bnx2x_qable_obj *o,
18662306a36Sopenharmony_ci			     struct list_head *exe_chunk,
18762306a36Sopenharmony_ci			     unsigned long *ramrod_flags);
18862306a36Sopenharmony_citypedef struct bnx2x_exeq_elem *
18962306a36Sopenharmony_ci			(*exe_q_get)(struct bnx2x_exe_queue_obj *o,
19062306a36Sopenharmony_ci				     struct bnx2x_exeq_elem *elem);
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_cistruct bnx2x_exe_queue_obj {
19362306a36Sopenharmony_ci	/* Commands pending for an execution. */
19462306a36Sopenharmony_ci	struct list_head	exe_queue;
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci	/* Commands pending for an completion. */
19762306a36Sopenharmony_ci	struct list_head	pending_comp;
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	spinlock_t		lock;
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	/* Maximum length of commands' list for one execution */
20262306a36Sopenharmony_ci	int			exe_chunk_len;
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	union bnx2x_qable_obj	*owner;
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	/****** Virtual functions ******/
20762306a36Sopenharmony_ci	/**
20862306a36Sopenharmony_ci	 * Called before commands execution for commands that are really
20962306a36Sopenharmony_ci	 * going to be executed (after 'optimize').
21062306a36Sopenharmony_ci	 *
21162306a36Sopenharmony_ci	 * Must run under exe_queue->lock
21262306a36Sopenharmony_ci	 */
21362306a36Sopenharmony_ci	exe_q_validate		validate;
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci	/**
21662306a36Sopenharmony_ci	 * Called before removing pending commands, cleaning allocated
21762306a36Sopenharmony_ci	 * resources (e.g., credits from validate)
21862306a36Sopenharmony_ci	 */
21962306a36Sopenharmony_ci	 exe_q_remove		remove;
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	/**
22262306a36Sopenharmony_ci	 * This will try to cancel the current pending commands list
22362306a36Sopenharmony_ci	 * considering the new command.
22462306a36Sopenharmony_ci	 *
22562306a36Sopenharmony_ci	 * Returns the number of optimized commands or a negative error code
22662306a36Sopenharmony_ci	 *
22762306a36Sopenharmony_ci	 * Must run under exe_queue->lock
22862306a36Sopenharmony_ci	 */
22962306a36Sopenharmony_ci	exe_q_optimize		optimize;
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	/**
23262306a36Sopenharmony_ci	 * Run the next commands chunk (owner specific).
23362306a36Sopenharmony_ci	 */
23462306a36Sopenharmony_ci	exe_q_execute		execute;
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	/**
23762306a36Sopenharmony_ci	 * Return the exe_queue element containing the specific command
23862306a36Sopenharmony_ci	 * if any. Otherwise return NULL.
23962306a36Sopenharmony_ci	 */
24062306a36Sopenharmony_ci	exe_q_get		get;
24162306a36Sopenharmony_ci};
24262306a36Sopenharmony_ci/***************** Classification verbs: Set/Del MAC/VLAN/VLAN-MAC ************/
24362306a36Sopenharmony_ci/*
24462306a36Sopenharmony_ci * Element in the VLAN_MAC registry list having all currently configured
24562306a36Sopenharmony_ci * rules.
24662306a36Sopenharmony_ci */
24762306a36Sopenharmony_cistruct bnx2x_vlan_mac_registry_elem {
24862306a36Sopenharmony_ci	struct list_head	link;
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	/* Used to store the cam offset used for the mac/vlan/vlan-mac.
25162306a36Sopenharmony_ci	 * Relevant for 57710 and 57711 only. VLANs and MACs share the
25262306a36Sopenharmony_ci	 * same CAM for these chips.
25362306a36Sopenharmony_ci	 */
25462306a36Sopenharmony_ci	int			cam_offset;
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci	/* Needed for DEL and RESTORE flows */
25762306a36Sopenharmony_ci	unsigned long		vlan_mac_flags;
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	union bnx2x_classification_ramrod_data u;
26062306a36Sopenharmony_ci};
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci/* Bits representing VLAN_MAC commands specific flags */
26362306a36Sopenharmony_cienum {
26462306a36Sopenharmony_ci	BNX2X_UC_LIST_MAC,
26562306a36Sopenharmony_ci	BNX2X_ETH_MAC,
26662306a36Sopenharmony_ci	BNX2X_ISCSI_ETH_MAC,
26762306a36Sopenharmony_ci	BNX2X_NETQ_ETH_MAC,
26862306a36Sopenharmony_ci	BNX2X_VLAN,
26962306a36Sopenharmony_ci	BNX2X_DONT_CONSUME_CAM_CREDIT,
27062306a36Sopenharmony_ci	BNX2X_DONT_CONSUME_CAM_CREDIT_DEST,
27162306a36Sopenharmony_ci};
27262306a36Sopenharmony_ci/* When looking for matching filters, some flags are not interesting */
27362306a36Sopenharmony_ci#define BNX2X_VLAN_MAC_CMP_MASK	(1 << BNX2X_UC_LIST_MAC | \
27462306a36Sopenharmony_ci				 1 << BNX2X_ETH_MAC | \
27562306a36Sopenharmony_ci				 1 << BNX2X_ISCSI_ETH_MAC | \
27662306a36Sopenharmony_ci				 1 << BNX2X_NETQ_ETH_MAC | \
27762306a36Sopenharmony_ci				 1 << BNX2X_VLAN)
27862306a36Sopenharmony_ci#define BNX2X_VLAN_MAC_CMP_FLAGS(flags) \
27962306a36Sopenharmony_ci	((flags) & BNX2X_VLAN_MAC_CMP_MASK)
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_cistruct bnx2x_vlan_mac_ramrod_params {
28262306a36Sopenharmony_ci	/* Object to run the command from */
28362306a36Sopenharmony_ci	struct bnx2x_vlan_mac_obj *vlan_mac_obj;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	/* General command flags: COMP_WAIT, etc. */
28662306a36Sopenharmony_ci	unsigned long ramrod_flags;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	/* Command specific configuration request */
28962306a36Sopenharmony_ci	struct bnx2x_vlan_mac_data user_req;
29062306a36Sopenharmony_ci};
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cistruct bnx2x_vlan_mac_obj {
29362306a36Sopenharmony_ci	struct bnx2x_raw_obj raw;
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci	/* Bookkeeping list: will prevent the addition of already existing
29662306a36Sopenharmony_ci	 * entries.
29762306a36Sopenharmony_ci	 */
29862306a36Sopenharmony_ci	struct list_head		head;
29962306a36Sopenharmony_ci	/* Implement a simple reader/writer lock on the head list.
30062306a36Sopenharmony_ci	 * all these fields should only be accessed under the exe_queue lock
30162306a36Sopenharmony_ci	 */
30262306a36Sopenharmony_ci	u8		head_reader; /* Num. of readers accessing head list */
30362306a36Sopenharmony_ci	bool		head_exe_request; /* Pending execution request. */
30462306a36Sopenharmony_ci	unsigned long	saved_ramrod_flags; /* Ramrods of pending execution */
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	/* TODO: Add it's initialization in the init functions */
30762306a36Sopenharmony_ci	struct bnx2x_exe_queue_obj	exe_queue;
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci	/* MACs credit pool */
31062306a36Sopenharmony_ci	struct bnx2x_credit_pool_obj	*macs_pool;
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	/* VLANs credit pool */
31362306a36Sopenharmony_ci	struct bnx2x_credit_pool_obj	*vlans_pool;
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci	/* RAMROD command to be used */
31662306a36Sopenharmony_ci	int				ramrod_cmd;
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	/* copy first n elements onto preallocated buffer
31962306a36Sopenharmony_ci	 *
32062306a36Sopenharmony_ci	 * @param n number of elements to get
32162306a36Sopenharmony_ci	 * @param buf buffer preallocated by caller into which elements
32262306a36Sopenharmony_ci	 *            will be copied. Note elements are 4-byte aligned
32362306a36Sopenharmony_ci	 *            so buffer size must be able to accommodate the
32462306a36Sopenharmony_ci	 *            aligned elements.
32562306a36Sopenharmony_ci	 *
32662306a36Sopenharmony_ci	 * @return number of copied bytes
32762306a36Sopenharmony_ci	 */
32862306a36Sopenharmony_ci	int (*get_n_elements)(struct bnx2x *bp,
32962306a36Sopenharmony_ci			      struct bnx2x_vlan_mac_obj *o, int n, u8 *base,
33062306a36Sopenharmony_ci			      u8 stride, u8 size);
33162306a36Sopenharmony_ci
33262306a36Sopenharmony_ci	/**
33362306a36Sopenharmony_ci	 * Checks if ADD-ramrod with the given params may be performed.
33462306a36Sopenharmony_ci	 *
33562306a36Sopenharmony_ci	 * @return zero if the element may be added
33662306a36Sopenharmony_ci	 */
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	int (*check_add)(struct bnx2x *bp,
33962306a36Sopenharmony_ci			 struct bnx2x_vlan_mac_obj *o,
34062306a36Sopenharmony_ci			 union bnx2x_classification_ramrod_data *data);
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	/**
34362306a36Sopenharmony_ci	 * Checks if DEL-ramrod with the given params may be performed.
34462306a36Sopenharmony_ci	 *
34562306a36Sopenharmony_ci	 * @return true if the element may be deleted
34662306a36Sopenharmony_ci	 */
34762306a36Sopenharmony_ci	struct bnx2x_vlan_mac_registry_elem *
34862306a36Sopenharmony_ci		(*check_del)(struct bnx2x *bp,
34962306a36Sopenharmony_ci			     struct bnx2x_vlan_mac_obj *o,
35062306a36Sopenharmony_ci			     union bnx2x_classification_ramrod_data *data);
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci	/**
35362306a36Sopenharmony_ci	 * Checks if DEL-ramrod with the given params may be performed.
35462306a36Sopenharmony_ci	 *
35562306a36Sopenharmony_ci	 * @return true if the element may be deleted
35662306a36Sopenharmony_ci	 */
35762306a36Sopenharmony_ci	bool (*check_move)(struct bnx2x *bp,
35862306a36Sopenharmony_ci			   struct bnx2x_vlan_mac_obj *src_o,
35962306a36Sopenharmony_ci			   struct bnx2x_vlan_mac_obj *dst_o,
36062306a36Sopenharmony_ci			   union bnx2x_classification_ramrod_data *data);
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci	/**
36362306a36Sopenharmony_ci	 *  Update the relevant credit object(s) (consume/return
36462306a36Sopenharmony_ci	 *  correspondingly).
36562306a36Sopenharmony_ci	 */
36662306a36Sopenharmony_ci	bool (*get_credit)(struct bnx2x_vlan_mac_obj *o);
36762306a36Sopenharmony_ci	bool (*put_credit)(struct bnx2x_vlan_mac_obj *o);
36862306a36Sopenharmony_ci	bool (*get_cam_offset)(struct bnx2x_vlan_mac_obj *o, int *offset);
36962306a36Sopenharmony_ci	bool (*put_cam_offset)(struct bnx2x_vlan_mac_obj *o, int offset);
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci	/**
37262306a36Sopenharmony_ci	 * Configures one rule in the ramrod data buffer.
37362306a36Sopenharmony_ci	 */
37462306a36Sopenharmony_ci	void (*set_one_rule)(struct bnx2x *bp,
37562306a36Sopenharmony_ci			     struct bnx2x_vlan_mac_obj *o,
37662306a36Sopenharmony_ci			     struct bnx2x_exeq_elem *elem, int rule_idx,
37762306a36Sopenharmony_ci			     int cam_offset);
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ci	/**
38062306a36Sopenharmony_ci	*  Delete all configured elements having the given
38162306a36Sopenharmony_ci	*  vlan_mac_flags specification. Assumes no pending for
38262306a36Sopenharmony_ci	*  execution commands. Will schedule all all currently
38362306a36Sopenharmony_ci	*  configured MACs/VLANs/VLAN-MACs matching the vlan_mac_flags
38462306a36Sopenharmony_ci	*  specification for deletion and will use the given
38562306a36Sopenharmony_ci	*  ramrod_flags for the last DEL operation.
38662306a36Sopenharmony_ci	 *
38762306a36Sopenharmony_ci	 * @param bp
38862306a36Sopenharmony_ci	 * @param o
38962306a36Sopenharmony_ci	 * @param ramrod_flags RAMROD_XX flags
39062306a36Sopenharmony_ci	 *
39162306a36Sopenharmony_ci	 * @return 0 if the last operation has completed successfully
39262306a36Sopenharmony_ci	 *         and there are no more elements left, positive value
39362306a36Sopenharmony_ci	 *         if there are pending for completion commands,
39462306a36Sopenharmony_ci	 *         negative value in case of failure.
39562306a36Sopenharmony_ci	 */
39662306a36Sopenharmony_ci	int (*delete_all)(struct bnx2x *bp,
39762306a36Sopenharmony_ci			  struct bnx2x_vlan_mac_obj *o,
39862306a36Sopenharmony_ci			  unsigned long *vlan_mac_flags,
39962306a36Sopenharmony_ci			  unsigned long *ramrod_flags);
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci	/**
40262306a36Sopenharmony_ci	 * Reconfigures the next MAC/VLAN/VLAN-MAC element from the previously
40362306a36Sopenharmony_ci	 * configured elements list.
40462306a36Sopenharmony_ci	 *
40562306a36Sopenharmony_ci	 * @param bp
40662306a36Sopenharmony_ci	 * @param p Command parameters (RAMROD_COMP_WAIT bit in
40762306a36Sopenharmony_ci	 *          ramrod_flags is only taken into an account)
40862306a36Sopenharmony_ci	 * @param ppos a pointer to the cookie that should be given back in the
40962306a36Sopenharmony_ci	 *        next call to make function handle the next element. If
41062306a36Sopenharmony_ci	 *        *ppos is set to NULL it will restart the iterator.
41162306a36Sopenharmony_ci	 *        If returned *ppos == NULL this means that the last
41262306a36Sopenharmony_ci	 *        element has been handled.
41362306a36Sopenharmony_ci	 *
41462306a36Sopenharmony_ci	 * @return int
41562306a36Sopenharmony_ci	 */
41662306a36Sopenharmony_ci	int (*restore)(struct bnx2x *bp,
41762306a36Sopenharmony_ci		       struct bnx2x_vlan_mac_ramrod_params *p,
41862306a36Sopenharmony_ci		       struct bnx2x_vlan_mac_registry_elem **ppos);
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_ci	/**
42162306a36Sopenharmony_ci	 * Should be called on a completion arrival.
42262306a36Sopenharmony_ci	 *
42362306a36Sopenharmony_ci	 * @param bp
42462306a36Sopenharmony_ci	 * @param o
42562306a36Sopenharmony_ci	 * @param cqe Completion element we are handling
42662306a36Sopenharmony_ci	 * @param ramrod_flags if RAMROD_CONT is set the next bulk of
42762306a36Sopenharmony_ci	 *		       pending commands will be executed.
42862306a36Sopenharmony_ci	 *		       RAMROD_DRV_CLR_ONLY and RAMROD_RESTORE
42962306a36Sopenharmony_ci	 *		       may also be set if needed.
43062306a36Sopenharmony_ci	 *
43162306a36Sopenharmony_ci	 * @return 0 if there are neither pending nor waiting for
43262306a36Sopenharmony_ci	 *         completion commands. Positive value if there are
43362306a36Sopenharmony_ci	 *         pending for execution or for completion commands.
43462306a36Sopenharmony_ci	 *         Negative value in case of an error (including an
43562306a36Sopenharmony_ci	 *         error in the cqe).
43662306a36Sopenharmony_ci	 */
43762306a36Sopenharmony_ci	int (*complete)(struct bnx2x *bp, struct bnx2x_vlan_mac_obj *o,
43862306a36Sopenharmony_ci			union event_ring_elem *cqe,
43962306a36Sopenharmony_ci			unsigned long *ramrod_flags);
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci	/**
44262306a36Sopenharmony_ci	 * Wait for completion of all commands. Don't schedule new ones,
44362306a36Sopenharmony_ci	 * just wait. It assumes that the completion code will schedule
44462306a36Sopenharmony_ci	 * for new commands.
44562306a36Sopenharmony_ci	 */
44662306a36Sopenharmony_ci	int (*wait)(struct bnx2x *bp, struct bnx2x_vlan_mac_obj *o);
44762306a36Sopenharmony_ci};
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_cienum {
45062306a36Sopenharmony_ci	BNX2X_LLH_CAM_ISCSI_ETH_LINE = 0,
45162306a36Sopenharmony_ci	BNX2X_LLH_CAM_ETH_LINE,
45262306a36Sopenharmony_ci	BNX2X_LLH_CAM_MAX_PF_LINE = NIG_REG_LLH1_FUNC_MEM_SIZE / 2
45362306a36Sopenharmony_ci};
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_ci/** RX_MODE verbs:DROP_ALL/ACCEPT_ALL/ACCEPT_ALL_MULTI/ACCEPT_ALL_VLAN/NORMAL */
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ci/* RX_MODE ramrod special flags: set in rx_mode_flags field in
45862306a36Sopenharmony_ci * a bnx2x_rx_mode_ramrod_params.
45962306a36Sopenharmony_ci */
46062306a36Sopenharmony_cienum {
46162306a36Sopenharmony_ci	BNX2X_RX_MODE_FCOE_ETH,
46262306a36Sopenharmony_ci	BNX2X_RX_MODE_ISCSI_ETH,
46362306a36Sopenharmony_ci};
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_cienum {
46662306a36Sopenharmony_ci	BNX2X_ACCEPT_UNICAST,
46762306a36Sopenharmony_ci	BNX2X_ACCEPT_MULTICAST,
46862306a36Sopenharmony_ci	BNX2X_ACCEPT_ALL_UNICAST,
46962306a36Sopenharmony_ci	BNX2X_ACCEPT_ALL_MULTICAST,
47062306a36Sopenharmony_ci	BNX2X_ACCEPT_BROADCAST,
47162306a36Sopenharmony_ci	BNX2X_ACCEPT_UNMATCHED,
47262306a36Sopenharmony_ci	BNX2X_ACCEPT_ANY_VLAN
47362306a36Sopenharmony_ci};
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_cistruct bnx2x_rx_mode_ramrod_params {
47662306a36Sopenharmony_ci	struct bnx2x_rx_mode_obj *rx_mode_obj;
47762306a36Sopenharmony_ci	unsigned long *pstate;
47862306a36Sopenharmony_ci	int state;
47962306a36Sopenharmony_ci	u8 cl_id;
48062306a36Sopenharmony_ci	u32 cid;
48162306a36Sopenharmony_ci	u8 func_id;
48262306a36Sopenharmony_ci	unsigned long ramrod_flags;
48362306a36Sopenharmony_ci	unsigned long rx_mode_flags;
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci	/* rdata is either a pointer to eth_filter_rules_ramrod_data(e2) or to
48662306a36Sopenharmony_ci	 * a tstorm_eth_mac_filter_config (e1x).
48762306a36Sopenharmony_ci	 */
48862306a36Sopenharmony_ci	void *rdata;
48962306a36Sopenharmony_ci	dma_addr_t rdata_mapping;
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci	/* Rx mode settings */
49262306a36Sopenharmony_ci	unsigned long rx_accept_flags;
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci	/* internal switching settings */
49562306a36Sopenharmony_ci	unsigned long tx_accept_flags;
49662306a36Sopenharmony_ci};
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_cistruct bnx2x_rx_mode_obj {
49962306a36Sopenharmony_ci	int (*config_rx_mode)(struct bnx2x *bp,
50062306a36Sopenharmony_ci			      struct bnx2x_rx_mode_ramrod_params *p);
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci	int (*wait_comp)(struct bnx2x *bp,
50362306a36Sopenharmony_ci			 struct bnx2x_rx_mode_ramrod_params *p);
50462306a36Sopenharmony_ci};
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ci/********************** Set multicast group ***********************************/
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_cistruct bnx2x_mcast_list_elem {
50962306a36Sopenharmony_ci	struct list_head link;
51062306a36Sopenharmony_ci	u8 *mac;
51162306a36Sopenharmony_ci};
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ciunion bnx2x_mcast_config_data {
51462306a36Sopenharmony_ci	u8 *mac;
51562306a36Sopenharmony_ci	u8 bin; /* used in a RESTORE flow */
51662306a36Sopenharmony_ci};
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_cistruct bnx2x_mcast_ramrod_params {
51962306a36Sopenharmony_ci	struct bnx2x_mcast_obj *mcast_obj;
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci	/* Relevant options are RAMROD_COMP_WAIT and RAMROD_DRV_CLR_ONLY */
52262306a36Sopenharmony_ci	unsigned long ramrod_flags;
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci	struct list_head mcast_list; /* list of struct bnx2x_mcast_list_elem */
52562306a36Sopenharmony_ci	/** TODO:
52662306a36Sopenharmony_ci	 *      - rename it to macs_num.
52762306a36Sopenharmony_ci	 *      - Add a new command type for handling pending commands
52862306a36Sopenharmony_ci	 *        (remove "zero semantics").
52962306a36Sopenharmony_ci	 *
53062306a36Sopenharmony_ci	 *  Length of mcast_list. If zero and ADD_CONT command - post
53162306a36Sopenharmony_ci	 *  pending commands.
53262306a36Sopenharmony_ci	 */
53362306a36Sopenharmony_ci	int mcast_list_len;
53462306a36Sopenharmony_ci};
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_cienum bnx2x_mcast_cmd {
53762306a36Sopenharmony_ci	BNX2X_MCAST_CMD_ADD,
53862306a36Sopenharmony_ci	BNX2X_MCAST_CMD_CONT,
53962306a36Sopenharmony_ci	BNX2X_MCAST_CMD_DEL,
54062306a36Sopenharmony_ci	BNX2X_MCAST_CMD_RESTORE,
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_ci	/* Following this, multicast configuration should equal to approx
54362306a36Sopenharmony_ci	 * the set of MACs provided [i.e., remove all else].
54462306a36Sopenharmony_ci	 * The two sub-commands are used internally to decide whether a given
54562306a36Sopenharmony_ci	 * bin is to be added or removed
54662306a36Sopenharmony_ci	 */
54762306a36Sopenharmony_ci	BNX2X_MCAST_CMD_SET,
54862306a36Sopenharmony_ci	BNX2X_MCAST_CMD_SET_ADD,
54962306a36Sopenharmony_ci	BNX2X_MCAST_CMD_SET_DEL,
55062306a36Sopenharmony_ci};
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_cistruct bnx2x_mcast_obj {
55362306a36Sopenharmony_ci	struct bnx2x_raw_obj raw;
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_ci	union {
55662306a36Sopenharmony_ci		struct {
55762306a36Sopenharmony_ci		#define BNX2X_MCAST_BINS_NUM	256
55862306a36Sopenharmony_ci		#define BNX2X_MCAST_VEC_SZ	(BNX2X_MCAST_BINS_NUM / 64)
55962306a36Sopenharmony_ci			u64 vec[BNX2X_MCAST_VEC_SZ];
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci			/** Number of BINs to clear. Should be updated
56262306a36Sopenharmony_ci			 *  immediately when a command arrives in order to
56362306a36Sopenharmony_ci			 *  properly create DEL commands.
56462306a36Sopenharmony_ci			 */
56562306a36Sopenharmony_ci			int num_bins_set;
56662306a36Sopenharmony_ci		} aprox_match;
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_ci		struct {
56962306a36Sopenharmony_ci			struct list_head macs;
57062306a36Sopenharmony_ci			int num_macs_set;
57162306a36Sopenharmony_ci		} exact_match;
57262306a36Sopenharmony_ci	} registry;
57362306a36Sopenharmony_ci
57462306a36Sopenharmony_ci	/* Pending commands */
57562306a36Sopenharmony_ci	struct list_head pending_cmds_head;
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci	/* A state that is set in raw.pstate, when there are pending commands */
57862306a36Sopenharmony_ci	int sched_state;
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ci	/* Maximal number of mcast MACs configured in one command */
58162306a36Sopenharmony_ci	int max_cmd_len;
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci	/* Total number of currently pending MACs to configure: both
58462306a36Sopenharmony_ci	 * in the pending commands list and in the current command.
58562306a36Sopenharmony_ci	 */
58662306a36Sopenharmony_ci	int total_pending_num;
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_ci	u8 engine_id;
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ci	/**
59162306a36Sopenharmony_ci	 * @param cmd command to execute (BNX2X_MCAST_CMD_X, see above)
59262306a36Sopenharmony_ci	 */
59362306a36Sopenharmony_ci	int (*config_mcast)(struct bnx2x *bp,
59462306a36Sopenharmony_ci			    struct bnx2x_mcast_ramrod_params *p,
59562306a36Sopenharmony_ci			    enum bnx2x_mcast_cmd cmd);
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci	/**
59862306a36Sopenharmony_ci	 * Fills the ramrod data during the RESTORE flow.
59962306a36Sopenharmony_ci	 *
60062306a36Sopenharmony_ci	 * @param bp
60162306a36Sopenharmony_ci	 * @param o
60262306a36Sopenharmony_ci	 * @param start_idx Registry index to start from
60362306a36Sopenharmony_ci	 * @param rdata_idx Index in the ramrod data to start from
60462306a36Sopenharmony_ci	 *
60562306a36Sopenharmony_ci	 * @return -1 if we handled the whole registry or index of the last
60662306a36Sopenharmony_ci	 *         handled registry element.
60762306a36Sopenharmony_ci	 */
60862306a36Sopenharmony_ci	int (*hdl_restore)(struct bnx2x *bp, struct bnx2x_mcast_obj *o,
60962306a36Sopenharmony_ci			   int start_bin, int *rdata_idx);
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ci	int (*enqueue_cmd)(struct bnx2x *bp, struct bnx2x_mcast_obj *o,
61262306a36Sopenharmony_ci			   struct bnx2x_mcast_ramrod_params *p,
61362306a36Sopenharmony_ci			   enum bnx2x_mcast_cmd cmd);
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci	void (*set_one_rule)(struct bnx2x *bp,
61662306a36Sopenharmony_ci			     struct bnx2x_mcast_obj *o, int idx,
61762306a36Sopenharmony_ci			     union bnx2x_mcast_config_data *cfg_data,
61862306a36Sopenharmony_ci			     enum bnx2x_mcast_cmd cmd);
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	/** Checks if there are more mcast MACs to be set or a previous
62162306a36Sopenharmony_ci	 *  command is still pending.
62262306a36Sopenharmony_ci	 */
62362306a36Sopenharmony_ci	bool (*check_pending)(struct bnx2x_mcast_obj *o);
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_ci	/**
62662306a36Sopenharmony_ci	 * Set/Clear/Check SCHEDULED state of the object
62762306a36Sopenharmony_ci	 */
62862306a36Sopenharmony_ci	void (*set_sched)(struct bnx2x_mcast_obj *o);
62962306a36Sopenharmony_ci	void (*clear_sched)(struct bnx2x_mcast_obj *o);
63062306a36Sopenharmony_ci	bool (*check_sched)(struct bnx2x_mcast_obj *o);
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci	/* Wait until all pending commands complete */
63362306a36Sopenharmony_ci	int (*wait_comp)(struct bnx2x *bp, struct bnx2x_mcast_obj *o);
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci	/**
63662306a36Sopenharmony_ci	 * Handle the internal object counters needed for proper
63762306a36Sopenharmony_ci	 * commands handling. Checks that the provided parameters are
63862306a36Sopenharmony_ci	 * feasible.
63962306a36Sopenharmony_ci	 */
64062306a36Sopenharmony_ci	int (*validate)(struct bnx2x *bp,
64162306a36Sopenharmony_ci			struct bnx2x_mcast_ramrod_params *p,
64262306a36Sopenharmony_ci			enum bnx2x_mcast_cmd cmd);
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_ci	/**
64562306a36Sopenharmony_ci	 * Restore the values of internal counters in case of a failure.
64662306a36Sopenharmony_ci	 */
64762306a36Sopenharmony_ci	void (*revert)(struct bnx2x *bp,
64862306a36Sopenharmony_ci		       struct bnx2x_mcast_ramrod_params *p,
64962306a36Sopenharmony_ci		       int old_num_bins,
65062306a36Sopenharmony_ci		       enum bnx2x_mcast_cmd cmd);
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ci	int (*get_registry_size)(struct bnx2x_mcast_obj *o);
65362306a36Sopenharmony_ci	void (*set_registry_size)(struct bnx2x_mcast_obj *o, int n);
65462306a36Sopenharmony_ci};
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ci/*************************** Credit handling **********************************/
65762306a36Sopenharmony_cistruct bnx2x_credit_pool_obj {
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ci	/* Current amount of credit in the pool */
66062306a36Sopenharmony_ci	atomic_t	credit;
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ci	/* Maximum allowed credit. put() will check against it. */
66362306a36Sopenharmony_ci	int		pool_sz;
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_ci	/* Allocate a pool table statically.
66662306a36Sopenharmony_ci	 *
66762306a36Sopenharmony_ci	 * Currently the maximum allowed size is MAX_MAC_CREDIT_E2(272)
66862306a36Sopenharmony_ci	 *
66962306a36Sopenharmony_ci	 * The set bit in the table will mean that the entry is available.
67062306a36Sopenharmony_ci	 */
67162306a36Sopenharmony_ci#define BNX2X_POOL_VEC_SIZE	(MAX_MAC_CREDIT_E2 / 64)
67262306a36Sopenharmony_ci	u64		pool_mirror[BNX2X_POOL_VEC_SIZE];
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci	/* Base pool offset (initialized differently */
67562306a36Sopenharmony_ci	int		base_pool_offset;
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_ci	/**
67862306a36Sopenharmony_ci	 * Get the next free pool entry.
67962306a36Sopenharmony_ci	 *
68062306a36Sopenharmony_ci	 * @return true if there was a free entry in the pool
68162306a36Sopenharmony_ci	 */
68262306a36Sopenharmony_ci	bool (*get_entry)(struct bnx2x_credit_pool_obj *o, int *entry);
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci	/**
68562306a36Sopenharmony_ci	 * Return the entry back to the pool.
68662306a36Sopenharmony_ci	 *
68762306a36Sopenharmony_ci	 * @return true if entry is legal and has been successfully
68862306a36Sopenharmony_ci	 *         returned to the pool.
68962306a36Sopenharmony_ci	 */
69062306a36Sopenharmony_ci	bool (*put_entry)(struct bnx2x_credit_pool_obj *o, int entry);
69162306a36Sopenharmony_ci
69262306a36Sopenharmony_ci	/**
69362306a36Sopenharmony_ci	 * Get the requested amount of credit from the pool.
69462306a36Sopenharmony_ci	 *
69562306a36Sopenharmony_ci	 * @param cnt Amount of requested credit
69662306a36Sopenharmony_ci	 * @return true if the operation is successful
69762306a36Sopenharmony_ci	 */
69862306a36Sopenharmony_ci	bool (*get)(struct bnx2x_credit_pool_obj *o, int cnt);
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci	/**
70162306a36Sopenharmony_ci	 * Returns the credit to the pool.
70262306a36Sopenharmony_ci	 *
70362306a36Sopenharmony_ci	 * @param cnt Amount of credit to return
70462306a36Sopenharmony_ci	 * @return true if the operation is successful
70562306a36Sopenharmony_ci	 */
70662306a36Sopenharmony_ci	bool (*put)(struct bnx2x_credit_pool_obj *o, int cnt);
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci	/**
70962306a36Sopenharmony_ci	 * Reads the current amount of credit.
71062306a36Sopenharmony_ci	 */
71162306a36Sopenharmony_ci	int (*check)(struct bnx2x_credit_pool_obj *o);
71262306a36Sopenharmony_ci};
71362306a36Sopenharmony_ci
71462306a36Sopenharmony_ci/*************************** RSS configuration ********************************/
71562306a36Sopenharmony_cienum {
71662306a36Sopenharmony_ci	/* RSS_MODE bits are mutually exclusive */
71762306a36Sopenharmony_ci	BNX2X_RSS_MODE_DISABLED,
71862306a36Sopenharmony_ci	BNX2X_RSS_MODE_REGULAR,
71962306a36Sopenharmony_ci
72062306a36Sopenharmony_ci	BNX2X_RSS_SET_SRCH, /* Setup searcher, E1x specific flag */
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_ci	BNX2X_RSS_IPV4,
72362306a36Sopenharmony_ci	BNX2X_RSS_IPV4_TCP,
72462306a36Sopenharmony_ci	BNX2X_RSS_IPV4_UDP,
72562306a36Sopenharmony_ci	BNX2X_RSS_IPV6,
72662306a36Sopenharmony_ci	BNX2X_RSS_IPV6_TCP,
72762306a36Sopenharmony_ci	BNX2X_RSS_IPV6_UDP,
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ci	BNX2X_RSS_IPV4_VXLAN,
73062306a36Sopenharmony_ci	BNX2X_RSS_IPV6_VXLAN,
73162306a36Sopenharmony_ci	BNX2X_RSS_TUNN_INNER_HDRS,
73262306a36Sopenharmony_ci};
73362306a36Sopenharmony_ci
73462306a36Sopenharmony_cistruct bnx2x_config_rss_params {
73562306a36Sopenharmony_ci	struct bnx2x_rss_config_obj *rss_obj;
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_ci	/* may have RAMROD_COMP_WAIT set only */
73862306a36Sopenharmony_ci	unsigned long	ramrod_flags;
73962306a36Sopenharmony_ci
74062306a36Sopenharmony_ci	/* BNX2X_RSS_X bits */
74162306a36Sopenharmony_ci	unsigned long	rss_flags;
74262306a36Sopenharmony_ci
74362306a36Sopenharmony_ci	/* Number hash bits to take into an account */
74462306a36Sopenharmony_ci	u8		rss_result_mask;
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci	/* Indirection table */
74762306a36Sopenharmony_ci	u8		ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci	/* RSS hash values */
75062306a36Sopenharmony_ci	u32		rss_key[10];
75162306a36Sopenharmony_ci
75262306a36Sopenharmony_ci	/* valid only iff BNX2X_RSS_UPDATE_TOE is set */
75362306a36Sopenharmony_ci	u16		toe_rss_bitmap;
75462306a36Sopenharmony_ci};
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_cistruct bnx2x_rss_config_obj {
75762306a36Sopenharmony_ci	struct bnx2x_raw_obj	raw;
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_ci	/* RSS engine to use */
76062306a36Sopenharmony_ci	u8			engine_id;
76162306a36Sopenharmony_ci
76262306a36Sopenharmony_ci	/* Last configured indirection table */
76362306a36Sopenharmony_ci	u8			ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_ci	/* flags for enabling 4-tupple hash on UDP */
76662306a36Sopenharmony_ci	u8			udp_rss_v4;
76762306a36Sopenharmony_ci	u8			udp_rss_v6;
76862306a36Sopenharmony_ci
76962306a36Sopenharmony_ci	int (*config_rss)(struct bnx2x *bp,
77062306a36Sopenharmony_ci			  struct bnx2x_config_rss_params *p);
77162306a36Sopenharmony_ci};
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci/*********************** Queue state update ***********************************/
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_ci/* UPDATE command options */
77662306a36Sopenharmony_cienum {
77762306a36Sopenharmony_ci	BNX2X_Q_UPDATE_IN_VLAN_REM,
77862306a36Sopenharmony_ci	BNX2X_Q_UPDATE_IN_VLAN_REM_CHNG,
77962306a36Sopenharmony_ci	BNX2X_Q_UPDATE_OUT_VLAN_REM,
78062306a36Sopenharmony_ci	BNX2X_Q_UPDATE_OUT_VLAN_REM_CHNG,
78162306a36Sopenharmony_ci	BNX2X_Q_UPDATE_ANTI_SPOOF,
78262306a36Sopenharmony_ci	BNX2X_Q_UPDATE_ANTI_SPOOF_CHNG,
78362306a36Sopenharmony_ci	BNX2X_Q_UPDATE_ACTIVATE,
78462306a36Sopenharmony_ci	BNX2X_Q_UPDATE_ACTIVATE_CHNG,
78562306a36Sopenharmony_ci	BNX2X_Q_UPDATE_DEF_VLAN_EN,
78662306a36Sopenharmony_ci	BNX2X_Q_UPDATE_DEF_VLAN_EN_CHNG,
78762306a36Sopenharmony_ci	BNX2X_Q_UPDATE_SILENT_VLAN_REM_CHNG,
78862306a36Sopenharmony_ci	BNX2X_Q_UPDATE_SILENT_VLAN_REM,
78962306a36Sopenharmony_ci	BNX2X_Q_UPDATE_TX_SWITCHING_CHNG,
79062306a36Sopenharmony_ci	BNX2X_Q_UPDATE_TX_SWITCHING,
79162306a36Sopenharmony_ci	BNX2X_Q_UPDATE_PTP_PKTS_CHNG,
79262306a36Sopenharmony_ci	BNX2X_Q_UPDATE_PTP_PKTS,
79362306a36Sopenharmony_ci};
79462306a36Sopenharmony_ci
79562306a36Sopenharmony_ci/* Allowed Queue states */
79662306a36Sopenharmony_cienum bnx2x_q_state {
79762306a36Sopenharmony_ci	BNX2X_Q_STATE_RESET,
79862306a36Sopenharmony_ci	BNX2X_Q_STATE_INITIALIZED,
79962306a36Sopenharmony_ci	BNX2X_Q_STATE_ACTIVE,
80062306a36Sopenharmony_ci	BNX2X_Q_STATE_MULTI_COS,
80162306a36Sopenharmony_ci	BNX2X_Q_STATE_MCOS_TERMINATED,
80262306a36Sopenharmony_ci	BNX2X_Q_STATE_INACTIVE,
80362306a36Sopenharmony_ci	BNX2X_Q_STATE_STOPPED,
80462306a36Sopenharmony_ci	BNX2X_Q_STATE_TERMINATED,
80562306a36Sopenharmony_ci	BNX2X_Q_STATE_FLRED,
80662306a36Sopenharmony_ci	BNX2X_Q_STATE_MAX,
80762306a36Sopenharmony_ci};
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_ci/* Allowed Queue states */
81062306a36Sopenharmony_cienum bnx2x_q_logical_state {
81162306a36Sopenharmony_ci	BNX2X_Q_LOGICAL_STATE_ACTIVE,
81262306a36Sopenharmony_ci	BNX2X_Q_LOGICAL_STATE_STOPPED,
81362306a36Sopenharmony_ci};
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_ci/* Allowed commands */
81662306a36Sopenharmony_cienum bnx2x_queue_cmd {
81762306a36Sopenharmony_ci	BNX2X_Q_CMD_INIT,
81862306a36Sopenharmony_ci	BNX2X_Q_CMD_SETUP,
81962306a36Sopenharmony_ci	BNX2X_Q_CMD_SETUP_TX_ONLY,
82062306a36Sopenharmony_ci	BNX2X_Q_CMD_DEACTIVATE,
82162306a36Sopenharmony_ci	BNX2X_Q_CMD_ACTIVATE,
82262306a36Sopenharmony_ci	BNX2X_Q_CMD_UPDATE,
82362306a36Sopenharmony_ci	BNX2X_Q_CMD_UPDATE_TPA,
82462306a36Sopenharmony_ci	BNX2X_Q_CMD_HALT,
82562306a36Sopenharmony_ci	BNX2X_Q_CMD_CFC_DEL,
82662306a36Sopenharmony_ci	BNX2X_Q_CMD_TERMINATE,
82762306a36Sopenharmony_ci	BNX2X_Q_CMD_EMPTY,
82862306a36Sopenharmony_ci	BNX2X_Q_CMD_MAX,
82962306a36Sopenharmony_ci};
83062306a36Sopenharmony_ci
83162306a36Sopenharmony_ci/* queue SETUP + INIT flags */
83262306a36Sopenharmony_cienum {
83362306a36Sopenharmony_ci	BNX2X_Q_FLG_TPA,
83462306a36Sopenharmony_ci	BNX2X_Q_FLG_TPA_IPV6,
83562306a36Sopenharmony_ci	BNX2X_Q_FLG_TPA_GRO,
83662306a36Sopenharmony_ci	BNX2X_Q_FLG_STATS,
83762306a36Sopenharmony_ci	BNX2X_Q_FLG_ZERO_STATS,
83862306a36Sopenharmony_ci	BNX2X_Q_FLG_ACTIVE,
83962306a36Sopenharmony_ci	BNX2X_Q_FLG_OV,
84062306a36Sopenharmony_ci	BNX2X_Q_FLG_VLAN,
84162306a36Sopenharmony_ci	BNX2X_Q_FLG_COS,
84262306a36Sopenharmony_ci	BNX2X_Q_FLG_HC,
84362306a36Sopenharmony_ci	BNX2X_Q_FLG_HC_EN,
84462306a36Sopenharmony_ci	BNX2X_Q_FLG_DHC,
84562306a36Sopenharmony_ci	BNX2X_Q_FLG_FCOE,
84662306a36Sopenharmony_ci	BNX2X_Q_FLG_LEADING_RSS,
84762306a36Sopenharmony_ci	BNX2X_Q_FLG_MCAST,
84862306a36Sopenharmony_ci	BNX2X_Q_FLG_DEF_VLAN,
84962306a36Sopenharmony_ci	BNX2X_Q_FLG_TX_SWITCH,
85062306a36Sopenharmony_ci	BNX2X_Q_FLG_TX_SEC,
85162306a36Sopenharmony_ci	BNX2X_Q_FLG_ANTI_SPOOF,
85262306a36Sopenharmony_ci	BNX2X_Q_FLG_SILENT_VLAN_REM,
85362306a36Sopenharmony_ci	BNX2X_Q_FLG_FORCE_DEFAULT_PRI,
85462306a36Sopenharmony_ci	BNX2X_Q_FLG_REFUSE_OUTBAND_VLAN,
85562306a36Sopenharmony_ci	BNX2X_Q_FLG_PCSUM_ON_PKT,
85662306a36Sopenharmony_ci	BNX2X_Q_FLG_TUN_INC_INNER_IP_ID
85762306a36Sopenharmony_ci};
85862306a36Sopenharmony_ci
85962306a36Sopenharmony_ci/* Queue type options: queue type may be a combination of below. */
86062306a36Sopenharmony_cienum bnx2x_q_type {
86162306a36Sopenharmony_ci	/** TODO: Consider moving both these flags into the init()
86262306a36Sopenharmony_ci	 *        ramrod params.
86362306a36Sopenharmony_ci	 */
86462306a36Sopenharmony_ci	BNX2X_Q_TYPE_HAS_RX,
86562306a36Sopenharmony_ci	BNX2X_Q_TYPE_HAS_TX,
86662306a36Sopenharmony_ci};
86762306a36Sopenharmony_ci
86862306a36Sopenharmony_ci#define BNX2X_PRIMARY_CID_INDEX			0
86962306a36Sopenharmony_ci#define BNX2X_MULTI_TX_COS_E1X			3 /* QM only */
87062306a36Sopenharmony_ci#define BNX2X_MULTI_TX_COS_E2_E3A0		2
87162306a36Sopenharmony_ci#define BNX2X_MULTI_TX_COS_E3B0			3
87262306a36Sopenharmony_ci#define BNX2X_MULTI_TX_COS			3 /* Maximum possible */
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_ci#define MAC_PAD (ALIGN(ETH_ALEN, sizeof(u32)) - ETH_ALEN)
87562306a36Sopenharmony_ci/* DMAE channel to be used by FW for timesync workaroun. A driver that sends
87662306a36Sopenharmony_ci * timesync-related ramrods must not use this DMAE command ID.
87762306a36Sopenharmony_ci */
87862306a36Sopenharmony_ci#define FW_DMAE_CMD_ID 6
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_cistruct bnx2x_queue_init_params {
88162306a36Sopenharmony_ci	struct {
88262306a36Sopenharmony_ci		unsigned long	flags;
88362306a36Sopenharmony_ci		u16		hc_rate;
88462306a36Sopenharmony_ci		u8		fw_sb_id;
88562306a36Sopenharmony_ci		u8		sb_cq_index;
88662306a36Sopenharmony_ci	} tx;
88762306a36Sopenharmony_ci
88862306a36Sopenharmony_ci	struct {
88962306a36Sopenharmony_ci		unsigned long	flags;
89062306a36Sopenharmony_ci		u16		hc_rate;
89162306a36Sopenharmony_ci		u8		fw_sb_id;
89262306a36Sopenharmony_ci		u8		sb_cq_index;
89362306a36Sopenharmony_ci	} rx;
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_ci	/* CID context in the host memory */
89662306a36Sopenharmony_ci	struct eth_context *cxts[BNX2X_MULTI_TX_COS];
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_ci	/* maximum number of cos supported by hardware */
89962306a36Sopenharmony_ci	u8 max_cos;
90062306a36Sopenharmony_ci};
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_cistruct bnx2x_queue_terminate_params {
90362306a36Sopenharmony_ci	/* index within the tx_only cids of this queue object */
90462306a36Sopenharmony_ci	u8 cid_index;
90562306a36Sopenharmony_ci};
90662306a36Sopenharmony_ci
90762306a36Sopenharmony_cistruct bnx2x_queue_cfc_del_params {
90862306a36Sopenharmony_ci	/* index within the tx_only cids of this queue object */
90962306a36Sopenharmony_ci	u8 cid_index;
91062306a36Sopenharmony_ci};
91162306a36Sopenharmony_ci
91262306a36Sopenharmony_cistruct bnx2x_queue_update_params {
91362306a36Sopenharmony_ci	unsigned long	update_flags; /* BNX2X_Q_UPDATE_XX bits */
91462306a36Sopenharmony_ci	u16		def_vlan;
91562306a36Sopenharmony_ci	u16		silent_removal_value;
91662306a36Sopenharmony_ci	u16		silent_removal_mask;
91762306a36Sopenharmony_ci/* index within the tx_only cids of this queue object */
91862306a36Sopenharmony_ci	u8		cid_index;
91962306a36Sopenharmony_ci};
92062306a36Sopenharmony_ci
92162306a36Sopenharmony_cistruct bnx2x_queue_update_tpa_params {
92262306a36Sopenharmony_ci	dma_addr_t sge_map;
92362306a36Sopenharmony_ci	u8 update_ipv4;
92462306a36Sopenharmony_ci	u8 update_ipv6;
92562306a36Sopenharmony_ci	u8 max_tpa_queues;
92662306a36Sopenharmony_ci	u8 max_sges_pkt;
92762306a36Sopenharmony_ci	u8 complete_on_both_clients;
92862306a36Sopenharmony_ci	u8 dont_verify_thr;
92962306a36Sopenharmony_ci	u8 tpa_mode;
93062306a36Sopenharmony_ci	u8 _pad;
93162306a36Sopenharmony_ci
93262306a36Sopenharmony_ci	u16 sge_buff_sz;
93362306a36Sopenharmony_ci	u16 max_agg_sz;
93462306a36Sopenharmony_ci
93562306a36Sopenharmony_ci	u16 sge_pause_thr_low;
93662306a36Sopenharmony_ci	u16 sge_pause_thr_high;
93762306a36Sopenharmony_ci};
93862306a36Sopenharmony_ci
93962306a36Sopenharmony_cistruct rxq_pause_params {
94062306a36Sopenharmony_ci	u16		bd_th_lo;
94162306a36Sopenharmony_ci	u16		bd_th_hi;
94262306a36Sopenharmony_ci	u16		rcq_th_lo;
94362306a36Sopenharmony_ci	u16		rcq_th_hi;
94462306a36Sopenharmony_ci	u16		sge_th_lo; /* valid iff BNX2X_Q_FLG_TPA */
94562306a36Sopenharmony_ci	u16		sge_th_hi; /* valid iff BNX2X_Q_FLG_TPA */
94662306a36Sopenharmony_ci	u16		pri_map;
94762306a36Sopenharmony_ci};
94862306a36Sopenharmony_ci
94962306a36Sopenharmony_ci/* general */
95062306a36Sopenharmony_cistruct bnx2x_general_setup_params {
95162306a36Sopenharmony_ci	/* valid iff BNX2X_Q_FLG_STATS */
95262306a36Sopenharmony_ci	u8		stat_id;
95362306a36Sopenharmony_ci
95462306a36Sopenharmony_ci	u8		spcl_id;
95562306a36Sopenharmony_ci	u16		mtu;
95662306a36Sopenharmony_ci	u8		cos;
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_ci	u8		fp_hsi;
95962306a36Sopenharmony_ci};
96062306a36Sopenharmony_ci
96162306a36Sopenharmony_cistruct bnx2x_rxq_setup_params {
96262306a36Sopenharmony_ci	/* dma */
96362306a36Sopenharmony_ci	dma_addr_t	dscr_map;
96462306a36Sopenharmony_ci	dma_addr_t	sge_map;
96562306a36Sopenharmony_ci	dma_addr_t	rcq_map;
96662306a36Sopenharmony_ci	dma_addr_t	rcq_np_map;
96762306a36Sopenharmony_ci
96862306a36Sopenharmony_ci	u16		drop_flags;
96962306a36Sopenharmony_ci	u16		buf_sz;
97062306a36Sopenharmony_ci	u8		fw_sb_id;
97162306a36Sopenharmony_ci	u8		cl_qzone_id;
97262306a36Sopenharmony_ci
97362306a36Sopenharmony_ci	/* valid iff BNX2X_Q_FLG_TPA */
97462306a36Sopenharmony_ci	u16		tpa_agg_sz;
97562306a36Sopenharmony_ci	u16		sge_buf_sz;
97662306a36Sopenharmony_ci	u8		max_sges_pkt;
97762306a36Sopenharmony_ci	u8		max_tpa_queues;
97862306a36Sopenharmony_ci	u8		rss_engine_id;
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_ci	/* valid iff BNX2X_Q_FLG_MCAST */
98162306a36Sopenharmony_ci	u8		mcast_engine_id;
98262306a36Sopenharmony_ci
98362306a36Sopenharmony_ci	u8		cache_line_log;
98462306a36Sopenharmony_ci
98562306a36Sopenharmony_ci	u8		sb_cq_index;
98662306a36Sopenharmony_ci
98762306a36Sopenharmony_ci	/* valid iff BXN2X_Q_FLG_SILENT_VLAN_REM */
98862306a36Sopenharmony_ci	u16 silent_removal_value;
98962306a36Sopenharmony_ci	u16 silent_removal_mask;
99062306a36Sopenharmony_ci};
99162306a36Sopenharmony_ci
99262306a36Sopenharmony_cistruct bnx2x_txq_setup_params {
99362306a36Sopenharmony_ci	/* dma */
99462306a36Sopenharmony_ci	dma_addr_t	dscr_map;
99562306a36Sopenharmony_ci
99662306a36Sopenharmony_ci	u8		fw_sb_id;
99762306a36Sopenharmony_ci	u8		sb_cq_index;
99862306a36Sopenharmony_ci	u8		cos;		/* valid iff BNX2X_Q_FLG_COS */
99962306a36Sopenharmony_ci	u16		traffic_type;
100062306a36Sopenharmony_ci	/* equals to the leading rss client id, used for TX classification*/
100162306a36Sopenharmony_ci	u8		tss_leading_cl_id;
100262306a36Sopenharmony_ci
100362306a36Sopenharmony_ci	/* valid iff BNX2X_Q_FLG_DEF_VLAN */
100462306a36Sopenharmony_ci	u16		default_vlan;
100562306a36Sopenharmony_ci};
100662306a36Sopenharmony_ci
100762306a36Sopenharmony_cistruct bnx2x_queue_setup_params {
100862306a36Sopenharmony_ci	struct bnx2x_general_setup_params gen_params;
100962306a36Sopenharmony_ci	struct bnx2x_txq_setup_params txq_params;
101062306a36Sopenharmony_ci	struct bnx2x_rxq_setup_params rxq_params;
101162306a36Sopenharmony_ci	struct rxq_pause_params pause_params;
101262306a36Sopenharmony_ci	unsigned long flags;
101362306a36Sopenharmony_ci};
101462306a36Sopenharmony_ci
101562306a36Sopenharmony_cistruct bnx2x_queue_setup_tx_only_params {
101662306a36Sopenharmony_ci	struct bnx2x_general_setup_params	gen_params;
101762306a36Sopenharmony_ci	struct bnx2x_txq_setup_params		txq_params;
101862306a36Sopenharmony_ci	unsigned long				flags;
101962306a36Sopenharmony_ci	/* index within the tx_only cids of this queue object */
102062306a36Sopenharmony_ci	u8					cid_index;
102162306a36Sopenharmony_ci};
102262306a36Sopenharmony_ci
102362306a36Sopenharmony_cistruct bnx2x_queue_state_params {
102462306a36Sopenharmony_ci	struct bnx2x_queue_sp_obj *q_obj;
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_ci	/* Current command */
102762306a36Sopenharmony_ci	enum bnx2x_queue_cmd cmd;
102862306a36Sopenharmony_ci
102962306a36Sopenharmony_ci	/* may have RAMROD_COMP_WAIT set only */
103062306a36Sopenharmony_ci	unsigned long ramrod_flags;
103162306a36Sopenharmony_ci
103262306a36Sopenharmony_ci	/* Params according to the current command */
103362306a36Sopenharmony_ci	union {
103462306a36Sopenharmony_ci		struct bnx2x_queue_update_params	update;
103562306a36Sopenharmony_ci		struct bnx2x_queue_update_tpa_params    update_tpa;
103662306a36Sopenharmony_ci		struct bnx2x_queue_setup_params		setup;
103762306a36Sopenharmony_ci		struct bnx2x_queue_init_params		init;
103862306a36Sopenharmony_ci		struct bnx2x_queue_setup_tx_only_params	tx_only;
103962306a36Sopenharmony_ci		struct bnx2x_queue_terminate_params	terminate;
104062306a36Sopenharmony_ci		struct bnx2x_queue_cfc_del_params	cfc_del;
104162306a36Sopenharmony_ci	} params;
104262306a36Sopenharmony_ci};
104362306a36Sopenharmony_ci
104462306a36Sopenharmony_cistruct bnx2x_viflist_params {
104562306a36Sopenharmony_ci	u8 echo_res;
104662306a36Sopenharmony_ci	u8 func_bit_map_res;
104762306a36Sopenharmony_ci};
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_cistruct bnx2x_queue_sp_obj {
105062306a36Sopenharmony_ci	u32		cids[BNX2X_MULTI_TX_COS];
105162306a36Sopenharmony_ci	u8		cl_id;
105262306a36Sopenharmony_ci	u8		func_id;
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_ci	/* number of traffic classes supported by queue.
105562306a36Sopenharmony_ci	 * The primary connection of the queue supports the first traffic
105662306a36Sopenharmony_ci	 * class. Any further traffic class is supported by a tx-only
105762306a36Sopenharmony_ci	 * connection.
105862306a36Sopenharmony_ci	 *
105962306a36Sopenharmony_ci	 * Therefore max_cos is also a number of valid entries in the cids
106062306a36Sopenharmony_ci	 * array.
106162306a36Sopenharmony_ci	 */
106262306a36Sopenharmony_ci	u8 max_cos;
106362306a36Sopenharmony_ci	u8 num_tx_only, next_tx_only;
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_ci	enum bnx2x_q_state state, next_state;
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_ci	/* bits from enum bnx2x_q_type */
106862306a36Sopenharmony_ci	unsigned long	type;
106962306a36Sopenharmony_ci
107062306a36Sopenharmony_ci	/* BNX2X_Q_CMD_XX bits. This object implements "one
107162306a36Sopenharmony_ci	 * pending" paradigm but for debug and tracing purposes it's
107262306a36Sopenharmony_ci	 * more convenient to have different bits for different
107362306a36Sopenharmony_ci	 * commands.
107462306a36Sopenharmony_ci	 */
107562306a36Sopenharmony_ci	unsigned long	pending;
107662306a36Sopenharmony_ci
107762306a36Sopenharmony_ci	/* Buffer to use as a ramrod data and its mapping */
107862306a36Sopenharmony_ci	void		*rdata;
107962306a36Sopenharmony_ci	dma_addr_t	rdata_mapping;
108062306a36Sopenharmony_ci
108162306a36Sopenharmony_ci	/**
108262306a36Sopenharmony_ci	 * Performs one state change according to the given parameters.
108362306a36Sopenharmony_ci	 *
108462306a36Sopenharmony_ci	 * @return 0 in case of success and negative value otherwise.
108562306a36Sopenharmony_ci	 */
108662306a36Sopenharmony_ci	int (*send_cmd)(struct bnx2x *bp,
108762306a36Sopenharmony_ci			struct bnx2x_queue_state_params *params);
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci	/**
109062306a36Sopenharmony_ci	 * Sets the pending bit according to the requested transition.
109162306a36Sopenharmony_ci	 */
109262306a36Sopenharmony_ci	int (*set_pending)(struct bnx2x_queue_sp_obj *o,
109362306a36Sopenharmony_ci			   struct bnx2x_queue_state_params *params);
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_ci	/**
109662306a36Sopenharmony_ci	 * Checks that the requested state transition is legal.
109762306a36Sopenharmony_ci	 */
109862306a36Sopenharmony_ci	int (*check_transition)(struct bnx2x *bp,
109962306a36Sopenharmony_ci				struct bnx2x_queue_sp_obj *o,
110062306a36Sopenharmony_ci				struct bnx2x_queue_state_params *params);
110162306a36Sopenharmony_ci
110262306a36Sopenharmony_ci	/**
110362306a36Sopenharmony_ci	 * Completes the pending command.
110462306a36Sopenharmony_ci	 */
110562306a36Sopenharmony_ci	int (*complete_cmd)(struct bnx2x *bp,
110662306a36Sopenharmony_ci			    struct bnx2x_queue_sp_obj *o,
110762306a36Sopenharmony_ci			    enum bnx2x_queue_cmd);
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_ci	int (*wait_comp)(struct bnx2x *bp,
111062306a36Sopenharmony_ci			 struct bnx2x_queue_sp_obj *o,
111162306a36Sopenharmony_ci			 enum bnx2x_queue_cmd cmd);
111262306a36Sopenharmony_ci};
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci/********************** Function state update *********************************/
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_ci/* UPDATE command options */
111762306a36Sopenharmony_cienum {
111862306a36Sopenharmony_ci	BNX2X_F_UPDATE_TX_SWITCH_SUSPEND_CHNG,
111962306a36Sopenharmony_ci	BNX2X_F_UPDATE_TX_SWITCH_SUSPEND,
112062306a36Sopenharmony_ci	BNX2X_F_UPDATE_SD_VLAN_TAG_CHNG,
112162306a36Sopenharmony_ci	BNX2X_F_UPDATE_SD_VLAN_ETH_TYPE_CHNG,
112262306a36Sopenharmony_ci	BNX2X_F_UPDATE_VLAN_FORCE_PRIO_CHNG,
112362306a36Sopenharmony_ci	BNX2X_F_UPDATE_VLAN_FORCE_PRIO_FLAG,
112462306a36Sopenharmony_ci	BNX2X_F_UPDATE_TUNNEL_CFG_CHNG,
112562306a36Sopenharmony_ci	BNX2X_F_UPDATE_TUNNEL_INNER_CLSS_L2GRE,
112662306a36Sopenharmony_ci	BNX2X_F_UPDATE_TUNNEL_INNER_CLSS_VXLAN,
112762306a36Sopenharmony_ci	BNX2X_F_UPDATE_TUNNEL_INNER_CLSS_L2GENEVE,
112862306a36Sopenharmony_ci	BNX2X_F_UPDATE_TUNNEL_INNER_RSS,
112962306a36Sopenharmony_ci};
113062306a36Sopenharmony_ci
113162306a36Sopenharmony_ci/* Allowed Function states */
113262306a36Sopenharmony_cienum bnx2x_func_state {
113362306a36Sopenharmony_ci	BNX2X_F_STATE_RESET,
113462306a36Sopenharmony_ci	BNX2X_F_STATE_INITIALIZED,
113562306a36Sopenharmony_ci	BNX2X_F_STATE_STARTED,
113662306a36Sopenharmony_ci	BNX2X_F_STATE_TX_STOPPED,
113762306a36Sopenharmony_ci	BNX2X_F_STATE_MAX,
113862306a36Sopenharmony_ci};
113962306a36Sopenharmony_ci
114062306a36Sopenharmony_ci/* Allowed Function commands */
114162306a36Sopenharmony_cienum bnx2x_func_cmd {
114262306a36Sopenharmony_ci	BNX2X_F_CMD_HW_INIT,
114362306a36Sopenharmony_ci	BNX2X_F_CMD_START,
114462306a36Sopenharmony_ci	BNX2X_F_CMD_STOP,
114562306a36Sopenharmony_ci	BNX2X_F_CMD_HW_RESET,
114662306a36Sopenharmony_ci	BNX2X_F_CMD_AFEX_UPDATE,
114762306a36Sopenharmony_ci	BNX2X_F_CMD_AFEX_VIFLISTS,
114862306a36Sopenharmony_ci	BNX2X_F_CMD_TX_STOP,
114962306a36Sopenharmony_ci	BNX2X_F_CMD_TX_START,
115062306a36Sopenharmony_ci	BNX2X_F_CMD_SWITCH_UPDATE,
115162306a36Sopenharmony_ci	BNX2X_F_CMD_SET_TIMESYNC,
115262306a36Sopenharmony_ci	BNX2X_F_CMD_MAX,
115362306a36Sopenharmony_ci};
115462306a36Sopenharmony_ci
115562306a36Sopenharmony_cistruct bnx2x_func_hw_init_params {
115662306a36Sopenharmony_ci	/* A load phase returned by MCP.
115762306a36Sopenharmony_ci	 *
115862306a36Sopenharmony_ci	 * May be:
115962306a36Sopenharmony_ci	 *		FW_MSG_CODE_DRV_LOAD_COMMON_CHIP
116062306a36Sopenharmony_ci	 *		FW_MSG_CODE_DRV_LOAD_COMMON
116162306a36Sopenharmony_ci	 *		FW_MSG_CODE_DRV_LOAD_PORT
116262306a36Sopenharmony_ci	 *		FW_MSG_CODE_DRV_LOAD_FUNCTION
116362306a36Sopenharmony_ci	 */
116462306a36Sopenharmony_ci	u32 load_phase;
116562306a36Sopenharmony_ci};
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_cistruct bnx2x_func_hw_reset_params {
116862306a36Sopenharmony_ci	/* A load phase returned by MCP.
116962306a36Sopenharmony_ci	 *
117062306a36Sopenharmony_ci	 * May be:
117162306a36Sopenharmony_ci	 *		FW_MSG_CODE_DRV_LOAD_COMMON_CHIP
117262306a36Sopenharmony_ci	 *		FW_MSG_CODE_DRV_LOAD_COMMON
117362306a36Sopenharmony_ci	 *		FW_MSG_CODE_DRV_LOAD_PORT
117462306a36Sopenharmony_ci	 *		FW_MSG_CODE_DRV_LOAD_FUNCTION
117562306a36Sopenharmony_ci	 */
117662306a36Sopenharmony_ci	u32 reset_phase;
117762306a36Sopenharmony_ci};
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_cistruct bnx2x_func_start_params {
118062306a36Sopenharmony_ci	/* Multi Function mode:
118162306a36Sopenharmony_ci	 *	- Single Function
118262306a36Sopenharmony_ci	 *	- Switch Dependent
118362306a36Sopenharmony_ci	 *	- Switch Independent
118462306a36Sopenharmony_ci	 */
118562306a36Sopenharmony_ci	u16 mf_mode;
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci	/* Switch Dependent mode outer VLAN tag */
118862306a36Sopenharmony_ci	u16 sd_vlan_tag;
118962306a36Sopenharmony_ci
119062306a36Sopenharmony_ci	/* Function cos mode */
119162306a36Sopenharmony_ci	u8 network_cos_mode;
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_ci	/* UDP dest port for VXLAN */
119462306a36Sopenharmony_ci	u16 vxlan_dst_port;
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci	/* UDP dest port for Geneve */
119762306a36Sopenharmony_ci	u16 geneve_dst_port;
119862306a36Sopenharmony_ci
119962306a36Sopenharmony_ci	/* Enable inner Rx classifications for L2GRE packets */
120062306a36Sopenharmony_ci	u8 inner_clss_l2gre;
120162306a36Sopenharmony_ci
120262306a36Sopenharmony_ci	/* Enable inner Rx classifications for L2-Geneve packets */
120362306a36Sopenharmony_ci	u8 inner_clss_l2geneve;
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_ci	/* Enable inner Rx classification for vxlan packets */
120662306a36Sopenharmony_ci	u8 inner_clss_vxlan;
120762306a36Sopenharmony_ci
120862306a36Sopenharmony_ci	/* Enable RSS according to inner header */
120962306a36Sopenharmony_ci	u8 inner_rss;
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci	/* Allows accepting of packets failing MF classification, possibly
121262306a36Sopenharmony_ci	 * only matching a given ethertype
121362306a36Sopenharmony_ci	 */
121462306a36Sopenharmony_ci	u8 class_fail;
121562306a36Sopenharmony_ci	u16 class_fail_ethtype;
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_ci	/* Override priority of output packets */
121862306a36Sopenharmony_ci	u8 sd_vlan_force_pri;
121962306a36Sopenharmony_ci	u8 sd_vlan_force_pri_val;
122062306a36Sopenharmony_ci
122162306a36Sopenharmony_ci	/* Replace vlan's ethertype */
122262306a36Sopenharmony_ci	u16 sd_vlan_eth_type;
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci	/* Prevent inner vlans from being added by FW */
122562306a36Sopenharmony_ci	u8 no_added_tags;
122662306a36Sopenharmony_ci
122762306a36Sopenharmony_ci	/* Inner-to-Outer vlan priority mapping */
122862306a36Sopenharmony_ci	u8 c2s_pri[MAX_VLAN_PRIORITIES];
122962306a36Sopenharmony_ci	u8 c2s_pri_default;
123062306a36Sopenharmony_ci	u8 c2s_pri_valid;
123162306a36Sopenharmony_ci};
123262306a36Sopenharmony_ci
123362306a36Sopenharmony_cistruct bnx2x_func_switch_update_params {
123462306a36Sopenharmony_ci	unsigned long changes; /* BNX2X_F_UPDATE_XX bits */
123562306a36Sopenharmony_ci	u16 vlan;
123662306a36Sopenharmony_ci	u16 vlan_eth_type;
123762306a36Sopenharmony_ci	u8 vlan_force_prio;
123862306a36Sopenharmony_ci	u16 vxlan_dst_port;
123962306a36Sopenharmony_ci	u16 geneve_dst_port;
124062306a36Sopenharmony_ci};
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_cistruct bnx2x_func_afex_update_params {
124362306a36Sopenharmony_ci	u16 vif_id;
124462306a36Sopenharmony_ci	u16 afex_default_vlan;
124562306a36Sopenharmony_ci	u8 allowed_priorities;
124662306a36Sopenharmony_ci};
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_cistruct bnx2x_func_afex_viflists_params {
124962306a36Sopenharmony_ci	u16 vif_list_index;
125062306a36Sopenharmony_ci	u8 func_bit_map;
125162306a36Sopenharmony_ci	u8 afex_vif_list_command;
125262306a36Sopenharmony_ci	u8 func_to_clear;
125362306a36Sopenharmony_ci};
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_cistruct bnx2x_func_tx_start_params {
125662306a36Sopenharmony_ci	struct priority_cos traffic_type_to_priority_cos[MAX_TRAFFIC_TYPES];
125762306a36Sopenharmony_ci	u8 dcb_enabled;
125862306a36Sopenharmony_ci	u8 dcb_version;
125962306a36Sopenharmony_ci	u8 dont_add_pri_0_en;
126062306a36Sopenharmony_ci	u8 dcb_outer_pri[MAX_TRAFFIC_TYPES];
126162306a36Sopenharmony_ci};
126262306a36Sopenharmony_ci
126362306a36Sopenharmony_cistruct bnx2x_func_set_timesync_params {
126462306a36Sopenharmony_ci	/* Reset, set or keep the current drift value */
126562306a36Sopenharmony_ci	u8 drift_adjust_cmd;
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_ci	/* Dec, inc or keep the current offset */
126862306a36Sopenharmony_ci	u8 offset_cmd;
126962306a36Sopenharmony_ci
127062306a36Sopenharmony_ci	/* Drift value direction */
127162306a36Sopenharmony_ci	u8 add_sub_drift_adjust_value;
127262306a36Sopenharmony_ci
127362306a36Sopenharmony_ci	/* Drift, period and offset values to be used according to the commands
127462306a36Sopenharmony_ci	 * above.
127562306a36Sopenharmony_ci	 */
127662306a36Sopenharmony_ci	u8 drift_adjust_value;
127762306a36Sopenharmony_ci	u32 drift_adjust_period;
127862306a36Sopenharmony_ci	u64 offset_delta;
127962306a36Sopenharmony_ci};
128062306a36Sopenharmony_ci
128162306a36Sopenharmony_cistruct bnx2x_func_state_params {
128262306a36Sopenharmony_ci	struct bnx2x_func_sp_obj *f_obj;
128362306a36Sopenharmony_ci
128462306a36Sopenharmony_ci	/* Current command */
128562306a36Sopenharmony_ci	enum bnx2x_func_cmd cmd;
128662306a36Sopenharmony_ci
128762306a36Sopenharmony_ci	/* may have RAMROD_COMP_WAIT set only */
128862306a36Sopenharmony_ci	unsigned long	ramrod_flags;
128962306a36Sopenharmony_ci
129062306a36Sopenharmony_ci	/* Params according to the current command */
129162306a36Sopenharmony_ci	union {
129262306a36Sopenharmony_ci		struct bnx2x_func_hw_init_params hw_init;
129362306a36Sopenharmony_ci		struct bnx2x_func_hw_reset_params hw_reset;
129462306a36Sopenharmony_ci		struct bnx2x_func_start_params start;
129562306a36Sopenharmony_ci		struct bnx2x_func_switch_update_params switch_update;
129662306a36Sopenharmony_ci		struct bnx2x_func_afex_update_params afex_update;
129762306a36Sopenharmony_ci		struct bnx2x_func_afex_viflists_params afex_viflists;
129862306a36Sopenharmony_ci		struct bnx2x_func_tx_start_params tx_start;
129962306a36Sopenharmony_ci		struct bnx2x_func_set_timesync_params set_timesync;
130062306a36Sopenharmony_ci	} params;
130162306a36Sopenharmony_ci};
130262306a36Sopenharmony_ci
130362306a36Sopenharmony_cistruct bnx2x_func_sp_drv_ops {
130462306a36Sopenharmony_ci	/* Init tool + runtime initialization:
130562306a36Sopenharmony_ci	 *      - Common Chip
130662306a36Sopenharmony_ci	 *      - Common (per Path)
130762306a36Sopenharmony_ci	 *      - Port
130862306a36Sopenharmony_ci	 *      - Function phases
130962306a36Sopenharmony_ci	 */
131062306a36Sopenharmony_ci	int (*init_hw_cmn_chip)(struct bnx2x *bp);
131162306a36Sopenharmony_ci	int (*init_hw_cmn)(struct bnx2x *bp);
131262306a36Sopenharmony_ci	int (*init_hw_port)(struct bnx2x *bp);
131362306a36Sopenharmony_ci	int (*init_hw_func)(struct bnx2x *bp);
131462306a36Sopenharmony_ci
131562306a36Sopenharmony_ci	/* Reset Function HW: Common, Port, Function phases. */
131662306a36Sopenharmony_ci	void (*reset_hw_cmn)(struct bnx2x *bp);
131762306a36Sopenharmony_ci	void (*reset_hw_port)(struct bnx2x *bp);
131862306a36Sopenharmony_ci	void (*reset_hw_func)(struct bnx2x *bp);
131962306a36Sopenharmony_ci
132062306a36Sopenharmony_ci	/* Init/Free GUNZIP resources */
132162306a36Sopenharmony_ci	int (*gunzip_init)(struct bnx2x *bp);
132262306a36Sopenharmony_ci	void (*gunzip_end)(struct bnx2x *bp);
132362306a36Sopenharmony_ci
132462306a36Sopenharmony_ci	/* Prepare/Release FW resources */
132562306a36Sopenharmony_ci	int (*init_fw)(struct bnx2x *bp);
132662306a36Sopenharmony_ci	void (*release_fw)(struct bnx2x *bp);
132762306a36Sopenharmony_ci};
132862306a36Sopenharmony_ci
132962306a36Sopenharmony_cistruct bnx2x_func_sp_obj {
133062306a36Sopenharmony_ci	enum bnx2x_func_state	state, next_state;
133162306a36Sopenharmony_ci
133262306a36Sopenharmony_ci	/* BNX2X_FUNC_CMD_XX bits. This object implements "one
133362306a36Sopenharmony_ci	 * pending" paradigm but for debug and tracing purposes it's
133462306a36Sopenharmony_ci	 * more convenient to have different bits for different
133562306a36Sopenharmony_ci	 * commands.
133662306a36Sopenharmony_ci	 */
133762306a36Sopenharmony_ci	unsigned long		pending;
133862306a36Sopenharmony_ci
133962306a36Sopenharmony_ci	/* Buffer to use as a ramrod data and its mapping */
134062306a36Sopenharmony_ci	void			*rdata;
134162306a36Sopenharmony_ci	dma_addr_t		rdata_mapping;
134262306a36Sopenharmony_ci
134362306a36Sopenharmony_ci	/* Buffer to use as a afex ramrod data and its mapping.
134462306a36Sopenharmony_ci	 * This can't be same rdata as above because afex ramrod requests
134562306a36Sopenharmony_ci	 * can arrive to the object in parallel to other ramrod requests.
134662306a36Sopenharmony_ci	 */
134762306a36Sopenharmony_ci	void			*afex_rdata;
134862306a36Sopenharmony_ci	dma_addr_t		afex_rdata_mapping;
134962306a36Sopenharmony_ci
135062306a36Sopenharmony_ci	/* this mutex validates that when pending flag is taken, the next
135162306a36Sopenharmony_ci	 * ramrod to be sent will be the one set the pending bit
135262306a36Sopenharmony_ci	 */
135362306a36Sopenharmony_ci	struct mutex		one_pending_mutex;
135462306a36Sopenharmony_ci
135562306a36Sopenharmony_ci	/* Driver interface */
135662306a36Sopenharmony_ci	struct bnx2x_func_sp_drv_ops	*drv;
135762306a36Sopenharmony_ci
135862306a36Sopenharmony_ci	/**
135962306a36Sopenharmony_ci	 * Performs one state change according to the given parameters.
136062306a36Sopenharmony_ci	 *
136162306a36Sopenharmony_ci	 * @return 0 in case of success and negative value otherwise.
136262306a36Sopenharmony_ci	 */
136362306a36Sopenharmony_ci	int (*send_cmd)(struct bnx2x *bp,
136462306a36Sopenharmony_ci			struct bnx2x_func_state_params *params);
136562306a36Sopenharmony_ci
136662306a36Sopenharmony_ci	/**
136762306a36Sopenharmony_ci	 * Checks that the requested state transition is legal.
136862306a36Sopenharmony_ci	 */
136962306a36Sopenharmony_ci	int (*check_transition)(struct bnx2x *bp,
137062306a36Sopenharmony_ci				struct bnx2x_func_sp_obj *o,
137162306a36Sopenharmony_ci				struct bnx2x_func_state_params *params);
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci	/**
137462306a36Sopenharmony_ci	 * Completes the pending command.
137562306a36Sopenharmony_ci	 */
137662306a36Sopenharmony_ci	int (*complete_cmd)(struct bnx2x *bp,
137762306a36Sopenharmony_ci			    struct bnx2x_func_sp_obj *o,
137862306a36Sopenharmony_ci			    enum bnx2x_func_cmd cmd);
137962306a36Sopenharmony_ci
138062306a36Sopenharmony_ci	int (*wait_comp)(struct bnx2x *bp, struct bnx2x_func_sp_obj *o,
138162306a36Sopenharmony_ci			 enum bnx2x_func_cmd cmd);
138262306a36Sopenharmony_ci};
138362306a36Sopenharmony_ci
138462306a36Sopenharmony_ci/********************** Interfaces ********************************************/
138562306a36Sopenharmony_ci/* Queueable objects set */
138662306a36Sopenharmony_ciunion bnx2x_qable_obj {
138762306a36Sopenharmony_ci	struct bnx2x_vlan_mac_obj vlan_mac;
138862306a36Sopenharmony_ci};
138962306a36Sopenharmony_ci/************** Function state update *********/
139062306a36Sopenharmony_civoid bnx2x_init_func_obj(struct bnx2x *bp,
139162306a36Sopenharmony_ci			 struct bnx2x_func_sp_obj *obj,
139262306a36Sopenharmony_ci			 void *rdata, dma_addr_t rdata_mapping,
139362306a36Sopenharmony_ci			 void *afex_rdata, dma_addr_t afex_rdata_mapping,
139462306a36Sopenharmony_ci			 struct bnx2x_func_sp_drv_ops *drv_iface);
139562306a36Sopenharmony_ci
139662306a36Sopenharmony_ciint bnx2x_func_state_change(struct bnx2x *bp,
139762306a36Sopenharmony_ci			    struct bnx2x_func_state_params *params);
139862306a36Sopenharmony_ci
139962306a36Sopenharmony_cienum bnx2x_func_state bnx2x_func_get_state(struct bnx2x *bp,
140062306a36Sopenharmony_ci					   struct bnx2x_func_sp_obj *o);
140162306a36Sopenharmony_ci/******************* Queue State **************/
140262306a36Sopenharmony_civoid bnx2x_init_queue_obj(struct bnx2x *bp,
140362306a36Sopenharmony_ci			  struct bnx2x_queue_sp_obj *obj, u8 cl_id, u32 *cids,
140462306a36Sopenharmony_ci			  u8 cid_cnt, u8 func_id, void *rdata,
140562306a36Sopenharmony_ci			  dma_addr_t rdata_mapping, unsigned long type);
140662306a36Sopenharmony_ci
140762306a36Sopenharmony_ciint bnx2x_queue_state_change(struct bnx2x *bp,
140862306a36Sopenharmony_ci			     struct bnx2x_queue_state_params *params);
140962306a36Sopenharmony_ci
141062306a36Sopenharmony_ciint bnx2x_get_q_logical_state(struct bnx2x *bp,
141162306a36Sopenharmony_ci			       struct bnx2x_queue_sp_obj *obj);
141262306a36Sopenharmony_ci
141362306a36Sopenharmony_ci/********************* VLAN-MAC ****************/
141462306a36Sopenharmony_civoid bnx2x_init_mac_obj(struct bnx2x *bp,
141562306a36Sopenharmony_ci			struct bnx2x_vlan_mac_obj *mac_obj,
141662306a36Sopenharmony_ci			u8 cl_id, u32 cid, u8 func_id, void *rdata,
141762306a36Sopenharmony_ci			dma_addr_t rdata_mapping, int state,
141862306a36Sopenharmony_ci			unsigned long *pstate, bnx2x_obj_type type,
141962306a36Sopenharmony_ci			struct bnx2x_credit_pool_obj *macs_pool);
142062306a36Sopenharmony_ci
142162306a36Sopenharmony_civoid bnx2x_init_vlan_obj(struct bnx2x *bp,
142262306a36Sopenharmony_ci			 struct bnx2x_vlan_mac_obj *vlan_obj,
142362306a36Sopenharmony_ci			 u8 cl_id, u32 cid, u8 func_id, void *rdata,
142462306a36Sopenharmony_ci			 dma_addr_t rdata_mapping, int state,
142562306a36Sopenharmony_ci			 unsigned long *pstate, bnx2x_obj_type type,
142662306a36Sopenharmony_ci			 struct bnx2x_credit_pool_obj *vlans_pool);
142762306a36Sopenharmony_ci
142862306a36Sopenharmony_civoid bnx2x_init_vlan_mac_obj(struct bnx2x *bp,
142962306a36Sopenharmony_ci			     struct bnx2x_vlan_mac_obj *vlan_mac_obj,
143062306a36Sopenharmony_ci			     u8 cl_id, u32 cid, u8 func_id, void *rdata,
143162306a36Sopenharmony_ci			     dma_addr_t rdata_mapping, int state,
143262306a36Sopenharmony_ci			     unsigned long *pstate, bnx2x_obj_type type,
143362306a36Sopenharmony_ci			     struct bnx2x_credit_pool_obj *macs_pool,
143462306a36Sopenharmony_ci			     struct bnx2x_credit_pool_obj *vlans_pool);
143562306a36Sopenharmony_ci
143662306a36Sopenharmony_ciint bnx2x_vlan_mac_h_read_lock(struct bnx2x *bp,
143762306a36Sopenharmony_ci					struct bnx2x_vlan_mac_obj *o);
143862306a36Sopenharmony_civoid bnx2x_vlan_mac_h_read_unlock(struct bnx2x *bp,
143962306a36Sopenharmony_ci				  struct bnx2x_vlan_mac_obj *o);
144062306a36Sopenharmony_ciint bnx2x_vlan_mac_h_write_lock(struct bnx2x *bp,
144162306a36Sopenharmony_ci				struct bnx2x_vlan_mac_obj *o);
144262306a36Sopenharmony_ciint bnx2x_config_vlan_mac(struct bnx2x *bp,
144362306a36Sopenharmony_ci			   struct bnx2x_vlan_mac_ramrod_params *p);
144462306a36Sopenharmony_ci
144562306a36Sopenharmony_ciint bnx2x_vlan_mac_move(struct bnx2x *bp,
144662306a36Sopenharmony_ci			struct bnx2x_vlan_mac_ramrod_params *p,
144762306a36Sopenharmony_ci			struct bnx2x_vlan_mac_obj *dest_o);
144862306a36Sopenharmony_ci
144962306a36Sopenharmony_ci/********************* RX MODE ****************/
145062306a36Sopenharmony_ci
145162306a36Sopenharmony_civoid bnx2x_init_rx_mode_obj(struct bnx2x *bp,
145262306a36Sopenharmony_ci			    struct bnx2x_rx_mode_obj *o);
145362306a36Sopenharmony_ci
145462306a36Sopenharmony_ci/**
145562306a36Sopenharmony_ci * bnx2x_config_rx_mode - Send and RX_MODE ramrod according to the provided parameters.
145662306a36Sopenharmony_ci *
145762306a36Sopenharmony_ci * @p: Command parameters
145862306a36Sopenharmony_ci *
145962306a36Sopenharmony_ci * Return: 0 - if operation was successful and there is no pending completions,
146062306a36Sopenharmony_ci *         positive number - if there are pending completions,
146162306a36Sopenharmony_ci *         negative - if there were errors
146262306a36Sopenharmony_ci */
146362306a36Sopenharmony_ciint bnx2x_config_rx_mode(struct bnx2x *bp,
146462306a36Sopenharmony_ci			 struct bnx2x_rx_mode_ramrod_params *p);
146562306a36Sopenharmony_ci
146662306a36Sopenharmony_ci/****************** MULTICASTS ****************/
146762306a36Sopenharmony_ci
146862306a36Sopenharmony_civoid bnx2x_init_mcast_obj(struct bnx2x *bp,
146962306a36Sopenharmony_ci			  struct bnx2x_mcast_obj *mcast_obj,
147062306a36Sopenharmony_ci			  u8 mcast_cl_id, u32 mcast_cid, u8 func_id,
147162306a36Sopenharmony_ci			  u8 engine_id, void *rdata, dma_addr_t rdata_mapping,
147262306a36Sopenharmony_ci			  int state, unsigned long *pstate,
147362306a36Sopenharmony_ci			  bnx2x_obj_type type);
147462306a36Sopenharmony_ci
147562306a36Sopenharmony_ci/**
147662306a36Sopenharmony_ci * bnx2x_config_mcast - Configure multicast MACs list.
147762306a36Sopenharmony_ci *
147862306a36Sopenharmony_ci * @cmd: command to execute: BNX2X_MCAST_CMD_X
147962306a36Sopenharmony_ci *
148062306a36Sopenharmony_ci * May configure a new list
148162306a36Sopenharmony_ci * provided in p->mcast_list (BNX2X_MCAST_CMD_ADD), clean up
148262306a36Sopenharmony_ci * (BNX2X_MCAST_CMD_DEL) or restore (BNX2X_MCAST_CMD_RESTORE) a current
148362306a36Sopenharmony_ci * configuration, continue to execute the pending commands
148462306a36Sopenharmony_ci * (BNX2X_MCAST_CMD_CONT).
148562306a36Sopenharmony_ci *
148662306a36Sopenharmony_ci * If previous command is still pending or if number of MACs to
148762306a36Sopenharmony_ci * configure is more that maximum number of MACs in one command,
148862306a36Sopenharmony_ci * the current command will be enqueued to the tail of the
148962306a36Sopenharmony_ci * pending commands list.
149062306a36Sopenharmony_ci *
149162306a36Sopenharmony_ci * Return: 0 is operation was successful and there are no pending completions,
149262306a36Sopenharmony_ci *         negative if there were errors, positive if there are pending
149362306a36Sopenharmony_ci *         completions.
149462306a36Sopenharmony_ci */
149562306a36Sopenharmony_ciint bnx2x_config_mcast(struct bnx2x *bp,
149662306a36Sopenharmony_ci		       struct bnx2x_mcast_ramrod_params *p,
149762306a36Sopenharmony_ci		       enum bnx2x_mcast_cmd cmd);
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci/****************** CREDIT POOL ****************/
150062306a36Sopenharmony_civoid bnx2x_init_mac_credit_pool(struct bnx2x *bp,
150162306a36Sopenharmony_ci				struct bnx2x_credit_pool_obj *p, u8 func_id,
150262306a36Sopenharmony_ci				u8 func_num);
150362306a36Sopenharmony_civoid bnx2x_init_vlan_credit_pool(struct bnx2x *bp,
150462306a36Sopenharmony_ci				 struct bnx2x_credit_pool_obj *p, u8 func_id,
150562306a36Sopenharmony_ci				 u8 func_num);
150662306a36Sopenharmony_civoid bnx2x_init_credit_pool(struct bnx2x_credit_pool_obj *p,
150762306a36Sopenharmony_ci			    int base, int credit);
150862306a36Sopenharmony_ci
150962306a36Sopenharmony_ci/****************** RSS CONFIGURATION ****************/
151062306a36Sopenharmony_civoid bnx2x_init_rss_config_obj(struct bnx2x *bp,
151162306a36Sopenharmony_ci			       struct bnx2x_rss_config_obj *rss_obj,
151262306a36Sopenharmony_ci			       u8 cl_id, u32 cid, u8 func_id, u8 engine_id,
151362306a36Sopenharmony_ci			       void *rdata, dma_addr_t rdata_mapping,
151462306a36Sopenharmony_ci			       int state, unsigned long *pstate,
151562306a36Sopenharmony_ci			       bnx2x_obj_type type);
151662306a36Sopenharmony_ci
151762306a36Sopenharmony_ci/**
151862306a36Sopenharmony_ci * bnx2x_config_rss - Updates RSS configuration according to provided parameters
151962306a36Sopenharmony_ci *
152062306a36Sopenharmony_ci * Return: 0 in case of success
152162306a36Sopenharmony_ci */
152262306a36Sopenharmony_ciint bnx2x_config_rss(struct bnx2x *bp,
152362306a36Sopenharmony_ci		     struct bnx2x_config_rss_params *p);
152462306a36Sopenharmony_ci
152562306a36Sopenharmony_ci/**
152662306a36Sopenharmony_ci * bnx2x_get_rss_ind_table - Return the current ind_table configuration.
152762306a36Sopenharmony_ci *
152862306a36Sopenharmony_ci * @ind_table: buffer to fill with the current indirection
152962306a36Sopenharmony_ci *                  table content. Should be at least
153062306a36Sopenharmony_ci *                  T_ETH_INDIRECTION_TABLE_SIZE bytes long.
153162306a36Sopenharmony_ci */
153262306a36Sopenharmony_civoid bnx2x_get_rss_ind_table(struct bnx2x_rss_config_obj *rss_obj,
153362306a36Sopenharmony_ci			     u8 *ind_table);
153462306a36Sopenharmony_ci
153562306a36Sopenharmony_ci#define PF_MAC_CREDIT_E2(bp, func_num)					\
153662306a36Sopenharmony_ci	((MAX_MAC_CREDIT_E2 - GET_NUM_VFS_PER_PATH(bp) * VF_MAC_CREDIT_CNT) / \
153762306a36Sopenharmony_ci	 func_num + GET_NUM_VFS_PER_PF(bp) * VF_MAC_CREDIT_CNT)
153862306a36Sopenharmony_ci
153962306a36Sopenharmony_ci#define BNX2X_VFS_VLAN_CREDIT(bp)	\
154062306a36Sopenharmony_ci	(GET_NUM_VFS_PER_PATH(bp) * VF_VLAN_CREDIT_CNT)
154162306a36Sopenharmony_ci
154262306a36Sopenharmony_ci#define PF_VLAN_CREDIT_E2(bp, func_num)					 \
154362306a36Sopenharmony_ci	((MAX_VLAN_CREDIT_E2 - 1 - BNX2X_VFS_VLAN_CREDIT(bp)) /	\
154462306a36Sopenharmony_ci	 func_num + GET_NUM_VFS_PER_PF(bp) * VF_VLAN_CREDIT_CNT)
154562306a36Sopenharmony_ci
154662306a36Sopenharmony_ci#endif /* BNX2X_SP_VERBS */
1547