From patchwork Wed Jan 29 19:56:37 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 315202 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 0BD382C007C for ; Thu, 30 Jan 2014 06:57:36 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752124AbaA2T5P (ORCPT ); Wed, 29 Jan 2014 14:57:15 -0500 Received: from mail-la0-f47.google.com ([209.85.215.47]:60346 "EHLO mail-la0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751844AbaA2T5I (ORCPT ); Wed, 29 Jan 2014 14:57:08 -0500 Received: by mail-la0-f47.google.com with SMTP id hr17so1837218lab.6 for ; Wed, 29 Jan 2014 11:57:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=TP6rwH6EzEqpl0Z8ZW2+JpJtDRz/0YqROw0vN14hO0Q=; b=xp8Dm3uMk24lJO6afOVCZrSLz0WJCK5nvjh4P30raDJrUn3IuXh4pdTZPJbBIjDXi5 +1py5+4IpNahmNTu0hx0wedSwinx/JJPB7HjnhRDW4l2hJ4o5ooH9uvUtW2I7RRZQJ/7 FVJoDcswMI1SHKtYBSFq4Ptm+K5ghHUehyEsgbIub6GFPD5ozbsfX/ydUbyzgyEEFmxq 1V5auuGIEB5hiJ1Oquy7uA0N7fB3ZQi9D9tOiAXOk4TPjUuXWZcX61e+6g6URoAJyyaT 1JKB3OTVGdBhO0ZCv8bC1ndYeD+2UJk29Py4U17QfVllx7tzTURdPLjolKeSy9LCcOgi BxvQ== X-Received: by 10.112.180.72 with SMTP id dm8mr3071173lbc.28.1391025427184; Wed, 29 Jan 2014 11:57:07 -0800 (PST) Received: from octofox.metropolis ([188.134.19.124]) by mx.google.com with ESMTPSA id bl3sm3601582lbd.7.2014.01.29.11.57.05 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Jan 2014 11:57:06 -0800 (PST) From: Max Filippov To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Cc: "David S. Miller" , Florian Fainelli , Marc Gauthier , Max Filippov Subject: [PATCH 4/4] net: ethoc: implement ethtool get/set ring parameters Date: Wed, 29 Jan 2014 23:56:37 +0400 Message-Id: <1391025397-14965-5-git-send-email-jcmvbkbc@gmail.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1391025397-14965-1-git-send-email-jcmvbkbc@gmail.com> References: <1391025397-14965-1-git-send-email-jcmvbkbc@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org TX and RX rings share memory and descriptors. Maximal number of descriptors reported is one less than the total available nuber of descriptors. For the set operation the requested number of TX descriptors is rounded down to the nearest power of two (driver logic requirement), the rest are RX descriptors. If less RX descriptors is requested the rest is left unused. Signed-off-by: Max Filippov --- drivers/net/ethernet/ethoc.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/net/ethernet/ethoc.c b/drivers/net/ethernet/ethoc.c index 0bf297b..c873946 100644 --- a/drivers/net/ethernet/ethoc.c +++ b/drivers/net/ethernet/ethoc.c @@ -181,6 +181,7 @@ MODULE_PARM_DESC(buffer_size, "DMA buffer allocation size"); * @membase: pointer to buffer memory region * @dma_alloc: dma allocated buffer size * @io_region_size: I/O memory region size + * @num_bd: number of buffer descriptors * @num_tx: number of send buffers * @cur_tx: last send buffer written * @dty_tx: last buffer actually sent @@ -201,6 +202,7 @@ struct ethoc { int dma_alloc; resource_size_t io_region_size; + unsigned int num_bd; unsigned int num_tx; unsigned int cur_tx; unsigned int dty_tx; @@ -940,12 +942,44 @@ static void ethoc_get_regs(struct net_device *dev, struct ethtool_regs *regs, regs_buff[i] = ethoc_read(priv, i * sizeof(u32)); } +static void ethoc_get_ringparam(struct net_device *dev, + struct ethtool_ringparam *ring) +{ + struct ethoc *priv = netdev_priv(dev); + + ring->rx_max_pending = priv->num_bd - 1; + ring->rx_mini_max_pending = 0; + ring->rx_jumbo_max_pending = 0; + ring->tx_max_pending = priv->num_bd - 1; + + ring->rx_pending = priv->num_rx; + ring->rx_mini_pending = 0; + ring->rx_jumbo_pending = 0; + ring->tx_pending = priv->num_tx; +} + +static int ethoc_set_ringparam(struct net_device *dev, + struct ethtool_ringparam *ring) +{ + struct ethoc *priv = netdev_priv(dev); + + if (netif_running(dev)) + return -EBUSY; + priv->num_tx = rounddown_pow_of_two(ring->tx_pending); + priv->num_rx = priv->num_bd - priv->num_tx; + if (priv->num_rx > ring->rx_pending) + priv->num_rx = ring->rx_pending; + return 0; +} + const struct ethtool_ops ethoc_ethtool_ops = { .get_settings = ethoc_get_settings, .set_settings = ethoc_set_settings, .get_regs_len = ethoc_get_regs_len, .get_regs = ethoc_get_regs, .get_link = ethtool_op_get_link, + .get_ringparam = ethoc_get_ringparam, + .set_ringparam = ethoc_set_ringparam, .get_ts_info = ethtool_op_get_ts_info, }; @@ -1077,6 +1111,7 @@ static int ethoc_probe(struct platform_device *pdev) ret = -ENODEV; goto error; } + priv->num_bd = num_bd; /* num_tx must be a power of two */ priv->num_tx = rounddown_pow_of_two(num_bd >> 1); priv->num_rx = num_bd - priv->num_tx;