14e400768SDavid Christensen /*- 2*7282444bSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause 3*7282444bSPedro F. Giffuni * 44ef8ebfdSDavid C Somayajulu * Copyright (c) 2007-2017 QLogic Corporation. All rights reserved. 54e400768SDavid Christensen * 64e400768SDavid Christensen * Redistribution and use in source and binary forms, with or without 74e400768SDavid Christensen * modification, are permitted provided that the following conditions 84e400768SDavid Christensen * are met: 94e400768SDavid Christensen * 104e400768SDavid Christensen * 1. Redistributions of source code must retain the above copyright 114e400768SDavid Christensen * notice, this list of conditions and the following disclaimer. 124e400768SDavid Christensen * 2. Redistributions in binary form must reproduce the above copyright 134e400768SDavid Christensen * notice, this list of conditions and the following disclaimer in the 144e400768SDavid Christensen * documentation and/or other materials provided with the distribution. 154e400768SDavid Christensen * 164ef8ebfdSDavid C Somayajulu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 174e400768SDavid Christensen * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 184e400768SDavid Christensen * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 194e400768SDavid Christensen * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 204e400768SDavid Christensen * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 214e400768SDavid Christensen * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 224e400768SDavid Christensen * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 234e400768SDavid Christensen * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 244e400768SDavid Christensen * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 254e400768SDavid Christensen * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 264e400768SDavid Christensen * THE POSSIBILITY OF SUCH DAMAGE. 274e400768SDavid Christensen */ 284e400768SDavid Christensen 294e400768SDavid Christensen #include <sys/cdefs.h> 304e400768SDavid Christensen #ifndef ELINK_H 314e400768SDavid Christensen #define ELINK_H 324e400768SDavid Christensen 334e400768SDavid Christensen #define ELINK_DEBUG 344e400768SDavid Christensen 354e400768SDavid Christensen 364e400768SDavid Christensen 374e400768SDavid Christensen 384e400768SDavid Christensen 394e400768SDavid Christensen 404e400768SDavid Christensen /***********************************************************/ 414e400768SDavid Christensen /* CLC Call backs functions */ 424e400768SDavid Christensen /***********************************************************/ 434e400768SDavid Christensen /* CLC device structure */ 444e400768SDavid Christensen struct bxe_softc; 454e400768SDavid Christensen 464e400768SDavid Christensen extern uint32_t elink_cb_reg_read(struct bxe_softc *sc, uint32_t reg_addr); 474e400768SDavid Christensen extern void elink_cb_reg_write(struct bxe_softc *sc, uint32_t reg_addr, uint32_t val); 484e400768SDavid Christensen /* wb_write - pointer to 2 32 bits vars to be passed to the DMAE*/ 494e400768SDavid Christensen extern void elink_cb_reg_wb_write(struct bxe_softc *sc, uint32_t offset, 504e400768SDavid Christensen uint32_t *wb_write, uint16_t len); 514e400768SDavid Christensen extern void elink_cb_reg_wb_read(struct bxe_softc *sc, uint32_t offset, 524e400768SDavid Christensen uint32_t *wb_write, uint16_t len); 534e400768SDavid Christensen 544e400768SDavid Christensen /* mode - 0( LOW ) /1(HIGH)*/ 554e400768SDavid Christensen extern uint8_t elink_cb_gpio_write(struct bxe_softc *sc, 564e400768SDavid Christensen uint16_t gpio_num, 574e400768SDavid Christensen uint8_t mode, uint8_t port); 584e400768SDavid Christensen extern uint8_t elink_cb_gpio_mult_write(struct bxe_softc *sc, 594e400768SDavid Christensen uint8_t pins, 604e400768SDavid Christensen uint8_t mode); 614e400768SDavid Christensen 624e400768SDavid Christensen extern uint32_t elink_cb_gpio_read(struct bxe_softc *sc, uint16_t gpio_num, uint8_t port); 634e400768SDavid Christensen extern uint8_t elink_cb_gpio_int_write(struct bxe_softc *sc, 644e400768SDavid Christensen uint16_t gpio_num, 654e400768SDavid Christensen uint8_t mode, uint8_t port); 664e400768SDavid Christensen 674e400768SDavid Christensen extern uint32_t elink_cb_fw_command(struct bxe_softc *sc, uint32_t command, uint32_t param); 684e400768SDavid Christensen 694e400768SDavid Christensen /* Delay */ 704e400768SDavid Christensen extern void elink_cb_udelay(struct bxe_softc *sc, uint32_t microsecond); 714e400768SDavid Christensen 724e400768SDavid Christensen /* This function is called every 1024 bytes downloading of phy firmware. 734e400768SDavid Christensen Driver can use it to print to screen indication for download progress */ 744e400768SDavid Christensen extern void elink_cb_download_progress(struct bxe_softc *sc, uint32_t cur, uint32_t total); 754e400768SDavid Christensen 764e400768SDavid Christensen /* Each log type has its own parameters */ 774e400768SDavid Christensen typedef enum elink_log_id { 784e400768SDavid Christensen ELINK_LOG_ID_UNQUAL_IO_MODULE = 0, /* uint8_t port, const char* vendor_name, const char* vendor_pn */ 794e400768SDavid Christensen ELINK_LOG_ID_OVER_CURRENT = 1, /* uint8_t port */ 804e400768SDavid Christensen ELINK_LOG_ID_PHY_UNINITIALIZED = 2, /* uint8_t port */ 814e400768SDavid Christensen ELINK_LOG_ID_MDIO_ACCESS_TIMEOUT= 3, /* No params */ 824e400768SDavid Christensen ELINK_LOG_ID_NON_10G_MODULE = 4, /* uint8_t port */ 834e400768SDavid Christensen }elink_log_id_t; 844e400768SDavid Christensen 854e400768SDavid Christensen typedef enum elink_status { 864e400768SDavid Christensen ELINK_STATUS_OK = 0, 874e400768SDavid Christensen ELINK_STATUS_ERROR, 884e400768SDavid Christensen ELINK_STATUS_TIMEOUT, 894e400768SDavid Christensen ELINK_STATUS_NO_LINK, 904e400768SDavid Christensen ELINK_STATUS_INVALID_IMAGE, 914e400768SDavid Christensen ELINK_OP_NOT_SUPPORTED = 122 924e400768SDavid Christensen } elink_status_t; 934e400768SDavid Christensen extern void elink_cb_event_log(struct bxe_softc *sc, const elink_log_id_t log_id, ...); 944e400768SDavid Christensen extern void elink_cb_load_warpcore_microcode(void); 954e400768SDavid Christensen 964e400768SDavid Christensen extern uint8_t elink_cb_path_id(struct bxe_softc *sc); 974e400768SDavid Christensen 984e400768SDavid Christensen extern void elink_cb_notify_link_changed(struct bxe_softc *sc); 994e400768SDavid Christensen 1004e400768SDavid Christensen #define ELINK_EVENT_LOG_LEVEL_ERROR 1 1014e400768SDavid Christensen #define ELINK_EVENT_LOG_LEVEL_WARNING 2 1024e400768SDavid Christensen #define ELINK_EVENT_ID_SFP_UNQUALIFIED_MODULE 1 1034e400768SDavid Christensen #define ELINK_EVENT_ID_SFP_POWER_FAULT 2 1044e400768SDavid Christensen 1054e400768SDavid Christensen #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) 1064e400768SDavid Christensen /* Debug prints */ 1074e400768SDavid Christensen #ifdef ELINK_DEBUG 1084e400768SDavid Christensen 1094e400768SDavid Christensen extern void elink_cb_dbg(struct bxe_softc *sc, char *fmt); 1104e400768SDavid Christensen extern void elink_cb_dbg1(struct bxe_softc *sc, char *fmt, uint32_t arg1); 1114e400768SDavid Christensen extern void elink_cb_dbg2(struct bxe_softc *sc, char *fmt, uint32_t arg1, uint32_t arg2); 1124e400768SDavid Christensen extern void elink_cb_dbg3(struct bxe_softc *sc, char *fmt, uint32_t arg1, uint32_t arg2, 1134e400768SDavid Christensen uint32_t arg3); 1144e400768SDavid Christensen 1154e400768SDavid Christensen #define ELINK_DEBUG_P0(sc, fmt) elink_cb_dbg(sc, fmt) 1164e400768SDavid Christensen #define ELINK_DEBUG_P1(sc, fmt, arg1) elink_cb_dbg1(sc, fmt, arg1) 1174e400768SDavid Christensen #define ELINK_DEBUG_P2(sc, fmt, arg1, arg2) elink_cb_dbg2(sc, fmt, arg1, arg2) 1184e400768SDavid Christensen #define ELINK_DEBUG_P3(sc, fmt, arg1, arg2, arg3) \ 1194e400768SDavid Christensen elink_cb_dbg3(sc, fmt, arg1, arg2, arg3) 1204e400768SDavid Christensen #else 1214e400768SDavid Christensen #define ELINK_DEBUG_P0(sc, fmt) 1224e400768SDavid Christensen #define ELINK_DEBUG_P1(sc, fmt, arg1) 1234e400768SDavid Christensen #define ELINK_DEBUG_P2(sc, fmt, arg1, arg2) 1244e400768SDavid Christensen #define ELINK_DEBUG_P3(sc, fmt, arg1, arg2, arg3) 1254e400768SDavid Christensen #endif 1264e400768SDavid Christensen 1274e400768SDavid Christensen /***********************************************************/ 1284e400768SDavid Christensen /* Defines */ 1294e400768SDavid Christensen /***********************************************************/ 1304e400768SDavid Christensen #define ELINK_DEFAULT_PHY_DEV_ADDR 3 1314e400768SDavid Christensen #define ELINK_E2_DEFAULT_PHY_DEV_ADDR 5 1324e400768SDavid Christensen 1334e400768SDavid Christensen 1344e400768SDavid Christensen #define DUPLEX_FULL 1 1354e400768SDavid Christensen #define DUPLEX_HALF 2 1364e400768SDavid Christensen 1374e400768SDavid Christensen #define ELINK_FLOW_CTRL_AUTO PORT_FEATURE_FLOW_CONTROL_AUTO 1384e400768SDavid Christensen #define ELINK_FLOW_CTRL_TX PORT_FEATURE_FLOW_CONTROL_TX 1394e400768SDavid Christensen #define ELINK_FLOW_CTRL_RX PORT_FEATURE_FLOW_CONTROL_RX 1404e400768SDavid Christensen #define ELINK_FLOW_CTRL_BOTH PORT_FEATURE_FLOW_CONTROL_BOTH 1414e400768SDavid Christensen #define ELINK_FLOW_CTRL_NONE PORT_FEATURE_FLOW_CONTROL_NONE 1424e400768SDavid Christensen 1434e400768SDavid Christensen #define ELINK_NET_SERDES_IF_XFI 1 1444e400768SDavid Christensen #define ELINK_NET_SERDES_IF_SFI 2 1454e400768SDavid Christensen #define ELINK_NET_SERDES_IF_KR 3 1464e400768SDavid Christensen #define ELINK_NET_SERDES_IF_DXGXS 4 1474e400768SDavid Christensen 1484e400768SDavid Christensen #define ELINK_SPEED_AUTO_NEG 0 1494e400768SDavid Christensen #define ELINK_SPEED_10 10 1504e400768SDavid Christensen #define ELINK_SPEED_100 100 1514e400768SDavid Christensen #define ELINK_SPEED_1000 1000 1524e400768SDavid Christensen #define ELINK_SPEED_2500 2500 1534e400768SDavid Christensen #define ELINK_SPEED_10000 10000 1544e400768SDavid Christensen #define ELINK_SPEED_20000 20000 1554e400768SDavid Christensen 1564e400768SDavid Christensen #define ELINK_I2C_DEV_ADDR_A0 0xa0 1574e400768SDavid Christensen #define ELINK_I2C_DEV_ADDR_A2 0xa2 1584e400768SDavid Christensen 1594e400768SDavid Christensen #define ELINK_SFP_EEPROM_PAGE_SIZE 16 1604e400768SDavid Christensen #define ELINK_SFP_EEPROM_VENDOR_NAME_ADDR 0x14 1614e400768SDavid Christensen #define ELINK_SFP_EEPROM_VENDOR_NAME_SIZE 16 1624e400768SDavid Christensen #define ELINK_SFP_EEPROM_VENDOR_OUI_ADDR 0x25 1634e400768SDavid Christensen #define ELINK_SFP_EEPROM_VENDOR_OUI_SIZE 3 1644e400768SDavid Christensen #define ELINK_SFP_EEPROM_PART_NO_ADDR 0x28 1654e400768SDavid Christensen #define ELINK_SFP_EEPROM_PART_NO_SIZE 16 1664e400768SDavid Christensen #define ELINK_SFP_EEPROM_REVISION_ADDR 0x38 1674e400768SDavid Christensen #define ELINK_SFP_EEPROM_REVISION_SIZE 4 1684e400768SDavid Christensen #define ELINK_SFP_EEPROM_SERIAL_ADDR 0x44 1694e400768SDavid Christensen #define ELINK_SFP_EEPROM_SERIAL_SIZE 16 1704e400768SDavid Christensen #define ELINK_SFP_EEPROM_DATE_ADDR 0x54 /* ASCII YYMMDD */ 1714e400768SDavid Christensen #define ELINK_SFP_EEPROM_DATE_SIZE 6 1724e400768SDavid Christensen #define ELINK_SFP_EEPROM_DIAG_TYPE_ADDR 0x5c 1734e400768SDavid Christensen #define ELINK_SFP_EEPROM_DIAG_TYPE_SIZE 1 1744e400768SDavid Christensen #define ELINK_SFP_EEPROM_DIAG_ADDR_CHANGE_REQ (1<<2) 1754e400768SDavid Christensen #define ELINK_SFP_EEPROM_SFF_8472_COMP_ADDR 0x5e 1764e400768SDavid Christensen #define ELINK_SFP_EEPROM_SFF_8472_COMP_SIZE 1 1774ef8ebfdSDavid C Somayajulu #define ELINK_SFP_EEPROM_VENDOR_SPECIFIC_ADDR 0x60 1784ef8ebfdSDavid C Somayajulu #define ELINK_SFP_EEPROM_VENDOR_SPECIFIC_SIZE 16 1794ef8ebfdSDavid C Somayajulu 1804e400768SDavid Christensen 1814e400768SDavid Christensen #define ELINK_SFP_EEPROM_A2_CHECKSUM_RANGE 0x5e 1824e400768SDavid Christensen #define ELINK_SFP_EEPROM_A2_CC_DMI_ADDR 0x5f 1834e400768SDavid Christensen 1844e400768SDavid Christensen #define ELINK_PWR_FLT_ERR_MSG_LEN 250 1854e400768SDavid Christensen 1864e400768SDavid Christensen #define ELINK_XGXS_EXT_PHY_TYPE(ext_phy_config) \ 1874e400768SDavid Christensen ((ext_phy_config) & PORT_HW_CFG_XGXS_EXT_PHY_TYPE_MASK) 1884e400768SDavid Christensen #define ELINK_XGXS_EXT_PHY_ADDR(ext_phy_config) \ 1894e400768SDavid Christensen (((ext_phy_config) & PORT_HW_CFG_XGXS_EXT_PHY_ADDR_MASK) >> \ 1904e400768SDavid Christensen PORT_HW_CFG_XGXS_EXT_PHY_ADDR_SHIFT) 1914e400768SDavid Christensen #define ELINK_SERDES_EXT_PHY_TYPE(ext_phy_config) \ 1924e400768SDavid Christensen ((ext_phy_config) & PORT_HW_CFG_SERDES_EXT_PHY_TYPE_MASK) 1934e400768SDavid Christensen 1944e400768SDavid Christensen /* Single Media Direct board is the plain 577xx board with CX4/RJ45 jacks */ 1954e400768SDavid Christensen #define ELINK_SINGLE_MEDIA_DIRECT(params) (params->num_phys == 1) 1964e400768SDavid Christensen /* Single Media board contains single external phy */ 1974e400768SDavid Christensen #define ELINK_SINGLE_MEDIA(params) (params->num_phys == 2) 1984e400768SDavid Christensen /* Dual Media board contains two external phy with different media */ 1994e400768SDavid Christensen #define ELINK_DUAL_MEDIA(params) (params->num_phys == 3) 2004e400768SDavid Christensen 2014e400768SDavid Christensen #define ELINK_FW_PARAM_PHY_ADDR_MASK 0x000000FF 2024e400768SDavid Christensen #define ELINK_FW_PARAM_PHY_TYPE_MASK 0x0000FF00 2034e400768SDavid Christensen #define ELINK_FW_PARAM_MDIO_CTRL_MASK 0xFFFF0000 2044e400768SDavid Christensen #define ELINK_FW_PARAM_MDIO_CTRL_OFFSET 16 2054e400768SDavid Christensen #define ELINK_FW_PARAM_PHY_ADDR(fw_param) (fw_param & \ 2064e400768SDavid Christensen ELINK_FW_PARAM_PHY_ADDR_MASK) 2074e400768SDavid Christensen #define ELINK_FW_PARAM_PHY_TYPE(fw_param) (fw_param & \ 2084e400768SDavid Christensen ELINK_FW_PARAM_PHY_TYPE_MASK) 2094e400768SDavid Christensen #define ELINK_FW_PARAM_MDIO_CTRL(fw_param) ((fw_param & \ 2104e400768SDavid Christensen ELINK_FW_PARAM_MDIO_CTRL_MASK) >> \ 2114e400768SDavid Christensen ELINK_FW_PARAM_MDIO_CTRL_OFFSET) 2124e400768SDavid Christensen #define ELINK_FW_PARAM_SET(phy_addr, phy_type, mdio_access) \ 2134e400768SDavid Christensen (phy_addr | phy_type | mdio_access << ELINK_FW_PARAM_MDIO_CTRL_OFFSET) 2144e400768SDavid Christensen 2154e400768SDavid Christensen 2164e400768SDavid Christensen #define ELINK_PFC_BRB_FULL_LB_XOFF_THRESHOLD 170 2174e400768SDavid Christensen #define ELINK_PFC_BRB_FULL_LB_XON_THRESHOLD 250 2184e400768SDavid Christensen 2194e400768SDavid Christensen #define ELINK_MAXVAL(a, b) (((a) > (b)) ? (a) : (b)) 2204e400768SDavid Christensen 2214e400768SDavid Christensen #define ELINK_BMAC_CONTROL_RX_ENABLE 2 2224e400768SDavid Christensen /***********************************************************/ 2234e400768SDavid Christensen /* Structs */ 2244e400768SDavid Christensen /***********************************************************/ 2254e400768SDavid Christensen #define ELINK_INT_PHY 0 2264e400768SDavid Christensen #define ELINK_EXT_PHY1 1 2274e400768SDavid Christensen #define ELINK_EXT_PHY2 2 2284e400768SDavid Christensen #define ELINK_MAX_PHYS 3 2294e400768SDavid Christensen 2304e400768SDavid Christensen /* Same configuration is shared between the XGXS and the first external phy */ 2314e400768SDavid Christensen #define ELINK_LINK_CONFIG_SIZE (ELINK_MAX_PHYS - 1) 2324e400768SDavid Christensen #define ELINK_LINK_CONFIG_IDX(_phy_idx) ((_phy_idx == ELINK_INT_PHY) ? \ 2334e400768SDavid Christensen 0 : (_phy_idx - 1)) 2344e400768SDavid Christensen /***********************************************************/ 2354e400768SDavid Christensen /* elink_phy struct */ 2364e400768SDavid Christensen /* Defines the required arguments and function per phy */ 2374e400768SDavid Christensen /***********************************************************/ 2384e400768SDavid Christensen struct elink_vars; 2394e400768SDavid Christensen struct elink_params; 2404e400768SDavid Christensen struct elink_phy; 2414e400768SDavid Christensen 2424e400768SDavid Christensen typedef uint8_t (*config_init_t)(struct elink_phy *phy, struct elink_params *params, 2434e400768SDavid Christensen struct elink_vars *vars); 2444e400768SDavid Christensen typedef uint8_t (*read_status_t)(struct elink_phy *phy, struct elink_params *params, 2454e400768SDavid Christensen struct elink_vars *vars); 2464e400768SDavid Christensen typedef void (*link_reset_t)(struct elink_phy *phy, 2474e400768SDavid Christensen struct elink_params *params); 2484e400768SDavid Christensen typedef void (*config_loopback_t)(struct elink_phy *phy, 2494e400768SDavid Christensen struct elink_params *params); 2504e400768SDavid Christensen typedef uint8_t (*format_fw_ver_t)(uint32_t raw, uint8_t *str, uint16_t *len); 2514e400768SDavid Christensen typedef void (*hw_reset_t)(struct elink_phy *phy, struct elink_params *params); 2524e400768SDavid Christensen typedef void (*set_link_led_t)(struct elink_phy *phy, 2534e400768SDavid Christensen struct elink_params *params, uint8_t mode); 2544e400768SDavid Christensen typedef void (*phy_specific_func_t)(struct elink_phy *phy, 2554e400768SDavid Christensen struct elink_params *params, uint32_t action); 2564e400768SDavid Christensen struct elink_reg_set { 2574e400768SDavid Christensen uint8_t devad; 2584e400768SDavid Christensen uint16_t reg; 2594e400768SDavid Christensen uint16_t val; 2604e400768SDavid Christensen }; 2614e400768SDavid Christensen 2624e400768SDavid Christensen struct elink_phy { 2634e400768SDavid Christensen uint32_t type; 2644e400768SDavid Christensen 2654e400768SDavid Christensen /* Loaded during init */ 2664e400768SDavid Christensen uint8_t addr; 2674e400768SDavid Christensen uint8_t def_md_devad; 2684e400768SDavid Christensen uint16_t flags; 2694e400768SDavid Christensen /* No Over-Current detection */ 2704e400768SDavid Christensen #define ELINK_FLAGS_NOC (1<<1) 2714e400768SDavid Christensen /* Fan failure detection required */ 2724e400768SDavid Christensen #define ELINK_FLAGS_FAN_FAILURE_DET_REQ (1<<2) 2734e400768SDavid Christensen /* Initialize first the XGXS and only then the phy itself */ 2744e400768SDavid Christensen #define ELINK_FLAGS_INIT_XGXS_FIRST (1<<3) 2754e400768SDavid Christensen #define ELINK_FLAGS_WC_DUAL_MODE (1<<4) 2764e400768SDavid Christensen #define ELINK_FLAGS_4_PORT_MODE (1<<5) 2774e400768SDavid Christensen #define ELINK_FLAGS_REARM_LATCH_SIGNAL (1<<6) 2784e400768SDavid Christensen #define ELINK_FLAGS_SFP_NOT_APPROVED (1<<7) 2794e400768SDavid Christensen #define ELINK_FLAGS_MDC_MDIO_WA (1<<8) 2804e400768SDavid Christensen #define ELINK_FLAGS_DUMMY_READ (1<<9) 2814e400768SDavid Christensen #define ELINK_FLAGS_MDC_MDIO_WA_B0 (1<<10) 2824e400768SDavid Christensen #define ELINK_FLAGS_SFP_MODULE_PLUGGED_IN_WC (1<<11) 2834e400768SDavid Christensen #define ELINK_FLAGS_TX_ERROR_CHECK (1<<12) 2844e400768SDavid Christensen #define ELINK_FLAGS_EEE (1<<13) 2854e400768SDavid Christensen #define ELINK_FLAGS_TEMPERATURE (1<<14) 2864e400768SDavid Christensen #define ELINK_FLAGS_MDC_MDIO_WA_G (1<<15) 2874e400768SDavid Christensen 2884e400768SDavid Christensen /* preemphasis values for the rx side */ 2894e400768SDavid Christensen uint16_t rx_preemphasis[4]; 2904e400768SDavid Christensen 2914e400768SDavid Christensen /* preemphasis values for the tx side */ 2924e400768SDavid Christensen uint16_t tx_preemphasis[4]; 2934e400768SDavid Christensen 2944e400768SDavid Christensen /* EMAC address for access MDIO */ 2954e400768SDavid Christensen uint32_t mdio_ctrl; 2964e400768SDavid Christensen 2974e400768SDavid Christensen uint32_t supported; 2984e400768SDavid Christensen #define ELINK_SUPPORTED_10baseT_Half (1<<0) 2994e400768SDavid Christensen #define ELINK_SUPPORTED_10baseT_Full (1<<1) 3004e400768SDavid Christensen #define ELINK_SUPPORTED_100baseT_Half (1<<2) 3014e400768SDavid Christensen #define ELINK_SUPPORTED_100baseT_Full (1<<3) 3024e400768SDavid Christensen #define ELINK_SUPPORTED_1000baseT_Full (1<<4) 3034e400768SDavid Christensen #define ELINK_SUPPORTED_2500baseX_Full (1<<5) 3044e400768SDavid Christensen #define ELINK_SUPPORTED_10000baseT_Full (1<<6) 3054e400768SDavid Christensen #define ELINK_SUPPORTED_TP (1<<7) 3064e400768SDavid Christensen #define ELINK_SUPPORTED_FIBRE (1<<8) 3074e400768SDavid Christensen #define ELINK_SUPPORTED_Autoneg (1<<9) 3084e400768SDavid Christensen #define ELINK_SUPPORTED_Pause (1<<10) 3094e400768SDavid Christensen #define ELINK_SUPPORTED_Asym_Pause (1<<11) 3104ef8ebfdSDavid C Somayajulu #define ELINK_SUPPORTED_1000baseKX_Full (1<<17) 3114ef8ebfdSDavid C Somayajulu #define ELINK_SUPPORTED_10000baseKR_Full (1<<19) 3124e400768SDavid Christensen #define ELINK_SUPPORTED_20000baseMLD2_Full (1<<21) 3134e400768SDavid Christensen #define ELINK_SUPPORTED_20000baseKR2_Full (1<<22) 3144e400768SDavid Christensen 3154e400768SDavid Christensen uint32_t media_type; 3164e400768SDavid Christensen #define ELINK_ETH_PHY_UNSPECIFIED 0x0 3174e400768SDavid Christensen #define ELINK_ETH_PHY_SFPP_10G_FIBER 0x1 3184e400768SDavid Christensen #define ELINK_ETH_PHY_XFP_FIBER 0x2 3194e400768SDavid Christensen #define ELINK_ETH_PHY_DA_TWINAX 0x3 3204e400768SDavid Christensen #define ELINK_ETH_PHY_BASE_T 0x4 3214e400768SDavid Christensen #define ELINK_ETH_PHY_SFP_1G_FIBER 0x5 3224e400768SDavid Christensen #define ELINK_ETH_PHY_KR 0xf0 3234e400768SDavid Christensen #define ELINK_ETH_PHY_CX4 0xf1 3244e400768SDavid Christensen #define ELINK_ETH_PHY_NOT_PRESENT 0xff 3254e400768SDavid Christensen 3264e400768SDavid Christensen /* The address in which version is located*/ 3274e400768SDavid Christensen uint32_t ver_addr; 3284e400768SDavid Christensen 3294e400768SDavid Christensen uint16_t req_flow_ctrl; 3304e400768SDavid Christensen 3314e400768SDavid Christensen uint16_t req_line_speed; 3324e400768SDavid Christensen 3334e400768SDavid Christensen uint32_t speed_cap_mask; 3344e400768SDavid Christensen 3354e400768SDavid Christensen uint16_t req_duplex; 3364e400768SDavid Christensen uint16_t rsrv; 3374e400768SDavid Christensen /* Called per phy/port init, and it configures LASI, speed, autoneg, 3384e400768SDavid Christensen duplex, flow control negotiation, etc. */ 3394e400768SDavid Christensen config_init_t config_init; 3404e400768SDavid Christensen 3414e400768SDavid Christensen /* Called due to interrupt. It determines the link, speed */ 3424e400768SDavid Christensen read_status_t read_status; 3434e400768SDavid Christensen 3444e400768SDavid Christensen /* Called when driver is unloading. Should reset the phy */ 3454e400768SDavid Christensen link_reset_t link_reset; 3464e400768SDavid Christensen 3474e400768SDavid Christensen /* Set the loopback configuration for the phy */ 3484e400768SDavid Christensen config_loopback_t config_loopback; 3494e400768SDavid Christensen 3504e400768SDavid Christensen /* Format the given raw number into str up to len */ 3514e400768SDavid Christensen format_fw_ver_t format_fw_ver; 3524e400768SDavid Christensen 3534e400768SDavid Christensen /* Reset the phy (both ports) */ 3544e400768SDavid Christensen hw_reset_t hw_reset; 3554e400768SDavid Christensen 3564e400768SDavid Christensen /* Set link led mode (on/off/oper)*/ 3574e400768SDavid Christensen set_link_led_t set_link_led; 3584e400768SDavid Christensen 3594e400768SDavid Christensen /* PHY Specific tasks */ 3604e400768SDavid Christensen phy_specific_func_t phy_specific_func; 3614e400768SDavid Christensen #define ELINK_DISABLE_TX 1 3624e400768SDavid Christensen #define ELINK_ENABLE_TX 2 3634e400768SDavid Christensen #define ELINK_PHY_INIT 3 3644e400768SDavid Christensen }; 3654e400768SDavid Christensen 3664e400768SDavid Christensen /* Inputs parameters to the CLC */ 3674e400768SDavid Christensen struct elink_params { 3684e400768SDavid Christensen 3694e400768SDavid Christensen uint8_t port; 3704e400768SDavid Christensen 3714e400768SDavid Christensen /* Default / User Configuration */ 3724e400768SDavid Christensen uint8_t loopback_mode; 3734e400768SDavid Christensen #define ELINK_LOOPBACK_NONE 0 3744e400768SDavid Christensen #define ELINK_LOOPBACK_EMAC 1 3754e400768SDavid Christensen #define ELINK_LOOPBACK_BMAC 2 3764e400768SDavid Christensen #define ELINK_LOOPBACK_XGXS 3 3774e400768SDavid Christensen #define ELINK_LOOPBACK_EXT_PHY 4 3784e400768SDavid Christensen #define ELINK_LOOPBACK_EXT 5 3794e400768SDavid Christensen #define ELINK_LOOPBACK_UMAC 6 3804e400768SDavid Christensen #define ELINK_LOOPBACK_XMAC 7 3814e400768SDavid Christensen 3824e400768SDavid Christensen /* Device parameters */ 3834e400768SDavid Christensen uint8_t mac_addr[6]; 3844e400768SDavid Christensen 3854e400768SDavid Christensen uint16_t req_duplex[ELINK_LINK_CONFIG_SIZE]; 3864e400768SDavid Christensen uint16_t req_flow_ctrl[ELINK_LINK_CONFIG_SIZE]; 3874e400768SDavid Christensen 3884e400768SDavid Christensen uint16_t req_line_speed[ELINK_LINK_CONFIG_SIZE]; /* Also determine AutoNeg */ 3894e400768SDavid Christensen 3904e400768SDavid Christensen /* shmem parameters */ 3914e400768SDavid Christensen uint32_t shmem_base; 3924e400768SDavid Christensen uint32_t shmem2_base; 3934e400768SDavid Christensen uint32_t speed_cap_mask[ELINK_LINK_CONFIG_SIZE]; 3944e400768SDavid Christensen uint32_t switch_cfg; 3954e400768SDavid Christensen #define ELINK_SWITCH_CFG_1G PORT_FEATURE_CON_SWITCH_1G_SWITCH 3964e400768SDavid Christensen #define ELINK_SWITCH_CFG_10G PORT_FEATURE_CON_SWITCH_10G_SWITCH 3974e400768SDavid Christensen #define ELINK_SWITCH_CFG_AUTO_DETECT PORT_FEATURE_CON_SWITCH_AUTO_DETECT 3984e400768SDavid Christensen 3994e400768SDavid Christensen uint32_t lane_config; 4004e400768SDavid Christensen 4014e400768SDavid Christensen /* Phy register parameter */ 4024e400768SDavid Christensen uint32_t chip_id; 4034e400768SDavid Christensen 4044e400768SDavid Christensen /* features */ 4054e400768SDavid Christensen uint32_t feature_config_flags; 4064e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED (1<<0) 4074e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_PFC_ENABLED (1<<1) 4084e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY (1<<2) 4094e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_BC_SUPPORTS_DUAL_PHY_OPT_MDL_VRFY (1<<3) 4104e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_EMUL_DISABLE_EMAC (1<<4) 4114e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_EMUL_DISABLE_BMAC (1<<5) 4124e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_EMUL_DISABLE_UMAC (1<<6) 4134e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_EMUL_DISABLE_XMAC (1<<7) 4144e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_BC_SUPPORTS_AFEX (1<<8) 4154e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_AUTOGREEEN_ENABLED (1<<9) 4164e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_BC_SUPPORTS_SFP_TX_DISABLED (1<<10) 4174e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_DISABLE_REMOTE_FAULT_DET (1<<11) 4184e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_IEEE_PHY_TEST (1<<12) 4194e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_MT_SUPPORT (1<<13) 4204e400768SDavid Christensen #define ELINK_FEATURE_CONFIG_BOOT_FROM_SAN (1<<14) 4214ef8ebfdSDavid C Somayajulu #define ELINK_FEATURE_CONFIG_DISABLE_PD (1<<15) 4224e400768SDavid Christensen 4234e400768SDavid Christensen /* Will be populated during common init */ 4244e400768SDavid Christensen struct elink_phy phy[ELINK_MAX_PHYS]; 4254e400768SDavid Christensen 4264e400768SDavid Christensen /* Will be populated during common init */ 4274e400768SDavid Christensen uint8_t num_phys; 4284e400768SDavid Christensen 4294e400768SDavid Christensen uint8_t rsrv; 4304e400768SDavid Christensen 4314e400768SDavid Christensen /* Used to configure the EEE Tx LPI timer, has several modes of 4324e400768SDavid Christensen * operation, according to bits 29:28 - 4334e400768SDavid Christensen * 2'b00: Timer will be configured by nvram, output will be the value 4344e400768SDavid Christensen * from nvram. 4354e400768SDavid Christensen * 2'b01: Timer will be configured by nvram, output will be in 4364e400768SDavid Christensen * microseconds. 4374e400768SDavid Christensen * 2'b10: bits 1:0 contain an nvram value which will be used instead 4384e400768SDavid Christensen * of the one located in the nvram. Output will be that value. 4394e400768SDavid Christensen * 2'b11: bits 19:0 contain the idle timer in microseconds; output 4404e400768SDavid Christensen * will be in microseconds. 4414e400768SDavid Christensen * Bits 31:30 should be 2'b11 in order for EEE to be enabled. 4424e400768SDavid Christensen */ 4434e400768SDavid Christensen uint32_t eee_mode; 4444e400768SDavid Christensen #define ELINK_EEE_MODE_NVRAM_BALANCED_TIME (0xa00) 4454e400768SDavid Christensen #define ELINK_EEE_MODE_NVRAM_AGGRESSIVE_TIME (0x100) 4464e400768SDavid Christensen #define ELINK_EEE_MODE_NVRAM_LATENCY_TIME (0x6000) 4474e400768SDavid Christensen #define ELINK_EEE_MODE_NVRAM_MASK (0x3) 4484e400768SDavid Christensen #define ELINK_EEE_MODE_TIMER_MASK (0xfffff) 4494e400768SDavid Christensen #define ELINK_EEE_MODE_OUTPUT_TIME (1<<28) 4504e400768SDavid Christensen #define ELINK_EEE_MODE_OVERRIDE_NVRAM (1<<29) 4514e400768SDavid Christensen #define ELINK_EEE_MODE_ENABLE_LPI (1<<30) 4524e400768SDavid Christensen #define ELINK_EEE_MODE_ADV_LPI (1<<31) 4534e400768SDavid Christensen 4544e400768SDavid Christensen uint16_t hw_led_mode; /* part of the hw_config read from the shmem */ 4554e400768SDavid Christensen uint32_t multi_phy_config; 4564e400768SDavid Christensen 4574e400768SDavid Christensen /* Device pointer passed to all callback functions */ 4584e400768SDavid Christensen struct bxe_softc *sc; 4594e400768SDavid Christensen uint16_t req_fc_auto_adv; /* Should be set to TX / BOTH when 4604e400768SDavid Christensen req_flow_ctrl is set to AUTO */ 4614e400768SDavid Christensen uint16_t link_flags; 4624e400768SDavid Christensen #define ELINK_LINK_FLAGS_INT_DISABLED (1<<0) 4634e400768SDavid Christensen #define ELINK_PHY_INITIALIZED (1<<1) 4644e400768SDavid Christensen uint32_t lfa_base; 4654ef8ebfdSDavid C Somayajulu 4664ef8ebfdSDavid C Somayajulu /* The same definitions as the shmem2 parameter */ 4674ef8ebfdSDavid C Somayajulu uint32_t link_attr_sync; 4684e400768SDavid Christensen }; 4694e400768SDavid Christensen 4704e400768SDavid Christensen /* Output parameters */ 4714e400768SDavid Christensen struct elink_vars { 4724e400768SDavid Christensen uint8_t phy_flags; 4734e400768SDavid Christensen #define PHY_XGXS_FLAG (1<<0) 4744e400768SDavid Christensen #define PHY_SGMII_FLAG (1<<1) 4754e400768SDavid Christensen #define PHY_PHYSICAL_LINK_FLAG (1<<2) 4764e400768SDavid Christensen #define PHY_HALF_OPEN_CONN_FLAG (1<<3) 4774e400768SDavid Christensen #define PHY_OVER_CURRENT_FLAG (1<<4) 4784e400768SDavid Christensen #define PHY_SFP_TX_FAULT_FLAG (1<<5) 4794e400768SDavid Christensen 4804e400768SDavid Christensen uint8_t mac_type; 4814e400768SDavid Christensen #define ELINK_MAC_TYPE_NONE 0 4824e400768SDavid Christensen #define ELINK_MAC_TYPE_EMAC 1 4834e400768SDavid Christensen #define ELINK_MAC_TYPE_BMAC 2 4844e400768SDavid Christensen #define ELINK_MAC_TYPE_UMAC 3 4854e400768SDavid Christensen #define ELINK_MAC_TYPE_XMAC 4 4864e400768SDavid Christensen 4874e400768SDavid Christensen uint8_t phy_link_up; /* internal phy link indication */ 4884e400768SDavid Christensen uint8_t link_up; 4894e400768SDavid Christensen 4904e400768SDavid Christensen uint16_t line_speed; 4914e400768SDavid Christensen uint16_t duplex; 4924e400768SDavid Christensen 4934e400768SDavid Christensen uint16_t flow_ctrl; 4944e400768SDavid Christensen uint16_t ieee_fc; 4954e400768SDavid Christensen 4964e400768SDavid Christensen /* The same definitions as the shmem parameter */ 4974e400768SDavid Christensen uint32_t link_status; 4984e400768SDavid Christensen uint32_t eee_status; 4994e400768SDavid Christensen uint8_t fault_detected; 5004e400768SDavid Christensen uint8_t check_kr2_recovery_cnt; 5014e400768SDavid Christensen #define ELINK_CHECK_KR2_RECOVERY_CNT 5 5024e400768SDavid Christensen uint16_t periodic_flags; 5034e400768SDavid Christensen #define ELINK_PERIODIC_FLAGS_LINK_EVENT 0x0001 5044e400768SDavid Christensen 5054e400768SDavid Christensen uint32_t aeu_int_mask; 5064e400768SDavid Christensen uint8_t rx_tx_asic_rst; 5074e400768SDavid Christensen uint8_t turn_to_run_wc_rt; 5084e400768SDavid Christensen uint16_t rsrv2; 5094ef8ebfdSDavid C Somayajulu 5104e400768SDavid Christensen }; 5114e400768SDavid Christensen 5124e400768SDavid Christensen /***********************************************************/ 5134e400768SDavid Christensen /* Functions */ 5144e400768SDavid Christensen /***********************************************************/ 5154e400768SDavid Christensen elink_status_t elink_phy_init(struct elink_params *params, struct elink_vars *vars); 5164e400768SDavid Christensen 5174e400768SDavid Christensen /* Reset the link. Should be called when driver or interface goes down 5184e400768SDavid Christensen Before calling phy firmware upgrade, the reset_ext_phy should be set 5194e400768SDavid Christensen to 0 */ 5204e400768SDavid Christensen elink_status_t elink_link_reset(struct elink_params *params, struct elink_vars *vars, 5214e400768SDavid Christensen uint8_t reset_ext_phy); 5224e400768SDavid Christensen elink_status_t elink_lfa_reset(struct elink_params *params, struct elink_vars *vars); 5234e400768SDavid Christensen /* elink_link_update should be called upon link interrupt */ 5244e400768SDavid Christensen elink_status_t elink_link_update(struct elink_params *params, struct elink_vars *vars); 5254e400768SDavid Christensen 5264e400768SDavid Christensen /* use the following phy functions to read/write from external_phy 5274e400768SDavid Christensen In order to use it to read/write internal phy registers, use 5284e400768SDavid Christensen ELINK_DEFAULT_PHY_DEV_ADDR as devad, and (_bank + (_addr & 0xf)) as 5294e400768SDavid Christensen the register */ 5304e400768SDavid Christensen elink_status_t elink_phy_read(struct elink_params *params, uint8_t phy_addr, 5314e400768SDavid Christensen uint8_t devad, uint16_t reg, uint16_t *ret_val); 5324e400768SDavid Christensen 5334e400768SDavid Christensen elink_status_t elink_phy_write(struct elink_params *params, uint8_t phy_addr, 5344e400768SDavid Christensen uint8_t devad, uint16_t reg, uint16_t val); 5354e400768SDavid Christensen 5364e400768SDavid Christensen /* Reads the link_status from the shmem, 5374e400768SDavid Christensen and update the link vars accordingly */ 5384e400768SDavid Christensen void elink_link_status_update(struct elink_params *input, 5394e400768SDavid Christensen struct elink_vars *output); 5404e400768SDavid Christensen /* returns string representing the fw_version of the external phy */ 5414e400768SDavid Christensen elink_status_t elink_get_ext_phy_fw_version(struct elink_params *params, uint8_t *version, 5424e400768SDavid Christensen uint16_t len); 5434e400768SDavid Christensen 5444e400768SDavid Christensen /* Set/Unset the led 5454e400768SDavid Christensen Basically, the CLC takes care of the led for the link, but in case one needs 5464e400768SDavid Christensen to set/unset the led unnaturally, set the "mode" to ELINK_LED_MODE_OPER to 5474e400768SDavid Christensen blink the led, and ELINK_LED_MODE_OFF to set the led off.*/ 5484e400768SDavid Christensen elink_status_t elink_set_led(struct elink_params *params, 5494e400768SDavid Christensen struct elink_vars *vars, uint8_t mode, uint32_t speed); 5504e400768SDavid Christensen #define ELINK_LED_MODE_OFF 0 5514e400768SDavid Christensen #define ELINK_LED_MODE_ON 1 5524e400768SDavid Christensen #define ELINK_LED_MODE_OPER 2 5534e400768SDavid Christensen #define ELINK_LED_MODE_FRONT_PANEL_OFF 3 5544e400768SDavid Christensen 5554e400768SDavid Christensen /* elink_handle_module_detect_int should be called upon module detection 5564e400768SDavid Christensen interrupt */ 5574e400768SDavid Christensen void elink_handle_module_detect_int(struct elink_params *params); 5584e400768SDavid Christensen 5594e400768SDavid Christensen /* Get the actual link status. In case it returns ELINK_STATUS_OK, link is up, 5604e400768SDavid Christensen otherwise link is down*/ 5614e400768SDavid Christensen elink_status_t elink_test_link(struct elink_params *params, struct elink_vars *vars, 5624e400768SDavid Christensen uint8_t is_serdes); 5634e400768SDavid Christensen 5644e400768SDavid Christensen 5654e400768SDavid Christensen /* One-time initialization for external phy after power up */ 5664e400768SDavid Christensen elink_status_t elink_common_init_phy(struct bxe_softc *sc, uint32_t shmem_base_path[], 5674e400768SDavid Christensen uint32_t shmem2_base_path[], uint32_t chip_id, uint8_t one_port_enabled); 5684e400768SDavid Christensen 5694e400768SDavid Christensen /* Reset the external PHY using GPIO */ 5704e400768SDavid Christensen void elink_ext_phy_hw_reset(struct bxe_softc *sc, uint8_t port); 5714e400768SDavid Christensen 5724e400768SDavid Christensen /* Reset the external of SFX7101 */ 5734e400768SDavid Christensen void elink_sfx7101_sp_sw_reset(struct bxe_softc *sc, struct elink_phy *phy); 5744e400768SDavid Christensen 5754e400768SDavid Christensen /* Read "byte_cnt" bytes from address "addr" from the SFP+ EEPROM */ 5764e400768SDavid Christensen elink_status_t elink_read_sfp_module_eeprom(struct elink_phy *phy, 5774e400768SDavid Christensen struct elink_params *params, uint8_t dev_addr, 5784e400768SDavid Christensen uint16_t addr, uint16_t byte_cnt, uint8_t *o_buf); 5794e400768SDavid Christensen 5804e400768SDavid Christensen void elink_hw_reset_phy(struct elink_params *params); 5814e400768SDavid Christensen 5824e400768SDavid Christensen /* Check swap bit and adjust PHY order */ 5834e400768SDavid Christensen uint32_t elink_phy_selection(struct elink_params *params); 5844e400768SDavid Christensen 5854e400768SDavid Christensen /* Probe the phys on board, and populate them in "params" */ 5864e400768SDavid Christensen elink_status_t elink_phy_probe(struct elink_params *params); 5874e400768SDavid Christensen 5884e400768SDavid Christensen /* Checks if fan failure detection is required on one of the phys on board */ 5894e400768SDavid Christensen uint8_t elink_fan_failure_det_req(struct bxe_softc *sc, uint32_t shmem_base, 5904e400768SDavid Christensen uint32_t shmem2_base, uint8_t port); 5914e400768SDavid Christensen 5924e400768SDavid Christensen /* Open / close the gate between the NIG and the BRB */ 5934e400768SDavid Christensen void elink_set_rx_filter(struct elink_params *params, uint8_t en); 5944e400768SDavid Christensen 5954e400768SDavid Christensen /* DCBX structs */ 5964e400768SDavid Christensen 5974e400768SDavid Christensen /* Number of maximum COS per chip */ 5984e400768SDavid Christensen #define ELINK_DCBX_E2E3_MAX_NUM_COS (2) 5994e400768SDavid Christensen #define ELINK_DCBX_E3B0_MAX_NUM_COS_PORT0 (6) 6004e400768SDavid Christensen #define ELINK_DCBX_E3B0_MAX_NUM_COS_PORT1 (3) 6014e400768SDavid Christensen #define ELINK_DCBX_E3B0_MAX_NUM_COS ( \ 6024e400768SDavid Christensen ELINK_MAXVAL(ELINK_DCBX_E3B0_MAX_NUM_COS_PORT0, \ 6034e400768SDavid Christensen ELINK_DCBX_E3B0_MAX_NUM_COS_PORT1)) 6044e400768SDavid Christensen 6054e400768SDavid Christensen #define ELINK_DCBX_MAX_NUM_COS ( \ 6064e400768SDavid Christensen ELINK_MAXVAL(ELINK_DCBX_E3B0_MAX_NUM_COS, \ 6074e400768SDavid Christensen ELINK_DCBX_E2E3_MAX_NUM_COS)) 6084e400768SDavid Christensen 6094e400768SDavid Christensen /* PFC port configuration params */ 6104e400768SDavid Christensen struct elink_nig_brb_pfc_port_params { 6114e400768SDavid Christensen /* NIG */ 6124e400768SDavid Christensen uint32_t pause_enable; 6134e400768SDavid Christensen uint32_t llfc_out_en; 6144e400768SDavid Christensen uint32_t llfc_enable; 6154e400768SDavid Christensen uint32_t pkt_priority_to_cos; 6164e400768SDavid Christensen uint8_t num_of_rx_cos_priority_mask; 6174e400768SDavid Christensen uint32_t rx_cos_priority_mask[ELINK_DCBX_MAX_NUM_COS]; 6184e400768SDavid Christensen uint32_t llfc_high_priority_classes; 6194e400768SDavid Christensen uint32_t llfc_low_priority_classes; 6204e400768SDavid Christensen }; 6214e400768SDavid Christensen 6224e400768SDavid Christensen 6234e400768SDavid Christensen /* ETS port configuration params */ 6244e400768SDavid Christensen struct elink_ets_bw_params { 6254e400768SDavid Christensen uint8_t bw; 6264e400768SDavid Christensen }; 6274e400768SDavid Christensen 6284e400768SDavid Christensen struct elink_ets_sp_params { 6294e400768SDavid Christensen /** 6304e400768SDavid Christensen * valid values are 0 - 5. 0 is highest strict priority. 6314e400768SDavid Christensen * There can't be two COS's with the same pri. 6324e400768SDavid Christensen */ 6334e400768SDavid Christensen uint8_t pri; 6344e400768SDavid Christensen }; 6354e400768SDavid Christensen 6364e400768SDavid Christensen enum elink_cos_state { 6374e400768SDavid Christensen elink_cos_state_strict = 0, 6384e400768SDavid Christensen elink_cos_state_bw = 1, 6394e400768SDavid Christensen }; 6404e400768SDavid Christensen 6414e400768SDavid Christensen struct elink_ets_cos_params { 6424e400768SDavid Christensen enum elink_cos_state state ; 6434e400768SDavid Christensen union { 6444e400768SDavid Christensen struct elink_ets_bw_params bw_params; 6454e400768SDavid Christensen struct elink_ets_sp_params sp_params; 6464e400768SDavid Christensen } params; 6474e400768SDavid Christensen }; 6484e400768SDavid Christensen 6494e400768SDavid Christensen struct elink_ets_params { 6504e400768SDavid Christensen uint8_t num_of_cos; /* Number of valid COS entries*/ 6514e400768SDavid Christensen struct elink_ets_cos_params cos[ELINK_DCBX_MAX_NUM_COS]; 6524e400768SDavid Christensen }; 6534e400768SDavid Christensen 6544e400768SDavid Christensen /* Used to update the PFC attributes in EMAC, BMAC, NIG and BRB 6554e400768SDavid Christensen * when link is already up 6564e400768SDavid Christensen */ 6574e400768SDavid Christensen elink_status_t elink_update_pfc(struct elink_params *params, 6584e400768SDavid Christensen struct elink_vars *vars, 6594e400768SDavid Christensen struct elink_nig_brb_pfc_port_params *pfc_params); 6604e400768SDavid Christensen 6614e400768SDavid Christensen 6624e400768SDavid Christensen /* Used to configure the ETS to disable */ 6634e400768SDavid Christensen elink_status_t elink_ets_disabled(struct elink_params *params, 6644e400768SDavid Christensen struct elink_vars *vars); 6654e400768SDavid Christensen 6664e400768SDavid Christensen /* Used to configure the ETS to BW limited */ 6674e400768SDavid Christensen void elink_ets_bw_limit(const struct elink_params *params, const uint32_t cos0_bw, 6684e400768SDavid Christensen const uint32_t cos1_bw); 6694e400768SDavid Christensen 6704e400768SDavid Christensen /* Used to configure the ETS to strict */ 6714e400768SDavid Christensen elink_status_t elink_ets_strict(const struct elink_params *params, const uint8_t strict_cos); 6724e400768SDavid Christensen 6734e400768SDavid Christensen 6744e400768SDavid Christensen /* Configure the COS to ETS according to BW and SP settings.*/ 6754e400768SDavid Christensen elink_status_t elink_ets_e3b0_config(const struct elink_params *params, 6764e400768SDavid Christensen const struct elink_vars *vars, 6774e400768SDavid Christensen struct elink_ets_params *ets_params); 6784e400768SDavid Christensen /* Read pfc statistic*/ 6794e400768SDavid Christensen void elink_pfc_statistic(struct elink_params *params, struct elink_vars *vars, 6804e400768SDavid Christensen uint32_t pfc_frames_sent[2], 6814e400768SDavid Christensen uint32_t pfc_frames_received[2]); 6824e400768SDavid Christensen void elink_init_mod_abs_int(struct bxe_softc *sc, struct elink_vars *vars, 6834e400768SDavid Christensen uint32_t chip_id, uint32_t shmem_base, uint32_t shmem2_base, 6844e400768SDavid Christensen uint8_t port); 6854ef8ebfdSDavid C Somayajulu //elink_status_t elink_sfp_module_detection(struct elink_phy *phy, 6864ef8ebfdSDavid C Somayajulu // struct elink_params *params); 6874e400768SDavid Christensen 6884e400768SDavid Christensen void elink_period_func(struct elink_params *params, struct elink_vars *vars); 6894e400768SDavid Christensen 6904ef8ebfdSDavid C Somayajulu //elink_status_t elink_check_half_open_conn(struct elink_params *params, 6914ef8ebfdSDavid C Somayajulu // struct elink_vars *vars, uint8_t notify); 6924e400768SDavid Christensen 6934e400768SDavid Christensen void elink_enable_pmd_tx(struct elink_params *params); 6944e400768SDavid Christensen 6954e400768SDavid Christensen 6964e400768SDavid Christensen 6974e400768SDavid Christensen #endif /* ELINK_H */ 6984e400768SDavid Christensen 699