diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/net/fec_mxc.c | 14 | 
1 files changed, 13 insertions, 1 deletions
| diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index bc44d38b4..6f071e941 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -35,6 +35,12 @@  DECLARE_GLOBAL_DATA_PTR; +/* + * Timeout the transfer after 5 mS. This is usually a bit more, since + * the code in the tightloops this timeout is used in adds some overhead. + */ +#define FEC_XFER_TIMEOUT	5000 +  #ifndef CONFIG_MII  #error "CONFIG_MII has to be defined!"  #endif @@ -697,6 +703,8 @@ static int fec_send(struct eth_device *dev, void *packet, int length)  	unsigned int status;  	uint32_t size, end;  	uint32_t addr; +	int timeout = FEC_XFER_TIMEOUT; +	int ret = 0;  	/*  	 * This routine transmits one frame.  This routine only accepts @@ -764,6 +772,10 @@ static int fec_send(struct eth_device *dev, void *packet, int length)  	while (readw(&fec->tbd_base[fec->tbd_index].status) & FEC_TBD_READY) {  		udelay(1);  		invalidate_dcache_range(addr, addr + size); +		if (!timeout--) { +			ret = -EINVAL; +			break; +		}  	}  	debug("fec_send: status 0x%x index %d\n", @@ -775,7 +787,7 @@ static int fec_send(struct eth_device *dev, void *packet, int length)  	else  		fec->tbd_index = 1; -	return 0; +	return ret;  }  /** |