From patchwork Tue Sep 19 01:29:55 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Mody, Rasesh" X-Patchwork-Id: 28890 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7F0F61B20F; Tue, 19 Sep 2017 03:31:35 +0200 (CEST) Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0082.outbound.protection.outlook.com [104.47.37.82]) by dpdk.org (Postfix) with ESMTP id 0BB841AEEB for ; Tue, 19 Sep 2017 03:31:20 +0200 (CEST) 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=3VsaJ4y2d6ZSVr1VV8Cf1ObQ+auIieRr7iRrhqIpHOI=; b=KWPX7ehMFDzIj+1uDyJUjYSVwNjWDUv2arweC/saGqRlY+2TU0vm9CUc055f8oHQwCN36Mo8RX5NhkR4uirEDGtrBnu11frF4fxcpzZRJq3xmQ+FRhdlV7z1SjdtgqesSfgXL75ergZQg3o27gCzunCfq6zPhFZ9pZaKkSkAFaQ= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Rasesh.Mody@cavium.com; Received: from cavium.com (198.186.0.2) by SN4PR0701MB3838.namprd07.prod.outlook.com (2603:10b6:803:4f::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.56.11; Tue, 19 Sep 2017 01:31:17 +0000 From: Rasesh Mody To: dev@dpdk.org, ferruh.yigit@intel.com Cc: Rasesh Mody , Dept-EngDPDKDev@cavium.com Date: Mon, 18 Sep 2017 18:29:55 -0700 Message-Id: <1505784633-1171-16-git-send-email-rasesh.mody@cavium.com> X-Mailer: git-send-email 1.7.10.3 In-Reply-To: <1505784633-1171-1-git-send-email-rasesh.mody@cavium.com> References: <1505784633-1171-1-git-send-email-rasesh.mody@cavium.com> MIME-Version: 1.0 X-Originating-IP: [198.186.0.2] X-ClientProxiedBy: SN4PR0501CA0015.namprd05.prod.outlook.com (2603:10b6:803:40::28) To SN4PR0701MB3838.namprd07.prod.outlook.com (2603:10b6:803:4f::13) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b279760e-9be6-4d50-7b36-08d4fefe1fb3 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:SN4PR0701MB3838; X-Microsoft-Exchange-Diagnostics: 1; SN4PR0701MB3838; 3:xBY7Lb5t6g/9UYTDToYbJ8IA9/cf9w3MWdyGYVPHE/GNXXtOCgaGraOi5a/5Lf1aqv60RYgfSYIMw0+AtTcZZBeJ8ThA4oAP2bcFoG4SWxNgttlpmUmqapUisw3dm19P2QXAoZwCAp1Ly3zZ5pszr0+z0aa/6v4cDHslUL/yZYvB7NX2TXgnUIalbqFtsM8P5eeFDAFcgy0yCZvamxB0/NrV6PKyH0QjTulCOHEyfeWEKJBzAVRwmvh8A4PeHeJz; 25:kDG5wEAgjjHuniQcDw1GuyROnEXBXA/BJy3nSd2qNCA/UOP+ZFr22SSO7eQVqgu2ylAJNHWIp7iWM1Y54Vm8qu+wJSZUEvZbkzq9yuzLMY6DtpsMXVLkcuSGSaahu1aXFJ6J/g9aT1cGKpc4phYDJLlzAQQ29G7XzAOoXg27Cyj8WrzNXEQo8QqaASUkQjmbVcG2iB1c32Y+zVDvLgLgbccgJp0a0nTXDbkgqDJDg1c5ok2ziyXoCnGxom4/hgEha/Hvzo0CwtKtsOYPoKMjRhmp2dkEXBLa8FHr1+0NC07a0/PovIYC3cX3aDFVhz/uZMlGytyx/wSDF2SQq8H+IQ==; 31:hPCM5dApVWelIJAtGoqiULbv+SJfkXNEE/sPes+OhMFiRvzwThgNwF+4CzphBQvgEcJySKJXQV2+GwPQrFMf6QJDTZ1Ea8riusFEA+rkIXCSKiFxchibel57dx8wvAC1lyWptP81jBrcrRhrk/7BPUDPs50jB4RB/bnI83iMIUNx5b6gHC6352921RrHDOSx8OG0viDxJ9IVszhtxI0kOiqAHiUxzZgPQcX22IxxDDc= X-MS-TrafficTypeDiagnostic: SN4PR0701MB3838: X-Microsoft-Exchange-Diagnostics: 1; SN4PR0701MB3838; 20:+j+KHcXvcxx347/f29k5LjMloHN4Nna0GP02EJ36qccMXP5bW4OWVRahLFe0FrCkOFVTNqcxO+EGnP1JS7olrj06xnN+1XXFouh+bA8/2KjyvcMBnJ4iLdmAjEjuMe6y0K1yrf+70XetyHeDCoPMPbUSWQZ8mDfwFFP2gdzGTwIFtmJU1QTVKDM+1Wk5Ha/OaloI2lAQYCu1BkkOFPXXWIOEk5J+8kTP37iB6MrHqQidQneuxLUJPcq+rfqmDbS3Bny1dhLLLu4Bq+ZlafzcZcu0r63XpHoJx5O2PnS3oU/YKiQ2/FrNdA9RZ4+qWNu4tajLYQ9cPVvWkXDiOYMIKF79NdCqLjDKqq6ZtfJka1FVC69U1+48cK9EGqxZl6I0q1+8uaH6uWW5tRbDXm/zm1YjjWBuax5pCJ24t5oMAkb9Vn0yCNgJiiGvlj0ZN8INbsPWiFZ6Dh2nSSHLCFARsjyvctK3k64oN4UuUOeo5OxbQi/sX6tQkHn+aUWAfctj; 4:D700cKPBzRrJ8zea2Pi0b7JVIGDAn0Ya9L801o6Fhmm0GA0iD8Dc0kjKyvZfvs/pRhfGASj8h4ECeQ3Yz9JDkKrJ+MxEsA3EhC1QzstJ5QsQIYvY6RWx34GHFqfRmBInYykUFpZCVd2dMOzLMmVF6tWHsgVsXPpSq/U+GJ4UTnPMMbV4O2uhvZZYkefP6LULAvJS9fvYPFnx+5Bb7YQdhV/J1n87lra2b7gF78+dtOT4pTktquubjof0rYhSvnnZ X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(3002001)(6041248)(20161123555025)(20161123562025)(20161123558100)(20161123560025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:SN4PR0701MB3838; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:SN4PR0701MB3838; X-Forefront-PRVS: 04359FAD81 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(376002)(346002)(199003)(189002)(48376002)(33646002)(68736007)(316002)(21086003)(16526017)(16586007)(72206003)(36756003)(478600001)(97736004)(86362001)(66066001)(25786009)(69596002)(47776003)(50986999)(81166006)(8936002)(50226002)(8676002)(5660300001)(7736002)(53936002)(305945005)(81156014)(55016002)(50466002)(76176999)(6116002)(3846002)(2950100002)(101416001)(4326008)(4720700003)(2906002)(107886003)(6666003)(189998001)(106356001)(5003940100001)(105586002); DIR:OUT; SFP:1101; SCL:1; SRVR:SN4PR0701MB3838; H:cavium.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX: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; SN4PR0701MB3838; 23:nGhPqBPcfaRkq1qQyaYiQxCLxvrukDBIXaHkMhZ?= 1F1asyxoSElrdUAX1YmEmv7a0zU4ggosWGDDargWEvBnSElT+LZNkuTCC9QqxcUmGZDM2oV98GYxzUwe9vUfUmreZLTe8E9wO/Xd9TwqqbhQUNVZm0zgLVGvXa2eE5gfiMfdUpOSarZ3TIygnHxIHGNhPfeikZrPxefmuy6fs3SQ3+byAGY9E5uByK2PZWAAlF63BLAi9jd3h32FbE1r+1ZSiQAYr/hZRSpsonfMPyiKiJHY2EeOIlFgIFF6yzsTYPrLEIAT5KWt5nhvFZ1/BdmHEdLEOZ8bwXjnRJo/x5T4ojYNdwuBg4rFvrsr7FCgNxGpNesnhlZgtfL5y+cpKwXlB2fKy/v+h1/fbtteTpQOwMjY5JgGtLEENiILPL5Vz6DD8RQR4u2kMAzJE2VkuCqVvUJx3Uyw7RiJ1rf6ilLozuK9an/c5hU1JABjpy8FngzP0gTQJPFJzdbXU7AVOydl9rQTNQUBePXj/m2g/B94ccUfTCFjQcY+o7utijje0C5/U25dwGg4u4P/VIchPax6Q/1Ey68LMZ0L9z2CA4osBaHa/HCIGJvygiygEs19JXAB8/baCWiLGVZMeA3JpSWyjobjr3SC3Y0hrvJ0CzA+KVLiiCqQagsO4d2Z+q1vGSorEOJ37HjiPXZglg2+7JPye1+TLmEXhLD0xv8uD3UJClodu0iE+Yp6Tr93tiUKhH9XIyWHlt7Vd5hKElTNnpzw0aakJndbKKNrq5sgJBeMkzBPYxG/VWdRuSL+nG2oc5L3cP61sUapZ3aarY7u2+o7zKoJXsG2ApXNi4LKdRMkHG4i+6DS/KryOlFKAS33qCLELHtdQNixsvG0TKRmNwuKbWy1FI2CJn8zTeVs7xnRxkz0S9jV9Rh/3agqQ4VdMKKW4OlgI2iATIa3w9faZKalmpOZctBS32mYyIGzGLy+2FxChu7wETCamVr7dlMJ1vhCVLcPBY12x0eSFEZU0qj/H/MO5RTldxhvTmFqFwiZJA3Kk26/buahZzTvR/NrSRYD1GXev+fTMxTtqUO79MF1g9uHLQIccZ7qv4ofNNsms7o11XMeRUiVx2dyzkgbAU3Y= X-Microsoft-Exchange-Diagnostics: 1; SN4PR0701MB3838; 6:2EWV4aKCicbImUaRS2SiUZIkWhoZdiGsitOobVBkt84wJlouomT0UFLr7l1cru+DZMheG68pPbz8t00X7AW+0pPdrl2vuuZp7oSNeSRVZk+indRVvo9kJluR0KhsKImc1rNxM0GuOVfF2KrgzoIxI5WoTY6anjpoqlYIJWLaSoi5T0UsOM5kEbIfB1YVoUfV7Ei0gvMtKtxPQ7dVI8ZBcBKt1q6kzUo3Mi7QK/qyBL5h3S/QG9hpYHqS20Ur87JdIfLApvuS7k5j1zQv2ojJC2GhXg6m9G0+obVzph+c/jSGj2UMxsazeSLL+OP2Axm87ldq61OF+2e+DaN2e/xBVA==; 5:hdXhO9JEWxJrximjTHbRhG6+aFftg4cmZD7mEkoFQypFxJ9Yw1Ft0bPUIy/X0X1TvKFuCMq7TZXaSFEmGUdD2OfZ78a90UeS4a8t9sKOnf2KIvD2quBbROFBzwqJ6mnfhaSM9mWAp8t7mBWfl18HHA==; 24:JoYS1UazCqKQnoHfjQEL407oqTvMRW2XDQzCHmYXuvYOF/dLiBbKaAa4czW+vVUZTsIGPkdOcp5iRtUs9urfyyxw2hBSFfzkkIGn7eqHafk=; 7:tEwk1iaiZnK4Fq+cGPfNb0T+F6Sravc7K4X+/1hQwup665Kx6E52dESRh8pKqSpexzM5RHZ7bkwovyHDxD4rztY35dsAYmpi3ZABOdY6uzKqXv4imHMeRsdKC8Fc/mrIo8/JBKnTyL3xfyDrSdOpM8a2bfXRsMCPuOeX6crandahSZ6DKr3MK6ttrNiKBqzL08hvx1/odX2UWbR5Q/EpFt/NGhBOOz12Q48dSz3RKQs= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Sep 2017 01:31:17.0430 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN4PR0701MB3838 Subject: [dpdk-dev] [PATCH 15/53] net/qede/base: add EEE support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" - Base driver EEE (Energy efficient ethernet) support. - Provide supported-speed mask to driver though shared memory. - Read/use eee-supported capabilities value from the shared memory. - Update qed_fill_link() to advertise the EEE capabilities. Signed-off-by: Rasesh Mody --- drivers/net/qede/base/ecore_dev.c | 59 +++++++++++++++++++++++++++++++-- drivers/net/qede/base/ecore_mcp.c | 50 +++++++++++++++++++++++++++- drivers/net/qede/base/ecore_mcp_api.h | 25 ++++++++++++++ drivers/net/qede/base/mcp_public.h | 6 ++++ drivers/net/qede/qede_if.h | 8 +++++ drivers/net/qede/qede_main.c | 19 +++++++++++ 6 files changed, 164 insertions(+), 3 deletions(-) diff --git a/drivers/net/qede/base/ecore_dev.c b/drivers/net/qede/base/ecore_dev.c index 93c2306..5c37e1c 100644 --- a/drivers/net/qede/base/ecore_dev.c +++ b/drivers/net/qede/base/ecore_dev.c @@ -3108,10 +3108,42 @@ static enum _ecore_status_t ecore_hw_get_resc(struct ecore_hwfn *p_hwfn, NVM_CFG1_PORT_DRV_FLOW_CONTROL_TX); link->loopback_mode = 0; + if (p_hwfn->mcp_info->capabilities & FW_MB_PARAM_FEATURE_SUPPORT_EEE) { + link_temp = ecore_rd(p_hwfn, p_ptt, port_cfg_addr + + OFFSETOF(struct nvm_cfg1_port, ext_phy)); + link_temp &= NVM_CFG1_PORT_EEE_POWER_SAVING_MODE_MASK; + link_temp >>= NVM_CFG1_PORT_EEE_POWER_SAVING_MODE_OFFSET; + p_caps->default_eee = ECORE_MCP_EEE_ENABLED; + link->eee.enable = true; + switch (link_temp) { + case NVM_CFG1_PORT_EEE_POWER_SAVING_MODE_DISABLED: + p_caps->default_eee = ECORE_MCP_EEE_DISABLED; + link->eee.enable = false; + break; + case NVM_CFG1_PORT_EEE_POWER_SAVING_MODE_BALANCED: + p_caps->eee_lpi_timer = EEE_TX_TIMER_USEC_BALANCED_TIME; + break; + case NVM_CFG1_PORT_EEE_POWER_SAVING_MODE_AGGRESSIVE: + p_caps->eee_lpi_timer = + EEE_TX_TIMER_USEC_AGGRESSIVE_TIME; + break; + case NVM_CFG1_PORT_EEE_POWER_SAVING_MODE_LOW_LATENCY: + p_caps->eee_lpi_timer = EEE_TX_TIMER_USEC_LATENCY_TIME; + break; + } + + link->eee.tx_lpi_timer = p_caps->eee_lpi_timer; + link->eee.tx_lpi_enable = link->eee.enable; + link->eee.adv_caps = ECORE_EEE_1G_ADV | ECORE_EEE_10G_ADV; + } else { + p_caps->default_eee = ECORE_MCP_EEE_UNSUPPORTED; + } + DP_VERBOSE(p_hwfn, ECORE_MSG_LINK, - "Read default link: Speed 0x%08x, Adv. Speed 0x%08x, AN: 0x%02x, PAUSE AN: 0x%02x\n", + "Read default link: Speed 0x%08x, Adv. Speed 0x%08x, AN: 0x%02x, PAUSE AN: 0x%02x\n EEE: %02x [%08x usec]", link->speed.forced_speed, link->speed.advertised_speeds, - link->speed.autoneg, link->pause.autoneg); + link->speed.autoneg, link->pause.autoneg, + p_caps->default_eee, p_caps->eee_lpi_timer); /* Read Multi-function information from shmem */ addr = MCP_REG_SCRATCH + nvm_cfg1_offset + @@ -3317,6 +3349,27 @@ static void ecore_hw_info_port_num(struct ecore_hwfn *p_hwfn, ecore_hw_info_port_num_ah_e5(p_hwfn, p_ptt); } +static void ecore_mcp_get_eee_caps(struct ecore_hwfn *p_hwfn, + struct ecore_ptt *p_ptt) +{ + struct ecore_mcp_link_capabilities *p_caps; + u32 eee_status; + + p_caps = &p_hwfn->mcp_info->link_capabilities; + if (p_caps->default_eee == ECORE_MCP_EEE_UNSUPPORTED) + return; + + p_caps->eee_speed_caps = 0; + eee_status = ecore_rd(p_hwfn, p_ptt, p_hwfn->mcp_info->port_addr + + OFFSETOF(struct public_port, eee_status)); + eee_status = (eee_status & EEE_SUPPORTED_SPEED_MASK) >> + EEE_SUPPORTED_SPEED_OFFSET; + if (eee_status & EEE_1G_SUPPORTED) + p_caps->eee_speed_caps |= ECORE_EEE_1G_ADV; + if (eee_status & EEE_10G_ADV) + p_caps->eee_speed_caps |= ECORE_EEE_10G_ADV; +} + static enum _ecore_status_t ecore_get_hw_info(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, enum ecore_pci_personality personality, @@ -3386,6 +3439,8 @@ static void ecore_hw_info_port_num(struct ecore_hwfn *p_hwfn, p_hwfn->mcp_info->func_info.ovlan; ecore_mcp_cmd_port_init(p_hwfn, p_ptt); + + ecore_mcp_get_eee_caps(p_hwfn, p_ptt); } if (personality != ECORE_PCI_DEFAULT) { diff --git a/drivers/net/qede/base/ecore_mcp.c b/drivers/net/qede/base/ecore_mcp.c index 462fcc9..3be23ba 100644 --- a/drivers/net/qede/base/ecore_mcp.c +++ b/drivers/net/qede/base/ecore_mcp.c @@ -1036,6 +1036,29 @@ static void ecore_mcp_handle_transceiver_change(struct ecore_hwfn *p_hwfn, DP_NOTICE(p_hwfn, false, "Transceiver is unplugged.\n"); } +static void ecore_mcp_read_eee_config(struct ecore_hwfn *p_hwfn, + struct ecore_ptt *p_ptt, + struct ecore_mcp_link_state *p_link) +{ + u32 eee_status, val; + + p_link->eee_adv_caps = 0; + p_link->eee_lp_adv_caps = 0; + eee_status = ecore_rd(p_hwfn, p_ptt, p_hwfn->mcp_info->port_addr + + OFFSETOF(struct public_port, eee_status)); + p_link->eee_active = !!(eee_status & EEE_ACTIVE_BIT); + val = (eee_status & EEE_LD_ADV_STATUS_MASK) >> EEE_LD_ADV_STATUS_SHIFT; + if (val & EEE_1G_ADV) + p_link->eee_adv_caps |= ECORE_EEE_1G_ADV; + if (val & EEE_10G_ADV) + p_link->eee_adv_caps |= ECORE_EEE_10G_ADV; + val = (eee_status & EEE_LP_ADV_STATUS_MASK) >> EEE_LP_ADV_STATUS_SHIFT; + if (val & EEE_1G_ADV) + p_link->eee_lp_adv_caps |= ECORE_EEE_1G_ADV; + if (val & EEE_10G_ADV) + p_link->eee_lp_adv_caps |= ECORE_EEE_10G_ADV; +} + static void ecore_mcp_handle_link_change(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, bool b_reset) @@ -1170,6 +1193,9 @@ static void ecore_mcp_handle_link_change(struct ecore_hwfn *p_hwfn, p_link->sfp_tx_fault = !!(status & LINK_STATUS_SFP_TX_FAULT); + if (p_hwfn->mcp_info->capabilities & FW_MB_PARAM_FEATURE_SUPPORT_EEE) + ecore_mcp_read_eee_config(p_hwfn, p_ptt, p_link); + OSAL_LINK_UPDATE(p_hwfn); } @@ -1197,6 +1223,27 @@ enum _ecore_status_t ecore_mcp_set_link(struct ecore_hwfn *p_hwfn, phy_cfg.pause |= (params->pause.forced_tx) ? ETH_PAUSE_TX : 0; phy_cfg.adv_speed = params->speed.advertised_speeds; phy_cfg.loopback_mode = params->loopback_mode; + + /* There are MFWs that share this capability regardless of whether + * this is feasible or not. And given that at the very least adv_caps + * would be set internally by ecore, we want to make sure LFA would + * still work. + */ + if ((p_hwfn->mcp_info->capabilities & + FW_MB_PARAM_FEATURE_SUPPORT_EEE) && + params->eee.enable) { + phy_cfg.eee_cfg |= EEE_CFG_EEE_ENABLED; + if (params->eee.tx_lpi_enable) + phy_cfg.eee_cfg |= EEE_CFG_TX_LPI; + if (params->eee.adv_caps & ECORE_EEE_1G_ADV) + phy_cfg.eee_cfg |= EEE_CFG_ADV_SPEED_1G; + if (params->eee.adv_caps & ECORE_EEE_10G_ADV) + phy_cfg.eee_cfg |= EEE_CFG_ADV_SPEED_10G; + phy_cfg.eee_cfg |= (params->eee.tx_lpi_timer << + EEE_TX_TIMER_USEC_SHIFT) & + EEE_TX_TIMER_USEC_MASK; + } + p_hwfn->b_drv_link_init = b_up; if (b_up) @@ -3331,7 +3378,8 @@ enum _ecore_status_t ecore_mcp_set_capabilities(struct ecore_hwfn *p_hwfn, { u32 mcp_resp, mcp_param, features; - features = DRV_MB_PARAM_FEATURE_SUPPORT_PORT_SMARTLINQ; + features = DRV_MB_PARAM_FEATURE_SUPPORT_PORT_SMARTLINQ | + DRV_MB_PARAM_FEATURE_SUPPORT_PORT_EEE; return ecore_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_FEATURE_SUPPORT, features, &mcp_resp, &mcp_param); diff --git a/drivers/net/qede/base/ecore_mcp_api.h b/drivers/net/qede/base/ecore_mcp_api.h index 059b55e..a3d6bc1 100644 --- a/drivers/net/qede/base/ecore_mcp_api.h +++ b/drivers/net/qede/base/ecore_mcp_api.h @@ -23,16 +23,37 @@ struct ecore_mcp_link_pause_params { bool forced_tx; }; +enum ecore_mcp_eee_mode { + ECORE_MCP_EEE_DISABLED, + ECORE_MCP_EEE_ENABLED, + ECORE_MCP_EEE_UNSUPPORTED +}; + +struct ecore_link_eee_params { + u32 tx_lpi_timer; +#define ECORE_EEE_1G_ADV (1 << 0) +#define ECORE_EEE_10G_ADV (1 << 1) + /* Capabilities are represented using ECORE_EEE_*_ADV values */ + u8 adv_caps; + u8 lp_adv_caps; + bool enable; + bool tx_lpi_enable; +}; + struct ecore_mcp_link_params { struct ecore_mcp_link_speed_params speed; struct ecore_mcp_link_pause_params pause; u32 loopback_mode; /* in PMM_LOOPBACK values */ + struct ecore_link_eee_params eee; }; struct ecore_mcp_link_capabilities { u32 speed_capabilities; bool default_speed_autoneg; /* In Mb/s */ u32 default_speed; /* In Mb/s */ + enum ecore_mcp_eee_mode default_eee; + u32 eee_lpi_timer; + u8 eee_speed_caps; }; struct ecore_mcp_link_state { @@ -67,6 +88,10 @@ struct ecore_mcp_link_state { u8 partner_adv_pause; bool sfp_tx_fault; + + bool eee_active; + u8 eee_adv_caps; + u8 eee_lp_adv_caps; }; struct ecore_mcp_function_info { diff --git a/drivers/net/qede/base/mcp_public.h b/drivers/net/qede/base/mcp_public.h index f934c17..af6a45e 100644 --- a/drivers/net/qede/base/mcp_public.h +++ b/drivers/net/qede/base/mcp_public.h @@ -792,6 +792,12 @@ struct public_port { #define EEE_LP_ADV_STATUS_MASK 0x00000f00 #define EEE_LP_ADV_STATUS_SHIFT 8 +/* Supported speeds for EEE */ +#define EEE_SUPPORTED_SPEED_MASK 0x0000f000 +#define EEE_SUPPORTED_SPEED_OFFSET 12 + #define EEE_1G_SUPPORTED (1 << 1) + #define EEE_10G_SUPPORTED (1 << 2) + u32 eee_remote; /* Used for EEE in LLDP */ #define EEE_REMOTE_TW_TX_MASK 0x0000ffff #define EEE_REMOTE_TW_TX_SHIFT 0 diff --git a/drivers/net/qede/qede_if.h b/drivers/net/qede/qede_if.h index 42560d5..02af2ee 100644 --- a/drivers/net/qede/qede_if.h +++ b/drivers/net/qede/qede_if.h @@ -83,6 +83,7 @@ struct qed_link_params { #define QED_LINK_OVERRIDE_SPEED_ADV_SPEEDS (1 << 1) #define QED_LINK_OVERRIDE_SPEED_FORCED_SPEED (1 << 2) #define QED_LINK_OVERRIDE_PAUSE_CONFIG (1 << 3) +#define QED_LINK_OVERRIDE_EEE_CONFIG (1 << 5) uint32_t override_flags; bool autoneg; uint32_t adv_speeds; @@ -91,6 +92,7 @@ struct qed_link_params { #define QED_LINK_PAUSE_RX_ENABLE (1 << 1) #define QED_LINK_PAUSE_TX_ENABLE (1 << 2) uint32_t pause_config; + struct ecore_link_eee_params eee; }; struct qed_link_output { @@ -104,6 +106,12 @@ struct qed_link_output { uint8_t port; /* In PORT defs */ bool autoneg; uint32_t pause_config; + + /* EEE - capability & param */ + bool eee_supported; + bool eee_active; + u8 sup_caps; + struct ecore_link_eee_params eee; }; struct qed_slowpath_params { diff --git a/drivers/net/qede/qede_main.c b/drivers/net/qede/qede_main.c index 9be8f80..13b321d 100644 --- a/drivers/net/qede/qede_main.c +++ b/drivers/net/qede/qede_main.c @@ -539,6 +539,21 @@ static void qed_fill_link(struct ecore_hwfn *hwfn, if (params.pause.forced_tx) if_link->pause_config |= QED_LINK_PAUSE_TX_ENABLE; + + if (link_caps.default_eee == ECORE_MCP_EEE_UNSUPPORTED) { + if_link->eee_supported = false; + } else { + if_link->eee_supported = true; + if_link->eee_active = link.eee_active; + if_link->sup_caps = link_caps.eee_speed_caps; + /* MFW clears adv_caps on eee disable; use configured value */ + if_link->eee.adv_caps = link.eee_adv_caps ? link.eee_adv_caps : + params.eee.adv_caps; + if_link->eee.lp_adv_caps = link.eee_lp_adv_caps; + if_link->eee.enable = params.eee.enable; + if_link->eee.tx_lpi_enable = params.eee.tx_lpi_enable; + if_link->eee.tx_lpi_timer = params.eee.tx_lpi_timer; + } } static void @@ -588,6 +603,10 @@ static int qed_set_link(struct ecore_dev *edev, struct qed_link_params *params) link_params->pause.forced_tx = false; } + if (params->override_flags & QED_LINK_OVERRIDE_EEE_CONFIG) + memcpy(&link_params->eee, ¶ms->eee, + sizeof(link_params->eee)); + rc = ecore_mcp_set_link(hwfn, ptt, params->link_up); ecore_ptt_release(hwfn, ptt);