mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-26 22:52:18 +00:00
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>
This commit is contained in:
parent
ed10e66aba
commit
4edcf0a3df
1 changed files with 19 additions and 25 deletions
|
@ -407,6 +407,25 @@ 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);
|
||||
|
||||
dev->phy_id = asix_get_phy_addr(dev);
|
||||
if (dev->phy_id < 0)
|
||||
debug("Failed to read phy id\n");
|
||||
|
||||
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)
|
||||
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");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -422,31 +441,6 @@ static int asix_init(struct eth_device *eth, bd_t *bd)
|
|||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
if (asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL) < 0)
|
||||
goto out_err;
|
||||
|
||||
|
|
Loading…
Reference in a new issue