aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCédric Le Goater2018-10-29 01:06:35 -0500
committerJoe Hershberger2018-11-05 10:41:57 -0600
commitd0e0b84c662406d5a49be03e7e2cb66abca71003 (patch)
tree0eff2a6d3cdc64dafb1d704ecf5a4b8183423f67 /drivers
parente766849713ff8d1b0fe1c6e9334225ad1d24a2a4 (diff)
downloadu-boot-d0e0b84c662406d5a49be03e7e2cb66abca71003.tar.gz
u-boot-d0e0b84c662406d5a49be03e7e2cb66abca71003.tar.xz
u-boot-d0e0b84c662406d5a49be03e7e2cb66abca71003.zip
net: ftgmac100: handle timeouts when transmitting
Signed-off-by: Cédric Le Goater <clg@kaod.org> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ftgmac100.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/ftgmac100.c b/drivers/net/ftgmac100.c
index bf86008146..ec46add1d3 100644
--- a/drivers/net/ftgmac100.c
+++ b/drivers/net/ftgmac100.c
@@ -14,6 +14,7 @@
14#include <dm.h> 14#include <dm.h>
15#include <miiphy.h> 15#include <miiphy.h>
16#include <net.h> 16#include <net.h>
17#include <wait_bit.h>
17#include <linux/io.h> 18#include <linux/io.h>
18#include <linux/iopoll.h> 19#include <linux/iopoll.h>
19 20
@@ -28,6 +29,9 @@
28/* PKTBUFSTX/PKTBUFSRX must both be power of 2 */ 29/* PKTBUFSTX/PKTBUFSRX must both be power of 2 */
29#define PKTBUFSTX 4 /* must be power of 2 */ 30#define PKTBUFSTX 4 /* must be power of 2 */
30 31
32/* Timeout for transmit */
33#define FTGMAC100_TX_TIMEOUT_MS 1000
34
31/* Timeout for a mdio read/write operation */ 35/* Timeout for a mdio read/write operation */
32#define FTGMAC100_MDIO_TIMEOUT_USEC 10000 36#define FTGMAC100_MDIO_TIMEOUT_USEC 10000
33 37
@@ -401,6 +405,19 @@ static int ftgmac100_recv(struct udevice *dev, int flags, uchar **packetp)
401 return rxlen; 405 return rxlen;
402} 406}
403 407
408static u32 ftgmac100_read_txdesc(const void *desc)
409{
410 const struct ftgmac100_txdes *txdes = desc;
411 ulong des_start = (ulong)txdes;
412 ulong des_end = des_start + roundup(sizeof(*txdes), ARCH_DMA_MINALIGN);
413
414 invalidate_dcache_range(des_start, des_end);
415
416 return txdes->txdes0;
417}
418
419BUILD_WAIT_FOR_BIT(ftgmac100_txdone, u32, ftgmac100_read_txdesc)
420
404/* 421/*
405 * Send a data block via Ethernet 422 * Send a data block via Ethernet
406 */ 423 */
@@ -414,6 +431,7 @@ static int ftgmac100_send(struct udevice *dev, void *packet, int length)
414 roundup(sizeof(*curr_des), ARCH_DMA_MINALIGN); 431 roundup(sizeof(*curr_des), ARCH_DMA_MINALIGN);
415 ulong data_start; 432 ulong data_start;
416 ulong data_end; 433 ulong data_end;
434 int rc;
417 435
418 invalidate_dcache_range(des_start, des_end); 436 invalidate_dcache_range(des_start, des_end);
419 437
@@ -446,6 +464,12 @@ static int ftgmac100_send(struct udevice *dev, void *packet, int length)
446 /* Start transmit */ 464 /* Start transmit */
447 writel(1, &ftgmac100->txpd); 465 writel(1, &ftgmac100->txpd);
448 466
467 rc = wait_for_bit_ftgmac100_txdone(curr_des,
468 FTGMAC100_TXDES0_TXDMA_OWN, false,
469 FTGMAC100_TX_TIMEOUT_MS, true);
470 if (rc)
471 return rc;
472
449 debug("%s(): packet sent\n", __func__); 473 debug("%s(): packet sent\n", __func__);
450 474
451 /* Move to next descriptor */ 475 /* Move to next descriptor */