lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Date:   Sat, 5 Jan 2019 10:13:17 -0500
From:   Christopher Friedt <chrisfriedt@...il.com>
To:     netdev@...r.kernel.org
Subject: stm32f7 / stmmac dma soft reset hangs

Hi list!

I've been tracing down an ethernet issue on the stm32f746-discovery
board. Several additional device tree entries were required, so there
may be a patch forthcoming for those in the near future, but then the
ethernet mac seemed to fail on dma initialization[1] after
smmac_open() is called.

The code below [2] always returns -EBUSY. It's a bit puzzling. U-Boot
first resets the dma, then clears a portselect bit and then waits for
the reset to finish [3], but that portselect does not even seem to be
a part of the register map of the stm32f746 according to the reference
manual [4] (possibly part of a different register in this silicon
spin?).

Just thought I would see if anyone on the list has any thoughts on the
matter, or if perhaps anyone from ST is on the list too and has some
thoughts.

Cheers,

C

[1]
[  179.344820] stm32-dwmac 40028000.ethernet: Failed to reset the dma
[  179.351340] stm32-dwmac 40028000.ethernet eth0: stmmac_hw_setup:
DMA engine initialization failed
[  179.360540] stm32-dwmac 40028000.ethernet eth0: stmmac_open: Hw setup failed

[2]
int dwmac_dma_reset(void __iomem *ioaddr)
{
u32 value = readl(ioaddr + DMA_BUS_MODE);
int err;

/* DMA SW reset */
value |= DMA_BUS_MODE_SFT_RESET;
writel(value, ioaddr + DMA_BUS_MODE);

err = readl_poll_timeout(ioaddr + DMA_BUS_MODE, value,
!(value & DMA_BUS_MODE_SFT_RESET),
10000, 100000);
if (err)
return -EBUSY;

return 0;
}

[3]
       /*
         * When a MII PHY is used, we must set the PS bit for the DMA
         * reset to succeed.
         */
        if (priv->phydev->interface == PHY_INTERFACE_MODE_MII)
                writel(readl(&mac_p->conf) | MII_PORTSELECT, &mac_p->conf);
        else
                writel(readl(&mac_p->conf) & ~MII_PORTSELECT, &mac_p->conf);

[4]
https://goo.gl/oxei9o

Powered by blists - more mailing lists