Received: by 2002:a05:6358:3188:b0:123:57c1:9b43 with SMTP id q8csp2628839rwd; Fri, 16 Jun 2023 06:20:00 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5TftX28ZUufW7J0TD5q83FyZj4KxhQy3dncCrXwRRQC0Rw1r30q9/vk1eyYGdLcPhDjGzd X-Received: by 2002:a05:6a20:d90e:b0:101:5743:fd01 with SMTP id jd14-20020a056a20d90e00b001015743fd01mr2481855pzb.25.1686921599755; Fri, 16 Jun 2023 06:19:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1686921599; cv=none; d=google.com; s=arc-20160816; b=FIIZ/mYdXi49q+axpzyQzv5fH6uf/95CVuf1FM10rTb2s6IQNSgF8yigfXKQNzdnsX +cd6PMpLGwc14O+Jk/EgDNS808fhFtFsTaSMhx58UMJl1DdwketGuKbq6upnPlwu2qAn 6j8Jzo1KZMISBRrPqVwQpRO4nPzdRGUIvnxACikHHjH1Itc2nqvjfoJfJIT2tKfn3m1C uyqAhTCM1c+sTr1BlsSU+c8/mxOzn540AM3nWtmr3vvRYi0uxbIogR0QVxMJX32fnJpk l2Zw0c+UDs2mxjfl5+O3UZxHOQTagNIOLwbN2UjDm0ex2GuvNykthDfirVXGsvbYs2q0 acWA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=9RiMNnpd/w/+D/nAp/Zp0YhQWvdFWXjWiVav8bt+1k8=; b=wb9ec8gGU69hzZwhU0LOFgwpXqU1iVMOjn+qUbA/tl5nBYcvUm/6zZd/FWXq3VlFc2 g35VpKtnnk2h6gkw10LKiYmsATggajs2kobHzByh+jINtQtx67Esdg2QJmJIFypbVgIe AsiT1YLdzsqAbXlKDygWX0R0r3+XUHgQILWIKtllogSRpSx4lLIA+Vhh7nqdGn+8I77y tJlqHbh08MvrU8e3CnGw9maH4YII8F8O+3iIEGCg5EqrP8kmM+mSKg19iHEWfuPlqDFP 09KQo09k9SYS78gpCdAdXfxLQVIsoTyYx2DDgTCnDhLnNdoswSm7fYFpIFZMbivh2gPA IIMQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=S9EIFCQy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l14-20020a170903244e00b001b1a2bf4f68si10346776pls.78.2023.06.16.06.19.47; Fri, 16 Jun 2023 06:19:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20221208 header.b=S9EIFCQy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345402AbjFPNNF (ORCPT + 99 others); Fri, 16 Jun 2023 09:13:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345435AbjFPNND (ORCPT ); Fri, 16 Jun 2023 09:13:03 -0400 Received: from mail-il1-x129.google.com (mail-il1-x129.google.com [IPv6:2607:f8b0:4864:20::129]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 477A0273F; Fri, 16 Jun 2023 06:13:02 -0700 (PDT) Received: by mail-il1-x129.google.com with SMTP id e9e14a558f8ab-33bb16ac2e9so2584125ab.3; Fri, 16 Jun 2023 06:13:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1686921181; x=1689513181; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=9RiMNnpd/w/+D/nAp/Zp0YhQWvdFWXjWiVav8bt+1k8=; b=S9EIFCQyQ51SjRvse0Ss7tt9quun4x50RxOvVxkN3uYmZtNNbSNFpXPbKtMrdIlfKA +GXIdaNN8w70bCjlxDeg/8Rsjk0CITdbgPE5pN1xo4ppgH0fXB6cRKSFPOxrnrxzPlUR tUUWkH+kqOXgUoUseVvFs3g2epI90ixS3jKLmQgFbMR4HIB2fz92HnqLbe87H+3LmPCO sAVWBOSigBF2acFgrEarJX/pzixpEnQNeP16ABIwuceJ87klDwd4DbaOPkizgGOykw7s Rw9TgDbVEV+GjNYfSaDkuOQPGXO+iKf4WYPicjHaW2/YYLLI7jZOZcSMu/yi62he1Hpd Dqhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1686921181; x=1689513181; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=9RiMNnpd/w/+D/nAp/Zp0YhQWvdFWXjWiVav8bt+1k8=; b=eKWn5P+5S4uhE/+Mb6ObJL0lpon5s0mzbvGjVa+pTqKQRfQ8XHxNAYX/RvNMnZgymT d+PH1d0Dvh3S6C1GFxNjSpIH7+vjQQ1dJR5lOnsF3hBdgzFwhM8zSl5IdDgFERjLDrkK cSvRcu03V2opNo/k400btvbwOSilWF3W43kIoUZORWYXUWJPEJA/Dj3Q7EyYmk/0jSNA aWOIW0pAdEZOoIfExP9xUOaU1zjqHWuLWXFCIyrAb02sdGsPkU3vFcIxP1up9V9aoW3x RhK++A/W4/KBX9YjUblR7XiChTb5fHggp6GTbP01f9E8cKJvXmEErpaRUwEqd+jXvoJD SDjA== X-Gm-Message-State: AC+VfDyrpm/M0Xn7fBvELKa0gsrjRxGQZCT+DLSTQPr8sW4HxFmmi1PL JTgnJwEDaKxZMNx4JI1G4zA= X-Received: by 2002:a92:c60a:0:b0:340:6c4f:d311 with SMTP id p10-20020a92c60a000000b003406c4fd311mr2082075ilm.28.1686921181167; Fri, 16 Jun 2023 06:13:01 -0700 (PDT) Received: from localhost.localdomain ([103.116.245.58]) by smtp.gmail.com with ESMTPSA id a22-20020a63cd56000000b0054f9936accesm8203636pgj.55.2023.06.16.06.12.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 16 Jun 2023 06:13:00 -0700 (PDT) From: Jianhui Zhao To: andrew@lunn.ch, hkallweit1@gmail.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: linux@armlinux.org.uk, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Jianhui Zhao Subject: [PATCH V4] net: phy: Add sysfs attribute for PHY c45 identifiers. Date: Fri, 16 Jun 2023 21:12:46 +0800 Message-Id: <20230616131246.41989-1-zhaojh329@gmail.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If a phydevice use c45, its phy_id property is always 0, so this adds a c45_ids sysfs attribute group contains mmd id attributes from mmd0 to mmd31 to MDIO devices. Note that only mmd with valid value will exist. This attribute group can be useful when debugging problems related to phy drivers. Likes this: /sys/bus/mdio_bus/devices/mdio-bus:05/c45_ids/mmd1 /sys/bus/mdio_bus/devices/mdio-bus:05/c45_ids/mmd2 ... /sys/bus/mdio_bus/devices/mdio-bus:05/c45_ids/mmd31 Signed-off-by: Jianhui Zhao Reviewed-by: Andrew Lunn Reviewed-by: Russell King --- V3 -> V4: Only mmd with valid value will exist. V2 -> V3: Use the most efficient implementation. V1 -> V2: putting all 32 values in a subdirectory, one file per MMD .../ABI/testing/sysfs-class-net-phydev | 10 ++ drivers/net/phy/phy_device.c | 123 +++++++++++++++++- 2 files changed, 132 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-class-net-phydev b/Documentation/ABI/testing/sysfs-class-net-phydev index ac722dd5e694..58a0a150229d 100644 --- a/Documentation/ABI/testing/sysfs-class-net-phydev +++ b/Documentation/ABI/testing/sysfs-class-net-phydev @@ -63,3 +63,13 @@ Description: only used internally by the kernel and their placement are not meant to be stable across kernel versions. This is intended for facilitating the debugging of PHY drivers. + +What: /sys/class/mdio_bus///c45_ids/mmd +Date: November 2023 +KernelVersion: 6.4 +Contact: netdev@vger.kernel.org +Description: + This attribute group c45_ids contains mmd id attributes from mmd0 to mmd31 + as reported by the device during bus enumeration, encoded in hexadecimal. + Note that only mmd with valid value will exist. This ID is used to match + the device with the appropriate driver. diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 17d0d0555a79..a05af6b75c83 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -602,7 +602,128 @@ static struct attribute *phy_dev_attrs[] = { &dev_attr_phy_dev_flags.attr, NULL, }; -ATTRIBUTE_GROUPS(phy_dev); + +static const struct attribute_group phy_dev_group = { + .attrs = phy_dev_attrs +}; + +struct phy_c45_devid_attribute { + struct device_attribute attr; + int index; +}; + +static ssize_t phy_c45_id_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct phy_c45_devid_attribute *devattr = + container_of(attr, struct phy_c45_devid_attribute, attr); + struct phy_device *phydev = to_phy_device(dev); + + return sprintf(buf, "0x%.8lx\n", + (unsigned long)phydev->c45_ids.device_ids[devattr->index]); +} + +#define DEVICE_ATTR_C45_ID(i) \ +static struct phy_c45_devid_attribute dev_attr_phy_c45_id##i = { \ + .attr = { \ + .attr = { .name = __stringify(mmd##i), .mode = 0444 }, \ + .show = phy_c45_id_show \ + }, \ + .index = i, \ +} + +DEVICE_ATTR_C45_ID(0); +DEVICE_ATTR_C45_ID(1); +DEVICE_ATTR_C45_ID(2); +DEVICE_ATTR_C45_ID(3); +DEVICE_ATTR_C45_ID(4); +DEVICE_ATTR_C45_ID(5); +DEVICE_ATTR_C45_ID(6); +DEVICE_ATTR_C45_ID(7); +DEVICE_ATTR_C45_ID(8); +DEVICE_ATTR_C45_ID(9); +DEVICE_ATTR_C45_ID(10); +DEVICE_ATTR_C45_ID(11); +DEVICE_ATTR_C45_ID(12); +DEVICE_ATTR_C45_ID(13); +DEVICE_ATTR_C45_ID(14); +DEVICE_ATTR_C45_ID(15); +DEVICE_ATTR_C45_ID(16); +DEVICE_ATTR_C45_ID(17); +DEVICE_ATTR_C45_ID(18); +DEVICE_ATTR_C45_ID(19); +DEVICE_ATTR_C45_ID(20); +DEVICE_ATTR_C45_ID(21); +DEVICE_ATTR_C45_ID(22); +DEVICE_ATTR_C45_ID(23); +DEVICE_ATTR_C45_ID(24); +DEVICE_ATTR_C45_ID(25); +DEVICE_ATTR_C45_ID(26); +DEVICE_ATTR_C45_ID(27); +DEVICE_ATTR_C45_ID(28); +DEVICE_ATTR_C45_ID(29); +DEVICE_ATTR_C45_ID(30); +DEVICE_ATTR_C45_ID(31); + +static struct attribute *phy_c45_id_attrs[] = { + &dev_attr_phy_c45_id0.attr.attr, + &dev_attr_phy_c45_id1.attr.attr, + &dev_attr_phy_c45_id2.attr.attr, + &dev_attr_phy_c45_id3.attr.attr, + &dev_attr_phy_c45_id4.attr.attr, + &dev_attr_phy_c45_id5.attr.attr, + &dev_attr_phy_c45_id6.attr.attr, + &dev_attr_phy_c45_id7.attr.attr, + &dev_attr_phy_c45_id8.attr.attr, + &dev_attr_phy_c45_id9.attr.attr, + &dev_attr_phy_c45_id10.attr.attr, + &dev_attr_phy_c45_id11.attr.attr, + &dev_attr_phy_c45_id12.attr.attr, + &dev_attr_phy_c45_id13.attr.attr, + &dev_attr_phy_c45_id14.attr.attr, + &dev_attr_phy_c45_id15.attr.attr, + &dev_attr_phy_c45_id16.attr.attr, + &dev_attr_phy_c45_id17.attr.attr, + &dev_attr_phy_c45_id18.attr.attr, + &dev_attr_phy_c45_id19.attr.attr, + &dev_attr_phy_c45_id20.attr.attr, + &dev_attr_phy_c45_id21.attr.attr, + &dev_attr_phy_c45_id22.attr.attr, + &dev_attr_phy_c45_id23.attr.attr, + &dev_attr_phy_c45_id24.attr.attr, + &dev_attr_phy_c45_id25.attr.attr, + &dev_attr_phy_c45_id26.attr.attr, + &dev_attr_phy_c45_id27.attr.attr, + &dev_attr_phy_c45_id28.attr.attr, + &dev_attr_phy_c45_id29.attr.attr, + &dev_attr_phy_c45_id30.attr.attr, + &dev_attr_phy_c45_id31.attr.attr, + NULL, +}; + +static umode_t phy_dev_c45_visible(struct kobject *kobj, struct attribute *attr, int foo) +{ + struct phy_c45_devid_attribute *devattr = + (struct phy_c45_devid_attribute *)container_of(attr, struct device_attribute, attr); + struct phy_device *phydev = to_phy_device(kobj_to_dev(kobj)); + + if (!phydev->is_c45 || phydev->c45_ids.device_ids[devattr->index] == 0xffffffff) + return 0; + + return attr->mode; +} + +static const struct attribute_group phy_dev_c45_ids_group = { + .name = "c45_ids", + .attrs = phy_c45_id_attrs, + .is_visible = phy_dev_c45_visible +}; + +static const struct attribute_group *phy_dev_groups[] = { + &phy_dev_group, + &phy_dev_c45_ids_group, + NULL, +}; static const struct device_type mdio_bus_phy_type = { .name = "PHY", -- 2.34.1