Phy寄存器及其每一位的宏,定义在内核的include/uapi/linux/mii.h,下面介绍一些重要的寄存器位。
0 Basic mode control register (MII_BMCR)
15位,RESET位,写1开始复位,复位完成后,自动变成0。
12位,自动协商开启位,设置1,开启自动协商,设置0,关闭自动协商。
8位,设置自动协商关闭情况下的Duplex双工模式。1: Full Duplex,0: Half Duplex
6, 13位,高低两位,设置自动协商关闭情况下的speed,00: 10MBps,01: 100Mbps, 10: 1000Mbps
9位,restart autonegotiation,重新开始协商。
1 Basic mode status register (MII_BMSR)
2位,链路状态指示。1: Link UP, 0: Link down
5位,自动协商完成指示,1: 自动协商完成,0: 自动协商未完成。
其它的很多位,表示这个phy的能力,比如是否支持自动协商。是否支持10M/100M在本寄存器表示。
8位,Extended Status,如果为1,表示支持扩展寄存器15,那个寄存器表明了是否支持千兆。
4 Auto-negotiation Advertisement Control register (MII_ADVERTISE)
设置自动协商支持的能力,比如支持哪些speed,是否支持pause。千兆不在本寄存器设置。在9号寄存器设置。
5 Link Partner ability register (MII_LPA)
对方的自动协商能力。千兆的能力在10号寄存器。
9 1000Base-T Control Register
12位,1,手动设置Master/Slave配置,0:Automatic Master/Slave configruation
11位,如果12位是1,则1: 手动配置为Master,0: 手动配置为Slave。
10位,如果12位是1,则1: prefer multi-port device (MASTER),0:prefer signle port device (Slave)
9位,1 Advertise 1000Base-T Full duplex, 0 not advertised
8位,1 Advertise 1000Base-T Half-duplex,0 not advertised
0xa 1000Base-T status Register
11位,Link patner是否支持1000Base-T Full duplex
10位,Link patner是否支持1000Base-T Half duplex
自动协商情况下,如何获得当前速度,双工模式:
读取自己的advertisement,和link parter的,进行与,从高到低,如果两个都设置了,那么就是那个速度和双工模式。
参考:
drivers/net/phy/phy_device.c