Ze względu na problem w jądrze Linux-socfpga w wersji 5.4 i nowszej HPS EMAC może się w pewnych okolicznościach zawiesić lub zawiesić.
Ten problem jest spowodowany nieprawidłowym ustawieniem w drzewie urządzenia Linux układu SoC Cyclone® V
- Bit Shared Enable Override musi być włączony na kontrolerze pamięci podręcznej L2C-310
- Limit nierozstrzyggniętej transakcji odczytu i zapisu należy ustawić na 0xf na DMA EMAC
Aby rozwiązać ten problem, wykonaj następujące czynności:
1. Upewnij się, że węzeł drzewa urządzenia L2C-310 ustawia wspólny bit Enable Override, edytując arch/arm/boot/dts/socfpga.dtsi
L2: controller@fffef000 cache {
kompatybilność = "arm,pl310-cache";
reg = <0xfffef000 0x1000>;
przerwania = <0, 38 0x04>;
ujednolicone w pamięci podręcznej;
poziom pamięci cache = <2>;
arm,tag-latency = <1 1 1>;
opóźnienie transmisji danych — <2 1 1>;
dane wstępne = <1>;
prefetch-instr = <1>;
arm,shared-override; # Sprawdź, czy jest obecny
arm,double-line wysuszone = <1>;
arm,double-line wcr = <0>;
arm,double-line przesuwne-osem = <1>;
arm,prefetch-drop = <0>;
przesunięcie zestawu (prefetch) = <7>;
};
2. Zmodyfikuj węzeł (węzły) Ethernet, aby dodać punkt referencyjny dla snps,axi-config i dodać węzły dla snps, axi-config w arch/arm/boot/dts/socfpga.dtsi
Przykład GMAC0:
diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi
indeks e404220.. 100644 90a0560
--- a/arch/arm/boot/dts/socfpga.dtsi
+++ b/arch/arm/boot/dts/socfpga.dtsi
@@ -560,10 +560,16 @@
nazwy resetowania = "stmmaceth";
snps,multicast-filter-bins = <256>;
snps,perfect-filter-entries = <128>;
+ snps,axi-config = ;
głębokość tx-fifo = <4096>;
głębokość rx-fifo = <4096>;
status = "wyłączony";
};
+
+ stmmac_axi_setup_0: stmmac-axi-config_0 {
+ snps,wr_osr_lmt = <0xf>;
+ snps,rd_osr_lmt = <0xf>;
+ };
Ten problem ma zostać naprawiony w przyszłej wersji jądra Linux-Socfpga.