kernel: fix AT8032 PHY phy id mask
Don't mask bit 4 of the AT8022 phy id. If bit 4 of the AT8022 phy id (0x004dd023) is masked, it will match the phy id of the AR8327 switch (0x004dd033) as well. It results in applied at803x driver settings/callbacks, which will at least limit the AR8327 phys to 100MBit operation instead of the possible 1000MBit. Signed-off-by: Mathias Kresin <dev@kresin.me>
This commit is contained in:
		| @@ -8,15 +8,18 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  |  | ||||||
| --- a/drivers/net/phy/at803x.c | --- a/drivers/net/phy/at803x.c | ||||||
| +++ b/drivers/net/phy/at803x.c | +++ b/drivers/net/phy/at803x.c | ||||||
| @@ -62,6 +62,7 @@ | @@ -62,8 +62,10 @@ | ||||||
|   |   | ||||||
|  #define ATH8030_PHY_ID 0x004dd076 |  #define ATH8030_PHY_ID 0x004dd076 | ||||||
|  #define ATH8031_PHY_ID 0x004dd074 |  #define ATH8031_PHY_ID 0x004dd074 | ||||||
| +#define ATH8032_PHY_ID 0x004dd023 | +#define ATH8032_PHY_ID 0x004dd023 | ||||||
|  #define ATH8035_PHY_ID 0x004dd072 |  #define ATH8035_PHY_ID 0x004dd072 | ||||||
|  #define AT803X_PHY_ID_MASK			0xffffffef |  #define AT803X_PHY_ID_MASK			0xffffffef | ||||||
|  | +#define AT8032_PHY_ID_MASK			0xffffffff | ||||||
|   |   | ||||||
| @@ -256,7 +257,8 @@ static int at803x_probe(struct phy_devic |  MODULE_DESCRIPTION("Atheros 803x PHY driver"); | ||||||
|  |  MODULE_AUTHOR("Matus Ujhelyi"); | ||||||
|  | @@ -256,7 +258,8 @@ static int at803x_probe(struct phy_devic | ||||||
|  	if (!priv) |  	if (!priv) | ||||||
|  		return -ENOMEM; |  		return -ENOMEM; | ||||||
|   |   | ||||||
| @@ -26,7 +29,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  		goto does_not_require_reset_workaround; |  		goto does_not_require_reset_workaround; | ||||||
|   |   | ||||||
|  	gpiod_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); |  	gpiod_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); | ||||||
| @@ -332,7 +334,7 @@ static void at803x_link_change_notify(st | @@ -332,7 +335,7 @@ static void at803x_link_change_notify(st | ||||||
|  	struct at803x_priv *priv = phydev->priv; |  	struct at803x_priv *priv = phydev->priv; | ||||||
|   |   | ||||||
|  	/* |  	/* | ||||||
| @@ -35,7 +38,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  	 * signalled. This is necessary to circumvent a hardware bug that |  	 * signalled. This is necessary to circumvent a hardware bug that | ||||||
|  	 * occurs when the cable is unplugged while TX packets are pending |  	 * occurs when the cable is unplugged while TX packets are pending | ||||||
|  	 * in the FIFO. In such cases, the FIFO enters an error mode it |  	 * in the FIFO. In such cases, the FIFO enters an error mode it | ||||||
| @@ -444,6 +446,24 @@ static struct phy_driver at803x_driver[] | @@ -444,6 +447,24 @@ static struct phy_driver at803x_driver[] | ||||||
|  	.aneg_done		= at803x_aneg_done, |  	.aneg_done		= at803x_aneg_done, | ||||||
|  	.ack_interrupt		= &at803x_ack_interrupt, |  	.ack_interrupt		= &at803x_ack_interrupt, | ||||||
|  	.config_intr		= &at803x_config_intr, |  	.config_intr		= &at803x_config_intr, | ||||||
| @@ -43,7 +46,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
| +	/* ATHEROS 8032 */ | +	/* ATHEROS 8032 */ | ||||||
| +	.phy_id			= ATH8032_PHY_ID, | +	.phy_id			= ATH8032_PHY_ID, | ||||||
| +	.name			= "Atheros 8032 ethernet", | +	.name			= "Atheros 8032 ethernet", | ||||||
| +	.phy_id_mask		= 0xffffffef, | +	.phy_id_mask		= AT8032_PHY_ID_MASK, | ||||||
| +	.probe			= at803x_probe, | +	.probe			= at803x_probe, | ||||||
| +	.config_init		= at803x_config_init, | +	.config_init		= at803x_config_init, | ||||||
| +	.link_change_notify	= at803x_link_change_notify, | +	.link_change_notify	= at803x_link_change_notify, | ||||||
| @@ -60,11 +63,11 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  } }; |  } }; | ||||||
|   |   | ||||||
|  module_phy_driver(at803x_driver); |  module_phy_driver(at803x_driver); | ||||||
| @@ -451,6 +471,7 @@ module_phy_driver(at803x_driver); | @@ -451,6 +472,7 @@ module_phy_driver(at803x_driver); | ||||||
|  static struct mdio_device_id __maybe_unused atheros_tbl[] = { |  static struct mdio_device_id __maybe_unused atheros_tbl[] = { | ||||||
|  	{ ATH8030_PHY_ID, AT803X_PHY_ID_MASK }, |  	{ ATH8030_PHY_ID, AT803X_PHY_ID_MASK }, | ||||||
|  	{ ATH8031_PHY_ID, AT803X_PHY_ID_MASK }, |  	{ ATH8031_PHY_ID, AT803X_PHY_ID_MASK }, | ||||||
| +	{ ATH8032_PHY_ID, AT803X_PHY_ID_MASK }, | +	{ ATH8032_PHY_ID, AT8032_PHY_ID_MASK }, | ||||||
|  	{ ATH8035_PHY_ID, AT803X_PHY_ID_MASK }, |  	{ ATH8035_PHY_ID, AT803X_PHY_ID_MASK }, | ||||||
|  	{ } |  	{ } | ||||||
|  }; |  }; | ||||||
|   | |||||||
| @@ -40,7 +40,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
|  #define AT803X_DEBUG_ADDR			0x1D |  #define AT803X_DEBUG_ADDR			0x1D | ||||||
|  #define AT803X_DEBUG_DATA			0x1E |  #define AT803X_DEBUG_DATA			0x1E | ||||||
|   |   | ||||||
| @@ -73,6 +80,7 @@ MODULE_LICENSE("GPL"); | @@ -74,6 +81,7 @@ MODULE_LICENSE("GPL"); | ||||||
|  struct at803x_priv { |  struct at803x_priv { | ||||||
|  	bool phy_reset:1; |  	bool phy_reset:1; | ||||||
|  	struct gpio_desc *gpiod_reset; |  	struct gpio_desc *gpiod_reset; | ||||||
| @@ -48,7 +48,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
|  }; |  }; | ||||||
|   |   | ||||||
|  struct at803x_context { |  struct at803x_context { | ||||||
| @@ -273,8 +281,16 @@ does_not_require_reset_workaround: | @@ -274,8 +282,16 @@ does_not_require_reset_workaround: | ||||||
|  	return 0; |  	return 0; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -65,7 +65,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
|  	int ret; |  	int ret; | ||||||
|   |   | ||||||
|  	ret = genphy_config_init(phydev); |  	ret = genphy_config_init(phydev); | ||||||
| @@ -295,6 +311,26 @@ static int at803x_config_init(struct phy | @@ -296,6 +312,26 @@ static int at803x_config_init(struct phy | ||||||
|  			return ret; |  			return ret; | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
| @@ -92,7 +92,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
|  	return 0; |  	return 0; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @@ -332,6 +368,8 @@ static int at803x_config_intr(struct phy | @@ -333,6 +369,8 @@ static int at803x_config_intr(struct phy | ||||||
|  static void at803x_link_change_notify(struct phy_device *phydev) |  static void at803x_link_change_notify(struct phy_device *phydev) | ||||||
|  { |  { | ||||||
|  	struct at803x_priv *priv = phydev->priv; |  	struct at803x_priv *priv = phydev->priv; | ||||||
| @@ -101,7 +101,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | |||||||
|   |   | ||||||
|  	/* |  	/* | ||||||
|  	 * Conduct a hardware reset for AT8030/2 every time a link loss is |  	 * Conduct a hardware reset for AT8030/2 every time a link loss is | ||||||
| @@ -360,6 +398,24 @@ static void at803x_link_change_notify(st | @@ -361,6 +399,24 @@ static void at803x_link_change_notify(st | ||||||
|  	} else { |  	} else { | ||||||
|  		priv->phy_reset = false; |  		priv->phy_reset = false; | ||||||
|  	} |  	} | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ Signed-off-by: Roman Yeryomin <roman@advem.lv> | |||||||
|  #define AT803X_MODE_CFG_MASK			0x0F |  #define AT803X_MODE_CFG_MASK			0x0F | ||||||
|  #define AT803X_MODE_CFG_SGMII			0x01 |  #define AT803X_MODE_CFG_SGMII			0x01 | ||||||
|   |   | ||||||
| @@ -292,6 +296,27 @@ static int at803x_config_init(struct phy | @@ -293,6 +297,27 @@ static int at803x_config_init(struct phy | ||||||
|  { |  { | ||||||
|  	struct at803x_platform_data *pdata; |  	struct at803x_platform_data *pdata; | ||||||
|  	int ret; |  	int ret; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Mathias Kresin
					Mathias Kresin