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.

Dependency Surface

Detected Declarations

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

Implementation Notes