/*
 * Copyright 2023 NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Definitions for IEEE 802.3 management interface
 */

#ifndef ZEPHYR_INCLUDE_NET_MDIO_H_
#define ZEPHYR_INCLUDE_NET_MDIO_H_

/**
 * @brief Definitions for IEEE 802.3 management interface
 * @defgroup ethernet_mdio IEEE 802.3 management interface
 * @ingroup ethernet
 * @{
 */

#ifdef __cplusplus
extern "C" {
#endif

/** MDIO transaction operation code */
enum mdio_opcode {
	/** IEEE 802.3 22.2.4.5.4 write operation */
	MDIO_OP_C22_WRITE = 1,

	/** IEEE 802.3 22.2.4.5.4 read operation */
	MDIO_OP_C22_READ = 2,

	/** IEEE 802.3 45.3.4 address operation */
	MDIO_OP_C45_ADDRESS = 0,

	/** IEEE 802.3 45.3.4 write operation */
	MDIO_OP_C45_WRITE = 1,

	/** IEEE 802.3 45.3.4 post-read-increment-address operation */
	MDIO_OP_C45_READ_INC = 2,

	/** IEEE 802.3 45.3.4 read operation */
	MDIO_OP_C45_READ = 3
};

/* MDIO Manageable Device addresses */
/** Physical Medium Attachment / Physical Medium Dependent */
#define MDIO_MMD_PMAPMD			0x01U
/** WAN Interface Sublayer */
#define MDIO_MMD_WIS			0x02U
/** Physical Coding Sublayer */
#define MDIO_MMD_PCS			0x03U
/** PHY Extender Sublayer */
#define MDIO_MMD_PHYXS			0x04U
/** DTE Extender Sublayer */
#define MDIO_MMD_DTEXS			0x05U
/** Transmission Convergence */
#define MDIO_MMD_TC			0x06U
/** Auto-negotiation */
#define MDIO_MMD_AN			0x07U
/** Separated PMA (1) */
#define MDIO_MMD_SEPARATED_PMA1		0x08U
/** Separated PMA (2) */
#define MDIO_MMD_SEPARATED_PMA2		0x09U
/** Separated PMA (3) */
#define MDIO_MMD_SEPARATED_PMA3		0x0AU
/** Separated PMA (4) */
#define MDIO_MMD_SEPARATED_PMA4		0x0BU
/** Clause 22 extension */
#define MDIO_MMD_C22EXT			0x1DU
/** Vendor Specific 1 */
#define MDIO_MMD_VENDOR_SPECIFIC1	0x1EU
/** Vendor Specific 2 */
#define MDIO_MMD_VENDOR_SPECIFIC2	0x1FU

/* MDIO generic registers */
/** Control 1 */
#define MDIO_CTRL1			0x0000U
/** Status 1 */
#define MDIO_STAT1			0x0001U
/** Device identifier (1) */
#define MDIO_DEVID1			0x0002U
/** Device identifier (2) */
#define MDIO_DEVID2			0x0003U
/** Speed ability */
#define MDIO_SPEED			0x0004U
/** Devices in package (1) */
#define MDIO_DEVS1			0x0005U
/** Devices in package (2) */
#define MDIO_DEVS2			0x0006U
/** Control 2 */
#define MDIO_CTRL2			0x0007U
/** Status 2 */
#define MDIO_STAT2			0x0008U
/** Package identifier (1) */
#define MDIO_PKGID1			0x000EU
/** Package identifier (2) */
#define MDIO_PKGID2			0x000FU


/* BASE-T1 registers */
/** BASE-T1 Auto-negotiation control */
#define MDIO_AN_T1_CTRL			0x0200U
/** BASE-T1 Auto-negotiation status */
#define MDIO_AN_T1_STAT			0x0201U
/** BASE-T1 Auto-negotiation advertisement register [15:0] */
#define MDIO_AN_T1_ADV_L		0x0202U
/** BASE-T1 Auto-negotiation advertisement register [31:16] */
#define MDIO_AN_T1_ADV_M		0x0203U
/** BASE-T1 Auto-negotiation advertisement register [47:32] */
#define MDIO_AN_T1_ADV_H		0x0204U
/* BASE-T1 PMA/PMD control register */
#define MDIO_PMA_PMD_BT1_CTRL		0x0834U

/* BASE-T1 Auto-negotiation Control register */
/** Auto-negotiation Restart */
#define MDIO_AN_T1_CTRL_RESTART		BIT(9)
/** Auto-negotiation Enable */
#define MDIO_AN_T1_CTRL_EN		BIT(12)

/* BASE-T1 Auto-negotiation Status register */
/** Link Status */
#define MDIO_AN_T1_STAT_LINK_STATUS	BIT(2)
/** Auto-negotiation Ability */
#define MDIO_AN_T1_STAT_ABLE		BIT(3)
/** Auto-negotiation Remote Fault */
#define MDIO_AN_T1_STAT_REMOTE_FAULT	BIT(4)
/** Auto-negotiation Complete */
#define MDIO_AN_T1_STAT_COMPLETE	BIT(5)
/** Page Received */
#define MDIO_AN_T1_STAT_PAGE_RX		BIT(6)

/* BASE-T1 Auto-negotiation Advertisement register [15:0] */
/** Pause Ability */
#define MDIO_AN_T1_ADV_L_PAUSE_CAP	BIT(10)
/** Pause Ability */
#define MDIO_AN_T1_ADV_L_PAUSE_ASYM	BIT(11)
/** Force Master/Slave Configuration */
#define MDIO_AN_T1_ADV_L_FORCE_MS	BIT(12)
/** Remote Fault */
#define MDIO_AN_T1_ADV_L_REMOTE_FAULT	BIT(13)
/** Acknowledge (ACK) */
#define MDIO_AN_T1_ADV_L_ACK		BIT(14)
/** Next Page Request */
#define MDIO_AN_T1_ADV_L_NEXT_PAGE_REQ	BIT(15)

/* BASE-T1 Auto-negotiation Advertisement register [31:16] */
/** 10BASE-T1L Ability */
#define MDIO_AN_T1_ADV_M_B10L		BIT(14)
/** Master/slave Configuration */
#define MDIO_AN_T1_ADV_M_MST		BIT(4)

/* BASE-T1 Auto-negotiation Advertisement register [47:32] */
/* 10BASE-T1L High Level Transmit Operating Mode Request */
#define MDIO_AN_T1_ADV_H_10L_TX_HI_REQ	BIT(12)
/* 10BASE-T1L High Level Transmit Operating Mode Ability */
#define MDIO_AN_T1_ADV_H_10L_TX_HI	BIT(13)

/* BASE-T1 PMA/PMD control register */
/** BASE-T1 master/slave configuration */
#define MDIO_PMA_PMD_BT1_CTRL_CFG_MST	BIT(14)


/* 10BASE-T1L registers */
/** 10BASE-T1L PMA control */
#define MDIO_PMA_B10L_CTRL		0x08F6U
/** 10BASE-T1L PMA status */
#define MDIO_PMA_B10L_STAT		0x08F7U
/** 10BASE-T1L PMA link status*/
#define MDIO_PMA_B10L_LINK_STAT		0x8302U
/** 10BASE-T1L PCS control */
#define MDIO_PCS_B10L_CTRL		0x08E6U
/** 10BASE-T1L PCS status */
#define MDIO_PCS_B10L_STAT		0x08E7U

/* 10BASE-T1L PMA control register */
/** 10BASE-T1L Transmit Disable Mode */
#define MDIO_PMA_B10L_CTRL_TX_DIS_MODE_EN		BIT(14)
/** 10BASE-T1L Transmit Voltage Amplitude Control */
#define MDIO_PMA_B10L_CTRL_TX_LVL_HI			BIT(12)
/** 10BASE-T1L EEE Enable */
#define MDIO_PMA_B10L_CTRL_EEE				BIT(10)
/** 10BASE-T1L PMA Loopback */
#define MDIO_PMA_B10L_CTRL_LB_PMA_LOC_EN		BIT(0)

/* 10BASE-T1L PMA status register */
/** 10BASE-T1L PMA receive link up */
#define MDIO_PMA_B10L_STAT_LINK				BIT(0)
/** 10BASE-T1L Fault condition detected */
#define MDIO_PMA_B10L_STAT_FAULT			BIT(1)
/** 10BASE-T1L Receive polarity is reversed */
#define MDIO_PMA_B10L_STAT_POLARITY			BIT(2)
/** 10BASE-T1L Able to detect fault on receive path */
#define MDIO_PMA_B10L_STAT_RECV_FAULT			BIT(9)
/** 10BASE-T1L PHY has EEE ability */
#define MDIO_PMA_B10L_STAT_EEE				BIT(10)
/** 10BASE-T1L PMA has low-power ability */
#define MDIO_PMA_B10L_STAT_LOW_POWER			BIT(11)
/** 10BASE-T1L PHY has 2.4 Vpp operating mode ability */
#define MDIO_PMA_B10L_STAT_2V4_ABLE			BIT(12)
/** 10BASE-T1L PHY has loopback ability */
#define MDIO_PMA_B10L_STAT_LB_ABLE			BIT(13)

/* 10BASE-T1L PMA link status*/
/** 10BASE-T1L Remote Receiver Status OK Latch Low */
#define MDIO_PMA_B10L_LINK_STAT_REM_RCVR_STAT_OK_LL	BIT(9)
/** 10BASE-T1L Remote Receiver Status OK */
#define MDIO_PMA_B10L_LINK_STAT_REM_RCVR_STAT_OK	BIT(8)
/** 10BASE-T1L Local Receiver Status OK */
#define MDIO_PMA_B10L_LINK_STAT_LOC_RCVR_STAT_OK_LL	BIT(7)
/** 10BASE-T1L Local Receiver Status OK */
#define MDIO_PMA_B10L_LINK_STAT_LOC_RCVR_STAT_OK	BIT(6)
/** 10BASE-T1L Descrambler Status OK Latch Low */
#define MDIO_PMA_B10L_LINK_STAT_DSCR_STAT_OK_LL		BIT(5)
/** 10BASE-T1L Descrambler Status OK */
#define MDIO_PMA_B10L_LINK_STAT_DSCR_STAT_OK		BIT(4)
/** 10BASE-T1L Link Status OK Latch Low */
#define MDIO_PMA_B10L_LINK_STAT_LINK_STAT_OK_LL		BIT(1)
/** 10BASE-T1L Link Status OK */
#define MDIO_PMA_B10L_LINK_STAT_LINK_STAT_OK		BIT(0)

/* 10BASE-T1L PCS control */
/** 10BASE-T1L PCS Loopback Enable */
#define MDIO_PCS_B10L_CTRL_LB_PCS_EN			BIT(14)

/* 10BASE-T1L PCS status */
/** 10BASE-T1L PCS Descrambler Status */
#define MDIO_PCS_B10L_STAT_DSCR_STAT_OK_LL		BIT(2)

#ifdef __cplusplus
}
#endif

/**
 * @}
 */

#endif /* ZEPHYR_INCLUDE_NET_MDIO_H_ */
