1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
5 #include "ngbe_phy_rtl.h"
7 #define RTL_PHY_RST_WAIT_PERIOD 5
9 s32 ngbe_read_phy_reg_rtl(struct ngbe_hw *hw,
10 u32 reg_addr, u32 device_type, u16 *phy_data)
15 reg.device_type = device_type;
17 ngbe_mdi_map_register(®, ®22);
19 wr32(hw, NGBE_PHY_CONFIG(RTL_PAGE_SELECT), reg22.page);
20 *phy_data = 0xFFFF & rd32(hw, NGBE_PHY_CONFIG(reg22.addr));
25 s32 ngbe_write_phy_reg_rtl(struct ngbe_hw *hw,
26 u32 reg_addr, u32 device_type, u16 phy_data)
31 reg.device_type = device_type;
33 ngbe_mdi_map_register(®, ®22);
35 wr32(hw, NGBE_PHY_CONFIG(RTL_PAGE_SELECT), reg22.page);
36 wr32(hw, NGBE_PHY_CONFIG(reg22.addr), phy_data);
41 s32 ngbe_reset_phy_rtl(struct ngbe_hw *hw)
46 DEBUGFUNC("ngbe_reset_phy_rtl");
48 value |= RTL_BMCR_RESET;
49 status = hw->phy.write_reg(hw, RTL_BMCR, RTL_DEV_ZERO, value);
51 for (i = 0; i < RTL_PHY_RST_WAIT_PERIOD; i++) {
52 status = hw->phy.read_reg(hw, RTL_BMCR, RTL_DEV_ZERO, &value);
53 if (!(value & RTL_BMCR_RESET))
58 if (i == RTL_PHY_RST_WAIT_PERIOD) {
59 DEBUGOUT("PHY reset polling failed to complete.\n");
60 return NGBE_ERR_RESET_FAILED;