From patchwork Tue Mar 16 19:03:06 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Glendinning X-Patchwork-Id: 47897 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id EDDE7B7D96 for ; Wed, 17 Mar 2010 06:07:57 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933498Ab0CPTHu (ORCPT ); Tue, 16 Mar 2010 15:07:50 -0400 Received: from 77-44-110-64.xdsl.murphx.net ([77.44.110.64]:53597 "EHLO drevil2.shawell.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933891Ab0CPTDK (ORCPT ); Tue, 16 Mar 2010 15:03:10 -0400 Received: from localhost.localdomain (unknown [10.0.20.109]) by drevil2.shawell.net (Postfix) with ESMTP id EEDAB67E39 for ; Tue, 16 Mar 2010 19:03:06 +0000 (GMT) From: Steve Glendinning To: netdev@vger.kernel.org Subject: [PATCH] smsc95xx: wait for PHY to complete reset during init Date: Tue, 16 Mar 2010 19:03:06 +0000 Message-Id: <1268766186-16014-2-git-send-email-steve.glendinning@smsc.com> X-Mailer: git-send-email 1.6.6.1 In-Reply-To: <1268766186-16014-1-git-send-email-steve.glendinning@smsc.com> References: <1268766186-16014-1-git-send-email-steve.glendinning@smsc.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch ensures the PHY correctly completes its reset before setting register values. Signed-off-by: Steve Glendinning --- drivers/net/usb/smsc95xx.c | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index df9179a..d222d7e 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c @@ -709,6 +709,8 @@ static void smsc95xx_start_rx_path(struct usbnet *dev) static int smsc95xx_phy_initialize(struct usbnet *dev) { + int bmcr, timeout = 0; + /* Initialize MII structure */ dev->mii.dev = dev->net; dev->mii.mdio_read = smsc95xx_mdio_read; @@ -717,7 +719,20 @@ static int smsc95xx_phy_initialize(struct usbnet *dev) dev->mii.reg_num_mask = 0x1f; dev->mii.phy_id = SMSC95XX_INTERNAL_PHY_ID; + /* reset phy and wait for reset to complete */ smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); + + do { + msleep(10); + bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR); + timeout++; + } while ((bmcr & MII_BMCR) && (timeout < 100)); + + if (timeout >= 100) { + netdev_warn(dev->net, "timeout on PHY Reset"); + return -EIO; + } + smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM);