drivers/net/ethernet/marvell/octeon_ep/octep_ethtool.c
Source file repositories/reference/linux-study-clean/drivers/net/ethernet/marvell/octeon_ep/octep_ethtool.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/ethernet/marvell/octeon_ep/octep_ethtool.c- Extension
.c- Size
- 16188 bytes
- Lines
- 464
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/pci.hlinux/netdevice.hlinux/ethtool.hoctep_config.hoctep_main.hoctep_ctrl_net.h
Detected Declarations
function octep_get_drvinfofunction octep_get_stringsfunction octep_get_sset_countfunction octep_get_ethtool_statsfunction octep_get_link_ksettingsfunction octep_set_link_ksettingsfunction octep_get_channelsfunction octep_set_ethtool_ops
Annotated Snippet
if (link_info->autoneg & OCTEP_LINK_MODE_AUTONEG_ADVERTISED) {
ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg);
cmd->base.autoneg = AUTONEG_ENABLE;
} else {
cmd->base.autoneg = AUTONEG_DISABLE;
}
} else {
cmd->base.autoneg = AUTONEG_DISABLE;
}
if (link_info->pause) {
if (link_info->pause & OCTEP_LINK_MODE_PAUSE_SUPPORTED)
ethtool_link_ksettings_add_link_mode(cmd, supported, Pause);
if (link_info->pause & OCTEP_LINK_MODE_PAUSE_ADVERTISED)
ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);
}
cmd->base.port = PORT_FIBRE;
ethtool_link_ksettings_add_link_mode(cmd, supported, FIBRE);
ethtool_link_ksettings_add_link_mode(cmd, advertising, FIBRE);
if (netif_carrier_ok(netdev)) {
cmd->base.speed = link_info->speed;
cmd->base.duplex = DUPLEX_FULL;
} else {
cmd->base.speed = SPEED_UNKNOWN;
cmd->base.duplex = DUPLEX_UNKNOWN;
}
return 0;
}
static int octep_set_link_ksettings(struct net_device *netdev,
const struct ethtool_link_ksettings *cmd)
{
struct octep_device *oct = netdev_priv(netdev);
struct octep_iface_link_info link_info_new;
struct octep_iface_link_info *link_info;
u64 advertised = 0;
u8 autoneg = 0;
int err;
link_info = &oct->link_info;
memcpy(&link_info_new, link_info, sizeof(struct octep_iface_link_info));
/* Only Full duplex is supported;
* Assume full duplex when duplex is unknown.
*/
if (cmd->base.duplex != DUPLEX_FULL &&
cmd->base.duplex != DUPLEX_UNKNOWN)
return -EOPNOTSUPP;
if (cmd->base.autoneg == AUTONEG_ENABLE) {
if (!(link_info->autoneg & OCTEP_LINK_MODE_AUTONEG_SUPPORTED))
return -EOPNOTSUPP;
autoneg = 1;
}
if (!bitmap_subset(cmd->link_modes.advertising,
cmd->link_modes.supported,
__ETHTOOL_LINK_MODE_MASK_NBITS))
return -EINVAL;
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
10000baseT_Full))
advertised |= BIT(OCTEP_LINK_MODE_10GBASE_T);
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
10000baseR_FEC))
advertised |= BIT(OCTEP_LINK_MODE_10GBASE_R);
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
10000baseCR_Full))
advertised |= BIT(OCTEP_LINK_MODE_10GBASE_CR);
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
10000baseKR_Full))
advertised |= BIT(OCTEP_LINK_MODE_10GBASE_KR);
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
10000baseLR_Full))
advertised |= BIT(OCTEP_LINK_MODE_10GBASE_LR);
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
10000baseSR_Full))
advertised |= BIT(OCTEP_LINK_MODE_10GBASE_SR);
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
25000baseCR_Full))
advertised |= BIT(OCTEP_LINK_MODE_25GBASE_CR);
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
25000baseKR_Full))
advertised |= BIT(OCTEP_LINK_MODE_25GBASE_KR);
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
25000baseSR_Full))
advertised |= BIT(OCTEP_LINK_MODE_25GBASE_SR);
if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
Annotation
- Immediate include surface: `linux/pci.h`, `linux/netdevice.h`, `linux/ethtool.h`, `octep_config.h`, `octep_main.h`, `octep_ctrl_net.h`.
- Detected declarations: `function octep_get_drvinfo`, `function octep_get_strings`, `function octep_get_sset_count`, `function octep_get_ethtool_stats`, `function octep_get_link_ksettings`, `function octep_set_link_ksettings`, `function octep_get_channels`, `function octep_set_ethtool_ops`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.