mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:24:45 +01:00
net: thunderbolt: Allow reading link settings
In order to use Thunderbolt networking as part of bonding device it needs to support ->get_link_ksettings() ethtool operation, so that the bonding driver can read the link speed and the related attributes. Add support for this to the driver. Signed-off-by: Ian MacDonald <ian@netstatz.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Link: https://patch.msgid.link/20260115115646.328898-5-mika.westerberg@linux.intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
2e62e5565b
commit
7a3d3279a5
1 changed files with 49 additions and 0 deletions
|
|
@ -10,6 +10,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/jhash.h>
|
||||
|
|
@ -1265,6 +1266,53 @@ static const struct net_device_ops tbnet_netdev_ops = {
|
|||
.ndo_get_stats64 = tbnet_get_stats64,
|
||||
};
|
||||
|
||||
static int tbnet_get_link_ksettings(struct net_device *dev,
|
||||
struct ethtool_link_ksettings *cmd)
|
||||
{
|
||||
const struct tbnet *net = netdev_priv(dev);
|
||||
const struct tb_xdomain *xd = net->xd;
|
||||
int speed;
|
||||
|
||||
ethtool_link_ksettings_zero_link_mode(cmd, supported);
|
||||
ethtool_link_ksettings_zero_link_mode(cmd, advertising);
|
||||
|
||||
/* Figure out the current link speed and width */
|
||||
switch (xd->link_speed) {
|
||||
case 40:
|
||||
speed = SPEED_80000;
|
||||
break;
|
||||
|
||||
case 20:
|
||||
if (xd->link_width == 2)
|
||||
speed = SPEED_40000;
|
||||
else
|
||||
speed = SPEED_20000;
|
||||
break;
|
||||
|
||||
case 10:
|
||||
if (xd->link_width == 2) {
|
||||
speed = SPEED_20000;
|
||||
break;
|
||||
}
|
||||
fallthrough;
|
||||
|
||||
default:
|
||||
speed = SPEED_10000;
|
||||
break;
|
||||
}
|
||||
|
||||
cmd->base.speed = speed;
|
||||
cmd->base.duplex = DUPLEX_FULL;
|
||||
cmd->base.autoneg = AUTONEG_DISABLE;
|
||||
cmd->base.port = PORT_OTHER;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct ethtool_ops tbnet_ethtool_ops = {
|
||||
.get_link_ksettings = tbnet_get_link_ksettings,
|
||||
};
|
||||
|
||||
static void tbnet_generate_mac(struct net_device *dev)
|
||||
{
|
||||
const struct tbnet *net = netdev_priv(dev);
|
||||
|
|
@ -1315,6 +1363,7 @@ static int tbnet_probe(struct tb_service *svc, const struct tb_service_id *id)
|
|||
|
||||
strcpy(dev->name, "thunderbolt%d");
|
||||
dev->netdev_ops = &tbnet_netdev_ops;
|
||||
dev->ethtool_ops = &tbnet_ethtool_ops;
|
||||
|
||||
/* ThunderboltIP takes advantage of TSO packets but instead of
|
||||
* segmenting them we just split the packet into Thunderbolt
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue