Lines Matching refs:params
760 struct elink_params *params,
948 static elink_status_t elink_check_half_open_conn(struct elink_params *params,
951 struct elink_params *params);
979 static int elink_check_lfa(struct elink_params *params) in elink_check_lfa() argument
984 struct bxe_softc *sc = params->sc; in elink_check_lfa()
987 REG_RD(sc, params->lfa_base + in elink_check_lfa()
995 REG_WR(sc, params->lfa_base + in elink_check_lfa()
1002 link_status = REG_RD(sc, params->shmem_base + in elink_check_lfa()
1004 port_mb[params->port].link_status)); in elink_check_lfa()
1011 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_BOOT_FROM_SAN) in elink_check_lfa()
1015 if (params->loopback_mode) in elink_check_lfa()
1019 if (!params->lfa_base) in elink_check_lfa()
1022 if (params->num_phys == 3) { in elink_check_lfa()
1031 saved_val = REG_RD(sc, params->lfa_base + in elink_check_lfa()
1033 req_val = params->req_duplex[0] | (params->req_duplex[1] << 16); in elink_check_lfa()
1040 saved_val = REG_RD(sc, params->lfa_base + in elink_check_lfa()
1042 req_val = params->req_flow_ctrl[0] | (params->req_flow_ctrl[1] << 16); in elink_check_lfa()
1049 saved_val = REG_RD(sc, params->lfa_base + in elink_check_lfa()
1051 req_val = params->req_line_speed[0] | (params->req_line_speed[1] << 16); in elink_check_lfa()
1059 cur_speed_cap_mask = REG_RD(sc, params->lfa_base + in elink_check_lfa()
1063 if (cur_speed_cap_mask != params->speed_cap_mask[cfg_idx]) { in elink_check_lfa()
1066 params->speed_cap_mask[cfg_idx]); in elink_check_lfa()
1072 REG_RD(sc, params->lfa_base + in elink_check_lfa()
1076 if ((uint16_t)cur_req_fc_auto_adv != params->req_fc_auto_adv) { in elink_check_lfa()
1078 cur_req_fc_auto_adv, params->req_fc_auto_adv); in elink_check_lfa()
1082 eee_status = REG_RD(sc, params->shmem2_base + in elink_check_lfa()
1084 eee_status[params->port])); in elink_check_lfa()
1087 (params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI)) || in elink_check_lfa()
1089 (params->eee_mode & ELINK_EEE_MODE_ADV_LPI))) { in elink_check_lfa()
1090 ELINK_DEBUG_P2(sc, "EEE mismatch %x vs. %x\n", params->eee_mode, in elink_check_lfa()
1173 static void elink_ets_e2e3a0_disabled(struct elink_params *params) in elink_ets_e2e3a0_disabled() argument
1176 struct bxe_softc *sc = params->sc; in elink_ets_e2e3a0_disabled()
1264 const struct elink_params *params, in elink_ets_e3b0_set_credit_upper_bound_nig() argument
1267 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_set_credit_upper_bound_nig()
1268 const uint8_t port = params->port; in elink_ets_e3b0_set_credit_upper_bound_nig()
1302 static void elink_ets_e3b0_nig_disabled(const struct elink_params *params, in elink_ets_e3b0_nig_disabled() argument
1305 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_nig_disabled()
1306 const uint8_t port = params->port; in elink_ets_e3b0_nig_disabled()
1378 elink_ets_e3b0_set_credit_upper_bound_nig(params, min_w_val); in elink_ets_e3b0_nig_disabled()
1386 const struct elink_params *params, in elink_ets_e3b0_set_credit_upper_bound_pbf() argument
1389 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_set_credit_upper_bound_pbf()
1392 const uint8_t port = params->port; in elink_ets_e3b0_set_credit_upper_bound_pbf()
1419 static void elink_ets_e3b0_pbf_disabled(const struct elink_params *params) in elink_ets_e3b0_pbf_disabled() argument
1421 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_pbf_disabled()
1422 const uint8_t port = params->port; in elink_ets_e3b0_pbf_disabled()
1470 elink_ets_e3b0_set_credit_upper_bound_pbf(params, min_w_val_pbf); in elink_ets_e3b0_pbf_disabled()
1477 static elink_status_t elink_ets_e3b0_disabled(const struct elink_params *params, in elink_ets_e3b0_disabled() argument
1480 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_disabled()
1488 elink_ets_e3b0_nig_disabled(params, vars); in elink_ets_e3b0_disabled()
1490 elink_ets_e3b0_pbf_disabled(params); in elink_ets_e3b0_disabled()
1500 elink_status_t elink_ets_disabled(struct elink_params *params, in elink_ets_disabled() argument
1503 struct bxe_softc *sc = params->sc; in elink_ets_disabled()
1507 elink_ets_e2e3a0_disabled(params); in elink_ets_disabled()
1509 elink_status = elink_ets_e3b0_disabled(params, vars); in elink_ets_disabled()
1523 static elink_status_t elink_ets_e3b0_cli_map(const struct elink_params *params, in elink_ets_e3b0_cli_map() argument
1528 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_cli_map()
1529 const uint8_t port = params->port; in elink_ets_e3b0_cli_map()
1630 const struct elink_params *params, in elink_ets_e3b0_get_total_bw() argument
1634 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_get_total_bw()
1643 if (!ets_params->cos[cos_idx].params.bw_params.bw) { in elink_ets_e3b0_get_total_bw()
1649 ets_params->cos[cos_idx].params.bw_params.bw in elink_ets_e3b0_get_total_bw()
1653 ets_params->cos[cos_idx].params.bw_params.bw; in elink_ets_e3b0_get_total_bw()
1690 static elink_status_t elink_ets_e3b0_sp_pri_to_cos_set(const struct elink_params *params, in elink_ets_e3b0_sp_pri_to_cos_set() argument
1694 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_sp_pri_to_cos_set()
1695 const uint8_t port = params->port; in elink_ets_e3b0_sp_pri_to_cos_set()
1772 static elink_status_t elink_ets_e3b0_sp_set_pri_cli_reg(const struct elink_params *params, in elink_ets_e3b0_sp_set_pri_cli_reg() argument
1775 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_sp_set_pri_cli_reg()
1777 const uint8_t port = params->port; in elink_ets_e3b0_sp_set_pri_cli_reg()
1865 elink_status_t elink_ets_e3b0_config(const struct elink_params *params, in elink_ets_e3b0_config() argument
1869 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_config()
1871 const uint8_t port = params->port; in elink_ets_e3b0_config()
1898 elink_status = elink_ets_e3b0_get_total_bw(params, ets_params, in elink_ets_e3b0_config()
1909 elink_ets_e3b0_set_credit_upper_bound_nig(params, min_w_val_nig); in elink_ets_e3b0_config()
1910 elink_ets_e3b0_set_credit_upper_bound_pbf(params, min_w_val_pbf); in elink_ets_e3b0_config()
1922 ets_params->cos[cos_entry].params.bw_params.bw, in elink_ets_e3b0_config()
1929 params, in elink_ets_e3b0_config()
1931 ets_params->cos[cos_entry].params.sp_params.pri, in elink_ets_e3b0_config()
1947 elink_status = elink_ets_e3b0_sp_set_pri_cli_reg(params, in elink_ets_e3b0_config()
1957 elink_status = elink_ets_e3b0_cli_map(params, ets_params, in elink_ets_e3b0_config()
1967 static void elink_ets_bw_limit_common(const struct elink_params *params) in elink_ets_bw_limit_common() argument
1970 struct bxe_softc *sc = params->sc; in elink_ets_bw_limit_common()
2011 void elink_ets_bw_limit(const struct elink_params *params, const uint32_t cos0_bw, in elink_ets_bw_limit() argument
2015 struct bxe_softc *sc = params->sc; in elink_ets_bw_limit()
2034 elink_ets_bw_limit_common(params); in elink_ets_bw_limit()
2043 elink_status_t elink_ets_strict(const struct elink_params *params, const uint8_t strict_cos) in elink_ets_strict() argument
2046 struct bxe_softc *sc = params->sc; in elink_ets_strict()
2086 static void elink_update_pfc_xmac(struct elink_params *params, in elink_update_pfc_xmac() argument
2090 struct bxe_softc *sc = params->sc; in elink_update_pfc_xmac()
2095 xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; in elink_update_pfc_xmac()
2103 if (!(params->feature_config_flags & in elink_update_pfc_xmac()
2136 ((params->mac_addr[2] << 24) | in elink_update_pfc_xmac()
2137 (params->mac_addr[3] << 16) | in elink_update_pfc_xmac()
2138 (params->mac_addr[4] << 8) | in elink_update_pfc_xmac()
2139 (params->mac_addr[5]))); in elink_update_pfc_xmac()
2141 ((params->mac_addr[0] << 8) | in elink_update_pfc_xmac()
2142 (params->mac_addr[1]))); in elink_update_pfc_xmac()
2147 static void elink_emac_get_pfc_stat(struct elink_params *params, in elink_emac_get_pfc_stat() argument
2152 struct bxe_softc *sc = params->sc; in elink_emac_get_pfc_stat()
2153 uint32_t emac_base = params->port ? GRCBASE_EMAC1 : GRCBASE_EMAC0; in elink_emac_get_pfc_stat()
2179 void elink_pfc_statistic(struct elink_params *params, struct elink_vars *vars, in elink_pfc_statistic() argument
2184 struct bxe_softc *sc = params->sc; in elink_pfc_statistic()
2193 elink_emac_get_pfc_stat(params, pfc_frames_sent, in elink_pfc_statistic()
2244 struct elink_params *params) in elink_set_mdio_emac_per_phy() argument
2249 for (phy_index = ELINK_INT_PHY; phy_index < params->num_phys; in elink_set_mdio_emac_per_phy()
2251 elink_set_mdio_clk(sc, params->chip_id, in elink_set_mdio_emac_per_phy()
2252 params->phy[phy_index].mdio_ctrl); in elink_set_mdio_emac_per_phy()
2255 static void elink_emac_init(struct elink_params *params, in elink_emac_init() argument
2259 struct bxe_softc *sc = params->sc; in elink_emac_init()
2260 uint8_t port = params->port; in elink_emac_init()
2287 elink_set_mdio_emac_per_phy(sc, params); in elink_emac_init()
2289 val = ((params->mac_addr[0] << 8) | in elink_emac_init()
2290 params->mac_addr[1]); in elink_emac_init()
2293 val = ((params->mac_addr[2] << 24) | in elink_emac_init()
2294 (params->mac_addr[3] << 16) | in elink_emac_init()
2295 (params->mac_addr[4] << 8) | in elink_emac_init()
2296 params->mac_addr[5]); in elink_emac_init()
2300 static void elink_set_xumac_nig(struct elink_params *params, in elink_set_xumac_nig() argument
2304 struct bxe_softc *sc = params->sc; in elink_set_xumac_nig()
2306 REG_WR(sc, params->port ? NIG_REG_P1_MAC_IN_EN : NIG_REG_P0_MAC_IN_EN, in elink_set_xumac_nig()
2308 REG_WR(sc, params->port ? NIG_REG_P1_MAC_OUT_EN : NIG_REG_P0_MAC_OUT_EN, in elink_set_xumac_nig()
2310 REG_WR(sc, params->port ? NIG_REG_P1_MAC_PAUSE_OUT_EN : in elink_set_xumac_nig()
2314 static void elink_set_umac_rxtx(struct elink_params *params, uint8_t en) in elink_set_umac_rxtx() argument
2316 uint32_t umac_base = params->port ? GRCBASE_UMAC1 : GRCBASE_UMAC0; in elink_set_umac_rxtx()
2318 struct bxe_softc *sc = params->sc; in elink_set_umac_rxtx()
2320 (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port))) in elink_set_umac_rxtx()
2333 static void elink_umac_enable(struct elink_params *params, in elink_umac_enable() argument
2337 uint32_t umac_base = params->port ? GRCBASE_UMAC1 : GRCBASE_UMAC0; in elink_umac_enable()
2338 struct bxe_softc *sc = params->sc; in elink_umac_enable()
2341 (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port)); in elink_umac_enable()
2345 (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port)); in elink_umac_enable()
2350 REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4, 1); in elink_umac_enable()
2398 ((params->mac_addr[2] << 24) | in elink_umac_enable()
2399 (params->mac_addr[3] << 16) | in elink_umac_enable()
2400 (params->mac_addr[4] << 8) | in elink_umac_enable()
2401 (params->mac_addr[5]))); in elink_umac_enable()
2403 ((params->mac_addr[0] << 8) | in elink_umac_enable()
2404 (params->mac_addr[1]))); in elink_umac_enable()
2425 elink_set_xumac_nig(params, in elink_umac_enable()
2432 static void elink_xmac_init(struct elink_params *params, uint32_t max_speed) in elink_xmac_init() argument
2434 struct bxe_softc *sc = params->sc; in elink_xmac_init()
2494 static void elink_set_xmac_rxtx(struct elink_params *params, uint8_t en) in elink_set_xmac_rxtx() argument
2496 uint8_t port = params->port; in elink_set_xmac_rxtx()
2497 struct bxe_softc *sc = params->sc; in elink_set_xmac_rxtx()
2522 static elink_status_t elink_xmac_enable(struct elink_params *params, in elink_xmac_enable() argument
2526 struct bxe_softc *sc = params->sc; in elink_xmac_enable()
2529 xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; in elink_xmac_enable()
2531 elink_xmac_init(params, vars->line_speed); in elink_xmac_enable()
2540 REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4, 0); in elink_xmac_enable()
2545 if (!(params->phy[ELINK_INT_PHY].flags & ELINK_FLAGS_TX_ERROR_CHECK)) { in elink_xmac_enable()
2561 elink_update_pfc_xmac(params, vars, 0); in elink_xmac_enable()
2576 (params->phy[ELINK_INT_PHY].supported & in elink_xmac_enable()
2584 elink_set_xumac_nig(params, in elink_xmac_enable()
2592 static elink_status_t elink_emac_enable(struct elink_params *params, in elink_emac_enable() argument
2595 struct bxe_softc *sc = params->sc; in elink_emac_enable()
2596 uint8_t port = params->port; in elink_emac_enable()
2630 uint32_t ser_lane = ((params->lane_config & in elink_emac_enable()
2665 if (!(params->feature_config_flags & in elink_emac_enable()
2696 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) { in elink_emac_enable()
2740 if ((params->feature_config_flags & in elink_emac_enable()
2764 static void elink_update_pfc_bmac1(struct elink_params *params, in elink_update_pfc_bmac1() argument
2768 struct bxe_softc *sc = params->sc; in elink_update_pfc_bmac1()
2769 uint32_t bmac_addr = params->port ? NIG_REG_INGRESS_BMAC1_MEM : in elink_update_pfc_bmac1()
2773 if ((!(params->feature_config_flags & in elink_update_pfc_bmac1()
2784 if (!(params->feature_config_flags & in elink_update_pfc_bmac1()
2793 static void elink_update_pfc_bmac2(struct elink_params *params, in elink_update_pfc_bmac2() argument
2801 struct bxe_softc *sc = params->sc; in elink_update_pfc_bmac2()
2802 uint32_t bmac_addr = params->port ? NIG_REG_INGRESS_BMAC1_MEM : in elink_update_pfc_bmac2()
2806 if ((!(params->feature_config_flags & in elink_update_pfc_bmac2()
2818 if (!(params->feature_config_flags & in elink_update_pfc_bmac2()
2826 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) { in elink_update_pfc_bmac2()
2855 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_update_pfc_bmac2()
2870 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_update_pfc_bmac2()
2926 static void elink_update_mng(struct elink_params *params, uint32_t link_status) in elink_update_mng() argument
2928 struct bxe_softc *sc = params->sc; in elink_update_mng()
2930 REG_WR(sc, params->shmem_base + in elink_update_mng()
2932 port_mb[params->port].link_status), link_status); in elink_update_mng()
2935 static void elink_update_pfc_nig(struct elink_params *params, in elink_update_pfc_nig() argument
2942 struct bxe_softc *sc = params->sc; in elink_update_pfc_nig()
2943 uint8_t port = params->port; in elink_update_pfc_nig()
2945 int set_pfc = params->feature_config_flags & in elink_update_pfc_nig()
3031 elink_status_t elink_update_pfc(struct elink_params *params, in elink_update_pfc() argument
3040 struct bxe_softc *sc = params->sc; in elink_update_pfc()
3041 uint8_t bmac_loopback = (params->loopback_mode == ELINK_LOOPBACK_BMAC); in elink_update_pfc()
3043 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_update_pfc()
3048 elink_update_mng(params, vars->link_status); in elink_update_pfc()
3051 elink_update_pfc_nig(params, vars, pfc_params); in elink_update_pfc()
3060 elink_update_pfc_xmac(params, vars, 0); in elink_update_pfc()
3064 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port)) in elink_update_pfc()
3067 elink_emac_enable(params, vars, 0); in elink_update_pfc()
3071 elink_update_pfc_bmac2(params, vars, bmac_loopback); in elink_update_pfc()
3073 elink_update_pfc_bmac1(params, vars); in elink_update_pfc()
3076 if ((params->feature_config_flags & in elink_update_pfc()
3080 REG_WR(sc, NIG_REG_BMAC0_PAUSE_OUT_EN + params->port*4, val); in elink_update_pfc()
3085 static elink_status_t elink_bmac1_enable(struct elink_params *params, in elink_bmac1_enable() argument
3089 struct bxe_softc *sc = params->sc; in elink_bmac1_enable()
3090 uint8_t port = params->port; in elink_bmac1_enable()
3105 wb_data[0] = ((params->mac_addr[2] << 24) | in elink_bmac1_enable()
3106 (params->mac_addr[3] << 16) | in elink_bmac1_enable()
3107 (params->mac_addr[4] << 8) | in elink_bmac1_enable()
3108 params->mac_addr[5]); in elink_bmac1_enable()
3109 wb_data[1] = ((params->mac_addr[0] << 8) | in elink_bmac1_enable()
3110 params->mac_addr[1]); in elink_bmac1_enable()
3128 elink_update_pfc_bmac1(params, vars); in elink_bmac1_enable()
3158 static elink_status_t elink_bmac2_enable(struct elink_params *params, in elink_bmac2_enable() argument
3162 struct bxe_softc *sc = params->sc; in elink_bmac2_enable()
3163 uint8_t port = params->port; in elink_bmac2_enable()
3184 wb_data[0] = ((params->mac_addr[2] << 24) | in elink_bmac2_enable()
3185 (params->mac_addr[3] << 16) | in elink_bmac2_enable()
3186 (params->mac_addr[4] << 8) | in elink_bmac2_enable()
3187 params->mac_addr[5]); in elink_bmac2_enable()
3188 wb_data[1] = ((params->mac_addr[0] << 8) | in elink_bmac2_enable()
3189 params->mac_addr[1]); in elink_bmac2_enable()
3218 elink_update_pfc_bmac2(params, vars, is_lb); in elink_bmac2_enable()
3223 static elink_status_t elink_bmac_enable(struct elink_params *params, in elink_bmac_enable() argument
3228 uint8_t port = params->port; in elink_bmac_enable()
3229 struct bxe_softc *sc = params->sc; in elink_bmac_enable()
3246 rc = elink_bmac2_enable(params, vars, is_lb); in elink_bmac_enable()
3248 rc = elink_bmac1_enable(params, vars, is_lb); in elink_bmac_enable()
3253 if ((params->feature_config_flags & in elink_bmac_enable()
3294 static elink_status_t elink_pbf_update(struct elink_params *params, uint32_t flow_ctrl, in elink_pbf_update() argument
3297 struct bxe_softc *sc = params->sc; in elink_pbf_update()
3298 uint8_t port = params->port; in elink_pbf_update()
3646 static uint8_t elink_eee_has_cap(struct elink_params *params) in elink_eee_has_cap() argument
3648 struct bxe_softc *sc = params->sc; in elink_eee_has_cap()
3650 if (REG_RD(sc, params->shmem2_base) <= in elink_eee_has_cap()
3651 offsetof(struct shmem2_region, eee_status[params->port])) in elink_eee_has_cap()
3697 static uint32_t elink_eee_calc_timer(struct elink_params *params) in elink_eee_calc_timer() argument
3700 struct bxe_softc *sc = params->sc; in elink_eee_calc_timer()
3702 if (params->eee_mode & ELINK_EEE_MODE_OVERRIDE_NVRAM) { in elink_eee_calc_timer()
3703 if (params->eee_mode & ELINK_EEE_MODE_OUTPUT_TIME) { in elink_eee_calc_timer()
3705 eee_idle = params->eee_mode & ELINK_EEE_MODE_TIMER_MASK; in elink_eee_calc_timer()
3708 if (elink_eee_nvram_to_time(params->eee_mode & in elink_eee_calc_timer()
3715 eee_mode = ((REG_RD(sc, params->shmem_base + in elink_eee_calc_timer()
3717 port_feature_config[params->port]. in elink_eee_calc_timer()
3729 static elink_status_t elink_eee_set_timers(struct elink_params *params, in elink_eee_set_timers() argument
3733 struct bxe_softc *sc = params->sc; in elink_eee_set_timers()
3735 eee_idle = elink_eee_calc_timer(params); in elink_eee_set_timers()
3738 REG_WR(sc, MISC_REG_CPMU_LP_IDLE_THR_P0 + (params->port << 2), in elink_eee_set_timers()
3740 } else if ((params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI) && in elink_eee_set_timers()
3741 (params->eee_mode & ELINK_EEE_MODE_OVERRIDE_NVRAM) && in elink_eee_set_timers()
3742 (params->eee_mode & ELINK_EEE_MODE_OUTPUT_TIME)) { in elink_eee_set_timers()
3748 if (params->eee_mode & ELINK_EEE_MODE_OUTPUT_TIME) { in elink_eee_set_timers()
3762 static elink_status_t elink_eee_initial_config(struct elink_params *params, in elink_eee_initial_config() argument
3768 if (params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI) in elink_eee_initial_config()
3773 if (params->eee_mode & ELINK_EEE_MODE_ADV_LPI) in elink_eee_initial_config()
3778 return elink_eee_set_timers(params, vars); in elink_eee_initial_config()
3782 struct elink_params *params, in elink_eee_disable() argument
3785 struct bxe_softc *sc = params->sc; in elink_eee_disable()
3788 REG_WR(sc, MISC_REG_CPMU_LP_FW_ENABLE_P0 + (params->port << 2), 0); in elink_eee_disable()
3798 struct elink_params *params, in elink_eee_advertise() argument
3801 struct bxe_softc *sc = params->sc; in elink_eee_advertise()
3805 REG_WR(sc, MISC_REG_CPMU_LP_MASK_EXT_P0 + (params->port << 2), 0xfc20); in elink_eee_advertise()
3824 static void elink_update_mng_eee(struct elink_params *params, uint32_t eee_status) in elink_update_mng_eee() argument
3826 struct bxe_softc *sc = params->sc; in elink_update_mng_eee()
3828 if (elink_eee_has_cap(params)) in elink_update_mng_eee()
3829 REG_WR(sc, params->shmem2_base + in elink_update_mng_eee()
3831 eee_status[params->port]), eee_status); in elink_update_mng_eee()
3835 struct elink_params *params, in elink_eee_an_resolve() argument
3838 struct bxe_softc *sc = params->sc; in elink_eee_an_resolve()
3883 static void elink_bsc_module_sel(struct elink_params *params) in elink_bsc_module_sel() argument
3888 struct bxe_softc *sc = params->sc; in elink_bsc_module_sel()
3889 uint8_t port = params->port; in elink_bsc_module_sel()
3891 board_cfg = REG_RD(sc, params->shmem_base + in elink_bsc_module_sel()
3899 sfp_ctrl = REG_RD(sc, params->shmem_base + in elink_bsc_module_sel()
4011 elink_status_t elink_phy_read(struct elink_params *params, uint8_t phy_addr, in elink_phy_read() argument
4018 for (phy_index = 0; phy_index < params->num_phys; phy_index++) { in elink_phy_read()
4019 if (params->phy[phy_index].addr == phy_addr) { in elink_phy_read()
4020 return elink_cl45_read(params->sc, in elink_phy_read()
4021 ¶ms->phy[phy_index], devad, in elink_phy_read()
4028 elink_status_t elink_phy_write(struct elink_params *params, uint8_t phy_addr, in elink_phy_write() argument
4035 for (phy_index = 0; phy_index < params->num_phys; phy_index++) { in elink_phy_write()
4036 if (params->phy[phy_index].addr == phy_addr) { in elink_phy_write()
4037 return elink_cl45_write(params->sc, in elink_phy_write()
4038 ¶ms->phy[phy_index], devad, in elink_phy_write()
4046 struct elink_params *params) in elink_get_warpcore_lane() argument
4049 struct bxe_softc *sc = params->sc; in elink_get_warpcore_lane()
4054 port = params->port; in elink_get_warpcore_lane()
4100 static void elink_set_aer_mmd(struct elink_params *params, in elink_set_aer_mmd() argument
4105 struct bxe_softc *sc = params->sc; in elink_set_aer_mmd()
4106 ser_lane = ((params->lane_config & in elink_set_aer_mmd()
4114 aer_val = elink_get_warpcore_lane(phy, params); in elink_set_aer_mmd()
4171 struct elink_params *params, in elink_xgxs_specific_func() argument
4174 struct bxe_softc *sc = params->sc; in elink_xgxs_specific_func()
4178 REG_WR(sc, NIG_REG_XGXS0_CTRL_MD_ST + params->port*0x18, 0); in elink_xgxs_specific_func()
4179 REG_WR(sc, NIG_REG_XGXS0_CTRL_MD_DEVAD + params->port*0x18, in elink_xgxs_specific_func()
4185 static void elink_xgxs_deassert(struct elink_params *params) in elink_xgxs_deassert() argument
4187 struct bxe_softc *sc = params->sc; in elink_xgxs_deassert()
4191 port = params->port; in elink_xgxs_deassert()
4199 elink_xgxs_specific_func(¶ms->phy[ELINK_INT_PHY], params, in elink_xgxs_deassert()
4204 struct elink_params *params, uint16_t *ieee_fc) in elink_calc_ieee_aneg_adv() argument
4206 struct bxe_softc *sc = params->sc; in elink_calc_ieee_aneg_adv()
4214 switch (params->req_fc_auto_adv) { in elink_calc_ieee_aneg_adv()
4244 static void set_phy_vars(struct elink_params *params, in set_phy_vars() argument
4247 struct bxe_softc *sc = params->sc; in set_phy_vars()
4249 uint8_t phy_config_swapped = params->multi_phy_config & in set_phy_vars()
4251 for (phy_index = ELINK_INT_PHY; phy_index < params->num_phys; in set_phy_vars()
4261 params->phy[actual_phy_idx].req_flow_ctrl = in set_phy_vars()
4262 params->req_flow_ctrl[link_cfg_idx]; in set_phy_vars()
4264 params->phy[actual_phy_idx].req_line_speed = in set_phy_vars()
4265 params->req_line_speed[link_cfg_idx]; in set_phy_vars()
4267 params->phy[actual_phy_idx].speed_cap_mask = in set_phy_vars()
4268 params->speed_cap_mask[link_cfg_idx]; in set_phy_vars()
4270 params->phy[actual_phy_idx].req_duplex = in set_phy_vars()
4271 params->req_duplex[link_cfg_idx]; in set_phy_vars()
4273 if (params->req_line_speed[link_cfg_idx] == in set_phy_vars()
4279 params->phy[actual_phy_idx].req_flow_ctrl, in set_phy_vars()
4280 params->phy[actual_phy_idx].req_line_speed, in set_phy_vars()
4281 params->phy[actual_phy_idx].speed_cap_mask); in set_phy_vars()
4285 static void elink_ext_phy_set_pause(struct elink_params *params, in elink_ext_phy_set_pause() argument
4290 struct bxe_softc *sc = params->sc; in elink_ext_phy_set_pause()
4297 elink_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc); in elink_ext_phy_set_pause()
4313 struct elink_params *params, in elink_pause_resolve() argument
4317 struct bxe_softc *sc = params->sc; in elink_pause_resolve()
4339 if (params->req_fc_auto_adv == ELINK_FLOW_CTRL_BOTH) { in elink_pause_resolve()
4360 struct elink_params *params, in elink_ext_phy_update_adv_fc() argument
4366 struct bxe_softc *sc = params->sc; in elink_ext_phy_update_adv_fc()
4371 ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_ext_phy_update_adv_fc()
4372 uint8_t lane = elink_get_warpcore_lane(phy, params); in elink_ext_phy_update_adv_fc()
4410 elink_pause_resolve(phy, params, vars, pause_result); in elink_ext_phy_update_adv_fc()
4415 struct elink_params *params, in elink_ext_phy_resolve_fc() argument
4423 elink_ext_phy_update_adv_fc(phy, params, vars); in elink_ext_phy_resolve_fc()
4427 vars->flow_ctrl = params->req_fc_auto_adv; in elink_ext_phy_resolve_fc()
4430 elink_ext_phy_update_adv_fc(phy, params, vars); in elink_ext_phy_resolve_fc()
4453 static void elink_update_link_attr(struct elink_params *params, uint32_t link_attr) in elink_update_link_attr() argument
4455 struct bxe_softc *sc = params->sc; in elink_update_link_attr()
4458 REG_WR(sc, params->shmem2_base + in elink_update_link_attr()
4460 link_attr_sync[params->port]), link_attr); in elink_update_link_attr()
4464 struct elink_params *params, in elink_warpcore_enable_AN_KR2() argument
4467 struct bxe_softc *sc = params->sc; in elink_warpcore_enable_AN_KR2()
4498 params->link_attr_sync |= LINK_ATTR_SYNC_KR2_ENABLE; in elink_warpcore_enable_AN_KR2()
4499 elink_update_link_attr(params, params->link_attr_sync); in elink_warpcore_enable_AN_KR2()
4502 static void elink_disable_kr2(struct elink_params *params, in elink_disable_kr2() argument
4506 struct bxe_softc *sc = params->sc; in elink_disable_kr2()
4531 params->link_attr_sync &= ~LINK_ATTR_SYNC_KR2_ENABLE; in elink_disable_kr2()
4532 elink_update_link_attr(params, params->link_attr_sync); in elink_disable_kr2()
4538 struct elink_params *params) in elink_warpcore_set_lpi_passthrough() argument
4540 struct bxe_softc *sc = params->sc; in elink_warpcore_set_lpi_passthrough()
4550 struct elink_params *params) in elink_warpcore_restart_AN_KR() argument
4553 struct bxe_softc *sc = params->sc; in elink_warpcore_restart_AN_KR()
4554 uint16_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_restart_AN_KR()
4561 elink_set_aer_mmd(params, phy); in elink_warpcore_restart_AN_KR()
4565 struct elink_params *params, in elink_warpcore_enable_AN_KR() argument
4569 struct bxe_softc *sc = params->sc; in elink_warpcore_enable_AN_KR()
4615 elink_set_aer_mmd(params, phy); in elink_warpcore_enable_AN_KR()
4620 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_enable_AN_KR()
4647 if (REG_RD(sc, params->shmem_base + in elink_warpcore_enable_AN_KR()
4649 port_hw_config[params->port].default_cfg)) & in elink_warpcore_enable_AN_KR()
4658 elink_ext_phy_set_pause(params, phy, vars); in elink_warpcore_enable_AN_KR()
4680 elink_set_aer_mmd(params, phy); in elink_warpcore_enable_AN_KR()
4682 elink_warpcore_enable_AN_KR2(phy, params, vars); in elink_warpcore_enable_AN_KR()
4687 wc_lane_config = REG_RD(sc, params->shmem_base + in elink_warpcore_enable_AN_KR()
4709 elink_disable_kr2(params, vars, phy); in elink_warpcore_enable_AN_KR()
4713 elink_warpcore_restart_AN_KR(phy, params); in elink_warpcore_enable_AN_KR()
4717 struct elink_params *params, in elink_warpcore_set_10G_KR() argument
4720 struct bxe_softc *sc = params->sc; in elink_warpcore_set_10G_KR()
4739 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_set_10G_KR()
4756 elink_set_aer_mmd(params, phy); in elink_warpcore_set_10G_KR()
4785 struct elink_params *params, in elink_warpcore_set_10G_XFI() argument
4788 struct bxe_softc *sc = params->sc; in elink_warpcore_set_10G_XFI()
4838 cfg_tap_val = REG_RD(sc, params->shmem_base + in elink_warpcore_set_10G_XFI()
4840 port_hw_config[params->port]. in elink_warpcore_set_10G_XFI()
4888 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_set_10G_XFI()
4904 elink_warpcore_set_lpi_passthrough(phy, params); in elink_warpcore_set_10G_XFI()
4920 struct elink_params *params) in elink_warpcore_set_20G_force_KR2() argument
4923 struct bxe_softc *sc = params->sc; in elink_warpcore_set_20G_force_KR2()
4932 elink_set_aer_mmd(params, phy); in elink_warpcore_set_20G_force_KR2()
4969 elink_set_aer_mmd(params, phy); in elink_warpcore_set_20G_force_KR2()
5027 struct elink_params *params, in elink_warpcore_set_sgmii_speed() argument
5031 struct bxe_softc *sc = params->sc; in elink_warpcore_set_sgmii_speed()
5038 elink_warpcore_set_lpi_passthrough(phy, params); in elink_warpcore_set_sgmii_speed()
5129 struct elink_params *params, in elink_warpcore_clear_regs() argument
5132 struct bxe_softc *sc = params->sc; in elink_warpcore_clear_regs()
5158 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_clear_regs()
5204 struct elink_params *params) in elink_is_sfp_module_plugged() argument
5206 struct bxe_softc *sc = params->sc; in elink_is_sfp_module_plugged()
5209 if (elink_get_mod_abs_int_cfg(sc, params->chip_id, in elink_is_sfp_module_plugged()
5210 params->shmem_base, params->port, in elink_is_sfp_module_plugged()
5222 struct elink_params *params) in elink_warpcore_get_sigdet() argument
5225 struct bxe_softc *sc = params->sc; in elink_warpcore_get_sigdet()
5227 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_get_sigdet()
5236 struct elink_params *params, in elink_warpcore_config_runtime() argument
5239 struct bxe_softc *sc = params->sc; in elink_warpcore_config_runtime()
5249 uint16_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_config_runtime()
5250 serdes_net_if = (REG_RD(sc, params->shmem_base + in elink_warpcore_config_runtime()
5252 port_hw_config[params->port].default_cfg)) & in elink_warpcore_config_runtime()
5289 struct elink_params *params) in elink_warpcore_config_sfi() argument
5291 uint16_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_config_sfi()
5292 struct bxe_softc *sc = params->sc; in elink_warpcore_config_sfi()
5293 elink_warpcore_clear_regs(phy, params, lane); in elink_warpcore_config_sfi()
5294 if ((params->req_line_speed[ELINK_LINK_CONFIG_IDX(ELINK_INT_PHY)] == in elink_warpcore_config_sfi()
5298 elink_warpcore_set_10G_XFI(phy, params, 0); in elink_warpcore_config_sfi()
5301 elink_warpcore_set_sgmii_speed(phy, params, 1, 0); in elink_warpcore_config_sfi()
5305 static void elink_sfp_e3_set_transmitter(struct elink_params *params, in elink_sfp_e3_set_transmitter() argument
5309 struct bxe_softc *sc = params->sc; in elink_sfp_e3_set_transmitter()
5311 uint8_t port = params->port; in elink_sfp_e3_set_transmitter()
5313 cfg_pin = REG_RD(sc, params->shmem_base + in elink_sfp_e3_set_transmitter()
5327 struct elink_params *params, in elink_warpcore_config_init() argument
5330 struct bxe_softc *sc = params->sc; in elink_warpcore_config_init()
5333 uint16_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_config_init()
5334 serdes_net_if = (REG_RD(sc, params->shmem_base + in elink_warpcore_config_init()
5336 port_hw_config[params->port].default_cfg)) & in elink_warpcore_config_init()
5341 elink_set_aer_mmd(params, phy); in elink_warpcore_config_init()
5350 elink_warpcore_clear_regs(phy, params, lane); in elink_warpcore_config_init()
5351 elink_warpcore_set_sgmii_speed(phy, params, 0, 1); in elink_warpcore_config_init()
5356 if (params->loopback_mode != ELINK_LOOPBACK_EXT) in elink_warpcore_config_init()
5357 elink_warpcore_enable_AN_KR(phy, params, vars); in elink_warpcore_config_init()
5360 elink_warpcore_set_10G_KR(phy, params, vars); in elink_warpcore_config_init()
5365 elink_warpcore_clear_regs(phy, params, lane); in elink_warpcore_config_init()
5368 elink_warpcore_set_10G_XFI(phy, params, 1); in elink_warpcore_config_init()
5370 if (ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_warpcore_config_init()
5378 params, in elink_warpcore_config_init()
5390 if ((params->loopback_mode == ELINK_LOOPBACK_NONE) || in elink_warpcore_config_init()
5391 (params->loopback_mode == ELINK_LOOPBACK_EXT)) { in elink_warpcore_config_init()
5392 if (elink_is_sfp_module_plugged(phy, params)) in elink_warpcore_config_init()
5393 elink_sfp_module_detection(phy, params); in elink_warpcore_config_init()
5395 elink_sfp_e3_set_transmitter(params, in elink_warpcore_config_init()
5399 elink_warpcore_config_sfi(phy, params); in elink_warpcore_config_init()
5411 elink_sfp_module_detection(phy, params); in elink_warpcore_config_init()
5414 if (!params->loopback_mode) { in elink_warpcore_config_init()
5415 elink_warpcore_enable_AN_KR(phy, params, vars); in elink_warpcore_config_init()
5418 elink_warpcore_set_20G_force_KR2(phy, params); in elink_warpcore_config_init()
5435 struct elink_params *params) in elink_warpcore_link_reset() argument
5437 struct bxe_softc *sc = params->sc; in elink_warpcore_link_reset()
5439 elink_sfp_e3_set_transmitter(params, phy, 0); in elink_warpcore_link_reset()
5440 elink_set_mdio_emac_per_phy(sc, params); in elink_warpcore_link_reset()
5441 elink_set_aer_mmd(params, phy); in elink_warpcore_link_reset()
5463 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_link_reset()
5485 elink_set_aer_mmd(params, phy); in elink_warpcore_link_reset()
5490 struct elink_params *params) in elink_set_warpcore_loopback() argument
5492 struct bxe_softc *sc = params->sc; in elink_set_warpcore_loopback()
5496 params->loopback_mode, phy->req_line_speed); in elink_set_warpcore_loopback()
5510 lane = elink_get_warpcore_lane(phy, params); in elink_set_warpcore_loopback()
5521 elink_set_aer_mmd(params, phy); in elink_set_warpcore_loopback()
5534 static void elink_sync_link(struct elink_params *params, in elink_sync_link() argument
5537 struct bxe_softc *sc = params->sc; in elink_sync_link()
5641 void elink_link_status_update(struct elink_params *params, in elink_link_status_update() argument
5644 struct bxe_softc *sc = params->sc; in elink_link_status_update()
5645 uint8_t port = params->port; in elink_link_status_update()
5648 set_phy_vars(params, vars); in elink_link_status_update()
5650 vars->link_status = REG_RD(sc, params->shmem_base + in elink_link_status_update()
5655 if (params->loopback_mode != ELINK_LOOPBACK_NONE && in elink_link_status_update()
5656 params->loopback_mode != ELINK_LOOPBACK_EXT) in elink_link_status_update()
5659 if (elink_eee_has_cap(params)) in elink_link_status_update()
5660 vars->eee_status = REG_RD(sc, params->shmem2_base + in elink_link_status_update()
5662 eee_status[params->port])); in elink_link_status_update()
5665 elink_sync_link(params, vars); in elink_link_status_update()
5667 sync_offset = params->shmem_base + in elink_link_status_update()
5672 params->phy[ELINK_INT_PHY].media_type = in elink_link_status_update()
5675 params->phy[ELINK_EXT_PHY1].media_type = in elink_link_status_update()
5678 params->phy[ELINK_EXT_PHY2].media_type = in elink_link_status_update()
5684 sync_offset = params->shmem_base + in elink_link_status_update()
5692 params->feature_config_flags |= in elink_link_status_update()
5695 params->feature_config_flags &= in elink_link_status_update()
5699 params->link_attr_sync = SHMEM2_RD(sc, in elink_link_status_update()
5700 link_attr_sync[params->port]); in elink_link_status_update()
5708 static void elink_set_master_ln(struct elink_params *params, in elink_set_master_ln() argument
5711 struct bxe_softc *sc = params->sc; in elink_set_master_ln()
5713 ser_lane = ((params->lane_config & in elink_set_master_ln()
5729 static elink_status_t elink_reset_unicore(struct elink_params *params, in elink_reset_unicore() argument
5733 struct bxe_softc *sc = params->sc; in elink_reset_unicore()
5747 elink_set_serdes_access(sc, params->port); in elink_reset_unicore()
5765 …elink_cb_event_log(sc, ELINK_LOG_ID_PHY_UNINITIALIZED, params->port); // "Warning: PHY was not ini… in elink_reset_unicore()
5773 static void elink_set_swap_lanes(struct elink_params *params, in elink_set_swap_lanes() argument
5776 struct bxe_softc *sc = params->sc; in elink_set_swap_lanes()
5782 rx_lane_swap = ((params->lane_config & in elink_set_swap_lanes()
5785 tx_lane_swap = ((params->lane_config & in elink_set_swap_lanes()
5816 struct elink_params *params) in elink_set_parallel_detection() argument
5818 struct bxe_softc *sc = params->sc; in elink_set_parallel_detection()
5869 struct elink_params *params, in elink_set_autoneg() argument
5873 struct bxe_softc *sc = params->sc; in elink_set_autoneg()
5973 struct elink_params *params, in elink_program_serdes() argument
5976 struct bxe_softc *sc = params->sc; in elink_program_serdes()
6022 struct elink_params *params) in elink_set_brcm_cl37_advertisement() argument
6024 struct bxe_softc *sc = params->sc; in elink_set_brcm_cl37_advertisement()
6042 struct elink_params *params, in elink_set_ieee_aneg_advertisement() argument
6045 struct bxe_softc *sc = params->sc; in elink_set_ieee_aneg_advertisement()
6063 struct elink_params *params, in elink_restart_autoneg() argument
6066 struct bxe_softc *sc = params->sc; in elink_restart_autoneg()
6103 struct elink_params *params, in elink_initialize_sgmii_process() argument
6106 struct bxe_softc *sc = params->sc; in elink_initialize_sgmii_process()
6168 elink_restart_autoneg(phy, params, 0); in elink_initialize_sgmii_process()
6175 struct elink_params *params) in elink_direct_parallel_detect_used() argument
6177 struct bxe_softc *sc = params->sc; in elink_direct_parallel_detect_used()
6191 params->port); in elink_direct_parallel_detect_used()
6202 params->port); in elink_direct_parallel_detect_used()
6209 struct elink_params *params, in elink_update_adv_fc() argument
6216 struct bxe_softc *sc = params->sc; in elink_update_adv_fc()
6251 elink_pause_resolve(phy, params, vars, pause_result); in elink_update_adv_fc()
6256 struct elink_params *params, in elink_flow_ctrl_resolve() argument
6260 struct bxe_softc *sc = params->sc; in elink_flow_ctrl_resolve()
6267 elink_update_adv_fc(phy, params, vars, gp_status); in elink_flow_ctrl_resolve()
6271 vars->flow_ctrl = params->req_fc_auto_adv; in elink_flow_ctrl_resolve()
6274 if (elink_direct_parallel_detect_used(phy, params)) { in elink_flow_ctrl_resolve()
6275 vars->flow_ctrl = params->req_fc_auto_adv; in elink_flow_ctrl_resolve()
6278 elink_update_adv_fc(phy, params, vars, gp_status); in elink_flow_ctrl_resolve()
6284 struct elink_params *params) in elink_check_fallback_to_cl37() argument
6286 struct bxe_softc *sc = params->sc; in elink_check_fallback_to_cl37()
6347 elink_restart_autoneg(phy, params, 0); in elink_check_fallback_to_cl37()
6352 struct elink_params *params, in elink_xgxs_an_resolve() argument
6360 if (elink_direct_parallel_detect_used(phy, params)) in elink_xgxs_an_resolve()
6365 struct elink_params *params, in elink_get_link_speed_duplex() argument
6371 struct bxe_softc *sc = params->sc; in elink_get_link_speed_duplex()
6458 struct elink_params *params, in elink_link_settings_status() argument
6461 struct bxe_softc *sc = params->sc; in elink_link_settings_status()
6486 rc = elink_get_link_speed_duplex(phy, params, vars, link_up, speed_mask, in elink_link_settings_status()
6492 if (ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_link_settings_status()
6494 elink_flow_ctrl_resolve(phy, params, vars, gp_status); in elink_link_settings_status()
6496 elink_xgxs_an_resolve(phy, params, vars, in elink_link_settings_status()
6501 ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_link_settings_status()
6503 elink_check_fallback_to_cl37(phy, params); in elink_link_settings_status()
6508 if (ELINK_SINGLE_MEDIA_DIRECT(params) && in elink_link_settings_status()
6540 struct elink_params *params, in elink_warpcore_read_status() argument
6543 struct bxe_softc *sc = params->sc; in elink_warpcore_read_status()
6547 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_read_status()
6549 if ((params->loopback_mode) && in elink_warpcore_read_status()
6569 elink_ext_phy_resolve_fc(phy, params, vars); in elink_warpcore_read_status()
6590 if (link_up && ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_warpcore_read_status()
6611 elink_ext_phy_resolve_fc(phy, params, vars); in elink_warpcore_read_status()
6620 ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_warpcore_read_status()
6665 rc = elink_get_link_speed_duplex(phy, params, vars, link_up, gp_speed, in elink_warpcore_read_status()
6677 static void elink_set_gmii_tx_driver(struct elink_params *params) in elink_set_gmii_tx_driver() argument
6679 struct bxe_softc *sc = params->sc; in elink_set_gmii_tx_driver()
6680 struct elink_phy *phy = ¶ms->phy[ELINK_INT_PHY]; in elink_set_gmii_tx_driver()
6716 static elink_status_t elink_emac_program(struct elink_params *params, in elink_emac_program() argument
6719 struct bxe_softc *sc = params->sc; in elink_emac_program()
6720 uint8_t port = params->port; in elink_emac_program()
6759 elink_set_led(params, vars, ELINK_LED_MODE_OPER, vars->line_speed); in elink_emac_program()
6764 struct elink_params *params) in elink_set_preemphasis() argument
6768 struct bxe_softc *sc = params->sc; in elink_set_preemphasis()
6788 struct elink_params *params, in elink_xgxs_config_init() argument
6791 struct bxe_softc *sc = params->sc; in elink_xgxs_config_init()
6792 uint8_t enable_cl73 = (ELINK_SINGLE_MEDIA_DIRECT(params) || in elink_xgxs_config_init()
6793 (params->loopback_mode == ELINK_LOOPBACK_XGXS)); in elink_xgxs_config_init()
6795 if (ELINK_SINGLE_MEDIA_DIRECT(params) && in elink_xgxs_config_init()
6796 (params->feature_config_flags & in elink_xgxs_config_init()
6798 elink_set_preemphasis(phy, params); in elink_xgxs_config_init()
6802 (ELINK_SINGLE_MEDIA_DIRECT(params) && in elink_xgxs_config_init()
6803 params->loopback_mode == ELINK_LOOPBACK_EXT)) { in elink_xgxs_config_init()
6807 elink_set_autoneg(phy, params, vars, 0); in elink_xgxs_config_init()
6810 elink_program_serdes(phy, params, vars); in elink_xgxs_config_init()
6816 elink_set_brcm_cl37_advertisement(phy, params); in elink_xgxs_config_init()
6819 elink_set_ieee_aneg_advertisement(phy, params, in elink_xgxs_config_init()
6823 elink_set_autoneg(phy, params, vars, enable_cl73); in elink_xgxs_config_init()
6826 elink_restart_autoneg(phy, params, enable_cl73); in elink_xgxs_config_init()
6832 elink_initialize_sgmii_process(phy, params, vars); in elink_xgxs_config_init()
6837 struct elink_params *params, in elink_prepare_xgxs() argument
6855 elink_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc); in elink_prepare_xgxs()
6856 elink_set_aer_mmd(params, phy); in elink_prepare_xgxs()
6858 elink_set_master_ln(params, phy); in elink_prepare_xgxs()
6860 rc = elink_reset_unicore(params, phy, 0); in elink_prepare_xgxs()
6865 elink_set_aer_mmd(params, phy); in elink_prepare_xgxs()
6868 elink_set_master_ln(params, phy); in elink_prepare_xgxs()
6869 elink_set_swap_lanes(params, phy); in elink_prepare_xgxs()
6877 struct elink_params *params) in elink_wait_reset_complete() argument
6895 …elink_cb_event_log(sc, ELINK_LOG_ID_PHY_UNINITIALIZED, params->port); // "Warning: PHY was not ini… in elink_wait_reset_complete()
6902 static void elink_link_int_enable(struct elink_params *params) in elink_link_int_enable() argument
6904 uint8_t port = params->port; in elink_link_int_enable()
6906 struct bxe_softc *sc = params->sc; in elink_link_int_enable()
6911 if (!(ELINK_SINGLE_MEDIA_DIRECT(params))) in elink_link_int_enable()
6913 } else if (params->switch_cfg == ELINK_SWITCH_CFG_10G) { in elink_link_int_enable()
6917 if (!(ELINK_SINGLE_MEDIA_DIRECT(params)) && in elink_link_int_enable()
6918 params->phy[ELINK_INT_PHY].type != in elink_link_int_enable()
6927 if (!(ELINK_SINGLE_MEDIA_DIRECT(params)) && in elink_link_int_enable()
6928 params->phy[ELINK_INT_PHY].type != in elink_link_int_enable()
6939 (params->switch_cfg == ELINK_SWITCH_CFG_10G), in elink_link_int_enable()
6984 static void elink_link_int_ack(struct elink_params *params, in elink_link_int_ack() argument
6987 struct bxe_softc *sc = params->sc; in elink_link_int_ack()
6988 uint8_t port = params->port; in elink_link_int_ack()
7003 else if (params->switch_cfg == ELINK_SWITCH_CFG_10G) { in elink_link_int_ack()
7008 ((params->lane_config & in elink_link_int_ack()
7070 elink_status_t elink_get_ext_phy_fw_version(struct elink_params *params, uint8_t *version, in elink_get_ext_phy_fw_version() argument
7078 if (version == NULL || params == NULL) in elink_get_ext_phy_fw_version()
7080 sc = params->sc; in elink_get_ext_phy_fw_version()
7084 spirom_ver = REG_RD(sc, params->phy[ELINK_EXT_PHY1].ver_addr); in elink_get_ext_phy_fw_version()
7086 if (params->phy[ELINK_EXT_PHY1].format_fw_ver) { in elink_get_ext_phy_fw_version()
7087 status |= params->phy[ELINK_EXT_PHY1].format_fw_ver(spirom_ver, in elink_get_ext_phy_fw_version()
7092 if ((params->num_phys == ELINK_MAX_PHYS) && in elink_get_ext_phy_fw_version()
7093 (params->phy[ELINK_EXT_PHY2].ver_addr != 0)) { in elink_get_ext_phy_fw_version()
7094 spirom_ver = REG_RD(sc, params->phy[ELINK_EXT_PHY2].ver_addr); in elink_get_ext_phy_fw_version()
7095 if (params->phy[ELINK_EXT_PHY2].format_fw_ver) { in elink_get_ext_phy_fw_version()
7099 status |= params->phy[ELINK_EXT_PHY2].format_fw_ver( in elink_get_ext_phy_fw_version()
7111 struct elink_params *params) in elink_set_xgxs_loopback() argument
7113 uint8_t port = params->port; in elink_set_xgxs_loopback()
7114 struct bxe_softc *sc = params->sc; in elink_set_xgxs_loopback()
7143 elink_set_aer_mmd(params, phy); in elink_set_xgxs_loopback()
7165 elink_status_t elink_set_led(struct elink_params *params, in elink_set_led() argument
7168 uint8_t port = params->port; in elink_set_led()
7169 uint16_t hw_led_mode = params->hw_led_mode; in elink_set_led()
7174 struct bxe_softc *sc = params->sc; in elink_set_led()
7180 if (params->phy[phy_idx].set_link_led) { in elink_set_led()
7181 params->phy[phy_idx].set_link_led( in elink_set_led()
7182 ¶ms->phy[phy_idx], params, mode); in elink_set_led()
7186 if (params->feature_config_flags & in elink_set_led()
7199 if (params->phy[ELINK_EXT_PHY1].type == in elink_set_led()
7217 if (((params->phy[ELINK_EXT_PHY1].type == in elink_set_led()
7219 (params->phy[ELINK_EXT_PHY1].type == in elink_set_led()
7221 CHIP_IS_E2(sc) && params->num_phys == 2) { in elink_set_led()
7239 } else if (ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_set_led()
7255 } else if ((params->phy[ELINK_EXT_PHY1].type == in elink_set_led()
7267 uint32_t nig_led_mode = ((params->hw_led_mode << in elink_set_led()
7318 elink_status_t elink_test_link(struct elink_params *params, struct elink_vars *vars, in elink_test_link() argument
7321 struct bxe_softc *sc = params->sc; in elink_test_link()
7325 struct elink_phy *int_phy = ¶ms->phy[ELINK_INT_PHY]; in elink_test_link()
7337 if (params->req_line_speed[ELINK_LINK_CONFIG_IDX(ELINK_INT_PHY)] in elink_test_link()
7347 uint8_t lane = elink_get_warpcore_lane(int_phy, params); in elink_test_link()
7367 if (params->loopback_mode == ELINK_LOOPBACK_XGXS) in elink_test_link()
7370 switch (params->num_phys) { in elink_test_link()
7375 ext_phy_link_up = params->phy[ELINK_EXT_PHY1].read_status( in elink_test_link()
7376 ¶ms->phy[ELINK_EXT_PHY1], in elink_test_link()
7377 params, &temp_vars); in elink_test_link()
7380 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_test_link()
7382 serdes_phy_type = ((params->phy[phy_index].media_type == in elink_test_link()
7384 (params->phy[phy_index].media_type == in elink_test_link()
7386 (params->phy[phy_index].media_type == in elink_test_link()
7388 (params->phy[phy_index].media_type == in elink_test_link()
7393 if (params->phy[phy_index].read_status) { in elink_test_link()
7395 params->phy[phy_index].read_status( in elink_test_link()
7396 ¶ms->phy[phy_index], in elink_test_link()
7397 params, &temp_vars); in elink_test_link()
7407 static elink_status_t elink_link_initialize(struct elink_params *params, in elink_link_initialize() argument
7411 struct bxe_softc *sc = params->sc; in elink_link_initialize()
7417 vars->line_speed = params->phy[ELINK_INT_PHY].req_line_speed; in elink_link_initialize()
7424 elink_prepare_xgxs(¶ms->phy[ELINK_INT_PHY], params, vars); in elink_link_initialize()
7426 non_ext_phy = (ELINK_SINGLE_MEDIA_DIRECT(params) || in elink_link_initialize()
7427 (params->loopback_mode == ELINK_LOOPBACK_XGXS)); in elink_link_initialize()
7430 (params->phy[ELINK_EXT_PHY1].flags & ELINK_FLAGS_INIT_XGXS_FIRST) || in elink_link_initialize()
7431 (params->loopback_mode == ELINK_LOOPBACK_EXT_PHY)) { in elink_link_initialize()
7432 struct elink_phy *phy = ¶ms->phy[ELINK_INT_PHY]; in elink_link_initialize()
7436 elink_set_parallel_detection(phy, params); in elink_link_initialize()
7437 if (params->phy[ELINK_INT_PHY].config_init) in elink_link_initialize()
7438 params->phy[ELINK_INT_PHY].config_init(phy, params, vars); in elink_link_initialize()
7444 vars->line_speed = params->phy[ELINK_INT_PHY].req_line_speed; in elink_link_initialize()
7448 if (params->phy[ELINK_INT_PHY].supported & in elink_link_initialize()
7452 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_link_initialize()
7459 if (params->phy[phy_index].supported & in elink_link_initialize()
7464 (elink_phy_selection(params) == in elink_link_initialize()
7470 params->phy[phy_index].config_init( in elink_link_initialize()
7471 ¶ms->phy[phy_index], in elink_link_initialize()
7472 params, vars); in elink_link_initialize()
7477 params->port*4, in elink_link_initialize()
7486 struct elink_params *params) in elink_int_link_reset() argument
7489 REG_WR(params->sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_CLEAR, in elink_int_link_reset()
7490 (0x1ff << (params->port*16))); in elink_int_link_reset()
7494 struct elink_params *params) in elink_common_ext_link_reset() argument
7496 struct bxe_softc *sc = params->sc; in elink_common_ext_link_reset()
7502 gpio_port = params->port; in elink_common_ext_link_reset()
7512 static elink_status_t elink_update_link_down(struct elink_params *params, in elink_update_link_down() argument
7515 struct bxe_softc *sc = params->sc; in elink_update_link_down()
7516 uint8_t port = params->port; in elink_update_link_down()
7519 elink_set_led(params, vars, ELINK_LED_MODE_OFF, 0); in elink_update_link_down()
7527 elink_update_mng(params, vars->link_status); in elink_update_link_down()
7540 elink_set_bmac_rx(sc, params->chip_id, params->port, 0); in elink_update_link_down()
7544 REG_WR(sc, MISC_REG_CPMU_LP_FW_ENABLE_P0 + (params->port << 2), in elink_update_link_down()
7546 REG_WR(sc, MISC_REG_CPMU_LP_MASK_ENT_P0 + (params->port << 2), in elink_update_link_down()
7551 elink_update_mng_eee(params, vars->eee_status); in elink_update_link_down()
7552 elink_set_xmac_rxtx(params, 0); in elink_update_link_down()
7553 elink_set_umac_rxtx(params, 0); in elink_update_link_down()
7559 static elink_status_t elink_update_link_up(struct elink_params *params, in elink_update_link_up() argument
7563 struct bxe_softc *sc = params->sc; in elink_update_link_up()
7564 uint8_t phy_idx, port = params->port; in elink_update_link_up()
7580 if (elink_xmac_enable(params, vars, 0) == in elink_update_link_up()
7588 elink_umac_enable(params, vars, 0); in elink_update_link_up()
7589 elink_set_led(params, vars, in elink_update_link_up()
7596 (params->port << 2), 1); in elink_update_link_up()
7599 (params->port << 2), 0xfc20); in elink_update_link_up()
7605 if (elink_bmac_enable(params, vars, 0, 1) == in elink_update_link_up()
7613 elink_set_led(params, vars, in elink_update_link_up()
7616 rc = elink_emac_program(params, vars); in elink_update_link_up()
7617 elink_emac_enable(params, vars, 0); in elink_update_link_up()
7623 ELINK_SINGLE_MEDIA_DIRECT(params)) in elink_update_link_up()
7624 elink_set_gmii_tx_driver(params); in elink_update_link_up()
7630 rc |= elink_pbf_update(params, vars->flow_ctrl, in elink_update_link_up()
7637 elink_update_mng(params, vars->link_status); in elink_update_link_up()
7638 elink_update_mng_eee(params, vars->eee_status); in elink_update_link_up()
7641 if (params->phy[phy_idx].flags & ELINK_FLAGS_TX_ERROR_CHECK) { in elink_update_link_up()
7642 elink_check_half_open_conn(params, vars, 0); in elink_update_link_up()
7650 static void elink_chng_link_count(struct elink_params *params, uint8_t clear) in elink_chng_link_count() argument
7652 struct bxe_softc *sc = params->sc; in elink_chng_link_count()
7659 addr = params->shmem2_base + in elink_chng_link_count()
7660 offsetof(struct shmem2_region, link_change_count[params->port]); in elink_chng_link_count()
7680 elink_status_t elink_link_update(struct elink_params *params, struct elink_vars *vars) in elink_link_update() argument
7682 struct bxe_softc *sc = params->sc; in elink_link_update()
7684 uint8_t port = params->port; in elink_link_update()
7693 for (phy_index = ELINK_INT_PHY; phy_index < params->num_phys; in elink_link_update()
7707 elink_set_aer_mmd(params, ¶ms->phy[ELINK_INT_PHY]); in elink_link_update()
7733 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_link_update()
7735 struct elink_phy *phy = ¶ms->phy[phy_index]; in elink_link_update()
7739 cur_link_up = phy->read_status(phy, params, in elink_link_update()
7754 switch (elink_phy_selection(params)) { in elink_link_update()
7780 params->multi_phy_config); in elink_link_update()
7793 if (params->phy[ELINK_INT_PHY].read_status) in elink_link_update()
7794 params->phy[ELINK_INT_PHY].read_status( in elink_link_update()
7795 ¶ms->phy[ELINK_INT_PHY], in elink_link_update()
7796 params, vars); in elink_link_update()
7815 if (params->phy[ELINK_EXT_PHY2].phy_specific_func) { in elink_link_update()
7818 params->phy[ELINK_EXT_PHY2].phy_specific_func( in elink_link_update()
7819 ¶ms->phy[ELINK_EXT_PHY2], in elink_link_update()
7820 params, ELINK_DISABLE_TX); in elink_link_update()
7826 if (params->phy[active_external_phy].supported & in elink_link_update()
7851 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_link_update()
7853 if (params->phy[phy_index].flags & in elink_link_update()
7870 if (!(ELINK_SINGLE_MEDIA_DIRECT(params)) && ext_phy_link_up && in elink_link_update()
7879 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, in elink_link_update()
7888 elink_link_int_ack(params, vars, link_10g_plus); in elink_link_update()
7897 if (!(ELINK_SINGLE_MEDIA_DIRECT(params))) { in elink_link_update()
7901 params->phy[ELINK_EXT_PHY1].flags & in elink_link_update()
7903 if (!(params->phy[ELINK_EXT_PHY1].flags & in elink_link_update()
7912 if (params->phy[ELINK_INT_PHY].config_init) in elink_link_update()
7913 params->phy[ELINK_INT_PHY].config_init( in elink_link_update()
7914 ¶ms->phy[ELINK_INT_PHY], params, in elink_link_update()
7923 ELINK_SINGLE_MEDIA_DIRECT(params)) && in elink_link_update()
7933 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_link_update()
7939 rc = elink_update_link_up(params, vars, link_10g_plus); in elink_link_update()
7941 rc = elink_update_link_down(params, vars); in elink_link_update()
7944 elink_chng_link_count(params, 0); in elink_link_update()
7947 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_BC_SUPPORTS_AFEX) in elink_link_update()
8010 struct elink_params *params, in elink_8073_resolve_fc() argument
8013 struct bxe_softc *sc = params->sc; in elink_8073_resolve_fc()
8020 if (elink_ext_phy_resolve_fc(phy, params, vars) && in elink_8073_resolve_fc()
8037 elink_pause_resolve(phy, params, vars, pause_result); in elink_8073_resolve_fc()
8218 static void elink_8073_set_pause_cl37(struct elink_params *params, in elink_8073_set_pause_cl37() argument
8223 struct bxe_softc *sc = params->sc; in elink_8073_set_pause_cl37()
8229 elink_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc); in elink_8073_set_pause_cl37()
8254 struct elink_params *params, in elink_8073_specific_func() argument
8257 struct bxe_softc *sc = params->sc; in elink_8073_specific_func()
8270 struct elink_params *params, in elink_8073_config_init() argument
8273 struct bxe_softc *sc = params->sc; in elink_8073_config_init()
8281 gpio_port = params->port; in elink_8073_config_init()
8289 elink_8073_specific_func(phy, params, ELINK_PHY_INIT); in elink_8073_config_init()
8290 elink_8073_set_pause_cl37(params, phy, vars); in elink_8073_config_init()
8301 if (params->lane_config & PORT_HW_CFG_SWAP_PHY_POLARITY_ENABLED) { in elink_8073_config_init()
8316 if (REG_RD(sc, params->shmem_base + in elink_8073_config_init()
8318 port_hw_config[params->port].default_cfg)) & in elink_8073_config_init()
8329 if (params->loopback_mode == ELINK_LOOPBACK_EXT) { in elink_8073_config_init()
8407 elink_ext_phy_set_pause(params, phy, vars); in elink_8073_config_init()
8418 struct elink_params *params, in elink_8073_read_status() argument
8421 struct bxe_softc *sc = params->sc; in elink_8073_read_status()
8502 params->port); in elink_8073_read_status()
8507 params->port); in elink_8073_read_status()
8512 params->port); in elink_8073_read_status()
8516 params->port); in elink_8073_read_status()
8521 if (params->lane_config & in elink_8073_read_status()
8543 elink_8073_resolve_fc(phy, params, vars); in elink_8073_read_status()
8563 struct elink_params *params) in elink_8073_link_reset() argument
8565 struct bxe_softc *sc = params->sc; in elink_8073_link_reset()
8570 gpio_port = params->port; in elink_8073_link_reset()
8582 struct elink_params *params, in elink_8705_config_init() argument
8585 struct bxe_softc *sc = params->sc; in elink_8705_config_init()
8589 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); in elink_8705_config_init()
8591 elink_ext_phy_hw_reset(sc, params->port); in elink_8705_config_init()
8593 elink_wait_reset_complete(sc, phy, params); in elink_8705_config_init()
8604 elink_save_spirom_version(sc, params->port, params->shmem_base, 0); in elink_8705_config_init()
8609 struct elink_params *params, in elink_8705_read_status() argument
8614 struct bxe_softc *sc = params->sc; in elink_8705_read_status()
8636 elink_ext_phy_resolve_fc(phy, params, vars); in elink_8705_read_status()
8644 static void elink_set_disable_pmd_transmit(struct elink_params *params, in elink_set_disable_pmd_transmit() argument
8648 struct bxe_softc *sc = params->sc; in elink_set_disable_pmd_transmit()
8653 if (params->feature_config_flags & in elink_set_disable_pmd_transmit()
8667 static uint8_t elink_get_gpio_port(struct elink_params *params) in elink_get_gpio_port() argument
8671 struct bxe_softc *sc = params->sc; in elink_get_gpio_port()
8675 gpio_port = params->port; in elink_get_gpio_port()
8681 static void elink_sfp_e1e2_set_transmitter(struct elink_params *params, in elink_sfp_e1e2_set_transmitter() argument
8686 uint8_t port = params->port; in elink_sfp_e1e2_set_transmitter()
8687 struct bxe_softc *sc = params->sc; in elink_sfp_e1e2_set_transmitter()
8691 tx_en_mode = REG_RD(sc, params->shmem_base + in elink_sfp_e1e2_set_transmitter()
8728 gpio_port = elink_get_gpio_port(params); in elink_sfp_e1e2_set_transmitter()
8738 static void elink_sfp_set_transmitter(struct elink_params *params, in elink_sfp_set_transmitter() argument
8742 struct bxe_softc *sc = params->sc; in elink_sfp_set_transmitter()
8745 elink_sfp_e3_set_transmitter(params, phy, tx_en); in elink_sfp_set_transmitter()
8747 elink_sfp_e1e2_set_transmitter(params, phy, tx_en); in elink_sfp_set_transmitter()
8751 struct elink_params *params, in elink_8726_read_sfp_module_eeprom() argument
8755 struct bxe_softc *sc = params->sc; in elink_8726_read_sfp_module_eeprom()
8817 static void elink_warpcore_power_module(struct elink_params *params, in elink_warpcore_power_module() argument
8821 struct bxe_softc *sc = params->sc; in elink_warpcore_power_module()
8823 pin_cfg = (REG_RD(sc, params->shmem_base + in elink_warpcore_power_module()
8825 dev_info.port_hw_config[params->port].e3_sfp_ctrl)) & in elink_warpcore_power_module()
8839 struct elink_params *params, in elink_warpcore_read_sfp_module_eeprom() argument
8848 struct bxe_softc *sc = params->sc; in elink_warpcore_read_sfp_module_eeprom()
8860 elink_warpcore_power_module(params, 0); in elink_warpcore_read_sfp_module_eeprom()
8863 elink_warpcore_power_module(params, 1); in elink_warpcore_read_sfp_module_eeprom()
8866 elink_bsc_module_sel(params); in elink_warpcore_read_sfp_module_eeprom()
8882 struct elink_params *params, in elink_8727_read_sfp_module_eeprom() argument
8886 struct bxe_softc *sc = params->sc; in elink_8727_read_sfp_module_eeprom()
8977 struct elink_params *params, uint8_t dev_addr, in elink_read_sfp_module_eeprom() argument
8981 struct bxe_softc *sc = params->sc; in elink_read_sfp_module_eeprom()
9008 rc = read_func(phy, params, dev_addr, addr, xfer_size, in elink_read_sfp_module_eeprom()
9018 struct elink_params *params, in elink_get_edc_mode() argument
9021 struct bxe_softc *sc = params->sc; in elink_get_edc_mode()
9028 params, in elink_get_edc_mode()
9036 params->link_attr_sync &= ~LINK_SFP_EEPROM_COMP_CODE_MASK; in elink_get_edc_mode()
9037 params->link_attr_sync |= val[ELINK_SFP_EEPROM_10G_COMP_CODE_ADDR] << in elink_get_edc_mode()
9039 elink_update_link_attr(params, params->link_attr_sync); in elink_get_edc_mode()
9088 uint8_t gport = params->port; in elink_get_edc_mode()
9092 (params->port << 1); in elink_get_edc_mode()
9105 elink_sfp_set_transmitter(params, phy, 0); in elink_get_edc_mode()
9107 elink_sfp_set_transmitter(params, phy, 1); in elink_get_edc_mode()
9113 if (params->phy[idx].type == phy->type) { in elink_get_edc_mode()
9119 phy->req_line_speed = params->req_line_speed[cfg_idx]; in elink_get_edc_mode()
9127 sync_offset = params->shmem_base + in elink_get_edc_mode()
9129 dev_info.port_hw_config[params->port].media_type); in elink_get_edc_mode()
9133 if (&(params->phy[phy_idx]) == phy) { in elink_get_edc_mode()
9146 params, in elink_get_edc_mode()
9167 struct elink_params *params) in elink_verify_sfp_module() argument
9169 struct bxe_softc *sc = params->sc; in elink_verify_sfp_module()
9175 val = REG_RD(sc, params->shmem_base + in elink_verify_sfp_module()
9177 port_feature_config[params->port].config)); in elink_verify_sfp_module()
9184 if (params->feature_config_flags & in elink_verify_sfp_module()
9188 } else if (params->feature_config_flags & in elink_verify_sfp_module()
9191 if (ELINK_DUAL_MEDIA(params)) { in elink_verify_sfp_module()
9213 params, in elink_verify_sfp_module()
9222 params, in elink_verify_sfp_module()
9231 …elink_cb_event_log(sc, ELINK_LOG_ID_UNQUAL_IO_MODULE, params->port, vendor_name, vendor_pn); // "W… in elink_verify_sfp_module()
9241 struct elink_params *params) in elink_wait_for_sfp_module_initialized() argument
9246 struct bxe_softc *sc = params->sc; in elink_wait_for_sfp_module_initialized()
9255 phy, params, ELINK_I2C_DEV_ADDR_A0, 1, 1, &val, in elink_wait_for_sfp_module_initialized()
9258 rc = elink_read_sfp_module_eeprom(phy, params, in elink_wait_for_sfp_module_initialized()
9269 rc = elink_read_sfp_module_eeprom(phy, params, ELINK_I2C_DEV_ADDR_A0, in elink_wait_for_sfp_module_initialized()
9390 struct elink_params *params, in elink_8727_specific_func() argument
9393 struct bxe_softc *sc = params->sc; in elink_8727_specific_func()
9397 elink_sfp_set_transmitter(params, phy, 0); in elink_8727_specific_func()
9401 elink_sfp_set_transmitter(params, phy, 1); in elink_8727_specific_func()
9435 static void elink_set_e1e2_module_fault_led(struct elink_params *params, in elink_set_e1e2_module_fault_led() argument
9438 struct bxe_softc *sc = params->sc; in elink_set_e1e2_module_fault_led()
9440 uint32_t fault_led_gpio = REG_RD(sc, params->shmem_base + in elink_set_e1e2_module_fault_led()
9442 dev_info.port_hw_config[params->port].sfp_ctrl)) & in elink_set_e1e2_module_fault_led()
9452 uint8_t gpio_port = elink_get_gpio_port(params); in elink_set_e1e2_module_fault_led()
9467 static void elink_set_e3_module_fault_led(struct elink_params *params, in elink_set_e3_module_fault_led() argument
9471 uint8_t port = params->port; in elink_set_e3_module_fault_led()
9472 struct bxe_softc *sc = params->sc; in elink_set_e3_module_fault_led()
9473 pin_cfg = (REG_RD(sc, params->shmem_base + in elink_set_e3_module_fault_led()
9483 static void elink_set_sfp_module_fault_led(struct elink_params *params, in elink_set_sfp_module_fault_led() argument
9486 struct bxe_softc *sc = params->sc; in elink_set_sfp_module_fault_led()
9492 elink_set_e3_module_fault_led(params, gpio_mode); in elink_set_sfp_module_fault_led()
9494 elink_set_e1e2_module_fault_led(params, gpio_mode); in elink_set_sfp_module_fault_led()
9498 struct elink_params *params) in elink_warpcore_hw_reset() argument
9500 struct bxe_softc *sc = params->sc; in elink_warpcore_hw_reset()
9501 elink_warpcore_power_module(params, 0); in elink_warpcore_hw_reset()
9511 static void elink_power_sfp_module(struct elink_params *params, in elink_power_sfp_module() argument
9515 struct bxe_softc *sc = params->sc; in elink_power_sfp_module()
9521 elink_8727_power_module(params->sc, phy, power); in elink_power_sfp_module()
9524 elink_warpcore_power_module(params, power); in elink_power_sfp_module()
9530 static void elink_warpcore_set_limiting_mode(struct elink_params *params, in elink_warpcore_set_limiting_mode() argument
9536 struct bxe_softc *sc = params->sc; in elink_warpcore_set_limiting_mode()
9538 uint8_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_set_limiting_mode()
9570 static void elink_set_limiting_mode(struct elink_params *params, in elink_set_limiting_mode() argument
9576 elink_8726_set_limiting_mode(params->sc, phy, edc_mode); in elink_set_limiting_mode()
9580 elink_8727_set_limiting_mode(params->sc, phy, edc_mode); in elink_set_limiting_mode()
9583 elink_warpcore_set_limiting_mode(params, phy, edc_mode); in elink_set_limiting_mode()
9589 struct elink_params *params) in elink_sfp_module_detection() argument
9591 struct bxe_softc *sc = params->sc; in elink_sfp_module_detection()
9595 uint32_t val = REG_RD(sc, params->shmem_base + in elink_sfp_module_detection()
9597 port_feature_config[params->port].config)); in elink_sfp_module_detection()
9599 elink_sfp_set_transmitter(params, phy, 1); in elink_sfp_module_detection()
9601 params->port); in elink_sfp_module_detection()
9603 elink_power_sfp_module(params, phy, 1); in elink_sfp_module_detection()
9604 if (elink_get_edc_mode(phy, params, &edc_mode) != 0) { in elink_sfp_module_detection()
9607 } else if (elink_verify_sfp_module(phy, params) != 0) { in elink_sfp_module_detection()
9612 elink_set_sfp_module_fault_led(params, in elink_sfp_module_detection()
9619 elink_power_sfp_module(params, phy, 0); in elink_sfp_module_detection()
9624 elink_set_sfp_module_fault_led(params, MISC_REGISTERS_GPIO_LOW); in elink_sfp_module_detection()
9630 elink_set_limiting_mode(params, phy, edc_mode); in elink_sfp_module_detection()
9638 elink_sfp_set_transmitter(params, phy, 0); in elink_sfp_module_detection()
9643 void elink_handle_module_detect_int(struct elink_params *params) in elink_handle_module_detect_int() argument
9645 struct bxe_softc *sc = params->sc; in elink_handle_module_detect_int()
9650 phy = ¶ms->phy[ELINK_INT_PHY]; in elink_handle_module_detect_int()
9652 elink_sfp_set_transmitter(params, phy, 1); in elink_handle_module_detect_int()
9654 phy = ¶ms->phy[ELINK_EXT_PHY1]; in elink_handle_module_detect_int()
9656 if (elink_get_mod_abs_int_cfg(sc, params->chip_id, params->shmem_base, in elink_handle_module_detect_int()
9657 params->port, &gpio_num, &gpio_port) == in elink_handle_module_detect_int()
9664 elink_set_sfp_module_fault_led(params, MISC_REGISTERS_GPIO_HIGH); in elink_handle_module_detect_int()
9671 elink_set_mdio_emac_per_phy(sc, params); in elink_handle_module_detect_int()
9672 elink_set_aer_mmd(params, phy); in elink_handle_module_detect_int()
9674 elink_power_sfp_module(params, phy, 1); in elink_handle_module_detect_int()
9678 if (elink_wait_for_sfp_module_initialized(phy, params) == 0) { in elink_handle_module_detect_int()
9679 elink_sfp_module_detection(phy, params); in elink_handle_module_detect_int()
9691 (params->link_flags & in elink_handle_module_detect_int()
9694 elink_warpcore_config_sfi(phy, params); in elink_handle_module_detect_int()
9739 struct elink_params *params, in elink_8706_8726_read_status() argument
9744 struct bxe_softc *sc = params->sc; in elink_8706_8726_read_status()
9780 elink_ext_phy_resolve_fc(phy, params, vars); in elink_8706_8726_read_status()
9801 struct elink_params *params, in elink_8706_config_init() argument
9806 struct bxe_softc *sc = params->sc; in elink_8706_config_init()
9809 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); in elink_8706_config_init()
9811 elink_ext_phy_hw_reset(sc, params->port); in elink_8706_config_init()
9813 elink_wait_reset_complete(sc, phy, params); in elink_8706_config_init()
9824 if ((params->feature_config_flags & in elink_8706_config_init()
9883 elink_save_bcm_spirom_ver(sc, phy, params->port); in elink_8706_config_init()
9889 tx_en_mode = REG_RD(sc, params->shmem_base + in elink_8706_config_init()
9891 dev_info.port_hw_config[params->port].sfp_ctrl)) in elink_8706_config_init()
9907 struct elink_params *params, in elink_8706_read_status() argument
9910 return elink_8706_8726_read_status(phy, params, vars); in elink_8706_read_status()
9917 struct elink_params *params) in elink_8726_config_loopback() argument
9919 struct bxe_softc *sc = params->sc; in elink_8726_config_loopback()
9925 struct elink_params *params) in elink_8726_external_rom_boot() argument
9927 struct bxe_softc *sc = params->sc; in elink_8726_external_rom_boot()
9959 elink_save_bcm_spirom_ver(sc, phy, params->port); in elink_8726_external_rom_boot()
9963 struct elink_params *params, in elink_8726_read_status() argument
9966 struct bxe_softc *sc = params->sc; in elink_8726_read_status()
9968 uint8_t link_up = elink_8706_8726_read_status(phy, params, vars); in elink_8726_read_status()
9984 struct elink_params *params, in elink_8726_config_init() argument
9987 struct bxe_softc *sc = params->sc; in elink_8726_config_init()
9991 elink_wait_reset_complete(sc, phy, params); in elink_8726_config_init()
9993 elink_8726_external_rom_boot(phy, params); in elink_8726_config_init()
10000 elink_sfp_module_detection(phy, params); in elink_8726_config_init()
10021 elink_ext_phy_set_pause(params, phy, vars); in elink_8726_config_init()
10047 if ((params->feature_config_flags & in elink_8726_config_init()
10069 struct elink_params *params) in elink_8726_link_reset() argument
10071 struct bxe_softc *sc = params->sc; in elink_8726_link_reset()
10072 ELINK_DEBUG_P1(sc, "elink_8726_link_reset port %d\n", params->port); in elink_8726_link_reset()
10084 struct elink_params *params, uint8_t mode) in elink_8727_set_link_led() argument
10086 struct bxe_softc *sc = params->sc; in elink_8727_set_link_led()
10130 struct elink_params *params) { in elink_8727_hw_reset() argument
10136 struct bxe_softc *sc = params->sc; in elink_8727_hw_reset()
10145 struct elink_params *params) in elink_8727_config_speed() argument
10147 struct bxe_softc *sc = params->sc; in elink_8727_config_speed()
10163 if (ELINK_DUAL_MEDIA(params)) { in elink_8727_config_speed()
10202 struct elink_params *params, in elink_8727_config_init() argument
10207 struct bxe_softc *sc = params->sc; in elink_8727_config_init()
10210 elink_wait_reset_complete(sc, phy, params); in elink_8727_config_init()
10214 elink_8727_specific_func(phy, params, ELINK_PHY_INIT); in elink_8727_config_init()
10231 elink_set_disable_pmd_transmit(params, phy, 0); in elink_8727_config_init()
10241 elink_8727_config_speed(phy, params); in elink_8727_config_init()
10245 if ((params->feature_config_flags & in elink_8727_config_init()
10262 tx_en_mode = REG_RD(sc, params->shmem_base + in elink_8727_config_init()
10264 dev_info.port_hw_config[params->port].sfp_ctrl)) in elink_8727_config_init()
10288 struct elink_params *params) in elink_8727_handle_mod_abs() argument
10290 struct bxe_softc *sc = params->sc; in elink_8727_handle_mod_abs()
10292 uint32_t val = REG_RD(sc, params->shmem_base + in elink_8727_handle_mod_abs()
10294 port_feature_config[params->port]. in elink_8727_handle_mod_abs()
10356 elink_sfp_set_transmitter(params, phy, 0); in elink_8727_handle_mod_abs()
10358 if (elink_wait_for_sfp_module_initialized(phy, params) == 0) in elink_8727_handle_mod_abs()
10359 elink_sfp_module_detection(phy, params); in elink_8727_handle_mod_abs()
10364 elink_8727_config_speed(phy, params); in elink_8727_handle_mod_abs()
10373 struct elink_params *params, in elink_8727_read_status() argument
10377 struct bxe_softc *sc = params->sc; in elink_8727_read_status()
10418 uint8_t oc_port = params->port; in elink_8727_read_status()
10420 oc_port = SC_PATH(sc) + (params->port << 1); in elink_8727_read_status()
10448 elink_8727_power_module(params->sc, phy, 0); in elink_8727_read_status()
10455 elink_8727_handle_mod_abs(phy, params); in elink_8727_read_status()
10464 elink_sfp_set_transmitter(params, phy, 1); in elink_8727_read_status()
10481 params->port); in elink_8727_read_status()
10486 params->port); in elink_8727_read_status()
10490 params->port); in elink_8727_read_status()
10507 elink_ext_phy_resolve_fc(phy, params, vars); in elink_8727_read_status()
10512 if ((ELINK_DUAL_MEDIA(params)) && in elink_8727_read_status()
10532 struct elink_params *params) in elink_8727_link_reset() argument
10534 struct bxe_softc *sc = params->sc; in elink_8727_link_reset()
10537 elink_set_disable_pmd_transmit(params, phy, 1); in elink_8727_link_reset()
10540 elink_sfp_set_transmitter(params, phy, 0); in elink_8727_link_reset()
10664 struct elink_params *params, in elink_848xx_specific_func() argument
10667 struct bxe_softc *sc = params->sc; in elink_848xx_specific_func()
10672 elink_save_848xx_spirom_version(phy, sc, params->port); in elink_848xx_specific_func()
10678 elink_bits_en(sc, NIG_REG_LATCH_BC_0 + params->port*4, in elink_848xx_specific_func()
10687 struct elink_params *params, in elink_848xx_cmn_config_init() argument
10690 struct bxe_softc *sc = params->sc; in elink_848xx_cmn_config_init()
10693 elink_848xx_specific_func(phy, params, ELINK_PHY_INIT); in elink_848xx_cmn_config_init()
10702 elink_ext_phy_set_pause(params, phy, vars); in elink_848xx_cmn_config_init()
10833 struct elink_params *params, in elink_8481_config_init() argument
10836 struct bxe_softc *sc = params->sc; in elink_8481_config_init()
10839 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); in elink_8481_config_init()
10842 elink_ext_phy_hw_reset(sc, params->port); in elink_8481_config_init()
10843 elink_wait_reset_complete(sc, phy, params); in elink_8481_config_init()
10846 return elink_848xx_cmn_config_init(phy, params, vars); in elink_8481_config_init()
10853 struct elink_params *params, in elink_84858_cmd_hdlr() argument
10859 struct bxe_softc *sc = params->sc; in elink_84858_cmd_hdlr()
10930 struct elink_params *params, uint16_t fw_cmd, in elink_84833_cmd_hdlr() argument
10935 struct bxe_softc *sc = params->sc; in elink_84833_cmd_hdlr()
11009 struct elink_params *params, in elink_848xx_cmd_hdlr() argument
11014 struct bxe_softc *sc = params->sc; in elink_848xx_cmd_hdlr()
11017 (REG_RD(sc, params->shmem2_base + in elink_848xx_cmd_hdlr()
11019 link_attr_sync[params->port])) & LINK_ATTR_84858)) { in elink_848xx_cmd_hdlr()
11020 return elink_84858_cmd_hdlr(phy, params, fw_cmd, cmd_args, in elink_848xx_cmd_hdlr()
11023 return elink_84833_cmd_hdlr(phy, params, fw_cmd, cmd_args, in elink_848xx_cmd_hdlr()
11029 struct elink_params *params, in elink_848xx_pair_swap_cfg() argument
11035 struct bxe_softc *sc = params->sc; in elink_848xx_pair_swap_cfg()
11038 pair_swap = REG_RD(sc, params->shmem_base + in elink_848xx_pair_swap_cfg()
11040 dev_info.port_hw_config[params->port].xgbt_phy_cfg)) & in elink_848xx_pair_swap_cfg()
11049 status = elink_848xx_cmd_hdlr(phy, params, in elink_848xx_pair_swap_cfg()
11097 struct elink_params *params) in elink_84833_hw_reset_phy() argument
11099 struct bxe_softc *sc = params->sc; in elink_84833_hw_reset_phy()
11101 uint32_t other_shmem_base_addr = REG_RD(sc, params->shmem2_base + in elink_84833_hw_reset_phy()
11115 shmem_base_path[0] = params->shmem_base; in elink_84833_hw_reset_phy()
11119 params->chip_id); in elink_84833_hw_reset_phy()
11130 struct elink_params *params, in elink_8483x_disable_eee() argument
11134 struct bxe_softc *sc = params->sc; in elink_8483x_disable_eee()
11140 rc = elink_848xx_cmd_hdlr(phy, params, PHY848xx_CMD_SET_EEE_MODE, in elink_8483x_disable_eee()
11147 return elink_eee_disable(phy, params, vars); in elink_8483x_disable_eee()
11151 struct elink_params *params, in elink_8483x_enable_eee() argument
11155 struct bxe_softc *sc = params->sc; in elink_8483x_enable_eee()
11158 rc = elink_848xx_cmd_hdlr(phy, params, PHY848xx_CMD_SET_EEE_MODE, in elink_8483x_enable_eee()
11165 return elink_eee_advertise(phy, params, vars, SHMEM_EEE_10G_ADV); in elink_8483x_enable_eee()
11170 struct elink_params *params, in elink_848x3_config_init() argument
11173 struct bxe_softc *sc = params->sc; in elink_848x3_config_init()
11185 port = params->port; in elink_848x3_config_init()
11198 elink_wait_reset_complete(sc, phy, params); in elink_848x3_config_init()
11209 elink_set_autoneg(¶ms->phy[ELINK_INT_PHY], params, vars, 0); in elink_848x3_config_init()
11210 elink_program_serdes(¶ms->phy[ELINK_INT_PHY], params, vars); in elink_848x3_config_init()
11220 params->link_attr_sync |= LINK_ATTR_84858; in elink_848x3_config_init()
11221 elink_update_link_attr(params, params->link_attr_sync); in elink_848x3_config_init()
11242 actual_phy_selection = elink_phy_selection(params); in elink_848x3_config_init()
11262 if (params->phy[ELINK_EXT_PHY2].req_line_speed == ELINK_SPEED_1000) in elink_848x3_config_init()
11268 params->multi_phy_config, val); in elink_848x3_config_init()
11271 elink_848xx_pair_swap_cfg(phy, params, vars); in elink_848x3_config_init()
11278 rc = elink_848xx_cmd_hdlr(phy, params, in elink_848x3_config_init()
11285 rc = elink_848xx_cmn_config_init(phy, params, vars); in elink_848x3_config_init()
11287 elink_save_848xx_spirom_version(phy, sc, params->port); in elink_848x3_config_init()
11290 uint32_t cms_enable = REG_RD(sc, params->shmem_base + in elink_848x3_config_init()
11292 dev_info.port_hw_config[params->port].default_cfg)) & in elink_848x3_config_init()
11311 elink_eee_has_cap(params)) { in elink_848x3_config_init()
11312 rc = elink_eee_initial_config(params, vars, SHMEM_EEE_10G_ADV); in elink_848x3_config_init()
11315 elink_8483x_disable_eee(phy, params, vars); in elink_848x3_config_init()
11320 (params->eee_mode & ELINK_EEE_MODE_ADV_LPI) && in elink_848x3_config_init()
11321 (elink_eee_calc_timer(params) || in elink_848x3_config_init()
11322 !(params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI))) in elink_848x3_config_init()
11323 rc = elink_8483x_enable_eee(phy, params, vars); in elink_848x3_config_init()
11325 rc = elink_8483x_disable_eee(phy, params, vars); in elink_848x3_config_init()
11345 struct elink_params *params, in elink_848xx_read_status() argument
11348 struct bxe_softc *sc = params->sc; in elink_848xx_read_status()
11397 if (params->feature_config_flags & in elink_848xx_read_status()
11439 elink_ext_phy_resolve_fc(phy, params, vars); in elink_848xx_read_status()
11479 elink_eee_an_resolve(phy, params, vars); in elink_848xx_read_status()
11495 struct elink_params *params) in elink_8481_hw_reset() argument
11497 elink_cb_gpio_write(params->sc, MISC_REGISTERS_GPIO_1, in elink_8481_hw_reset()
11499 elink_cb_gpio_write(params->sc, MISC_REGISTERS_GPIO_1, in elink_8481_hw_reset()
11504 struct elink_params *params) in elink_8481_link_reset() argument
11506 elink_cl45_write(params->sc, phy, in elink_8481_link_reset()
11508 elink_cl45_write(params->sc, phy, in elink_8481_link_reset()
11513 struct elink_params *params) in elink_848x3_link_reset() argument
11515 struct bxe_softc *sc = params->sc; in elink_848x3_link_reset()
11522 port = params->port; in elink_848x3_link_reset()
11540 struct elink_params *params, uint8_t mode) in elink_848xx_set_link_led() argument
11542 struct bxe_softc *sc = params->sc; in elink_848xx_set_link_led()
11549 port = params->port; in elink_848xx_set_link_led()
11555 if ((params->hw_led_mode << SHARED_HW_CFG_LED_MODE_SHIFT) == in elink_848xx_set_link_led()
11591 if ((params->hw_led_mode << SHARED_HW_CFG_LED_MODE_SHIFT) == in elink_848xx_set_link_led()
11626 params->port*4) & in elink_848xx_set_link_led()
11628 params->link_flags |= in elink_848xx_set_link_led()
11634 params->port*4, in elink_848xx_set_link_led()
11648 if ((params->hw_led_mode << SHARED_HW_CFG_LED_MODE_SHIFT) == in elink_848xx_set_link_led()
11694 params->port*4) & in elink_848xx_set_link_led()
11696 params->link_flags |= in elink_848xx_set_link_led()
11702 params->port*4, in elink_848xx_set_link_led()
11717 if ((params->hw_led_mode << SHARED_HW_CFG_LED_MODE_SHIFT) == in elink_848xx_set_link_led()
11762 val = ((params->hw_led_mode << in elink_848xx_set_link_led()
11791 if (params->link_flags & in elink_848xx_set_link_led()
11793 elink_link_int_enable(params); in elink_848xx_set_link_led()
11794 params->link_flags &= in elink_848xx_set_link_led()
11815 struct elink_params *params, in elink_54618se_specific_func() argument
11818 struct bxe_softc *sc = params->sc; in elink_54618se_specific_func()
11844 struct elink_params *params, in elink_54618se_config_init() argument
11847 struct bxe_softc *sc = params->sc; in elink_54618se_config_init()
11858 port = params->port; in elink_54618se_config_init()
11860 cfg_pin = (REG_RD(sc, params->shmem_base + in elink_54618se_config_init()
11875 elink_wait_reset_complete(sc, phy, params); in elink_54618se_config_init()
11881 elink_54618se_specific_func(phy, params, ELINK_PHY_INIT); in elink_54618se_config_init()
11896 elink_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc); in elink_54618se_config_init()
11988 if ((phy->flags & ELINK_FLAGS_EEE) && elink_eee_has_cap(params)) { in elink_54618se_config_init()
11998 rc = elink_eee_initial_config(params, vars, SHMEM_EEE_1G_ADV); in elink_54618se_config_init()
12001 elink_eee_disable(phy, params, vars); in elink_54618se_config_init()
12002 } else if ((params->eee_mode & ELINK_EEE_MODE_ADV_LPI) && in elink_54618se_config_init()
12004 (elink_eee_calc_timer(params) || in elink_54618se_config_init()
12005 !(params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI))) { in elink_54618se_config_init()
12011 elink_eee_advertise(phy, params, vars, in elink_54618se_config_init()
12015 elink_eee_disable(phy, params, vars); in elink_54618se_config_init()
12023 if (params->feature_config_flags & in elink_54618se_config_init()
12051 struct elink_params *params, uint8_t mode) in elink_5461x_set_link_led() argument
12053 struct bxe_softc *sc = params->sc; in elink_5461x_set_link_led()
12087 struct elink_params *params) in elink_54618se_link_reset() argument
12089 struct bxe_softc *sc = params->sc; in elink_54618se_link_reset()
12100 port = params->port; in elink_54618se_link_reset()
12101 cfg_pin = (REG_RD(sc, params->shmem_base + in elink_54618se_link_reset()
12112 struct elink_params *params, in elink_54618se_read_status() argument
12115 struct bxe_softc *sc = params->sc; in elink_54618se_read_status()
12180 elink_ext_phy_resolve_fc(phy, params, vars); in elink_54618se_read_status()
12211 elink_eee_has_cap(params)) in elink_54618se_read_status()
12212 elink_eee_an_resolve(phy, params, vars); in elink_54618se_read_status()
12219 struct elink_params *params) in elink_54618se_config_loopback() argument
12221 struct bxe_softc *sc = params->sc; in elink_54618se_config_loopback()
12223 uint32_t umac_base = params->port ? GRCBASE_UMAC1 : GRCBASE_UMAC0; in elink_54618se_config_loopback()
12250 REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4, 1); in elink_54618se_config_loopback()
12262 struct elink_params *params) in elink_7101_config_loopback() argument
12264 struct bxe_softc *sc = params->sc; in elink_7101_config_loopback()
12271 struct elink_params *params, in elink_7101_config_init() argument
12275 struct bxe_softc *sc = params->sc; in elink_7101_config_init()
12280 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); in elink_7101_config_init()
12282 elink_ext_phy_hw_reset(sc, params->port); in elink_7101_config_init()
12283 elink_wait_reset_complete(sc, phy, params); in elink_7101_config_init()
12291 elink_ext_phy_set_pause(params, phy, vars); in elink_7101_config_init()
12305 elink_save_spirom_version(sc, params->port, in elink_7101_config_init()
12311 struct elink_params *params, in elink_7101_read_status() argument
12314 struct bxe_softc *sc = params->sc; in elink_7101_read_status()
12340 elink_ext_phy_resolve_fc(phy, params, vars); in elink_7101_read_status()
12389 struct elink_params *params) { in elink_7101_hw_reset() argument
12391 elink_cb_gpio_write(params->sc, MISC_REGISTERS_GPIO_2, in elink_7101_hw_reset()
12392 MISC_REGISTERS_GPIO_OUTPUT_LOW, params->port); in elink_7101_hw_reset()
12394 elink_cb_gpio_write(params->sc, MISC_REGISTERS_GPIO_1, in elink_7101_hw_reset()
12395 MISC_REGISTERS_GPIO_OUTPUT_LOW, params->port); in elink_7101_hw_reset()
12399 struct elink_params *params, uint8_t mode) in elink_7101_set_link_led() argument
12402 struct bxe_softc *sc = params->sc; in elink_7101_set_link_led()
13299 static void elink_phy_def_cfg(struct elink_params *params, in elink_phy_def_cfg() argument
13303 struct bxe_softc *sc = params->sc; in elink_phy_def_cfg()
13307 link_config = REG_RD(sc, params->shmem_base + in elink_phy_def_cfg()
13309 port_feature_config[params->port].link_config2)); in elink_phy_def_cfg()
13310 phy->speed_cap_mask = REG_RD(sc, params->shmem_base + in elink_phy_def_cfg()
13313 port_hw_config[params->port].speed_capability_mask2)); in elink_phy_def_cfg()
13315 link_config = REG_RD(sc, params->shmem_base + in elink_phy_def_cfg()
13317 port_feature_config[params->port].link_config)); in elink_phy_def_cfg()
13318 phy->speed_cap_mask = REG_RD(sc, params->shmem_base + in elink_phy_def_cfg()
13321 port_hw_config[params->port].speed_capability_mask)); in elink_phy_def_cfg()
13377 uint32_t elink_phy_selection(struct elink_params *params) in elink_phy_selection() argument
13382 phy_config_swapped = params->multi_phy_config & in elink_phy_selection()
13385 prio_cfg = params->multi_phy_config & in elink_phy_selection()
13409 elink_status_t elink_phy_probe(struct elink_params *params) in elink_phy_probe() argument
13413 struct bxe_softc *sc = params->sc; in elink_phy_probe()
13415 params->num_phys = 0; in elink_phy_probe()
13421 phy_config_swapped = params->multi_phy_config & in elink_phy_probe()
13436 phy = ¶ms->phy[actual_phy_idx]; in elink_phy_probe()
13437 if (elink_populate_phy(sc, phy_index, params->shmem_base, in elink_phy_probe()
13438 params->shmem2_base, params->port, in elink_phy_probe()
13440 params->num_phys = 0; in elink_phy_probe()
13452 if (params->feature_config_flags & in elink_phy_probe()
13456 if (!(params->feature_config_flags & in elink_phy_probe()
13460 sync_offset = params->shmem_base + in elink_phy_probe()
13462 dev_info.port_hw_config[params->port].media_type); in elink_phy_probe()
13479 elink_phy_def_cfg(params, phy, phy_index); in elink_phy_probe()
13480 params->num_phys++; in elink_phy_probe()
13483 ELINK_DEBUG_P1(sc, "End phy probe. #phys found %x\n", params->num_phys); in elink_phy_probe()
13488 static elink_status_t elink_init_e3_emul_mac(struct elink_params *params, in elink_init_e3_emul_mac() argument
13491 struct bxe_softc *sc = params->sc; in elink_init_e3_emul_mac()
13492 vars->line_speed = params->req_line_speed[0]; in elink_init_e3_emul_mac()
13494 if (params->req_line_speed[0] == ELINK_SPEED_AUTO_NEG) { in elink_init_e3_emul_mac()
13495 if (params->feature_config_flags & in elink_init_e3_emul_mac()
13504 if ((params->feature_config_flags & in elink_init_e3_emul_mac()
13507 " disabled!\n", params->req_line_speed[0]); in elink_init_e3_emul_mac()
13530 if (params->loopback_mode == ELINK_LOOPBACK_UMAC) in elink_init_e3_emul_mac()
13531 elink_umac_enable(params, vars, 1); in elink_init_e3_emul_mac()
13533 elink_umac_enable(params, vars, 0); in elink_init_e3_emul_mac()
13536 if (params->feature_config_flags & in elink_init_e3_emul_mac()
13539 " disabled!\n", params->req_line_speed[0]); in elink_init_e3_emul_mac()
13556 if (params->loopback_mode == ELINK_LOOPBACK_XMAC) in elink_init_e3_emul_mac()
13557 elink_xmac_enable(params, vars, 1); in elink_init_e3_emul_mac()
13559 elink_xmac_enable(params, vars, 0); in elink_init_e3_emul_mac()
13564 static elink_status_t elink_init_emul(struct elink_params *params, in elink_init_emul() argument
13567 struct bxe_softc *sc = params->sc; in elink_init_emul()
13569 if (elink_init_e3_emul_mac(params, vars) != in elink_init_emul()
13573 if (params->feature_config_flags & in elink_init_emul()
13578 if (params->loopback_mode == in elink_init_emul()
13580 elink_emac_enable(params, vars, 1); in elink_init_emul()
13582 elink_emac_enable(params, vars, 0); in elink_init_emul()
13587 if (params->loopback_mode == in elink_init_emul()
13589 elink_bmac_enable(params, vars, 1, 1); in elink_init_emul()
13591 elink_bmac_enable(params, vars, 0, 1); in elink_init_emul()
13599 elink_pbf_update(params, vars->flow_ctrl, in elink_init_emul()
13602 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_emul()
13605 elink_update_mng(params, vars->link_status); in elink_init_emul()
13610 static elink_status_t elink_init_fpga(struct elink_params *params, in elink_init_fpga() argument
13614 struct bxe_softc *sc = params->sc; in elink_init_fpga()
13624 vars->line_speed = params->req_line_speed[0]; in elink_init_fpga()
13642 params->req_line_speed[0]); in elink_init_fpga()
13646 if (params->loopback_mode == ELINK_LOOPBACK_UMAC) in elink_init_fpga()
13647 elink_umac_enable(params, vars, 1); in elink_init_fpga()
13649 elink_umac_enable(params, vars, 0); in elink_init_fpga()
13653 if (params->loopback_mode == ELINK_LOOPBACK_EMAC) in elink_init_fpga()
13654 elink_emac_enable(params, vars, 1); in elink_init_fpga()
13656 elink_emac_enable(params, vars, 0); in elink_init_fpga()
13661 elink_pbf_update(params, vars->flow_ctrl, in elink_init_fpga()
13664 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_fpga()
13667 elink_update_mng(params, vars->link_status); in elink_init_fpga()
13671 static void elink_init_bmac_loopback(struct elink_params *params, in elink_init_bmac_loopback() argument
13674 struct bxe_softc *sc = params->sc; in elink_init_bmac_loopback()
13683 elink_xgxs_deassert(params); in elink_init_bmac_loopback()
13686 elink_bmac_enable(params, vars, 1, 1); in elink_init_bmac_loopback()
13688 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_bmac_loopback()
13691 static void elink_init_emac_loopback(struct elink_params *params, in elink_init_emac_loopback() argument
13694 struct bxe_softc *sc = params->sc; in elink_init_emac_loopback()
13703 elink_xgxs_deassert(params); in elink_init_emac_loopback()
13705 elink_emac_enable(params, vars, 1); in elink_init_emac_loopback()
13706 elink_emac_program(params, vars); in elink_init_emac_loopback()
13707 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_emac_loopback()
13710 static void elink_init_xmac_loopback(struct elink_params *params, in elink_init_xmac_loopback() argument
13713 struct bxe_softc *sc = params->sc; in elink_init_xmac_loopback()
13715 if (!params->req_line_speed[0]) in elink_init_xmac_loopback()
13718 vars->line_speed = params->req_line_speed[0]; in elink_init_xmac_loopback()
13726 elink_set_aer_mmd(params, ¶ms->phy[0]); in elink_init_xmac_loopback()
13727 elink_warpcore_reset_lane(sc, ¶ms->phy[0], 0); in elink_init_xmac_loopback()
13728 params->phy[ELINK_INT_PHY].config_loopback( in elink_init_xmac_loopback()
13729 ¶ms->phy[ELINK_INT_PHY], in elink_init_xmac_loopback()
13730 params); in elink_init_xmac_loopback()
13732 elink_xmac_enable(params, vars, 1); in elink_init_xmac_loopback()
13733 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_xmac_loopback()
13736 static void elink_init_umac_loopback(struct elink_params *params, in elink_init_umac_loopback() argument
13739 struct bxe_softc *sc = params->sc; in elink_init_umac_loopback()
13746 elink_umac_enable(params, vars, 1); in elink_init_umac_loopback()
13748 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_umac_loopback()
13751 static void elink_init_xgxs_loopback(struct elink_params *params, in elink_init_xgxs_loopback() argument
13754 struct bxe_softc *sc = params->sc; in elink_init_xgxs_loopback()
13755 struct elink_phy *int_phy = ¶ms->phy[ELINK_INT_PHY]; in elink_init_xgxs_loopback()
13759 if (params->req_line_speed[0] == ELINK_SPEED_1000) in elink_init_xgxs_loopback()
13761 else if ((params->req_line_speed[0] == ELINK_SPEED_20000) || in elink_init_xgxs_loopback()
13768 elink_xgxs_deassert(params); in elink_init_xgxs_loopback()
13769 elink_link_initialize(params, vars); in elink_init_xgxs_loopback()
13771 if (params->req_line_speed[0] == ELINK_SPEED_1000) { in elink_init_xgxs_loopback()
13773 elink_umac_enable(params, vars, 0); in elink_init_xgxs_loopback()
13775 elink_emac_program(params, vars); in elink_init_xgxs_loopback()
13776 elink_emac_enable(params, vars, 0); in elink_init_xgxs_loopback()
13780 elink_xmac_enable(params, vars, 0); in elink_init_xgxs_loopback()
13782 elink_bmac_enable(params, vars, 0, 1); in elink_init_xgxs_loopback()
13785 if (params->loopback_mode == ELINK_LOOPBACK_XGXS) { in elink_init_xgxs_loopback()
13787 int_phy->config_loopback(int_phy, params); in elink_init_xgxs_loopback()
13792 phy_index < params->num_phys; phy_index++) in elink_init_xgxs_loopback()
13793 if (params->phy[phy_index].config_loopback) in elink_init_xgxs_loopback()
13794 params->phy[phy_index].config_loopback( in elink_init_xgxs_loopback()
13795 ¶ms->phy[phy_index], in elink_init_xgxs_loopback()
13796 params); in elink_init_xgxs_loopback()
13798 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_xgxs_loopback()
13800 elink_set_led(params, vars, ELINK_LED_MODE_OPER, vars->line_speed); in elink_init_xgxs_loopback()
13803 void elink_set_rx_filter(struct elink_params *params, uint8_t en) in elink_set_rx_filter() argument
13805 struct bxe_softc *sc = params->sc; in elink_set_rx_filter()
13811 REG_WR(sc, NIG_REG_LLH0_BRB1_DRV_MASK + params->port*4, val); in elink_set_rx_filter()
13814 REG_WR(sc, NIG_REG_LLH0_BRB1_DRV_MASK_MF + params->port*4, in elink_set_rx_filter()
13818 REG_WR(sc, (params->port ? NIG_REG_LLH1_BRB1_NOT_MCP : in elink_set_rx_filter()
13821 static elink_status_t elink_avoid_link_flap(struct elink_params *params, in elink_avoid_link_flap() argument
13826 struct bxe_softc *sc = params->sc; in elink_avoid_link_flap()
13828 elink_set_mdio_emac_per_phy(sc, params); in elink_avoid_link_flap()
13830 elink_link_status_update(params, vars); in elink_avoid_link_flap()
13837 for (phy_idx = ELINK_INT_PHY; phy_idx < params->num_phys; phy_idx++) { in elink_avoid_link_flap()
13838 struct elink_phy *phy = ¶ms->phy[phy_idx]; in elink_avoid_link_flap()
13841 phy->phy_specific_func(phy, params, ELINK_PHY_INIT); in elink_avoid_link_flap()
13846 elink_verify_sfp_module(phy, params); in elink_avoid_link_flap()
13848 lfa_sts = REG_RD(sc, params->lfa_base + in elink_avoid_link_flap()
13860 params->port)); in elink_avoid_link_flap()
13864 params->port)); in elink_avoid_link_flap()
13867 elink_umac_enable(params, vars, 0); in elink_avoid_link_flap()
13869 elink_xmac_enable(params, vars, 0); in elink_avoid_link_flap()
13872 elink_emac_enable(params, vars, 0); in elink_avoid_link_flap()
13874 elink_bmac_enable(params, vars, 0, !dont_clear_stat); in elink_avoid_link_flap()
13885 REG_WR(sc, params->lfa_base + in elink_avoid_link_flap()
13889 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_avoid_link_flap()
13892 elink_link_int_enable(params); in elink_avoid_link_flap()
13896 static void elink_cannot_avoid_link_flap(struct elink_params *params, in elink_cannot_avoid_link_flap() argument
13901 struct bxe_softc *sc = params->sc; in elink_cannot_avoid_link_flap()
13903 elink_link_reset(params, vars, 1); in elink_cannot_avoid_link_flap()
13905 if (!params->lfa_base) in elink_cannot_avoid_link_flap()
13908 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13910 params->req_duplex[0] | (params->req_duplex[1] << 16)); in elink_cannot_avoid_link_flap()
13912 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13914 params->req_flow_ctrl[0] | (params->req_flow_ctrl[1] << 16)); in elink_cannot_avoid_link_flap()
13916 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13918 params->req_line_speed[0] | (params->req_line_speed[1] << 16)); in elink_cannot_avoid_link_flap()
13921 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13924 params->speed_cap_mask[cfg_idx]); in elink_cannot_avoid_link_flap()
13927 tmp_val = REG_RD(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13930 tmp_val |= params->req_fc_auto_adv; in elink_cannot_avoid_link_flap()
13932 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13935 lfa_sts = REG_RD(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13951 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13956 elink_status_t elink_phy_init(struct elink_params *params, struct elink_vars *vars) in elink_phy_init() argument
13959 struct bxe_softc *sc = params->sc; in elink_phy_init()
13962 params->req_line_speed[0], params->req_flow_ctrl[0]); in elink_phy_init()
13964 params->req_line_speed[1], params->req_flow_ctrl[1]); in elink_phy_init()
13965 ELINK_DEBUG_P1(sc, "req_adv_flow_ctrl 0x%x\n", params->req_fc_auto_adv); in elink_phy_init()
13975 params->link_flags = ELINK_PHY_INITIALIZED; in elink_phy_init()
13977 elink_set_rx_filter(params, 1); in elink_phy_init()
13978 elink_chng_link_count(params, 1); in elink_phy_init()
13980 lfa_status = elink_check_lfa(params); in elink_phy_init()
13983 params->port, params->loopback_mode, params->req_duplex[0]); in elink_phy_init()
13985 params->switch_cfg, params->lane_config, params->req_duplex[1]); in elink_phy_init()
13987 params->chip_id, params->feature_config_flags, params->num_phys); in elink_phy_init()
13989 params->rsrv, params->eee_mode, params->hw_led_mode); in elink_phy_init()
13991 params->multi_phy_config, params->req_fc_auto_adv, params->link_flags); in elink_phy_init()
13993 params->lfa_base, params->link_attr_sync); in elink_phy_init()
13996 return elink_avoid_link_flap(params, vars); in elink_phy_init()
14001 elink_cannot_avoid_link_flap(params, vars, lfa_status); in elink_phy_init()
14004 elink_bits_dis(sc, NIG_REG_MASK_INTERRUPT_PORT0 + params->port*4, in elink_phy_init()
14010 if (!(params->feature_config_flags & in elink_phy_init()
14014 elink_emac_init(params, vars); in elink_phy_init()
14016 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_phy_init()
14019 if ((params->num_phys == 0) && in elink_phy_init()
14024 set_phy_vars(params, vars); in elink_phy_init()
14026 ELINK_DEBUG_P1(sc, "Num of phys on board: %d\n", params->num_phys); in elink_phy_init()
14029 return elink_init_fpga(params, vars); in elink_phy_init()
14034 return elink_init_emul(params, vars); in elink_phy_init()
14037 switch (params->loopback_mode) { in elink_phy_init()
14039 elink_init_bmac_loopback(params, vars); in elink_phy_init()
14042 elink_init_emac_loopback(params, vars); in elink_phy_init()
14045 elink_init_xmac_loopback(params, vars); in elink_phy_init()
14048 elink_init_umac_loopback(params, vars); in elink_phy_init()
14052 elink_init_xgxs_loopback(params, vars); in elink_phy_init()
14056 if (params->switch_cfg == ELINK_SWITCH_CFG_10G) in elink_phy_init()
14057 elink_xgxs_deassert(params); in elink_phy_init()
14059 elink_serdes_deassert(sc, params->port); in elink_phy_init()
14061 elink_link_initialize(params, vars); in elink_phy_init()
14063 elink_link_int_enable(params); in elink_phy_init()
14066 elink_update_mng(params, vars->link_status); in elink_phy_init()
14068 elink_update_mng_eee(params, vars->eee_status); in elink_phy_init()
14072 elink_status_t elink_link_reset(struct elink_params *params, struct elink_vars *vars, in elink_link_reset() argument
14075 struct bxe_softc *sc = params->sc; in elink_link_reset()
14076 uint8_t phy_index, port = params->port, clear_latch_ind = 0; in elink_link_reset()
14080 elink_chng_link_count(params, 1); in elink_link_reset()
14081 elink_update_mng(params, vars->link_status); in elink_link_reset()
14084 elink_update_mng_eee(params, vars->eee_status); in elink_link_reset()
14102 if (!(params->feature_config_flags & in elink_link_reset()
14106 elink_set_bmac_rx(sc, params->chip_id, port, 0); in elink_link_reset()
14109 if (!(params->feature_config_flags & in elink_link_reset()
14114 elink_set_xmac_rxtx(params, 0); in elink_link_reset()
14115 elink_set_umac_rxtx(params, 0); in elink_link_reset()
14126 elink_set_mdio_emac_per_phy(sc, params); in elink_link_reset()
14127 elink_set_led(params, vars, ELINK_LED_MODE_OFF, 0); in elink_link_reset()
14130 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_link_reset()
14132 if (params->phy[phy_index].link_reset) { in elink_link_reset()
14133 elink_set_aer_mmd(params, in elink_link_reset()
14134 ¶ms->phy[phy_index]); in elink_link_reset()
14135 params->phy[phy_index].link_reset( in elink_link_reset()
14136 ¶ms->phy[phy_index], in elink_link_reset()
14137 params); in elink_link_reset()
14139 if (params->phy[phy_index].flags & in elink_link_reset()
14154 if (params->phy[ELINK_INT_PHY].link_reset) in elink_link_reset()
14155 params->phy[ELINK_INT_PHY].link_reset( in elink_link_reset()
14156 ¶ms->phy[ELINK_INT_PHY], params); in elink_link_reset()
14166 uint32_t xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; in elink_link_reset()
14167 elink_set_xumac_nig(params, 0, 0); in elink_link_reset()
14177 elink_status_t elink_lfa_reset(struct elink_params *params, in elink_lfa_reset() argument
14180 struct bxe_softc *sc = params->sc; in elink_lfa_reset()
14183 params->link_flags &= ~ELINK_PHY_INITIALIZED; in elink_lfa_reset()
14184 if (!params->lfa_base) in elink_lfa_reset()
14185 return elink_link_reset(params, vars, 1); in elink_lfa_reset()
14190 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 1); in elink_lfa_reset()
14197 elink_set_bmac_rx(sc, params->chip_id, params->port, 0); in elink_lfa_reset()
14200 elink_set_xmac_rxtx(params, 0); in elink_lfa_reset()
14201 elink_set_umac_rxtx(params, 0); in elink_lfa_reset()
14209 elink_set_rx_filter(params, 0); in elink_lfa_reset()
14218 elink_set_bmac_rx(sc, params->chip_id, params->port, 1); in elink_lfa_reset()
14221 elink_set_xmac_rxtx(params, 1); in elink_lfa_reset()
14222 elink_set_umac_rxtx(params, 1); in elink_lfa_reset()
14225 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_lfa_reset()
14668 static void elink_check_over_curr(struct elink_params *params, in elink_check_over_curr() argument
14671 struct bxe_softc *sc = params->sc; in elink_check_over_curr()
14673 uint8_t port = params->port; in elink_check_over_curr()
14676 cfg_pin = (REG_RD(sc, params->shmem_base + in elink_check_over_curr()
14688 …elink_cb_event_log(sc, ELINK_LOG_ID_OVER_CURRENT, params->port); //"Error: Power fault on Port %d… in elink_check_over_curr()
14696 elink_warpcore_power_module(params, 0); in elink_check_over_curr()
14703 static uint8_t elink_analyze_link_error(struct elink_params *params, in elink_analyze_link_error() argument
14707 struct bxe_softc *sc = params->sc; in elink_analyze_link_error()
14743 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 1); in elink_analyze_link_error()
14756 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_analyze_link_error()
14758 elink_sync_link(params, vars); in elink_analyze_link_error()
14760 elink_set_led(params, vars, led_mode, ELINK_SPEED_10000); in elink_analyze_link_error()
14763 elink_update_mng(params, vars->link_status); in elink_analyze_link_error()
14783 elink_status_t elink_check_half_open_conn(struct elink_params *params, in elink_check_half_open_conn() argument
14787 struct bxe_softc *sc = params->sc; in elink_check_half_open_conn()
14792 (REG_RD(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4))) in elink_check_half_open_conn()
14803 mac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; in elink_check_half_open_conn()
14813 elink_analyze_link_error(params, vars, lss_status, in elink_check_half_open_conn()
14817 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port)) { in elink_check_half_open_conn()
14821 mac_base = params->port ? NIG_REG_INGRESS_BMAC1_MEM : in elink_check_half_open_conn()
14832 elink_analyze_link_error(params, vars, lss_status, in elink_check_half_open_conn()
14839 struct elink_params *params, in elink_sfp_tx_fault_detection() argument
14842 struct bxe_softc *sc = params->sc; in elink_sfp_tx_fault_detection()
14844 uint8_t led_change, port = params->port; in elink_sfp_tx_fault_detection()
14847 cfg_pin = (REG_RD(sc, params->shmem_base + offsetof(struct shmem_region, in elink_sfp_tx_fault_detection()
14857 led_change = elink_analyze_link_error(params, vars, value, in elink_sfp_tx_fault_detection()
14877 elink_set_e3_module_fault_led(params, led_mode); in elink_sfp_tx_fault_detection()
14881 static void elink_kr2_recovery(struct elink_params *params, in elink_kr2_recovery() argument
14885 struct bxe_softc *sc = params->sc; in elink_kr2_recovery()
14887 elink_warpcore_enable_AN_KR2(phy, params, vars); in elink_kr2_recovery()
14888 elink_warpcore_restart_AN_KR(phy, params); in elink_kr2_recovery()
14891 static void elink_check_kr2_wa(struct elink_params *params, in elink_check_kr2_wa() argument
14895 struct bxe_softc *sc = params->sc; in elink_check_kr2_wa()
14909 sigdet = elink_warpcore_get_sigdet(phy, params); in elink_check_kr2_wa()
14911 if (!(params->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { in elink_check_kr2_wa()
14912 elink_kr2_recovery(params, vars, phy); in elink_check_kr2_wa()
14918 lane = elink_get_warpcore_lane(phy, params); in elink_check_kr2_wa()
14925 elink_set_aer_mmd(params, phy); in elink_check_kr2_wa()
14929 if (!(params->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { in elink_check_kr2_wa()
14930 elink_kr2_recovery(params, vars, phy); in elink_check_kr2_wa()
14945 if (!(params->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { in elink_check_kr2_wa()
14949 elink_kr2_recovery(params, vars, phy); in elink_check_kr2_wa()
14957 elink_disable_kr2(params, vars, phy); in elink_check_kr2_wa()
14959 elink_warpcore_restart_AN_KR(phy, params); in elink_check_kr2_wa()
14964 void elink_period_func(struct elink_params *params, struct elink_vars *vars) in elink_period_func() argument
14967 struct bxe_softc *sc = params->sc; in elink_period_func()
14969 if (params->phy[phy_idx].flags & ELINK_FLAGS_TX_ERROR_CHECK) { in elink_period_func()
14970 elink_set_aer_mmd(params, ¶ms->phy[phy_idx]); in elink_period_func()
14971 if (elink_check_half_open_conn(params, vars, 1) != in elink_period_func()
14979 struct elink_phy *phy = ¶ms->phy[ELINK_INT_PHY]; in elink_period_func()
14980 elink_set_aer_mmd(params, phy); in elink_period_func()
14985 elink_check_kr2_wa(params, vars, phy); in elink_period_func()
14986 elink_check_over_curr(params, vars); in elink_period_func()
14988 elink_warpcore_config_runtime(phy, params, vars); in elink_period_func()
14990 if ((REG_RD(sc, params->shmem_base + in elink_period_func()
14992 port_hw_config[params->port].default_cfg)) in elink_period_func()
14995 if (elink_is_sfp_module_plugged(phy, params)) { in elink_period_func()
14996 elink_sfp_tx_fault_detection(phy, params, vars); in elink_period_func()
15003 elink_update_mng(params, vars->link_status); in elink_period_func()
15030 void elink_hw_reset_phy(struct elink_params *params) in elink_hw_reset_phy() argument
15033 struct bxe_softc *sc = params->sc; in elink_hw_reset_phy()
15034 elink_update_mng(params, 0); in elink_hw_reset_phy()
15035 elink_bits_dis(sc, NIG_REG_MASK_INTERRUPT_PORT0 + params->port*4, in elink_hw_reset_phy()
15043 if (params->phy[phy_index].hw_reset) { in elink_hw_reset_phy()
15044 params->phy[phy_index].hw_reset( in elink_hw_reset_phy()
15045 ¶ms->phy[phy_index], in elink_hw_reset_phy()
15046 params); in elink_hw_reset_phy()
15047 params->phy[phy_index] = phy_null; in elink_hw_reset_phy()