Ambarella Ethernet PHY rtl9000 Linux driver 調試
記錄在ambarella CV22平臺 調試rtl9000 phy驅動。
rtl9000 工作原理
如圖,PHY使用標準的mac和phy的接口,rtl9000支持rgmii/rmii/mii和mdio/mdc接口,還有reset和外部供電,外部晶振接口。
另外硬件上還需要配置rtl9000的addr和硬件接口。
ambarella dts配置
mac0: ethernet@e000e000 {
amb,tx-clk-invert;
pinctrl-0 = <&rmii_pins &ahb_mdio_pins>;
amb,ahb-12mhz-div = <5>;
phy-mode = "rmii";
amb,ext-ref-clk;
phy@0 {
reg = <0>;
rst-gpios = <&gpio 29 0>;
};
};
驅動修改
ambarella\kernel\linux-4.14\drivers\net\phy\realtek.c
static struct phy_driver realtek_drvs[] = {
{
.phy_id = 0x001ccb00,
.name = "RTL9000 Gigabit Ethernet",
.phy_id_mask = 0x001fffff,
.features = PHY_BASIC_FEATURES,
.flags = PHY_HAS_INTERRUPT,
.probe = rtl9000_probe,
.config_aneg = &rtl9000_config_aneg,
.aneg_done = &rtl9000_aneg_done,
.config_init = &rtl9000_config_init,
.read_status = &rtl9000_read_status,
.ack_interrupt = &rtl9000_ack_interrupt,
.config_intr = &rtl9000_config_intr,
.suspend = genphy_suspend,
.resume = genphy_resume,
},
};
module_phy_driver(realtek_drvs);
static struct mdio_device_id __maybe_unused realtek_tbl[] = {
{ 0x001ccb00, 0x001fffff },
{ }
};
最重要需要實現的幾個個函數:
.config_aneg = &rtl9000_config_aneg,
.aneg_done = &rtl9000_aneg_done,
.config_init = &rtl9000_config_init,
.read_status = &rtl9000_read_status,
在phy的驅動框架中要求我們必須實現config_aneg和read_status這兩個函數。
ping不通問題
在調試過程中,發現PHY的id已經讀到了,網卡設備也創建成功,mac地址也有。但是ping不通主機。
解決:通過ethtool eth0查看網絡狀態,發現不正確,修改read_status函數如下,可以正常ping通。
static int rtl9000_read_status(struct phy_device *phydev)
{
phydev->duplex = DUPLEX_FULL;
phydev->speed = SPEED_100;
phydev->pause = 0;
phydev->asym_pause = 0;
phydev->link = 1;
return 0;
}