From patchwork Wed Aug 3 18:55:46 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Raghu Vatsavayi X-Patchwork-Id: 655603 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 3s4PqY4pT5z9sxR for ; Thu, 4 Aug 2016 06:31:37 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=CAVIUMNETWORKS.onmicrosoft.com header.i=@CAVIUMNETWORKS.onmicrosoft.com header.b=BD9eaFJ9; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932808AbcHCUbf (ORCPT ); Wed, 3 Aug 2016 16:31:35 -0400 Received: from mail-bn3nam01on0083.outbound.protection.outlook.com ([104.47.33.83]:30448 "EHLO NAM01-BN3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1758336AbcHCUb2 (ORCPT ); Wed, 3 Aug 2016 16:31:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=f+MNAWiZ3hDL7HCYVs+jJSTq2HnOmSuTJ8TeQyw/L3o=; b=BD9eaFJ9C29sSD4b6vbxwU2hMJFobqmV7C5cPe8QrG8CvUiA9MCqP+HRKQW20KMqA8a++AiJ9+wwJIJdCJ2oqvrjT7NbCsoc5r98yiLadHN00gRdYBCAHeVDkP0t0XeEtOI/xMn2BKsj1DFPoObpa8AQHJSxobBpageltm6ABLw= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Raghu.Vatsavayi@cavium.com; Received: from localhost.caveonetworks.com (50.233.148.156) by BN4PR07MB2132.namprd07.prod.outlook.com (10.164.63.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.549.15; Wed, 3 Aug 2016 18:56:50 +0000 From: Raghu Vatsavayi To: CC: , Raghu Vatsavayi , Derek Chickles , Satanand Burla , Felix Manlunas , Raghu Vatsavayi Subject: [PATCH net-next 15/18] liquidio support for new device cn23xx Date: Wed, 3 Aug 2016 11:55:46 -0700 Message-ID: <1470250549-10993-16-git-send-email-rvatsavayi@caviumnetworks.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1470250549-10993-1-git-send-email-rvatsavayi@caviumnetworks.com> References: <1470250549-10993-1-git-send-email-rvatsavayi@caviumnetworks.com> MIME-Version: 1.0 X-Originating-IP: [50.233.148.156] X-ClientProxiedBy: CO2PR11CA0020.namprd11.prod.outlook.com (10.141.242.158) To BN4PR07MB2132.namprd07.prod.outlook.com (10.164.63.14) X-MS-Office365-Filtering-Correlation-Id: d3bd8241-2d34-420b-db64-08d3bbcfedd5 X-Microsoft-Exchange-Diagnostics: 1; BN4PR07MB2132; 2:0Ul+7F4ZeHh4KUkT2j1ufMJnvi7fr7BEU8kGJq892mtGl7XGHjBGvewnZ4uTmCnTZIIpAHWOqNc25g5yZvup50woNw0PPNnnDRpTZUar9mNPIx84LQ5x9sNog3kthYKDlBZLjN4e3CPLGtTNStf+kruBh0sUxApzFyZaY4DbjJ4nZEr3h54PVY8xcJK9dfIi; 3:GvKpmHK4pCqpiMBKRwnC9TAJTUoW3qqRlhGp9SqZDsSDkyhPk32kPeq59luod4nUXzp+Yy7RU5YI7OsX0WskDEqFyPHBxibyDQoxxCDzhcaN3GEk4U3FdUmDX83l3sUA; 25:sIBa9wgh6bwhy2G407ymRihNmP7/R9tEhNzvjlED73TWRhobM6enwSqcXJGDpuJXDPhbFISDP9sW30tPzM63eG+JWLgS9VjQUFRO55dFwJsK2FwX+GMML1RofN8ERPwxhwCkgD6ObEm6aTZvzZ1E4gom6Qpqzof4Dtq6BcqqmoyBjVPf+YSirupowPiRaAvSs6Rjw97DWgaidPaTGpDPQxDYHKFIdQ7jXaQAVQYugG6XkLJXDeAYyYGieqI22H6QN7jpIEj3yfUVaNsJ9o6cCKohMzOfGqpUkHtw3znGEbSh4Yx8x4MqA11rt0IW5TugDL3gRMSFmgueVMDpw+vlmp7FSFfHSo7qQROMskJmypc96XH7qyQ3Rg7c18maHe8HMTFmrnWckqar1lnv8mKfpt+NrJgTId8JumQSK/1WbbM= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN4PR07MB2132; X-Microsoft-Exchange-Diagnostics: 1; BN4PR07MB2132; 31:lopQvJrHLB5Yf1zzdUw++z1oZg7wwk4iJAERg5G6sQi5LwD6nDMX8Zy0Bl/ywPoS/vabcyRb2KoMk++WUMraKOCymX4YS7b1cDvC6LqNkdzWE7pVa1TLCwzqDReIYnLXwzEG78hxgEk9YLd+WevnxjLWPEfRovgkTf7XuXYeG9yqSuGB76JXnbxlQISq6M48yDrFcydQll5jCf4VmmVEjW71JMUf7w0H8Z8TgSRp7tw=; 20:yrChZd1eNceAUYnnzAW5ewPt8Q3gmxCYD5P3pvQ1fuIye69YD0mwNd9MQmIze5ln/52SkRW6FUD6CLihFXS5oqqjES7bzkgF+kuWzAwOXGa1SKZccy14Q7YsRv751x9CIPPaP+3NTfsvBf1WrMmDbVZlZnIF3g3QwiuXcTFQfGQ925qbx3AoXBRCdsgckB52dWBN7KJH4feiF2Tli+jx50/CSP8SJOGsEMb/7B9X58a/YKRtvq44JrVNuv4bXaig5nyTgeC6dTNMLgpmIjz+C2i3az/rI/ih1aqleW8gootME8CKMvDYlw01M5ZXYqXqKoEFO3TQLD6HEqMODlREIgX3lxMyRBGcvNBxtqy8X6vw4Vd86hr3ue8QedABq4YPM7Zrk9giLYB0ygHlu2K+6uavksgFmVfOKHkGLke5B9QLJSZ4hQLN7ia6SQrJuehs5Eb0dtyOogbu+3/FD/TKwBJpC1hAkjXlvDwjlAQSSno8ImB/RXpIfeys8fTHT5gnUFTyJ88ITNDlOanmFsYq64BN+PP5WSIvXmRXr1uAI7Gi1TwIPRjX/MFydCJJfuxDBwNCGehKhzqp5lpF9ynLuSVjjV6OXdG9t1Fw2KUxFWw= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046); SRVR:BN4PR07MB2132; BCL:0; PCL:0; RULEID:; SRVR:BN4PR07MB2132; X-Microsoft-Exchange-Diagnostics: 1; BN4PR07MB2132; 4:DRoSqFHeDjy5LkdTuvpDDd8+X+DKtuI8wOooNXN5YtzkJ3neOxon1eS/2RkOkHPFv24IFBKMVujfm/rK5uFZvCAZOpDvZbgR17zJ24238zy89P/0dpPl52kCw/BHuaJTAnRe7T/zc9L4QRX1F5kMDk05ulLFxNdeMKodBDgyZ2JX7bdkimLhPcNlmoScaCkF+rJRsnU5voQ47QVg9/7dDd7TPO45WNP23vETqz4hNE/YEXn3dsZ8jPdp7x+XUj6NLk5E3pvvH1otjaIHfgbIDSCOo+SlAulsmwTZWOQzHO+JlHvg1FinLSemh+Oiakj4sKiGUKLcngdKJVD5EBzOYV2AiMw/cZKbG8MkysYN4xeL5okkIqfM9WXBYIObRQc+ X-Forefront-PRVS: 00235A1EEF X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(6069001)(7916002)(189002)(199003)(76176999)(110136002)(50986999)(33646002)(50226002)(229853001)(48376002)(106356001)(107886002)(36756003)(189998001)(105586002)(2351001)(3846002)(50466002)(53416004)(7736002)(305945005)(76506005)(6116002)(77096005)(47776003)(586003)(69596002)(66066001)(2950100001)(19580395003)(7846002)(101416001)(19580405001)(5003940100001)(4326007)(68736007)(81166006)(81156014)(92566002)(8676002)(97736004)(42186005)(4001430100002)(2906002)(4720700001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN4PR07MB2132; H:localhost.caveonetworks.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN4PR07MB2132; 23:9rOf89I3egiRd71ZZFmTkeQs1irtVPsBM/SApUzyW?= =?us-ascii?Q?2I++lmVOlCt8oRwXDtSaetw8G3lxB863GlCOTbfJ27DqmWujtyM42G/Dbl4F?= =?us-ascii?Q?0XE67M3iXRhqzpcv65o4gn77qqRvtyhgxcsBtI+586N93VN7LHzpZlJI+unm?= =?us-ascii?Q?ncDljT3JVbbi3aqxnhEP1m1136aQYrjD6pseV//E7lceI/fZKHqsUkG9H6Q6?= =?us-ascii?Q?WJzajNc+Z7tfe1s70Vr7v9Lcd5R0bbGbMmvVtJSMNCbdNydutabEm4WZTRtO?= =?us-ascii?Q?yPImwXnA5odKdhdAvHrUoQZb9eNm4L2zw0vN2df2810Yvl4kCe+ovjBSdOqO?= =?us-ascii?Q?6wAS5Ii4yKViS2BLCH61ifB7XX4R/rnPCLXoB4usKQ/BWiV+fjq4N4fUHBhM?= =?us-ascii?Q?bj2icF3ltWnv3j2HDxx3r0a9b07SNZZ5RMqb8KD19Y9llFZT+AtCLk3HdquC?= =?us-ascii?Q?H5b6mHEaRqk8Yu7L+RUjNGQzMmAUbAs3IbBmqBL+2vJfVPK6ZhWc2ED4M4kA?= =?us-ascii?Q?5nrH7cAznwFJAtdazp7wbijX6lbsF/R9+B00qPCX8vtCIv7RLDBeWGPlELbr?= =?us-ascii?Q?gXL3l2PGXzjMO2wqHclG+885Sraeso1bxDeJOu1vofUEQi7g3hxXwtJVmTl7?= =?us-ascii?Q?r64P/XL8G1QQ68Pkeb78Ss4kDEzOcESJU3L0pWmg+KC/wGvd31DUv38OfA8k?= =?us-ascii?Q?BlM7Dc8hO63IUY1cI7/bFIHPxsEY5TV+1/sZRoFn9cO1JYVVEs6BwFxXv3/V?= =?us-ascii?Q?HycH5tRSpUo1oEq+4lZhxeIOv9Vrkwbv4iUueIsB06nv6uAsnfgQBzMWP3/w?= =?us-ascii?Q?ILOV8DBh/JZcmhpZi+GFUPMbwvN5H8c2w5SjvIOP71oiFf5j6c9rr34pctZ+?= =?us-ascii?Q?7lHW8HQNWbGR6umpKFhga5KSA6Ae8mCeeyrV9ebL9M/wjFGNv73GZFsr8IB0?= =?us-ascii?Q?1ZbYSoGbH5SJWxhb+zn3gE6DBCFuwP6Dz9T5ze7ke3wuoCgiaGzRRTRtylAQ?= =?us-ascii?Q?L5vQr/3gY3ebfFk4aV6cUi2LGbkb6ucWmX+wSM8WA+wscYR0sJm0/VzUXD+/?= =?us-ascii?Q?DEZcrDMKp3nTebiGl4LM+/8Mqo/8fgQZZPO9Bvm119apuxIEEe1L9agq4Nbv?= =?us-ascii?Q?oV+Zo8via8JCUGWaKXiE66qTtJxWeqjVpx1IRFVdEmgraLXH49wgulDe+KMU?= =?us-ascii?Q?Jm5dLzpIOyxvPF0ah5Rhs+wDa+W534IuyxX?= X-Microsoft-Exchange-Diagnostics: 1; BN4PR07MB2132; 6:0LHoIZBKHIq78yCrPyHQJS+ly7okKfDvCSiQa+v3VOT829kSV13QbEf6hkn7A3ewNvmyqDlYh2dUYiOA4fdTyONkP/FIecua+Y6Iy1KRTFiRslnvnVm1ZiFFPPtTEQt9k3T4Li1wrN+czxjCZsC00gCZ3xuUX5ZSCj37vvH9ty5YeSnV3UgPX+XYQjtOq5EGTOGZMlwHjaVHJF/kgaa9DyehacAIjaK+v1eEWLdIUK6xO/gf7JqI8STiN2H56wCXka8F3OxLYTGUZdHp4BA4PUNbuv6FElPMZGR5VN1/ask=; 5:Q+1yv64J8FYxMj0YMxkwLyC+eDZ1Yzq7C4Uts92zET8rs26aKgHerWVIC9rtlB1wTKNT4s6VNIqIIoTBOcrzEwl6Wi5CvqB1+dAfWmSargcgF6NmiauXO24zsBLCp2l7gDTLwn4tKHg5whTEsbzStQ==; 24:WpFJMYQy84TkQy0i2qZ/Bj7MWmScTcqh/DeT1dldL0fX5qPGRE+jOCzejLr1+JRLmb6colDOkmDUE3LrM38pW7ATVaHu74ELBrp/i3zDYBc=; 7:UMoWswElACFzxjzYdZxhkAIwDPIFR2s7Wkxhz4Z1dsosvvdsQ9SIwjGftW3Js8hWqF19tBX2RJoydm5MwcSBoDImeFr94tFQuvIP/pE64nBFwpH/y71xjUS8tcaHj0lKtQWc/RJQMSaFPp/y/DxrrGBebeRaWk4c10N8ag1ZLbIz6V5RZJx90ZgmiMbXByeS2rOorljv1FZQ6+CYxo1cZjTfxOj+m9fdY+9JqsNWSIojR5DZcdbcpuN2d8aMrLEF SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Aug 2016 18:56:50.3154 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN4PR07MB2132 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch adds support for LED identification and ethtool based statistics for cn23xx device. Signed-off-by: Derek Chickles Signed-off-by: Satanand Burla Signed-off-by: Felix Manlunas Signed-off-by: Raghu Vatsavayi --- .../ethernet/cavium/liquidio/cn23xx_pf_device.h | 2 + drivers/net/ethernet/cavium/liquidio/lio_core.c | 6 + drivers/net/ethernet/cavium/liquidio/lio_ethtool.c | 379 ++++++++++++++++++++- .../net/ethernet/cavium/liquidio/liquidio_common.h | 5 + 4 files changed, 384 insertions(+), 8 deletions(-) diff --git a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.h b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.h index ec25ea3..fa74caf 100644 --- a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.h +++ b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.h @@ -51,6 +51,8 @@ int setup_cn23xx_octeon_pf_device(struct octeon_device *oct); int validate_cn23xx_pf_config_info(struct octeon_device *oct, struct octeon_config *conf23xx); +u32 cn23xx_pf_get_oq_ticks(struct octeon_device *oct, u32 time_intr_in_us); + void cn23xx_dump_pf_initialized_regs(struct octeon_device *oct); int cn23xx_fw_lock(struct octeon_device *oct); diff --git a/drivers/net/ethernet/cavium/liquidio/lio_core.c b/drivers/net/ethernet/cavium/liquidio/lio_core.c index ad1db3f..2551645 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_core.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_core.c @@ -163,6 +163,12 @@ void liquidio_link_ctrl_cmd_completion(void *nctrl_ptr) case OCTNET_CMD_GPIO_ACCESS: netif_info(lio, probe, lio->netdev, "LED Flashing visual identification\n"); + + break; + + case OCTNET_CMD_ID_ACTIVE: + netif_info(lio, probe, lio->netdev, "LED Flashing visual identification\n"); + break; case OCTNET_CMD_LRO_ENABLE: diff --git a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c index 16a92b9..d05e9b4 100644 --- a/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c +++ b/drivers/net/ethernet/cavium/liquidio/lio_ethtool.c @@ -32,6 +32,7 @@ #include "octeon_network.h" #include "cn66xx_regs.h" #include "cn66xx_device.h" +#include "cn23xx_pf_device.h" static int octnet_get_link_stats(struct net_device *netdev); @@ -75,6 +76,7 @@ enum { #define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0])) #define OCT_ETHTOOL_REGDUMP_LEN 4096 +#define OCT_ETHTOOL_REGDUMP_LEN_23XX (4096 * 11) #define OCT_ETHTOOL_REGSVER 1 /* statistics of PF */ @@ -259,6 +261,13 @@ lio_ethtool_get_channels(struct net_device *dev, max_tx = CFG_GET_IQ_MAX_Q(conf6x); rx_count = CFG_GET_NUM_RXQS_NIC_IF(conf6x, lio->ifidx); tx_count = CFG_GET_NUM_TXQS_NIC_IF(conf6x, lio->ifidx); + } else if (OCTEON_CN23XX_PF(oct)) { + struct octeon_config *conf23 = CHIP_FIELD(oct, cn23xx_pf, conf); + + max_rx = CFG_GET_OQ_MAX_Q(conf23); + max_tx = CFG_GET_IQ_MAX_Q(conf23); + rx_count = CFG_GET_NUM_RXQS_NIC_IF(conf23, lio->ifidx); + tx_count = CFG_GET_NUM_TXQS_NIC_IF(conf23, lio->ifidx); } channel->max_rx = max_rx; @@ -332,6 +341,32 @@ static int octnet_gpio_access(struct net_device *netdev, int addr, int val) return 0; } +static int octnet_id_active(struct net_device *netdev, int val) +{ + struct lio *lio = GET_LIO(netdev); + struct octeon_device *oct = lio->oct_dev; + struct octnic_ctrl_pkt nctrl; + int ret = 0; + + memset(&nctrl, 0, sizeof(struct octnic_ctrl_pkt)); + + nctrl.ncmd.u64 = 0; + nctrl.ncmd.s.cmd = OCTNET_CMD_ID_ACTIVE; + nctrl.ncmd.s.param1 = val; + nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; + nctrl.wait_time = 100; + nctrl.netpndev = (u64)netdev; + nctrl.cb_fn = liquidio_link_ctrl_cmd_completion; + + ret = octnet_send_nic_ctrl_pkt(lio->oct_dev, &nctrl); + if (ret < 0) { + dev_err(&oct->pci_dev->dev, "Failed to configure gpio value\n"); + return -EINVAL; + } + + return 0; +} + /* Callback for when mdio command response arrives */ static void octnet_mdio_resp_callback(struct octeon_device *oct, @@ -475,6 +510,11 @@ static int lio_set_phys_id(struct net_device *netdev, &value); if (ret) return ret; + } else if (oct->chip_id == OCTEON_CN23XX_PF_VID) { + octnet_id_active(netdev, LED_IDENTIFICATION_ON); + + /* returns 0 since updates are asynchronous */ + return 0; } else { return -EINVAL; } @@ -520,7 +560,10 @@ static int lio_set_phys_id(struct net_device *netdev, &lio->phy_beacon_val); if (ret) return ret; + } else if (oct->chip_id == OCTEON_CN23XX_PF_VID) { + octnet_id_active(netdev, LED_IDENTIFICATION_OFF); + return 0; } else { return -EINVAL; } @@ -549,6 +592,13 @@ lio_ethtool_get_ringparam(struct net_device *netdev, rx_max_pending = CN6XXX_MAX_OQ_DESCRIPTORS; rx_pending = CFG_GET_NUM_RX_DESCS_NIC_IF(conf6x, lio->ifidx); tx_pending = CFG_GET_NUM_TX_DESCS_NIC_IF(conf6x, lio->ifidx); + } else if (OCTEON_CN23XX_PF(oct)) { + struct octeon_config *conf23 = CHIP_FIELD(oct, cn23xx_pf, conf); + + tx_max_pending = CN23XX_MAX_IQ_DESCRIPTORS; + rx_max_pending = CN23XX_MAX_OQ_DESCRIPTORS; + rx_pending = CFG_GET_NUM_RX_DESCS_NIC_IF(conf23, lio->ifidx); + tx_pending = CFG_GET_NUM_TX_DESCS_NIC_IF(conf23, lio->ifidx); } if (lio->mtu > OCTNET_DEFAULT_FRM_SIZE - OCTNET_FRM_HEADER_SIZE) { @@ -947,6 +997,16 @@ static int lio_get_intr_coalesce(struct net_device *netdev, intrmod_cfg = &oct->intrmod; switch (oct->chip_id) { + case OCTEON_CN23XX_PF_VID: + if (!intrmod_cfg->rx_enable) { + intr_coal->rx_coalesce_usecs = intrmod_cfg->rx_usecs; + intr_coal->rx_max_coalesced_frames = + intrmod_cfg->rx_frames; + } + if (!intrmod_cfg->tx_enable) + intr_coal->tx_max_coalesced_frames = + intrmod_cfg->tx_frames; + break; case OCTEON_CN68XX: case OCTEON_CN66XX: { struct octeon_cn6xxx *cn6xxx = @@ -982,7 +1042,15 @@ static int lio_get_intr_coalesce(struct net_device *netdev, intr_coal->rx_coalesce_usecs_low = intrmod_cfg->rx_mintmr_trigger; intr_coal->rx_max_coalesced_frames_low = - intrmod_cfg->rx_mincnt_trigger; + intrmod_cfg->rx_mincnt_trigger; + } + if (OCTEON_CN23XX_PF(oct) && + (intrmod_cfg->tx_enable)) { + intr_coal->use_adaptive_tx_coalesce = intrmod_cfg->tx_enable; + intr_coal->tx_max_coalesced_frames_high = + intrmod_cfg->tx_maxcnt_trigger; + intr_coal->tx_max_coalesced_frames_low = + intrmod_cfg->tx_mincnt_trigger; } return 0; } @@ -1059,11 +1127,11 @@ static void octnet_nic_stats_callback(struct octeon_device *oct_dev, u32 status, void *ptr) { - struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr; - struct oct_nic_stats_resp *resp = (struct oct_nic_stats_resp *) - sc->virtrptr; - struct oct_nic_stats_ctrl *ctrl = (struct oct_nic_stats_ctrl *) - sc->ctxptr; + struct octeon_soft_command *sc = (struct octeon_soft_command *)ptr; + struct oct_nic_stats_resp *resp = + (struct oct_nic_stats_resp *)sc->virtrptr; + struct oct_nic_stats_ctrl *ctrl = + (struct oct_nic_stats_ctrl *)sc->ctxptr; struct nic_rx_stats *rsp_rstats = &resp->stats.fromwire; struct nic_tx_stats *rsp_tstats = &resp->stats.fromhost; @@ -1313,6 +1381,27 @@ oct_cfg_rx_intrcnt(struct lio *lio, struct ethtool_coalesce *intr_coal) CFG_SET_OQ_INTR_PKT(cn6xxx->conf, rx_max_coalesced_frames); break; } + case OCTEON_CN23XX_PF_VID: { + int q_no; + + if (!intr_coal->rx_max_coalesced_frames) + rx_max_coalesced_frames = oct->intrmod.rx_frames; + else + rx_max_coalesced_frames = + intr_coal->rx_max_coalesced_frames; + for (q_no = 0; q_no < oct->num_oqs; q_no++) { + q_no += oct->sriov_info.pf_srn; + octeon_write_csr64( + oct, CN23XX_SLI_OQ_PKT_INT_LEVELS(q_no), + (octeon_read_csr64( + oct, CN23XX_SLI_OQ_PKT_INT_LEVELS(q_no)) & + (0x3fffff00000000UL)) | + rx_max_coalesced_frames); + /*consider setting resend bit*/ + } + oct->intrmod.rx_frames = rx_max_coalesced_frames; + break; + } default: return -EINVAL; } @@ -1345,6 +1434,27 @@ static int oct_cfg_rx_intrtime(struct lio *lio, CFG_SET_OQ_INTR_TIME(cn6xxx->conf, rx_coalesce_usecs); break; } + case OCTEON_CN23XX_PF_VID: { + u64 time_threshold; + int q_no; + + if (!intr_coal->rx_coalesce_usecs) + rx_coalesce_usecs = oct->intrmod.rx_usecs; + else + rx_coalesce_usecs = intr_coal->rx_coalesce_usecs; + time_threshold = + cn23xx_pf_get_oq_ticks(oct, (u32)rx_coalesce_usecs); + for (q_no = 0; q_no < oct->num_oqs; q_no++) { + q_no += oct->sriov_info.pf_srn; + octeon_write_csr64(oct, + CN23XX_SLI_OQ_PKT_INT_LEVELS(q_no), + (oct->intrmod.rx_frames | + ((u64)time_threshold << 32))); + /*consider writing to resend bit here*/ + } + oct->intrmod.rx_usecs = rx_coalesce_usecs; + break; + } default: return -EINVAL; } @@ -1357,12 +1467,37 @@ oct_cfg_tx_intrcnt(struct lio *lio, struct ethtool_coalesce *intr_coal __attribute__((unused))) { struct octeon_device *oct = lio->oct_dev; + u32 iq_intr_pkt; + void __iomem *inst_cnt_reg; + u64 val; /* Config Cnt based interrupt values */ switch (oct->chip_id) { case OCTEON_CN68XX: case OCTEON_CN66XX: break; + case OCTEON_CN23XX_PF_VID: { + int q_no; + + if (!intr_coal->tx_max_coalesced_frames) + iq_intr_pkt = CN23XX_DEF_IQ_INTR_THRESHOLD & + CN23XX_PKT_IN_DONE_WMARK_MASK; + else + iq_intr_pkt = intr_coal->tx_max_coalesced_frames & + CN23XX_PKT_IN_DONE_WMARK_MASK; + for (q_no = 0; q_no < oct->num_iqs; q_no++) { + inst_cnt_reg = (oct->instr_queue[q_no])->inst_cnt_reg; + val = readq(inst_cnt_reg); + /*clear wmark and count.dont want to write count back*/ + val = (val & 0xFFFF000000000000ULL) | + ((u64)iq_intr_pkt + << CN23XX_PKT_IN_DONE_WMARK_BIT_POS); + writeq(val, inst_cnt_reg); + /*consider setting resend bit*/ + } + oct->intrmod.tx_frames = iq_intr_pkt; + break; + } default: return -EINVAL; } @@ -1398,6 +1533,8 @@ static int lio_set_intr_coalesce(struct net_device *netdev, return -EINVAL; } break; + case OCTEON_CN23XX_PF_VID: + break; default: return -EINVAL; } @@ -1540,9 +1677,231 @@ static int lio_nway_reset(struct net_device *netdev) } /* Return register dump len. */ -static int lio_get_regs_len(struct net_device *dev __attribute__((unused))) +static int lio_get_regs_len(struct net_device *dev) +{ + struct lio *lio = GET_LIO(dev); + struct octeon_device *oct = lio->oct_dev; + + switch (oct->chip_id) { + case OCTEON_CN23XX_PF_VID: + return OCT_ETHTOOL_REGDUMP_LEN_23XX; + default: + return OCT_ETHTOOL_REGDUMP_LEN; + } +} + +static int cn23xx_read_csr_reg(char *s, struct octeon_device *oct) { - return OCT_ETHTOOL_REGDUMP_LEN; + u32 reg; + u8 pf_num = oct->pf_num; + int len = 0; + int i; + + /* PCI Window Registers */ + + len += sprintf(s + len, "\n\t Octeon CSR Registers\n\n"); + + /*0x29030 or 0x29040*/ + reg = CN23XX_SLI_PKT_MAC_RINFO64(oct->pcie_port, oct->pf_num); + len += sprintf(s + len, "\n[%08x] (SLI_PKT_MAC%d_PF%d_RINFO): %016lx\n", + reg, oct->pcie_port, oct->pf_num, + octeon_read_csr64(oct, reg)); + + /*0x27080 or 0x27090*/ + reg = CN23XX_SLI_MAC_PF_INT_ENB64(oct->pcie_port, oct->pf_num); + len += + sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_ENB): %016lx\n", reg, + oct->pcie_port, oct->pf_num, octeon_read_csr64(oct, reg)); + + /*0x27000 or 0x27010*/ + reg = CN23XX_SLI_MAC_PF_INT_SUM64(oct->pcie_port, oct->pf_num); + len += + sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_INT_SUM): %016lx\n", reg, + oct->pcie_port, oct->pf_num, octeon_read_csr64(oct, reg)); + + /*0x29120*/ + reg = 0x29120; + len += sprintf(s + len, "\n[%08x] (SLI_PKT_MEM_CTL): %016lx\n", reg, + octeon_read_csr64(oct, reg)); + + /*0x27300*/ + reg = 0x27300 + oct->pcie_port * CN23XX_MAC_INT_OFFSET + + (oct->pf_num) * CN23XX_PF_INT_OFFSET; + len += sprintf( + s + len, "\n[%08x] (SLI_MAC%d_PF%d_PKT_VF_INT): %016lx\n", reg, + oct->pcie_port, oct->pf_num, octeon_read_csr64(oct, reg)); + + /*0x27200*/ + reg = 0x27200 + oct->pcie_port * CN23XX_MAC_INT_OFFSET + + (oct->pf_num) * CN23XX_PF_INT_OFFSET; + len += sprintf(s + len, "\n[%08x] (SLI_MAC%d_PF%d_PP_VF_INT): %016lx\n", + reg, oct->pcie_port, oct->pf_num, + octeon_read_csr64(oct, reg)); + + /*29130*/ + reg = CN23XX_SLI_PKT_CNT_INT; + len += sprintf(s + len, "\n[%08x] (SLI_PKT_CNT_INT): %016lx\n", reg, + octeon_read_csr64(oct, reg)); + + /*0x29140*/ + reg = CN23XX_SLI_PKT_TIME_INT; + len += sprintf(s + len, "\n[%08x] (SLI_PKT_TIME_INT): %016lx\n", reg, + octeon_read_csr64(oct, reg)); + + /*0x29160*/ + reg = 0x29160; + len += sprintf(s + len, "\n[%08x] (SLI_PKT_INT): %016lx\n", reg, + octeon_read_csr64(oct, reg)); + + /*0x29180*/ + reg = CN23XX_SLI_OQ_WMARK; + len += sprintf(s + len, "\n[%08x] (SLI_PKT_OUTPUT_WMARK): %016lx\n", + reg, octeon_read_csr64(oct, reg)); + + /*0x291E0*/ + reg = CN23XX_SLI_PKT_IOQ_RING_RST; + len += sprintf(s + len, "\n[%08x] (SLI_PKT_RING_RST): %016lx\n", reg, + octeon_read_csr64(oct, reg)); + + /*0x29210*/ + reg = CN23XX_SLI_GBL_CONTROL; + len += sprintf(s + len, "\n[%08x] (SLI_PKT_GBL_CONTROL): %016lx\n", reg, + octeon_read_csr64(oct, reg)); + + /*0x29220*/ + reg = 0x29220; + len += sprintf(s + len, "\n[%08x] (SLI_PKT_BIST_STATUS): %016lx\n", reg, + octeon_read_csr64(oct, reg)); + + /*PF only*/ + if (pf_num == 0) { + /*0x29260*/ + reg = CN23XX_SLI_OUT_BP_EN_W1S; + len += sprintf(s + len, + "\n[%08x] (SLI_PKT_OUT_BP_EN_W1S): %016lx\n", + reg, octeon_read_csr64(oct, reg)); + } else if (pf_num == 1) { + /*0x29270*/ + reg = CN23XX_SLI_OUT_BP_EN2_W1S; + len += sprintf(s + len, + "\n[%08x] (SLI_PKT_OUT_BP_EN2_W1S): %016lx\n", + reg, octeon_read_csr64(oct, reg)); + } + + for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) { + reg = CN23XX_SLI_OQ_BUFF_INFO_SIZE(i); + len += + sprintf(s + len, "\n[%08x] (SLI_PKT%d_OUT_SIZE): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x10040*/ + for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) { + reg = CN23XX_SLI_IQ_INSTR_COUNT64(i); + len += sprintf(s + len, + "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x10080*/ + for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) { + reg = CN23XX_SLI_OQ_PKTS_CREDIT(i); + len += sprintf( + s + len, "\n[%08x] (SLI_PKT%d_SLIST_BAOFF_DBELL): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x10090*/ + for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) { + reg = CN23XX_SLI_OQ_SIZE(i); + len += sprintf( + s + len, "\n[%08x] (SLI_PKT%d_SLIST_FIFO_RSIZE): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x10050*/ + for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) { + reg = CN23XX_SLI_OQ_PKT_CONTROL(i); + len += sprintf(s + len, + "\n[%08x] (SLI_PKT%d__OUTPUT_CONTROL): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x10070*/ + for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) { + reg = CN23XX_SLI_OQ_BASE_ADDR64(i); + len += sprintf(s + len, + "\n[%08x] (SLI_PKT%d_SLIST_BADDR): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x100a0*/ + for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) { + reg = CN23XX_SLI_OQ_PKT_INT_LEVELS(i); + len += sprintf(s + len, + "\n[%08x] (SLI_PKT%d_INT_LEVELS): %016lx\n", reg, + i, octeon_read_csr64(oct, reg)); + } + + /*0x100b0*/ + for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) { + reg = CN23XX_SLI_OQ_PKTS_SENT(i); + len += sprintf(s + len, "\n[%08x] (SLI_PKT%d_CNTS): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x100c0*/ + for (i = 0; i < CN23XX_MAX_OUTPUT_QUEUES; i++) { + reg = 0x100c0 + i * CN23XX_OQ_OFFSET; + len += sprintf(s + len, + "\n[%08x] (SLI_PKT%d_ERROR_INFO): %016lx\n", reg, + i, octeon_read_csr64(oct, reg)); + + /*0x10000*/ + for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) { + reg = CN23XX_SLI_IQ_PKT_CONTROL64(i); + len += sprintf( + s + len, + "\n[%08x] (SLI_PKT%d_INPUT_CONTROL): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x10010*/ + for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) { + reg = CN23XX_SLI_IQ_BASE_ADDR64(i); + len += sprintf( + s + len, + "\n[%08x] (SLI_PKT%d_INSTR_BADDR): %016lx\n", reg, + i, octeon_read_csr64(oct, reg)); + } + + /*0x10020*/ + for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) { + reg = CN23XX_SLI_IQ_DOORBELL(i); + len += sprintf( + s + len, + "\n[%08x] (SLI_PKT%d_INSTR_BAOFF_DBELL): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x10030*/ + for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) { + reg = CN23XX_SLI_IQ_SIZE(i); + len += sprintf( + s + len, + "\n[%08x] (SLI_PKT%d_INSTR_FIFO_RSIZE): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + /*0x10040*/ + for (i = 0; i < CN23XX_MAX_INPUT_QUEUES; i++) + reg = CN23XX_SLI_IQ_INSTR_COUNT64(i); + len += sprintf(s + len, + "\n[%08x] (SLI_PKT_IN_DONE%d_CNTS): %016lx\n", + reg, i, octeon_read_csr64(oct, reg)); + } + + return len; } static int cn6xxx_read_csr_reg(char *s, struct octeon_device *oct) @@ -1687,6 +2046,10 @@ static void lio_get_regs(struct net_device *dev, regs->version = OCT_ETHTOOL_REGSVER; switch (oct->chip_id) { + case OCTEON_CN23XX_PF_VID: + memset(regbuf, 0, OCT_ETHTOOL_REGDUMP_LEN_23XX); + len += cn23xx_read_csr_reg(regbuf + len, oct); + break; case OCTEON_CN68XX: case OCTEON_CN66XX: memset(regbuf, 0, OCT_ETHTOOL_REGDUMP_LEN); diff --git a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h index 9f328ff..4e33f48 100644 --- a/drivers/net/ethernet/cavium/liquidio/liquidio_common.h +++ b/drivers/net/ethernet/cavium/liquidio/liquidio_common.h @@ -234,6 +234,9 @@ static inline void add_sg_size(struct octeon_sg_entry *sg_entry, #define OCTNET_CMD_ADD_VLAN_FILTER 0x17 #define OCTNET_CMD_DEL_VLAN_FILTER 0x18 #define OCTNET_CMD_VXLAN_PORT_CONFIG 0x19 + +#define OCTNET_CMD_ID_ACTIVE 0x1a + #define OCTNET_CMD_VXLAN_PORT_ADD 0x0 #define OCTNET_CMD_VXLAN_PORT_DEL 0x1 #define OCTNET_CMD_RXCSUM_ENABLE 0x0 @@ -830,6 +833,8 @@ struct oct_link_stats { #define VITESSE_PHY_GPIO_DRIVEOFF 0x4 #define VITESSE_PHY_GPIO_HIGH 0x2 #define VITESSE_PHY_GPIO_LOW 0x3 +#define LED_IDENTIFICATION_ON 0x1 +#define LED_IDENTIFICATION_OFF 0x0 struct oct_mdio_cmd { u64 op;