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 X-Spam-Level: X-Spam-Status: No, score=-9.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CAFBEC43381 for ; Tue, 19 Feb 2019 10:31:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9DA272146E for ; Tue, 19 Feb 2019 10:31:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="Kla5Ii4S" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728315AbfBSKbc (ORCPT ); Tue, 19 Feb 2019 05:31:32 -0500 Received: from mail-pg1-f194.google.com ([209.85.215.194]:40902 "EHLO mail-pg1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728268AbfBSKbb (ORCPT ); Tue, 19 Feb 2019 05:31:31 -0500 Received: by mail-pg1-f194.google.com with SMTP id u9so6410737pgo.7 for ; Tue, 19 Feb 2019 02:31:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=i6YCES9Ud8ygRjd19c9ckNKdsmXjOEV4GyXpKZGdXWE=; b=Kla5Ii4SUxWqk6Fb6ZB+omKa9TA8PUBhf4VhsNVpGe72JtNWtCABy/bCKdaw9/ukdy /8xs419mHMKmbixYQblY2+NNvdflJvqC1/CEnfJEt4RgTBYFvMG/UUcfUSD254mxALn2 ydbUxwhK6eyfKGeRq5GEHBvfsqLTomxJejSpM= 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:in-reply-to :references; bh=i6YCES9Ud8ygRjd19c9ckNKdsmXjOEV4GyXpKZGdXWE=; b=Wva6EWEXmDcunC7dVxtPg64zdVxDx80Li94XK1SnjktVbNpB9aKwLkhVgGY6A1yK18 QCtrgnkPfBA5KJgrcHDgBjGaQ2VuMTTAM4DEVZ21ywHikriNsTJSZlhf1TCqZpilf+Y1 tkNUVMKwsXsy6XNWH06LC9d6BLfpHRBBL2bCnsDvfaPni4i8vJ/INSYHq/eYMEyxd2p+ b7H/ZA72Gulr98W9l9Bt/WLZMoTpxg3NUm/2bpU/ZOJpM3P05y4elNlzUQ7e1p7VdAU0 AIZQZ8xc8cTImh939KBfHb5smqfUb3m9973IdTcR9KMQt7srcPAx2E6hGdytH/NYJbsm XkSw== X-Gm-Message-State: AHQUAubVPVpQMncfBBN98RSnCWQZsojskCEslA3D91kfl+O4BS6B9x/3 0pCpRZdjLtzGDNJqlrytl+OYaA== X-Google-Smtp-Source: AHgI3IYCSJLoKuZc+ngKxQiS5kwfHhZS+8vMsprJp7aie1XeilsJmjm8B19XfE22pfAgcoAQncOI4w== X-Received: by 2002:a63:ec48:: with SMTP id r8mr27331940pgj.50.1550572290184; Tue, 19 Feb 2019 02:31:30 -0800 (PST) Received: from localhost.dhcp.broadcom.net ([192.19.223.250]) by smtp.gmail.com with ESMTPSA id f12sm19198952pgo.13.2019.02.19.02.31.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 19 Feb 2019 02:31:29 -0800 (PST) From: Michael Chan To: davem@davemloft.net Cc: netdev@vger.kernel.org Subject: [PATCH net-next 4/5] bnxt_en: Add support for mdio read/write to external PHY Date: Tue, 19 Feb 2019 05:31:15 -0500 Message-Id: <1550572276-14711-5-git-send-email-michael.chan@broadcom.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1550572276-14711-1-git-send-email-michael.chan@broadcom.com> References: <1550572276-14711-1-git-send-email-michael.chan@broadcom.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Vasundhara Volam Add support for SIOCGMIIREG and SIOCSMIIREG ioctls to mdio read/write to external PHY. Signed-off-by: Vasundhara Volam Signed-off-by: Michael Chan --- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 69 ++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c index 9700891..a9edf94 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -8621,24 +8622,88 @@ static int bnxt_close(struct net_device *dev) return 0; } +static int bnxt_hwrm_port_phy_read(struct bnxt *bp, u16 phy_addr, u16 reg, + u16 *val) +{ + struct hwrm_port_phy_mdio_read_output *resp = bp->hwrm_cmd_resp_addr; + struct hwrm_port_phy_mdio_read_input req = {0}; + int rc; + + if (bp->hwrm_spec_code < 0x10a00) + return -EOPNOTSUPP; + + bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_PHY_MDIO_READ, -1, -1); + req.port_id = cpu_to_le16(bp->pf.port_id); + req.phy_addr = phy_addr; + req.reg_addr = cpu_to_le16(reg & 0x1f); + if (bp->link_info.support_speeds & BNXT_LINK_SPEED_MSK_10GB) { + req.cl45_mdio = 1; + req.phy_addr = mdio_phy_id_prtad(phy_addr); + req.dev_addr = mdio_phy_id_devad(phy_addr); + req.reg_addr = cpu_to_le16(reg); + } + + mutex_lock(&bp->hwrm_cmd_lock); + rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + if (!rc) + *val = le16_to_cpu(resp->reg_data); + mutex_unlock(&bp->hwrm_cmd_lock); + return rc; +} + +static int bnxt_hwrm_port_phy_write(struct bnxt *bp, u16 phy_addr, u16 reg, + u16 val) +{ + struct hwrm_port_phy_mdio_write_input req = {0}; + + if (bp->hwrm_spec_code < 0x10a00) + return -EOPNOTSUPP; + + bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_PHY_MDIO_WRITE, -1, -1); + req.port_id = cpu_to_le16(bp->pf.port_id); + req.phy_addr = phy_addr; + req.reg_addr = cpu_to_le16(reg & 0x1f); + if (bp->link_info.support_speeds & BNXT_LINK_SPEED_MSK_10GB) { + req.cl45_mdio = 1; + req.phy_addr = mdio_phy_id_prtad(phy_addr); + req.dev_addr = mdio_phy_id_devad(phy_addr); + req.reg_addr = cpu_to_le16(reg); + } + req.reg_data = cpu_to_le16(val); + + return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); +} + /* rtnl_lock held */ static int bnxt_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { + struct mii_ioctl_data *mdio = if_mii(ifr); + struct bnxt *bp = netdev_priv(dev); + int rc; + switch (cmd) { case SIOCGMIIPHY: + mdio->phy_id = bp->link_info.phy_addr; + /* fallthru */ case SIOCGMIIREG: { + u16 mii_regval = 0; + if (!netif_running(dev)) return -EAGAIN; - return 0; + rc = bnxt_hwrm_port_phy_read(bp, mdio->phy_id, mdio->reg_num, + &mii_regval); + mdio->val_out = mii_regval; + return rc; } case SIOCSMIIREG: if (!netif_running(dev)) return -EAGAIN; - return 0; + return bnxt_hwrm_port_phy_write(bp, mdio->phy_id, mdio->reg_num, + mdio->val_in); default: /* do nothing */ -- 2.5.1