From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2D24AC678D4 for ; Thu, 19 Jan 2023 19:52:04 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 4194685682; Thu, 19 Jan 2023 20:51:49 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="fGkKJUQP"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id A8B0A82A24; Thu, 19 Jan 2023 20:51:40 +0100 (CET) Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id B796285678 for ; Thu, 19 Jan 2023 20:51:36 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=saproj@gmail.com Received: by mail-wm1-x32f.google.com with SMTP id o17-20020a05600c511100b003db021ef437so2060177wms.4 for ; Thu, 19 Jan 2023 11:51:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=cjAadRav97PBDA+mItU9f44vNKPOtjbjyNjKvK9yEXQ=; b=fGkKJUQPPknzppCPRlel7cjETYJKpOvmaoAy/Q2XdqPYoRjrrJTJqUZw/AE91f95pA bnG438NXRAC+whPrYDyVUceTjkpgkC+D2X6Danwmnp/4F2JjX5BbRELsqQRsDcZV88qx 8lvcLUDNOKiimi/3MR/HpxxAMjivQmKxylcZqooQ61rHeBTRr4ayDwUiquLgVLX6k06z oAo4tf5ri0ptyRGaNCVLiaogWG8WhmeRTKVwLGvSnBLQSjXxntx6MXJsTYgdFLuf6wWs z7jjUbGuBaPmBZEdpjsQkx9sAjjronAIM32ohtPFxxV9XXCA+d4nkeZ1uEBOEQCJneuF 7oyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=cjAadRav97PBDA+mItU9f44vNKPOtjbjyNjKvK9yEXQ=; b=t9Nqff7RmzzXdKsMtIqUB4Z8SgaaQjk+OeexawX3y2fCEV5mFdIOE+ZA9CSiEqGkT/ 2rMZJyeQEngfv/ubf51u2bXOzl1PIIApIM5C+xzdMf7CjVXyEF48DvOxQ2UfJCv24Kj6 u4r+5MkxV9aPisH0BFdkkyP9v81fOOmLYCYVbDYz+icY7lbXNQAJfaUsTYfCyZY0peGw I8pV45TIrXxOJPaZjPFD3Rw3aBOWIUjxoBp2p5VyyC9ZIcmKnzzjx/NdImz6qLNErFq/ PyQ4rR7wzPa1/IXKtBLlEDFgrTZ46LWzWDeLEt94tPkePaS6GHrR4TtmmOVSA5p+JjIC bqhw== X-Gm-Message-State: AFqh2kommJZVntFwcpbAf6jRFY9Fu6RRbfFvMln0v/Qb8i7RaawlAW50 g1gzC8gCrJcvKgMdBYpyvLVlqNiDw4A= X-Google-Smtp-Source: AMrXdXtwJksPfDDIzJpPRmtqGEFZ93nfeAikQBmh0FhcuBRlPk33GqViZfzHdTEA8qDvjYRqDP12pw== X-Received: by 2002:a05:600c:3514:b0:3db:80c:8ed9 with SMTP id h20-20020a05600c351400b003db080c8ed9mr10333114wmq.22.1674157896283; Thu, 19 Jan 2023 11:51:36 -0800 (PST) Received: from saproj-Latitude-5501.yandex.net ([2a02:6b8:0:40c:ed28:6515:90ec:5a28]) by smtp.gmail.com with ESMTPSA id h15-20020a05600c350f00b003db0b0cc2afsm108330wmq.30.2023.01.19.11.51.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Jan 2023 11:51:36 -0800 (PST) From: Sergei Antonov To: u-boot@lists.denx.de, joe.hershberger@ni.com, rfried.dev@gmail.com Cc: bmeng.cn@gmail.com, Sergei Antonov Subject: [PATCH v2 3/3] net: ftmac100: add mii read and write callbacks Date: Thu, 19 Jan 2023 22:51:16 +0300 Message-Id: <20230119195116.246711-3-saproj@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230119195116.246711-1-saproj@gmail.com> References: <20230119195116.246711-1-saproj@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean Register mii_bus with read and write callbacks to allow the 'mii' command to work. Use a timeout of 10 ms to wait for the R/W operations to complete. Signed-off-by: Sergei Antonov --- v1 -> v2: * fix a typo in the description * add a dependency from MII to Kconfig * rebase to the current master drivers/net/Kconfig | 1 + drivers/net/ftmac100.c | 103 +++++++++++++++++++++++++++++++++++++++++ drivers/net/ftmac100.h | 9 ++++ 3 files changed, 113 insertions(+) diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 7873538cc2df..017931956990 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -406,6 +406,7 @@ config FSL_FM_10GEC_REGULAR_NOTATION config FTMAC100 bool "Ftmac100 Ethernet Support" + select MII help This MAC is present in Andestech SoCs. diff --git a/drivers/net/ftmac100.c b/drivers/net/ftmac100.c index cc88ea17ffe7..1cf109b278cc 100644 --- a/drivers/net/ftmac100.c +++ b/drivers/net/ftmac100.c @@ -12,9 +12,13 @@ #include #include #include +#include +#include +#include #include #include #include +#include #include "ftmac100.h" #include @@ -23,12 +27,16 @@ DECLARE_GLOBAL_DATA_PTR; #define ETH_ZLEN 60 +/* Timeout for a mdio read/write operation */ +#define FTMAC100_MDIO_TIMEOUT_USEC 10000 + struct ftmac100_data { struct ftmac100_txdes txdes[1]; struct ftmac100_rxdes rxdes[PKTBUFSRX]; int rx_index; const char *name; struct ftmac100 *ftmac100; + struct mii_dev *bus; }; /* @@ -322,10 +330,104 @@ static int ftmac100_of_to_plat(struct udevice *dev) return 0; } +/* + * struct mii_bus functions + */ +static int ftmac100_mdio_read(struct mii_dev *bus, int addr, int devad, + int reg) +{ + struct ftmac100_data *priv = bus->priv; + struct ftmac100 *ftmac100 = priv->ftmac100; + int phycr = FTMAC100_PHYCR_PHYAD(addr) | + FTMAC100_PHYCR_REGAD(reg) | + FTMAC100_PHYCR_MIIRD; + int ret; + + writel(phycr, &ftmac100->phycr); + + ret = readl_poll_timeout(&ftmac100->phycr, phycr, + !(phycr & FTMAC100_PHYCR_MIIRD), + FTMAC100_MDIO_TIMEOUT_USEC); + if (ret) + pr_err("%s: mdio read failed (addr=0x%x reg=0x%x)\n", + bus->name, addr, reg); + else + ret = phycr & FTMAC100_PHYCR_MIIRDATA; + + return ret; +} + +static int ftmac100_mdio_write(struct mii_dev *bus, int addr, int devad, + int reg, u16 value) +{ + struct ftmac100_data *priv = bus->priv; + struct ftmac100 *ftmac100 = priv->ftmac100; + int phycr = FTMAC100_PHYCR_PHYAD(addr) | + FTMAC100_PHYCR_REGAD(reg) | + FTMAC100_PHYCR_MIIWR; + int ret; + + writel(value, &ftmac100->phywdata); + writel(phycr, &ftmac100->phycr); + + ret = readl_poll_timeout(&ftmac100->phycr, phycr, + !(phycr & FTMAC100_PHYCR_MIIWR), + FTMAC100_MDIO_TIMEOUT_USEC); + if (ret) + pr_err("%s: mdio write failed (addr=0x%x reg=0x%x)\n", + bus->name, addr, reg); + + return ret; +} + +static int ftmac100_mdio_init(struct udevice *dev) +{ + struct ftmac100_data *priv = dev_get_priv(dev); + struct mii_dev *bus; + int ret; + + bus = mdio_alloc(); + if (!bus) + return -ENOMEM; + + bus->read = ftmac100_mdio_read; + bus->write = ftmac100_mdio_write; + bus->priv = priv; + + ret = mdio_register_seq(bus, dev_seq(dev)); + if (ret) { + mdio_free(bus); + return ret; + } + + priv->bus = bus; + + return 0; +} + static int ftmac100_probe(struct udevice *dev) { struct ftmac100_data *priv = dev_get_priv(dev); priv->name = dev->name; + int ret = 0; + + ret = ftmac100_mdio_init(dev); + if (ret) { + dev_err(dev, "Failed to initialize mdiobus: %d\n", ret); + goto out; + } + +out: + return ret; +} + +static int ftmac100_remove(struct udevice *dev) +{ + struct ftmac100_data *priv = dev_get_priv(dev); + + mdio_unregister(priv->bus); + mdio_free(priv->bus); + return 0; } @@ -354,6 +456,7 @@ U_BOOT_DRIVER(ftmac100) = { .bind = ftmac100_bind, .of_to_plat = ftmac100_of_to_plat, .probe = ftmac100_probe, + .remove = ftmac100_remove, .ops = &ftmac100_ops, .priv_auto = sizeof(struct ftmac100_data), .plat_auto = sizeof(struct eth_pdata), diff --git a/drivers/net/ftmac100.h b/drivers/net/ftmac100.h index 75a49f628a69..21d339f835bf 100644 --- a/drivers/net/ftmac100.h +++ b/drivers/net/ftmac100.h @@ -92,6 +92,15 @@ struct ftmac100 { #define FTMAC100_MACCR_RX_MULTIPKT (1 << 16) #define FTMAC100_MACCR_RX_BROADPKT (1 << 17) +/* + * PHY control register + */ +#define FTMAC100_PHYCR_MIIRDATA 0xffff +#define FTMAC100_PHYCR_PHYAD(x) (((x) & 0x1f) << 16) +#define FTMAC100_PHYCR_REGAD(x) (((x) & 0x1f) << 21) +#define FTMAC100_PHYCR_MIIWR BIT(27) +#define FTMAC100_PHYCR_MIIRD BIT(26) + /* * Transmit descriptor, aligned to 16 bytes */ -- 2.34.1