From patchwork Sat Jun 9 08:46:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Packham X-Patchwork-Id: 927112 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="KEnhtbpZ"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 412tDd5LzXz9s0W for ; Sat, 9 Jun 2018 18:46:40 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 2E5C2C21D4A; Sat, 9 Jun 2018 08:46:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_MSPIKE_H2, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id A4782C21C27; Sat, 9 Jun 2018 08:46:29 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 7B17EC21C27; Sat, 9 Jun 2018 08:46:28 +0000 (UTC) Received: from mail-pf0-f193.google.com (mail-pf0-f193.google.com [209.85.192.193]) by lists.denx.de (Postfix) with ESMTPS id DB872C21BE5 for ; Sat, 9 Jun 2018 08:46:27 +0000 (UTC) Received: by mail-pf0-f193.google.com with SMTP id a11-v6so7760395pff.8 for ; Sat, 09 Jun 2018 01:46:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=d2KsQEddZ30ixtYiqfwBzbeWINviPnDY9DGBvrP93go=; b=KEnhtbpZi8uJWhQmQxRiOt1YUIjAjhYontOnclouqURoFnNQjo31GOxRJyH6zXWvWS gVHqC5I6EJGPaPmUokcpmvEO2KRBRPHfXCqdXg7gtpa4pGmfQCxV1pYCfguqn9fXTdEv BQVBKnmXqsp2RTovU6ihaIC7+2yNFPYmdgnHeOdBkj+Uc6OKbCyQnPeeSBv5V3pm7b2F 6YRn/UJ1pueuAhGfmQsIJzhvVtq4f3JzuB5QXSdtjiLbX4vVGZ2IIKOTbeAF3atc7WEH iR4KAeTPzZ8u8kFpEP2q74eUhB3o3ivBhxoByR5a1TIuav0KvC3YsrjVlYYe3YbN6/gG RT9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=d2KsQEddZ30ixtYiqfwBzbeWINviPnDY9DGBvrP93go=; b=A3CzJpM965hlNudyGzqVi/UeVb6tltblPhxulmjSu84vq0fjjEwTORvq/i/bqF9m0o IKEIOd4YTRiV3opYMz0eu9+NC41Cfw5oa1PE5Mt4A7zxb55vYjjSTPwJjKK5HHWiXAI+ kAWb7S7zOS+DvNchKcT+6Dq5r2U6K90elsaThzc3PjrL+dy1+ZW7DkJ3wFxFb4rFagLv 0cvBH5h4Nkt2EMcjIwVVvtoRZVq7hCV/WaSdEt/4r50ppJKVcVNFktKtb6j7z6Luun+7 vLOz+BTlV+I5KOcZch7RIpv1J9oZvLdE+M+BHqHcadGlI/F0ZsQx+zjes5zb31LWMVVK egXQ== X-Gm-Message-State: APt69E1sf6kPlcjcPrRy9EfeoY52c5BkVFNLzJSnrRkbVMDw+2zX0+SA YJFKiRBpk6VfNtjLdTy6JCgmAejw X-Google-Smtp-Source: ADUXVKIkCie/a37YUj7g27Gi04dnk2znNclFfLsHRGUvM99wxAM908xE4AScPH2rDArSQIFKAROaBA== X-Received: by 2002:a62:c20e:: with SMTP id l14-v6mr9395413pfg.185.1528533985991; Sat, 09 Jun 2018 01:46:25 -0700 (PDT) Received: from chrisp-dl.ws.atlnz.lc ([2001:df5:b000:22:3a2c:4aff:fe70:2b02]) by smtp.gmail.com with ESMTPSA id d65-v6sm21329166pfj.20.2018.06.09.01.46.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 09 Jun 2018 01:46:25 -0700 (PDT) From: Chris Packham To: u-boot@lists.denx.de Date: Sat, 9 Jun 2018 20:46:16 +1200 Message-Id: <20180609084616.28188-1-judge.packham@gmail.com> X-Mailer: git-send-email 2.17.1 Cc: Tom Rini , Prafulla Wadaskar , Luka Perkov , Joe Hershberger , Stefan Roese , Chris Packham Subject: [U-Boot] [PATCH v2] net: mvgbe: extract common code for SMI wait X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 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" Combine repeated code from smi_reg_read/smi_reg_write into a common function smi_wait_ready. Reviewed-by: Stefan Roese Signed-off-by: Chris Packham Acked-by: Joe Hershberger --- Changes in v2: - collect review from Stefan - use wait_for_bit_le32() drivers/net/mvgbe.c | 47 ++++++++++++++++++++++----------------------- drivers/net/mvgbe.h | 1 + 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/drivers/net/mvgbe.c b/drivers/net/mvgbe.c index 4e1aff6e3a86..e6585ef8b3e7 100644 --- a/drivers/net/mvgbe.c +++ b/drivers/net/mvgbe.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -40,10 +41,24 @@ DECLARE_GLOBAL_DATA_PTR; #define MVGBE_SMI_REG (((struct mvgbe_registers *)MVGBE0_BASE)->smi) #if defined(CONFIG_PHYLIB) || defined(CONFIG_MII) || defined(CONFIG_CMD_MII) +static int smi_wait_ready(struct mvgbe_device *dmvgbe) +{ + int ret; + + ret = wait_for_bit_le32(&MVGBE_SMI_REG, MVGBE_PHY_SMI_BUSY_MASK, false, + MVGBE_PHY_SMI_TIMEOUT_MS, false); + if (ret) { + printf("Error: SMI busy timeout\n"); + return ret; + } + + return 0; +} + /* * smi_reg_read - miiphy_read callback function. * - * Returns 16bit phy register value, or 0xffff on error + * Returns 16bit phy register value, or -EFAULT on error */ static int smi_reg_read(struct mii_dev *bus, int phy_adr, int devad, int reg_ofs) @@ -74,16 +89,9 @@ static int smi_reg_read(struct mii_dev *bus, int phy_adr, int devad, return -EFAULT; } - timeout = MVGBE_PHY_SMI_TIMEOUT; /* wait till the SMI is not busy */ - do { - /* read smi register */ - smi_reg = MVGBE_REG_RD(MVGBE_SMI_REG); - if (timeout-- == 0) { - printf("Err..(%s) SMI busy timeout\n", __func__); - return -EFAULT; - } - } while (smi_reg & MVGBE_PHY_SMI_BUSY_MASK); + if (smi_wait_ready(dmvgbe) < 0) + return -EFAULT; /* fill the phy address and regiser offset and read opcode */ smi_reg = (phy_adr << MVGBE_PHY_SMI_DEV_ADDR_OFFS) @@ -119,10 +127,9 @@ static int smi_reg_read(struct mii_dev *bus, int phy_adr, int devad, } /* - * smi_reg_write - imiiphy_write callback function. + * smi_reg_write - miiphy_write callback function. * - * Returns 0 if write succeed, -EINVAL on bad parameters - * -ETIME on timeout + * Returns 0 if write succeed, -EFAULT on error */ static int smi_reg_write(struct mii_dev *bus, int phy_adr, int devad, int reg_ofs, u16 data) @@ -131,7 +138,6 @@ static int smi_reg_write(struct mii_dev *bus, int phy_adr, int devad, struct mvgbe_device *dmvgbe = to_mvgbe(dev); struct mvgbe_registers *regs = dmvgbe->regs; u32 smi_reg; - u32 timeout; /* Phyadr write request*/ if (phy_adr == MV_PHY_ADR_REQUEST && @@ -147,19 +153,12 @@ static int smi_reg_write(struct mii_dev *bus, int phy_adr, int devad, } if (reg_ofs > PHYREG_MASK) { printf("Err..(%s) Invalid register offset\n", __func__); - return -EINVAL; + return -EFAULT; } /* wait till the SMI is not busy */ - timeout = MVGBE_PHY_SMI_TIMEOUT; - do { - /* read smi register */ - smi_reg = MVGBE_REG_RD(MVGBE_SMI_REG); - if (timeout-- == 0) { - printf("Err..(%s) SMI busy timeout\n", __func__); - return -ETIME; - } - } while (smi_reg & MVGBE_PHY_SMI_BUSY_MASK); + if (smi_wait_ready(dmvgbe) < 0) + return -EFAULT; /* fill the phy addr and reg offset and write opcode and data */ smi_reg = (data << MVGBE_PHY_SMI_DATA_OFFS); diff --git a/drivers/net/mvgbe.h b/drivers/net/mvgbe.h index c20d1d7edf7b..1dc9bbea2f42 100644 --- a/drivers/net/mvgbe.h +++ b/drivers/net/mvgbe.h @@ -216,6 +216,7 @@ /* SMI register fields */ #define MVGBE_PHY_SMI_TIMEOUT 10000 +#define MVGBE_PHY_SMI_TIMEOUT_MS 1000 #define MVGBE_PHY_SMI_DATA_OFFS 0 /* Data */ #define MVGBE_PHY_SMI_DATA_MASK (0xffff << MVGBE_PHY_SMI_DATA_OFFS) #define MVGBE_PHY_SMI_DEV_ADDR_OFFS 16 /* PHY device address */