From patchwork Thu Oct 22 08:37:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 534311 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 5EFC2141315 for ; Thu, 22 Oct 2015 19:41:28 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=baylibre_com.20150623.gappssmtp.com header.i=@baylibre_com.20150623.gappssmtp.com header.b=b5JR1byr; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757012AbbJVIiH (ORCPT ); Thu, 22 Oct 2015 04:38:07 -0400 Received: from mail-wi0-f170.google.com ([209.85.212.170]:32802 "EHLO mail-wi0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756842AbbJVIiE (ORCPT ); Thu, 22 Oct 2015 04:38:04 -0400 Received: by wijp11 with SMTP id p11so20566887wij.0 for ; Thu, 22 Oct 2015 01:38:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre_com.20150623.gappssmtp.com; s=20150623; h=from:to:subject:organization:message-id:date:user-agent :mime-version:content-type:content-transfer-encoding; bh=2Jl7HFcg7e4KWG2M2tCzX7cfI0wyAJx+jdo5GF5YVrc=; b=b5JR1byrGDEQhwR2HzF0AmmutfzstmgHVzy2JdrXEVqTn2UPzz1vEsoRYp9DXzedVQ 6/mrk4HYlkC0ZNiSmY2Mnw29WziFF9h/8/7ZYZuLisp5QyfSvoErrATB0FKNGqsGfX0B XXDT+6mFlWXCtme++Vf48evZISt2ysguVMpGjdfEOp46mvJV646NkCLfimeULxU+3myI TTEoUEMJwiN8mU+SoxD9FHMbgZPBcf57O6uxp0G4c7TfzaYN4wbPsasVwDyUvg6qQIVO BdWBk9C/ku7cGgvQA/FMHPhneVEJBL0aAHoXZwU/Y66atqLYzF30ds7QVVqEDEhzntV4 p+LA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:organization:message-id:date :user-agent:mime-version:content-type:content-transfer-encoding; bh=2Jl7HFcg7e4KWG2M2tCzX7cfI0wyAJx+jdo5GF5YVrc=; b=P5ujmURJAjpnB1k4p5PbV1AOHsgKhp58nFtvUeiTj8a817YawDcf+wc94mBxrHu1az 24zL8jRhOCUBlG4MXnffXwRe6PjUfvRPKQatSD/FsjlnYDmQlrE8QJObVXGhENIGkA+P qIO6dzHGj7bUF5KJtWrjx7md3of+ya/6ELFYR5aFJ9o0qvC5doXIzvS6nttt6Hy+SKzu 2ZP0aZu9g5J9M+Lu86M1a1jU8OzGGn5oUXtNA8Gt3i5ssPM58gg9nlXwSJF/+zOwe78a aUPWX4Qq1quIykSHwAMr3d9TuAJFPEdMcOxSelxPMUZldlDkvNBb+QFiC1z6s6bjMGrd yQGA== X-Gm-Message-State: ALoCoQkaXaiEjdzKLF3Zu6KFfQA+nVJi+mC9HupDT+KmvhPWYy04iAW4w8BF/G3V9EAS9JO9vO2r X-Received: by 10.194.114.133 with SMTP id jg5mr15319287wjb.98.1445503082838; Thu, 22 Oct 2015 01:38:02 -0700 (PDT) Received: from [192.168.2.52] (cag06-6-78-235-100-105.fbx.proxad.net. [78.235.100.105]) by smtp.gmail.com with ESMTPSA id q1sm15400455wjy.31.2015.10.22.01.38.01 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Oct 2015 01:38:02 -0700 (PDT) From: Neil Armstrong To: "David S. Miller" , Florian Fainelli , Guenter Roeck , vivien.didelot@savoirfairelinux.com, Andrew Lunn , Fabian Frederick , Pavel Nakonechny , Joe Perches , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, nbd@openwrt.org, sergei.shtylyov@cogentembedded.com Subject: [PATCH 1/3] net: phy: Add nested variants of mdiobus read/write Organization: Baylibre Message-ID: <5628A05D.3020104@baylibre.com> Date: Thu, 22 Oct 2015 10:37:49 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Since nested variants of mdiobus_read/write are used in multiple drivers, add nested variants in the mdiobus core. Suggested-by: Andrew Lunn Signed-off-by: Neil Armstrong --- drivers/net/phy/mdio_bus.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++ include/linux/phy.h | 2 ++ 2 files changed, 57 insertions(+) diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 12f44c5..88cb459 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -372,6 +372,33 @@ struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr) EXPORT_SYMBOL(mdiobus_scan); /** + * mdiobus_read_nested - Nested version of the mdiobus_read function + * @bus: the mii_bus struct + * @addr: the phy address + * @regnum: register number to read + * + * In case of nested MDIO bus access avoid lockdep false positives by + * using mutex_lock_nested(). + * + * NOTE: MUST NOT be called from interrupt context, + * because the bus read/write functions may wait for an interrupt + * to conclude the operation. + */ +int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum) +{ + int retval; + + BUG_ON(in_interrupt()); + + mutex_lock_nested(&bus->mdio_lock, SINGLE_DEPTH_NESTING); + retval = bus->read(bus, addr, regnum); + mutex_unlock(&bus->mdio_lock); + + return retval; +} +EXPORT_SYMBOL(mdiobus_read_nested); + +/** * mdiobus_read - Convenience function for reading a given MII mgmt register * @bus: the mii_bus struct * @addr: the phy address @@ -396,6 +423,34 @@ int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum) EXPORT_SYMBOL(mdiobus_read); /** + * mdiobus_write_nested - Nested version of the mdiobus_write function + * @bus: the mii_bus struct + * @addr: the phy address + * @regnum: register number to write + * @val: value to write to @regnum + * + * In case of nested MDIO bus access avoid lockdep false positives by + * using mutex_lock_nested(). + * + * NOTE: MUST NOT be called from interrupt context, + * because the bus read/write functions may wait for an interrupt + * to conclude the operation. + */ +int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val) +{ + int err; + + BUG_ON(in_interrupt()); + + mutex_lock_nested(&bus->mdio_lock, SINGLE_DEPTH_NESTING); + err = bus->write(bus, addr, regnum, val); + mutex_unlock(&bus->mdio_lock); + + return err; +} +EXPORT_SYMBOL(mdiobus_write_nested); + +/** * mdiobus_write - Convenience function for writing a given MII mgmt register * @bus: the mii_bus struct * @addr: the phy address diff --git a/include/linux/phy.h b/include/linux/phy.h index 4c477e6..05fde31 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -213,7 +213,9 @@ static inline struct mii_bus *devm_mdiobus_alloc(struct device *dev) void devm_mdiobus_free(struct device *dev, struct mii_bus *bus); struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum); +int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum); int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val); +int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val); #define PHY_INTERRUPT_DISABLED 0x0