drivers/net/mdio/mdio-mvusb.c
Source file repositories/reference/linux-study-clean/drivers/net/mdio/mdio-mvusb.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/net/mdio/mdio-mvusb.c- Extension
.c- Size
- 2750 bytes
- Lines
- 114
- 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/kernel.hlinux/module.hlinux/of_mdio.hlinux/phy.hlinux/usb.h
Detected Declarations
struct mvusb_mdiofunction mvusb_mdio_readfunction mvusb_mdio_writefunction mvusb_mdio_probefunction mvusb_mdio_disconnect
Annotated Snippet
struct mvusb_mdio {
struct usb_device *udev;
struct mii_bus *mdio;
__le16 buf[4];
};
static int mvusb_mdio_read(struct mii_bus *mdio, int dev, int reg)
{
struct mvusb_mdio *mvusb = mdio->priv;
int err, alen;
mvusb->buf[MVUSB_CMD_ADDR] = cpu_to_le16(0xa400 | (dev << 5) | reg);
err = usb_bulk_msg(mvusb->udev, usb_sndbulkpipe(mvusb->udev, 2),
mvusb->buf, 6, &alen, 100);
if (err)
return err;
err = usb_bulk_msg(mvusb->udev, usb_rcvbulkpipe(mvusb->udev, 6),
&mvusb->buf[MVUSB_CMD_VAL], 2, &alen, 100);
if (err)
return err;
return le16_to_cpu(mvusb->buf[MVUSB_CMD_VAL]);
}
static int mvusb_mdio_write(struct mii_bus *mdio, int dev, int reg, u16 val)
{
struct mvusb_mdio *mvusb = mdio->priv;
int alen;
mvusb->buf[MVUSB_CMD_ADDR] = cpu_to_le16(0x8000 | (dev << 5) | reg);
mvusb->buf[MVUSB_CMD_VAL] = cpu_to_le16(val);
return usb_bulk_msg(mvusb->udev, usb_sndbulkpipe(mvusb->udev, 2),
mvusb->buf, 8, &alen, 100);
}
static int mvusb_mdio_probe(struct usb_interface *interface,
const struct usb_device_id *id)
{
struct device *dev = &interface->dev;
struct mvusb_mdio *mvusb;
struct mii_bus *mdio;
mdio = devm_mdiobus_alloc_size(dev, sizeof(*mvusb));
if (!mdio)
return -ENOMEM;
mvusb = mdio->priv;
mvusb->mdio = mdio;
mvusb->udev = interface_to_usbdev(interface);
/* Reversed from USB PCAPs, no idea what these mean. */
mvusb->buf[MVUSB_CMD_PREAMBLE0] = cpu_to_le16(0xe800);
mvusb->buf[MVUSB_CMD_PREAMBLE1] = cpu_to_le16(0x0001);
snprintf(mdio->id, MII_BUS_ID_SIZE, "mvusb-%s", dev_name(dev));
mdio->name = mdio->id;
mdio->parent = dev;
mdio->read = mvusb_mdio_read;
mdio->write = mvusb_mdio_write;
usb_set_intfdata(interface, mvusb);
return of_mdiobus_register(mdio, dev->of_node);
}
static void mvusb_mdio_disconnect(struct usb_interface *interface)
{
struct mvusb_mdio *mvusb = usb_get_intfdata(interface);
mdiobus_unregister(mvusb->mdio);
usb_set_intfdata(interface, NULL);
}
static struct usb_driver mvusb_mdio_driver = {
.name = "mvusb_mdio",
.id_table = mvusb_mdio_table,
.probe = mvusb_mdio_probe,
.disconnect = mvusb_mdio_disconnect,
};
module_usb_driver(mvusb_mdio_driver);
MODULE_AUTHOR("Tobias Waldekranz <tobias@waldekranz.com>");
MODULE_DESCRIPTION("Marvell USB MDIO Adapter");
MODULE_LICENSE("GPL");
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/module.h`, `linux/of_mdio.h`, `linux/phy.h`, `linux/usb.h`.
- Detected declarations: `struct mvusb_mdio`, `function mvusb_mdio_read`, `function mvusb_mdio_write`, `function mvusb_mdio_probe`, `function mvusb_mdio_disconnect`.
- 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.