Debido a un problema en la versión 5.4 y posteriores del kernel Linux-socfpga, HPS EMAC puede bloquearse o detenerse en algunas circunstancias.
Este problema se debe a una configuración incorrecta en el árbol de dispositivos Linux SoC de Cyclone® V
- El bit de anulación de habilitación compartida debe estar habilitado en el controlador de caché L2C-310
- El límite de transacciones pendientes de lectura y escritura debe establecerse en 0xf en el DMA de EMAC
Para evitar este problema, realice los pasos siguientes:
1. Asegúrese de que el nodo del árbol de dispositivos L2C-310 establezca el bit compartido Habilitar anulación, editando arch/arm/boot/dts/socfpga.dtsi
L2: cache-controller@fffef000 {
compatible = "arm,pl310-cache";
reg = <0xfffef000 0x1000>;
interrupciones = <0 38 0x04>;
caché unificado;
nivel de caché = <2>;
arm,tag-latency = <1 1 1>;
arm,latencia de datos = <2 1 1>;
prefetch-data = <1>;
prefetch-instr = <1>;
brazo, compartido-anulación; # Compruebe que esto esté presente
brazo,relleno de línea doble = <1>;
brazo,double-linefill-incr = <0>;
brazo,double-linefill-wrap = <1>;
arm,prefetch-drop = <0>;
arm,prefetch-offset = <7>;
};
2. Edite los nodos ethernet para agregar una referencia (s) para un snps, axi-config, y agregue nodos para snps, axi-config en arch / arm / boot / dts / socfpga.dtsi
Ejemplo para GMAC0:
diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi
Índice E404220.. 90a0560 100644
--- a/arch/arm/boot/dts/socfpga.dtsi
+++ b/arch/arm/boot/dts/socfpga.dtsi
@@ -560,10 +560,16 @@
reset-names = "stmmaceth";
snps,multicast-filter-bins = <256>;
snps,perfect-filter-entries = <128>;
+ snps,axi-config = <&stmmac_axi_setup_0>;
tx-fifo-profundidad = <4096>;
rx-fifo-profundidad = <4096>;
estado = "deshabilitado";
};
+
+ stmmac_axi_setup_0: stmmac-axi-config_0 {
+ snps,wr_osr_lmt = <0xf>;
+ snps,rd_osr_lmt = <0xf>;
+ };
Este problema se ha solucionado a partir de las ramas linux-socfpga-5.10.120-lts y linux-socfpga-5.15.30-lts