2016-11-29 16:55:41 +00:00
|
|
|
From: Timur Tabi <timur@codeaurora.org>
|
|
|
|
Date: Tue, 26 Apr 2016 12:44:18 -0500
|
|
|
|
Subject: [PATCH] net: phy: at803x: only the AT8030 needs a hardware reset on
|
|
|
|
link change
|
|
|
|
|
|
|
|
Commit 13a56b44 ("at803x: Add support for hardware reset") added a
|
|
|
|
work-around for a hardware bug on the AT8030. However, the work-around
|
|
|
|
was being called for all 803x PHYs, even those that don't need it.
|
|
|
|
Function at803x_link_change_notify() checks to make sure that it only
|
|
|
|
resets the PHY on the 8030, but it makes more sense to not call that
|
|
|
|
function at all if it isn't needed.
|
|
|
|
|
|
|
|
Signed-off-by: Timur Tabi <timur@codeaurora.org>
|
|
|
|
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
|
|
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
|
|
---
|
|
|
|
|
|
|
|
--- a/drivers/net/phy/at803x.c
|
|
|
|
+++ b/drivers/net/phy/at803x.c
|
|
|
|
@@ -374,27 +374,25 @@ static void at803x_link_change_notify(st
|
|
|
|
* in the FIFO. In such cases, the FIFO enters an error mode it
|
|
|
|
* cannot recover from by software.
|
|
|
|
*/
|
|
|
|
- if (phydev->drv->phy_id == ATH8030_PHY_ID) {
|
|
|
|
- if (phydev->state == PHY_NOLINK) {
|
|
|
|
- if (priv->gpiod_reset && !priv->phy_reset) {
|
|
|
|
- struct at803x_context context;
|
2016-12-02 10:43:17 +00:00
|
|
|
-
|
2016-11-29 16:55:41 +00:00
|
|
|
- at803x_context_save(phydev, &context);
|
2016-12-02 10:43:17 +00:00
|
|
|
-
|
2016-11-29 16:55:41 +00:00
|
|
|
- gpiod_set_value(priv->gpiod_reset, 1);
|
|
|
|
- msleep(1);
|
|
|
|
- gpiod_set_value(priv->gpiod_reset, 0);
|
|
|
|
- msleep(1);
|
2016-12-02 10:43:17 +00:00
|
|
|
-
|
2016-11-29 16:55:41 +00:00
|
|
|
- at803x_context_restore(phydev, &context);
|
2016-12-02 10:43:17 +00:00
|
|
|
-
|
2016-11-29 16:55:41 +00:00
|
|
|
- dev_dbg(&phydev->dev, "%s(): phy was reset\n",
|
|
|
|
- __func__);
|
|
|
|
- priv->phy_reset = true;
|
|
|
|
- }
|
|
|
|
- } else {
|
|
|
|
- priv->phy_reset = false;
|
2016-12-02 10:43:17 +00:00
|
|
|
+ if (phydev->state == PHY_NOLINK) {
|
|
|
|
+ if (priv->gpiod_reset && !priv->phy_reset) {
|
|
|
|
+ struct at803x_context context;
|
|
|
|
+
|
|
|
|
+ at803x_context_save(phydev, &context);
|
|
|
|
+
|
|
|
|
+ gpiod_set_value(priv->gpiod_reset, 1);
|
|
|
|
+ msleep(1);
|
|
|
|
+ gpiod_set_value(priv->gpiod_reset, 0);
|
|
|
|
+ msleep(1);
|
|
|
|
+
|
|
|
|
+ at803x_context_restore(phydev, &context);
|
|
|
|
+
|
2016-11-29 16:55:41 +00:00
|
|
|
+ dev_dbg(&phydev->dev, "%s(): phy was reset\n",
|
|
|
|
+ __func__);
|
|
|
|
+ priv->phy_reset = true;
|
|
|
|
}
|
|
|
|
+ } else {
|
|
|
|
+ priv->phy_reset = false;
|
|
|
|
}
|
|
|
|
if (pdata && pdata->fixup_rgmii_tx_delay &&
|
|
|
|
phydev->speed != priv->prev_speed) {
|
|
|
|
@@ -426,7 +424,6 @@ static struct phy_driver at803x_driver[]
|
|
|
|
.phy_id_mask = AT803X_PHY_ID_MASK,
|
|
|
|
.probe = at803x_probe,
|
|
|
|
.config_init = at803x_config_init,
|
|
|
|
- .link_change_notify = at803x_link_change_notify,
|
|
|
|
.set_wol = at803x_set_wol,
|
|
|
|
.get_wol = at803x_get_wol,
|
|
|
|
.suspend = at803x_suspend,
|
|
|
|
@@ -468,7 +465,6 @@ static struct phy_driver at803x_driver[]
|
|
|
|
.phy_id_mask = AT803X_PHY_ID_MASK,
|
|
|
|
.probe = at803x_probe,
|
|
|
|
.config_init = at803x_config_init,
|
|
|
|
- .link_change_notify = at803x_link_change_notify,
|
|
|
|
.set_wol = at803x_set_wol,
|
|
|
|
.get_wol = at803x_get_wol,
|
|
|
|
.suspend = at803x_suspend,
|