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