drivers/net/mii.c
Source file repositories/reference/linux-study-clean/drivers/net/mii.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/mii.c- Extension
.c- Size
- 18440 bytes
- Lines
- 669
- Domain
- Driver Families
- Bucket
- drivers/net
- Inferred role
- Driver Families: exported/initcall integration point
- Status
- integration 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/kernel.hlinux/module.hlinux/netdevice.hlinux/ethtool.hlinux/mii.h
Detected Declarations
function Licensefunction mii_ethtool_gsetfunction mii_ethtool_get_link_ksettingsfunction mii_ethtool_ssetfunction mii_ethtool_set_link_ksettingsfunction mii_check_gmii_supportfunction mii_link_okfunction mii_nway_restartfunction changedfunction mii_check_mediafunction generic_mii_ioctlexport mii_link_okexport mii_nway_restartexport mii_ethtool_gsetexport mii_ethtool_get_link_ksettingsexport mii_ethtool_ssetexport mii_ethtool_set_link_ksettingsexport mii_check_linkexport mii_check_mediaexport mii_check_gmii_supportexport generic_mii_ioctl
Annotated Snippet
if (bmsr & BMSR_ANEGCOMPLETE) {
ecmd->lp_advertising = mii_get_an(mii, MII_LPA);
ecmd->lp_advertising |=
mii_stat1000_to_ethtool_lpa_t(stat1000);
} else {
ecmd->lp_advertising = 0;
}
nego = ecmd->advertising & ecmd->lp_advertising;
if (nego & (ADVERTISED_1000baseT_Full |
ADVERTISED_1000baseT_Half)) {
ethtool_cmd_speed_set(ecmd, SPEED_1000);
ecmd->duplex = !!(nego & ADVERTISED_1000baseT_Full);
} else if (nego & (ADVERTISED_100baseT_Full |
ADVERTISED_100baseT_Half)) {
ethtool_cmd_speed_set(ecmd, SPEED_100);
ecmd->duplex = !!(nego & ADVERTISED_100baseT_Full);
} else {
ethtool_cmd_speed_set(ecmd, SPEED_10);
ecmd->duplex = !!(nego & ADVERTISED_10baseT_Full);
}
} else {
ecmd->autoneg = AUTONEG_DISABLE;
ethtool_cmd_speed_set(ecmd,
((bmcr & BMCR_SPEED1000 &&
(bmcr & BMCR_SPEED100) == 0) ?
SPEED_1000 :
((bmcr & BMCR_SPEED100) ?
SPEED_100 : SPEED_10)));
ecmd->duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF;
}
mii->full_duplex = ecmd->duplex;
/* ignore maxtxpkt, maxrxpkt for now */
}
/**
* mii_ethtool_get_link_ksettings - get settings that are specified in @cmd
* @mii: MII interface
* @cmd: requested ethtool_link_ksettings
*
* The @cmd parameter is expected to have been cleared before calling
* mii_ethtool_get_link_ksettings().
*/
void mii_ethtool_get_link_ksettings(struct mii_if_info *mii,
struct ethtool_link_ksettings *cmd)
{
struct net_device *dev = mii->dev;
u16 bmcr, bmsr, ctrl1000 = 0, stat1000 = 0;
u32 nego, supported, advertising, lp_advertising;
supported = (SUPPORTED_10baseT_Half | SUPPORTED_10baseT_Full |
SUPPORTED_100baseT_Half | SUPPORTED_100baseT_Full |
SUPPORTED_Autoneg | SUPPORTED_TP | SUPPORTED_MII);
if (mii->supports_gmii)
supported |= SUPPORTED_1000baseT_Half |
SUPPORTED_1000baseT_Full;
/* only supports twisted-pair */
cmd->base.port = PORT_MII;
/* this isn't fully supported at higher layers */
cmd->base.phy_address = mii->phy_id;
cmd->base.mdio_support = ETH_MDIO_SUPPORTS_C22;
advertising = ADVERTISED_TP | ADVERTISED_MII;
bmcr = mii->mdio_read(dev, mii->phy_id, MII_BMCR);
bmsr = mii->mdio_read(dev, mii->phy_id, MII_BMSR);
if (mii->supports_gmii) {
ctrl1000 = mii->mdio_read(dev, mii->phy_id, MII_CTRL1000);
stat1000 = mii->mdio_read(dev, mii->phy_id, MII_STAT1000);
}
advertising |= mii_get_an(mii, MII_ADVERTISE);
if (mii->supports_gmii)
advertising |= mii_ctrl1000_to_ethtool_adv_t(ctrl1000);
if (bmcr & BMCR_ANENABLE) {
advertising |= ADVERTISED_Autoneg;
cmd->base.autoneg = AUTONEG_ENABLE;
if (bmsr & BMSR_ANEGCOMPLETE) {
lp_advertising = mii_get_an(mii, MII_LPA);
lp_advertising |=
mii_stat1000_to_ethtool_lpa_t(stat1000);
} else {
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/module.h`, `linux/netdevice.h`, `linux/ethtool.h`, `linux/mii.h`.
- Detected declarations: `function License`, `function mii_ethtool_gset`, `function mii_ethtool_get_link_ksettings`, `function mii_ethtool_sset`, `function mii_ethtool_set_link_ksettings`, `function mii_check_gmii_support`, `function mii_link_ok`, `function mii_nway_restart`, `function changed`, `function mii_check_media`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: integration 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.