1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
5 #include "ngbe_phy_mvl.h"
7 #define MVL_PHY_RST_WAIT_PERIOD 5
9 s32 ngbe_read_phy_reg_mvl(struct ngbe_hw *hw,
10 u32 reg_addr, u32 device_type, u16 *phy_data)
15 reg.device_type = device_type;
18 if (hw->phy.media_type == ngbe_media_type_fiber)
19 ngbe_write_phy_reg_mdi(hw, MVL_PAGE_SEL, 0, 1);
21 ngbe_write_phy_reg_mdi(hw, MVL_PAGE_SEL, 0, 0);
23 ngbe_mdi_map_register(®, ®22);
25 ngbe_read_phy_reg_mdi(hw, reg22.addr, reg22.device_type, phy_data);
30 s32 ngbe_write_phy_reg_mvl(struct ngbe_hw *hw,
31 u32 reg_addr, u32 device_type, u16 phy_data)
36 reg.device_type = device_type;
39 if (hw->phy.media_type == ngbe_media_type_fiber)
40 ngbe_write_phy_reg_mdi(hw, MVL_PAGE_SEL, 0, 1);
42 ngbe_write_phy_reg_mdi(hw, MVL_PAGE_SEL, 0, 0);
44 ngbe_mdi_map_register(®, ®22);
46 ngbe_write_phy_reg_mdi(hw, reg22.addr, reg22.device_type, phy_data);
51 s32 ngbe_reset_phy_mvl(struct ngbe_hw *hw)
57 DEBUGFUNC("ngbe_reset_phy_mvl");
59 if (hw->phy.type != ngbe_phy_mvl && hw->phy.type != ngbe_phy_mvl_sfi)
60 return NGBE_ERR_PHY_TYPE;
62 /* select page 18 reg 20 */
63 status = ngbe_write_phy_reg_mdi(hw, MVL_PAGE_SEL, 0, 18);
65 /* mode select to RGMII-to-copper or RGMII-to-sfi*/
66 if (hw->phy.type == ngbe_phy_mvl)
67 ctrl = MVL_GEN_CTL_MODE_COPPER;
69 ctrl = MVL_GEN_CTL_MODE_FIBER;
70 status = ngbe_write_phy_reg_mdi(hw, MVL_GEN_CTL, 0, ctrl);
72 ctrl |= MVL_GEN_CTL_RESET;
73 status = ngbe_write_phy_reg_mdi(hw, MVL_GEN_CTL, 0, ctrl);
75 for (i = 0; i < MVL_PHY_RST_WAIT_PERIOD; i++) {
76 status = ngbe_read_phy_reg_mdi(hw, MVL_GEN_CTL, 0, &ctrl);
77 if (!(ctrl & MVL_GEN_CTL_RESET))
82 if (i == MVL_PHY_RST_WAIT_PERIOD) {
83 DEBUGOUT("PHY reset polling failed to complete.\n");
84 return NGBE_ERR_RESET_FAILED;