drivers/net/dsa/sja1105/sja1105_mdio.c
Source file repositories/reference/linux-study-clean/drivers/net/dsa/sja1105/sja1105_mdio.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/dsa/sja1105/sja1105_mdio.c- Extension
.c- Size
- 11711 bytes
- Lines
- 508
- 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/pcs/pcs-xpcs.hlinux/of_mdio.hsja1105.h
Detected Declarations
enum sja1105_mdio_opcodefunction sja1105_pcs_mdio_read_c45function sja1105_pcs_mdio_write_c45function sja1110_pcs_mdio_read_c45function sja1110_pcs_mdio_write_c45function sja1105_base_t1_encode_addrfunction sja1105_base_t1_mdio_read_c22function sja1105_base_t1_mdio_read_c45function sja1105_base_t1_mdio_write_c22function sja1105_base_t1_mdio_write_c45function sja1105_base_tx_mdio_readfunction sja1105_base_tx_mdio_writefunction sja1105_mdiobus_base_tx_registerfunction sja1105_mdiobus_base_tx_unregisterfunction sja1105_mdiobus_base_t1_registerfunction sja1105_mdiobus_base_t1_unregisterfunction sja1105_mdiobus_pcs_registerfunction sja1105_mdiobus_pcs_unregisterfunction sja1105_mdiobus_registerfunction sja1105_mdiobus_unregister
Annotated Snippet
if (IS_ERR(pcs)) {
rc = PTR_ERR(pcs);
goto out_pcs_free;
}
priv->pcs[port] = pcs;
}
priv->mdio_pcs = bus;
return 0;
out_pcs_free:
for (port = 0; port < ds->num_ports; port++) {
if (priv->pcs[port]) {
xpcs_destroy_pcs(priv->pcs[port]);
priv->pcs[port] = NULL;
}
}
mdiobus_unregister(bus);
mdiobus_free(bus);
return rc;
}
static void sja1105_mdiobus_pcs_unregister(struct sja1105_private *priv)
{
struct dsa_switch *ds = priv->ds;
int port;
if (!priv->mdio_pcs)
return;
for (port = 0; port < ds->num_ports; port++) {
if (priv->pcs[port]) {
xpcs_destroy_pcs(priv->pcs[port]);
priv->pcs[port] = NULL;
}
}
mdiobus_unregister(priv->mdio_pcs);
mdiobus_free(priv->mdio_pcs);
priv->mdio_pcs = NULL;
}
int sja1105_mdiobus_register(struct dsa_switch *ds)
{
struct sja1105_private *priv = ds->priv;
const struct sja1105_regs *regs = priv->info->regs;
struct device_node *switch_node = ds->dev->of_node;
struct device_node *mdio_node;
int rc;
rc = sja1105_mdiobus_pcs_register(priv);
if (rc)
return rc;
mdio_node = of_get_available_child_by_name(switch_node, "mdios");
if (!mdio_node)
return 0;
if (regs->mdio_100base_tx != SJA1105_RSV_ADDR) {
rc = sja1105_mdiobus_base_tx_register(priv, mdio_node);
if (rc)
goto err_put_mdio_node;
}
if (regs->mdio_100base_t1 != SJA1105_RSV_ADDR) {
rc = sja1105_mdiobus_base_t1_register(priv, mdio_node);
if (rc)
goto err_free_base_tx_mdiobus;
}
of_node_put(mdio_node);
return 0;
err_free_base_tx_mdiobus:
sja1105_mdiobus_base_tx_unregister(priv);
err_put_mdio_node:
of_node_put(mdio_node);
sja1105_mdiobus_pcs_unregister(priv);
return rc;
}
void sja1105_mdiobus_unregister(struct dsa_switch *ds)
{
struct sja1105_private *priv = ds->priv;
Annotation
- Immediate include surface: `linux/pcs/pcs-xpcs.h`, `linux/of_mdio.h`, `sja1105.h`.
- Detected declarations: `enum sja1105_mdio_opcode`, `function sja1105_pcs_mdio_read_c45`, `function sja1105_pcs_mdio_write_c45`, `function sja1110_pcs_mdio_read_c45`, `function sja1110_pcs_mdio_write_c45`, `function sja1105_base_t1_encode_addr`, `function sja1105_base_t1_mdio_read_c22`, `function sja1105_base_t1_mdio_read_c45`, `function sja1105_base_t1_mdio_write_c22`, `function sja1105_base_t1_mdio_write_c45`.
- 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.