NXPチームの皆様、こんにちは。
私はi.MX93 SoMと、RMIIモードの外部LAN8720A PHYを使用しています。
イーサネットインターフェースの初期化に失敗し、以下のエラーが報告されます:
imx-dwmac 428a0000.イーサネット eth1:
PHY [stmmac-1:00] ドライバー [SMSC LAN8710/LAN8720]
imx-dwmac 428a0000.イーサネット:
DMAのリセットに失敗しました
stmmac_hw_setup: DMAエンジンの初期化に失敗しました
__stmmac_open: ハードウェアセットアップに失敗しました
dmsg レスポンス
oot@myd-lmx9x:~# dmesg |グレップ -I eth
[ 0.000000] OF: 予約済みメモリ:初期化されたノードethosu_region@B0000000、互換性のあるid shared-dma-pool(共有済みDMA-プール)
[ 0.000000] PSCI:DTからの導管方法のプロービング。
[ 0.953397 ] FEC 42890000.イーサネット:無効MACアドレス:00:00:00:00:00:00
[ 0.960228] fec 42890000.イーサネット:ランダムMACアドレスの使用:b2:da:68:e1:93:b7
[ 0.970863] hns3: Hisilicon Ethernet Network Driver for Hip08 ファミリー - バージョン
[ 1.008422] igb: Intel(R) ギガビットイーサネットネットワークドライバー
[ 1.071474] USBcore:新インターフェースドライバーKawethに登録
[ 1.082559] USBCORE:新インターフェースドライバー登録済み cdc_ether
[ 1.646174] optee:導管方法のプロービング。
[ 1.744525] Bluetooth: BNEP(イーサネットエミュレーション) バージョン1.3
[ 2.560730] FEC 42890000.イーサネット eth0: 登録済みPHCデバイス0
[ 2.567579] IMX-DWMAC 428A0000.イーサネット:IRQ eth_lpi見つかりません
[ 2.573824] imx-dwmac 428a0000.イーサネット:ユーザーID:0x10、Synopsys ID:0x52
[ 2.580662] IMX-DWMAC 428a0000.イーサネット:DWMAC4/5
[ 2.585448] imx-dwmac 428a0000.イーサネット:DMAハードウェア機能レジスタのサポート
[ 2.592568] IMX-DWMAC 428A0000.イーサネット:RXチェックサムオフロードエンジンのサポート
[ 2.599692] IMX-DWMAC 428A0000.イーサネット:TXチェックサム挿入のサポート
[ 2.606382] IMX-DWMAC 428A0000.イーサネット:ウェイクアップ・オン・ラン支援
[ 2.612538] IMX-DWMAC 428A0000.イーサネット:ハードウェアウォッチドッグタイマーによるRX軽減を有効にする
[ 2.620184] IMX-DWMAC 428A0000.イーサネット:有効化されたL3L4フローTC(エントリ=8)
[ 2.626958] imx-dwmac 428a0000.イーサネット:有効化されたRFSフローTC(エントリ=10)
[ 2.633749] IMX-DWMAC 428A0000.イーサネット:ハードウェアTCの有効化(エントリ=256、 max_off=256)
[ 2.641316] IMX-DWMAC 428A0000.イーサネット:32/32ビットDMAホスト/デバイス幅を使用
[ 5.034969] systemd[1]: /lib/systemd/system/proftpd.service:8:標準出力タイプ syslog は廃止されました。自動的に journal に更新されます。ユニットファイルを更新し、設定自体を削除することを検討してください。
[ 9.808139 ] SMSC LAN8710/LAN8720 42890000.イーサネット-1:00:phy_poll_reset失敗:-110
[ 9.872078] FEC 42890000.ethernet eth0: phyに接続できません
[ 9.879398 IMX-DWMAC 428a0000.ethernet eth1: レジスタ MEM_TYPE_PAGE_POOL RxQ-0
[ 10.892065] imx-dwmac 428a0000.ethernet eth1: __stmmac_open: PHYに接続できません(エラー:-110)
[ 10.900872 IMX-DWMAC 428a0000.ethernet eth1: レジスタ MEM_TYPE_PAGE_POOL RxQ-0
[ 11.904042] imx-dwmac 428a0000.ethernet eth1: __stmmac_open: PHYに接続できません(エラー: -110)
[ 12.838630] SMSC LAN8710/LAN8720 42890000.ethernet-1:00:phy_poll_reset失敗:-110
[ 12.896039] fec 42890000.イーサネット eth0: phyに接続できません
[ 12.899637] imx-dwmac 428a0000.イーサネット eth1: レジスタ MEM_TYPE_PAGE_POOL RxQ-0
[ 13.904038] imx-dwmac 428a0000.イーサネット eth1: __stmmac_open: PHYに接続できません(エラー: -110)
[ 289.712584] imx-dwmac 428a0000.イーサネット eth1: レジスタ MEM_TYPE_PAGE_POOL RxQ-0
[ 290.740032] imx-dwmac 428a0000.イーサネット eth1: __stmmac_open: PHYに接続できません(エラー:-110)
[ 322.123525] imx-dwmac 428a0000.イーサネット eth1: レジスタ MEM_TYPE_PAGE_POOL RxQ-0
[ 323.104042] imx-dwmac 428a0000.イーサネット eth1: __stmmac_open: PHYに接続できません(エラー:-110)
[ 655.579526] imx-dwmac 428a0000.イーサネット eth1: レジスタ MEM_TYPE_PAGE_POOL RxQ-0
[ 656.612033] imx-dwmac 428a0000.イーサネット eth1: __stmmac_open: PHYに接続できません(エラー: -110)
ステップ1 — EQoSを分離する
FECを一時的に無効にする:
&fec {
status = "無効";
};
次に起動して確認します。
dmesg | grep -Ei "dwmac|stmmac|eqos|mdio|phy|LAN87"
PHYは4289000.イーサネットではなく、EQoS/stmmacのMDIOバスの下で見たいです。
ステップ2 — MDIOを手動で検証する
mdio-toolまたはphytoolをお持ちの場合:
phytool read eth1/0/2
phytool read eth1/0/3
LAN8720AのPHY IDは読み取り可能である必要があります。読み取りがタイムアウトするか、すべて0xffff/0x0000を返す場合、これはハードウェア/MDIO/リセット/クロックの問題であり、IPスタックの問題ではありません。
ステップ3 — クロックツリーの検証
cat /sys/kernel/debug/clk/clk_summary | grep -Ei "enet|qos"
また、そのピン上のRMII基準クロックも測定してください。NXP RMIIスレッドでは、期待される50 MHzクロックの生成とDTSアップデートを<100000000> <50000000>で記録しています。
ステップ4 — ドライバーパッチの状態を確認する
grep -n "RMII_RESET_SPEED\|imx_dwmac_mx93_reset\|fix_soc_reset" \
ドライバ/NET/イーサネット/STmicro/STMaC/DWMAC-IMX.C
存在しない場合は、i.MX93 RMII DMAリセットパッチを適用/バックポートしてください。上流パッチでは、i.MX93リセットロジックに対応しており、完全なリセットにはRMIIモードで正しいインターフェース速度を設定する必要があると記載されています。( https://www.spinics.net/lists/netdev/msg894184.html )
以下は、標準NXP BSPに対して i.MX 93(または何らかの形で i.MX 91)に対してネットワークインターフェース向けに適用すべき変更点です。
これらはU-Boot(NXPのgit hubより)の変更点です。メインラインのU-Bootを使用する場合は若干異なるかもしれませんが、基本的な考え方は同じです。ウェブ上で見かけるデバイスツリーのパラメータ、例えば「 snps,ext-refclk; 」などは、間違いなく「ウェブ上のコードは慎重に使用する」というカテゴリーに該当します。
これらのパラメータはu-bootコードやLinuxカーネル(あるいは古いプラットフォームだけ)では評価されない場合がありますので、確実に知りたい場合はこのパラメータでテキスト検索を始めて考慮されているか確認してください。
正しいDTB設定があれば両方のネットワークインターフェースはLinuxでは問題なく動作するのに、U-bootコマンドプロンプトではFECだけが動作する可能性もあります。そのためには、 imx93_evkimx93_evk.cおよびdwc_eth_qos.cに適用された以下の変更を確認してください。
uboot-imx/arch/arm/dts/imx93-11x11-evk.dts:
&fec {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_fec>;
phy-mode = "rmii";
phy-handle = <ðphy2>;
fsl,magic-packet;
status = "okay";
mdio {
#address-cells = <1>;
#size-cells = <0>;
clock-frequency = <5000000>;
ethphy2: ethernet-phy@2 {
reg = <0>; /* adapt to MDIO PHY address on your board */
eee-broken-1000t;
};
};
};
&eqos {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_eqos>;
phy-mode = "rmii";
phy-handle = <ðphy1>;
status = "okay";
mdio {
compatible = "snps,dwmac-mdio";
#address-cells = <1>;
#size-cells = <0>;
clock-frequency = <5000000>;
ethphy1: ethernet-phy@1 {
reg = <1>; /* adapt to MDIO PHY address on your board */
eee-broken-1000t;
};
};
};
pinctrl_eqos: eqosgrp { /* for 10/100 board, drive strength settings tbd */
fsl,pins = <
MX93_PAD_ENET1_MDC__ENET_QOS_MDC 0x0000017E
MX93_PAD_ENET1_MDIO__ENET_QOS_MDIO 0x0000017E
MX93_PAD_ENET1_RD0__ENET_QOS_RGMII_RD0 0x0000017E
MX93_PAD_ENET1_RD1__ENET_QOS_RGMII_RD1 0x0000017E
MX93_PAD_ENET1_RXC__ENET_QOS_RX_ER 0x0000017E
MX93_PAD_ENET1_RX_CTL__ENET_QOS_RGMII_RX_CTL 0x0000017E
MX93_PAD_ENET1_TD0__ENET_QOS_RGMII_TD0 0x0000017E
MX93_PAD_ENET1_TD1__ENET_QOS_RGMII_TD1 0x0000017E
MX93_PAD_ENET1_TD2__CCM_ENET_QOS_CLOCK_GENERATE_REF_CLK 0x0000017E
MX93_PAD_ENET1_TXC__GPIO4_IO07 0x0000011E
MX93_PAD_ENET1_TX_CTL__ENET_QOS_RGMII_TX_CTL 0x0000057E
>;
};
pinctrl_fec: fecgrp { /* for 10/100 board, drive strength settings tbd */
fsl,pins = <
MX93_PAD_ENET2_MDC__ENET1_MDC 0x0000011E
MX93_PAD_ENET2_MDIO__ENET1_MDIO 0x0000011E
MX93_PAD_ENET2_RD0__ENET1_RGMII_RD0 0x0000011E
MX93_PAD_ENET2_RD1__ENET1_RGMII_RD1 0x0000011E
MX93_PAD_ENET2_RXC__ENET1_RGMII_RXC 0x0000011E
MX93_PAD_ENET2_RX_CTL__ENET1_RGMII_RX_CTL 0x0000011E
MX93_PAD_ENET2_TD0__ENET1_RGMII_TD0 0x0000011E
MX93_PAD_ENET2_TD1__ENET1_RGMII_TD1 0x0000011E
MX93_PAD_ENET2_TD2__ENET1_TX_CLK 0x0000011E
MX93_PAD_ENET2_TXC__GPIO4_IO21 0x0000011E
MX93_PAD_ENET2_TX_CTL__ENET1_RGMII_TX_CTL 0x0000051E
>;
};
uboot-imx/arch/arm/dts/imx93.dtsi:
fec: ethernet@42890000 {
compatible = "fsl,imx93-fec", "fsl,imx8mq-fec", "fsl,imx6sx-fec";
reg = <0x42890000 0x10000>;
interrupts = ,
,
,
;
clocks = <&clk IMX93_CLK_ENET1_GATE>,
<&clk IMX93_CLK_ENET1_GATE>,
<&clk IMX93_CLK_ENET_TIMER1>,
<&clk IMX93_CLK_ENET_REF>,
<&clk IMX93_CLK_ENET_REF_PHY>;
clock-names = "ipg", "ahb", "ptp",
"enet_clk_ref", "enet_out";
assigned-clocks = <&clk IMX93_CLK_ENET_TIMER1>,
<&clk IMX93_CLK_ENET_REF>,
<&clk IMX93_CLK_ENET_REF_PHY>;
assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>,
<&clk IMX93_CLK_SYS_PLL_PFD0_DIV2>,
<&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>;
assigned-clock-rates = <100000000>, <250000000>, <50000000>;
fsl,num-tx-queues = <3>;
fsl,num-rx-queues = <3>;
fsl,stop-mode = <&wakeupmix_gpr 0x0c 1>;
status = "disabled";
};
eqos: ethernet@428a0000 {
compatible = "nxp,imx93-dwmac-eqos", "snps,dwmac-5.10a";
reg = <0x428a0000 0x10000>;
interrupts = ,
;
interrupt-names = "macirq", "eth_wake_irq";
clocks = <&clk IMX93_CLK_ENET_QOS_GATE>,
<&clk IMX93_CLK_ENET_QOS_GATE>,
<&clk IMX93_CLK_ENET_TIMER2>,
<&clk IMX93_CLK_ENET>,
<&clk IMX93_CLK_ENET_QOS_GATE>;
clock-names = "stmmaceth", "pclk", "ptp_ref", "tx", "mem";
assigned-clocks = <&clk IMX93_CLK_ENET_TIMER2>,
<&clk IMX93_CLK_ENET>;
assigned-clock-parents = <&clk IMX93_CLK_SYS_PLL_PFD1_DIV2>,
<&clk IMX93_CLK_SYS_PLL_PFD0_DIV2>;
assigned-clock-rates = <100000000>, <250000000>;
intf_mode = <&wakeupmix_gpr 0x28>;
snps,clk-csr = <0>;
status = "disabled";
};
uboot-imx/arch/arm/dts/imx93-11x11-evk-u-boot.dtsi:
&fec {
/* adapt GPIOx y to the actual pin used on your board */
phy-reset-gpios = <&gpiox y GPIO_ACTIVE_LOW>;
phy-reset-duration = <15>;
phy-reset-post-delay = <100>;
};
ðphy1 {
/* adapt GPIOx y to the actual pin used on your board */
phy-reset-gpios = <&gpiox y GPIO_ACTIVE_LOW>;
reset-assert-us = <15000>;
reset-deassert-us = <100000>;
};
imx93_11x11_evk_defconfigで考慮すべき事項:
CONFIG_USE_ETHPRIME=y
CONFIG_ETHPRIME="eth1"
CONFIG_NET_RANDOM_ETHADDR=y
CONFIG_DWC_ETH_QOS=y
CONFIG_DWC_ETH_QOS_IMX=y
CONFIG_FEC_MXC=y
CONFIG_MII=y
uboot-imx/drivers/net/dwc_eth_qos.c in function eqos_start(struct udevice *dev):
if (ret) {
pr_err("EQOS_DMA_MODE_SWR stuck indicated, continue anyway.\n");
/* ignore this error, comment the goto instruction out */
/* goto err_stop_resets; */
}
uboot-imx/board/freescale/imx93_evkimx93_evk.c:
static int setup_fec(void)
{
/*
There are PHYs which also work with a 25 MHz input clock,
configurable with a pin strapping or over MDIO, so the parameter
could also be ENET_25MHZ)
*/
return set_clk_enet(ENET_50MHZ);
}
static int setup_eqos(void)
{
struct blk_ctrl_wakeupmix_regs *bctrl = (struct blk_ctrl_wakeupmix_regs *)BLK_CTRL_WAKEUPMIX_BASE_ADDR;
u32 *IOMUXC_SW_MUX_CTL_PAD_ENET_TD2 = (u32 *)(IOMUXC_BASE_ADDR + 0xA4);
#define IOMUXC_SW_MUX_CTL_PAD_ENET_TD2_SION (1<<4)
clrbits_le32(&bctrl->enet_clk_sel,
BCTRL_ENET_CLK_SEL_ENET1_TX_CLK_SEL);
clrbits_le32(&bctrl->enet_clk_sel,
BCTRL_ENET_CLK_SEL_ENET_QOS_CLK_TX_CLK_SEL);
/* set INTF as RMII, enable RMII TX clock */
clrsetbits_le32(&bctrl->eqos_gpr,
BCTRL_GPR_ENET_QOS_INTF_MODE_MASK,
BCTRL_GPR_ENET_QOS_INTF_SEL_RMII | BCTRL_GPR_ENET_QOS_CLK_GEN_EN);
setbits_le32(&IOMUXC_SW_MUX_CTL_PAD_ENET_TD2,
IOMUXC_SW_MUX_CTL_PAD_ENET_TD2_SION);
/*
There are PHYs which also work with a 25 MHz input clock,
configurable with a pin strapping or over MDIO, so the parameter
could also be ENET_25MHZ)
*/
return set_clk_eqos(ENET_50MHZ);
}
int board_init(void)
{
#ifdef CONFIG_USB_TCPC
setup_typec();
#endif
if (IS_ENABLED(CONFIG_FEC_MXC))
setup_fec();
if (IS_ENABLED(CONFIG_DWC_ETH_QOS))
setup_eqos();
board_gpio_init();
return 0;
}
よろしくお願いいたします。
ベルンハルト。
これは難しい問題です。残念ながら、今のところ弊社の文書には記載されていません。
EQOSイーサネットMACはサードパーティ製のIPであり、STマイクロエレクトロニクスのチップにも使用されています。だからこそ、STプラットフォームのフォルダに i.MX のコードがあるのです。EQOS IPにおけるDMAのリセットに問題がある、あるいは問題があったようですが、その原因を正確に特定することはできませんでした。i.MX 93では、このチェックを無視することで問題が解決することが分かりました。なので、「err_stop_resets」へのジャンプにコメントしてください:
/drivers/net/dwc_eth_qos.c in function eqos_start
if (ret) {
- pr_err("EQOS_DMA_MODE_SWR stuck\n");
- goto err_stop_resets;
+ pr_err("EQOS_DMA_MODE_SWR stuck indicated, but continue anyway\n");
+ //goto err_stop_resets;
EQOS RMIIインターフェースのTD2ピンに50 MHzの参照クロックが表示され、SIONビットをTD2パッドからEQOS MACにクロックを戻すように設定すれば問題ないはずです。
FECはソースファイルに変更を加える必要はなく、デバイスツリーに必要な調整を加えるだけで済むはずです。
必要なデバイスツリーの設定とboard_init関数を調べて、後ほどここに投稿します。
よろしくお願いいたします。
ベルンハルト。