Ethernet
В: Ethernet не инициализируется, в логах ошибка phy_poll_reset failed: -110 или Cannot attach to PHY (-22 / -110). В чём причина?
О: Код -110 соответствует ETIMEDOUT. Сообщение phy_poll_reset failed: -110 означает, что драйвер не дождался завершения сброса PHY. Такое состояние возникает, если PHY не отвечает корректно по MDIO либо не может выйти из reset.
Следует проверить:
питание PHY;
наличие опорного тактирования PHY;
состояние линии
RESET#;правильность полярности и временных параметров reset;
наличие обмена по
MDC/MDIO;соответствие MDIO-адреса PHY значению
regв Device Tree.
Код -22 соответствует EINVAL и означает ошибку параметров или конфигурации. Точная причина определяется по сообщениям в логе непосредственно перед Cannot attach to PHY.
Отсутствие MAC-адреса в EEPROM само по себе не является причиной phy_poll_reset failed.
В: Как отключить один из каналов Ethernet (GMAC0 или GMAC1) без пересборки образа?
О: В barebox можно зарегистрировать Device Tree fixup, который перед загрузкой Linux установит выбранному узлу свойство status = "disabled".
Для отключения GMAC0:
of_fixup_status -d /ethernet@fe2a0000
Для отключения GMAC1:
of_fixup_status -d /ethernet@fe010000
Команда of_fixup_status -d регистрирует fixup для отключения указанного узла Device Tree. Пересборка ядра и образа Linux для этого не требуется.
В: Для GMAC MAC-адрес задан через EEPROM/NVMEM. Что произойдёт, если EEPROM отсутствует или MAC-адрес в ней некорректен?
О: MAC-адрес и Ethernet PHY инициализируются независимо.
Для получения MAC-адреса Linux сначала проверяет свойства Device Tree:
mac-address local-mac-address
Если корректного адреса там нет, драйвер может запросить NVMEM-ячейку с именем mac-address.
Пример:
nvmem-cells = <&mac_address>; nvmem-cell-names = "mac-address";
Если NVMEM-provider ещё не инициализирован, probe GMAC может быть отложен через -EPROBE_DEFER. Если NVMEM недоступна или содержит некорректный MAC, этот источник MAC-адреса не может быть использован.
При этом отсутствие MAC-адреса в NVMEM не означает отсутствие PHY по MDIO и не является причиной сообщений MDIO device ... is missing или phy_poll_reset failed.
Если EEPROM в конкретной аппаратной конфигурации не используется, ссылки nvmem-cells и nvmem-cell-names следует удалить из соответствующего GMAC-узла. При этом необходимо обеспечить другой источник постоянного MAC-адреса. Использование динамически сгенерированного MAC допустимо для отладки, но такой адрес не следует считать постоянным идентификатором устройства.
В: При наличии EEPROM-микросхемы на шине I2C интерфейсы Ethernet исчезают из device tree. Как связаны I2C и GMAC?
О: Наличие EEPROM на I2C само по себе не влияет на работу GMAC или PHY.
Связь появляется только в том случае, если GMAC-узел Device Tree явно использует EEPROM как NVMEM-provider для получения MAC-адреса:
nvmem-cells = <&mac_address>; nvmem-cell-names = "mac-address";
Если такой NVMEM-provider не готов в момент probe, Linux может отложить инициализацию GMAC. Если MAC-адрес из NVMEM имеет неправильную длину или недопустимое значение, он будет отклонён.
В: PHY RTL8211F не определяется по MDIO. Питания и кварцевый резонатор присутствуют. Что необходимо проверить?
О: В первую очередь необходимо проверить интерфейс управления PHY — MDC и MDIO.
Для RK3568 Rockchip указывает для линии MDIO внешнюю подтяжку к питанию величиной 1,5–1,8 кОм. MDIO является двунаправленной линией. Постоянная подтяжка MDIO к GND не позволяет сформировать корректный высокий уровень и нарушает обмен с PHY.
Для RK3568 также предусматривается последовательный резистор 22 Ом в линии MDC со стороны RK3568.
Необходимо проверить:
подтяжку
MDIOк правильному IO-питанию PHY;наличие тактовых импульсов на
MDC;отсутствие постоянного низкого уровня на
MDIO;состояние
RESET#;наличие всех питающих напряжений PHY;
наличие и стабильность 25-МГц опорного тактирования;
аппаратно установленный MDIO-адрес PHY.
В: В логах MDIO device at address X is missing — PHY не определяется
О: Свойство reg в узле Ethernet PHY должно содержать реальный аппаратный MDIO-адрес PHY.
Например:
rgmii_phy0: ethernet-phy@1 { reg = <1>; };
Число в reg определяется конфигурацией адресных/strap-выводов конкретного PHY на момент снятия reset.
Допустимый диапазон Clause 22 PHY-адресов — от 0 до 31.
Значение:
reg = <0>;
следует использовать только в том случае, если PHY аппаратно сконфигурирован на адрес 0.
Адрес 0 не является broadcast-адресом PHY в Device Tree. Наличие только одного PHY на MDIO-шине также не позволяет произвольно указать reg = <0>.
Если GMAC0 и GMAC1 используют разные MDIO-шины, PHY на этих шинах могут иметь одинаковые адреса — конфликт в этом случае отсутствует.
В: Ethernet работает нестабильно, низкая скорость (100–200 Мбит/с вместо гигабита)
О: Для RK3568 линии RGMII должны иметь последовательное согласование 22 Ом.
Для сигналов, формируемых RK3568:
TXD0...TXD3 TXCLK TXEN
резисторы 22 Ом устанавливаются возле RK3568.
Для сигналов, формируемых PHY:
RXD0...RXD3 RXCLK RXDV
резисторы 22 Ом устанавливаются возле PHY.
То есть резистор располагается возле источника сигнала, а не просто «на RX_CLK и TX_CLK».
Rockchip также задаёт следующие требования для RGMII:
single-ended impedance:
50 Ω ±10 %;рассогласование
TXD[3:0]/TXENотносительноTXCLK— менее 120 mil;рассогласование
RXD[3:0]/RXDVотносительноRXCLK— менее 120 mil;общая длина линии — менее 5000 mil;
непрерывная опорная GND-плоскость.
Отсутствие или неправильное размещение согласующих резисторов может ухудшить целостность сигнала, но низкая скорость Ethernet не обязательно вызвана только ими.
Если линк устанавливается только на 100baseT, необходимо отдельно проверить автосогласование, кабель, magnetics и PHY.
Если ethtool показывает 1000baseT/Full, но фактическая пропускная способность мала или присутствуют packet errors, необходимо дополнительно проверить RGMII timing, значения delay и конфигурацию phy-mode.
В: PHY держит RESET в нуле — сигнал не отпускается после включения
О: Если линия RESET# PHY постоянно находится в низком уровне, необходимо проверять управление reset, а не наличие PHY_ID.
В Device Tree для Ethernet PHY могут использоваться:
reset-gpios = <... GPIO_ACTIVE_LOW>; reset-assert-us = <...>; reset-deassert-us = <...>;
reset-gpios определяет GPIO и его активный уровень, а reset-assert-us и reset-deassert-us задают временные интервалы сброса.
Необходимо проверить:
правильность GPIO в
reset-gpios;полярность
GPIO_ACTIVE_LOW/GPIO_ACTIVE_HIGH;IOMUX соответствующего GPIO;
наличие внешней подтяжки, если она предусмотрена схемой;
отсутствие аппаратного короткого замыкания на GND;
корректность времён assert/deassert.
Если PHY удерживается в reset, чтение PHY_ID по MDIO невозможно. Поэтому отсутствие PHY_ID в данном случае является следствием удержания PHY в reset, а не причиной того, что драйвер не отпускает reset.
В: Какой драйвер PHY нужен для сторонних микросхем (например, Dapu Telecom, YT8531)?
О: Linux PHY Library (phylib) определяет PHY по идентификатору PHY_ID, который считывается через MDIO, и выбирает зарегистрированный драйвер, поддерживающий этот идентификатор.
Для обычного Clause 22 PHY достаточно корректно указать MDIO-адрес:
ethernet-phy@1 { reg = <1>; };
Явно задавать vendor-specific compatible обычно не требуется: PHY идентифицируется по регистрам PHY ID.
Если PHY нельзя корректно идентифицировать до выполнения специальной последовательности reset/clock/power или он возвращает неправильный ID, Device Tree binding допускает явное указание идентификатора в форме:
compatible = "ethernet-phy-idXXXX.XXXX";
Для Motorcomm YT85xx, включая поддерживаемые варианты YT8531, используется драйвер:
drivers/net/phy/motorcomm.c
и параметр конфигурации ядра:
CONFIG_MOTORCOMM_PHY
Для PHY другого производителя необходимо определить точную модель и PHY_ID и убедиться, что соответствующий драйвер включён в конфигурацию ядра.