在跑OpenWrt的DGS-1210-28上,往24-28端口插SFP没有任何反应,铜口一直占着链路
家庭实验室交换机:一台D-Link DGS-1210-28 F1版,我给它刷了OpenWrt,好摆脱原厂Web界面那些麻烦。除了最后四个铜/光组合端口,其他都工作正常。
- 交换机:D-Link DGS-1210-28 rev F1
- 固件:OpenWrt 21.02.0-rc3 (r16172-2aba3e9784)
- 端口24-28:RJ45/SFP组合口,背后是RTL8214FC PHY(其余端口在RTL8218B/RTL8218D上)
- 模块:一个通用1G光模块,在另一台交换机上工作正常
不管我往笼子里插什么,这个端口都表现得像一个普通的RJ45端口。铜口那一侧一直被选中,光口那一侧从来没起来过:
# ethtool lan28
Supported ports: [ TP MII FIBRE ]
Port: MII
Link detected: yes
启动日志确实显示这些端口绑定到了RTL8214FC组合PHY驱动上,而这个驱动理论上是懂SFP的,所以硬件这一侧看起来是对的。
已经试过:
- 重插模块,又换了一个模块试
- 把铜口的网线整根拔掉,以防是某种优先级问题——端口依然停在铜口上
- 把模块挪到另一台交换机上,能正常建链
用原厂固件的时候,这台交换机一插上模块就会自己切到光口。这个固件上有没有办法手动选择介质,还是说这些组合端口目前根本不能用?
Comments 3
没有任何东西坏,只是realtek这个target里根本没有实现自动介质选择。RTL8214FC是一个铜/光两半的组合PHY,在这个固件上它会一直停在MII/铜口那一半,除非有人明确告诉它换。插上模块对驱动来说毫无意义,因为切换逻辑压根没人实现。
你得自己从用户态手动选择介质:
之后这个笼子就成了该端口上生效的介质,光模块就会起来。要把端口交还给RJ45那一半:
其他每个组合端口都要单独调用一次。
你记得的原厂固件行为,其实是一种有限的自动选择:它会看两边各自的链路状态,只要铜口那边也有链路,铜口就会赢。这就是为什么你会觉得这是个倒退,但其实不是——这个功能在这个target上根本就没被写过。
有两点要提醒。这只能通过CLI操作,LuCI里没有暴露这个选项,大家已经要求加上这个功能有一段时间了。而且这个固件上没有任何东西会替你记住这个选择,所以如果你想每次开机之后都是光口,记得确保这条命令真的被执行了。
就是这个,谢谢。一条命令端口就切过去了:
光模块立刻就起来了,RJ45那一半安静了下来。我给另外三个组合端口也做了同样的操作,并把这四条命令写进了启动脚本,因为就像你说的,没有任何东西会记住这个选择。
每个端口的开关都得写在shell脚本里,多少有点烦人,不过这些端口现在能用了,这正是我需要的。
在你往这些端口上搭监控之前,有件事值得知道:这类板子上SFP侧的链路状态不总是可信的。在DGS-1210-10P上,设备树里根本没有任何sfp节点,所以内核永远拿不到模块在位或信号丢失的状态,MAC会一直报告一个永久的carrier——
ip link对着一个空笼子的lan9打印出<BROADCAST,MULTICAST,UP,LOWER_UP>,插着一个GLC-T-CO铜SFP、没接跳线的时候依然显示up。DGS-1210-10MP不是这样,因为它的DTS里已经有这些节点了。那边的修法是参照10MP和Zyxel GS1900-10HP改设备树:每个笼子一条i2c-gpio总线,每个笼子一个带los-gpio、mod-def0-gpio和tx-disable-gpio的sfp节点,端口上引用
sfp = <&sfp0>,加上phy-mode = "1000base-x"和managed = "in-band-status"。加上这些之后,笼子会通过I2C被探测到,carrier状态才终于能跟上真实的光信号。在那个时期的原厂镜像上,这个行为依然存在,所以如果你有什么东西在监控组合口或SFP口的carrier状态,先验证一下拔掉光纤之后它是不是真的会掉。