こんにちは。ls1028a で 10g usxgmii phy を起動しようとしていますが、いくつか問題が発生しています。この phy は、4x2.5Gb 構成で、usxgmii リンクを介して 4 つのポートを集約します。
私が使用している PHY は正常に動作しているようです。ファームウェアがロードされ、PHY はリンク パートナーがポートにコネクテッドであること検出し、パートナーとリンク速度をネゴシエートしますが、SoC との通信に失敗します。Phy は、usxgmii 自動ネゴシエーションだけでなく、usxgmii 経由で 4 つのポートを集約するように構成されています。
RCW で 0x13cc Serdes プロトコルを有効にしました。phy は Serdes レーン 1 にコネクテッドです。Serdes PLL は PLL ロックを正しく取得します。
以下は私が使用しているデバイス ツリー フラグメントです。
&enetc_mdio_pf3 {
rgmii_phy0: ethernet-phy@1 {
reg = <0x01>;
};
qxgmii_phy0: ethernet-phy@18 {
reg = <0x18>;
compatible = "ethernet-phy-ieee802.3-c45";
};
qxgmii_phy1: ethernet-phy@19 {
reg = <0x19>;
compatible = "ethernet-phy-ieee802.3-c45";
};
qxgmii_phy2: ethernet-phy@1a {
reg = <0x1a>;
compatible = "ethernet-phy-ieee802.3-c45";
};
qxgmii_phy3: ethernet-phy@1b {
reg = <0x1b>;
compatible = "ethernet-phy-ieee802.3-c45";
};
};
&enetc_port1 {
phy-handle = <&rgmii_phy0>;
phy-mode = "rgmii-id";
status = "okay";
};
&enetc_port2 {
status = "okay";
};
&enetc_port3 {
status = "okay";
};
&mscc_felix {
status = "okay";
};
&mscc_felix_port0 {
label = "swp0";
managed = "in-band-status";
phy-handle = <&qxgmii_phy0>;
phy-mode = "10g-qxgmii";
phys = <&serdes 1>;
phy-names = "serdes";
status = "okay";
};
&mscc_felix_port1 {
label = "swp1";
managed = "in-band-status";
phy-handle = <&qxgmii_phy1>;
phy-mode = "10g-qxgmii";
phys = <&serdes 1>;
phy-names = "serdes";
status = "okay";
};
&mscc_felix_port2 {
label = "swp2";
managed = "in-band-status";
phy-handle = <&qxgmii_phy2>;
phy-mode = "10g-qxgmii";
phys = <&serdes 1>;
phy-names = "serdes";
status = "okay";
};
&mscc_felix_port3 {
label = "swp3";
managed = "in-band-status";
phy-handle = <&qxgmii_phy3>;
phy-mode = "10g-qxgmii";
phys = <&serdes 1>;
phy-names = "serdes";
status = "okay";
};
&mscc_felix_port4 {
status = "okay";
};
&mscc_felix_port5 {
status = "okay";
};それは正しいようです。
いくつかのトレースを追加するために PCS lynx ソース コードを変更しました。以下は変更点の 1 つです。
static void lynx_pcs_get_state_usxgmii(struct mdio_device *pcs,
struct phylink_link_state *state)
{
pr_info("%s\n", __func__);
struct mii_bus *bus = pcs->bus;
int addr = pcs->addr;
int status, lpa;
status = mdiobus_c45_read(bus, addr, MDIO_MMD_VEND2, MII_BMSR);
if (status < 0)
return;
state->link = !!(status & MDIO_STAT1_LSTATUS);
state->an_complete = !!(status & MDIO_AN_STAT1_COMPLETE);
dev_info(&pcs->dev, "%s: link=%u, an_complete: %u\n", __func__, state->link, state->an_complete);
if (!state->link || !state->an_complete)
return;
lpa = mdiobus_c45_read(bus, addr, MDIO_MMD_VEND2, MII_LPA);
if (lpa < 0)
return;
phylink_decode_usxgmii_word(state, lpa);
}
例えばインターフェースを開くたびにswp0 ログには常に link = 1、an_complete=0 が報告されています。
自動ネゴシエーションが完了しない理由を突き止めるのに苦労しています。
私は Linux 側からカスタム ドライバを必要とする phy を使用していますが、現時点では、ドライバの read_status 関数でリンクがアップしていて速度が 1000 であることを報告しています。これは、phy が設計されたモードで動作するように事前構成されているため、厳密な config init を必要としないためです。
pcs_lynx が link = 1 を報告しているのに、autoneg を完了しないのはなぜでしょうか?
Linuxメインラインのカーネルリンクで関連パッチを見つけました:コミット · torvalds/linux · GitHub
いくつかは NXP Linux-factory に統合されていません。
顧客はそれらを参照することができます。
こんにちは。ご返信ありがとうございます。提供されたパッチを確認しましたが、そうではないようです。
私は linux-qoriq 6.6 を使用しており、パッチについては次のとおりです。
- 0001-arm64-dts-ls1028a-add-Lynx-10G-SerDes-nodes-on-NXP-b.patch - すでに 6.6 に含まれています
- 0001-arm64-dts-ls1028a-qds-replace-usxgmii-with-10g-qxgmi.patch - すでに 6.6 に含まれています
- 0001-net-dsa-felix-support-phy-mode-10g-qxgmii.patch - 6.6に既に含まれていますが、
+ if (ocelot->ports[port]->phy_mode == PHY_INTERFACE_MODE_USXGMII)
+ __set_bit(PHY_INTERFACE_MODE_10G_QXGMII,
+ config->supported_interfaces);felix.c 内ただし、phy_modeが10G_QXGMIIではなくUSXGMIIの場合にのみ重要です。
- 0001-net-pcs-lynx-accept-in-band-autoneg-for-2500base-x.patch - 10G-QXGMIIとは関係ありません
- 0001-net-pcs-lynx-no-need-to-read-LPA-in-lynx_pcs_get_sta.patch - 10G-QXGMII とは関係ありません
- 0001-net-pcs-lynx-support-phy-mode-10g-qxgmii.patch - まったく適用できません - 6.6 および 6.12 の phylink レイヤーは、メインラインの変更から大きく遅れています。この変更はいずれにせよ、大きな意味をもたらすものではない
他に何かアイデアはありますか? 何が間違っているのでしょうか?私は PHY のベンダーと連絡を取っていますが、ベンダーの観点からすると PHY は適切な構成で稼働しています。
最新情報をお伝えしたいと思います。原因を突き止めようとドキュメントを参照していたところ、Serdes モジュール MDIO デバイスのレジスタ定義 (第 29.6 章 LS1028ARM.pdf) を見つけました。アドレス 0x1F には、QXGMII USXGMII レプリケーター レジスタと呼ばれるデバイスがあります。pcs-lynx ドライバーは、このデバイスを使用して USXGMII レプリケーターの機能を設定します。
pcs.lynx.c(lynx_pcs_config_usxgmii)
/* USXGMIIレプリケータのデバイス機能を設定します */
mdiobus_c45_write(バス、アドレス、MDIO_MMD_VEND2、MII_ADVERTISE、
MDIO_USXGMII_10G | MDIO_USXGMII_LINK |
MDIO_USXGMII_FULL_DUPLEX |
ADVERTISE_SGMII | ADVERTISE_LPACK);
このデバイスのアドレス空間をブラウズしているときに、QXGMII USXGMIIレプリケータに制御レジスタ(0x00h)があり、そこに「Auto_Negotiaton_Enable」ビット(29.6.5.3)があることに気付きました。制御レジスタ (CONTROL) (LS1028ARM.pdf)。
このレジスタをダンプしたところ、常に 0 になっていることがわかりました。好奇心から、このレジスタを変更してビット 12 を 1 に設定したところ、どういうわけか自動ネゴシエーションが開始されました。pcs-lynx はリンク パートナーの機能を確認し、リンク速度を検出し、他のデバイスからインターフェイスを ping することさえできました。これは解決策ではないと思いますが、私の問題を理解していただき、解決策を見つけるのに役立つかもしれないヒントとして、これを皆さんと共有します。なぜ設定されないのか理解できません。設定する必要があるのかどうかもわかりません。設定する必要がある場合、どのような状況で設定する必要があるのかもわかりません。
こんにちは。ご返信ありがとうございます。提供されたパッチを確認しましたが、そうではないようです。
私は linux-qoriq 6.6 を使用しており、パッチについては次のとおりです。
- 0001-arm64-dts-ls1028a-add-Lynx-10G-SerDes-nodes-on-NXP-b.patch - すでに 6.6 に含まれています
- 0001-arm64-dts-ls1028a-qds-replace-usxgmii-with-10g-qxgmi.patch - すでに 6.6 に含まれています
- 0001-net-dsa-felix-support-phy-mode-10g-qxgmii.patch - 6.6に既に含まれていますが、
+ if (ocelot->ports[ポート]->phy_mode == PHY_INTERFACE_MODE_USXGMII)
+ __set_bit(PHY_INTERFACE_MODE_10G_QXGMII、
+ config->supported_interfaces);
felix.c 内ただし、phy_modeが10G_QXGMIIではなくUSXGMIIの場合にのみ重要です。
- 0001-net-pcs-lynx-accept-in-band-autoneg-for-2500base-x.patch - 10G-QXGMIIとは関係ありません
- 0001-net-pcs-lynx-no-need-to-read-LPA-in-lynx_pcs_get_sta.patch - 10G-QXGMII とは関係ありません
- 0001-net-pcs-lynx-support-phy-mode-10g-qxgmii.patch - まったく適用できません - 6.6 および 6.12 の phylink レイヤーは、メインラインの変更から大きく遅れています。この変更はいずれにせよ、大きな意味をもたらすものではない
他に何かアイデアはありますか? 何が間違っているのでしょうか?私は PHY のベンダーと連絡を取っていますが、ベンダーの観点からすると PHY は適切な構成で稼働しています。
linux-qoriq 6.6 https://github.com/nxp-qoriq/linux/tree/lf-6.6.yはls1028a で 10g-qxgmii 4x2,5Gb インターフェイスを使用するために必要なすべてのパッチが含まれていますか?
AE チームからの次のアップデートを参照してください。
お客様は「10G-QXGMII」を使いたいのだと思いますが、これはUSXGMIIとは少し異なります。
お客様は以下を参照できます: arch/arm64/boot/dts/freescale/fsl-ls1028a-qds-13bb.dtso
「10G-QXGMII」は ls1028a-qds ボードでのみサポートされ、rdb ボードではサポートされません。
dtso ファイルには次のコメントがあります。
+ * レーン B のリワークを伴う LS1028A QDS ボードが必要です。
+ * コネクタのレーン A を PHY レーン C に再配線した SCH-30841 カードが必要です。
+ * セットアップでは、スロット 1 に SCH-30842 カード、スロット 2 に SCH-30841 カードが装着されています。
「10G-QXGMII」SerDesのドライバは、drivers/phy/freescale/phy-fsl-lynx-10g.cにあります。
顧客は、「git log -p --author=Vladimir」を実行してから 10G_QXGMII を検索することで、Linux メインラインの関連パッチを取得することもできます。
よろしくお願いします。
LSDK開発チームからも返答をいただきました。
この顧客もアップストリームを通じて私に連絡してきました。
https://lore.kernel.org/netdev/CA+DkFDaW_wJ5p9_P7pMpz-8iE6xeKkdF-MQcd2m2GcyVUE3S4Q@mail.gmail.com/
そこに回答を投稿しました。
同じトピックに対して 2 つのコミュニケーション チャネルを開いたままにしておく必要はないと思います。