drivers/net/phy/dp83867.c
Source file repositories/reference/linux-study-clean/drivers/net/phy/dp83867.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/phy/dp83867.c- Extension
.c- Size
- 33713 bytes
- Lines
- 1231
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/ethtool.hlinux/kernel.hlinux/mii.hlinux/module.hlinux/of.hlinux/phy.hlinux/delay.hlinux/netdevice.hlinux/etherdevice.hlinux/bitfield.hlinux/nvmem-consumer.hdt-bindings/net/ti-dp83867.h
Detected Declarations
struct dp83867_privatefunction dp83867_ack_interruptfunction dp83867_set_wolfunction dp83867_get_wolfunction dp83867_config_intrfunction dp83867_handle_interruptfunction dp83867_read_statusfunction dp83867_get_downshiftfunction dp83867_set_downshiftfunction dp83867_get_tunablefunction dp83867_set_tunablefunction dp83867_config_port_mirroringfunction dp83867_of_init_io_impedancefunction dp83867_of_initfunction dp83867_of_initfunction dp83867_suspendfunction dp83867_resumefunction dp83867_probefunction dp83867_config_initfunction dp83867_config_mdixfunction dp83867_config_anegfunction dp83867_phy_resetfunction dp83867_link_change_notifyfunction dp83867_loopbackfunction dp83867_led_brightness_setfunction dp83867_led_modefunction dp83867_led_hw_is_supportedfunction dp83867_led_hw_control_setfunction dp83867_led_hw_control_getfunction dp83867_led_polarity_setfunction for_each_set_bitfunction dp83867_inband_capsfunction dp83867_config_inband
Annotated Snippet
struct dp83867_private {
u32 rx_id_delay;
u32 tx_id_delay;
u32 tx_fifo_depth;
u32 rx_fifo_depth;
int io_impedance;
int port_mirroring;
bool rxctrl_strap_quirk;
bool set_clk_output;
u32 clk_output_sel;
bool sgmii_ref_clk_en;
};
static int dp83867_ack_interrupt(struct phy_device *phydev)
{
int err = phy_read(phydev, MII_DP83867_ISR);
if (err < 0)
return err;
return 0;
}
static int dp83867_set_wol(struct phy_device *phydev,
struct ethtool_wolinfo *wol)
{
struct net_device *ndev = phydev->attached_dev;
u16 val_rxcfg, val_micr;
const u8 *mac;
val_rxcfg = phy_read_mmd(phydev, DP83867_DEVADDR, DP83867_RXFCFG);
val_micr = phy_read(phydev, MII_DP83867_MICR);
if (wol->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_UCAST |
WAKE_BCAST)) {
val_rxcfg |= DP83867_WOL_ENH_MAC;
val_micr |= MII_DP83867_MICR_WOL_INT_EN;
if (wol->wolopts & WAKE_MAGIC) {
mac = (const u8 *)ndev->dev_addr;
if (!is_valid_ether_addr(mac))
return -EINVAL;
phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFPMD1,
(mac[1] << 8 | mac[0]));
phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFPMD2,
(mac[3] << 8 | mac[2]));
phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFPMD3,
(mac[5] << 8 | mac[4]));
val_rxcfg |= DP83867_WOL_MAGIC_EN;
} else {
val_rxcfg &= ~DP83867_WOL_MAGIC_EN;
}
if (wol->wolopts & WAKE_MAGICSECURE) {
phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFSOP1,
(wol->sopass[1] << 8) | wol->sopass[0]);
phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFSOP2,
(wol->sopass[3] << 8) | wol->sopass[2]);
phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFSOP3,
(wol->sopass[5] << 8) | wol->sopass[4]);
val_rxcfg |= DP83867_WOL_SEC_EN;
} else {
val_rxcfg &= ~DP83867_WOL_SEC_EN;
}
if (wol->wolopts & WAKE_UCAST)
val_rxcfg |= DP83867_WOL_UCAST_EN;
else
val_rxcfg &= ~DP83867_WOL_UCAST_EN;
if (wol->wolopts & WAKE_BCAST)
val_rxcfg |= DP83867_WOL_BCAST_EN;
else
val_rxcfg &= ~DP83867_WOL_BCAST_EN;
} else {
val_rxcfg &= ~DP83867_WOL_ENH_MAC;
val_micr &= ~MII_DP83867_MICR_WOL_INT_EN;
}
phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_RXFCFG, val_rxcfg);
phy_write(phydev, MII_DP83867_MICR, val_micr);
return 0;
}
static void dp83867_get_wol(struct phy_device *phydev,
Annotation
- Immediate include surface: `linux/ethtool.h`, `linux/kernel.h`, `linux/mii.h`, `linux/module.h`, `linux/of.h`, `linux/phy.h`, `linux/delay.h`, `linux/netdevice.h`.
- Detected declarations: `struct dp83867_private`, `function dp83867_ack_interrupt`, `function dp83867_set_wol`, `function dp83867_get_wol`, `function dp83867_config_intr`, `function dp83867_handle_interrupt`, `function dp83867_read_status`, `function dp83867_get_downshift`, `function dp83867_set_downshift`, `function dp83867_get_tunable`.
- Atlas domain: Driver Families / drivers/net.
- Implementation status: source implementation candidate.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.