From patchwork Mon Aug 3 21:15:44 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marcel Ziswiler X-Patchwork-Id: 503290 X-Patchwork-Delegate: trini@ti.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 34D3E140E5E for ; Tue, 4 Aug 2015 07:16:40 +1000 (AEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 04FAFA754C; Mon, 3 Aug 2015 23:16:35 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id QjZSIzMiQo3C; Mon, 3 Aug 2015 23:16:34 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 4BE63A7509; Mon, 3 Aug 2015 23:16:24 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 845FFA74FA for ; Mon, 3 Aug 2015 23:16:20 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2JcdwcCf9AXp for ; Mon, 3 Aug 2015 23:16:20 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mout.perfora.net (mout.perfora.net [74.208.4.194]) by theia.denx.de (Postfix) with ESMTPS id 0C19EA749D for ; Mon, 3 Aug 2015 23:16:17 +0200 (CEST) Received: from localhost.net ([62.167.132.2]) by mrelay.perfora.net (mreueus002) with ESMTPSA (Nemesis) id 0MCrG1-1ZCmS41nQR-009kyE; Mon, 03 Aug 2015 23:16:15 +0200 From: Marcel Ziswiler To: u-boot@lists.denx.de Date: Mon, 3 Aug 2015 23:15:44 +0200 Message-Id: <1eab4d657f49427e66a757dcb3dc504cb4146d2e.1438636040.git.marcel.ziswiler@toradex.com> X-Mailer: git-send-email 2.4.3 In-Reply-To: References: X-Provags-ID: V03:K0:gGPgyLE/7rQSDNwg4gcwLp9aLEAejmG82emyeZ+2liaD+y8Y5lt lmMnEgUdvGsWXxItcZgJIcKclv5yqUoLGYP5fzaTsc22wGl05C2Ynz+KR918F9+U1eDi7dO qOMl1QAY223qyc1rqNaOMflrOqFRC3PLddy5p0arRwHMO0JU9wMLVPrghk6Em/teKJwcmuc bvm9kMGtOA4af4ClV9S8w== X-UI-Out-Filterresults: notjunk:1; V01:K0:MnVhDARG8S8=:IZBJcaImeKTWJXjJDL+rXo Tl8AIA4duO249nCbvFqdaSJpvINISY8GcAiOk+k69x+oPZzGwtQcsQEjT7nS2/e6oNLa/C4Q6 QGE9+XEgXdTnLAZercMcsqh6kGWXl5MwZjPq7NSW+1XaiUwbOvX8wmJY+TkDf7FCO9dLcCLpB SRHMZlv8Ms5NSO6zACAaXfbQ2TM2HxhVnVAe56VaWt7ZXnXPCuvhcRkc2OmzAIJ6puL0q1BJJ NL7YofLZ2ItsNhFlMqm+S/XPeIKRqKOhqppKgQq4RifcDNrClYPnAO2ObygWqmkOQoXUrMJhh rOb24oyYu9goa/ZCGJ1zCbGLxHLF/PG94X21TimbuxLH8qVE/WFN5mELkqy7sR7x8fWo3Ug+I hyThlI8ogBi2eZwIiQrSEDqy0S3GgxhOoEURGU79KmBKk8TUDcQTWXBiYnKMuWNed7wjplrNk 0ckeQuboiO3pVrjSBEkwyvO6sUGJAWT+44IUtAOnc3Z5I3vwB/1imwXfAyDO2TMyWn/ubsuPj AVlgnCbV4E+dnLmr8E6CA+/37hhPXYxp8mc49cMCQNEEI9z8x1XG/a0NEQTW1WbId46Jg9GJd AYRZt21JF/9KV41kcSPoXHj1oUOtiX9WPxbW+NR2RrHDnyiJVTwQ84y4kZi5lXnSV1tA2iDej 94TwWFLGBifHNKDyoMsSUAZ3F Cc: Marek Vasut , Tom Rini , Stefan Agner , Joe Hershberger , Marcel Ziswiler , Max Krummenacher , Scott Wood Subject: [U-Boot] [PATCH v3 2/8] net: asix: fix operation without eeprom X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" From: Marcel Ziswiler This patch fixes operation of our on-board AX88772B chip without EEPROM but with a ethaddr coming from the regular U-Boot environment. This is a forward port of some remaining parts initially implemented by Antmicro. Signed-off-by: Marcel Ziswiler Acked-by: Marek Vasut --- Changes in v3 as suggested by Marek: - introduce ctl variable - fix comment style - use mdelay Changes in v2: - run it through checkpatch.pl as suggested by Marek and Joe - cleanup comments and use VID/PID defines as suggested by Marek - dug out an AX88772 (not B) dongle again and verified operation - AX88772 (not B) indeed does not work with B modifications (e.g. VID/PID based differentiation is indeed required) - dug out another AX88772B dongle as well and verified operation drivers/usb/eth/asix.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/drivers/usb/eth/asix.c b/drivers/usb/eth/asix.c index 72ec41e..8a43e7c 100644 --- a/drivers/usb/eth/asix.c +++ b/drivers/usb/eth/asix.c @@ -1,6 +1,8 @@ /* * Copyright (c) 2011 The Chromium OS Authors. * + * Patched for AX88772B by Antmicro Ltd + * * SPDX-License-Identifier: GPL-2.0+ */ @@ -64,8 +66,11 @@ AX_MEDIUM_AC | AX_MEDIUM_RE) /* AX88772 & AX88178 RX_CTL values */ -#define AX_RX_CTL_SO 0x0080 -#define AX_RX_CTL_AB 0x0008 +#define AX_RX_CTL_RH2M 0x0200 /* 32-bit aligned RX IP header */ +#define AX_RX_CTL_RH1M 0x0100 /* Enable RX header format type 1 */ +#define AX_RX_CTL_SO 0x0080 +#define AX_RX_CTL_AB 0x0008 +#define AX_RX_HEADER_DEFAULT (AX_RX_CTL_RH1M | AX_RX_CTL_RH2M) #define AX_DEFAULT_RX_CTL \ (AX_RX_CTL_SO | AX_RX_CTL_AB) @@ -92,6 +97,8 @@ #define FLAG_TYPE_AX88772B (1U << 2) #define FLAG_EEPROM_MAC (1U << 3) /* initial mac address in eeprom */ +#define ASIX_USB_VENDOR_ID 0x0b95 +#define AX88772B_USB_PRODUCT_ID 0x772b /* driver private */ struct asix_private { @@ -418,15 +425,23 @@ static int asix_basic_reset(struct ueth_data *dev) return 0; } -static int asix_init_common(struct ueth_data *dev) +static int asix_init_common(struct ueth_data *dev, uint8_t *enetaddr) { int timeout = 0; #define TIMEOUT_RESOLUTION 50 /* ms */ int link_detected; + u32 ctl = AX_DEFAULT_RX_CTL; debug("** %s()\n", __func__); - if (asix_write_rx_ctl(dev, AX_DEFAULT_RX_CTL) < 0) + if ((dev->pusb_dev->descriptor.idVendor == ASIX_USB_VENDOR_ID) && + (dev->pusb_dev->descriptor.idProduct == AX88772B_USB_PRODUCT_ID)) + ctl |= AX_RX_HEADER_DEFAULT; + + if (asix_write_rx_ctl(dev, ctl) < 0) + goto out_err; + + if (asix_write_hwaddr_common(dev, enetaddr) < 0) goto out_err; do { @@ -447,6 +462,12 @@ static int asix_init_common(struct ueth_data *dev) goto out_err; } + /* + * Wait some more to avoid timeout on first transfer + * (e.g. EHCI timed out on TD - token=0x8008d80) + */ + mdelay(25); + return 0; out_err: return -1; @@ -488,7 +509,7 @@ static int asix_init(struct eth_device *eth, bd_t *bd) { struct ueth_data *dev = (struct ueth_data *)eth->priv; - return asix_init_common(dev); + return asix_init_common(dev, eth->enetaddr); } static int asix_send(struct eth_device *eth, void *packet, int length) @@ -550,6 +571,12 @@ static int asix_recv(struct eth_device *eth) return -1; } + if ((dev->pusb_dev->descriptor.idVendor == + ASIX_USB_VENDOR_ID) && + (dev->pusb_dev->descriptor.idProduct == + AX88772B_USB_PRODUCT_ID)) + buf_ptr += 2; + /* Notify net stack */ net_process_received_packet(buf_ptr + sizeof(packet_len), packet_len); @@ -729,9 +756,10 @@ int asix_eth_get_info(struct usb_device *dev, struct ueth_data *ss, #ifdef CONFIG_DM_ETH static int asix_eth_start(struct udevice *dev) { + struct eth_pdata *pdata = dev_get_platdata(dev); struct asix_private *priv = dev_get_priv(dev); - return asix_init_common(&priv->ueth); + return asix_init_common(&priv->ueth, pdata->enetaddr); } void asix_eth_stop(struct udevice *dev)