From patchwork Tue Apr 4 23:12:29 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 747029 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 3vyPsG4fgPz9s7t for ; Wed, 5 Apr 2017 09:13:06 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="XsG5j5Gl"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755316AbdDDXND (ORCPT ); Tue, 4 Apr 2017 19:13:03 -0400 Received: from mail-pf0-f176.google.com ([209.85.192.176]:32936 "EHLO mail-pf0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755291AbdDDXNA (ORCPT ); Tue, 4 Apr 2017 19:13:00 -0400 Received: by mail-pf0-f176.google.com with SMTP id s16so25016360pfs.0 for ; Tue, 04 Apr 2017 16:13:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=zji8J+qMQ0MK5MDeW2+pmcXjUq34sMllu2b4R4vcyfU=; b=XsG5j5GlsYncKcjEdERm/EZb8uoY+K2pXwEU0TeuGsTowCm5TB2sH9tRmoDOY3Enkl Cq5ZooRkiJpf4vyXgcHciT4ZdcOoBD3vtsS1TeQ1eyd89X3BEuo5nNx7L0FUfMltFIzm PYV7R4zYfetBtSbrQRVMxeg13alcOVahiLbsw12TSNk8mvQiLLCtWufG+LR35A1hPclo P9LYwzkNsb+obbJBAKulEk1QjHTUQp/fFLBBwwhKNTlwgMOEem5kOBN1R34S538eOYZP kZ3XdRaFivTkvozyUi0mTSaW6TwJMa+X9lmXsQp1/gCeOlAs/h7njs/wpvQcxmTHkBPB /7ZA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=zji8J+qMQ0MK5MDeW2+pmcXjUq34sMllu2b4R4vcyfU=; b=UFJ3u5kh8wUC/if+I14RujCMASQK2OwodzLvz6NM9ZuoWPCqQI211a0g7M3Zor9eWX oequEDY1aE8B4R6impLA6wc4WHeyshGwRhLwg6mXSfPLPVrXCPE/IxGom0J/qSMq/6qM b0qGC7v+e7/CWJWWmxFUdB0M7L74sIBHb5JQuyLB6oqV/ityEPWXn58oaClrFSQZhk+A NDHCuCtgScy3UZZsrFmzIMO3RxSDoCSWXjpsvw2cwlcyYtpOK5eko+8+kIFCjB+Wx+xY uNfWHiKgISEOjPde/8Ove6nPzlwsLzyKuLzP+BSBex7W5eKF6zdHS6s34QuSZdt/Gs+m veww== X-Gm-Message-State: AFeK/H1rwZf33cAwEBlS0qimqkM+aNdQdYpXrsmFVzsOQys9yFMp/YIrI+FfpR17b0Z3pZUF X-Received: by 10.99.104.9 with SMTP id d9mr26833516pgc.27.1491347579794; Tue, 04 Apr 2017 16:12:59 -0700 (PDT) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id x15sm33617483pfk.68.2017.04.04.16.12.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 04 Apr 2017 16:12:59 -0700 (PDT) From: Jakub Kicinski To: netdev@vger.kernel.org Cc: oss-drivers@netronome.com, kubakici@wp.pl, Jakub Kicinski Subject: [PATCH net-next 08/14] nfp: report port type in ethtool Date: Tue, 4 Apr 2017 16:12:29 -0700 Message-Id: <20170404231235.32027-9-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170404231235.32027-1-jakub.kicinski@netronome.com> References: <20170404231235.32027-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Service process firmware provides us with information about media and interface (SFP module) plugged in, translate that to Linux's PORT_* defines and report via ethtool. Signed-off-by: Jakub Kicinski Reviewed-by: Simon Horman --- .../net/ethernet/netronome/nfp/nfp_net_ethtool.c | 1 + .../ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c | 21 +++++++++++++++++++ .../ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.h | 24 ++++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c index 563ced3c99e1..3b2a09821a59 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c @@ -215,6 +215,7 @@ nfp_net_get_link_ksettings(struct net_device *netdev, nfp_net_refresh_port_config(nn); /* Separate if - on FW error the port could've disappeared from table */ if (nn->eth_port) { + cmd->base.port = nn->eth_port->port_type; cmd->base.speed = nn->eth_port->speed; cmd->base.duplex = DUPLEX_FULL; return 0; diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c index dcb1bc81e554..07b4ded01514 100644 --- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c +++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c @@ -62,6 +62,8 @@ #define NSP_ETH_STATE_TX_ENABLED BIT_ULL(2) #define NSP_ETH_STATE_RX_ENABLED BIT_ULL(3) #define NSP_ETH_STATE_RATE GENMASK_ULL(11, 8) +#define NSP_ETH_STATE_INTERFACE GENMASK_ULL(19, 12) +#define NSP_ETH_STATE_MEDIA GENMASK_ULL(21, 20) #define NSP_ETH_STATE_OVRD_CHNG BIT_ULL(22) #define NSP_ETH_STATE_ANEG GENMASK_ULL(25, 23) @@ -134,6 +136,9 @@ nfp_eth_port_translate(struct nfp_nsp *nsp, const struct eth_table_entry *src, rate = nfp_eth_rate(FIELD_GET(NSP_ETH_STATE_RATE, state)); dst->speed = dst->lanes * rate; + dst->interface = FIELD_GET(NSP_ETH_STATE_INTERFACE, state); + dst->media = FIELD_GET(NSP_ETH_STATE_MEDIA, state); + nfp_eth_copy_mac_reverse(dst->mac_addr, src->mac_addr); dst->label_port = FIELD_GET(NSP_ETH_PORT_PHYLABEL, port); @@ -170,6 +175,20 @@ nfp_eth_mark_split_ports(struct nfp_cpp *cpp, struct nfp_eth_table *table) } } +static void +nfp_eth_calc_port_type(struct nfp_cpp *cpp, struct nfp_eth_table_port *entry) +{ + if (entry->interface == NFP_INTERFACE_NONE) { + entry->port_type = PORT_NONE; + return; + } + + if (entry->media == NFP_MEDIA_FIBRE) + entry->port_type = PORT_FIBRE; + else + entry->port_type = PORT_DA; +} + /** * nfp_eth_read_ports() - retrieve port information * @cpp: NFP CPP handle @@ -237,6 +256,8 @@ __nfp_eth_read_ports(struct nfp_cpp *cpp, struct nfp_nsp *nsp) &table->ports[j++]); nfp_eth_mark_split_ports(cpp, table); + for (i = 0; i < table->count; i++) + nfp_eth_calc_port_type(cpp, &table->ports[i]); kfree(entries); diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.h b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.h index 6b3e954e70b3..57eb3cfa6a0a 100644 --- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.h +++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.h @@ -37,6 +37,22 @@ #include #include +enum nfp_eth_interface { + NFP_INTERFACE_NONE = 0, + NFP_INTERFACE_SFP = 1, + NFP_INTERFACE_SFPP = 10, + NFP_INTERFACE_SFP28 = 28, + NFP_INTERFACE_QSFP = 40, + NFP_INTERFACE_CXP = 100, + NFP_INTERFACE_QSFP28 = 112, +}; + +enum nfp_eth_media { + NFP_MEDIA_DAC_PASSIVE = 0, + NFP_MEDIA_DAC_ACTIVE, + NFP_MEDIA_FIBRE, +}; + enum nfp_eth_aneg { NFP_ANEG_AUTO = 0, NFP_ANEG_SEARCH, @@ -56,6 +72,8 @@ enum nfp_eth_aneg { * @base: first channel index (within NBI) * @lanes: number of channels * @speed: interface speed (in Mbps) + * @interface: interface (module) plugged in + * @media: media type of the @interface * @aneg: auto negotiation mode * @mac_addr: interface MAC address * @label_port: port id @@ -65,6 +83,7 @@ enum nfp_eth_aneg { * @rx_enabled: is RX enabled? * @override_changed: is media reconfig pending? * + * @port_type: one of %PORT_* defines for ethtool * @is_split: is interface part of a split port */ struct nfp_eth_table { @@ -77,6 +96,9 @@ struct nfp_eth_table { unsigned int lanes; unsigned int speed; + unsigned int interface; + enum nfp_eth_media media; + enum nfp_eth_aneg aneg; u8 mac_addr[ETH_ALEN]; @@ -91,6 +113,8 @@ struct nfp_eth_table { bool override_changed; /* Computed fields */ + u8 port_type; + bool is_split; } ports[0]; };