]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: mdio: extend struct mdio_bus_stat_attr instead of using dev_ext_attribute
authorHeiner Kallweit <hkallweit1@gmail.com>
Fri, 27 Feb 2026 22:05:18 +0000 (23:05 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 3 Mar 2026 12:23:44 +0000 (13:23 +0100)
Currently the var member of struct dev_ext_attribute is used in a very
ugly way. Extend struct mdio_bus_stat_attr instead, what allows to
simplify the code and also slightly reduces memory footprint.

Note: Member addr is renamed to avoid a conflict in macro
      MDIO_BUS_STATS_ADDR_ATTR_DECL.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Link: https://patch.msgid.link/ce9f85d2-4f72-4b15-b868-210a8ced662d@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/phy/mdio_bus.c

index afdf1ad6c0e6192db19e9d43b510c7a7c44094b3..4fe9859369b1e9922ffb970003abb25ff8f2ab9b 100644 (file)
@@ -124,10 +124,16 @@ static void mdiobus_release(struct device *d)
 }
 
 struct mdio_bus_stat_attr {
-       int addr;
+       struct device_attribute attr;
+       int address;
        unsigned int field_offset;
 };
 
+static struct mdio_bus_stat_attr *to_sattr(struct device_attribute *attr)
+{
+       return container_of(attr, struct mdio_bus_stat_attr, attr);
+}
+
 static u64 mdio_bus_get_stat(struct mdio_bus_stats *s, unsigned int offset)
 {
        const char *p = (const char *)s + offset;
@@ -157,18 +163,14 @@ static ssize_t mdio_bus_stat_field_show(struct device *dev,
                                        struct device_attribute *attr,
                                        char *buf)
 {
+       struct mdio_bus_stat_attr *sattr = to_sattr(attr);
        struct mii_bus *bus = to_mii_bus(dev);
-       struct mdio_bus_stat_attr *sattr;
-       struct dev_ext_attribute *eattr;
        u64 val;
 
-       eattr = container_of(attr, struct dev_ext_attribute, attr);
-       sattr = eattr->var;
-
-       if (sattr->addr < 0)
+       if (sattr->address < 0)
                val = mdio_bus_get_global_stat(bus, sattr->field_offset);
        else
-               val = mdio_bus_get_stat(&bus->stats[sattr->addr],
+               val = mdio_bus_get_stat(&bus->stats[sattr->address],
                                        sattr->field_offset);
 
        return sysfs_emit(buf, "%llu\n", val);
@@ -178,37 +180,31 @@ static ssize_t mdio_bus_device_stat_field_show(struct device *dev,
                                               struct device_attribute *attr,
                                               char *buf)
 {
+       struct mdio_bus_stat_attr *sattr = to_sattr(attr);
        struct mdio_device *mdiodev = to_mdio_device(dev);
        struct mii_bus *bus = mdiodev->bus;
-       struct mdio_bus_stat_attr *sattr;
-       struct dev_ext_attribute *eattr;
        int addr = mdiodev->addr;
        u64 val;
 
-       eattr = container_of(attr, struct dev_ext_attribute, attr);
-       sattr = eattr->var;
-
        val = mdio_bus_get_stat(&bus->stats[addr], sattr->field_offset);
 
        return sysfs_emit(buf, "%llu\n", val);
 }
 
 #define MDIO_BUS_STATS_ATTR_DECL(field, file)                          \
-static struct dev_ext_attribute dev_attr_mdio_bus_##field = {          \
+static struct mdio_bus_stat_attr dev_attr_mdio_bus_##field = {         \
        .attr = { .attr = { .name = file, .mode = 0444 },               \
                     .show = mdio_bus_stat_field_show,                  \
        },                                                              \
-       .var = &((struct mdio_bus_stat_attr) {                          \
-               -1, offsetof(struct mdio_bus_stats, field)              \
-       }),                                                             \
+       .address = -1,                                                  \
+       .field_offset = offsetof(struct mdio_bus_stats, field),         \
 };                                                                     \
-static struct dev_ext_attribute dev_attr_mdio_bus_device_##field = {   \
+static struct mdio_bus_stat_attr dev_attr_mdio_bus_device_##field = {  \
        .attr = { .attr = { .name = file, .mode = 0444 },               \
                     .show = mdio_bus_device_stat_field_show,           \
        },                                                              \
-       .var = &((struct mdio_bus_stat_attr) {                          \
-               -1, offsetof(struct mdio_bus_stats, field)              \
-       }),                                                             \
+       .address = -1,                                                  \
+       .field_offset = offsetof(struct mdio_bus_stats, field),         \
 };
 
 #define MDIO_BUS_STATS_ATTR(field)                                     \
@@ -220,13 +216,12 @@ MDIO_BUS_STATS_ATTR(writes);
 MDIO_BUS_STATS_ATTR(reads);
 
 #define MDIO_BUS_STATS_ADDR_ATTR_DECL(field, addr, file)               \
-static struct dev_ext_attribute dev_attr_mdio_bus_addr_##field##_##addr = { \
+static struct mdio_bus_stat_attr dev_attr_mdio_bus_addr_##field##_##addr = { \
        .attr = { .attr = { .name = file, .mode = 0444 },               \
                     .show = mdio_bus_stat_field_show,                  \
        },                                                              \
-       .var = &((struct mdio_bus_stat_attr) {                          \
-               addr, offsetof(struct mdio_bus_stats, field)            \
-       }),                                                             \
+       .address = addr,                                                \
+       .field_offset = offsetof(struct mdio_bus_stats, field),         \
 }
 
 #define MDIO_BUS_STATS_ADDR_ATTR(field, addr)                          \