feat(esp_eth): add ioctl for 1G PHY master/slave mode

Needed when forcing 1000 Mbps with autonegotiation disabled.
This commit is contained in:
Ondrej Kosta
2026-08-12 13:07:42 +08:00
committed by morris
parent 32c93135cd
commit 72a35d0f08
6 changed files with 174 additions and 19 deletions
+8 -1
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2019-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -178,6 +178,8 @@ typedef enum {
ETH_CMD_S_ALL_MULTICAST, /*!< Set receive all multicast */
ETH_CMD_ADD_MAC_FILTER, /*!< Add MAC filter */
ETH_CMD_DEL_MAC_FILTER, /*!< Delete MAC filter */
ETH_CMD_S_PHY_MASTER_MODE, /*!< Set PHY master mode */
ETH_CMD_G_PHY_MASTER_MODE, /*!< Get PHY master mode */
ETH_CMD_CUSTOM_MAC_CMDS = ETH_CMD_CUSTOM_MAC_CMDS_OFFSET, // Offset for start of MAC custom commands
ETH_CMD_CUSTOM_PHY_CMDS = ETH_CMD_CUSTOM_PHY_CMDS_OFFSET, // Offset for start of PHY custom commands
@@ -383,9 +385,14 @@ esp_err_t esp_eth_transmit_ctrl_vargs(esp_eth_handle_t hdl, void *ctrl, uint32_t
* Preconditions: Ethernet driver needs to be stopped and auto-negotiation disabled.
* @li @c ETH_CMD_G_DUPLEX_MODE gets current Ethernet link duplex mode. @c data argument is pointer to memory of eth_duplex_t datatype to which the duplex mode is to be stored.
* @li @c ETH_CMD_S_PHY_LOOPBACK sets/resets PHY to/from loopback mode. @c data argument is pointer to memory of bool datatype from which the configuration option is read.
* @li @c ETH_CMD_READ_PHY_REG reads PHY register. @c data argument is pointer to @c esp_eth_phy_reg_rw_data_t containing register address and pointer to store read value.
* @li @c ETH_CMD_WRITE_PHY_REG writes PHY register. @c data argument is pointer to @c esp_eth_phy_reg_rw_data_t containing register address and pointer to value to write.
* @li @c ETH_CMD_S_ALL_MULTICAST sets/resets Ethernet interface to/from receive all multicast mode. @c data argument is pointer to memory of bool datatype from which the configuration option is read.
* @li @c ETH_CMD_ADD_MAC_FILTER adds a MAC address to the MAC filter. @c data argument is pointer to MAC address buffer with expected size of 6 bytes.
* @li @c ETH_CMD_DEL_MAC_FILTER deletes a MAC address from the MAC filter. @c data argument is pointer to MAC address buffer with expected size of 6 bytes.
* @li @c ETH_CMD_S_PHY_MASTER_MODE sets PHY master/slave mode for 1000BASE-T. @c data argument is pointer to memory of bool datatype from which the configuration option is read (true = master, false = slave).
* Preconditions: Ethernet driver needs to be stopped. Required before forcing 1000 Mbps speed when auto-negotiation is disabled.
* @li @c ETH_CMD_G_PHY_MASTER_MODE gets PHY master/slave mode for 1000BASE-T. @c data argument is pointer to memory of bool datatype to which the current configuration is to be stored (true = master, false = slave).
*
* @li Note that additional control commands may be available for specific MAC or PHY chips. Please consult specific MAC or PHY documentation or driver code.
*/
+35 -1
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2019-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -267,6 +267,40 @@ struct esp_eth_phy_s {
*
*/
esp_err_t (*del)(esp_eth_phy_t *phy);
/**
* @brief Sets PHY master/slave mode for 1000BASE-T
*
* @note This configuration is required before forcing 1000 Mbps speed mode when auto-negotiation
* is disabled. One link partner must be configured as master and the other as slave.
* @note This function pointer may be set to NULL when the PHY does not support 1000BASE-T.
*
* @param[in] phy: Ethernet PHY instance
* @param[in] master: set true to configure as master; set false to configure as slave
*
* @return
* - ESP_OK: PHY instance master/slave mode has been configured successfully
* - ESP_ERR_NOT_SUPPORTED: PHY does not support 1000BASE-T
* - ESP_FAIL: PHY instance master/slave mode configuration failed because some error occurred
*
*/
esp_err_t (*set_master_mode)(esp_eth_phy_t *phy, bool master);
/**
* @brief Gets PHY master/slave mode for 1000BASE-T
*
* @note This function pointer may be set to NULL when the PHY does not support 1000BASE-T.
*
* @param[in] phy: Ethernet PHY instance
* @param[out] master: set to true if PHY is configured as master; false if configured as slave
*
* @return
* - ESP_OK: PHY instance master/slave mode has been read successfully
* - ESP_ERR_NOT_SUPPORTED: PHY does not support 1000BASE-T
* - ESP_FAIL: PHY instance master/slave mode read failed because some error occurred
*
*/
esp_err_t (*get_master_mode)(esp_eth_phy_t *phy, bool *master);
};
/**
+27 -1
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -162,6 +162,32 @@ esp_err_t esp_eth_phy_802_3_set_speed(phy_802_3_t *phy_802_3, eth_speed_t speed)
*/
esp_err_t esp_eth_phy_802_3_set_duplex(phy_802_3_t *phy_802_3, eth_duplex_t duplex);
/**
* @brief Set Ethernet PHY master/slave mode for 1000BASE-T
*
* @note Required before forcing 1000 Mbps speed when auto-negotiation is disabled.
*
* @param phy_802_3 IEEE 802.3 PHY object infostructure
* @param master set true to configure as master; set false to configure as slave
* @return
* - ESP_OK: Ethernet PHY master/slave mode set successfully
* - ESP_ERR_NOT_SUPPORTED: PHY does not support 1000BASE-T
* - ESP_FAIL: Set Ethernet PHY master/slave mode failed because some error occurred
*/
esp_err_t esp_eth_phy_802_3_set_master_mode(phy_802_3_t *phy_802_3, bool master);
/**
* @brief Get Ethernet PHY master/slave mode for 1000BASE-T
*
* @param phy_802_3 IEEE 802.3 PHY object infostructure
* @param master set to true if PHY is configured as master; false if configured as slave
* @return
* - ESP_OK: Ethernet PHY master/slave mode read successfully
* - ESP_ERR_NOT_SUPPORTED: PHY does not support 1000BASE-T
* - ESP_FAIL: Get Ethernet PHY master/slave mode failed because some error occurred
*/
esp_err_t esp_eth_phy_802_3_get_master_mode(phy_802_3_t *phy_802_3, bool *master);
/**
* @brief Set Ethernet PHY link status
*
@@ -161,10 +161,13 @@ typedef union {
*/
typedef union {
struct {
uint32_t reserved0 : 8; /*!< Reserved */
uint32_t base1000_t : 1; /*!< 1000Base-T half duplex support */
uint32_t base1000_t_fd : 1; /*!< 1000Base-T full duplex support */
uint32_t reserved1 : 6; /*!< Reserved */
uint32_t reserved0 : 8; /*!< Reserved */
uint32_t base1000_t : 1; /*!< 1000Base-T half duplex support */
uint32_t base1000_t_fd : 1; /*!< 1000Base-T full duplex support */
uint32_t port_type : 1; /*!< Port type: multiport device(1), single-port device(0) */
uint32_t master_slave_cfg : 1; /*!< Master-slave config value: master(1), slave(0) */
uint32_t master_slave_manual : 1; /*!< Master-slave manual configuration enable */
uint32_t test_mode : 3; /*!< Transmitter test mode */
};
uint32_t val;
} gbcr_reg_t;