Commit f24426b3 authored by Fin Maaß's avatar Fin Maaß Committed by Henrik Brix Andersen
Browse files

drivers: net: ethernet: phy: add support for disabling auto-negotiation



Add option in enum phy_link_speed to disable auto-negotiation.
This allows PHY drivers to support disabling auto-negotiation.

Signed-off-by: default avatarFin Maaß <f.maass@vogl-electronic.com>
parent 847be49d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -471,7 +471,7 @@ static int nxp_enet_phy_configure(const struct device *phy, uint8_t phy_mode)
	}

	/* Configure the PHY */
	ret = phy_configure_link(phy, speeds);
	ret = phy_configure_link(phy, speeds, 0);

	if (ret == -ENOTSUP) {
		phy_get_link_state(phy, &state);
+2 −2
Original line number Diff line number Diff line
@@ -529,8 +529,8 @@ static int xilinx_axienet_probe(const struct device *dev)
				      XILINX_AXIENET_RECEIVER_CONFIGURATION_FLOW_CONTROL_EN_MASK);

	/* at time of writing, hardware does not support half duplex */
	err = phy_configure_link(config->phy, LINK_FULL_10BASE | LINK_FULL_100BASE |
						      LINK_FULL_1000BASE);
	err = phy_configure_link(config->phy,
				 LINK_FULL_10BASE | LINK_FULL_100BASE | LINK_FULL_1000BASE, 0);
	if (err) {
		LOG_WRN("Could not configure PHY: %d", -err);
	}
+8 −1
Original line number Diff line number Diff line
@@ -522,13 +522,16 @@ static int phy_dm8806_get_link_state(const struct device *dev, struct phy_link_s
	return ret;
}

static int phy_dm8806_cfg_link(const struct device *dev, enum phy_link_speed adv_speeds)
static int phy_dm8806_cfg_link(const struct device *dev, enum phy_link_speed adv_speeds,
			       enum phy_cfg_link_flag flags)
{
	uint8_t ret;
	uint16_t data;
	uint16_t req_speed;
	const struct phy_dm8806_config *cfg = dev->config;

	ARG_UNUSED(flags);

	req_speed = adv_speeds;
	switch (req_speed) {
	case LINK_HALF_10BASE:
@@ -546,6 +549,10 @@ static int phy_dm8806_cfg_link(const struct device *dev, enum phy_link_speed adv
	case LINK_FULL_100BASE:
		req_speed = DM8806_MODE_100_BASET_FULL_DUPLEX;
		break;

	default:
		LOG_ERR("Invalid speed %d for PHY (%d)", adv_speeds, cfg->phy_addr);
		return -EINVAL;
	}

	/* Power down */
+7 −2
Original line number Diff line number Diff line
@@ -334,14 +334,19 @@ done:
	return ret;
}

static int phy_mc_ksz8081_cfg_link(const struct device *dev,
					enum phy_link_speed speeds)
static int phy_mc_ksz8081_cfg_link(const struct device *dev, enum phy_link_speed speeds,
				   enum phy_cfg_link_flag flags)
{
	const struct mc_ksz8081_config *config = dev->config;
	struct mc_ksz8081_data *data = dev->data;
	struct phy_link_state state = {};
	int ret;

	if (flags & PHY_FLAG_AUTO_NEGOTIATION_DISABLED) {
		LOG_ERR("Disabling auto-negotiation is not supported by this driver");
		return -ENOTSUP;
	}

	/* Lock mutex */
	ret = k_mutex_lock(&data->mutex, K_FOREVER);
	if (ret) {
+3 −3
Original line number Diff line number Diff line
@@ -347,8 +347,8 @@ static int phy_mii_write(const struct device *dev, uint16_t reg_addr,
	return phy_mii_reg_write(dev, reg_addr, (uint16_t)data);
}

static int phy_mii_cfg_link(const struct device *dev,
			    enum phy_link_speed adv_speeds)
static int phy_mii_cfg_link(const struct device *dev, enum phy_link_speed adv_speeds,
			    enum phy_cfg_link_flag flags)
{
	struct phy_mii_dev_data *const data = dev->data;
	const struct phy_mii_dev_config *const cfg = dev->config;
@@ -521,7 +521,7 @@ static int phy_mii_initialize_dynamic_link(const struct device *dev)
	k_work_init_delayable(&data->monitor_work, monitor_work_handler);

	/* Advertise default speeds */
	phy_mii_cfg_link(dev, cfg->default_speeds);
	phy_mii_cfg_link(dev, cfg->default_speeds, 0);

	monitor_work_handler(&data->monitor_work.work);

Loading