net/ngbe: identify and reset PHY
[dpdk.git] / drivers / net / ngbe / base / ngbe_phy_rtl.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
3  */
4
5 #include "ngbe_phy_rtl.h"
6
7 #define RTL_PHY_RST_WAIT_PERIOD               5
8
9 s32 ngbe_read_phy_reg_rtl(struct ngbe_hw *hw,
10                 u32 reg_addr, u32 device_type, u16 *phy_data)
11 {
12         mdi_reg_t reg;
13         mdi_reg_22_t reg22;
14
15         reg.device_type = device_type;
16         reg.addr = reg_addr;
17         ngbe_mdi_map_register(&reg, &reg22);
18
19         wr32(hw, NGBE_PHY_CONFIG(RTL_PAGE_SELECT), reg22.page);
20         *phy_data = 0xFFFF & rd32(hw, NGBE_PHY_CONFIG(reg22.addr));
21
22         return 0;
23 }
24
25 s32 ngbe_write_phy_reg_rtl(struct ngbe_hw *hw,
26                 u32 reg_addr, u32 device_type, u16 phy_data)
27 {
28         mdi_reg_t reg;
29         mdi_reg_22_t reg22;
30
31         reg.device_type = device_type;
32         reg.addr = reg_addr;
33         ngbe_mdi_map_register(&reg, &reg22);
34
35         wr32(hw, NGBE_PHY_CONFIG(RTL_PAGE_SELECT), reg22.page);
36         wr32(hw, NGBE_PHY_CONFIG(reg22.addr), phy_data);
37
38         return 0;
39 }
40
41 s32 ngbe_reset_phy_rtl(struct ngbe_hw *hw)
42 {
43         u16 value = 0, i;
44         s32 status = 0;
45
46         DEBUGFUNC("ngbe_reset_phy_rtl");
47
48         value |= RTL_BMCR_RESET;
49         status = hw->phy.write_reg(hw, RTL_BMCR, RTL_DEV_ZERO, value);
50
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))
54                         break;
55                 msleep(1);
56         }
57
58         if (i == RTL_PHY_RST_WAIT_PERIOD) {
59                 DEBUGOUT("PHY reset polling failed to complete.\n");
60                 return NGBE_ERR_RESET_FAILED;
61         }
62
63         return status;
64 }
65