Установка SFP в порты 24-28 DGS-1210-28 на OpenWrt ничего не меняет, линк держит медь
Домашний коммутатор: D-Link DGS-1210-28 ревизии F1, который я перепрошил на OpenWrt, чтобы перестать бороться со стоковым веб-интерфейсом. Всё работает, кроме последних четырёх портов, тех самых комбо медь/оптика.
- Коммутатор: D-Link DGS-1210-28 rev F1
- Прошивка: OpenWrt 21.02.0-rc3 (r16172-2aba3e9784)
- Порты 24-28: комбо RJ45/SFP за PHY RTL8214FC (остальные сидят на RTL8218B/RTL8218D)
- Модуль: generic 1G оптика, которая нормально линкуется в другом коммутаторе
Что бы я ни поставил в слот, порт ведёт себя как обычный порт RJ45. Медная сторона остаётся выбранной, а оптическая никогда не поднимается:
# ethtool lan28
Supported ports: [ TP MII FIBRE ]
Port: MII
Link detected: yes
Лог загрузки действительно показывает эти порты привязанными к драйверу комбо-PHY RTL8214FC, а этот драйвер должен знать про SFP, так что аппаратная сторона выглядит правильно.
Что уже пробовал:
- переустановил модуль, затем попробовал второй
- вынул медный кабель из порта полностью, на случай если это вопрос приоритета - порт остаётся на меди
- перенёс модуль на другой коммутатор, где он линкуется
На вендорской прошивке этот коммутатор раньше сам переключал порт на оптику в момент установки модуля. Есть ли способ выбрать среду на этой сборке, или комбо-порты просто пока непригодны к использованию?
Comments 3
Ничего не сломано, в realtek-таргете просто нет автоматического выбора среды. RTL8214FC - это комбо-PHY с медной половиной и оптической половиной, и на этой прошивке он остаётся на стороне MII/медь, пока что-то не скажет ему иначе. Установка модуля ничего не значит для драйвера, потому что переключение никто не реализовал.
Выбираете среду сами из пространства пользователя:
После этого слот становится активной средой на этом порту, и оптика поднимается. Чтобы вернуть порт на половину RJ45:
Тот же вызов для каждого из остальных комбо-портов, по одному на порт.
То, что вы помните по стоковой прошивке - это был ограниченный автовыбор: он смотрел на обе половины, и медь побеждала всякий раз, когда линк был на обеих. Поэтому это и читается как регрессия, но это не она - функция для этого таргета просто никогда не была написана.
Два предостережения. Это только через CLI, в LuCI это не выведено, и люди просят это уже давно. И ничто в этой сборке не выбирает среду за вас само, так что если хотите оптику после каждой загрузки, убедитесь, что этот вызов реально выполняется.
Это оно, спасибо. Один вызов, и порт переключился:
Оптика поднялась сразу же, а половина RJ45 замолчала. Сделал то же самое для остальных трёх комбо-портов и положил четыре вызова в стартап-скрипт, поскольку, как вы сказали, ничего не помнит выбор.
Слегка раздражает, что переключатель на порт должен жить в шелл-скрипте, но порты теперь пригодны к использованию, а это то, что мне и было нужно.
Стоит знать, прежде чем строить мониторинг поверх этих портов: состояние линка на стороне SFP этих плат не всегда заслуживает доверия. На DGS-1210-10P в device tree вообще нет узлов sfp, так что ядро никогда не получает module-present или loss-of-signal, и MAC отчитывается о постоянной несущей -
ip linkпечатает<BROADCAST,MULTICAST,UP,LOWER_UP>для lan9 с пустым слотом, и остаётся up с установленным медным SFP GLC-T-CO без патч-корда в нём. DGS-1210-10MP так себя не ведёт, потому что в его DTS узлы уже есть.Исправление там было изменением device tree по образцу 10MP и Zyxel GS1900-10HP: шина i2c-gpio на каждый слот, узел sfp на каждый слот с los-gpio, mod-def0-gpio и tx-disable-gpio,
sfp = <&sfp0>, на который ссылается порт,phy-mode = "1000base-x"иmanaged = "in-band-status". С этим на месте слот опрашивается по I2C, и несущая наконец-то отслеживает реальный оптический сигнал.На стоковых образах того периода поведение сохраняется, так что если что-то у вас следит за несущей на комбо- или SFP-порту, проверьте, что она реально падает, когда вы вынимаете оптику.