static int ixgb_get_link_ksettings(struct net_device *netdev, struct ethtool_link_ksettings *cmd) { struct ixgb_adapter *adapter = netdev_priv(netdev); ethtool_link_ksettings_zero_link_mode(cmd, supported); ethtool_link_ksettings_add_link_mode(cmd, supported, 10000baseT_Full); ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE); ethtool_link_ksettings_zero_link_mode(cmd, advertising); ethtool_link_ksettings_add_link_mode(cmd, advertising, 10000baseT_Full); ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE); cmd->base.port = PORT_FIBRE; if (netif_carrier_ok(adapter->netdev)) { cmd->base.speed = SPEED_10000; cmd->base.duplex = DUPLEX_FULL; } else { cmd->base.speed = SPEED_UNKNOWN; cmd->base.duplex = DUPLEX_UNKNOWN; } cmd->base.autoneg = AUTONEG_DISABLE; return 0; }
/* ethtool_ops::get_link_ksettings */ static int vboxNetAdpEthGetLinkSettings(struct net_device *pNetDev, struct ethtool_link_ksettings *pLinkSettings) { /* We just need to set field we care for, the rest is done by ethtool_get_link_ksettings() helper in ethtool. */ ethtool_link_ksettings_zero_link_mode(pLinkSettings, supported); ethtool_link_ksettings_zero_link_mode(pLinkSettings, advertising); ethtool_link_ksettings_zero_link_mode(pLinkSettings, lp_advertising); pLinkSettings->base.speed = SPEED_10; pLinkSettings->base.duplex = DUPLEX_FULL; pLinkSettings->base.port = PORT_TP; pLinkSettings->base.phy_address = 0; pLinkSettings->base.transceiver = XCVR_INTERNAL; pLinkSettings->base.autoneg = AUTONEG_DISABLE; return 0; }
static int aqc111_get_link_ksettings(struct net_device *net, struct ethtool_link_ksettings *elk) { struct usbnet *dev = netdev_priv(net); struct aqc111_data *aqc111_data = dev->driver_priv; enum usb_device_speed usb_speed = dev->udev->speed; u32 speed = SPEED_UNKNOWN; ethtool_link_ksettings_zero_link_mode(elk, supported); ethtool_link_ksettings_add_link_mode(elk, supported, 100baseT_Full); ethtool_link_ksettings_add_link_mode(elk, supported, 1000baseT_Full); if (usb_speed == USB_SPEED_SUPER) { ethtool_link_ksettings_add_link_mode(elk, supported, 2500baseT_Full); ethtool_link_ksettings_add_link_mode(elk, supported, 5000baseT_Full); } ethtool_link_ksettings_add_link_mode(elk, supported, TP); ethtool_link_ksettings_add_link_mode(elk, supported, Autoneg); elk->base.port = PORT_TP; elk->base.transceiver = XCVR_INTERNAL; elk->base.mdio_support = 0x00; /*Not supported*/ if (aqc111_data->autoneg) linkmode_copy(elk->link_modes.advertising, elk->link_modes.supported); else aqc111_speed_to_link_mode(aqc111_data->advertised_speed, elk); elk->base.autoneg = aqc111_data->autoneg; switch (aqc111_data->link_speed) { case AQ_INT_SPEED_5G: speed = SPEED_5000; break; case AQ_INT_SPEED_2_5G: speed = SPEED_2500; break; case AQ_INT_SPEED_1G: speed = SPEED_1000; break; case AQ_INT_SPEED_100M: speed = SPEED_100; break; } elk->base.duplex = DUPLEX_FULL; elk->base.speed = speed; return 0; }
static int spider_net_ethtool_get_link_ksettings(struct net_device *netdev, struct ethtool_link_ksettings *cmd) { struct spider_net_card *card; card = netdev_priv(netdev); ethtool_link_ksettings_zero_link_mode(cmd, supported); ethtool_link_ksettings_add_link_mode(cmd, supported, 1000baseT_Full); ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE); ethtool_link_ksettings_zero_link_mode(cmd, advertising); ethtool_link_ksettings_add_link_mode(cmd, advertising, 1000baseT_Full); ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE); cmd->base.port = PORT_FIBRE; cmd->base.speed = card->phy.speed; cmd->base.duplex = DUPLEX_FULL; return 0; }
static bool netvsc_validate_ethtool_ss_cmd(const struct ethtool_link_ksettings *cmd) { struct ethtool_link_ksettings diff1 = *cmd; struct ethtool_link_ksettings diff2 = {}; diff1.base.speed = 0; diff1.base.duplex = 0; /* advertising and cmd are usually set */ ethtool_link_ksettings_zero_link_mode(&diff1, advertising); diff1.base.cmd = 0; /* We set port to PORT_OTHER */ diff2.base.port = PORT_OTHER; return !memcmp(&diff1, &diff2, sizeof(diff1)); }
/** * i40evf_get_link_ksettings - Get Link Speed and Duplex settings * @netdev: network interface device structure * @cmd: ethtool command * * Reports speed/duplex settings. Because this is a VF, we don't know what * kind of link we really have, so we fake it. **/ static int i40evf_get_link_ksettings(struct net_device *netdev, struct ethtool_link_ksettings *cmd) { struct i40evf_adapter *adapter = netdev_priv(netdev); ethtool_link_ksettings_zero_link_mode(cmd, supported); cmd->base.autoneg = AUTONEG_DISABLE; cmd->base.port = PORT_NONE; /* Set speed and duplex */ switch (adapter->link_speed) { case I40E_LINK_SPEED_40GB: cmd->base.speed = SPEED_40000; break; case I40E_LINK_SPEED_25GB: #ifdef SPEED_25000 cmd->base.speed = SPEED_25000; #else netdev_info(netdev, "Speed is 25G, display not supported by this version of ethtool.\n"); #endif break; case I40E_LINK_SPEED_20GB: cmd->base.speed = SPEED_20000; break; case I40E_LINK_SPEED_10GB: cmd->base.speed = SPEED_10000; break; case I40E_LINK_SPEED_1GB: cmd->base.speed = SPEED_1000; break; case I40E_LINK_SPEED_100MB: cmd->base.speed = SPEED_100; break; default: break; } cmd->base.duplex = DUPLEX_FULL; return 0; }
static int ixgbevf_get_link_ksettings(struct net_device *netdev, struct ethtool_link_ksettings *cmd) { struct ixgbevf_adapter *adapter = netdev_priv(netdev); struct ixgbe_hw *hw = &adapter->hw; u32 link_speed = 0; bool link_up; ethtool_link_ksettings_zero_link_mode(cmd, supported); ethtool_link_ksettings_add_link_mode(cmd, supported, 10000baseT_Full); cmd->base.autoneg = AUTONEG_DISABLE; cmd->base.port = -1; hw->mac.get_link_status = 1; hw->mac.ops.check_link(hw, &link_speed, &link_up, false); if (link_up) { __u32 speed = SPEED_10000; switch (link_speed) { case IXGBE_LINK_SPEED_10GB_FULL: speed = SPEED_10000; break; case IXGBE_LINK_SPEED_1GB_FULL: speed = SPEED_1000; break; case IXGBE_LINK_SPEED_100_FULL: speed = SPEED_100; break; } cmd->base.speed = speed; cmd->base.duplex = DUPLEX_FULL; } else { cmd->base.speed = SPEED_UNKNOWN; cmd->base.duplex = DUPLEX_UNKNOWN; } return 0; }