From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758601AbbJ3HHS (ORCPT ); Fri, 30 Oct 2015 03:07:18 -0400 Received: from mailout3.w1.samsung.com ([210.118.77.13]:60701 "EHLO mailout3.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751777AbbJ3HHQ (ORCPT ); Fri, 30 Oct 2015 03:07:16 -0400 X-AuditID: cbfec7f4-f79c56d0000012ee-7e-56331721274b From: Pavel Fedin To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Steve Glendinning Subject: [PATCH] net: smsc911x: Reset PHY during initialization Date: Fri, 30 Oct 2015 10:06:19 +0300 Message-id: <1446188779-4184-1-git-send-email-p.fedin@samsung.com> X-Mailer: git-send-email 2.4.4 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrOJMWRmVeSWpSXmKPExsVy+t/xy7qK4sZhBtN+Cllc3jWHzeLYAjGL 5k+vmByYPf43X2bx+LxJLoApissmJTUnsyy1SN8ugSvj685O5oLH/BXtt04wNjB28XYxcnJI CJhIXDvYxwRhi0lcuLeerYuRi0NIYCmjxNvbs6GcNiaJfTNnM4JUsQmoS5z++oGli5GDQ0TA QuJEWxZImFnAVOLmpPesILawgL3EyQsHWEBsFgFVieNbpoLZvAJOEr33L7FALJOTuHJ9OtsE Ru4FjAyrGEVTS5MLipPScw31ihNzi0vz0vWS83M3MUK8+2UH4+JjVocYBTgYlXh4fyQYhQmx JpYVV+YeYpTgYFYS4f19CSjEm5JYWZValB9fVJqTWnyIUZqDRUmcd+6u9yFCAumJJanZqakF qUUwWSYOTqkGRlO2CXVtFf8K98w2+Sr1p0KbRdZ94+HDObcfr5/48A+jyrPpF/5wzT2dz9D0 n0Fot6zO3HKZHTVVPr320m4TJnhPufL3htDH5yrXxd7sXr8h5evJzjhu2x+i1qsm6k1xXJnT 8q7vcruW6wT5g0Ht6WIay6ZeqQt6YdfTf6SriUvt9Ob9iQ9PbVJiKc5INNRiLipOBAD5zYoD 6gEAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On certain hardware after software reboot the chip may get stuck and fail to reinitialize during reset. This can be fixed by ensuring that PHY is reset too. Old PHY resetting method required operational MDIO interface, therefore the chip should have been already set up. In order to be able to function during probe, it is changed to use PMT_CTRL register. The problem could be observed on SMDK5410 board. Signed-off-by: Pavel Fedin --- drivers/net/ethernet/smsc/smsc911x.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c index c860c90..219a99b 100644 --- a/drivers/net/ethernet/smsc/smsc911x.c +++ b/drivers/net/ethernet/smsc/smsc911x.c @@ -809,22 +809,17 @@ static int smsc911x_phy_check_loopbackpkt(struct smsc911x_data *pdata) static int smsc911x_phy_reset(struct smsc911x_data *pdata) { - struct phy_device *phy_dev = pdata->phy_dev; unsigned int temp; unsigned int i = 100000; - BUG_ON(!phy_dev); - BUG_ON(!phy_dev->bus); - - SMSC_TRACE(pdata, hw, "Performing PHY BCR Reset"); - smsc911x_mii_write(phy_dev->bus, phy_dev->addr, MII_BMCR, BMCR_RESET); + temp = smsc911x_reg_read(pdata, PMT_CTRL); + smsc911x_reg_write(pdata, PMT_CTRL, temp | PMT_CTRL_PHY_RST_); do { msleep(1); - temp = smsc911x_mii_read(phy_dev->bus, phy_dev->addr, - MII_BMCR); - } while ((i--) && (temp & BMCR_RESET)); + temp = smsc911x_reg_read(pdata, PMT_CTRL); + } while ((i--) && (temp & PMT_CTRL_PHY_RST_)); - if (temp & BMCR_RESET) { + if (unlikely(temp & PMT_CTRL_PHY_RST_)) { SMSC_WARN(pdata, hw, "PHY reset failed to complete"); return -EIO; } @@ -2296,7 +2291,7 @@ static int smsc911x_init(struct net_device *dev) } /* Reset the LAN911x */ - if (smsc911x_soft_reset(pdata)) + if (smsc911x_phy_reset(pdata) || smsc911x_soft_reset(pdata)) return -ENODEV; dev->flags |= IFF_MULTICAST; -- 2.4.4