Hi Simon,
On Wed, Dec 12, 2012 at 7:55 PM, Simon Glass s...@chromium.org wrote:
The Asix driver takes the link down during init() and then brings it back up.
This commit changes this so that if a link has already been established
successfully we simply check that the link is still good.
Also fix up asix_halt() to actually halt RX on the interface. Previously this
was not done, so the device would continue to operate evern when halted,
violating a U-Boot requirement.
This reduces the delay between successive network commands.
Signed-off-by: Simon Glass s...@chromium.org
---
drivers/usb/eth/asix.c | 40
include/usb_ether.h|1 +
2 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/drivers/usb/eth/asix.c b/drivers/usb/eth/asix.c
index 75ec8f7..a991fea 100644
--- a/drivers/usb/eth/asix.c
+++ b/drivers/usb/eth/asix.c
@@ -84,6 +84,7 @@
#define AX_DEFAULT_RX_CTL \
(AX_RX_CTL_SO | AX_RX_CTL_AB)
+#define AX_DISABLE_RX_CTL AX_RX_CTL_AB
/* GPIO 2 toggles */
#define AX_GPIO_GPO2EN 0x10/* GPIO2 Output enable */
@@ -410,17 +411,16 @@ static int asix_basic_reset(struct ueth_data *dev)
return 0;
}
-/*
- * Asix callbacks
- */
-static int asix_init(struct eth_device *eth, bd_t *bd)
+static int full_init(struct eth_device *eth)
{
- struct ueth_data*dev = (struct ueth_data *)eth-priv;
- int timeout = 0;
-#define TIMEOUT_RESOLUTION 50 /* ms */
- int link_detected;
+ struct ueth_data *dev = (struct ueth_data *)eth-priv;
debug(** %s()\n, __func__);
+ if (asix_basic_reset(dev))
+ goto out_err;
+
+ if (asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL) 0)
+ goto out_err;
dev-phy_id = asix_get_phy_addr(dev);
if (dev-phy_id 0)
@@ -446,6 +446,25 @@ static int asix_init(struct eth_device *eth, bd_t *bd)
debug(Write IPG,IPG1,IPG2 failed\n);
goto out_err;
}
+ return 0;
+out_err:
+ return -1;
+}
+
+/*
+ * 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 (!dev-has_been_running full_init(eth))
+ return -1;
if (asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL) 0)
goto out_err;
@@ -467,6 +486,7 @@ static int asix_init(struct eth_device *eth, bd_t *bd)
printf(unable to connect.\n);
goto out_err;
}
+ dev-has_been_running = 1;
return 0;
out_err:
@@ -571,7 +591,11 @@ static int asix_recv(struct eth_device *eth)
static void asix_halt(struct eth_device *eth)
{
+ struct ueth_data *dev = (struct ueth_data *)eth-priv;
+
+ /* Disable packet reception */
debug(** %s()\n, __func__);
+ (void)asix_write_rx_ctl(dev, AX_DISABLE_RX_CTL);
}
/*
diff --git a/include/usb_ether.h b/include/usb_ether.h
index 7c7aecb..6145210 100644
--- a/include/usb_ether.h
+++ b/include/usb_ether.h
@@ -49,6 +49,7 @@ struct ueth_data {
unsigned char subclass; /* as in overview */
unsigned char protocol; /* .. */
unsigned char irqinterval;/* Intervall for IRQ Pipe */
+ char has_been_running; /* PHY already inited */
/* driver private */
void *dev_priv;
Acked-by: Joe Hershberger joe.hershber...@ni.com
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot