Skip to content
/ mdio-tools Public

Low-level debug tools for MDIO devices.

License

Notifications You must be signed in to change notification settings

wkz/mdio-tools

Folders and files

NameName
Last commit message
Last commit date

Latest commit

cd8a908 · Apr 1, 2025
Sep 18, 2021
Sep 16, 2022
Jul 15, 2023
Apr 1, 2025
Jun 10, 2022
Nov 23, 2024
May 5, 2023
May 29, 2020
Dec 2, 2023
Sep 18, 2021
Jul 15, 2023
Jun 28, 2021
Mar 31, 2025

Repository files navigation

mdio-tools

License Badge GitHub Status

The latest release is always available from GitHub at

https://github.com/wkz/mdio-tools/releases

Table of Contents

Introduction

mdio is a low-level Linux debug tool for communicating with devices attached an MDIO bus. It improves on existing tools in this space in a few important ways:

  • MDIO buses are directly addressable. Previous solutions relied on at least one Ethernet PHY on the bus being attached to a net device, which is typically not the case when the device is an Ethernet switch for example.
  • Complex operations can be performed atomically. The old API only supported a single read or write of a single register. mdio sends byte code to the mdio-netlink kernel module that can perform multiple operations, store intermediate values, loop etc. As a result, things like read/mask/write operations and accesses to paged PHYs can be performed safely.

Usage

    mdio            -- List available buses
    mdio BUS        -- Probe BUS for active devices
    mdio BUS OBJ    -- Show status of OBJ
    mdio BUS OBJ OP -- Perform OP on OBJ

Options:
  -h   This help text
  -v   Show verision and contact information

Bus names may be abbreviated using glob(3) syntax, i.e. "fixed*"
would typically match against "fixed-0".

Objects:
  phy PHYAD
    Clause 22 (MDIO) PHY using address PHYAD.

    REG: u5

  mmd PRTAD[:DEVAD]
    Clause 45 (XMDIO) PHY using address PRTAD:DEVAD.

    REG: u16

  mva PHYAD
    Operate on Marvell Alaska (mv88e8xxx) PHY using address PHYAD.
    Register 22 is assumed to be the page register.

    REG: u8|"copper"|"fiber":u5

  mvls ID
    Operate on Marvell LinkStreet (mv88e6xxx) device attached to BUS
    using address ID. If ID is 0, single-chip addressing is used; all
    other IDs use multi-chip addressing.

    REG: u5|"global1"|"global2" u5

  xrs PHYAD
    Operate of Arrow/Flexibilis XRS700x device using address PHYAD.

    REG: u32 (Stride of 2, only even registers are valid)

Operations:
  raw REG [DATA[/MASK]]
    Raw register access. Without DATA, REG is read. An unmasked DATA will
    do a single write to REG. A masked DATA will perform a read/mask/write
    sequence.

    DATA: u16
    MASK: u16

Build

At the moment, the kernel module (which requires at least kernel version 5.2) has to be built separately. Set KDIR if building against a kernel in a non-standard location.

cd kernel/
make all && sudo make install

When building from GIT, the configure script first needs to be generated, this requires autoconf and automake to be installed. A helper script to generate configure is available:

./autogen.sh

Standard autotools incantation is then used, requires pkg-config to locate the libmnl development files.

./configure --prefix=/usr && make all && sudo make install