MAC to MAC ,网卡驱动应该如何调整
正常情况下,完整的网卡由MAC和PHY两部分组成。
PHY的含义很广,不知道的wiki之。
简单地说,是物理层芯片。在TCP/IP协议中,数据链路层之上的所有数据,都可以在你的内存里由软件来访问控制。但是最终在网线和光纤上的数据,不会严格按照内存里的数据发送。这是由物理特性决定的。例如高速串行总线上,如果有大量连续的1出现,会导致AC耦合电容充满,影响信号完整性。所以4/5b 、 8/10b转换是phy常见的工作。
MAC和phy之间是由MII以及衍生升级的RMII、RGMII、SGMII 连接。其中还有2根类似i2c的MDC/MDIO总线。MII用来传输大量的数据。MDC/MDIO用来访问PHY的寄存器,获取和配置链路状态。
phy的另外一头,再经过网络变压器,出来的就是熟悉的RJ45 了。
典型用法如下:
MAC ----MII及其衍生总线----PHY -------网线、光纤------ PHY ----MII及其衍生总线---- MAC
MAC和PHY可以集合在一个芯片内,也可以分开,都很常见。phy寄存器也有一部分是遵循通用标准的。
在嵌入式产品中,典型的如交换机,很可能核心就是一个交换机芯片。高级的交换机芯片允许通过管理口IMP进行配置,这个IMP口通常连接到嵌入式cpu的网口上。这个cpu和交换机芯片都在同一个紧凑电路板上,如果它们之间再经过2个phy,实在浪费钱和电。
于是另一种经典应用诞生了: MAC to MAC
MAC ----MII及其衍生总线---- MAC
在这种配置下,因为缺少了关键的phy,对于软件的影响很严重。没办法进行链路自动配置了,不知道速度、link、全双工/半双工。
在嵌入式linux环境下,需要uboot和linux都进行修改。
uboot需要配置交换机,强行设置交换机端的MAC为需要的速度和工作模式,强行设置为link 。
然后也需要强行设置cpu的对应网口,忽略phy的操作,强行配置速度和工作模式。然后才能在uboot下使用这个网口。
linux下也一样,会简单些,因为交换机端MAC已经配置好了。
linux的操作有些通用的可能么就简单写一下:
genphy_config_init 开头添加,
- #if 1
- //xy add
- if(phydev->addr==0x1e)
- {
- printk("p1013 eth1 has no phy,force to fixup ,step 1\n");
- features |= SUPPORTED_Autoneg;
- features |= SUPPORTED_1000baseT_Full;
- goto end;
- }
- #endif
在phy_state_machine 的开头添加
- #if 1
- //xy add
- if(phydev->addr==0x1e)
- {
- phydev->link=1;
- phydev->speed = SPEED_1000;
- phydev->duplex = DUPLEX_FULL;
-
- phydev->autoneg = AUTONEG_DISABLE;
- phydev->state = PHY_RUNNING;
- if(phydev->fix==0)
- {
- printk("p1013 eth1 has no phy,force to fixup,step 2 \n");
- netif_carrier_on(phydev->attached_dev);
- phydev->adjust_link(phydev->attached_dev);
- phydev->fix=1;
- }
-
- }
- #endif
这里增加了一个struct phy_device的成员fix,记录只需要修复一次。
阅读(7051) | 评论(1) | 转发(0) |