From patchwork Mon Dec 31 15:25:46 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Mohr X-Patchwork-Id: 208874 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 1F0532C00A7 for ; Tue, 1 Jan 2013 02:35:16 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751567Ab2LaPfD (ORCPT ); Mon, 31 Dec 2012 10:35:03 -0500 Received: from rhlx01.hs-esslingen.de ([129.143.116.10]:54115 "EHLO rhlx01.hs-esslingen.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751374Ab2LaPep (ORCPT ); Mon, 31 Dec 2012 10:34:45 -0500 Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by rhlx01.hs-esslingen.de (Postfix) with ESMTPS id AF62EA11E8; Mon, 31 Dec 2012 16:25:53 +0100 (CET) From: Andreas Mohr To: andim2@users.sf.net Cc: Roger Luethi , netdev@vger.kernel.org, Francois Romieu Subject: [PATCH RFC 12/15] via-rhine: implement get_regs() ethtool ops. Date: Mon, 31 Dec 2012 16:25:46 +0100 Message-Id: <1356967549-5056-13-git-send-email-andi@lisas.de> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1356967549-5056-1-git-send-email-andi@lisas.de> References: <1356967549-5056-1-git-send-email-andi@lisas.de> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Andreas Mohr Quite useful to pinpoint pre-suspend vs. post-resume register mismatches. Adds io_size member for use in rhine_ethop_get_regs_len(). Signed-off-by: Andreas Mohr --- drivers/net/ethernet/via/via-rhine.c | 40 ++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diff --git a/drivers/net/ethernet/via/via-rhine.c b/drivers/net/ethernet/via/via-rhine.c index 8950eb0..90d109a 100644 --- a/drivers/net/ethernet/via/via-rhine.c +++ b/drivers/net/ethernet/via/via-rhine.c @@ -452,6 +452,7 @@ struct rhine_private { struct work_struct reset_task; u32 msg_enable; + int io_size; /* Frequently used values: keep some adjacent for cache effect. */ u32 quirks; @@ -1001,6 +1002,7 @@ static int rhine_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) rp = netdev_priv(dev); rp->dev = dev; + rp->io_size = io_size; rp->quirks = quirks; rp->pioaddr = pioaddr; rp->pdev = pdev; @@ -2199,6 +2201,42 @@ static void netdev_set_msglevel(struct net_device *dev, u32 value) rp->msg_enable = value; } +/* + * ethtool get_regs() handlers. + * Use e.g. to pinpoint pre-suspend vs. post-resume register mismatches + * due to yet another all-too-frequent suspend/resume issue. + */ +static int +rhine_ethop_get_regs_len(struct net_device *dev) +{ + struct rhine_private *rp = netdev_priv(dev); + return rp->io_size; +} + +static void +rhine_ethop_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) +{ + struct rhine_private *rp = netdev_priv(dev); + unsigned long flags; + void __iomem *ioaddr = rp->base; + u8 *p8 = (u8 *)p; + int len = regs->len; + int len_max = rhine_ethop_get_regs_len(dev); + int i = 0; + + if (len > len_max) + len = len_max; + + regs->version = 1; + + memset(p, 0xFF, len); + + spin_lock_irqsave(&rp->lock, flags); + for (i = 0; i < len; ++i) + p8[i] = ioread8(ioaddr + i); + spin_unlock_irqrestore(&rp->lock, flags); +} + /* Indicates the set of WOL features supported by this card rev. */ static inline u32 rhine_wol_support_bits_get(struct rhine_private *rp) @@ -2241,6 +2279,8 @@ rhine_ethop_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) static const struct ethtool_ops netdev_ethtool_ops = { .get_drvinfo = netdev_get_drvinfo, + .get_regs_len = rhine_ethop_get_regs_len, + .get_regs = rhine_ethop_get_regs, .get_settings = netdev_get_settings, .set_settings = netdev_set_settings, .nway_reset = netdev_nway_reset,