From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM01-BY2-obe.outbound.protection.outlook.com (mail-by2nam01on0051.outbound.protection.outlook.com [104.47.34.51]) by dpdk.org (Postfix) with ESMTP id C6D541B725 for ; Mon, 9 Apr 2018 06:49:11 +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=yJI02nb/LPjQz0Yk6UKlJFcGParf8e94qDceOXMUMes=; b=YBTLo0cHiajd0SG1Be1BMWv/VU068yj19/fhzEH0eYLT5pWCf0o+du64hV3W0iwobrF2xVtb1xDEYRNkK8/LyvzIxMQTuqt1b3PeoIqKwU//MLzCawKjo2TxzOIGVjsWnzfRBhagWRAaFCOTEGyf3CV5RGtoC4CL1JCQq2wM9mQ= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Rasesh.Mody@cavium.com; Received: from cavium.com (198.186.0.2) by MWHPR0701MB3675.namprd07.prod.outlook.com (2603:10b6:301:7e::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.653.12; Mon, 9 Apr 2018 04:49:07 +0000 From: Rasesh Mody To: dev@dpdk.org Cc: Rasesh Mody , ferruh.yigit@intel.com, Dept-EngDPDKDev@cavium.com Date: Sun, 8 Apr 2018 21:48:07 -0700 Message-Id: <1523249290-7444-12-git-send-email-rasesh.mody@cavium.com> X-Mailer: git-send-email 1.7.10.3 In-Reply-To: <1522561624-15817-1-git-send-email-rasesh.mody@cavium.com> References: <1522561624-15817-1-git-send-email-rasesh.mody@cavium.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [198.186.0.2] X-ClientProxiedBy: BYAPR03CA0036.namprd03.prod.outlook.com (2603:10b6:a02:a8::49) To MWHPR0701MB3675.namprd07.prod.outlook.com (2603:10b6:301:7e::15) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 81aa0b6c-eeb7-4cb7-4fde-08d59dd53a94 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:MWHPR0701MB3675; X-Microsoft-Exchange-Diagnostics: 1; MWHPR0701MB3675; 3:oPkqO/BaATxRO+BtnP1rFMuSbMsXo/7D6Q81fixgkhJgL19gJk7HOrc4yocn93hGowVLEWfRLz0SkNHiY+fbYiXIJaP0YXt0zpXazu37Cv0QP2hL2Yfa+/IDeUCrwCcX0T4c2FmGYO8qDh5TOe71kTl/ck40fNDx26zpxCGXyLZs1RqCWfN2md2rfx/qW7fk+Vh9DK63uMP2rBZb0Vj4kOvxRC2wC1k0zEg6lnrW8Pz60nmvkrKZZ9PTJ6iNjKjm; 25:SDzm5Bpmxfb0QSAD+otPjYDPhGv3a3Yrxb+8IWu26JdvYFLqGL4a2+6E0nhoInAYTwa0bytt5Mwd7SET/CUMIjvJ5Tc3bTjQJEixZgBtNJp+e2evYXWptSNdEaJuJsOzkcmEx5H7ngK3QZ2iTS33KaibXDxEWpb6qQoyTgj458DnjCZ+weyvFzQ6JLWAzxJwWFY1oNNMbuWTXKurO8z//rLI3Ek1hkCI2BtmG4Xjo/WWk7ZyS5/YG3Zf28w9Eu2briv676pBroQ5KI5pPrmhkg5kxuCdXlsuE+W0aYV1mOwSa2EeqpV0Mwc00xEJRYDqdlydpXotti3GKL08BTIXSA==; 31:lhfNVFOM8zAIoPD7G1jiPPUzxEYSoZiqUItp5gsEXJFprW+Lg3JZ2MJmyN7kt6B746RQjaqxSTdmI1WfPIzzSX1Qsbv6Uz/FyGHLPHUkicV8iLk8xvQ5eDXkDucM/VG1L0aeuswbm5Ic18gBDOWxtHn6rRpq4mqoGuRRAWITA1iYnSTmyJnxc34nyHTdrN0XKDehXeRshSKzsbWBgaLoaxkCMV0whmoUVhkv6ZBvJlU= X-MS-TrafficTypeDiagnostic: MWHPR0701MB3675: X-Microsoft-Exchange-Diagnostics: 1; MWHPR0701MB3675; 20:cNn3z4Lc9EZ5yMGQT/z6IxwQp36nQCGiayNcMsbeYNxzI9XH1ZBHI7wzyWIYI2rNwMowNLR3ZEk1arNXtnrv7vHfvGawpBd1qs/Vsf6cSER7peG9MmcD+06ZORwThH3puLRRJwpp/obnYH4IDeQMZrq8UWNIQef/dc1kfUzCe8SaTh5nXh4UCWqSHp2xQCKbNR7OCqldOveoT/6i4AT7215aHv2ThFTAwPbZVjtaPZOgyAeCneba4WKH49+6HtRQx6+zWA++sWYBp5Hn4I9ZXiYotf3H7XyoPNcxuEbWzkzCaL5YPaQ2IkBhfDUJ9IogF4MGYDJVuvpmzU8ShscCi+eu85PlTjcY10cXzY+VDuGmg+Ia871YQUjhCzwWZTLovDwHesQXqm7F9yK/CtThXw+Sdh3WmKfIq36Ego/4m7sIdz2KEorx8JLLKII7Zr8c/4djdDDLzab9sv6D5etnGLbvpfzyUGTDriAdd2Q9R1mWhMUwbsBY0sGvN3sTTMQG; 4:PgS5hn/Z0/e4EZqeqNqKCiT9/tZ3Tdsq7ExUK5UVqumpPASuKWlkq+ZKX2CQHhFEl94D1Sc3HmPSD4O9P3Dm5cRaEdQBYUJzMHu8n+GymVgFXsa23WK+ppXDzVtt0eRCfpC6bg7gz1wdEPi5RQkiWc6WKRZ33BDhPcrZeiifMamfM+gtQOlWCOeA5jmDLSvv2N2oZKsS8aIAX9oLCmbPmkbfkZaJslwDCJ0E1xGLU6030Gu8MBPoyaoCplOdjn4aW5If6lRLVpRNeWui4gaBKA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(3002001)(3231221)(944501327)(52105095)(10201501046)(93006095)(93001095)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123562045)(20161123564045)(20161123560045)(6072148)(201708071742011); SRVR:MWHPR0701MB3675; BCL:0; PCL:0; RULEID:; SRVR:MWHPR0701MB3675; X-Forefront-PRVS: 0637FCE711 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(366004)(396003)(346002)(39380400002)(39850400004)(376002)(189003)(199004)(105586002)(8936002)(316002)(7736002)(2351001)(72206003)(305945005)(186003)(21086003)(16526019)(486006)(2906002)(59450400001)(2361001)(386003)(55016002)(86362001)(3846002)(478600001)(6116002)(76176011)(50226002)(51416003)(52116002)(7696005)(4326008)(50466002)(48376002)(53936002)(16586007)(81166006)(66066001)(476003)(68736007)(2616005)(11346002)(69596002)(47776003)(26005)(956004)(8676002)(97736004)(4720700003)(25786009)(107886003)(81156014)(36756003)(446003)(106356001)(5660300001)(6916009); DIR:OUT; SFP:1101; SCL:1; SRVR:MWHPR0701MB3675; H:cavium.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: cavium.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; MWHPR0701MB3675; 23:zyRA5O+q7lpuWV/hEg+NsSkgMnVN5Nr4aoRFyIP?= =?us-ascii?Q?r9RNEN0NSeHSlQB/tThZle8pWre0++xVpXW/lY5LZ6Akekg/hYMKGY8xP5A4?= =?us-ascii?Q?BHrbkvxB62D2mFR0n02fAbpU5MYYyz9BxyqNU08bfLOQ6iurCOxcqzCcWUS7?= =?us-ascii?Q?wPRh8mhzSZwMolsM2mjt9mUiM85qHryBmHmjfsmDFpQINJHkun9Kaarxc+TM?= =?us-ascii?Q?Re0IYG5JUIpAqAYWXokjj8vaWQjD2P+garczuflM0WQ6iBHf/utezXy7h5tx?= =?us-ascii?Q?cMK1zPbBhI3zBpwzT0uyfIb3mXTow3mQPQ/mFKA0JllJjRJ0hs8xpxcOCIEY?= =?us-ascii?Q?IKDMHlRQFmyxqwnzpO0j+4IxZ1h64iLu+9EcUI2LiiijpClFglFtoB2wVPWp?= =?us-ascii?Q?ee0Nno2E5f3J0QGlWTynutzjsoo1h6HY0oMuTYM2WJT8O19nwclSn51zV46r?= =?us-ascii?Q?5/q8NpZbeQdwaqHYtR0M+yJjgA4V5QClAxBPfc99yVEbwsqFqONwIB1r+kdw?= =?us-ascii?Q?XfoRue4EJte/0VGd+xKRGT/8jl6PE1PQkDbgJeK6GqB7agVUI+hOT38JWAd8?= =?us-ascii?Q?9QIrftL7T0ntBByfyg4ZhuKqcOLRksYIFZg8nnhLZijG9m2JV5yentXISRB0?= =?us-ascii?Q?UQL14WWoc0ktW4wEep0wi2Acu22MBRG1Odof5xIx5ufG56GE1AoKJU3dDEGM?= =?us-ascii?Q?Lwo2Tdr8s6uZXjzyY7DfzpblrfL+6Qm4FbWDBQSupv+pfTzS0GiLnusbpyY2?= =?us-ascii?Q?Kb4bnjSlNVxVB6qsirhAQHzU16ZW5hghRvdg28YXxM62aswJFHDfS0SRFG3E?= =?us-ascii?Q?f5sLMlc5Yk3SZoOo0Rcc85B02orofcNNlsthTwygD3bNHe9rH9Yq5L35td2Q?= =?us-ascii?Q?IwbDjpuE0y1Ar3nJU2lZKku+Wfx0MCRip30hO3Jjg0uK0BnoTr8bscOiMIy8?= =?us-ascii?Q?DbLYGWmLEQqMtqPl+OK5iGo65TMA+HDGw9jYLJJcBjVfvJW82T89poyCA9JX?= =?us-ascii?Q?BPtYRPtAZLza+dJJZA80P9m6qwykznhJv4KcV0MKKs20HRERjMafDSvMBcJJ?= =?us-ascii?Q?2C8wUduvYKs4Hem9zYyl4xmmfM3ofN3UsUKnj8v/Kwd0a0LwFxeaUIPt9SAx?= =?us-ascii?Q?xdf7rhSV/G/a+MJDvoH5q4QtQ1yHbqspOt5SH/QWZX4yMsDu6X/3yx8KWN9l?= =?us-ascii?Q?norGlstAz/irPTY7dDOVo8QJ2KAnMNx1/rNmf2qDqaLFMH5DnShLKq7xVLqQ?= =?us-ascii?Q?B3cymn9r48yGN/9eHcN/xdKCgW7FANAZwL0e805fMLaJUHJPVbF7Hyk090f2?= =?us-ascii?Q?MQTKp3NFcl8+5iywfzBmezR4=3D?= X-Microsoft-Antispam-Message-Info: wTsUnspaoe3Fxq5EWvypX/ka/EiAkvXsLjMi/MakD4ASql6AmFw9JYSzHLd2SV6wFTLoeQBCibBiMuy4bTLl0quCN1pG9LwGl9CSYdwZ+Lm4K9PJAdPgci+S2OXqA0lZgtyZBUw4Ss+EbNMvKMhC6YkMsAgJCvqtjrmdbWRkc6qhRDZjWeGJqbM9azxJQziT X-Microsoft-Exchange-Diagnostics: 1; MWHPR0701MB3675; 6:hK0Qt5Ou61O26Swijmp3grbzEt/TIX+7yoEA88/trZCazsVv/vxurlPEgluroKgglsbzSAgCePl7ey8fjYeoRYvMrE/E2jLTw9DCm+nrX0McaZFNVLPotJZ7LH2qln3bQgc32OO/N/6aA4K9ittkXlWI/foZNxS9LJTc51Kru/y/fRWaUQZ22DMuPmw6dRtN4RKXhljq/JoL0pZ2c3M6QAwBdXdLFwViHgBOK9FXXv2d/VcEZq2DF/nwD3oQoocV4ZvLauvfxiiZjONd/q8WOLTs2W1mKyuqxjqJsm59vtaqifERqBURNx3H1Ja8hd8ZoWB7wbrVfUFdHWA2C5YAwh/HjdgfY+lz5kgnA7PeNFyZ1ywO5O6ILU0MagqFgsE4l2MsuCmWsvL6bMN4ekrbWQ2iuPeorHt+JNwND7bSslDA77u5Www7p9rm4Tj0n/aKBSYq6PnCbzm8ul1908qqcQ==; 5:SyE/DUr5T/+pPjONN+gchE1ghSGKsN49v867WfHi+JXiLGIoOEWkg8Tax3D1h3/h0gECSyjJQOuLLnNA9Mf3ccIty+ZPOcguRHMKb6rH/Eu9YlzGNnHdc3cn4lgZZujXmoe0eNeV1hLv270iGDeUirAVdgjZ8AyxUZEYRjSppUk=; 24:/evGLiM4xYuVQ/hnx8WNHaY5r65Q7TeV9HM4gU4E2vLyDs/IimqZ27vAFUFjgo/zZ8FLf/PsMVGsYIzmsnAqVsKpO9uFkQUqm57APTM1eW0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; MWHPR0701MB3675; 7:4wtY+nh7FmXcMLZ2l9zmbKtnYDi9Chvg9mz72RGDXmXn53juJ0K/J4JhoxlNDCBoslB0r0z7A9/sidUrmWjf5qF+cQq+EHgxr9hfdJT+NVwphZwjKMleu0foVFbD2HeiwN0RRECbRn7HBceXONVxXbxY/vt5sA+PSwy9TyuZID2agBPLHdMd8LUtIjQSb/sIHLhTkddNTl58qouVUI0SdBmGElkb7cv90cxkDqCuyGF7c6sD7CTwLcBMTqTfgzu9 X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Apr 2018 04:49:07.7155 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 81aa0b6c-eeb7-4cb7-4fde-08d59dd53a94 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MWHPR0701MB3675 Subject: [dpdk-dev] [PATCH v2 11/14] net/qede/base: add APIs for xcvr 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: , X-List-Received-Date: Mon, 09 Apr 2018 04:49:12 -0000 Add API to query transceiver info and to retrieve link speed. Signed-off-by: Rasesh Mody --- drivers/net/qede/base/ecore_mcp.c | 199 ++++++++++++++++++++++++++++++++- drivers/net/qede/base/ecore_mcp_api.h | 46 ++++++++ drivers/net/qede/base/mcp_public.h | 1 + 3 files changed, 243 insertions(+), 3 deletions(-) diff --git a/drivers/net/qede/base/ecore_mcp.c b/drivers/net/qede/base/ecore_mcp.c index 0e425aa..c1bfdd1 100644 --- a/drivers/net/qede/base/ecore_mcp.c +++ b/drivers/net/qede/base/ecore_mcp.c @@ -9,6 +9,7 @@ #include "bcm_osal.h" #include "ecore.h" #include "ecore_status.h" +#include "nvm_cfg.h" #include "ecore_mcp.h" #include "mcp_public.h" #include "reg_addr.h" @@ -602,7 +603,7 @@ void ecore_mcp_print_cpu_info(struct ecore_hwfn *p_hwfn, /* MCP not initialized */ if (!ecore_mcp_is_init(p_hwfn)) { - DP_NOTICE(p_hwfn, true, "MFW is not initialized !\n"); + DP_NOTICE(p_hwfn, true, "MFW is not initialized!\n"); return ECORE_BUSY; } @@ -2130,19 +2131,20 @@ enum _ecore_status_t ecore_mcp_get_media_type(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt, u32 *p_media_type) { + enum _ecore_status_t rc = ECORE_SUCCESS; /* TODO - Add support for VFs */ if (IS_VF(p_hwfn->p_dev)) return ECORE_INVAL; if (!ecore_mcp_is_init(p_hwfn)) { - DP_NOTICE(p_hwfn, true, "MFW is not initialized !\n"); + DP_NOTICE(p_hwfn, false, "MFW is not initialized!\n"); return ECORE_BUSY; } if (!p_ptt) { *p_media_type = MEDIA_UNSPECIFIED; - return ECORE_INVAL; + rc = ECORE_INVAL; } else { *p_media_type = ecore_rd(p_hwfn, p_ptt, p_hwfn->mcp_info->port_addr + @@ -2153,6 +2155,197 @@ enum _ecore_status_t ecore_mcp_get_media_type(struct ecore_hwfn *p_hwfn, return ECORE_SUCCESS; } +enum _ecore_status_t ecore_mcp_get_transceiver_data(struct ecore_hwfn *p_hwfn, + struct ecore_ptt *p_ptt, + u32 *p_tranceiver_type) +{ + enum _ecore_status_t rc = ECORE_SUCCESS; + + /* TODO - Add support for VFs */ + if (IS_VF(p_hwfn->p_dev)) + return ECORE_INVAL; + + if (!ecore_mcp_is_init(p_hwfn)) { + DP_NOTICE(p_hwfn, false, "MFW is not initialized!\n"); + return ECORE_BUSY; + } + if (!p_ptt) { + *p_tranceiver_type = ETH_TRANSCEIVER_TYPE_NONE; + rc = ECORE_INVAL; + } else { + *p_tranceiver_type = ecore_rd(p_hwfn, p_ptt, + p_hwfn->mcp_info->port_addr + + offsetof(struct public_port, + transceiver_data)); + } + + return rc; +} + +static int is_transceiver_ready(u32 transceiver_state, u32 transceiver_type) +{ + if ((transceiver_state & ETH_TRANSCEIVER_STATE_PRESENT) && + ((transceiver_state & ETH_TRANSCEIVER_STATE_UPDATING) == 0x0) && + (transceiver_type != ETH_TRANSCEIVER_TYPE_NONE)) + return 1; + + return 0; +} + +enum _ecore_status_t ecore_mcp_trans_speed_mask(struct ecore_hwfn *p_hwfn, + struct ecore_ptt *p_ptt, + u32 *p_speed_mask) +{ + u32 transceiver_data, transceiver_type, transceiver_state; + + ecore_mcp_get_transceiver_data(p_hwfn, p_ptt, &transceiver_data); + + transceiver_state = GET_MFW_FIELD(transceiver_data, + ETH_TRANSCEIVER_STATE); + + transceiver_type = GET_MFW_FIELD(transceiver_data, + ETH_TRANSCEIVER_TYPE); + + if (is_transceiver_ready(transceiver_state, transceiver_type) == 0) + return ECORE_INVAL; + + switch (transceiver_type) { + case ETH_TRANSCEIVER_TYPE_1G_LX: + case ETH_TRANSCEIVER_TYPE_1G_SX: + case ETH_TRANSCEIVER_TYPE_1G_PCC: + case ETH_TRANSCEIVER_TYPE_1G_ACC: + case ETH_TRANSCEIVER_TYPE_1000BASET: + *p_speed_mask = NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_1G; + break; + + case ETH_TRANSCEIVER_TYPE_10G_SR: + case ETH_TRANSCEIVER_TYPE_10G_LR: + case ETH_TRANSCEIVER_TYPE_10G_LRM: + case ETH_TRANSCEIVER_TYPE_10G_ER: + case ETH_TRANSCEIVER_TYPE_10G_PCC: + case ETH_TRANSCEIVER_TYPE_10G_ACC: + case ETH_TRANSCEIVER_TYPE_4x10G: + *p_speed_mask = NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G; + break; + + case ETH_TRANSCEIVER_TYPE_40G_LR4: + case ETH_TRANSCEIVER_TYPE_40G_SR4: + case ETH_TRANSCEIVER_TYPE_MULTI_RATE_10G_40G_SR: + case ETH_TRANSCEIVER_TYPE_MULTI_RATE_10G_40G_LR: + *p_speed_mask = NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G; + break; + + case ETH_TRANSCEIVER_TYPE_100G_AOC: + case ETH_TRANSCEIVER_TYPE_100G_SR4: + case ETH_TRANSCEIVER_TYPE_100G_LR4: + case ETH_TRANSCEIVER_TYPE_100G_ER4: + case ETH_TRANSCEIVER_TYPE_100G_ACC: + *p_speed_mask = + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_BB_100G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G; + break; + + case ETH_TRANSCEIVER_TYPE_25G_SR: + case ETH_TRANSCEIVER_TYPE_25G_LR: + case ETH_TRANSCEIVER_TYPE_25G_AOC: + case ETH_TRANSCEIVER_TYPE_25G_ACC_S: + case ETH_TRANSCEIVER_TYPE_25G_ACC_M: + case ETH_TRANSCEIVER_TYPE_25G_ACC_L: + *p_speed_mask = NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G; + break; + + case ETH_TRANSCEIVER_TYPE_25G_CA_N: + case ETH_TRANSCEIVER_TYPE_25G_CA_S: + case ETH_TRANSCEIVER_TYPE_25G_CA_L: + case ETH_TRANSCEIVER_TYPE_4x25G_CR: + *p_speed_mask = NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_1G; + break; + + case ETH_TRANSCEIVER_TYPE_40G_CR4: + case ETH_TRANSCEIVER_TYPE_MULTI_RATE_10G_40G_CR: + *p_speed_mask = NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_1G; + break; + + case ETH_TRANSCEIVER_TYPE_100G_CR4: + case ETH_TRANSCEIVER_TYPE_MULTI_RATE_40G_100G_CR: + *p_speed_mask = + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_BB_100G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_50G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_20G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_1G; + break; + + case ETH_TRANSCEIVER_TYPE_MULTI_RATE_40G_100G_SR: + case ETH_TRANSCEIVER_TYPE_MULTI_RATE_40G_100G_LR: + case ETH_TRANSCEIVER_TYPE_MULTI_RATE_40G_100G_AOC: + *p_speed_mask = + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_BB_100G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G; + break; + + case ETH_TRANSCEIVER_TYPE_XLPPI: + *p_speed_mask = NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G; + break; + + case ETH_TRANSCEIVER_TYPE_10G_BASET: + *p_speed_mask = NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G | + NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_1G; + break; + + default: + DP_INFO(p_hwfn, "Unknown transcevier type 0x%x\n", + transceiver_type); + *p_speed_mask = 0xff; + break; + } + + return ECORE_SUCCESS; +} + +enum _ecore_status_t ecore_mcp_get_board_config(struct ecore_hwfn *p_hwfn, + struct ecore_ptt *p_ptt, + u32 *p_board_config) +{ + u32 nvm_cfg_addr, nvm_cfg1_offset, port_cfg_addr; + enum _ecore_status_t rc = ECORE_SUCCESS; + + /* TODO - Add support for VFs */ + if (IS_VF(p_hwfn->p_dev)) + return ECORE_INVAL; + + if (!ecore_mcp_is_init(p_hwfn)) { + DP_NOTICE(p_hwfn, false, "MFW is not initialized!\n"); + return ECORE_BUSY; + } + if (!p_ptt) { + *p_board_config = NVM_CFG1_PORT_PORT_TYPE_UNDEFINED; + rc = ECORE_INVAL; + } else { + nvm_cfg_addr = ecore_rd(p_hwfn, p_ptt, + MISC_REG_GEN_PURP_CR0); + nvm_cfg1_offset = ecore_rd(p_hwfn, p_ptt, + nvm_cfg_addr + 4); + port_cfg_addr = MCP_REG_SCRATCH + nvm_cfg1_offset + + offsetof(struct nvm_cfg1, port[MFW_PORT(p_hwfn)]); + *p_board_config = ecore_rd(p_hwfn, p_ptt, + port_cfg_addr + + offsetof(struct nvm_cfg1_port, + board_cfg)); + } + + return rc; +} + /* @DPDK */ /* Old MFW has a global configuration for all PFs regarding RDMA support */ static void diff --git a/drivers/net/qede/base/ecore_mcp_api.h b/drivers/net/qede/base/ecore_mcp_api.h index 225890e..bb20ed3 100644 --- a/drivers/net/qede/base/ecore_mcp_api.h +++ b/drivers/net/qede/base/ecore_mcp_api.h @@ -595,6 +595,52 @@ enum _ecore_status_t ecore_mcp_get_media_type(struct ecore_hwfn *p_hwfn, u32 *media_type); /** + * @brief Get transceiver data of the port. + * + * @param p_dev - ecore dev pointer + * @param p_ptt + * @param p_transceiver_type - media type value + * + * @return enum _ecore_status_t - + * ECORE_SUCCESS - Operation was successful. + * ECORE_BUSY - Operation failed + */ +enum _ecore_status_t ecore_mcp_get_transceiver_data(struct ecore_hwfn *p_hwfn, + struct ecore_ptt *p_ptt, + u32 *p_tranceiver_type); + +/** + * @brief Get transceiver supported speed mask. + * + * @param p_dev - ecore dev pointer + * @param p_ptt + * @param p_speed_mask - Bit mask of all supported speeds. + * + * @return enum _ecore_status_t - + * ECORE_SUCCESS - Operation was successful. + * ECORE_BUSY - Operation failed + */ + +enum _ecore_status_t ecore_mcp_trans_speed_mask(struct ecore_hwfn *p_hwfn, + struct ecore_ptt *p_ptt, + u32 *p_speed_mask); + +/** + * @brief Get board configuration. + * + * @param p_dev - ecore dev pointer + * @param p_ptt + * @param p_board_config - Board config. + * + * @return enum _ecore_status_t - + * ECORE_SUCCESS - Operation was successful. + * ECORE_BUSY - Operation failed + */ +enum _ecore_status_t ecore_mcp_get_board_config(struct ecore_hwfn *p_hwfn, + struct ecore_ptt *p_ptt, + u32 *p_board_config); + +/** * @brief - Sends a command to the MCP mailbox. * * @param p_hwfn - hw function diff --git a/drivers/net/qede/base/mcp_public.h b/drivers/net/qede/base/mcp_public.h index d3666a7..3f330bc 100644 --- a/drivers/net/qede/base/mcp_public.h +++ b/drivers/net/qede/base/mcp_public.h @@ -800,6 +800,7 @@ struct public_port { #define ETH_TRANSCEIVER_TYPE_4x10G 0x1f #define ETH_TRANSCEIVER_TYPE_4x25G_CR 0x20 #define ETH_TRANSCEIVER_TYPE_1000BASET 0x21 +#define ETH_TRANSCEIVER_TYPE_10G_BASET 0x22 #define ETH_TRANSCEIVER_TYPE_MULTI_RATE_10G_40G_SR 0x30 #define ETH_TRANSCEIVER_TYPE_MULTI_RATE_10G_40G_CR 0x31 #define ETH_TRANSCEIVER_TYPE_MULTI_RATE_10G_40G_LR 0x32 -- 1.7.10.3