Lines Matching refs:lmac

27 struct lmac {  struct
47 struct lmac lmac[MAX_LMAC_PER_BGX]; argument
59 static int bgx_xaui_check_link(struct lmac *lmac);
83 static u64 bgx_reg_read(struct bgx *bgx, u8 lmac, u64 offset) in bgx_reg_read() argument
85 void __iomem *addr = bgx->reg_base + ((u32)lmac << 20) + offset; in bgx_reg_read()
90 static void bgx_reg_write(struct bgx *bgx, u8 lmac, u64 offset, u64 val) in bgx_reg_write() argument
92 void __iomem *addr = bgx->reg_base + ((u32)lmac << 20) + offset; in bgx_reg_write()
97 static void bgx_reg_modify(struct bgx *bgx, u8 lmac, u64 offset, u64 val) in bgx_reg_modify() argument
99 void __iomem *addr = bgx->reg_base + ((u32)lmac << 20) + offset; in bgx_reg_modify()
104 static int bgx_poll_reg(struct bgx *bgx, u8 lmac, u64 reg, u64 mask, bool zero) in bgx_poll_reg() argument
110 reg_val = bgx_reg_read(bgx, lmac, reg); in bgx_poll_reg()
154 struct lmac *lmac; in bgx_get_lmac_link_state() local
160 lmac = &bgx->lmac[lmacid]; in bgx_get_lmac_link_state()
161 link->link_up = lmac->link_up; in bgx_get_lmac_link_state()
162 link->duplex = lmac->last_duplex; in bgx_get_lmac_link_state()
163 link->speed = lmac->last_speed; in bgx_get_lmac_link_state()
172 return bgx->lmac[lmacid].mac; in bgx_get_lmac_mac()
185 ether_addr_copy(bgx->lmac[lmacid].mac, mac); in bgx_set_lmac_mac()
206 static void bgx_sgmii_change_link_state(struct lmac *lmac) in bgx_sgmii_change_link_state() argument
208 struct bgx *bgx = lmac->bgx; in bgx_sgmii_change_link_state()
213 cmr_cfg = bgx_reg_read(bgx, lmac->lmacid, BGX_CMRX_CFG); in bgx_sgmii_change_link_state()
215 bgx_reg_write(bgx, lmac->lmacid, BGX_CMRX_CFG, cmr_cfg); in bgx_sgmii_change_link_state()
217 port_cfg = bgx_reg_read(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG); in bgx_sgmii_change_link_state()
218 misc_ctl = bgx_reg_read(bgx, lmac->lmacid, BGX_GMP_PCS_MISCX_CTL); in bgx_sgmii_change_link_state()
220 if (lmac->link_up) { in bgx_sgmii_change_link_state()
223 port_cfg |= (lmac->last_duplex << 2); in bgx_sgmii_change_link_state()
228 switch (lmac->last_speed) { in bgx_sgmii_change_link_state()
235 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_SLOT, 64); in bgx_sgmii_change_link_state()
236 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_BURST, 0); in bgx_sgmii_change_link_state()
244 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_SLOT, 64); in bgx_sgmii_change_link_state()
245 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_BURST, 0); in bgx_sgmii_change_link_state()
253 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_TXX_SLOT, 512); in bgx_sgmii_change_link_state()
254 if (lmac->last_duplex) in bgx_sgmii_change_link_state()
255 bgx_reg_write(bgx, lmac->lmacid, in bgx_sgmii_change_link_state()
258 bgx_reg_write(bgx, lmac->lmacid, in bgx_sgmii_change_link_state()
264 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_PCS_MISCX_CTL, misc_ctl); in bgx_sgmii_change_link_state()
265 bgx_reg_write(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG, port_cfg); in bgx_sgmii_change_link_state()
267 port_cfg = bgx_reg_read(bgx, lmac->lmacid, BGX_GMP_GMI_PRTX_CFG); in bgx_sgmii_change_link_state()
271 bgx_reg_write(bgx, lmac->lmacid, BGX_CMRX_CFG, cmr_cfg); in bgx_sgmii_change_link_state()
276 struct lmac *lmac = container_of(netdev, struct lmac, netdev); in bgx_lmac_handler() local
277 struct phy_device *phydev = lmac->phydev; in bgx_lmac_handler()
280 if (!lmac) in bgx_lmac_handler()
283 if (!phydev->link && lmac->last_link) in bgx_lmac_handler()
287 (lmac->last_duplex != phydev->duplex || in bgx_lmac_handler()
288 lmac->last_link != phydev->link || in bgx_lmac_handler()
289 lmac->last_speed != phydev->speed)) { in bgx_lmac_handler()
293 lmac->last_link = phydev->link; in bgx_lmac_handler()
294 lmac->last_speed = phydev->speed; in bgx_lmac_handler()
295 lmac->last_duplex = phydev->duplex; in bgx_lmac_handler()
301 lmac->link_up = true; in bgx_lmac_handler()
303 lmac->link_up = false; in bgx_lmac_handler()
305 if (lmac->is_sgmii) in bgx_lmac_handler()
306 bgx_sgmii_change_link_state(lmac); in bgx_lmac_handler()
308 bgx_xaui_check_link(lmac); in bgx_lmac_handler()
311 u64 bgx_get_rx_stats(int node, int bgx_idx, int lmac, int idx) in bgx_get_rx_stats() argument
320 lmac = 0; in bgx_get_rx_stats()
321 return bgx_reg_read(bgx, lmac, BGX_CMRX_RX_STAT0 + (idx * 8)); in bgx_get_rx_stats()
325 u64 bgx_get_tx_stats(int node, int bgx_idx, int lmac, int idx) in bgx_get_tx_stats() argument
333 return bgx_reg_read(bgx, lmac, BGX_CMRX_TX_STAT0 + (idx * 8)); in bgx_get_tx_stats()
337 static void bgx_flush_dmac_addrs(struct bgx *bgx, int lmac) in bgx_flush_dmac_addrs() argument
341 while (bgx->lmac[lmac].dmac > 0) { in bgx_flush_dmac_addrs()
342 offset = ((bgx->lmac[lmac].dmac - 1) * sizeof(u64)) + in bgx_flush_dmac_addrs()
343 (lmac * MAX_DMAC_PER_LMAC * sizeof(u64)); in bgx_flush_dmac_addrs()
345 bgx->lmac[lmac].dmac--; in bgx_flush_dmac_addrs()
354 struct lmac *lmac; in bgx_lmac_internal_loopback() local
361 lmac = &bgx->lmac[lmac_idx]; in bgx_lmac_internal_loopback()
362 if (lmac->is_sgmii) { in bgx_lmac_internal_loopback()
508 static int bgx_xaui_check_link(struct lmac *lmac) in bgx_xaui_check_link() argument
510 struct bgx *bgx = lmac->bgx; in bgx_xaui_check_link()
511 int lmacid = lmac->lmacid; in bgx_xaui_check_link()
611 struct lmac *lmac; in bgx_poll_for_link() local
614 lmac = container_of(work, struct lmac, dwork.work); in bgx_poll_for_link()
617 bgx_reg_modify(lmac->bgx, lmac->lmacid, in bgx_poll_for_link()
619 bgx_poll_reg(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1, in bgx_poll_for_link()
622 link = bgx_reg_read(lmac->bgx, lmac->lmacid, BGX_SPUX_STATUS1); in bgx_poll_for_link()
624 lmac->link_up = 1; in bgx_poll_for_link()
625 if (lmac->bgx->lmac_type == BGX_MODE_XLAUI) in bgx_poll_for_link()
626 lmac->last_speed = 40000; in bgx_poll_for_link()
628 lmac->last_speed = 10000; in bgx_poll_for_link()
629 lmac->last_duplex = 1; in bgx_poll_for_link()
631 lmac->link_up = 0; in bgx_poll_for_link()
632 lmac->last_speed = SPEED_UNKNOWN; in bgx_poll_for_link()
633 lmac->last_duplex = DUPLEX_UNKNOWN; in bgx_poll_for_link()
636 if (lmac->last_link != lmac->link_up) { in bgx_poll_for_link()
637 lmac->last_link = lmac->link_up; in bgx_poll_for_link()
638 if (lmac->link_up) in bgx_poll_for_link()
639 bgx_xaui_check_link(lmac); in bgx_poll_for_link()
642 queue_delayed_work(lmac->check_link, &lmac->dwork, HZ * 2); in bgx_poll_for_link()
647 struct lmac *lmac; in bgx_lmac_enable() local
650 lmac = &bgx->lmac[lmacid]; in bgx_lmac_enable()
651 lmac->bgx = bgx; in bgx_lmac_enable()
654 lmac->is_sgmii = 1; in bgx_lmac_enable()
658 lmac->is_sgmii = 0; in bgx_lmac_enable()
663 if (lmac->is_sgmii) { in bgx_lmac_enable()
685 if (!lmac->phydev) in bgx_lmac_enable()
688 lmac->phydev->dev_flags = 0; in bgx_lmac_enable()
690 if (phy_connect_direct(&lmac->netdev, lmac->phydev, in bgx_lmac_enable()
695 phy_start_aneg(lmac->phydev); in bgx_lmac_enable()
697 lmac->check_link = alloc_workqueue("check_link", WQ_UNBOUND | in bgx_lmac_enable()
699 if (!lmac->check_link) in bgx_lmac_enable()
701 INIT_DELAYED_WORK(&lmac->dwork, bgx_poll_for_link); in bgx_lmac_enable()
702 queue_delayed_work(lmac->check_link, &lmac->dwork, 0); in bgx_lmac_enable()
710 struct lmac *lmac; in bgx_lmac_disable() local
713 lmac = &bgx->lmac[lmacid]; in bgx_lmac_disable()
714 if (lmac->check_link) { in bgx_lmac_disable()
716 cancel_delayed_work_sync(&lmac->dwork); in bgx_lmac_disable()
717 destroy_workqueue(lmac->check_link); in bgx_lmac_disable()
728 (bgx->lmac_type != BGX_MODE_10G_KR) && lmac->phydev) in bgx_lmac_disable()
729 phy_disconnect(lmac->phydev); in bgx_lmac_disable()
731 lmac->phydev = NULL; in bgx_lmac_disable()
813 bgx->lmac[i].lmacid_bd = lmac_count; in bgx_init_hw()
919 acpi_get_mac_address(adev, bgx->lmac[bgx->lmac_count].mac); in bgx_acpi_register_phy()
921 SET_NETDEV_DEV(&bgx->lmac[bgx->lmac_count].netdev, &bgx->pdev->dev); in bgx_acpi_register_phy()
923 bgx->lmac[bgx->lmac_count].lmacid = bgx->lmac_count; in bgx_acpi_register_phy()
973 u8 lmac = 0; in bgx_init_of_phy() local
988 bgx->lmac[lmac].phydev = of_phy_find_device(phy_np); in bgx_init_of_phy()
992 ether_addr_copy(bgx->lmac[lmac].mac, mac); in bgx_init_of_phy()
994 SET_NETDEV_DEV(&bgx->lmac[lmac].netdev, &bgx->pdev->dev); in bgx_init_of_phy()
995 bgx->lmac[lmac].lmacid = lmac; in bgx_init_of_phy()
996 lmac++; in bgx_init_of_phy()
997 if (lmac == MAX_LMAC_PER_BGX) { in bgx_init_of_phy()
1027 u8 lmac; in bgx_probe() local
1072 for (lmac = 0; lmac < bgx->lmac_count; lmac++) { in bgx_probe()
1073 err = bgx_lmac_enable(bgx, lmac); in bgx_probe()
1076 bgx->bgx_id, lmac); in bgx_probe()
1096 u8 lmac; in bgx_remove() local
1099 for (lmac = 0; lmac < bgx->lmac_count; lmac++) in bgx_remove()
1100 bgx_lmac_disable(bgx, lmac); in bgx_remove()