Lines Matching +full:link +full:- +full:loss +full:- +full:low
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
71 #define DRV_NAME "thunder-BGX"
138 bgx->dev = dev; in thunder_bgx_attach()
141 lmac->bgx = bgx; in thunder_bgx_attach()
144 /* Allocate resources - configuration registers */ in thunder_bgx_attach()
146 bgx->reg_base = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, in thunder_bgx_attach()
148 if (bgx->reg_base == NULL) { in thunder_bgx_attach()
154 bgx->bgx_id = (rman_get_start(bgx->reg_base) >> BGX_NODE_ID_SHIFT) & in thunder_bgx_attach()
156 bgx->bgx_id += nic_get_node_id(bgx->reg_base) * MAX_BGX_PER_CN88XX; in thunder_bgx_attach()
158 bgx_vnic[bgx->bgx_id] = bgx; in thunder_bgx_attach()
168 for (lmacid = 0; lmacid < bgx->lmac_count; lmacid++) { in thunder_bgx_attach()
172 bgx->bgx_id, lmacid); in thunder_bgx_attach()
180 bgx_vnic[bgx->bgx_id] = NULL; in thunder_bgx_attach()
182 rman_get_rid(bgx->reg_base), bgx->reg_base); in thunder_bgx_attach()
198 bgx = lmac->bgx; in thunder_bgx_detach()
200 for (lmacid = 0; lmacid < bgx->lmac_count; lmacid++) in thunder_bgx_detach()
203 bgx_vnic[bgx->bgx_id] = NULL; in thunder_bgx_detach()
205 rman_get_rid(bgx->reg_base), bgx->reg_base); in thunder_bgx_detach()
220 return (bus_read_8(bgx->reg_base, addr)); in bgx_reg_read()
230 bus_write_8(bgx->reg_base, addr, val); in bgx_reg_write()
240 bus_write_8(bgx->reg_base, addr, val | bus_read_8(bgx->reg_base, addr)); in bgx_reg_modify()
258 timeout--; in bgx_poll_reg()
286 return (bgx->lmac_count); in bgx_get_lmac_count()
291 /* Returns the current link status of LMAC */
295 struct bgx_link_status *link = (struct bgx_link_status *)status; in bgx_get_lmac_link_state() local
303 lmac = &bgx->lmac[lmacid]; in bgx_get_lmac_link_state()
304 link->link_up = lmac->link_up; in bgx_get_lmac_link_state()
305 link->duplex = lmac->last_duplex; in bgx_get_lmac_link_state()
306 link->speed = lmac->last_speed; in bgx_get_lmac_link_state()
315 return (bgx->lmac[lmacid].mac); in bgx_get_lmac_mac()
328 memcpy(bgx->lmac[lmacid].mac, mac, ETHER_ADDR_LEN); in bgx_set_lmac_mac()
334 struct bgx *bgx = lmac->bgx; in bgx_sgmii_change_link_state()
339 cmr_cfg = bgx_reg_read(bgx, lmac->lmacid, BGX_CMRX_CFG); in bgx_sgmii_change_link_state()
341 bgx_reg_write(bgx, lmac->lmacid, BGX_CMRX_CFG, cmr_cfg); in bgx_sgmii_change_link_state()
343 port_cfg = bgx_reg_read(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG); in bgx_sgmii_change_link_state()
344 misc_ctl = bgx_reg_read(bgx, lmac->lmacid, BGX_GMP_PCS_MISCX_CTL); in bgx_sgmii_change_link_state()
346 if (lmac->link_up) { in bgx_sgmii_change_link_state()
349 port_cfg |= (lmac->last_duplex << 2); in bgx_sgmii_change_link_state()
354 switch (lmac->last_speed) { in bgx_sgmii_change_link_state()
361 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_SLOT, 64); in bgx_sgmii_change_link_state()
362 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_BURST, 0); in bgx_sgmii_change_link_state()
370 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_SLOT, 64); in bgx_sgmii_change_link_state()
371 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_BURST, 0); in bgx_sgmii_change_link_state()
379 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_SLOT, 512); in bgx_sgmii_change_link_state()
380 if (lmac->last_duplex) in bgx_sgmii_change_link_state()
381 bgx_reg_write(bgx, lmac->lmacid, in bgx_sgmii_change_link_state()
384 bgx_reg_write(bgx, lmac->lmacid, in bgx_sgmii_change_link_state()
390 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_PCS_MISCX_CTL, misc_ctl); in bgx_sgmii_change_link_state()
391 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG, port_cfg); in bgx_sgmii_change_link_state()
393 port_cfg = bgx_reg_read(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG); in bgx_sgmii_change_link_state()
397 bgx_reg_write(bgx, lmac->lmacid, BGX_CMRX_CFG, cmr_cfg); in bgx_sgmii_change_link_state()
404 int link, duplex, speed; in bgx_lmac_handler() local
410 err = LMAC_MEDIA_STATUS(lmac->phy_if_dev, lmac->lmacid, in bgx_lmac_handler()
411 &link, &duplex, &speed); in bgx_lmac_handler()
415 if (!link && lmac->last_link) in bgx_lmac_handler()
416 link_changed = -1; in bgx_lmac_handler()
418 if (link && in bgx_lmac_handler()
419 (lmac->last_duplex != duplex || in bgx_lmac_handler()
420 lmac->last_link != link || in bgx_lmac_handler()
421 lmac->last_speed != speed)) { in bgx_lmac_handler()
425 lmac->last_link = link; in bgx_lmac_handler()
426 lmac->last_speed = speed; in bgx_lmac_handler()
427 lmac->last_duplex = duplex; in bgx_lmac_handler()
433 lmac->link_up = true; in bgx_lmac_handler()
435 lmac->link_up = false; in bgx_lmac_handler()
437 if (lmac->is_sgmii) in bgx_lmac_handler()
443 callout_reset(&lmac->check_link, hz * 2, bgx_lmac_handler, lmac); in bgx_lmac_handler()
477 while (bgx->lmac[lmac].dmac > 0) { in bgx_flush_dmac_addrs()
478 offset = ((bgx->lmac[lmac].dmac - 1) * sizeof(uint64_t)) + in bgx_flush_dmac_addrs()
481 bgx->lmac[lmac].dmac--; in bgx_flush_dmac_addrs()
505 if (bgx->lmac[lmac].dmac == MAX_DMAC_PER_LMAC) { in bgx_add_dmac_addr()
506 device_printf(bgx->dev, in bgx_add_dmac_addr()
512 if (bgx->lmac[lmac].dmac == MAX_DMAC_PER_LMAC_TNS_BYPASS_MODE) in bgx_add_dmac_addr()
513 bgx->lmac[lmac].dmac = 1; in bgx_add_dmac_addr()
515 offset = (bgx->lmac[lmac].dmac * sizeof(uint64_t)) + in bgx_add_dmac_addr()
518 bgx->lmac[lmac].dmac++; in bgx_add_dmac_addr()
538 lmac = &bgx->lmac[lmac_idx]; in bgx_lmac_internal_loopback()
539 if (lmac->is_sgmii) { in bgx_lmac_internal_loopback()
577 device_printf(bgx->dev, "BGX PCS reset not completed\n"); in bgx_lmac_sgmii_init()
589 device_printf(bgx->dev, "BGX AN_CPT not completed\n"); in bgx_lmac_sgmii_init()
605 device_printf(bgx->dev, "BGX SPU reset not completed\n"); in bgx_lmac_xaui_init()
616 if (bgx->lmac_type != BGX_MODE_RXAUI) { in bgx_lmac_xaui_init()
632 if (bgx->use_training) { in bgx_lmac_xaui_init()
655 if (bgx->lmac_type == BGX_MODE_10G_KR) in bgx_lmac_xaui_init()
657 else if (bgx->lmac_type == BGX_MODE_40G_KR) in bgx_lmac_xaui_init()
681 bgx_reg_modify(bgx, lmacid, BGX_SMUX_TX_THRESH, (0x100 - 1)); in bgx_lmac_xaui_init()
691 struct bgx *bgx = lmac->bgx; in bgx_xaui_check_link()
692 int lmacid = lmac->lmacid; in bgx_xaui_check_link()
693 int lmac_type = bgx->lmac_type; in bgx_xaui_check_link()
697 if (bgx->use_training) { in bgx_xaui_check_link()
712 device_printf(bgx->dev, "BGX SPU reset not completed\n"); in bgx_xaui_check_link()
720 device_printf(bgx->dev, in bgx_xaui_check_link()
727 device_printf(bgx->dev, in bgx_xaui_check_link()
736 device_printf(bgx->dev, "Receive fault, retry training\n"); in bgx_xaui_check_link()
737 if (bgx->use_training) { in bgx_xaui_check_link()
756 device_printf(bgx->dev, "SMU RX link not okay\n"); in bgx_xaui_check_link()
763 device_printf(bgx->dev, "SMU RX not idle\n"); in bgx_xaui_check_link()
770 device_printf(bgx->dev, "SMU TX not idle\n"); in bgx_xaui_check_link()
776 device_printf(bgx->dev, "Receive fault\n"); in bgx_xaui_check_link()
780 /* Receive link is latching low. Force it high and verify it */ in bgx_xaui_check_link()
784 device_printf(bgx->dev, "SPU receive link down\n"); in bgx_xaui_check_link()
798 uint64_t link; in bgx_poll_for_link() local
802 /* Receive link is latching low. Force it high and verify it */ in bgx_poll_for_link()
803 bgx_reg_modify(lmac->bgx, lmac->lmacid, in bgx_poll_for_link()
805 bgx_poll_reg(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1, in bgx_poll_for_link()
808 link = bgx_reg_read(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1); in bgx_poll_for_link()
809 if (link & SPU_STATUS1_RCV_LNK) { in bgx_poll_for_link()
810 lmac->link_up = 1; in bgx_poll_for_link()
811 if (lmac->bgx->lmac_type == BGX_MODE_XLAUI) in bgx_poll_for_link()
812 lmac->last_speed = 40000; in bgx_poll_for_link()
814 lmac->last_speed = 10000; in bgx_poll_for_link()
815 lmac->last_duplex = 1; in bgx_poll_for_link()
817 lmac->link_up = 0; in bgx_poll_for_link()
820 if (lmac->last_link != lmac->link_up) { in bgx_poll_for_link()
821 lmac->last_link = lmac->link_up; in bgx_poll_for_link()
822 if (lmac->link_up) in bgx_poll_for_link()
826 callout_reset(&lmac->check_link, hz * 2, bgx_poll_for_link, lmac); in bgx_poll_for_link()
832 uint64_t __unused dmac_bcast = (1UL << 48) - 1; in bgx_lmac_enable()
836 lmac = &bgx->lmac[lmacid]; in bgx_lmac_enable()
837 lmac->bgx = bgx; in bgx_lmac_enable()
839 if (bgx->lmac_type == BGX_MODE_SGMII) { in bgx_lmac_enable()
840 lmac->is_sgmii = 1; in bgx_lmac_enable()
842 return -1; in bgx_lmac_enable()
844 lmac->is_sgmii = 0; in bgx_lmac_enable()
845 if (bgx_lmac_xaui_init(bgx, lmacid, bgx->lmac_type)) in bgx_lmac_enable()
846 return -1; in bgx_lmac_enable()
849 if (lmac->is_sgmii) { in bgx_lmac_enable()
853 bgx_reg_write(bgx, lmacid, BGX_GMP_GMI_TXX_MIN_PKT, 60 - 1); in bgx_lmac_enable()
865 /* Restore default cfg, incase low level firmware changed it */ in bgx_lmac_enable()
869 bgx_add_dmac_addr(dmac_bcast, 0, bgx->bgx_id, lmacid); in bgx_lmac_enable()
871 if ((bgx->lmac_type != BGX_MODE_XFI) && in bgx_lmac_enable()
872 (bgx->lmac_type != BGX_MODE_XAUI) && in bgx_lmac_enable()
873 (bgx->lmac_type != BGX_MODE_XLAUI) && in bgx_lmac_enable()
874 (bgx->lmac_type != BGX_MODE_40G_KR) && in bgx_lmac_enable()
875 (bgx->lmac_type != BGX_MODE_10G_KR)) { in bgx_lmac_enable()
876 if (lmac->phy_if_dev == NULL) { in bgx_lmac_enable()
877 device_printf(bgx->dev, in bgx_lmac_enable()
882 if (LMAC_PHY_CONNECT(lmac->phy_if_dev, lmac->phyaddr, in bgx_lmac_enable()
884 device_printf(bgx->dev, in bgx_lmac_enable()
888 mtx_init(&lmac->check_link_mtx, "BGX link poll", NULL, MTX_DEF); in bgx_lmac_enable()
889 callout_init_mtx(&lmac->check_link, &lmac->check_link_mtx, 0); in bgx_lmac_enable()
890 mtx_lock(&lmac->check_link_mtx); in bgx_lmac_enable()
892 mtx_unlock(&lmac->check_link_mtx); in bgx_lmac_enable()
894 mtx_init(&lmac->check_link_mtx, "BGX link poll", NULL, MTX_DEF); in bgx_lmac_enable()
895 callout_init_mtx(&lmac->check_link, &lmac->check_link_mtx, 0); in bgx_lmac_enable()
896 mtx_lock(&lmac->check_link_mtx); in bgx_lmac_enable()
898 mtx_unlock(&lmac->check_link_mtx); in bgx_lmac_enable()
910 lmac = &bgx->lmac[lmacid]; in bgx_lmac_disable()
913 callout_drain(&lmac->check_link); in bgx_lmac_disable()
914 mtx_destroy(&lmac->check_link_mtx); in bgx_lmac_disable()
921 if ((bgx->lmac_type != BGX_MODE_XFI) && in bgx_lmac_disable()
922 (bgx->lmac_type != BGX_MODE_XLAUI) && in bgx_lmac_disable()
923 (bgx->lmac_type != BGX_MODE_40G_KR) && in bgx_lmac_disable()
924 (bgx->lmac_type != BGX_MODE_10G_KR)) { in bgx_lmac_disable()
925 if (lmac->phy_if_dev == NULL) { in bgx_lmac_disable()
926 device_printf(bgx->dev, in bgx_lmac_disable()
930 if (LMAC_PHY_DISCONNECT(lmac->phy_if_dev, lmac->phyaddr, in bgx_lmac_disable()
932 device_printf(bgx->dev, in bgx_lmac_disable()
936 lmac->phy_if_dev = NULL; in bgx_lmac_disable()
945 switch (bgx->qlm_mode) { in bgx_set_num_ports()
947 bgx->lmac_count = 4; in bgx_set_num_ports()
948 bgx->lmac_type = BGX_MODE_SGMII; in bgx_set_num_ports()
949 bgx->lane_to_sds = 0; in bgx_set_num_ports()
952 bgx->lmac_count = 1; in bgx_set_num_ports()
953 bgx->lmac_type = BGX_MODE_XAUI; in bgx_set_num_ports()
954 bgx->lane_to_sds = 0xE4; in bgx_set_num_ports()
957 bgx->lmac_count = 2; in bgx_set_num_ports()
958 bgx->lmac_type = BGX_MODE_RXAUI; in bgx_set_num_ports()
959 bgx->lane_to_sds = 0xE4; in bgx_set_num_ports()
962 bgx->lmac_count = 4; in bgx_set_num_ports()
963 bgx->lmac_type = BGX_MODE_XFI; in bgx_set_num_ports()
964 bgx->lane_to_sds = 0; in bgx_set_num_ports()
967 bgx->lmac_count = 1; in bgx_set_num_ports()
968 bgx->lmac_type = BGX_MODE_XLAUI; in bgx_set_num_ports()
969 bgx->lane_to_sds = 0xE4; in bgx_set_num_ports()
972 bgx->lmac_count = 4; in bgx_set_num_ports()
973 bgx->lmac_type = BGX_MODE_10G_KR; in bgx_set_num_ports()
974 bgx->lane_to_sds = 0; in bgx_set_num_ports()
975 bgx->use_training = 1; in bgx_set_num_ports()
978 bgx->lmac_count = 1; in bgx_set_num_ports()
979 bgx->lmac_type = BGX_MODE_40G_KR; in bgx_set_num_ports()
980 bgx->lane_to_sds = 0xE4; in bgx_set_num_ports()
981 bgx->use_training = 1; in bgx_set_num_ports()
984 bgx->lmac_count = 0; in bgx_set_num_ports()
989 * Check if low level firmware has programmed LMAC count in bgx_set_num_ports()
995 bgx->lmac_count = lmac_count; in bgx_set_num_ports()
1007 device_printf(bgx->dev, "BGX%d BIST failed\n", bgx->bgx_id); in bgx_init_hw()
1010 for (i = 0; i < bgx->lmac_count; i++) { in bgx_init_hw()
1011 if (bgx->lmac_type == BGX_MODE_RXAUI) { in bgx_init_hw()
1013 bgx->lane_to_sds = 0x0e; in bgx_init_hw()
1015 bgx->lane_to_sds = 0x04; in bgx_init_hw()
1017 (bgx->lmac_type << 8) | bgx->lane_to_sds); in bgx_init_hw()
1021 (bgx->lmac_type << 8) | (bgx->lane_to_sds + i)); in bgx_init_hw()
1022 bgx->lmac[i].lmacid_bd = lmac_count; in bgx_init_hw()
1026 bgx_reg_write(bgx, 0, BGX_CMR_TX_LMACS, bgx->lmac_count); in bgx_init_hw()
1027 bgx_reg_write(bgx, 0, BGX_CMR_RX_LMACS, bgx->lmac_count); in bgx_init_hw()
1030 for (i = 0; i < bgx->lmac_count; i++) { in bgx_init_hw()
1032 ((1UL << MAX_BGX_CHANS_PER_LMAC) - 1) << in bgx_init_hw()
1048 device_t dev = bgx->dev; in bgx_get_qlm_mode()
1053 * This is configured by low level firmware in bgx_get_qlm_mode()
1063 bgx->qlm_mode = QLM_MODE_SGMII; in bgx_get_qlm_mode()
1066 bgx->bgx_id); in bgx_get_qlm_mode()
1070 bgx->qlm_mode = QLM_MODE_XAUI_1X4; in bgx_get_qlm_mode()
1073 bgx->bgx_id); in bgx_get_qlm_mode()
1077 bgx->qlm_mode = QLM_MODE_RXAUI_2X2; in bgx_get_qlm_mode()
1080 bgx->bgx_id); in bgx_get_qlm_mode()
1085 bgx->qlm_mode = QLM_MODE_XFI_4X1; in bgx_get_qlm_mode()
1088 bgx->bgx_id); in bgx_get_qlm_mode()
1091 bgx->qlm_mode = QLM_MODE_10G_KR_4X1; in bgx_get_qlm_mode()
1094 bgx->bgx_id); in bgx_get_qlm_mode()
1100 bgx->qlm_mode = QLM_MODE_XLAUI_1X4; in bgx_get_qlm_mode()
1103 bgx->bgx_id); in bgx_get_qlm_mode()
1106 bgx->qlm_mode = QLM_MODE_40G_KR4_1X4; in bgx_get_qlm_mode()
1109 bgx->bgx_id); in bgx_get_qlm_mode()
1114 bgx->qlm_mode = QLM_MODE_SGMII; in bgx_get_qlm_mode()
1117 bgx->bgx_id); in bgx_get_qlm_mode()