OpenWrt/LEDE Project

  • Status Unconfirmed
  • Percent Complete
  • Task Type Bug Report
  • Category Kernel
  • Assigned To No-one
  • Operating System All
  • Severity Medium
  • Priority Very Low
  • Reported Version Trunk
  • Due in Version Undecided
  • Due Date Undecided
  • Private
Attached to Project: OpenWrt/LEDE Project
Opened by kestrel1974 - 04.01.2021

FS#3562 - no packet flow on AR 8035 based ports (LAN3, LAN4) of lantiq xrx200 integrated switch (with fix)

The device is fritzbox 7362sl.
It works until kernel 4.19.
The explicit calls to at803x_disable_rx_delay(phydev) and at803x_disable_tx_delay(phydev) seem to clobber the AR8035 registers 0 and 5 with values that make the two LAN ports not transporting anything anymore. Plugging and unplugging cables is still recognized.

I have used a small patch to revert the at803x_config_init function to how it was on kernel 4.19 and the two ports work since then:

 --- a/drivers/net/phy/at803x.c
 +++ b/drivers/net/phy/at803x.c
 @@ -289,20 +289,20 @@ static int at803x_config_init(struct phy_

  	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
 -	    phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
 +	    phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID) {
  		ret = at803x_enable_rx_delay(phydev);
 -	else
 -		ret = at803x_disable_rx_delay(phydev);
 -	if (ret < 0)
 -		return ret;
 +		if (ret < 0)
 +			return ret;
 +	}

  	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
 -	    phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
 +	    phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
  		ret = at803x_enable_tx_delay(phydev);
 -	else
 -		ret = at803x_disable_tx_delay(phydev);
 +		if (ret < 0)
 +			return ret;
 +	}

 -	return ret;
 +	return 0;

  static int at803x_ack_interrupt(struct phy_device *phydev)

But, maybe the explicit call to at803x_disable_??_delay was added for some other device to work. I have experimented with pll-data first, but unlike newer kernels, like 5.10 this is nowhere referenced in the driver for the 5.4 kernel.

Actually, removing the disable calls and using just RGMII is effectivly similar to not touching the AT8035 registers 0 and 5 at all.

Project Manager
Mathias Kresin commented on 04.01.2021 21:16

Thanks a lot for your bug report and the analysis done.

at803x_enable_tx_delay()/at803x_disable_tx_delay() either set BIT 8 of the AT803X_DEBUG_REG_5 register to 1 or 0.

at803x_enable_rx_delay()/at803x_disable_rx_delay() either set BIT 15 of the AT803X_DEBUG_REG_0 register to 1 or 0.

Means, if the call to the disable functions breaks your network connectivity, your system rather needs a call to the enable functions to set the bits.

It only worked so far, since the correct values were present on boot and nothing removed (disabled) them till kernel 5.4.

Would you please test if the attached patch fixes your issue.

Project Manager
Mathias Kresin commented on 10.01.2021 20:47

I updated the attached patch. the first one was faulty.


Available keyboard shortcuts


Task Details

Task Editing