[PATCH] Temporary fix for ethernet rx intr hang issue and Disable cache

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Jun 29 07:19:45 UTC 2015



On 25/06/15 18:20, ragunath wrote:
> This patch has two changes that are needed for networking to work in BBB.
> We disable cache as it is causing random values to be learned in the cpsw Address
> Lookup Engine(ALE) causing tx to fail. Vector enable is done after handler is called by the server task.
>
> ---
>   c/src/lib/libbsp/arm/beagle/irq.c                 | 2 ++
>   c/src/lib/libbsp/arm/beagle/startup/bspstartmmu.c | 8 +++++---
>   2 files changed, 7 insertions(+), 3 deletions(-)
>
> diff --git a/c/src/lib/libbsp/arm/beagle/irq.c b/c/src/lib/libbsp/arm/beagle/irq.c
> index c6485cd..64e7756 100644
> --- a/c/src/lib/libbsp/arm/beagle/irq.c
> +++ b/c/src/lib/libbsp/arm/beagle/irq.c
> @@ -73,6 +73,7 @@ void bsp_interrupt_dispatch(void)
>   
>       _ARMV4_Status_restore(psr);
>   
> +    if(!(irq == 40 || irq == 41 || irq == 42 || irq == 43))
>       bsp_interrupt_vector_enable(irq);
>     }
>   }

Why not remove the bsp_interrupt_vector_disable/enable() calls in 
bsp_interrupt_dispatch() unconditionally?

> @@ -94,6 +95,7 @@ rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
>     uint32_t mask, cur;
>     uint32_t mir_reg = get_mir_reg(vector, &mask);
>   
> +  irqs_enabled[vector] = 1;
>     cur = mmio_read(omap_intr.base + mir_reg);
>     mmio_write(omap_intr.base + mir_reg, cur & ~mask);
>     flush_data_cache();
> diff --git a/c/src/lib/libbsp/arm/beagle/startup/bspstartmmu.c b/c/src/lib/libbsp/arm/beagle/startup/bspstartmmu.c
> index 157edfa..6cd0f38 100644
> --- a/c/src/lib/libbsp/arm/beagle/startup/bspstartmmu.c
> +++ b/c/src/lib/libbsp/arm/beagle/startup/bspstartmmu.c
> @@ -44,15 +44,17 @@ BSP_START_TEXT_SECTION void beagle_setup_mmu_and_cache(void)
>   {
>     /* turn mmu off first in case it's on */
>     uint32_t ctrl = arm_cp15_start_setup_mmu_and_cache(
> -    ARM_CP15_CTRL_M | ARM_CP15_CTRL_A,	/* clear - mmu off */
> +    ARM_CP15_CTRL_M | ARM_CP15_CTRL_A | ARM_CP15_CTRL_I | ARM_CP15_CTRL_C,	/* clear - mmu off */
>       ARM_CP15_CTRL_AFE | ARM_CP15_CTRL_Z
>     );
>   
> -  arm_cp15_start_setup_translation_table_and_enable_mmu_and_cache(
> -    ctrl,
> +  arm_cp15_start_setup_translation_table(
>       (uint32_t *) bsp_translation_table_base,
>       ARM_MMU_DEFAULT_CLIENT_DOMAIN,
>       &beagle_mmu_config_table[0],
>       RTEMS_ARRAY_SIZE(beagle_mmu_config_table)
>     );
> +
> +  ctrl |= ARM_CP15_CTRL_M;
> +  arm_cp15_set_control(ctrl);
>   }

I would rather fix the driver. Add cache flush/invalidate calls to the 
right spots or use a non-cacheable memory area, see 
rtems_cache_coherent_allocate() for example.

-- 
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.huber at embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.




More information about the devel mailing list