On Wed, Oct 10, 2018 at 6:48 AM Cédric Le Goater <c...@kaod.org> wrote: > > Signed-off-by: Cédric Le Goater <c...@kaod.org> > --- > drivers/net/ftgmac100.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/drivers/net/ftgmac100.c b/drivers/net/ftgmac100.c > index b46187b567c6..edf34c601c68 100644 > --- a/drivers/net/ftgmac100.c > +++ b/drivers/net/ftgmac100.c > @@ -28,6 +28,9 @@ > /* PKTBUFSTX/PKTBUFSRX must both be power of 2 */ > #define PKTBUFSTX 4 /* must be power of 2 */ > > +/* Timeout for transmit */ > +#define FTGMAC100_TX_TIMEOUT_MS 1000 > + > /* Timeout for a mdio read/write operation */ > #define FTGMAC100_MDIO_TIMEOUT_USEC 10000 > > @@ -412,6 +415,7 @@ static int ftgmac100_send(struct udevice *dev, void > *packet, int length) > roundup(sizeof(*curr_des), ARCH_DMA_MINALIGN); > ulong data_start; > ulong data_end; > + ulong start; > > invalidate_dcache_range(des_start, des_end); > > @@ -444,6 +448,20 @@ static int ftgmac100_send(struct udevice *dev, void > *packet, int length) > /* Start transmit */ > writel(1, &ftgmac100->txpd); > > + /* Wait until packet is transmitted */ > + start = get_timer(0); > + while (get_timer(start) < FTGMAC100_TX_TIMEOUT_MS) {
In general we prefer to use wait_bit.h for such things. Probably just define a BUILD_WAIT_FOR_BIT() in your .c to handle your memory access. > + invalidate_dcache_range(des_start, des_end); > + if (!(curr_des->txdes0 & FTGMAC100_TXDES0_TXDMA_OWN)) > + break; > + udelay(10); > + } > + > + if (get_timer(start) >= FTGMAC100_TX_TIMEOUT_MS) { > + dev_err(dev, "transmit timeout\n"); > + return -ETIMEDOUT; > + } > + > debug("%s(): packet sent\n", __func__); > > /* Move to next descriptor */ > -- > 2.17.1 > > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > https://lists.denx.de/listinfo/u-boot _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot