Skip to content

Commit 3ed5333

Browse files
committed
ethtool: add linkmode bitmap support to struct ethtool_keee
JIRA: https://issues.redhat.com/browse/RHEL-32101 commit 1f069de Author: Heiner Kallweit <hkallweit1@gmail.com> Date: Sat Jan 27 14:29:33 2024 +0100 ethtool: add linkmode bitmap support to struct ethtool_keee Add linkmode bitmap members to struct ethtool_keee, but keep the legacy u32 bitmaps for compatibility with existing drivers. Use linkmode "supported" not being empty as indicator that a user wants to use the linkmode bitmap members instead of the legacy bitmaps. Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Ivan Vecera <ivecera@redhat.com>
1 parent e77f9b4 commit 3ed5333

File tree

5 files changed

+68
-17
lines changed

5 files changed

+68
-17
lines changed

include/linux/ethtool.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,9 @@ __ethtool_get_link_ksettings(struct net_device *dev,
223223
struct ethtool_link_ksettings *link_ksettings);
224224

225225
struct ethtool_keee {
226+
__ETHTOOL_DECLARE_LINK_MODE_MASK(supported);
227+
__ETHTOOL_DECLARE_LINK_MODE_MASK(advertised);
228+
__ETHTOOL_DECLARE_LINK_MODE_MASK(lp_advertised);
226229
u32 supported_u32;
227230
u32 advertised_u32;
228231
u32 lp_advertised_u32;

net/ethtool/common.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,3 +705,8 @@ ethtool_forced_speed_maps_init(struct ethtool_forced_speed_map *maps, u32 size)
705705
}
706706
}
707707
EXPORT_SYMBOL_GPL(ethtool_forced_speed_maps_init);
708+
709+
bool ethtool_eee_use_linkmodes(const struct ethtool_keee *eee)
710+
{
711+
return !linkmode_empty(eee->supported);
712+
}

net/ethtool/common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,6 @@ int ethtool_get_module_eeprom_call(struct net_device *dev,
5555
struct ethtool_eeprom *ee, u8 *data);
5656

5757
bool __ethtool_dev_mm_supported(struct net_device *dev);
58+
bool ethtool_eee_use_linkmodes(const struct ethtool_keee *eee);
5859

5960
#endif /* _ETHTOOL_COMMON_H */

net/ethtool/eee.c

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,26 @@ static int eee_prepare_data(const struct ethnl_req_info *req_base,
3030
{
3131
struct eee_reply_data *data = EEE_REPDATA(reply_base);
3232
struct net_device *dev = reply_base->dev;
33+
struct ethtool_keee *eee = &data->eee;
3334
int ret;
3435

3536
if (!dev->ethtool_ops->get_eee)
3637
return -EOPNOTSUPP;
3738
ret = ethnl_ops_begin(dev);
3839
if (ret < 0)
3940
return ret;
40-
ret = dev->ethtool_ops->get_eee(dev, &data->eee);
41+
ret = dev->ethtool_ops->get_eee(dev, eee);
4142
ethnl_ops_complete(dev);
4243

44+
if (!ret && !ethtool_eee_use_linkmodes(eee)) {
45+
ethtool_convert_legacy_u32_to_link_mode(eee->supported,
46+
eee->supported_u32);
47+
ethtool_convert_legacy_u32_to_link_mode(eee->advertised,
48+
eee->advertised_u32);
49+
ethtool_convert_legacy_u32_to_link_mode(eee->lp_advertised,
50+
eee->lp_advertised_u32);
51+
}
52+
4353
return ret;
4454
}
4555

@@ -58,14 +68,16 @@ static int eee_reply_size(const struct ethnl_req_info *req_base,
5868
EEE_MODES_COUNT);
5969

6070
/* MODES_OURS */
61-
ret = ethnl_bitset32_size(&eee->advertised_u32, &eee->supported_u32,
62-
EEE_MODES_COUNT, link_mode_names, compact);
71+
ret = ethnl_bitset_size(eee->advertised, eee->supported,
72+
__ETHTOOL_LINK_MODE_MASK_NBITS,
73+
link_mode_names, compact);
6374
if (ret < 0)
6475
return ret;
6576
len += ret;
6677
/* MODES_PEERS */
67-
ret = ethnl_bitset32_size(&eee->lp_advertised_u32, NULL,
68-
EEE_MODES_COUNT, link_mode_names, compact);
78+
ret = ethnl_bitset_size(eee->lp_advertised, NULL,
79+
__ETHTOOL_LINK_MODE_MASK_NBITS,
80+
link_mode_names, compact);
6981
if (ret < 0)
7082
return ret;
7183
len += ret;
@@ -87,14 +99,16 @@ static int eee_fill_reply(struct sk_buff *skb,
8799
const struct ethtool_keee *eee = &data->eee;
88100
int ret;
89101

90-
ret = ethnl_put_bitset32(skb, ETHTOOL_A_EEE_MODES_OURS,
91-
&eee->advertised_u32, &eee->supported_u32,
92-
EEE_MODES_COUNT, link_mode_names, compact);
102+
ret = ethnl_put_bitset(skb, ETHTOOL_A_EEE_MODES_OURS,
103+
eee->advertised, eee->supported,
104+
__ETHTOOL_LINK_MODE_MASK_NBITS,
105+
link_mode_names, compact);
93106
if (ret < 0)
94107
return ret;
95-
ret = ethnl_put_bitset32(skb, ETHTOOL_A_EEE_MODES_PEER,
96-
&eee->lp_advertised_u32, NULL, EEE_MODES_COUNT,
97-
link_mode_names, compact);
108+
ret = ethnl_put_bitset(skb, ETHTOOL_A_EEE_MODES_PEER,
109+
eee->lp_advertised, NULL,
110+
__ETHTOOL_LINK_MODE_MASK_NBITS,
111+
link_mode_names, compact);
98112
if (ret < 0)
99113
return ret;
100114

@@ -140,9 +154,16 @@ ethnl_set_eee(struct ethnl_req_info *req_info, struct genl_info *info)
140154
if (ret < 0)
141155
return ret;
142156

143-
ret = ethnl_update_bitset32(&eee.advertised_u32, EEE_MODES_COUNT,
144-
tb[ETHTOOL_A_EEE_MODES_OURS],
145-
link_mode_names, info->extack, &mod);
157+
if (ethtool_eee_use_linkmodes(&eee)) {
158+
ret = ethnl_update_bitset(eee.advertised,
159+
__ETHTOOL_LINK_MODE_MASK_NBITS,
160+
tb[ETHTOOL_A_EEE_MODES_OURS],
161+
link_mode_names, info->extack, &mod);
162+
} else {
163+
ret = ethnl_update_bitset32(&eee.advertised_u32, EEE_MODES_COUNT,
164+
tb[ETHTOOL_A_EEE_MODES_OURS],
165+
link_mode_names, info->extack, &mod);
166+
}
146167
if (ret < 0)
147168
return ret;
148169
ethnl_update_bool(&eee.eee_enabled, tb[ETHTOOL_A_EEE_ENABLED], &mod);

net/ethtool/ioctl.c

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,20 +1479,41 @@ static void eee_to_keee(struct ethtool_keee *keee,
14791479
keee->eee_enabled = eee->eee_enabled;
14801480
keee->tx_lpi_enabled = eee->tx_lpi_enabled;
14811481
keee->tx_lpi_timer = eee->tx_lpi_timer;
1482+
1483+
ethtool_convert_legacy_u32_to_link_mode(keee->supported,
1484+
eee->supported);
1485+
ethtool_convert_legacy_u32_to_link_mode(keee->advertised,
1486+
eee->advertised);
1487+
ethtool_convert_legacy_u32_to_link_mode(keee->lp_advertised,
1488+
eee->lp_advertised);
14821489
}
14831490

14841491
static void keee_to_eee(struct ethtool_eee *eee,
14851492
const struct ethtool_keee *keee)
14861493
{
14871494
memset(eee, 0, sizeof(*eee));
14881495

1489-
eee->supported = keee->supported_u32;
1490-
eee->advertised = keee->advertised_u32;
1491-
eee->lp_advertised = keee->lp_advertised_u32;
14921496
eee->eee_active = keee->eee_active;
14931497
eee->eee_enabled = keee->eee_enabled;
14941498
eee->tx_lpi_enabled = keee->tx_lpi_enabled;
14951499
eee->tx_lpi_timer = keee->tx_lpi_timer;
1500+
1501+
if (ethtool_eee_use_linkmodes(keee)) {
1502+
bool overflow;
1503+
1504+
overflow = !ethtool_convert_link_mode_to_legacy_u32(&eee->supported,
1505+
keee->supported);
1506+
ethtool_convert_link_mode_to_legacy_u32(&eee->advertised,
1507+
keee->advertised);
1508+
ethtool_convert_link_mode_to_legacy_u32(&eee->lp_advertised,
1509+
keee->lp_advertised);
1510+
if (overflow)
1511+
pr_warn("Ethtool ioctl interface doesn't support passing EEE linkmodes beyond bit 32\n");
1512+
} else {
1513+
eee->supported = keee->supported_u32;
1514+
eee->advertised = keee->advertised_u32;
1515+
eee->lp_advertised = keee->lp_advertised_u32;
1516+
}
14961517
}
14971518

14981519
static int ethtool_get_eee(struct net_device *dev, char __user *useraddr)

0 commit comments

Comments
 (0)