[U-Boot] [PATCH 01/11] usb: net: asix: Do a fast init if link already established

Joe Hershberger joe.hershberger at gmail.com
Sat Dec 15 08:28:32 CET 2012


Hi Simon,

On Wed, Dec 12, 2012 at 7:55 PM, Simon Glass <sjg at 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 <sjg at 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.hershberger at ni.com>


More information about the U-Boot mailing list