linux read phy reg,请问如后配置嵌入式网卡LAN91C11X系列的自动协商模式(Auto-Negotiation)?...

本文探讨了在以太网连接中遇到的自动协商超时问题。代码展示了如何从PHY STAT_REG读取能力并更新PHY AD_REG,以进行能力广告。然后通过重新启动自动协商过程并等待其完成,但过程中出现超时失败。作者提到了可能存在的mii_check_media函数,并对等待时间设置提出了疑问。问题集中在自动协商过程的正确性和等待时间的合理性上。
摘要由CSDN通过智能技术生成

如何将Link Code Word (Fast Link Pulse)包抓住?如使用ethereal?以判断目标机是否和远端hub进行协商?代码部分如下:

// Copy our capabilities from PHY_STAT_REG to PHY_AD_REG

my_phy_caps = ReadPhyReg(*pphyaddr, PHY_STAT_REG);

my_ad_caps = PHY_AD_CSMA;// I am CSMA capable

my_self_caps = 0;

if (my_phy_caps & PHY_STAT_CAP_T4)

my_ad_caps |= PHY_AD_T4;

if (my_phy_caps & PHY_STAT_CAP_TXF)

my_ad_caps |= PHY_AD_TX_FDX;

if (my_phy_caps & PHY_STAT_CAP_TXH)

my_ad_caps |= PHY_AD_TX_HDX;

if (my_phy_caps & PHY_STAT_CAP_TF)

my_ad_caps |= PHY_AD_10_FDX;

if (my_phy_caps & PHY_STAT_CAP_TH)

my_ad_caps |= PHY_AD_10_HDX;

/*

if(my_phy_caps & (PHY_STAT_CAP_T4 |PHY_STAT_CAP_TXF |

PHY_STAT_CAP_TXH))

my_self_caps |= PHY_CNTL_SPEED;

if(my_phy_caps & (PHY_STAT_CAP_TXF | PHY_STAT_CAP_TF))

my_self_caps |= PHY_CNTL_DPLX;

*/

// Update our Auto-Neg Advertisement Register

WritePhyReg(*pphyaddr, PHY_AD_REG, my_ad_caps);

PRINTK("%s:phy caps=%xn", CARDNAME, my_phy_caps);

PRINTK("%s:phy advertised caps=%xn", CARDNAME, my_ad_caps);

// Restart auto-negotiation process in order to advertise my caps

WritePhyReg(*pphyaddr, PHY_CNTL_REG,

PHY_CNTL_ANEG_EN | PHY_CNTL_ANEG_RST);

// Wait for the auto-negotiation to complete.  This may take from

// 2 to 3 seconds.

// Wait for the reset to complete, or time out

timeout = 5;// Wait up to 10 seconds

while (timeout--) {

status = ReadPhyReg(*pphyaddr, PHY_STAT_REG);

if (status & PHY_STAT_ANEG_ACK) {

// auto-negotiate complete

break;

}

Delay(1);

// Restart auto-negotiation if remote fault

if (status & PHY_STAT_REM_FLT) {

PRINTK("%s:PHY remote fault detectednn", CARDNAME);

// Restart auto-negotiation

PRINTK("%s:PHY restarting auto-negotiationn",

CARDNAME);

WritePhyReg(*pphyaddr, PHY_CNTL_REG,

PHY_CNTL_ANEG_EN |

PHY_CNTL_ANEG_RST |

PHY_CNTL_SPEED | PHY_CNTL_DPLX);

}

}

但是始终是超时失败的,网线正常直连模式。

|

不是有个mii_check_media吗?

你那个等待时间搞的太奇怪了,

timeout = 5; // Wait up to 10 seconds

while (timeout--) {

status = ReadPhyReg(*pphyaddr, PHY_STAT_REG);

if (status & PHY_STAT_ANEG_ACK) {

// auto-negotiate complete

break;

}

总共几十条指令的时间,这不一下子就结束了吗?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值