开发板dm9000网卡驱动,mii_link_ok函数的问题
int mii_link_ok (struct mii_if_info *mii)
{
/* first, a dummy read, needed to latch some MII phys */
mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR);
if (mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR) & BMSR_LSTATUS)
{
return 1;
pr_info("AAAAAA"); //自己添加的输出信息,为了检验程序是否运行到这里
}
return 0;
}
用ifconfig eth0 up命令时,并没有打印AAAAA的信息,所以mii_link_ok函数返回值为0,从而导致:
new_carrier = (unsigned int) mii_link_ok(mii);
/* no carrier, nothing much to do */
if (!new_carrier) {
netif_carrier_off(mii->dev);
if (ok_to_print)
printk(KERN_INFO "%s: link down\n", mii->dev->name);
return 0; /* duplex did not change */
}
打印信息:link down
开发板ping自己不通,ping主机也不通。
各路大侠,帮帮忙。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
没人知道mii_link_ok这函数的作用吗?
int mii_link_ok (struct mii_if_info *mii)
{
/* first, a dummy read, needed to latch some MII phys */
mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR);
if (mii->mdio_read(mii->dev, mii->phy_id, MII_BMSR) & BMSR_LSTATUS)
{
return 1;
pr_info("AAAAAA"); //自己添加的输出信息,为了检验程序是否运行到这里
}
return 0;
}
这就是读取phy的link状态信息
这里使用了mii->mdio_read函数,该函数在dm9000_probe中定义:
db->mii.mdio_read = dm9000_phy_read;
db->mii.mdio_write = dm9000_phy_write;
dm9000_phy_read在dm9000.c中就有定义了
由于dm9000没有区分普通寄存器和phy寄存器,所以,通过控制寄存器触发dm9000读取phy,然后放入一个数据寄存器中,就可以读取phy了,phy是不能直接读取的
最后获取link状态信息。
DM9000AEP DM9000CEP DM9000EP DM9161AEP DM9161EP 可以咨询Q1547311723
您好,我是爱欣文科技的沈鹏。
您提的DM芯片的问题,我可以帮助你解答。
关于DM9000AEP,DM9161AEP,数据手册,驱动,请联系我!
我们是DM芯片大陆的总代理商,有强大的技术支持。
我的联系方式:leo_shen@axwdragon.com 18665815539 QQ:1608310420{:2_170:}
路过,来看看 {:2_176:}
回复 3# yanhc519
哥们儿,你这个问题解决了吗?我也遇见了同样的问题,请你帮忙!我的QQ:914441036
回复 3# yanhc519
大哥,他这个问题该怎么解决呢,我也遇见了同样的问题。如果方便的话,请加我的QQ 914441036