162306a36Sopenharmony_ci/* bnx2x_dcb.h: QLogic Everest network driver. 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Copyright 2009-2013 Broadcom Corporation 462306a36Sopenharmony_ci * Copyright 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/old-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: Dmitry Kravkov 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci */ 2162306a36Sopenharmony_ci#ifndef BNX2X_DCB_H 2262306a36Sopenharmony_ci#define BNX2X_DCB_H 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#include "bnx2x_hsi.h" 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define LLFC_DRIVER_TRAFFIC_TYPE_MAX 3 /* NW, iSCSI, FCoE */ 2762306a36Sopenharmony_cistruct bnx2x_dcbx_app_params { 2862306a36Sopenharmony_ci u32 enabled; 2962306a36Sopenharmony_ci u32 traffic_type_priority[LLFC_DRIVER_TRAFFIC_TYPE_MAX]; 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define DCBX_COS_MAX_NUM_E2 DCBX_E2E3_MAX_NUM_COS 3362306a36Sopenharmony_ci/* bnx2x currently limits numbers of supported COSes to 3 to be extended to 6 */ 3462306a36Sopenharmony_ci#define BNX2X_MAX_COS_SUPPORT 3 3562306a36Sopenharmony_ci#define DCBX_COS_MAX_NUM_E3B0 BNX2X_MAX_COS_SUPPORT 3662306a36Sopenharmony_ci#define DCBX_COS_MAX_NUM BNX2X_MAX_COS_SUPPORT 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct bnx2x_dcbx_cos_params { 3962306a36Sopenharmony_ci u32 bw_tbl; 4062306a36Sopenharmony_ci u32 pri_bitmask; 4162306a36Sopenharmony_ci /* 4262306a36Sopenharmony_ci * strict priority: valid values are 0..5; 0 is highest priority. 4362306a36Sopenharmony_ci * There can't be two COSes with the same priority. 4462306a36Sopenharmony_ci */ 4562306a36Sopenharmony_ci u8 strict; 4662306a36Sopenharmony_ci#define BNX2X_DCBX_STRICT_INVALID DCBX_COS_MAX_NUM 4762306a36Sopenharmony_ci#define BNX2X_DCBX_STRICT_COS_HIGHEST 0 4862306a36Sopenharmony_ci#define BNX2X_DCBX_STRICT_COS_NEXT_LOWER_PRI(sp) ((sp) + 1) 4962306a36Sopenharmony_ci u8 pauseable; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct bnx2x_dcbx_pg_params { 5362306a36Sopenharmony_ci u32 enabled; 5462306a36Sopenharmony_ci u8 num_of_cos; /* valid COS entries */ 5562306a36Sopenharmony_ci struct bnx2x_dcbx_cos_params cos_params[DCBX_COS_MAX_NUM]; 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct bnx2x_dcbx_pfc_params { 5962306a36Sopenharmony_ci u32 enabled; 6062306a36Sopenharmony_ci u32 priority_non_pauseable_mask; 6162306a36Sopenharmony_ci}; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistruct bnx2x_dcbx_port_params { 6462306a36Sopenharmony_ci struct bnx2x_dcbx_pfc_params pfc; 6562306a36Sopenharmony_ci struct bnx2x_dcbx_pg_params ets; 6662306a36Sopenharmony_ci struct bnx2x_dcbx_app_params app; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define BNX2X_DCBX_CONFIG_INV_VALUE (0xFFFFFFFF) 7062306a36Sopenharmony_ci#define BNX2X_DCBX_OVERWRITE_SETTINGS_DISABLE 0 7162306a36Sopenharmony_ci#define BNX2X_DCBX_OVERWRITE_SETTINGS_ENABLE 1 7262306a36Sopenharmony_ci#define BNX2X_DCBX_OVERWRITE_SETTINGS_INVALID (BNX2X_DCBX_CONFIG_INV_VALUE) 7362306a36Sopenharmony_ci#define BNX2X_IS_ETS_ENABLED(bp) ((bp)->dcb_state == BNX2X_DCB_STATE_ON &&\ 7462306a36Sopenharmony_ci (bp)->dcbx_port_params.ets.enabled) 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistruct bnx2x_config_lldp_params { 7762306a36Sopenharmony_ci u32 overwrite_settings; 7862306a36Sopenharmony_ci u32 msg_tx_hold; 7962306a36Sopenharmony_ci u32 msg_fast_tx; 8062306a36Sopenharmony_ci u32 tx_credit_max; 8162306a36Sopenharmony_ci u32 msg_tx_interval; 8262306a36Sopenharmony_ci u32 tx_fast; 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistruct bnx2x_admin_priority_app_table { 8662306a36Sopenharmony_ci u32 valid; 8762306a36Sopenharmony_ci u32 priority; 8862306a36Sopenharmony_ci#define INVALID_TRAFFIC_TYPE_PRIORITY (0xFFFFFFFF) 8962306a36Sopenharmony_ci u32 traffic_type; 9062306a36Sopenharmony_ci#define TRAFFIC_TYPE_ETH 0 9162306a36Sopenharmony_ci#define TRAFFIC_TYPE_PORT 1 9262306a36Sopenharmony_ci u32 app_id; 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci#define DCBX_CONFIG_MAX_APP_PROTOCOL 4 9662306a36Sopenharmony_cistruct bnx2x_config_dcbx_params { 9762306a36Sopenharmony_ci u32 overwrite_settings; 9862306a36Sopenharmony_ci u32 admin_dcbx_version; 9962306a36Sopenharmony_ci u32 admin_ets_enable; 10062306a36Sopenharmony_ci u32 admin_pfc_enable; 10162306a36Sopenharmony_ci u32 admin_tc_supported_tx_enable; 10262306a36Sopenharmony_ci u32 admin_ets_configuration_tx_enable; 10362306a36Sopenharmony_ci u32 admin_ets_recommendation_tx_enable; 10462306a36Sopenharmony_ci u32 admin_pfc_tx_enable; 10562306a36Sopenharmony_ci u32 admin_application_priority_tx_enable; 10662306a36Sopenharmony_ci u32 admin_ets_willing; 10762306a36Sopenharmony_ci u32 admin_ets_reco_valid; 10862306a36Sopenharmony_ci u32 admin_pfc_willing; 10962306a36Sopenharmony_ci u32 admin_app_priority_willing; 11062306a36Sopenharmony_ci u32 admin_configuration_bw_precentage[8]; 11162306a36Sopenharmony_ci u32 admin_configuration_ets_pg[8]; 11262306a36Sopenharmony_ci u32 admin_recommendation_bw_precentage[8]; 11362306a36Sopenharmony_ci u32 admin_recommendation_ets_pg[8]; 11462306a36Sopenharmony_ci u32 admin_pfc_bitmap; 11562306a36Sopenharmony_ci struct bnx2x_admin_priority_app_table 11662306a36Sopenharmony_ci admin_priority_app_table[DCBX_CONFIG_MAX_APP_PROTOCOL]; 11762306a36Sopenharmony_ci u32 admin_default_priority; 11862306a36Sopenharmony_ci}; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci#define GET_FLAGS(flags, bits) ((flags) & (bits)) 12162306a36Sopenharmony_ci#define SET_FLAGS(flags, bits) ((flags) |= (bits)) 12262306a36Sopenharmony_ci#define RESET_FLAGS(flags, bits) ((flags) &= ~(bits)) 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cienum { 12562306a36Sopenharmony_ci DCBX_READ_LOCAL_MIB, 12662306a36Sopenharmony_ci DCBX_READ_REMOTE_MIB 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#define ETH_TYPE_FCOE (0x8906) 13062306a36Sopenharmony_ci#define TCP_PORT_ISCSI (0xCBC) 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci#define PFC_VALUE_FRAME_SIZE (512) 13362306a36Sopenharmony_ci#define PFC_QUANTA_IN_NANOSEC_FROM_SPEED_MEGA(mega_speed) \ 13462306a36Sopenharmony_ci ((1000 * PFC_VALUE_FRAME_SIZE)/(mega_speed)) 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci#define PFC_BRB1_REG_HIGH_LLFC_LOW_THRESHOLD 130 13762306a36Sopenharmony_ci#define PFC_BRB1_REG_HIGH_LLFC_HIGH_THRESHOLD 170 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistruct cos_entry_help_data { 14062306a36Sopenharmony_ci u32 pri_join_mask; 14162306a36Sopenharmony_ci u32 cos_bw; 14262306a36Sopenharmony_ci u8 strict; 14362306a36Sopenharmony_ci bool pausable; 14462306a36Sopenharmony_ci}; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistruct cos_help_data { 14762306a36Sopenharmony_ci struct cos_entry_help_data data[DCBX_COS_MAX_NUM]; 14862306a36Sopenharmony_ci u8 num_of_cos; 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci#define DCBX_ILLEGAL_PG (0xFF) 15262306a36Sopenharmony_ci#define DCBX_PFC_PRI_MASK (0xFF) 15362306a36Sopenharmony_ci#define DCBX_STRICT_PRIORITY (15) 15462306a36Sopenharmony_ci#define DCBX_INVALID_COS_BW (0xFFFFFFFF) 15562306a36Sopenharmony_ci#define DCBX_PFC_PRI_NON_PAUSE_MASK(bp) \ 15662306a36Sopenharmony_ci ((bp)->dcbx_port_params.pfc.priority_non_pauseable_mask) 15762306a36Sopenharmony_ci#define DCBX_PFC_PRI_PAUSE_MASK(bp) \ 15862306a36Sopenharmony_ci ((u8)~DCBX_PFC_PRI_NON_PAUSE_MASK(bp)) 15962306a36Sopenharmony_ci#define DCBX_PFC_PRI_GET_PAUSE(bp, pg_pri) \ 16062306a36Sopenharmony_ci ((pg_pri) & (DCBX_PFC_PRI_PAUSE_MASK(bp))) 16162306a36Sopenharmony_ci#define DCBX_PFC_PRI_GET_NON_PAUSE(bp, pg_pri) \ 16262306a36Sopenharmony_ci (DCBX_PFC_PRI_NON_PAUSE_MASK(bp) & (pg_pri)) 16362306a36Sopenharmony_ci#define DCBX_IS_PFC_PRI_SOME_PAUSE(bp, pg_pri) \ 16462306a36Sopenharmony_ci (0 != DCBX_PFC_PRI_GET_PAUSE(bp, pg_pri)) 16562306a36Sopenharmony_ci#define IS_DCBX_PFC_PRI_ONLY_PAUSE(bp, pg_pri) \ 16662306a36Sopenharmony_ci (pg_pri == DCBX_PFC_PRI_GET_PAUSE((bp), (pg_pri))) 16762306a36Sopenharmony_ci#define IS_DCBX_PFC_PRI_ONLY_NON_PAUSE(bp, pg_pri)\ 16862306a36Sopenharmony_ci ((pg_pri) == DCBX_PFC_PRI_GET_NON_PAUSE((bp), (pg_pri))) 16962306a36Sopenharmony_ci#define IS_DCBX_PFC_PRI_MIX_PAUSE(bp, pg_pri) \ 17062306a36Sopenharmony_ci (!(IS_DCBX_PFC_PRI_ONLY_NON_PAUSE((bp), (pg_pri)) || \ 17162306a36Sopenharmony_ci IS_DCBX_PFC_PRI_ONLY_PAUSE((bp), (pg_pri)))) 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_cistruct pg_entry_help_data { 17462306a36Sopenharmony_ci u8 num_of_dif_pri; 17562306a36Sopenharmony_ci u8 pg; 17662306a36Sopenharmony_ci u32 pg_priority; 17762306a36Sopenharmony_ci}; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistruct pg_help_data { 18062306a36Sopenharmony_ci struct pg_entry_help_data data[LLFC_DRIVER_TRAFFIC_TYPE_MAX]; 18162306a36Sopenharmony_ci u8 num_of_pg; 18262306a36Sopenharmony_ci}; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci/* forward DCB/PFC related declarations */ 18562306a36Sopenharmony_cistruct bnx2x; 18662306a36Sopenharmony_civoid bnx2x_dcbx_update(struct work_struct *work); 18762306a36Sopenharmony_civoid bnx2x_dcbx_init_params(struct bnx2x *bp); 18862306a36Sopenharmony_civoid bnx2x_dcbx_set_state(struct bnx2x *bp, bool dcb_on, u32 dcbx_enabled); 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cienum { 19162306a36Sopenharmony_ci BNX2X_DCBX_STATE_NEG_RECEIVED = 0x1, 19262306a36Sopenharmony_ci BNX2X_DCBX_STATE_TX_PAUSED, 19362306a36Sopenharmony_ci BNX2X_DCBX_STATE_TX_RELEASED 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_civoid bnx2x_dcbx_set_params(struct bnx2x *bp, u32 state); 19762306a36Sopenharmony_civoid bnx2x_dcbx_pmf_update(struct bnx2x *bp); 19862306a36Sopenharmony_ci/* DCB netlink */ 19962306a36Sopenharmony_ci#ifdef BCM_DCBNL 20062306a36Sopenharmony_ciextern const struct dcbnl_rtnl_ops bnx2x_dcbnl_ops; 20162306a36Sopenharmony_ciint bnx2x_dcbnl_update_applist(struct bnx2x *bp, bool delall); 20262306a36Sopenharmony_ci#endif /* BCM_DCBNL */ 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ciint bnx2x_dcbx_stop_hw_tx(struct bnx2x *bp); 20562306a36Sopenharmony_ciint bnx2x_dcbx_resume_hw_tx(struct bnx2x *bp); 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ci#endif /* BNX2X_DCB_H */ 208