Lines Matching refs:params

758 					     struct elink_params *params,
946 static elink_status_t elink_check_half_open_conn(struct elink_params *params,
949 struct elink_params *params);
977 static int elink_check_lfa(struct elink_params *params) in elink_check_lfa() argument
982 struct bxe_softc *sc = params->sc; in elink_check_lfa()
985 REG_RD(sc, params->lfa_base + in elink_check_lfa()
993 REG_WR(sc, params->lfa_base + in elink_check_lfa()
1000 link_status = REG_RD(sc, params->shmem_base + in elink_check_lfa()
1002 port_mb[params->port].link_status)); in elink_check_lfa()
1009 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_BOOT_FROM_SAN) in elink_check_lfa()
1013 if (params->loopback_mode) in elink_check_lfa()
1017 if (!params->lfa_base) in elink_check_lfa()
1020 if (params->num_phys == 3) { in elink_check_lfa()
1029 saved_val = REG_RD(sc, params->lfa_base + in elink_check_lfa()
1031 req_val = params->req_duplex[0] | (params->req_duplex[1] << 16); in elink_check_lfa()
1038 saved_val = REG_RD(sc, params->lfa_base + in elink_check_lfa()
1040 req_val = params->req_flow_ctrl[0] | (params->req_flow_ctrl[1] << 16); in elink_check_lfa()
1047 saved_val = REG_RD(sc, params->lfa_base + in elink_check_lfa()
1049 req_val = params->req_line_speed[0] | (params->req_line_speed[1] << 16); in elink_check_lfa()
1057 cur_speed_cap_mask = REG_RD(sc, params->lfa_base + in elink_check_lfa()
1061 if (cur_speed_cap_mask != params->speed_cap_mask[cfg_idx]) { in elink_check_lfa()
1064 params->speed_cap_mask[cfg_idx]); in elink_check_lfa()
1070 REG_RD(sc, params->lfa_base + in elink_check_lfa()
1074 if ((uint16_t)cur_req_fc_auto_adv != params->req_fc_auto_adv) { in elink_check_lfa()
1076 cur_req_fc_auto_adv, params->req_fc_auto_adv); in elink_check_lfa()
1080 eee_status = REG_RD(sc, params->shmem2_base + in elink_check_lfa()
1082 eee_status[params->port])); in elink_check_lfa()
1085 (params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI)) || in elink_check_lfa()
1087 (params->eee_mode & ELINK_EEE_MODE_ADV_LPI))) { in elink_check_lfa()
1088 ELINK_DEBUG_P2(sc, "EEE mismatch %x vs. %x\n", params->eee_mode, in elink_check_lfa()
1171 static void elink_ets_e2e3a0_disabled(struct elink_params *params) in elink_ets_e2e3a0_disabled() argument
1174 struct bxe_softc *sc = params->sc; in elink_ets_e2e3a0_disabled()
1262 const struct elink_params *params, in elink_ets_e3b0_set_credit_upper_bound_nig() argument
1265 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_set_credit_upper_bound_nig()
1266 const uint8_t port = params->port; in elink_ets_e3b0_set_credit_upper_bound_nig()
1300 static void elink_ets_e3b0_nig_disabled(const struct elink_params *params, in elink_ets_e3b0_nig_disabled() argument
1303 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_nig_disabled()
1304 const uint8_t port = params->port; in elink_ets_e3b0_nig_disabled()
1376 elink_ets_e3b0_set_credit_upper_bound_nig(params, min_w_val); in elink_ets_e3b0_nig_disabled()
1384 const struct elink_params *params, in elink_ets_e3b0_set_credit_upper_bound_pbf() argument
1387 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_set_credit_upper_bound_pbf()
1390 const uint8_t port = params->port; in elink_ets_e3b0_set_credit_upper_bound_pbf()
1417 static void elink_ets_e3b0_pbf_disabled(const struct elink_params *params) in elink_ets_e3b0_pbf_disabled() argument
1419 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_pbf_disabled()
1420 const uint8_t port = params->port; in elink_ets_e3b0_pbf_disabled()
1468 elink_ets_e3b0_set_credit_upper_bound_pbf(params, min_w_val_pbf); in elink_ets_e3b0_pbf_disabled()
1475 static elink_status_t elink_ets_e3b0_disabled(const struct elink_params *params, in elink_ets_e3b0_disabled() argument
1478 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_disabled()
1486 elink_ets_e3b0_nig_disabled(params, vars); in elink_ets_e3b0_disabled()
1488 elink_ets_e3b0_pbf_disabled(params); in elink_ets_e3b0_disabled()
1498 elink_status_t elink_ets_disabled(struct elink_params *params, in elink_ets_disabled() argument
1501 struct bxe_softc *sc = params->sc; in elink_ets_disabled()
1505 elink_ets_e2e3a0_disabled(params); in elink_ets_disabled()
1507 elink_status = elink_ets_e3b0_disabled(params, vars); in elink_ets_disabled()
1521 static elink_status_t elink_ets_e3b0_cli_map(const struct elink_params *params, in elink_ets_e3b0_cli_map() argument
1526 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_cli_map()
1527 const uint8_t port = params->port; in elink_ets_e3b0_cli_map()
1628 const struct elink_params *params, in elink_ets_e3b0_get_total_bw() argument
1632 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_get_total_bw()
1641 if (!ets_params->cos[cos_idx].params.bw_params.bw) { in elink_ets_e3b0_get_total_bw()
1647 ets_params->cos[cos_idx].params.bw_params.bw in elink_ets_e3b0_get_total_bw()
1651 ets_params->cos[cos_idx].params.bw_params.bw; in elink_ets_e3b0_get_total_bw()
1688 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
1692 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_sp_pri_to_cos_set()
1693 const uint8_t port = params->port; in elink_ets_e3b0_sp_pri_to_cos_set()
1770 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
1773 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_sp_set_pri_cli_reg()
1775 const uint8_t port = params->port; in elink_ets_e3b0_sp_set_pri_cli_reg()
1863 elink_status_t elink_ets_e3b0_config(const struct elink_params *params, in elink_ets_e3b0_config() argument
1867 struct bxe_softc *sc = params->sc; in elink_ets_e3b0_config()
1869 const uint8_t port = params->port; in elink_ets_e3b0_config()
1896 elink_status = elink_ets_e3b0_get_total_bw(params, ets_params, in elink_ets_e3b0_config()
1907 elink_ets_e3b0_set_credit_upper_bound_nig(params, min_w_val_nig); in elink_ets_e3b0_config()
1908 elink_ets_e3b0_set_credit_upper_bound_pbf(params, min_w_val_pbf); in elink_ets_e3b0_config()
1920 ets_params->cos[cos_entry].params.bw_params.bw, in elink_ets_e3b0_config()
1927 params, in elink_ets_e3b0_config()
1929 ets_params->cos[cos_entry].params.sp_params.pri, in elink_ets_e3b0_config()
1945 elink_status = elink_ets_e3b0_sp_set_pri_cli_reg(params, in elink_ets_e3b0_config()
1955 elink_status = elink_ets_e3b0_cli_map(params, ets_params, in elink_ets_e3b0_config()
1965 static void elink_ets_bw_limit_common(const struct elink_params *params) in elink_ets_bw_limit_common() argument
1968 struct bxe_softc *sc = params->sc; in elink_ets_bw_limit_common()
2009 void elink_ets_bw_limit(const struct elink_params *params, const uint32_t cos0_bw, in elink_ets_bw_limit() argument
2013 struct bxe_softc *sc = params->sc; in elink_ets_bw_limit()
2032 elink_ets_bw_limit_common(params); in elink_ets_bw_limit()
2041 elink_status_t elink_ets_strict(const struct elink_params *params, const uint8_t strict_cos) in elink_ets_strict() argument
2044 struct bxe_softc *sc = params->sc; in elink_ets_strict()
2084 static void elink_update_pfc_xmac(struct elink_params *params, in elink_update_pfc_xmac() argument
2088 struct bxe_softc *sc = params->sc; in elink_update_pfc_xmac()
2093 xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; in elink_update_pfc_xmac()
2101 if (!(params->feature_config_flags & in elink_update_pfc_xmac()
2134 ((params->mac_addr[2] << 24) | in elink_update_pfc_xmac()
2135 (params->mac_addr[3] << 16) | in elink_update_pfc_xmac()
2136 (params->mac_addr[4] << 8) | in elink_update_pfc_xmac()
2137 (params->mac_addr[5]))); in elink_update_pfc_xmac()
2139 ((params->mac_addr[0] << 8) | in elink_update_pfc_xmac()
2140 (params->mac_addr[1]))); in elink_update_pfc_xmac()
2145 static void elink_emac_get_pfc_stat(struct elink_params *params, in elink_emac_get_pfc_stat() argument
2150 struct bxe_softc *sc = params->sc; in elink_emac_get_pfc_stat()
2151 uint32_t emac_base = params->port ? GRCBASE_EMAC1 : GRCBASE_EMAC0; in elink_emac_get_pfc_stat()
2177 void elink_pfc_statistic(struct elink_params *params, struct elink_vars *vars, in elink_pfc_statistic() argument
2182 struct bxe_softc *sc = params->sc; in elink_pfc_statistic()
2191 elink_emac_get_pfc_stat(params, pfc_frames_sent, in elink_pfc_statistic()
2242 struct elink_params *params) in elink_set_mdio_emac_per_phy() argument
2247 for (phy_index = ELINK_INT_PHY; phy_index < params->num_phys; in elink_set_mdio_emac_per_phy()
2249 elink_set_mdio_clk(sc, params->chip_id, in elink_set_mdio_emac_per_phy()
2250 params->phy[phy_index].mdio_ctrl); in elink_set_mdio_emac_per_phy()
2253 static void elink_emac_init(struct elink_params *params, in elink_emac_init() argument
2257 struct bxe_softc *sc = params->sc; in elink_emac_init()
2258 uint8_t port = params->port; in elink_emac_init()
2285 elink_set_mdio_emac_per_phy(sc, params); in elink_emac_init()
2287 val = ((params->mac_addr[0] << 8) | in elink_emac_init()
2288 params->mac_addr[1]); in elink_emac_init()
2291 val = ((params->mac_addr[2] << 24) | in elink_emac_init()
2292 (params->mac_addr[3] << 16) | in elink_emac_init()
2293 (params->mac_addr[4] << 8) | in elink_emac_init()
2294 params->mac_addr[5]); in elink_emac_init()
2298 static void elink_set_xumac_nig(struct elink_params *params, in elink_set_xumac_nig() argument
2302 struct bxe_softc *sc = params->sc; in elink_set_xumac_nig()
2304 REG_WR(sc, params->port ? NIG_REG_P1_MAC_IN_EN : NIG_REG_P0_MAC_IN_EN, in elink_set_xumac_nig()
2306 REG_WR(sc, params->port ? NIG_REG_P1_MAC_OUT_EN : NIG_REG_P0_MAC_OUT_EN, in elink_set_xumac_nig()
2308 REG_WR(sc, params->port ? NIG_REG_P1_MAC_PAUSE_OUT_EN : in elink_set_xumac_nig()
2312 static void elink_set_umac_rxtx(struct elink_params *params, uint8_t en) in elink_set_umac_rxtx() argument
2314 uint32_t umac_base = params->port ? GRCBASE_UMAC1 : GRCBASE_UMAC0; in elink_set_umac_rxtx()
2316 struct bxe_softc *sc = params->sc; in elink_set_umac_rxtx()
2318 (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port))) in elink_set_umac_rxtx()
2331 static void elink_umac_enable(struct elink_params *params, in elink_umac_enable() argument
2335 uint32_t umac_base = params->port ? GRCBASE_UMAC1 : GRCBASE_UMAC0; in elink_umac_enable()
2336 struct bxe_softc *sc = params->sc; in elink_umac_enable()
2339 (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port)); in elink_umac_enable()
2343 (MISC_REGISTERS_RESET_REG_2_UMAC0 << params->port)); in elink_umac_enable()
2348 REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4, 1); in elink_umac_enable()
2396 ((params->mac_addr[2] << 24) | in elink_umac_enable()
2397 (params->mac_addr[3] << 16) | in elink_umac_enable()
2398 (params->mac_addr[4] << 8) | in elink_umac_enable()
2399 (params->mac_addr[5]))); in elink_umac_enable()
2401 ((params->mac_addr[0] << 8) | in elink_umac_enable()
2402 (params->mac_addr[1]))); in elink_umac_enable()
2423 elink_set_xumac_nig(params, in elink_umac_enable()
2430 static void elink_xmac_init(struct elink_params *params, uint32_t max_speed) in elink_xmac_init() argument
2432 struct bxe_softc *sc = params->sc; in elink_xmac_init()
2492 static void elink_set_xmac_rxtx(struct elink_params *params, uint8_t en) in elink_set_xmac_rxtx() argument
2494 uint8_t port = params->port; in elink_set_xmac_rxtx()
2495 struct bxe_softc *sc = params->sc; in elink_set_xmac_rxtx()
2520 static elink_status_t elink_xmac_enable(struct elink_params *params, in elink_xmac_enable() argument
2524 struct bxe_softc *sc = params->sc; in elink_xmac_enable()
2527 xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; in elink_xmac_enable()
2529 elink_xmac_init(params, vars->line_speed); in elink_xmac_enable()
2538 REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4, 0); in elink_xmac_enable()
2543 if (!(params->phy[ELINK_INT_PHY].flags & ELINK_FLAGS_TX_ERROR_CHECK)) { in elink_xmac_enable()
2559 elink_update_pfc_xmac(params, vars, 0); in elink_xmac_enable()
2574 (params->phy[ELINK_INT_PHY].supported & in elink_xmac_enable()
2582 elink_set_xumac_nig(params, in elink_xmac_enable()
2590 static elink_status_t elink_emac_enable(struct elink_params *params, in elink_emac_enable() argument
2593 struct bxe_softc *sc = params->sc; in elink_emac_enable()
2594 uint8_t port = params->port; in elink_emac_enable()
2628 uint32_t ser_lane = ((params->lane_config & in elink_emac_enable()
2663 if (!(params->feature_config_flags & in elink_emac_enable()
2694 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) { in elink_emac_enable()
2738 if ((params->feature_config_flags & in elink_emac_enable()
2762 static void elink_update_pfc_bmac1(struct elink_params *params, in elink_update_pfc_bmac1() argument
2766 struct bxe_softc *sc = params->sc; in elink_update_pfc_bmac1()
2767 uint32_t bmac_addr = params->port ? NIG_REG_INGRESS_BMAC1_MEM : in elink_update_pfc_bmac1()
2771 if ((!(params->feature_config_flags & in elink_update_pfc_bmac1()
2782 if (!(params->feature_config_flags & in elink_update_pfc_bmac1()
2791 static void elink_update_pfc_bmac2(struct elink_params *params, in elink_update_pfc_bmac2() argument
2799 struct bxe_softc *sc = params->sc; in elink_update_pfc_bmac2()
2800 uint32_t bmac_addr = params->port ? NIG_REG_INGRESS_BMAC1_MEM : in elink_update_pfc_bmac2()
2804 if ((!(params->feature_config_flags & in elink_update_pfc_bmac2()
2816 if (!(params->feature_config_flags & in elink_update_pfc_bmac2()
2824 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) { in elink_update_pfc_bmac2()
2853 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_update_pfc_bmac2()
2868 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_update_pfc_bmac2()
2924 static void elink_update_mng(struct elink_params *params, uint32_t link_status) in elink_update_mng() argument
2926 struct bxe_softc *sc = params->sc; in elink_update_mng()
2928 REG_WR(sc, params->shmem_base + in elink_update_mng()
2930 port_mb[params->port].link_status), link_status); in elink_update_mng()
2933 static void elink_update_pfc_nig(struct elink_params *params, in elink_update_pfc_nig() argument
2940 struct bxe_softc *sc = params->sc; in elink_update_pfc_nig()
2941 uint8_t port = params->port; in elink_update_pfc_nig()
2943 int set_pfc = params->feature_config_flags & in elink_update_pfc_nig()
3029 elink_status_t elink_update_pfc(struct elink_params *params, in elink_update_pfc() argument
3038 struct bxe_softc *sc = params->sc; in elink_update_pfc()
3039 uint8_t bmac_loopback = (params->loopback_mode == ELINK_LOOPBACK_BMAC); in elink_update_pfc()
3041 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_update_pfc()
3046 elink_update_mng(params, vars->link_status); in elink_update_pfc()
3049 elink_update_pfc_nig(params, vars, pfc_params); in elink_update_pfc()
3058 elink_update_pfc_xmac(params, vars, 0); in elink_update_pfc()
3062 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port)) in elink_update_pfc()
3065 elink_emac_enable(params, vars, 0); in elink_update_pfc()
3069 elink_update_pfc_bmac2(params, vars, bmac_loopback); in elink_update_pfc()
3071 elink_update_pfc_bmac1(params, vars); in elink_update_pfc()
3074 if ((params->feature_config_flags & in elink_update_pfc()
3078 REG_WR(sc, NIG_REG_BMAC0_PAUSE_OUT_EN + params->port*4, val); in elink_update_pfc()
3083 static elink_status_t elink_bmac1_enable(struct elink_params *params, in elink_bmac1_enable() argument
3087 struct bxe_softc *sc = params->sc; in elink_bmac1_enable()
3088 uint8_t port = params->port; in elink_bmac1_enable()
3103 wb_data[0] = ((params->mac_addr[2] << 24) | in elink_bmac1_enable()
3104 (params->mac_addr[3] << 16) | in elink_bmac1_enable()
3105 (params->mac_addr[4] << 8) | in elink_bmac1_enable()
3106 params->mac_addr[5]); in elink_bmac1_enable()
3107 wb_data[1] = ((params->mac_addr[0] << 8) | in elink_bmac1_enable()
3108 params->mac_addr[1]); in elink_bmac1_enable()
3126 elink_update_pfc_bmac1(params, vars); in elink_bmac1_enable()
3156 static elink_status_t elink_bmac2_enable(struct elink_params *params, in elink_bmac2_enable() argument
3160 struct bxe_softc *sc = params->sc; in elink_bmac2_enable()
3161 uint8_t port = params->port; in elink_bmac2_enable()
3182 wb_data[0] = ((params->mac_addr[2] << 24) | in elink_bmac2_enable()
3183 (params->mac_addr[3] << 16) | in elink_bmac2_enable()
3184 (params->mac_addr[4] << 8) | in elink_bmac2_enable()
3185 params->mac_addr[5]); in elink_bmac2_enable()
3186 wb_data[1] = ((params->mac_addr[0] << 8) | in elink_bmac2_enable()
3187 params->mac_addr[1]); in elink_bmac2_enable()
3216 elink_update_pfc_bmac2(params, vars, is_lb); in elink_bmac2_enable()
3221 static elink_status_t elink_bmac_enable(struct elink_params *params, in elink_bmac_enable() argument
3226 uint8_t port = params->port; in elink_bmac_enable()
3227 struct bxe_softc *sc = params->sc; in elink_bmac_enable()
3244 rc = elink_bmac2_enable(params, vars, is_lb); in elink_bmac_enable()
3246 rc = elink_bmac1_enable(params, vars, is_lb); in elink_bmac_enable()
3251 if ((params->feature_config_flags & in elink_bmac_enable()
3292 static elink_status_t elink_pbf_update(struct elink_params *params, uint32_t flow_ctrl, in elink_pbf_update() argument
3295 struct bxe_softc *sc = params->sc; in elink_pbf_update()
3296 uint8_t port = params->port; in elink_pbf_update()
3644 static uint8_t elink_eee_has_cap(struct elink_params *params) in elink_eee_has_cap() argument
3646 struct bxe_softc *sc = params->sc; in elink_eee_has_cap()
3648 if (REG_RD(sc, params->shmem2_base) <= in elink_eee_has_cap()
3649 offsetof(struct shmem2_region, eee_status[params->port])) in elink_eee_has_cap()
3695 static uint32_t elink_eee_calc_timer(struct elink_params *params) in elink_eee_calc_timer() argument
3698 struct bxe_softc *sc = params->sc; in elink_eee_calc_timer()
3700 if (params->eee_mode & ELINK_EEE_MODE_OVERRIDE_NVRAM) { in elink_eee_calc_timer()
3701 if (params->eee_mode & ELINK_EEE_MODE_OUTPUT_TIME) { in elink_eee_calc_timer()
3703 eee_idle = params->eee_mode & ELINK_EEE_MODE_TIMER_MASK; in elink_eee_calc_timer()
3706 if (elink_eee_nvram_to_time(params->eee_mode & in elink_eee_calc_timer()
3713 eee_mode = ((REG_RD(sc, params->shmem_base + in elink_eee_calc_timer()
3715 port_feature_config[params->port]. in elink_eee_calc_timer()
3727 static elink_status_t elink_eee_set_timers(struct elink_params *params, in elink_eee_set_timers() argument
3731 struct bxe_softc *sc = params->sc; in elink_eee_set_timers()
3733 eee_idle = elink_eee_calc_timer(params); in elink_eee_set_timers()
3736 REG_WR(sc, MISC_REG_CPMU_LP_IDLE_THR_P0 + (params->port << 2), in elink_eee_set_timers()
3738 } else if ((params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI) && in elink_eee_set_timers()
3739 (params->eee_mode & ELINK_EEE_MODE_OVERRIDE_NVRAM) && in elink_eee_set_timers()
3740 (params->eee_mode & ELINK_EEE_MODE_OUTPUT_TIME)) { in elink_eee_set_timers()
3746 if (params->eee_mode & ELINK_EEE_MODE_OUTPUT_TIME) { in elink_eee_set_timers()
3760 static elink_status_t elink_eee_initial_config(struct elink_params *params, in elink_eee_initial_config() argument
3766 if (params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI) in elink_eee_initial_config()
3771 if (params->eee_mode & ELINK_EEE_MODE_ADV_LPI) in elink_eee_initial_config()
3776 return elink_eee_set_timers(params, vars); in elink_eee_initial_config()
3780 struct elink_params *params, in elink_eee_disable() argument
3783 struct bxe_softc *sc = params->sc; in elink_eee_disable()
3786 REG_WR(sc, MISC_REG_CPMU_LP_FW_ENABLE_P0 + (params->port << 2), 0); in elink_eee_disable()
3796 struct elink_params *params, in elink_eee_advertise() argument
3799 struct bxe_softc *sc = params->sc; in elink_eee_advertise()
3803 REG_WR(sc, MISC_REG_CPMU_LP_MASK_EXT_P0 + (params->port << 2), 0xfc20); in elink_eee_advertise()
3822 static void elink_update_mng_eee(struct elink_params *params, uint32_t eee_status) in elink_update_mng_eee() argument
3824 struct bxe_softc *sc = params->sc; in elink_update_mng_eee()
3826 if (elink_eee_has_cap(params)) in elink_update_mng_eee()
3827 REG_WR(sc, params->shmem2_base + in elink_update_mng_eee()
3829 eee_status[params->port]), eee_status); in elink_update_mng_eee()
3833 struct elink_params *params, in elink_eee_an_resolve() argument
3836 struct bxe_softc *sc = params->sc; in elink_eee_an_resolve()
3881 static void elink_bsc_module_sel(struct elink_params *params) in elink_bsc_module_sel() argument
3886 struct bxe_softc *sc = params->sc; in elink_bsc_module_sel()
3887 uint8_t port = params->port; in elink_bsc_module_sel()
3889 board_cfg = REG_RD(sc, params->shmem_base + in elink_bsc_module_sel()
3897 sfp_ctrl = REG_RD(sc, params->shmem_base + in elink_bsc_module_sel()
4009 elink_status_t elink_phy_read(struct elink_params *params, uint8_t phy_addr, in elink_phy_read() argument
4016 for (phy_index = 0; phy_index < params->num_phys; phy_index++) { in elink_phy_read()
4017 if (params->phy[phy_index].addr == phy_addr) { in elink_phy_read()
4018 return elink_cl45_read(params->sc, in elink_phy_read()
4019 &params->phy[phy_index], devad, in elink_phy_read()
4026 elink_status_t elink_phy_write(struct elink_params *params, uint8_t phy_addr, in elink_phy_write() argument
4033 for (phy_index = 0; phy_index < params->num_phys; phy_index++) { in elink_phy_write()
4034 if (params->phy[phy_index].addr == phy_addr) { in elink_phy_write()
4035 return elink_cl45_write(params->sc, in elink_phy_write()
4036 &params->phy[phy_index], devad, in elink_phy_write()
4044 struct elink_params *params) in elink_get_warpcore_lane() argument
4047 struct bxe_softc *sc = params->sc; in elink_get_warpcore_lane()
4052 port = params->port; in elink_get_warpcore_lane()
4098 static void elink_set_aer_mmd(struct elink_params *params, in elink_set_aer_mmd() argument
4103 struct bxe_softc *sc = params->sc; in elink_set_aer_mmd()
4104 ser_lane = ((params->lane_config & in elink_set_aer_mmd()
4112 aer_val = elink_get_warpcore_lane(phy, params); in elink_set_aer_mmd()
4169 struct elink_params *params, in elink_xgxs_specific_func() argument
4172 struct bxe_softc *sc = params->sc; in elink_xgxs_specific_func()
4176 REG_WR(sc, NIG_REG_XGXS0_CTRL_MD_ST + params->port*0x18, 0); in elink_xgxs_specific_func()
4177 REG_WR(sc, NIG_REG_XGXS0_CTRL_MD_DEVAD + params->port*0x18, in elink_xgxs_specific_func()
4183 static void elink_xgxs_deassert(struct elink_params *params) in elink_xgxs_deassert() argument
4185 struct bxe_softc *sc = params->sc; in elink_xgxs_deassert()
4189 port = params->port; in elink_xgxs_deassert()
4197 elink_xgxs_specific_func(&params->phy[ELINK_INT_PHY], params, in elink_xgxs_deassert()
4202 struct elink_params *params, uint16_t *ieee_fc) in elink_calc_ieee_aneg_adv() argument
4204 struct bxe_softc *sc = params->sc; in elink_calc_ieee_aneg_adv()
4212 switch (params->req_fc_auto_adv) { in elink_calc_ieee_aneg_adv()
4242 static void set_phy_vars(struct elink_params *params, in set_phy_vars() argument
4245 struct bxe_softc *sc = params->sc; in set_phy_vars()
4247 uint8_t phy_config_swapped = params->multi_phy_config & in set_phy_vars()
4249 for (phy_index = ELINK_INT_PHY; phy_index < params->num_phys; in set_phy_vars()
4259 params->phy[actual_phy_idx].req_flow_ctrl = in set_phy_vars()
4260 params->req_flow_ctrl[link_cfg_idx]; in set_phy_vars()
4262 params->phy[actual_phy_idx].req_line_speed = in set_phy_vars()
4263 params->req_line_speed[link_cfg_idx]; in set_phy_vars()
4265 params->phy[actual_phy_idx].speed_cap_mask = in set_phy_vars()
4266 params->speed_cap_mask[link_cfg_idx]; in set_phy_vars()
4268 params->phy[actual_phy_idx].req_duplex = in set_phy_vars()
4269 params->req_duplex[link_cfg_idx]; in set_phy_vars()
4271 if (params->req_line_speed[link_cfg_idx] == in set_phy_vars()
4277 params->phy[actual_phy_idx].req_flow_ctrl, in set_phy_vars()
4278 params->phy[actual_phy_idx].req_line_speed, in set_phy_vars()
4279 params->phy[actual_phy_idx].speed_cap_mask); in set_phy_vars()
4283 static void elink_ext_phy_set_pause(struct elink_params *params, in elink_ext_phy_set_pause() argument
4288 struct bxe_softc *sc = params->sc; in elink_ext_phy_set_pause()
4295 elink_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc); in elink_ext_phy_set_pause()
4311 struct elink_params *params, in elink_pause_resolve() argument
4315 struct bxe_softc *sc = params->sc; in elink_pause_resolve()
4337 if (params->req_fc_auto_adv == ELINK_FLOW_CTRL_BOTH) { in elink_pause_resolve()
4358 struct elink_params *params, in elink_ext_phy_update_adv_fc() argument
4364 struct bxe_softc *sc = params->sc; in elink_ext_phy_update_adv_fc()
4369 ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_ext_phy_update_adv_fc()
4370 uint8_t lane = elink_get_warpcore_lane(phy, params); in elink_ext_phy_update_adv_fc()
4408 elink_pause_resolve(phy, params, vars, pause_result); in elink_ext_phy_update_adv_fc()
4413 struct elink_params *params, in elink_ext_phy_resolve_fc() argument
4421 elink_ext_phy_update_adv_fc(phy, params, vars); in elink_ext_phy_resolve_fc()
4425 vars->flow_ctrl = params->req_fc_auto_adv; in elink_ext_phy_resolve_fc()
4428 elink_ext_phy_update_adv_fc(phy, params, vars); in elink_ext_phy_resolve_fc()
4451 static void elink_update_link_attr(struct elink_params *params, uint32_t link_attr) in elink_update_link_attr() argument
4453 struct bxe_softc *sc = params->sc; in elink_update_link_attr()
4456 REG_WR(sc, params->shmem2_base + in elink_update_link_attr()
4458 link_attr_sync[params->port]), link_attr); in elink_update_link_attr()
4462 struct elink_params *params, in elink_warpcore_enable_AN_KR2() argument
4465 struct bxe_softc *sc = params->sc; in elink_warpcore_enable_AN_KR2()
4496 params->link_attr_sync |= LINK_ATTR_SYNC_KR2_ENABLE; in elink_warpcore_enable_AN_KR2()
4497 elink_update_link_attr(params, params->link_attr_sync); in elink_warpcore_enable_AN_KR2()
4500 static void elink_disable_kr2(struct elink_params *params, in elink_disable_kr2() argument
4504 struct bxe_softc *sc = params->sc; in elink_disable_kr2()
4529 params->link_attr_sync &= ~LINK_ATTR_SYNC_KR2_ENABLE; in elink_disable_kr2()
4530 elink_update_link_attr(params, params->link_attr_sync); in elink_disable_kr2()
4536 struct elink_params *params) in elink_warpcore_set_lpi_passthrough() argument
4538 struct bxe_softc *sc = params->sc; in elink_warpcore_set_lpi_passthrough()
4548 struct elink_params *params) in elink_warpcore_restart_AN_KR() argument
4551 struct bxe_softc *sc = params->sc; in elink_warpcore_restart_AN_KR()
4552 uint16_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_restart_AN_KR()
4559 elink_set_aer_mmd(params, phy); in elink_warpcore_restart_AN_KR()
4563 struct elink_params *params, in elink_warpcore_enable_AN_KR() argument
4567 struct bxe_softc *sc = params->sc; in elink_warpcore_enable_AN_KR()
4613 elink_set_aer_mmd(params, phy); in elink_warpcore_enable_AN_KR()
4618 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_enable_AN_KR()
4645 if (REG_RD(sc, params->shmem_base + in elink_warpcore_enable_AN_KR()
4647 port_hw_config[params->port].default_cfg)) & in elink_warpcore_enable_AN_KR()
4656 elink_ext_phy_set_pause(params, phy, vars); in elink_warpcore_enable_AN_KR()
4678 elink_set_aer_mmd(params, phy); in elink_warpcore_enable_AN_KR()
4680 elink_warpcore_enable_AN_KR2(phy, params, vars); in elink_warpcore_enable_AN_KR()
4685 wc_lane_config = REG_RD(sc, params->shmem_base + in elink_warpcore_enable_AN_KR()
4707 elink_disable_kr2(params, vars, phy); in elink_warpcore_enable_AN_KR()
4711 elink_warpcore_restart_AN_KR(phy, params); in elink_warpcore_enable_AN_KR()
4715 struct elink_params *params, in elink_warpcore_set_10G_KR() argument
4718 struct bxe_softc *sc = params->sc; in elink_warpcore_set_10G_KR()
4737 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_set_10G_KR()
4754 elink_set_aer_mmd(params, phy); in elink_warpcore_set_10G_KR()
4783 struct elink_params *params, in elink_warpcore_set_10G_XFI() argument
4786 struct bxe_softc *sc = params->sc; in elink_warpcore_set_10G_XFI()
4836 cfg_tap_val = REG_RD(sc, params->shmem_base + in elink_warpcore_set_10G_XFI()
4838 port_hw_config[params->port]. in elink_warpcore_set_10G_XFI()
4886 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_set_10G_XFI()
4902 elink_warpcore_set_lpi_passthrough(phy, params); in elink_warpcore_set_10G_XFI()
4918 struct elink_params *params) in elink_warpcore_set_20G_force_KR2() argument
4921 struct bxe_softc *sc = params->sc; in elink_warpcore_set_20G_force_KR2()
4930 elink_set_aer_mmd(params, phy); in elink_warpcore_set_20G_force_KR2()
4967 elink_set_aer_mmd(params, phy); in elink_warpcore_set_20G_force_KR2()
5025 struct elink_params *params, in elink_warpcore_set_sgmii_speed() argument
5029 struct bxe_softc *sc = params->sc; in elink_warpcore_set_sgmii_speed()
5036 elink_warpcore_set_lpi_passthrough(phy, params); in elink_warpcore_set_sgmii_speed()
5127 struct elink_params *params, in elink_warpcore_clear_regs() argument
5130 struct bxe_softc *sc = params->sc; in elink_warpcore_clear_regs()
5156 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_clear_regs()
5202 struct elink_params *params) in elink_is_sfp_module_plugged() argument
5204 struct bxe_softc *sc = params->sc; in elink_is_sfp_module_plugged()
5207 if (elink_get_mod_abs_int_cfg(sc, params->chip_id, in elink_is_sfp_module_plugged()
5208 params->shmem_base, params->port, in elink_is_sfp_module_plugged()
5220 struct elink_params *params) in elink_warpcore_get_sigdet() argument
5223 struct bxe_softc *sc = params->sc; in elink_warpcore_get_sigdet()
5225 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_get_sigdet()
5234 struct elink_params *params, in elink_warpcore_config_runtime() argument
5237 struct bxe_softc *sc = params->sc; in elink_warpcore_config_runtime()
5247 uint16_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_config_runtime()
5248 serdes_net_if = (REG_RD(sc, params->shmem_base + in elink_warpcore_config_runtime()
5250 port_hw_config[params->port].default_cfg)) & in elink_warpcore_config_runtime()
5287 struct elink_params *params) in elink_warpcore_config_sfi() argument
5289 uint16_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_config_sfi()
5290 struct bxe_softc *sc = params->sc; in elink_warpcore_config_sfi()
5291 elink_warpcore_clear_regs(phy, params, lane); in elink_warpcore_config_sfi()
5292 if ((params->req_line_speed[ELINK_LINK_CONFIG_IDX(ELINK_INT_PHY)] == in elink_warpcore_config_sfi()
5296 elink_warpcore_set_10G_XFI(phy, params, 0); in elink_warpcore_config_sfi()
5299 elink_warpcore_set_sgmii_speed(phy, params, 1, 0); in elink_warpcore_config_sfi()
5303 static void elink_sfp_e3_set_transmitter(struct elink_params *params, in elink_sfp_e3_set_transmitter() argument
5307 struct bxe_softc *sc = params->sc; in elink_sfp_e3_set_transmitter()
5309 uint8_t port = params->port; in elink_sfp_e3_set_transmitter()
5311 cfg_pin = REG_RD(sc, params->shmem_base + in elink_sfp_e3_set_transmitter()
5325 struct elink_params *params, in elink_warpcore_config_init() argument
5328 struct bxe_softc *sc = params->sc; in elink_warpcore_config_init()
5331 uint16_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_config_init()
5332 serdes_net_if = (REG_RD(sc, params->shmem_base + in elink_warpcore_config_init()
5334 port_hw_config[params->port].default_cfg)) & in elink_warpcore_config_init()
5339 elink_set_aer_mmd(params, phy); in elink_warpcore_config_init()
5348 elink_warpcore_clear_regs(phy, params, lane); in elink_warpcore_config_init()
5349 elink_warpcore_set_sgmii_speed(phy, params, 0, 1); in elink_warpcore_config_init()
5354 if (params->loopback_mode != ELINK_LOOPBACK_EXT) in elink_warpcore_config_init()
5355 elink_warpcore_enable_AN_KR(phy, params, vars); in elink_warpcore_config_init()
5358 elink_warpcore_set_10G_KR(phy, params, vars); in elink_warpcore_config_init()
5363 elink_warpcore_clear_regs(phy, params, lane); in elink_warpcore_config_init()
5366 elink_warpcore_set_10G_XFI(phy, params, 1); in elink_warpcore_config_init()
5368 if (ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_warpcore_config_init()
5376 params, in elink_warpcore_config_init()
5388 if ((params->loopback_mode == ELINK_LOOPBACK_NONE) || in elink_warpcore_config_init()
5389 (params->loopback_mode == ELINK_LOOPBACK_EXT)) { in elink_warpcore_config_init()
5390 if (elink_is_sfp_module_plugged(phy, params)) in elink_warpcore_config_init()
5391 elink_sfp_module_detection(phy, params); in elink_warpcore_config_init()
5393 elink_sfp_e3_set_transmitter(params, in elink_warpcore_config_init()
5397 elink_warpcore_config_sfi(phy, params); in elink_warpcore_config_init()
5409 elink_sfp_module_detection(phy, params); in elink_warpcore_config_init()
5412 if (!params->loopback_mode) { in elink_warpcore_config_init()
5413 elink_warpcore_enable_AN_KR(phy, params, vars); in elink_warpcore_config_init()
5416 elink_warpcore_set_20G_force_KR2(phy, params); in elink_warpcore_config_init()
5433 struct elink_params *params) in elink_warpcore_link_reset() argument
5435 struct bxe_softc *sc = params->sc; in elink_warpcore_link_reset()
5437 elink_sfp_e3_set_transmitter(params, phy, 0); in elink_warpcore_link_reset()
5438 elink_set_mdio_emac_per_phy(sc, params); in elink_warpcore_link_reset()
5439 elink_set_aer_mmd(params, phy); in elink_warpcore_link_reset()
5461 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_link_reset()
5483 elink_set_aer_mmd(params, phy); in elink_warpcore_link_reset()
5488 struct elink_params *params) in elink_set_warpcore_loopback() argument
5490 struct bxe_softc *sc = params->sc; in elink_set_warpcore_loopback()
5494 params->loopback_mode, phy->req_line_speed); in elink_set_warpcore_loopback()
5508 lane = elink_get_warpcore_lane(phy, params); in elink_set_warpcore_loopback()
5519 elink_set_aer_mmd(params, phy); in elink_set_warpcore_loopback()
5532 static void elink_sync_link(struct elink_params *params, in elink_sync_link() argument
5535 struct bxe_softc *sc = params->sc; in elink_sync_link()
5639 void elink_link_status_update(struct elink_params *params, in elink_link_status_update() argument
5642 struct bxe_softc *sc = params->sc; in elink_link_status_update()
5643 uint8_t port = params->port; in elink_link_status_update()
5646 set_phy_vars(params, vars); in elink_link_status_update()
5648 vars->link_status = REG_RD(sc, params->shmem_base + in elink_link_status_update()
5653 if (params->loopback_mode != ELINK_LOOPBACK_NONE && in elink_link_status_update()
5654 params->loopback_mode != ELINK_LOOPBACK_EXT) in elink_link_status_update()
5657 if (elink_eee_has_cap(params)) in elink_link_status_update()
5658 vars->eee_status = REG_RD(sc, params->shmem2_base + in elink_link_status_update()
5660 eee_status[params->port])); in elink_link_status_update()
5663 elink_sync_link(params, vars); in elink_link_status_update()
5665 sync_offset = params->shmem_base + in elink_link_status_update()
5670 params->phy[ELINK_INT_PHY].media_type = in elink_link_status_update()
5673 params->phy[ELINK_EXT_PHY1].media_type = in elink_link_status_update()
5676 params->phy[ELINK_EXT_PHY2].media_type = in elink_link_status_update()
5682 sync_offset = params->shmem_base + in elink_link_status_update()
5690 params->feature_config_flags |= in elink_link_status_update()
5693 params->feature_config_flags &= in elink_link_status_update()
5697 params->link_attr_sync = SHMEM2_RD(sc, in elink_link_status_update()
5698 link_attr_sync[params->port]); in elink_link_status_update()
5706 static void elink_set_master_ln(struct elink_params *params, in elink_set_master_ln() argument
5709 struct bxe_softc *sc = params->sc; in elink_set_master_ln()
5711 ser_lane = ((params->lane_config & in elink_set_master_ln()
5727 static elink_status_t elink_reset_unicore(struct elink_params *params, in elink_reset_unicore() argument
5731 struct bxe_softc *sc = params->sc; in elink_reset_unicore()
5745 elink_set_serdes_access(sc, params->port); in elink_reset_unicore()
5763 …elink_cb_event_log(sc, ELINK_LOG_ID_PHY_UNINITIALIZED, params->port); // "Warning: PHY was not ini… in elink_reset_unicore()
5771 static void elink_set_swap_lanes(struct elink_params *params, in elink_set_swap_lanes() argument
5774 struct bxe_softc *sc = params->sc; in elink_set_swap_lanes()
5780 rx_lane_swap = ((params->lane_config & in elink_set_swap_lanes()
5783 tx_lane_swap = ((params->lane_config & in elink_set_swap_lanes()
5814 struct elink_params *params) in elink_set_parallel_detection() argument
5816 struct bxe_softc *sc = params->sc; in elink_set_parallel_detection()
5867 struct elink_params *params, in elink_set_autoneg() argument
5871 struct bxe_softc *sc = params->sc; in elink_set_autoneg()
5971 struct elink_params *params, in elink_program_serdes() argument
5974 struct bxe_softc *sc = params->sc; in elink_program_serdes()
6020 struct elink_params *params) in elink_set_brcm_cl37_advertisement() argument
6022 struct bxe_softc *sc = params->sc; in elink_set_brcm_cl37_advertisement()
6040 struct elink_params *params, in elink_set_ieee_aneg_advertisement() argument
6043 struct bxe_softc *sc = params->sc; in elink_set_ieee_aneg_advertisement()
6061 struct elink_params *params, in elink_restart_autoneg() argument
6064 struct bxe_softc *sc = params->sc; in elink_restart_autoneg()
6101 struct elink_params *params, in elink_initialize_sgmii_process() argument
6104 struct bxe_softc *sc = params->sc; in elink_initialize_sgmii_process()
6166 elink_restart_autoneg(phy, params, 0); in elink_initialize_sgmii_process()
6173 struct elink_params *params) in elink_direct_parallel_detect_used() argument
6175 struct bxe_softc *sc = params->sc; in elink_direct_parallel_detect_used()
6189 params->port); in elink_direct_parallel_detect_used()
6200 params->port); in elink_direct_parallel_detect_used()
6207 struct elink_params *params, in elink_update_adv_fc() argument
6214 struct bxe_softc *sc = params->sc; in elink_update_adv_fc()
6249 elink_pause_resolve(phy, params, vars, pause_result); in elink_update_adv_fc()
6254 struct elink_params *params, in elink_flow_ctrl_resolve() argument
6258 struct bxe_softc *sc = params->sc; in elink_flow_ctrl_resolve()
6265 elink_update_adv_fc(phy, params, vars, gp_status); in elink_flow_ctrl_resolve()
6269 vars->flow_ctrl = params->req_fc_auto_adv; in elink_flow_ctrl_resolve()
6272 if (elink_direct_parallel_detect_used(phy, params)) { in elink_flow_ctrl_resolve()
6273 vars->flow_ctrl = params->req_fc_auto_adv; in elink_flow_ctrl_resolve()
6276 elink_update_adv_fc(phy, params, vars, gp_status); in elink_flow_ctrl_resolve()
6282 struct elink_params *params) in elink_check_fallback_to_cl37() argument
6284 struct bxe_softc *sc = params->sc; in elink_check_fallback_to_cl37()
6345 elink_restart_autoneg(phy, params, 0); in elink_check_fallback_to_cl37()
6350 struct elink_params *params, in elink_xgxs_an_resolve() argument
6358 if (elink_direct_parallel_detect_used(phy, params)) in elink_xgxs_an_resolve()
6363 struct elink_params *params, in elink_get_link_speed_duplex() argument
6369 struct bxe_softc *sc = params->sc; in elink_get_link_speed_duplex()
6456 struct elink_params *params, in elink_link_settings_status() argument
6459 struct bxe_softc *sc = params->sc; in elink_link_settings_status()
6484 rc = elink_get_link_speed_duplex(phy, params, vars, link_up, speed_mask, in elink_link_settings_status()
6490 if (ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_link_settings_status()
6492 elink_flow_ctrl_resolve(phy, params, vars, gp_status); in elink_link_settings_status()
6494 elink_xgxs_an_resolve(phy, params, vars, in elink_link_settings_status()
6499 ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_link_settings_status()
6501 elink_check_fallback_to_cl37(phy, params); in elink_link_settings_status()
6506 if (ELINK_SINGLE_MEDIA_DIRECT(params) && in elink_link_settings_status()
6538 struct elink_params *params, in elink_warpcore_read_status() argument
6541 struct bxe_softc *sc = params->sc; in elink_warpcore_read_status()
6545 lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_read_status()
6547 if ((params->loopback_mode) && in elink_warpcore_read_status()
6567 elink_ext_phy_resolve_fc(phy, params, vars); in elink_warpcore_read_status()
6588 if (link_up && ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_warpcore_read_status()
6609 elink_ext_phy_resolve_fc(phy, params, vars); in elink_warpcore_read_status()
6618 ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_warpcore_read_status()
6663 rc = elink_get_link_speed_duplex(phy, params, vars, link_up, gp_speed, in elink_warpcore_read_status()
6675 static void elink_set_gmii_tx_driver(struct elink_params *params) in elink_set_gmii_tx_driver() argument
6677 struct bxe_softc *sc = params->sc; in elink_set_gmii_tx_driver()
6678 struct elink_phy *phy = &params->phy[ELINK_INT_PHY]; in elink_set_gmii_tx_driver()
6714 static elink_status_t elink_emac_program(struct elink_params *params, in elink_emac_program() argument
6717 struct bxe_softc *sc = params->sc; in elink_emac_program()
6718 uint8_t port = params->port; in elink_emac_program()
6757 elink_set_led(params, vars, ELINK_LED_MODE_OPER, vars->line_speed); in elink_emac_program()
6762 struct elink_params *params) in elink_set_preemphasis() argument
6766 struct bxe_softc *sc = params->sc; in elink_set_preemphasis()
6786 struct elink_params *params, in elink_xgxs_config_init() argument
6789 struct bxe_softc *sc = params->sc; in elink_xgxs_config_init()
6790 uint8_t enable_cl73 = (ELINK_SINGLE_MEDIA_DIRECT(params) || in elink_xgxs_config_init()
6791 (params->loopback_mode == ELINK_LOOPBACK_XGXS)); in elink_xgxs_config_init()
6793 if (ELINK_SINGLE_MEDIA_DIRECT(params) && in elink_xgxs_config_init()
6794 (params->feature_config_flags & in elink_xgxs_config_init()
6796 elink_set_preemphasis(phy, params); in elink_xgxs_config_init()
6800 (ELINK_SINGLE_MEDIA_DIRECT(params) && in elink_xgxs_config_init()
6801 params->loopback_mode == ELINK_LOOPBACK_EXT)) { in elink_xgxs_config_init()
6805 elink_set_autoneg(phy, params, vars, 0); in elink_xgxs_config_init()
6808 elink_program_serdes(phy, params, vars); in elink_xgxs_config_init()
6814 elink_set_brcm_cl37_advertisement(phy, params); in elink_xgxs_config_init()
6817 elink_set_ieee_aneg_advertisement(phy, params, in elink_xgxs_config_init()
6821 elink_set_autoneg(phy, params, vars, enable_cl73); in elink_xgxs_config_init()
6824 elink_restart_autoneg(phy, params, enable_cl73); in elink_xgxs_config_init()
6830 elink_initialize_sgmii_process(phy, params, vars); in elink_xgxs_config_init()
6835 struct elink_params *params, in elink_prepare_xgxs() argument
6853 elink_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc); in elink_prepare_xgxs()
6854 elink_set_aer_mmd(params, phy); in elink_prepare_xgxs()
6856 elink_set_master_ln(params, phy); in elink_prepare_xgxs()
6858 rc = elink_reset_unicore(params, phy, 0); in elink_prepare_xgxs()
6863 elink_set_aer_mmd(params, phy); in elink_prepare_xgxs()
6866 elink_set_master_ln(params, phy); in elink_prepare_xgxs()
6867 elink_set_swap_lanes(params, phy); in elink_prepare_xgxs()
6875 struct elink_params *params) in elink_wait_reset_complete() argument
6893 …elink_cb_event_log(sc, ELINK_LOG_ID_PHY_UNINITIALIZED, params->port); // "Warning: PHY was not ini… in elink_wait_reset_complete()
6900 static void elink_link_int_enable(struct elink_params *params) in elink_link_int_enable() argument
6902 uint8_t port = params->port; in elink_link_int_enable()
6904 struct bxe_softc *sc = params->sc; in elink_link_int_enable()
6909 if (!(ELINK_SINGLE_MEDIA_DIRECT(params))) in elink_link_int_enable()
6911 } else if (params->switch_cfg == ELINK_SWITCH_CFG_10G) { in elink_link_int_enable()
6915 if (!(ELINK_SINGLE_MEDIA_DIRECT(params)) && in elink_link_int_enable()
6916 params->phy[ELINK_INT_PHY].type != in elink_link_int_enable()
6925 if (!(ELINK_SINGLE_MEDIA_DIRECT(params)) && in elink_link_int_enable()
6926 params->phy[ELINK_INT_PHY].type != in elink_link_int_enable()
6937 (params->switch_cfg == ELINK_SWITCH_CFG_10G), in elink_link_int_enable()
6982 static void elink_link_int_ack(struct elink_params *params, in elink_link_int_ack() argument
6985 struct bxe_softc *sc = params->sc; in elink_link_int_ack()
6986 uint8_t port = params->port; in elink_link_int_ack()
7001 else if (params->switch_cfg == ELINK_SWITCH_CFG_10G) { in elink_link_int_ack()
7006 ((params->lane_config & in elink_link_int_ack()
7068 elink_status_t elink_get_ext_phy_fw_version(struct elink_params *params, uint8_t *version, in elink_get_ext_phy_fw_version() argument
7076 if (version == NULL || params == NULL) in elink_get_ext_phy_fw_version()
7078 sc = params->sc; in elink_get_ext_phy_fw_version()
7082 spirom_ver = REG_RD(sc, params->phy[ELINK_EXT_PHY1].ver_addr); in elink_get_ext_phy_fw_version()
7084 if (params->phy[ELINK_EXT_PHY1].format_fw_ver) { in elink_get_ext_phy_fw_version()
7085 status |= params->phy[ELINK_EXT_PHY1].format_fw_ver(spirom_ver, in elink_get_ext_phy_fw_version()
7090 if ((params->num_phys == ELINK_MAX_PHYS) && in elink_get_ext_phy_fw_version()
7091 (params->phy[ELINK_EXT_PHY2].ver_addr != 0)) { in elink_get_ext_phy_fw_version()
7092 spirom_ver = REG_RD(sc, params->phy[ELINK_EXT_PHY2].ver_addr); in elink_get_ext_phy_fw_version()
7093 if (params->phy[ELINK_EXT_PHY2].format_fw_ver) { in elink_get_ext_phy_fw_version()
7097 status |= params->phy[ELINK_EXT_PHY2].format_fw_ver( in elink_get_ext_phy_fw_version()
7109 struct elink_params *params) in elink_set_xgxs_loopback() argument
7111 uint8_t port = params->port; in elink_set_xgxs_loopback()
7112 struct bxe_softc *sc = params->sc; in elink_set_xgxs_loopback()
7141 elink_set_aer_mmd(params, phy); in elink_set_xgxs_loopback()
7163 elink_status_t elink_set_led(struct elink_params *params, in elink_set_led() argument
7166 uint8_t port = params->port; in elink_set_led()
7167 uint16_t hw_led_mode = params->hw_led_mode; in elink_set_led()
7172 struct bxe_softc *sc = params->sc; in elink_set_led()
7178 if (params->phy[phy_idx].set_link_led) { in elink_set_led()
7179 params->phy[phy_idx].set_link_led( in elink_set_led()
7180 &params->phy[phy_idx], params, mode); in elink_set_led()
7184 if (params->feature_config_flags & in elink_set_led()
7197 if (params->phy[ELINK_EXT_PHY1].type == in elink_set_led()
7215 if (((params->phy[ELINK_EXT_PHY1].type == in elink_set_led()
7217 (params->phy[ELINK_EXT_PHY1].type == in elink_set_led()
7219 CHIP_IS_E2(sc) && params->num_phys == 2) { in elink_set_led()
7237 } else if (ELINK_SINGLE_MEDIA_DIRECT(params)) { in elink_set_led()
7253 } else if ((params->phy[ELINK_EXT_PHY1].type == in elink_set_led()
7265 uint32_t nig_led_mode = ((params->hw_led_mode << in elink_set_led()
7316 elink_status_t elink_test_link(struct elink_params *params, struct elink_vars *vars, in elink_test_link() argument
7319 struct bxe_softc *sc = params->sc; in elink_test_link()
7323 struct elink_phy *int_phy = &params->phy[ELINK_INT_PHY]; in elink_test_link()
7335 if (params->req_line_speed[ELINK_LINK_CONFIG_IDX(ELINK_INT_PHY)] in elink_test_link()
7345 uint8_t lane = elink_get_warpcore_lane(int_phy, params); in elink_test_link()
7365 if (params->loopback_mode == ELINK_LOOPBACK_XGXS) in elink_test_link()
7368 switch (params->num_phys) { in elink_test_link()
7373 ext_phy_link_up = params->phy[ELINK_EXT_PHY1].read_status( in elink_test_link()
7374 &params->phy[ELINK_EXT_PHY1], in elink_test_link()
7375 params, &temp_vars); in elink_test_link()
7378 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_test_link()
7380 serdes_phy_type = ((params->phy[phy_index].media_type == in elink_test_link()
7382 (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()
7391 if (params->phy[phy_index].read_status) { in elink_test_link()
7393 params->phy[phy_index].read_status( in elink_test_link()
7394 &params->phy[phy_index], in elink_test_link()
7395 params, &temp_vars); in elink_test_link()
7405 static elink_status_t elink_link_initialize(struct elink_params *params, in elink_link_initialize() argument
7409 struct bxe_softc *sc = params->sc; in elink_link_initialize()
7415 vars->line_speed = params->phy[ELINK_INT_PHY].req_line_speed; in elink_link_initialize()
7422 elink_prepare_xgxs(&params->phy[ELINK_INT_PHY], params, vars); in elink_link_initialize()
7424 non_ext_phy = (ELINK_SINGLE_MEDIA_DIRECT(params) || in elink_link_initialize()
7425 (params->loopback_mode == ELINK_LOOPBACK_XGXS)); in elink_link_initialize()
7428 (params->phy[ELINK_EXT_PHY1].flags & ELINK_FLAGS_INIT_XGXS_FIRST) || in elink_link_initialize()
7429 (params->loopback_mode == ELINK_LOOPBACK_EXT_PHY)) { in elink_link_initialize()
7430 struct elink_phy *phy = &params->phy[ELINK_INT_PHY]; in elink_link_initialize()
7434 elink_set_parallel_detection(phy, params); in elink_link_initialize()
7435 if (params->phy[ELINK_INT_PHY].config_init) in elink_link_initialize()
7436 params->phy[ELINK_INT_PHY].config_init(phy, params, vars); in elink_link_initialize()
7442 vars->line_speed = params->phy[ELINK_INT_PHY].req_line_speed; in elink_link_initialize()
7446 if (params->phy[ELINK_INT_PHY].supported & in elink_link_initialize()
7450 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_link_initialize()
7457 if (params->phy[phy_index].supported & in elink_link_initialize()
7462 (elink_phy_selection(params) == in elink_link_initialize()
7468 params->phy[phy_index].config_init( in elink_link_initialize()
7469 &params->phy[phy_index], in elink_link_initialize()
7470 params, vars); in elink_link_initialize()
7475 params->port*4, in elink_link_initialize()
7484 struct elink_params *params) in elink_int_link_reset() argument
7487 REG_WR(params->sc, GRCBASE_MISC + MISC_REGISTERS_RESET_REG_3_CLEAR, in elink_int_link_reset()
7488 (0x1ff << (params->port*16))); in elink_int_link_reset()
7492 struct elink_params *params) in elink_common_ext_link_reset() argument
7494 struct bxe_softc *sc = params->sc; in elink_common_ext_link_reset()
7500 gpio_port = params->port; in elink_common_ext_link_reset()
7510 static elink_status_t elink_update_link_down(struct elink_params *params, in elink_update_link_down() argument
7513 struct bxe_softc *sc = params->sc; in elink_update_link_down()
7514 uint8_t port = params->port; in elink_update_link_down()
7517 elink_set_led(params, vars, ELINK_LED_MODE_OFF, 0); in elink_update_link_down()
7525 elink_update_mng(params, vars->link_status); in elink_update_link_down()
7538 elink_set_bmac_rx(sc, params->chip_id, params->port, 0); in elink_update_link_down()
7542 REG_WR(sc, MISC_REG_CPMU_LP_FW_ENABLE_P0 + (params->port << 2), in elink_update_link_down()
7544 REG_WR(sc, MISC_REG_CPMU_LP_MASK_ENT_P0 + (params->port << 2), in elink_update_link_down()
7549 elink_update_mng_eee(params, vars->eee_status); in elink_update_link_down()
7550 elink_set_xmac_rxtx(params, 0); in elink_update_link_down()
7551 elink_set_umac_rxtx(params, 0); in elink_update_link_down()
7557 static elink_status_t elink_update_link_up(struct elink_params *params, in elink_update_link_up() argument
7561 struct bxe_softc *sc = params->sc; in elink_update_link_up()
7562 uint8_t phy_idx, port = params->port; in elink_update_link_up()
7578 if (elink_xmac_enable(params, vars, 0) == in elink_update_link_up()
7586 elink_umac_enable(params, vars, 0); in elink_update_link_up()
7587 elink_set_led(params, vars, in elink_update_link_up()
7594 (params->port << 2), 1); in elink_update_link_up()
7597 (params->port << 2), 0xfc20); in elink_update_link_up()
7603 if (elink_bmac_enable(params, vars, 0, 1) == in elink_update_link_up()
7611 elink_set_led(params, vars, in elink_update_link_up()
7614 rc = elink_emac_program(params, vars); in elink_update_link_up()
7615 elink_emac_enable(params, vars, 0); in elink_update_link_up()
7621 ELINK_SINGLE_MEDIA_DIRECT(params)) in elink_update_link_up()
7622 elink_set_gmii_tx_driver(params); in elink_update_link_up()
7628 rc |= elink_pbf_update(params, vars->flow_ctrl, in elink_update_link_up()
7635 elink_update_mng(params, vars->link_status); in elink_update_link_up()
7636 elink_update_mng_eee(params, vars->eee_status); in elink_update_link_up()
7639 if (params->phy[phy_idx].flags & ELINK_FLAGS_TX_ERROR_CHECK) { in elink_update_link_up()
7640 elink_check_half_open_conn(params, vars, 0); in elink_update_link_up()
7648 static void elink_chng_link_count(struct elink_params *params, uint8_t clear) in elink_chng_link_count() argument
7650 struct bxe_softc *sc = params->sc; in elink_chng_link_count()
7657 addr = params->shmem2_base + in elink_chng_link_count()
7658 offsetof(struct shmem2_region, link_change_count[params->port]); in elink_chng_link_count()
7678 elink_status_t elink_link_update(struct elink_params *params, struct elink_vars *vars) in elink_link_update() argument
7680 struct bxe_softc *sc = params->sc; in elink_link_update()
7682 uint8_t port = params->port; in elink_link_update()
7691 for (phy_index = ELINK_INT_PHY; phy_index < params->num_phys; in elink_link_update()
7705 elink_set_aer_mmd(params, &params->phy[ELINK_INT_PHY]); in elink_link_update()
7731 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_link_update()
7733 struct elink_phy *phy = &params->phy[phy_index]; in elink_link_update()
7737 cur_link_up = phy->read_status(phy, params, in elink_link_update()
7752 switch (elink_phy_selection(params)) { in elink_link_update()
7778 params->multi_phy_config); in elink_link_update()
7791 if (params->phy[ELINK_INT_PHY].read_status) in elink_link_update()
7792 params->phy[ELINK_INT_PHY].read_status( in elink_link_update()
7793 &params->phy[ELINK_INT_PHY], in elink_link_update()
7794 params, vars); in elink_link_update()
7813 if (params->phy[ELINK_EXT_PHY2].phy_specific_func) { in elink_link_update()
7816 params->phy[ELINK_EXT_PHY2].phy_specific_func( in elink_link_update()
7817 &params->phy[ELINK_EXT_PHY2], in elink_link_update()
7818 params, ELINK_DISABLE_TX); in elink_link_update()
7824 if (params->phy[active_external_phy].supported & in elink_link_update()
7849 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_link_update()
7851 if (params->phy[phy_index].flags & in elink_link_update()
7868 if (!(ELINK_SINGLE_MEDIA_DIRECT(params)) && ext_phy_link_up && in elink_link_update()
7877 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, in elink_link_update()
7886 elink_link_int_ack(params, vars, link_10g_plus); in elink_link_update()
7895 if (!(ELINK_SINGLE_MEDIA_DIRECT(params))) { in elink_link_update()
7899 params->phy[ELINK_EXT_PHY1].flags & in elink_link_update()
7901 if (!(params->phy[ELINK_EXT_PHY1].flags & in elink_link_update()
7910 if (params->phy[ELINK_INT_PHY].config_init) in elink_link_update()
7911 params->phy[ELINK_INT_PHY].config_init( in elink_link_update()
7912 &params->phy[ELINK_INT_PHY], params, in elink_link_update()
7921 ELINK_SINGLE_MEDIA_DIRECT(params)) && in elink_link_update()
7931 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_link_update()
7937 rc = elink_update_link_up(params, vars, link_10g_plus); in elink_link_update()
7939 rc = elink_update_link_down(params, vars); in elink_link_update()
7942 elink_chng_link_count(params, 0); in elink_link_update()
7945 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_BC_SUPPORTS_AFEX) in elink_link_update()
8008 struct elink_params *params, in elink_8073_resolve_fc() argument
8011 struct bxe_softc *sc = params->sc; in elink_8073_resolve_fc()
8018 if (elink_ext_phy_resolve_fc(phy, params, vars) && in elink_8073_resolve_fc()
8035 elink_pause_resolve(phy, params, vars, pause_result); in elink_8073_resolve_fc()
8216 static void elink_8073_set_pause_cl37(struct elink_params *params, in elink_8073_set_pause_cl37() argument
8221 struct bxe_softc *sc = params->sc; in elink_8073_set_pause_cl37()
8227 elink_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc); in elink_8073_set_pause_cl37()
8252 struct elink_params *params, in elink_8073_specific_func() argument
8255 struct bxe_softc *sc = params->sc; in elink_8073_specific_func()
8268 struct elink_params *params, in elink_8073_config_init() argument
8271 struct bxe_softc *sc = params->sc; in elink_8073_config_init()
8279 gpio_port = params->port; in elink_8073_config_init()
8287 elink_8073_specific_func(phy, params, ELINK_PHY_INIT); in elink_8073_config_init()
8288 elink_8073_set_pause_cl37(params, phy, vars); in elink_8073_config_init()
8299 if (params->lane_config & PORT_HW_CFG_SWAP_PHY_POLARITY_ENABLED) { in elink_8073_config_init()
8314 if (REG_RD(sc, params->shmem_base + in elink_8073_config_init()
8316 port_hw_config[params->port].default_cfg)) & in elink_8073_config_init()
8327 if (params->loopback_mode == ELINK_LOOPBACK_EXT) { in elink_8073_config_init()
8405 elink_ext_phy_set_pause(params, phy, vars); in elink_8073_config_init()
8416 struct elink_params *params, in elink_8073_read_status() argument
8419 struct bxe_softc *sc = params->sc; in elink_8073_read_status()
8500 params->port); in elink_8073_read_status()
8505 params->port); in elink_8073_read_status()
8510 params->port); in elink_8073_read_status()
8514 params->port); in elink_8073_read_status()
8519 if (params->lane_config & in elink_8073_read_status()
8541 elink_8073_resolve_fc(phy, params, vars); in elink_8073_read_status()
8561 struct elink_params *params) in elink_8073_link_reset() argument
8563 struct bxe_softc *sc = params->sc; in elink_8073_link_reset()
8568 gpio_port = params->port; in elink_8073_link_reset()
8580 struct elink_params *params, in elink_8705_config_init() argument
8583 struct bxe_softc *sc = params->sc; in elink_8705_config_init()
8587 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); in elink_8705_config_init()
8589 elink_ext_phy_hw_reset(sc, params->port); in elink_8705_config_init()
8591 elink_wait_reset_complete(sc, phy, params); in elink_8705_config_init()
8602 elink_save_spirom_version(sc, params->port, params->shmem_base, 0); in elink_8705_config_init()
8607 struct elink_params *params, in elink_8705_read_status() argument
8612 struct bxe_softc *sc = params->sc; in elink_8705_read_status()
8634 elink_ext_phy_resolve_fc(phy, params, vars); in elink_8705_read_status()
8642 static void elink_set_disable_pmd_transmit(struct elink_params *params, in elink_set_disable_pmd_transmit() argument
8646 struct bxe_softc *sc = params->sc; in elink_set_disable_pmd_transmit()
8651 if (params->feature_config_flags & in elink_set_disable_pmd_transmit()
8665 static uint8_t elink_get_gpio_port(struct elink_params *params) in elink_get_gpio_port() argument
8669 struct bxe_softc *sc = params->sc; in elink_get_gpio_port()
8673 gpio_port = params->port; in elink_get_gpio_port()
8679 static void elink_sfp_e1e2_set_transmitter(struct elink_params *params, in elink_sfp_e1e2_set_transmitter() argument
8684 uint8_t port = params->port; in elink_sfp_e1e2_set_transmitter()
8685 struct bxe_softc *sc = params->sc; in elink_sfp_e1e2_set_transmitter()
8689 tx_en_mode = REG_RD(sc, params->shmem_base + in elink_sfp_e1e2_set_transmitter()
8726 gpio_port = elink_get_gpio_port(params); in elink_sfp_e1e2_set_transmitter()
8736 static void elink_sfp_set_transmitter(struct elink_params *params, in elink_sfp_set_transmitter() argument
8740 struct bxe_softc *sc = params->sc; in elink_sfp_set_transmitter()
8743 elink_sfp_e3_set_transmitter(params, phy, tx_en); in elink_sfp_set_transmitter()
8745 elink_sfp_e1e2_set_transmitter(params, phy, tx_en); in elink_sfp_set_transmitter()
8749 struct elink_params *params, in elink_8726_read_sfp_module_eeprom() argument
8753 struct bxe_softc *sc = params->sc; in elink_8726_read_sfp_module_eeprom()
8815 static void elink_warpcore_power_module(struct elink_params *params, in elink_warpcore_power_module() argument
8819 struct bxe_softc *sc = params->sc; in elink_warpcore_power_module()
8821 pin_cfg = (REG_RD(sc, params->shmem_base + in elink_warpcore_power_module()
8823 dev_info.port_hw_config[params->port].e3_sfp_ctrl)) & in elink_warpcore_power_module()
8837 struct elink_params *params, in elink_warpcore_read_sfp_module_eeprom() argument
8846 struct bxe_softc *sc = params->sc; in elink_warpcore_read_sfp_module_eeprom()
8858 elink_warpcore_power_module(params, 0); in elink_warpcore_read_sfp_module_eeprom()
8861 elink_warpcore_power_module(params, 1); in elink_warpcore_read_sfp_module_eeprom()
8864 elink_bsc_module_sel(params); in elink_warpcore_read_sfp_module_eeprom()
8880 struct elink_params *params, in elink_8727_read_sfp_module_eeprom() argument
8884 struct bxe_softc *sc = params->sc; in elink_8727_read_sfp_module_eeprom()
8975 struct elink_params *params, uint8_t dev_addr, in elink_read_sfp_module_eeprom() argument
8979 struct bxe_softc *sc = params->sc; in elink_read_sfp_module_eeprom()
9006 rc = read_func(phy, params, dev_addr, addr, xfer_size, in elink_read_sfp_module_eeprom()
9016 struct elink_params *params, in elink_get_edc_mode() argument
9019 struct bxe_softc *sc = params->sc; in elink_get_edc_mode()
9026 params, in elink_get_edc_mode()
9034 params->link_attr_sync &= ~LINK_SFP_EEPROM_COMP_CODE_MASK; in elink_get_edc_mode()
9035 params->link_attr_sync |= val[ELINK_SFP_EEPROM_10G_COMP_CODE_ADDR] << in elink_get_edc_mode()
9037 elink_update_link_attr(params, params->link_attr_sync); in elink_get_edc_mode()
9086 uint8_t gport = params->port; in elink_get_edc_mode()
9090 (params->port << 1); in elink_get_edc_mode()
9103 elink_sfp_set_transmitter(params, phy, 0); in elink_get_edc_mode()
9105 elink_sfp_set_transmitter(params, phy, 1); in elink_get_edc_mode()
9111 if (params->phy[idx].type == phy->type) { in elink_get_edc_mode()
9117 phy->req_line_speed = params->req_line_speed[cfg_idx]; in elink_get_edc_mode()
9125 sync_offset = params->shmem_base + in elink_get_edc_mode()
9127 dev_info.port_hw_config[params->port].media_type); in elink_get_edc_mode()
9131 if (&(params->phy[phy_idx]) == phy) { in elink_get_edc_mode()
9144 params, in elink_get_edc_mode()
9165 struct elink_params *params) in elink_verify_sfp_module() argument
9167 struct bxe_softc *sc = params->sc; in elink_verify_sfp_module()
9173 val = REG_RD(sc, params->shmem_base + in elink_verify_sfp_module()
9175 port_feature_config[params->port].config)); in elink_verify_sfp_module()
9182 if (params->feature_config_flags & in elink_verify_sfp_module()
9186 } else if (params->feature_config_flags & in elink_verify_sfp_module()
9189 if (ELINK_DUAL_MEDIA(params)) { in elink_verify_sfp_module()
9211 params, in elink_verify_sfp_module()
9220 params, in elink_verify_sfp_module()
9229 …elink_cb_event_log(sc, ELINK_LOG_ID_UNQUAL_IO_MODULE, params->port, vendor_name, vendor_pn); // "W… in elink_verify_sfp_module()
9239 struct elink_params *params) in elink_wait_for_sfp_module_initialized() argument
9244 struct bxe_softc *sc = params->sc; in elink_wait_for_sfp_module_initialized()
9253 phy, params, ELINK_I2C_DEV_ADDR_A0, 1, 1, &val, in elink_wait_for_sfp_module_initialized()
9256 rc = elink_read_sfp_module_eeprom(phy, params, in elink_wait_for_sfp_module_initialized()
9267 rc = elink_read_sfp_module_eeprom(phy, params, ELINK_I2C_DEV_ADDR_A0, in elink_wait_for_sfp_module_initialized()
9388 struct elink_params *params, in elink_8727_specific_func() argument
9391 struct bxe_softc *sc = params->sc; in elink_8727_specific_func()
9395 elink_sfp_set_transmitter(params, phy, 0); in elink_8727_specific_func()
9399 elink_sfp_set_transmitter(params, phy, 1); in elink_8727_specific_func()
9433 static void elink_set_e1e2_module_fault_led(struct elink_params *params, in elink_set_e1e2_module_fault_led() argument
9436 struct bxe_softc *sc = params->sc; in elink_set_e1e2_module_fault_led()
9438 uint32_t fault_led_gpio = REG_RD(sc, params->shmem_base + in elink_set_e1e2_module_fault_led()
9440 dev_info.port_hw_config[params->port].sfp_ctrl)) & in elink_set_e1e2_module_fault_led()
9450 uint8_t gpio_port = elink_get_gpio_port(params); in elink_set_e1e2_module_fault_led()
9465 static void elink_set_e3_module_fault_led(struct elink_params *params, in elink_set_e3_module_fault_led() argument
9469 uint8_t port = params->port; in elink_set_e3_module_fault_led()
9470 struct bxe_softc *sc = params->sc; in elink_set_e3_module_fault_led()
9471 pin_cfg = (REG_RD(sc, params->shmem_base + in elink_set_e3_module_fault_led()
9481 static void elink_set_sfp_module_fault_led(struct elink_params *params, in elink_set_sfp_module_fault_led() argument
9484 struct bxe_softc *sc = params->sc; in elink_set_sfp_module_fault_led()
9490 elink_set_e3_module_fault_led(params, gpio_mode); in elink_set_sfp_module_fault_led()
9492 elink_set_e1e2_module_fault_led(params, gpio_mode); in elink_set_sfp_module_fault_led()
9496 struct elink_params *params) in elink_warpcore_hw_reset() argument
9498 struct bxe_softc *sc = params->sc; in elink_warpcore_hw_reset()
9499 elink_warpcore_power_module(params, 0); in elink_warpcore_hw_reset()
9509 static void elink_power_sfp_module(struct elink_params *params, in elink_power_sfp_module() argument
9513 struct bxe_softc *sc = params->sc; in elink_power_sfp_module()
9519 elink_8727_power_module(params->sc, phy, power); in elink_power_sfp_module()
9522 elink_warpcore_power_module(params, power); in elink_power_sfp_module()
9528 static void elink_warpcore_set_limiting_mode(struct elink_params *params, in elink_warpcore_set_limiting_mode() argument
9534 struct bxe_softc *sc = params->sc; in elink_warpcore_set_limiting_mode()
9536 uint8_t lane = elink_get_warpcore_lane(phy, params); in elink_warpcore_set_limiting_mode()
9568 static void elink_set_limiting_mode(struct elink_params *params, in elink_set_limiting_mode() argument
9574 elink_8726_set_limiting_mode(params->sc, phy, edc_mode); in elink_set_limiting_mode()
9578 elink_8727_set_limiting_mode(params->sc, phy, edc_mode); in elink_set_limiting_mode()
9581 elink_warpcore_set_limiting_mode(params, phy, edc_mode); in elink_set_limiting_mode()
9587 struct elink_params *params) in elink_sfp_module_detection() argument
9589 struct bxe_softc *sc = params->sc; in elink_sfp_module_detection()
9593 uint32_t val = REG_RD(sc, params->shmem_base + in elink_sfp_module_detection()
9595 port_feature_config[params->port].config)); in elink_sfp_module_detection()
9597 elink_sfp_set_transmitter(params, phy, 1); in elink_sfp_module_detection()
9599 params->port); in elink_sfp_module_detection()
9601 elink_power_sfp_module(params, phy, 1); in elink_sfp_module_detection()
9602 if (elink_get_edc_mode(phy, params, &edc_mode) != 0) { in elink_sfp_module_detection()
9605 } else if (elink_verify_sfp_module(phy, params) != 0) { in elink_sfp_module_detection()
9610 elink_set_sfp_module_fault_led(params, in elink_sfp_module_detection()
9617 elink_power_sfp_module(params, phy, 0); in elink_sfp_module_detection()
9622 elink_set_sfp_module_fault_led(params, MISC_REGISTERS_GPIO_LOW); in elink_sfp_module_detection()
9628 elink_set_limiting_mode(params, phy, edc_mode); in elink_sfp_module_detection()
9636 elink_sfp_set_transmitter(params, phy, 0); in elink_sfp_module_detection()
9641 void elink_handle_module_detect_int(struct elink_params *params) in elink_handle_module_detect_int() argument
9643 struct bxe_softc *sc = params->sc; in elink_handle_module_detect_int()
9648 phy = &params->phy[ELINK_INT_PHY]; in elink_handle_module_detect_int()
9650 elink_sfp_set_transmitter(params, phy, 1); in elink_handle_module_detect_int()
9652 phy = &params->phy[ELINK_EXT_PHY1]; in elink_handle_module_detect_int()
9654 if (elink_get_mod_abs_int_cfg(sc, params->chip_id, params->shmem_base, in elink_handle_module_detect_int()
9655 params->port, &gpio_num, &gpio_port) == in elink_handle_module_detect_int()
9662 elink_set_sfp_module_fault_led(params, MISC_REGISTERS_GPIO_HIGH); in elink_handle_module_detect_int()
9669 elink_set_mdio_emac_per_phy(sc, params); in elink_handle_module_detect_int()
9670 elink_set_aer_mmd(params, phy); in elink_handle_module_detect_int()
9672 elink_power_sfp_module(params, phy, 1); in elink_handle_module_detect_int()
9676 if (elink_wait_for_sfp_module_initialized(phy, params) == 0) { in elink_handle_module_detect_int()
9677 elink_sfp_module_detection(phy, params); in elink_handle_module_detect_int()
9689 (params->link_flags & in elink_handle_module_detect_int()
9692 elink_warpcore_config_sfi(phy, params); in elink_handle_module_detect_int()
9737 struct elink_params *params, in elink_8706_8726_read_status() argument
9742 struct bxe_softc *sc = params->sc; in elink_8706_8726_read_status()
9778 elink_ext_phy_resolve_fc(phy, params, vars); in elink_8706_8726_read_status()
9799 struct elink_params *params, in elink_8706_config_init() argument
9804 struct bxe_softc *sc = params->sc; in elink_8706_config_init()
9807 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); in elink_8706_config_init()
9809 elink_ext_phy_hw_reset(sc, params->port); in elink_8706_config_init()
9811 elink_wait_reset_complete(sc, phy, params); in elink_8706_config_init()
9822 if ((params->feature_config_flags & in elink_8706_config_init()
9881 elink_save_bcm_spirom_ver(sc, phy, params->port); in elink_8706_config_init()
9887 tx_en_mode = REG_RD(sc, params->shmem_base + in elink_8706_config_init()
9889 dev_info.port_hw_config[params->port].sfp_ctrl)) in elink_8706_config_init()
9905 struct elink_params *params, in elink_8706_read_status() argument
9908 return elink_8706_8726_read_status(phy, params, vars); in elink_8706_read_status()
9915 struct elink_params *params) in elink_8726_config_loopback() argument
9917 struct bxe_softc *sc = params->sc; in elink_8726_config_loopback()
9923 struct elink_params *params) in elink_8726_external_rom_boot() argument
9925 struct bxe_softc *sc = params->sc; in elink_8726_external_rom_boot()
9957 elink_save_bcm_spirom_ver(sc, phy, params->port); in elink_8726_external_rom_boot()
9961 struct elink_params *params, in elink_8726_read_status() argument
9964 struct bxe_softc *sc = params->sc; in elink_8726_read_status()
9966 uint8_t link_up = elink_8706_8726_read_status(phy, params, vars); in elink_8726_read_status()
9982 struct elink_params *params, in elink_8726_config_init() argument
9985 struct bxe_softc *sc = params->sc; in elink_8726_config_init()
9989 elink_wait_reset_complete(sc, phy, params); in elink_8726_config_init()
9991 elink_8726_external_rom_boot(phy, params); in elink_8726_config_init()
9998 elink_sfp_module_detection(phy, params); in elink_8726_config_init()
10019 elink_ext_phy_set_pause(params, phy, vars); in elink_8726_config_init()
10045 if ((params->feature_config_flags & in elink_8726_config_init()
10067 struct elink_params *params) in elink_8726_link_reset() argument
10069 struct bxe_softc *sc = params->sc; in elink_8726_link_reset()
10070 ELINK_DEBUG_P1(sc, "elink_8726_link_reset port %d\n", params->port); in elink_8726_link_reset()
10082 struct elink_params *params, uint8_t mode) in elink_8727_set_link_led() argument
10084 struct bxe_softc *sc = params->sc; in elink_8727_set_link_led()
10128 struct elink_params *params) { in elink_8727_hw_reset() argument
10134 struct bxe_softc *sc = params->sc; in elink_8727_hw_reset()
10143 struct elink_params *params) in elink_8727_config_speed() argument
10145 struct bxe_softc *sc = params->sc; in elink_8727_config_speed()
10161 if (ELINK_DUAL_MEDIA(params)) { in elink_8727_config_speed()
10200 struct elink_params *params, in elink_8727_config_init() argument
10205 struct bxe_softc *sc = params->sc; in elink_8727_config_init()
10208 elink_wait_reset_complete(sc, phy, params); in elink_8727_config_init()
10212 elink_8727_specific_func(phy, params, ELINK_PHY_INIT); in elink_8727_config_init()
10229 elink_set_disable_pmd_transmit(params, phy, 0); in elink_8727_config_init()
10239 elink_8727_config_speed(phy, params); in elink_8727_config_init()
10243 if ((params->feature_config_flags & in elink_8727_config_init()
10260 tx_en_mode = REG_RD(sc, params->shmem_base + in elink_8727_config_init()
10262 dev_info.port_hw_config[params->port].sfp_ctrl)) in elink_8727_config_init()
10286 struct elink_params *params) in elink_8727_handle_mod_abs() argument
10288 struct bxe_softc *sc = params->sc; in elink_8727_handle_mod_abs()
10290 uint32_t val = REG_RD(sc, params->shmem_base + in elink_8727_handle_mod_abs()
10292 port_feature_config[params->port]. in elink_8727_handle_mod_abs()
10354 elink_sfp_set_transmitter(params, phy, 0); in elink_8727_handle_mod_abs()
10356 if (elink_wait_for_sfp_module_initialized(phy, params) == 0) in elink_8727_handle_mod_abs()
10357 elink_sfp_module_detection(phy, params); in elink_8727_handle_mod_abs()
10362 elink_8727_config_speed(phy, params); in elink_8727_handle_mod_abs()
10371 struct elink_params *params, in elink_8727_read_status() argument
10375 struct bxe_softc *sc = params->sc; in elink_8727_read_status()
10416 uint8_t oc_port = params->port; in elink_8727_read_status()
10418 oc_port = SC_PATH(sc) + (params->port << 1); in elink_8727_read_status()
10446 elink_8727_power_module(params->sc, phy, 0); in elink_8727_read_status()
10453 elink_8727_handle_mod_abs(phy, params); in elink_8727_read_status()
10462 elink_sfp_set_transmitter(params, phy, 1); in elink_8727_read_status()
10479 params->port); in elink_8727_read_status()
10484 params->port); in elink_8727_read_status()
10488 params->port); in elink_8727_read_status()
10505 elink_ext_phy_resolve_fc(phy, params, vars); in elink_8727_read_status()
10510 if ((ELINK_DUAL_MEDIA(params)) && in elink_8727_read_status()
10530 struct elink_params *params) in elink_8727_link_reset() argument
10532 struct bxe_softc *sc = params->sc; in elink_8727_link_reset()
10535 elink_set_disable_pmd_transmit(params, phy, 1); in elink_8727_link_reset()
10538 elink_sfp_set_transmitter(params, phy, 0); in elink_8727_link_reset()
10662 struct elink_params *params, in elink_848xx_specific_func() argument
10665 struct bxe_softc *sc = params->sc; in elink_848xx_specific_func()
10670 elink_save_848xx_spirom_version(phy, sc, params->port); in elink_848xx_specific_func()
10676 elink_bits_en(sc, NIG_REG_LATCH_BC_0 + params->port*4, in elink_848xx_specific_func()
10685 struct elink_params *params, in elink_848xx_cmn_config_init() argument
10688 struct bxe_softc *sc = params->sc; in elink_848xx_cmn_config_init()
10691 elink_848xx_specific_func(phy, params, ELINK_PHY_INIT); in elink_848xx_cmn_config_init()
10700 elink_ext_phy_set_pause(params, phy, vars); in elink_848xx_cmn_config_init()
10831 struct elink_params *params, in elink_8481_config_init() argument
10834 struct bxe_softc *sc = params->sc; in elink_8481_config_init()
10837 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); in elink_8481_config_init()
10840 elink_ext_phy_hw_reset(sc, params->port); in elink_8481_config_init()
10841 elink_wait_reset_complete(sc, phy, params); in elink_8481_config_init()
10844 return elink_848xx_cmn_config_init(phy, params, vars); in elink_8481_config_init()
10851 struct elink_params *params, in elink_84858_cmd_hdlr() argument
10857 struct bxe_softc *sc = params->sc; in elink_84858_cmd_hdlr()
10928 struct elink_params *params, uint16_t fw_cmd, in elink_84833_cmd_hdlr() argument
10933 struct bxe_softc *sc = params->sc; in elink_84833_cmd_hdlr()
11007 struct elink_params *params, in elink_848xx_cmd_hdlr() argument
11012 struct bxe_softc *sc = params->sc; in elink_848xx_cmd_hdlr()
11015 (REG_RD(sc, params->shmem2_base + in elink_848xx_cmd_hdlr()
11017 link_attr_sync[params->port])) & LINK_ATTR_84858)) { in elink_848xx_cmd_hdlr()
11018 return elink_84858_cmd_hdlr(phy, params, fw_cmd, cmd_args, in elink_848xx_cmd_hdlr()
11021 return elink_84833_cmd_hdlr(phy, params, fw_cmd, cmd_args, in elink_848xx_cmd_hdlr()
11027 struct elink_params *params, in elink_848xx_pair_swap_cfg() argument
11033 struct bxe_softc *sc = params->sc; in elink_848xx_pair_swap_cfg()
11036 pair_swap = REG_RD(sc, params->shmem_base + in elink_848xx_pair_swap_cfg()
11038 dev_info.port_hw_config[params->port].xgbt_phy_cfg)) & in elink_848xx_pair_swap_cfg()
11047 status = elink_848xx_cmd_hdlr(phy, params, in elink_848xx_pair_swap_cfg()
11095 struct elink_params *params) in elink_84833_hw_reset_phy() argument
11097 struct bxe_softc *sc = params->sc; in elink_84833_hw_reset_phy()
11099 uint32_t other_shmem_base_addr = REG_RD(sc, params->shmem2_base + in elink_84833_hw_reset_phy()
11113 shmem_base_path[0] = params->shmem_base; in elink_84833_hw_reset_phy()
11117 params->chip_id); in elink_84833_hw_reset_phy()
11128 struct elink_params *params, in elink_8483x_disable_eee() argument
11132 struct bxe_softc *sc = params->sc; in elink_8483x_disable_eee()
11138 rc = elink_848xx_cmd_hdlr(phy, params, PHY848xx_CMD_SET_EEE_MODE, in elink_8483x_disable_eee()
11145 return elink_eee_disable(phy, params, vars); in elink_8483x_disable_eee()
11149 struct elink_params *params, in elink_8483x_enable_eee() argument
11153 struct bxe_softc *sc = params->sc; in elink_8483x_enable_eee()
11156 rc = elink_848xx_cmd_hdlr(phy, params, PHY848xx_CMD_SET_EEE_MODE, in elink_8483x_enable_eee()
11163 return elink_eee_advertise(phy, params, vars, SHMEM_EEE_10G_ADV); in elink_8483x_enable_eee()
11168 struct elink_params *params, in elink_848x3_config_init() argument
11171 struct bxe_softc *sc = params->sc; in elink_848x3_config_init()
11183 port = params->port; in elink_848x3_config_init()
11196 elink_wait_reset_complete(sc, phy, params); in elink_848x3_config_init()
11207 elink_set_autoneg(&params->phy[ELINK_INT_PHY], params, vars, 0); in elink_848x3_config_init()
11208 elink_program_serdes(&params->phy[ELINK_INT_PHY], params, vars); in elink_848x3_config_init()
11218 params->link_attr_sync |= LINK_ATTR_84858; in elink_848x3_config_init()
11219 elink_update_link_attr(params, params->link_attr_sync); in elink_848x3_config_init()
11240 actual_phy_selection = elink_phy_selection(params); in elink_848x3_config_init()
11260 if (params->phy[ELINK_EXT_PHY2].req_line_speed == ELINK_SPEED_1000) in elink_848x3_config_init()
11266 params->multi_phy_config, val); in elink_848x3_config_init()
11269 elink_848xx_pair_swap_cfg(phy, params, vars); in elink_848x3_config_init()
11276 rc = elink_848xx_cmd_hdlr(phy, params, in elink_848x3_config_init()
11283 rc = elink_848xx_cmn_config_init(phy, params, vars); in elink_848x3_config_init()
11285 elink_save_848xx_spirom_version(phy, sc, params->port); in elink_848x3_config_init()
11288 uint32_t cms_enable = REG_RD(sc, params->shmem_base + in elink_848x3_config_init()
11290 dev_info.port_hw_config[params->port].default_cfg)) & in elink_848x3_config_init()
11309 elink_eee_has_cap(params)) { in elink_848x3_config_init()
11310 rc = elink_eee_initial_config(params, vars, SHMEM_EEE_10G_ADV); in elink_848x3_config_init()
11313 elink_8483x_disable_eee(phy, params, vars); in elink_848x3_config_init()
11318 (params->eee_mode & ELINK_EEE_MODE_ADV_LPI) && in elink_848x3_config_init()
11319 (elink_eee_calc_timer(params) || in elink_848x3_config_init()
11320 !(params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI))) in elink_848x3_config_init()
11321 rc = elink_8483x_enable_eee(phy, params, vars); in elink_848x3_config_init()
11323 rc = elink_8483x_disable_eee(phy, params, vars); in elink_848x3_config_init()
11343 struct elink_params *params, in elink_848xx_read_status() argument
11346 struct bxe_softc *sc = params->sc; in elink_848xx_read_status()
11395 if (params->feature_config_flags & in elink_848xx_read_status()
11437 elink_ext_phy_resolve_fc(phy, params, vars); in elink_848xx_read_status()
11477 elink_eee_an_resolve(phy, params, vars); in elink_848xx_read_status()
11493 struct elink_params *params) in elink_8481_hw_reset() argument
11495 elink_cb_gpio_write(params->sc, MISC_REGISTERS_GPIO_1, in elink_8481_hw_reset()
11497 elink_cb_gpio_write(params->sc, MISC_REGISTERS_GPIO_1, in elink_8481_hw_reset()
11502 struct elink_params *params) in elink_8481_link_reset() argument
11504 elink_cl45_write(params->sc, phy, in elink_8481_link_reset()
11506 elink_cl45_write(params->sc, phy, in elink_8481_link_reset()
11511 struct elink_params *params) in elink_848x3_link_reset() argument
11513 struct bxe_softc *sc = params->sc; in elink_848x3_link_reset()
11520 port = params->port; in elink_848x3_link_reset()
11538 struct elink_params *params, uint8_t mode) in elink_848xx_set_link_led() argument
11540 struct bxe_softc *sc = params->sc; in elink_848xx_set_link_led()
11547 port = params->port; in elink_848xx_set_link_led()
11553 if ((params->hw_led_mode << SHARED_HW_CFG_LED_MODE_SHIFT) == in elink_848xx_set_link_led()
11589 if ((params->hw_led_mode << SHARED_HW_CFG_LED_MODE_SHIFT) == in elink_848xx_set_link_led()
11624 params->port*4) & in elink_848xx_set_link_led()
11626 params->link_flags |= in elink_848xx_set_link_led()
11632 params->port*4, in elink_848xx_set_link_led()
11646 if ((params->hw_led_mode << SHARED_HW_CFG_LED_MODE_SHIFT) == in elink_848xx_set_link_led()
11692 params->port*4) & in elink_848xx_set_link_led()
11694 params->link_flags |= in elink_848xx_set_link_led()
11700 params->port*4, in elink_848xx_set_link_led()
11715 if ((params->hw_led_mode << SHARED_HW_CFG_LED_MODE_SHIFT) == in elink_848xx_set_link_led()
11760 val = ((params->hw_led_mode << in elink_848xx_set_link_led()
11789 if (params->link_flags & in elink_848xx_set_link_led()
11791 elink_link_int_enable(params); in elink_848xx_set_link_led()
11792 params->link_flags &= in elink_848xx_set_link_led()
11813 struct elink_params *params, in elink_54618se_specific_func() argument
11816 struct bxe_softc *sc = params->sc; in elink_54618se_specific_func()
11842 struct elink_params *params, in elink_54618se_config_init() argument
11845 struct bxe_softc *sc = params->sc; in elink_54618se_config_init()
11856 port = params->port; in elink_54618se_config_init()
11858 cfg_pin = (REG_RD(sc, params->shmem_base + in elink_54618se_config_init()
11873 elink_wait_reset_complete(sc, phy, params); in elink_54618se_config_init()
11879 elink_54618se_specific_func(phy, params, ELINK_PHY_INIT); in elink_54618se_config_init()
11894 elink_calc_ieee_aneg_adv(phy, params, &vars->ieee_fc); in elink_54618se_config_init()
11986 if ((phy->flags & ELINK_FLAGS_EEE) && elink_eee_has_cap(params)) { in elink_54618se_config_init()
11996 rc = elink_eee_initial_config(params, vars, SHMEM_EEE_1G_ADV); in elink_54618se_config_init()
11999 elink_eee_disable(phy, params, vars); in elink_54618se_config_init()
12000 } else if ((params->eee_mode & ELINK_EEE_MODE_ADV_LPI) && in elink_54618se_config_init()
12002 (elink_eee_calc_timer(params) || in elink_54618se_config_init()
12003 !(params->eee_mode & ELINK_EEE_MODE_ENABLE_LPI))) { in elink_54618se_config_init()
12009 elink_eee_advertise(phy, params, vars, in elink_54618se_config_init()
12013 elink_eee_disable(phy, params, vars); in elink_54618se_config_init()
12021 if (params->feature_config_flags & in elink_54618se_config_init()
12049 struct elink_params *params, uint8_t mode) in elink_5461x_set_link_led() argument
12051 struct bxe_softc *sc = params->sc; in elink_5461x_set_link_led()
12085 struct elink_params *params) in elink_54618se_link_reset() argument
12087 struct bxe_softc *sc = params->sc; in elink_54618se_link_reset()
12098 port = params->port; in elink_54618se_link_reset()
12099 cfg_pin = (REG_RD(sc, params->shmem_base + in elink_54618se_link_reset()
12110 struct elink_params *params, in elink_54618se_read_status() argument
12113 struct bxe_softc *sc = params->sc; in elink_54618se_read_status()
12178 elink_ext_phy_resolve_fc(phy, params, vars); in elink_54618se_read_status()
12209 elink_eee_has_cap(params)) in elink_54618se_read_status()
12210 elink_eee_an_resolve(phy, params, vars); in elink_54618se_read_status()
12217 struct elink_params *params) in elink_54618se_config_loopback() argument
12219 struct bxe_softc *sc = params->sc; in elink_54618se_config_loopback()
12221 uint32_t umac_base = params->port ? GRCBASE_UMAC1 : GRCBASE_UMAC0; in elink_54618se_config_loopback()
12248 REG_WR(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4, 1); in elink_54618se_config_loopback()
12260 struct elink_params *params) in elink_7101_config_loopback() argument
12262 struct bxe_softc *sc = params->sc; in elink_7101_config_loopback()
12269 struct elink_params *params, in elink_7101_config_init() argument
12273 struct bxe_softc *sc = params->sc; in elink_7101_config_init()
12278 MISC_REGISTERS_GPIO_OUTPUT_HIGH, params->port); in elink_7101_config_init()
12280 elink_ext_phy_hw_reset(sc, params->port); in elink_7101_config_init()
12281 elink_wait_reset_complete(sc, phy, params); in elink_7101_config_init()
12289 elink_ext_phy_set_pause(params, phy, vars); in elink_7101_config_init()
12303 elink_save_spirom_version(sc, params->port, in elink_7101_config_init()
12309 struct elink_params *params, in elink_7101_read_status() argument
12312 struct bxe_softc *sc = params->sc; in elink_7101_read_status()
12338 elink_ext_phy_resolve_fc(phy, params, vars); in elink_7101_read_status()
12387 struct elink_params *params) { in elink_7101_hw_reset() argument
12389 elink_cb_gpio_write(params->sc, MISC_REGISTERS_GPIO_2, in elink_7101_hw_reset()
12390 MISC_REGISTERS_GPIO_OUTPUT_LOW, params->port); in elink_7101_hw_reset()
12392 elink_cb_gpio_write(params->sc, MISC_REGISTERS_GPIO_1, in elink_7101_hw_reset()
12393 MISC_REGISTERS_GPIO_OUTPUT_LOW, params->port); in elink_7101_hw_reset()
12397 struct elink_params *params, uint8_t mode) in elink_7101_set_link_led() argument
12400 struct bxe_softc *sc = params->sc; in elink_7101_set_link_led()
13297 static void elink_phy_def_cfg(struct elink_params *params, in elink_phy_def_cfg() argument
13301 struct bxe_softc *sc = params->sc; in elink_phy_def_cfg()
13305 link_config = REG_RD(sc, params->shmem_base + in elink_phy_def_cfg()
13307 port_feature_config[params->port].link_config2)); in elink_phy_def_cfg()
13308 phy->speed_cap_mask = REG_RD(sc, params->shmem_base + in elink_phy_def_cfg()
13311 port_hw_config[params->port].speed_capability_mask2)); in elink_phy_def_cfg()
13313 link_config = REG_RD(sc, params->shmem_base + in elink_phy_def_cfg()
13315 port_feature_config[params->port].link_config)); in elink_phy_def_cfg()
13316 phy->speed_cap_mask = REG_RD(sc, params->shmem_base + in elink_phy_def_cfg()
13319 port_hw_config[params->port].speed_capability_mask)); in elink_phy_def_cfg()
13375 uint32_t elink_phy_selection(struct elink_params *params) in elink_phy_selection() argument
13380 phy_config_swapped = params->multi_phy_config & in elink_phy_selection()
13383 prio_cfg = params->multi_phy_config & in elink_phy_selection()
13407 elink_status_t elink_phy_probe(struct elink_params *params) in elink_phy_probe() argument
13411 struct bxe_softc *sc = params->sc; in elink_phy_probe()
13413 params->num_phys = 0; in elink_phy_probe()
13419 phy_config_swapped = params->multi_phy_config & in elink_phy_probe()
13434 phy = &params->phy[actual_phy_idx]; in elink_phy_probe()
13435 if (elink_populate_phy(sc, phy_index, params->shmem_base, in elink_phy_probe()
13436 params->shmem2_base, params->port, in elink_phy_probe()
13438 params->num_phys = 0; in elink_phy_probe()
13450 if (params->feature_config_flags & in elink_phy_probe()
13454 if (!(params->feature_config_flags & in elink_phy_probe()
13458 sync_offset = params->shmem_base + in elink_phy_probe()
13460 dev_info.port_hw_config[params->port].media_type); in elink_phy_probe()
13477 elink_phy_def_cfg(params, phy, phy_index); in elink_phy_probe()
13478 params->num_phys++; in elink_phy_probe()
13481 ELINK_DEBUG_P1(sc, "End phy probe. #phys found %x\n", params->num_phys); in elink_phy_probe()
13486 static elink_status_t elink_init_e3_emul_mac(struct elink_params *params, in elink_init_e3_emul_mac() argument
13489 struct bxe_softc *sc = params->sc; in elink_init_e3_emul_mac()
13490 vars->line_speed = params->req_line_speed[0]; in elink_init_e3_emul_mac()
13492 if (params->req_line_speed[0] == ELINK_SPEED_AUTO_NEG) { in elink_init_e3_emul_mac()
13493 if (params->feature_config_flags & in elink_init_e3_emul_mac()
13502 if ((params->feature_config_flags & in elink_init_e3_emul_mac()
13505 " disabled!\n", params->req_line_speed[0]); in elink_init_e3_emul_mac()
13528 if (params->loopback_mode == ELINK_LOOPBACK_UMAC) in elink_init_e3_emul_mac()
13529 elink_umac_enable(params, vars, 1); in elink_init_e3_emul_mac()
13531 elink_umac_enable(params, vars, 0); in elink_init_e3_emul_mac()
13534 if (params->feature_config_flags & in elink_init_e3_emul_mac()
13537 " disabled!\n", params->req_line_speed[0]); in elink_init_e3_emul_mac()
13554 if (params->loopback_mode == ELINK_LOOPBACK_XMAC) in elink_init_e3_emul_mac()
13555 elink_xmac_enable(params, vars, 1); in elink_init_e3_emul_mac()
13557 elink_xmac_enable(params, vars, 0); in elink_init_e3_emul_mac()
13562 static elink_status_t elink_init_emul(struct elink_params *params, in elink_init_emul() argument
13565 struct bxe_softc *sc = params->sc; in elink_init_emul()
13567 if (elink_init_e3_emul_mac(params, vars) != in elink_init_emul()
13571 if (params->feature_config_flags & in elink_init_emul()
13576 if (params->loopback_mode == in elink_init_emul()
13578 elink_emac_enable(params, vars, 1); in elink_init_emul()
13580 elink_emac_enable(params, vars, 0); in elink_init_emul()
13585 if (params->loopback_mode == in elink_init_emul()
13587 elink_bmac_enable(params, vars, 1, 1); in elink_init_emul()
13589 elink_bmac_enable(params, vars, 0, 1); in elink_init_emul()
13597 elink_pbf_update(params, vars->flow_ctrl, in elink_init_emul()
13600 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_emul()
13603 elink_update_mng(params, vars->link_status); in elink_init_emul()
13608 static elink_status_t elink_init_fpga(struct elink_params *params, in elink_init_fpga() argument
13612 struct bxe_softc *sc = params->sc; in elink_init_fpga()
13622 vars->line_speed = params->req_line_speed[0]; in elink_init_fpga()
13640 params->req_line_speed[0]); in elink_init_fpga()
13644 if (params->loopback_mode == ELINK_LOOPBACK_UMAC) in elink_init_fpga()
13645 elink_umac_enable(params, vars, 1); in elink_init_fpga()
13647 elink_umac_enable(params, vars, 0); in elink_init_fpga()
13651 if (params->loopback_mode == ELINK_LOOPBACK_EMAC) in elink_init_fpga()
13652 elink_emac_enable(params, vars, 1); in elink_init_fpga()
13654 elink_emac_enable(params, vars, 0); in elink_init_fpga()
13659 elink_pbf_update(params, vars->flow_ctrl, in elink_init_fpga()
13662 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_fpga()
13665 elink_update_mng(params, vars->link_status); in elink_init_fpga()
13669 static void elink_init_bmac_loopback(struct elink_params *params, in elink_init_bmac_loopback() argument
13672 struct bxe_softc *sc = params->sc; in elink_init_bmac_loopback()
13681 elink_xgxs_deassert(params); in elink_init_bmac_loopback()
13684 elink_bmac_enable(params, vars, 1, 1); in elink_init_bmac_loopback()
13686 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_bmac_loopback()
13689 static void elink_init_emac_loopback(struct elink_params *params, in elink_init_emac_loopback() argument
13692 struct bxe_softc *sc = params->sc; in elink_init_emac_loopback()
13701 elink_xgxs_deassert(params); in elink_init_emac_loopback()
13703 elink_emac_enable(params, vars, 1); in elink_init_emac_loopback()
13704 elink_emac_program(params, vars); in elink_init_emac_loopback()
13705 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_emac_loopback()
13708 static void elink_init_xmac_loopback(struct elink_params *params, in elink_init_xmac_loopback() argument
13711 struct bxe_softc *sc = params->sc; in elink_init_xmac_loopback()
13713 if (!params->req_line_speed[0]) in elink_init_xmac_loopback()
13716 vars->line_speed = params->req_line_speed[0]; in elink_init_xmac_loopback()
13724 elink_set_aer_mmd(params, &params->phy[0]); in elink_init_xmac_loopback()
13725 elink_warpcore_reset_lane(sc, &params->phy[0], 0); in elink_init_xmac_loopback()
13726 params->phy[ELINK_INT_PHY].config_loopback( in elink_init_xmac_loopback()
13727 &params->phy[ELINK_INT_PHY], in elink_init_xmac_loopback()
13728 params); in elink_init_xmac_loopback()
13730 elink_xmac_enable(params, vars, 1); in elink_init_xmac_loopback()
13731 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_xmac_loopback()
13734 static void elink_init_umac_loopback(struct elink_params *params, in elink_init_umac_loopback() argument
13737 struct bxe_softc *sc = params->sc; in elink_init_umac_loopback()
13744 elink_umac_enable(params, vars, 1); in elink_init_umac_loopback()
13746 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_umac_loopback()
13749 static void elink_init_xgxs_loopback(struct elink_params *params, in elink_init_xgxs_loopback() argument
13752 struct bxe_softc *sc = params->sc; in elink_init_xgxs_loopback()
13753 struct elink_phy *int_phy = &params->phy[ELINK_INT_PHY]; in elink_init_xgxs_loopback()
13757 if (params->req_line_speed[0] == ELINK_SPEED_1000) in elink_init_xgxs_loopback()
13759 else if ((params->req_line_speed[0] == ELINK_SPEED_20000) || in elink_init_xgxs_loopback()
13766 elink_xgxs_deassert(params); in elink_init_xgxs_loopback()
13767 elink_link_initialize(params, vars); in elink_init_xgxs_loopback()
13769 if (params->req_line_speed[0] == ELINK_SPEED_1000) { in elink_init_xgxs_loopback()
13771 elink_umac_enable(params, vars, 0); in elink_init_xgxs_loopback()
13773 elink_emac_program(params, vars); in elink_init_xgxs_loopback()
13774 elink_emac_enable(params, vars, 0); in elink_init_xgxs_loopback()
13778 elink_xmac_enable(params, vars, 0); in elink_init_xgxs_loopback()
13780 elink_bmac_enable(params, vars, 0, 1); in elink_init_xgxs_loopback()
13783 if (params->loopback_mode == ELINK_LOOPBACK_XGXS) { in elink_init_xgxs_loopback()
13785 int_phy->config_loopback(int_phy, params); in elink_init_xgxs_loopback()
13790 phy_index < params->num_phys; phy_index++) in elink_init_xgxs_loopback()
13791 if (params->phy[phy_index].config_loopback) in elink_init_xgxs_loopback()
13792 params->phy[phy_index].config_loopback( in elink_init_xgxs_loopback()
13793 &params->phy[phy_index], in elink_init_xgxs_loopback()
13794 params); in elink_init_xgxs_loopback()
13796 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_init_xgxs_loopback()
13798 elink_set_led(params, vars, ELINK_LED_MODE_OPER, vars->line_speed); in elink_init_xgxs_loopback()
13801 void elink_set_rx_filter(struct elink_params *params, uint8_t en) in elink_set_rx_filter() argument
13803 struct bxe_softc *sc = params->sc; in elink_set_rx_filter()
13809 REG_WR(sc, NIG_REG_LLH0_BRB1_DRV_MASK + params->port*4, val); in elink_set_rx_filter()
13812 REG_WR(sc, NIG_REG_LLH0_BRB1_DRV_MASK_MF + params->port*4, in elink_set_rx_filter()
13816 REG_WR(sc, (params->port ? NIG_REG_LLH1_BRB1_NOT_MCP : in elink_set_rx_filter()
13819 static elink_status_t elink_avoid_link_flap(struct elink_params *params, in elink_avoid_link_flap() argument
13824 struct bxe_softc *sc = params->sc; in elink_avoid_link_flap()
13826 elink_set_mdio_emac_per_phy(sc, params); in elink_avoid_link_flap()
13828 elink_link_status_update(params, vars); in elink_avoid_link_flap()
13835 for (phy_idx = ELINK_INT_PHY; phy_idx < params->num_phys; phy_idx++) { in elink_avoid_link_flap()
13836 struct elink_phy *phy = &params->phy[phy_idx]; in elink_avoid_link_flap()
13839 phy->phy_specific_func(phy, params, ELINK_PHY_INIT); in elink_avoid_link_flap()
13844 elink_verify_sfp_module(phy, params); in elink_avoid_link_flap()
13846 lfa_sts = REG_RD(sc, params->lfa_base + in elink_avoid_link_flap()
13858 params->port)); in elink_avoid_link_flap()
13862 params->port)); in elink_avoid_link_flap()
13865 elink_umac_enable(params, vars, 0); in elink_avoid_link_flap()
13867 elink_xmac_enable(params, vars, 0); in elink_avoid_link_flap()
13870 elink_emac_enable(params, vars, 0); in elink_avoid_link_flap()
13872 elink_bmac_enable(params, vars, 0, !dont_clear_stat); in elink_avoid_link_flap()
13883 REG_WR(sc, params->lfa_base + in elink_avoid_link_flap()
13887 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_avoid_link_flap()
13890 elink_link_int_enable(params); in elink_avoid_link_flap()
13894 static void elink_cannot_avoid_link_flap(struct elink_params *params, in elink_cannot_avoid_link_flap() argument
13899 struct bxe_softc *sc = params->sc; in elink_cannot_avoid_link_flap()
13901 elink_link_reset(params, vars, 1); in elink_cannot_avoid_link_flap()
13903 if (!params->lfa_base) in elink_cannot_avoid_link_flap()
13906 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13908 params->req_duplex[0] | (params->req_duplex[1] << 16)); in elink_cannot_avoid_link_flap()
13910 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13912 params->req_flow_ctrl[0] | (params->req_flow_ctrl[1] << 16)); in elink_cannot_avoid_link_flap()
13914 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13916 params->req_line_speed[0] | (params->req_line_speed[1] << 16)); in elink_cannot_avoid_link_flap()
13919 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13922 params->speed_cap_mask[cfg_idx]); in elink_cannot_avoid_link_flap()
13925 tmp_val = REG_RD(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13928 tmp_val |= params->req_fc_auto_adv; in elink_cannot_avoid_link_flap()
13930 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13933 lfa_sts = REG_RD(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13949 REG_WR(sc, params->lfa_base + in elink_cannot_avoid_link_flap()
13954 elink_status_t elink_phy_init(struct elink_params *params, struct elink_vars *vars) in elink_phy_init() argument
13957 struct bxe_softc *sc = params->sc; in elink_phy_init()
13960 params->req_line_speed[0], params->req_flow_ctrl[0]); in elink_phy_init()
13962 params->req_line_speed[1], params->req_flow_ctrl[1]); in elink_phy_init()
13963 ELINK_DEBUG_P1(sc, "req_adv_flow_ctrl 0x%x\n", params->req_fc_auto_adv); in elink_phy_init()
13973 params->link_flags = ELINK_PHY_INITIALIZED; in elink_phy_init()
13975 elink_set_rx_filter(params, 1); in elink_phy_init()
13976 elink_chng_link_count(params, 1); in elink_phy_init()
13978 lfa_status = elink_check_lfa(params); in elink_phy_init()
13981 params->port, params->loopback_mode, params->req_duplex[0]); in elink_phy_init()
13983 params->switch_cfg, params->lane_config, params->req_duplex[1]); in elink_phy_init()
13985 params->chip_id, params->feature_config_flags, params->num_phys); in elink_phy_init()
13987 params->rsrv, params->eee_mode, params->hw_led_mode); in elink_phy_init()
13989 params->multi_phy_config, params->req_fc_auto_adv, params->link_flags); in elink_phy_init()
13991 params->lfa_base, params->link_attr_sync); in elink_phy_init()
13994 return elink_avoid_link_flap(params, vars); in elink_phy_init()
13999 elink_cannot_avoid_link_flap(params, vars, lfa_status); in elink_phy_init()
14002 elink_bits_dis(sc, NIG_REG_MASK_INTERRUPT_PORT0 + params->port*4, in elink_phy_init()
14008 if (!(params->feature_config_flags & in elink_phy_init()
14012 elink_emac_init(params, vars); in elink_phy_init()
14014 if (params->feature_config_flags & ELINK_FEATURE_CONFIG_PFC_ENABLED) in elink_phy_init()
14017 if ((params->num_phys == 0) && in elink_phy_init()
14022 set_phy_vars(params, vars); in elink_phy_init()
14024 ELINK_DEBUG_P1(sc, "Num of phys on board: %d\n", params->num_phys); in elink_phy_init()
14027 return elink_init_fpga(params, vars); in elink_phy_init()
14032 return elink_init_emul(params, vars); in elink_phy_init()
14035 switch (params->loopback_mode) { in elink_phy_init()
14037 elink_init_bmac_loopback(params, vars); in elink_phy_init()
14040 elink_init_emac_loopback(params, vars); in elink_phy_init()
14043 elink_init_xmac_loopback(params, vars); in elink_phy_init()
14046 elink_init_umac_loopback(params, vars); in elink_phy_init()
14050 elink_init_xgxs_loopback(params, vars); in elink_phy_init()
14054 if (params->switch_cfg == ELINK_SWITCH_CFG_10G) in elink_phy_init()
14055 elink_xgxs_deassert(params); in elink_phy_init()
14057 elink_serdes_deassert(sc, params->port); in elink_phy_init()
14059 elink_link_initialize(params, vars); in elink_phy_init()
14061 elink_link_int_enable(params); in elink_phy_init()
14064 elink_update_mng(params, vars->link_status); in elink_phy_init()
14066 elink_update_mng_eee(params, vars->eee_status); in elink_phy_init()
14070 elink_status_t elink_link_reset(struct elink_params *params, struct elink_vars *vars, in elink_link_reset() argument
14073 struct bxe_softc *sc = params->sc; in elink_link_reset()
14074 uint8_t phy_index, port = params->port, clear_latch_ind = 0; in elink_link_reset()
14078 elink_chng_link_count(params, 1); in elink_link_reset()
14079 elink_update_mng(params, vars->link_status); in elink_link_reset()
14082 elink_update_mng_eee(params, vars->eee_status); in elink_link_reset()
14100 if (!(params->feature_config_flags & in elink_link_reset()
14104 elink_set_bmac_rx(sc, params->chip_id, port, 0); in elink_link_reset()
14107 if (!(params->feature_config_flags & in elink_link_reset()
14112 elink_set_xmac_rxtx(params, 0); in elink_link_reset()
14113 elink_set_umac_rxtx(params, 0); in elink_link_reset()
14124 elink_set_mdio_emac_per_phy(sc, params); in elink_link_reset()
14125 elink_set_led(params, vars, ELINK_LED_MODE_OFF, 0); in elink_link_reset()
14128 for (phy_index = ELINK_EXT_PHY1; phy_index < params->num_phys; in elink_link_reset()
14130 if (params->phy[phy_index].link_reset) { in elink_link_reset()
14131 elink_set_aer_mmd(params, in elink_link_reset()
14132 &params->phy[phy_index]); in elink_link_reset()
14133 params->phy[phy_index].link_reset( in elink_link_reset()
14134 &params->phy[phy_index], in elink_link_reset()
14135 params); in elink_link_reset()
14137 if (params->phy[phy_index].flags & in elink_link_reset()
14152 if (params->phy[ELINK_INT_PHY].link_reset) in elink_link_reset()
14153 params->phy[ELINK_INT_PHY].link_reset( in elink_link_reset()
14154 &params->phy[ELINK_INT_PHY], params); in elink_link_reset()
14164 uint32_t xmac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; in elink_link_reset()
14165 elink_set_xumac_nig(params, 0, 0); in elink_link_reset()
14175 elink_status_t elink_lfa_reset(struct elink_params *params, in elink_lfa_reset() argument
14178 struct bxe_softc *sc = params->sc; in elink_lfa_reset()
14181 params->link_flags &= ~ELINK_PHY_INITIALIZED; in elink_lfa_reset()
14182 if (!params->lfa_base) in elink_lfa_reset()
14183 return elink_link_reset(params, vars, 1); in elink_lfa_reset()
14188 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 1); in elink_lfa_reset()
14195 elink_set_bmac_rx(sc, params->chip_id, params->port, 0); in elink_lfa_reset()
14198 elink_set_xmac_rxtx(params, 0); in elink_lfa_reset()
14199 elink_set_umac_rxtx(params, 0); in elink_lfa_reset()
14207 elink_set_rx_filter(params, 0); in elink_lfa_reset()
14216 elink_set_bmac_rx(sc, params->chip_id, params->port, 1); in elink_lfa_reset()
14219 elink_set_xmac_rxtx(params, 1); in elink_lfa_reset()
14220 elink_set_umac_rxtx(params, 1); in elink_lfa_reset()
14223 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_lfa_reset()
14666 static void elink_check_over_curr(struct elink_params *params, in elink_check_over_curr() argument
14669 struct bxe_softc *sc = params->sc; in elink_check_over_curr()
14671 uint8_t port = params->port; in elink_check_over_curr()
14674 cfg_pin = (REG_RD(sc, params->shmem_base + in elink_check_over_curr()
14686 …elink_cb_event_log(sc, ELINK_LOG_ID_OVER_CURRENT, params->port); //"Error: Power fault on Port %d… in elink_check_over_curr()
14694 elink_warpcore_power_module(params, 0); in elink_check_over_curr()
14701 static uint8_t elink_analyze_link_error(struct elink_params *params, in elink_analyze_link_error() argument
14705 struct bxe_softc *sc = params->sc; in elink_analyze_link_error()
14741 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 1); in elink_analyze_link_error()
14754 REG_WR(sc, NIG_REG_EGRESS_DRAIN0_MODE + params->port*4, 0); in elink_analyze_link_error()
14756 elink_sync_link(params, vars); in elink_analyze_link_error()
14758 elink_set_led(params, vars, led_mode, ELINK_SPEED_10000); in elink_analyze_link_error()
14761 elink_update_mng(params, vars->link_status); in elink_analyze_link_error()
14781 elink_status_t elink_check_half_open_conn(struct elink_params *params, in elink_check_half_open_conn() argument
14785 struct bxe_softc *sc = params->sc; in elink_check_half_open_conn()
14790 (REG_RD(sc, NIG_REG_EGRESS_EMAC0_PORT + params->port*4))) in elink_check_half_open_conn()
14801 mac_base = (params->port) ? GRCBASE_XMAC1 : GRCBASE_XMAC0; in elink_check_half_open_conn()
14811 elink_analyze_link_error(params, vars, lss_status, in elink_check_half_open_conn()
14815 (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port)) { in elink_check_half_open_conn()
14819 mac_base = params->port ? NIG_REG_INGRESS_BMAC1_MEM : in elink_check_half_open_conn()
14830 elink_analyze_link_error(params, vars, lss_status, in elink_check_half_open_conn()
14837 struct elink_params *params, in elink_sfp_tx_fault_detection() argument
14840 struct bxe_softc *sc = params->sc; in elink_sfp_tx_fault_detection()
14842 uint8_t led_change, port = params->port; in elink_sfp_tx_fault_detection()
14845 cfg_pin = (REG_RD(sc, params->shmem_base + offsetof(struct shmem_region, in elink_sfp_tx_fault_detection()
14855 led_change = elink_analyze_link_error(params, vars, value, in elink_sfp_tx_fault_detection()
14875 elink_set_e3_module_fault_led(params, led_mode); in elink_sfp_tx_fault_detection()
14879 static void elink_kr2_recovery(struct elink_params *params, in elink_kr2_recovery() argument
14883 struct bxe_softc *sc = params->sc; in elink_kr2_recovery()
14885 elink_warpcore_enable_AN_KR2(phy, params, vars); in elink_kr2_recovery()
14886 elink_warpcore_restart_AN_KR(phy, params); in elink_kr2_recovery()
14889 static void elink_check_kr2_wa(struct elink_params *params, in elink_check_kr2_wa() argument
14893 struct bxe_softc *sc = params->sc; in elink_check_kr2_wa()
14907 sigdet = elink_warpcore_get_sigdet(phy, params); in elink_check_kr2_wa()
14909 if (!(params->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { in elink_check_kr2_wa()
14910 elink_kr2_recovery(params, vars, phy); in elink_check_kr2_wa()
14916 lane = elink_get_warpcore_lane(phy, params); in elink_check_kr2_wa()
14923 elink_set_aer_mmd(params, phy); in elink_check_kr2_wa()
14927 if (!(params->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { in elink_check_kr2_wa()
14928 elink_kr2_recovery(params, vars, phy); in elink_check_kr2_wa()
14943 if (!(params->link_attr_sync & LINK_ATTR_SYNC_KR2_ENABLE)) { in elink_check_kr2_wa()
14947 elink_kr2_recovery(params, vars, phy); in elink_check_kr2_wa()
14955 elink_disable_kr2(params, vars, phy); in elink_check_kr2_wa()
14957 elink_warpcore_restart_AN_KR(phy, params); in elink_check_kr2_wa()
14962 void elink_period_func(struct elink_params *params, struct elink_vars *vars) in elink_period_func() argument
14965 struct bxe_softc *sc = params->sc; in elink_period_func()
14967 if (params->phy[phy_idx].flags & ELINK_FLAGS_TX_ERROR_CHECK) { in elink_period_func()
14968 elink_set_aer_mmd(params, &params->phy[phy_idx]); in elink_period_func()
14969 if (elink_check_half_open_conn(params, vars, 1) != in elink_period_func()
14977 struct elink_phy *phy = &params->phy[ELINK_INT_PHY]; in elink_period_func()
14978 elink_set_aer_mmd(params, phy); in elink_period_func()
14983 elink_check_kr2_wa(params, vars, phy); in elink_period_func()
14984 elink_check_over_curr(params, vars); in elink_period_func()
14986 elink_warpcore_config_runtime(phy, params, vars); in elink_period_func()
14988 if ((REG_RD(sc, params->shmem_base + in elink_period_func()
14990 port_hw_config[params->port].default_cfg)) in elink_period_func()
14993 if (elink_is_sfp_module_plugged(phy, params)) { in elink_period_func()
14994 elink_sfp_tx_fault_detection(phy, params, vars); in elink_period_func()
15001 elink_update_mng(params, vars->link_status); in elink_period_func()
15028 void elink_hw_reset_phy(struct elink_params *params) in elink_hw_reset_phy() argument
15031 struct bxe_softc *sc = params->sc; in elink_hw_reset_phy()
15032 elink_update_mng(params, 0); in elink_hw_reset_phy()
15033 elink_bits_dis(sc, NIG_REG_MASK_INTERRUPT_PORT0 + params->port*4, in elink_hw_reset_phy()
15041 if (params->phy[phy_index].hw_reset) { in elink_hw_reset_phy()
15042 params->phy[phy_index].hw_reset( in elink_hw_reset_phy()
15043 &params->phy[phy_index], in elink_hw_reset_phy()
15044 params); in elink_hw_reset_phy()
15045 params->phy[phy_index] = phy_null; in elink_hw_reset_phy()