
#include <sys/bus.h>

INTERFACE mdio;

CODE {
	#include <dev/mdio/mdio.h>

	static int
	mdio_null_readextreg(device_t dev, int phy, int devad, int reg)
	{
		if (devad == MDIO_DEVADDR_NONE)
			return (MDIO_READREG(dev, phy, reg));
		return (~0U);
	}

	static int
	mdio_null_writeextreg(device_t dev, int phy, int devad, int reg,
	    int val)
	{
		if (devad == MDIO_DEVADDR_NONE)
			return (MDIO_WRITEREG(dev, phy, reg, val));

		return (EINVAL);
	}
}

/**
 * @brief Read register from device on MDIO bus.
 *
 * @param dev	MDIO bus device.
 * @param phy	PHY address.
 * @param reg	The PHY register offset.
 */
METHOD int readreg {
	device_t		dev;
	int			phy;
	int			reg;
};

/**
 * @brief Read register from device on MDIO muxed bus.
 *
 * @param dev	MDIO bus device.
 * @param bus	MDIO bus mux position
 * @param phy	PHY address.
 * @param reg	The PHY register offset.
 */
METHOD int readreg_mux {
	device_t		dev;
	int			bus;
	int			phy;
	int			reg;
};

/**
 * @brief Write register to device on MDIO bus.
 *
 * @param dev	MDIO bus device.
 * @param phy	PHY address.
 * @param reg	The PHY register offset.
 * @param val	The value to write at offset @p reg.
 */
METHOD int writereg {
	device_t		dev;
	int			phy;
	int			reg;
	int			val;
};

/**
 * @brief Write register to device on MDIO muxed bus.
 *
 * @param dev	MDIO bus device.
 * @param bus	MDIO bus mux position
 * @param phy	PHY address.
 * @param reg	The PHY register offset.
 * @param val	The value to write at offset @p reg.
 */
METHOD int writereg_mux {
	device_t		dev;
	int			bus;
	int			phy;
	int			reg;
	int			val;
};


/**
 * @brief Read extended register from device on MDIO bus.
 *
 * @param dev	MDIO bus device.
 * @param phy	PHY address.
 * @param devad The MDIO IEEE 802.3 Clause 45 device address, or
 *		MDIO_DEVADDR_NONE to request Clause 22 register addressing.
 * @param reg	The PHY register offset.
 */
METHOD int readextreg {
	device_t		dev;
	int			phy;
	int			devad;
	int			reg;
} DEFAULT mdio_null_readextreg;


/**
 * @brief Write extended register to device on MDIO bus.
 *
 * @param dev	MDIO bus device.
 * @param phy	PHY address.
 * @param devad The MDIO IEEE 802.3 Clause 45 device address, or
 *		MDIO_DEVADDR_NONE to request Clause 22 register addressing.
 * @param reg	The PHY register offset.
 * @param val	The value to write at offset @p reg.
 */
METHOD int writeextreg {
	device_t		dev;
	int			phy;
	int			devad;
	int			reg;
	int			val;
} DEFAULT mdio_null_writeextreg;
