TI中文支持网
TI专业的中文技术问题搜集分享网站

AM3352处理器的以太网卡连接状态的检测问题

使用的是linux3.2.0的内核,这是内核中网卡状态机的工作状态

  1. enum phy_state {  
  2.     PHY_DOWN = 0, // PHY芯片和驱动没准备好,一般情况下少发生  
  3.     PHY_STARTING, // PHY芯片OK了,但驱动还没有准备好  
  4.     PHY_READY,    // 准备好了,在probe中赋值,接下来会切到PHY_UP  
  5.     PHY_PENDING,  
  6.     PHY_UP,       // phy启动了,可以工作了,接下来会到PHY_AN  
  7.     PHY_AN,       // 自动协商  
  8.     PHY_RUNNING,  // 正在运行中,在网络连接(插上网线)时会到这个状态  
  9.     PHY_NOLINK,   // 断网了  
  10.     PHY_FORCING,  // 强制,当自动协商不使能时,就会进行此状态(实际上会读PHY寄存器进行设置速率、双工,等)  
  11.     PHY_CHANGELINK, // 变化,这个状态很重要,当连接时,会换到PHY_RUNNING,当断网时,会切到PHY_NOLINK  
  12.     PHY_HALTED,  
  13.     PHY_RESUMING  
  14. }; 
使用过程中发现,当网线从网口中拔出来后,状态机会进入PHY_NOLINK状态,但是再将网线插入,会检测不到网线的插入,状态机依然是PHY_NOLINK状态,
多插拔几次,有时候会进入PHY_RUNNING的正常状态,
跟踪函数发现:void phy_state_machine(struct work_struct *work) 
  1.  case PHY_NOLINK:  
  2.         err = phy_read_status(phydev); // 读phy状态,包括link,速率、双工,等等  
  3.         if (err)  
  4.             break;  
  5.   
  6.         if (phydev->link) { // 在断开网络再连接(即拨掉再插上网线),就进入此语句  
  7.             if (AUTONEG_ENABLE == phydev->autoneg) {  
  8.                 err = phy_aneg_done(phydev); // 如果是自动协商使能,就进行自动协商  
  9.                 if (err < 0)  
  10.                     break;  
  11.   
  12.                 if (!err) {  
  13.                     phydev->state = PHY_AN;  
  14.                     phydev->link_timeout = PHY_AN_TIMEOUT;  
  15.                     break;  
  16.                 }  
  17.             }  
  18.             phydev->state = PHY_RUNNING; // 运行时。。。。。  
  19.             netif_carrier_on(phydev->attached_dev);  
  20.             phydev->adjust_link(phydev->attached_dev);  
  21.         }  
  22.         break;  
  phy_read_status(phydev)此函数读取到的phydev->link状态,插着网线也读取不到插入状态,是不是我哪个寄存器设置的有问题?还是硬件电路有问题?
Jian Zhou:

MDIO读取PHY芯片寄存器正常么?

如果正常,可能需要检查PHY这部分的硬件设计。

赞(0)
未经允许不得转载:TI中文支持网 » AM3352处理器的以太网卡连接状态的检测问题
分享到: 更多 (0)