diff options
| author | Julius Werner <jwerner@chromium.org> | 2013-05-11 13:35:02 -0700 | 
|---|---|---|
| committer | Marek Vasut <marex@denx.de> | 2013-06-12 22:22:51 +0200 | 
| commit | 4edcf0a3dfd3cfa6b6c99dd1c893b7c96aa52d12 (patch) | |
| tree | b1f26322628de13153d0e4ff293e9d23d8783f45 | |
| parent | ed10e66aba4d6a0151dc6dff2fa93d5fd19bc8a2 (diff) | |
| download | olio-uboot-2014.01-4edcf0a3dfd3cfa6b6c99dd1c893b7c96aa52d12.tar.xz olio-uboot-2014.01-4edcf0a3dfd3cfa6b6c99dd1c893b7c96aa52d12.zip | |
usb: asix: Move software resets to basic_init
The ASIX driver calls a basic_init() function during get_info(), so that
not all initialization tasks need to be redone on every init().
Unfortunately, the most important one is still triggered too often: the
driver does a full port and MII reset on every asix_init(), requiring up
to several seconds to reestablish the link.
This patch confines that software reset into the asix_basic_init()
function so that it will only be executed once. This saves about a
second of boot time on systems using BOOTP.
Note: this patch was previously submitted many moons ago as:
   usb: usbeth: asix: Do a fast init if link already established
That patch seens to have been lost or forgotten, so this is a rebased
version. It is tested on snow with a Asix USB dongle (Cisco).
Signed-off-by: Julius Werner <jwerner@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
| -rw-r--r-- | drivers/usb/eth/asix.c | 40 | 
1 files changed, 17 insertions, 23 deletions
| diff --git a/drivers/usb/eth/asix.c b/drivers/usb/eth/asix.c index 75ec8f788..76624b925 100644 --- a/drivers/usb/eth/asix.c +++ b/drivers/usb/eth/asix.c @@ -407,46 +407,40 @@ static int asix_basic_reset(struct ueth_data *dev)  	rx_ctl = asix_read_rx_ctl(dev);  	debug("RX_CTL is 0x%04x setting to 0x0000\n", rx_ctl); -	return 0; -} - -/* - * Asix callbacks - */ -static int asix_init(struct eth_device *eth, bd_t *bd) -{ -	struct ueth_data	*dev = (struct ueth_data *)eth->priv; -	int timeout = 0; -#define TIMEOUT_RESOLUTION 50	/* ms */ -	int link_detected; - -	debug("** %s()\n", __func__); -  	dev->phy_id = asix_get_phy_addr(dev);  	if (dev->phy_id < 0)  		debug("Failed to read phy id\n"); -	if (asix_sw_reset(dev, AX_SWRESET_PRL) < 0) -		goto out_err; - -	if (asix_sw_reset(dev, AX_SWRESET_IPRL | AX_SWRESET_PRL) < 0) -		goto out_err; -  	asix_mdio_write(dev, dev->phy_id, MII_BMCR, BMCR_RESET);  	asix_mdio_write(dev, dev->phy_id, MII_ADVERTISE,  			ADVERTISE_ALL | ADVERTISE_CSMA);  	mii_nway_restart(dev);  	if (asix_write_medium_mode(dev, AX88772_MEDIUM_DEFAULT) < 0) -		goto out_err; +		return -1;  	if (asix_write_cmd(dev, AX_CMD_WRITE_IPG0,  				AX88772_IPG0_DEFAULT | AX88772_IPG1_DEFAULT,  				AX88772_IPG2_DEFAULT, 0, NULL) < 0) {  		debug("Write IPG,IPG1,IPG2 failed\n"); -		goto out_err; +		return -1;  	} +	return 0; +} + +/* + * Asix callbacks + */ +static int asix_init(struct eth_device *eth, bd_t *bd) +{ +	struct ueth_data	*dev = (struct ueth_data *)eth->priv; +	int timeout = 0; +#define TIMEOUT_RESOLUTION 50	/* ms */ +	int link_detected; + +	debug("** %s()\n", __func__); +  	if (asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL) < 0)  		goto out_err; |