From patchwork Sun Apr 1 05:47:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Mody, Rasesh" X-Patchwork-Id: 36827 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 01C5D7CE7; Sun, 1 Apr 2018 07:48:07 +0200 (CEST) Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0081.outbound.protection.outlook.com [104.47.41.81]) by dpdk.org (Postfix) with ESMTP id C844E5593 for ; Sun, 1 Apr 2018 07:47:58 +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=S5lo2TUrTSIJRu6LnXBMN4Fw0T7Y8PXlz7PmWnj8kPuWr5HzTt+kkyK4sT2gfK9QER4JHM77Fhpq/dOjG/cdYTN1yifxStzktwBTUDai/LpfKI1qbGbeaym+GfwHmL26PDJHUTaSNG26Ce99XyW6tNUORA1kinP1d5deE/sutUI= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Rasesh.Mody@cavium.com; Received: from cavium.com (198.186.0.2) by DM5PR0701MB3670.namprd07.prod.outlook.com (2603:10b6:4:7e::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.631.10; Sun, 1 Apr 2018 05:47:57 +0000 From: Rasesh Mody To: dev@dpdk.org Cc: Rasesh Mody , ferruh.yigit@intel.com, Dept-EngDPDKDev@cavium.com Date: Sat, 31 Mar 2018 22:47:01 -0700 Message-Id: <1522561624-15817-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 X-Originating-IP: [198.186.0.2] X-ClientProxiedBy: BN6PR11CA0017.namprd11.prod.outlook.com (2603:10b6:405:2::27) To DM5PR0701MB3670.namprd07.prod.outlook.com (2603:10b6:4:7e::18) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 0e8be1b4-9787-4351-983c-08d597941f3e X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4604075)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:DM5PR0701MB3670; X-Microsoft-Exchange-Diagnostics: 1; DM5PR0701MB3670; 3:hozNXJehkMoOOza7HTSk2mskbgshYD0QdKRN65bM2Vv21euGCCpXrTG48lPCzfpoU9sszwjFsfnZOZ0WSXS9YfIbMyWo3dj6rocxoI4sKBpu+56L5RIv2PTN/2N4YebQ51MX/qtAMWlNzohdj0gemJv5ftlpp2/TIiAYsROFO+OKzqMr56eRqaE3J1QDLJGl3wPcuLL4IPdYhvFNoPbvQtPMbwFQ47JvolS6oeDFOo1/cbkveIrVRQI5Ne7TdPC/; 25:s40zRqNsHkPbipz8+izNPJEK13JI5MseqOOUyNCkxulp+4j7WvLC4GnDoyz0hlIVMmwRF3WeU3oCfCKpRtOUQn5marEcqxxt4f3uAEoqYWRsSgOS1MuflEd/pbsFB2OcVzIIt2oXqZ8kkylUg7AvPpQ5ADgNkjXI2zbB3JiPQ5BAECZNAGq7zsQmuCzeFogdBlbBMUPMUQ31VYtMlRdXqUcIo1lai9O1BldzUhhhONoKShKPE7DdOgqz0pfH3rbosd6RAmAg2zju+zzqcV7zE633nMamrDhW9JqlwSSZVDzb/aC4GnniuKMd00rjNwhh2RjbK/OArIuzb6rPIHmmWg==; 31:m28QQF16HkMKIh3GmY5KiQqyJsRQBcyg0EFJCSFiKl5UjRnZHCz4Ykdii+a7SiCYY5vfVQaF93TKdtx5SUnP3uyYlMTWI2RnxGlpUidKQjm0pnUsSvaue0SSCs76MfHt73h9fwxWEJA2U8eOTm5EJSnWMUePmadcadO1Zd+zHLX5rMBtcuRFkxFssitzwlKTceKkHnbJ/t8tNojyKIa5nylnd/2s4652tE5T0rQY7hY= X-MS-TrafficTypeDiagnostic: DM5PR0701MB3670: X-Microsoft-Exchange-Diagnostics: 1; DM5PR0701MB3670; 20:3KYN3gto+ttVS/lx/SMLWnJNQL1eFlCBX7ynNsiK73+2oE2uBCXzIWB8VxEkIcqF4pVAlvyIV5SFQ9cSI7dO8OCqL5v28mPuRKCrCwR+5jW+YffNr8wo4kns6AwPue0jh3julNMfbPqNztZlApjnwEoob34EnuchDLzqFUnseytwTSieGfH8qU6Wp5vDkCH3GmMCW2RM4gSMBPttf84KR9rOctTrzh1JGhCZ+rtQZz0VWIZdlKUH/WrNC/hEZk/xuuqYWOJmQZAy0Hkp2pJ5/ZeoFX9gYIN5JpPuynJJFZ2vuOjUMx1tmntYQciEX5RttZU6miK1TbxkiClqQN3jmJahDxVLKBYB30baVwD1lzav6BPVsZFbJZtM0TpPXmqnk8MYqCCcXy7w1VuPnOULymzMSOd8vG1NMOvQ4kLYfwpkVM5LYQG7K2xmW++u0OwcPuwl2y5sNiwPholjpdhHjEL1r3AsQwMlsKLpodxuaSHnyjYNArgE2zNO2V+ckU0A; 4:DZyk6jNG0QFlL6FJxjx8tb1NI61VsuWNzFHUAqVS7yewTcoUtAEaiXkBgwhfxKuIZrObJ6RHxCy4rXveMnClMPGLgpwcoj3ktfXsO/R4YGn7K4jQCkS3FyJuRnSvtM5/XgPxn7bNW262dUKJ74AhB7aansWd8cC1AldUooa48YnjsWxl6oInFIRL6MchKTW6xaTDK/HSI7kZeFHMGogh16fAAjg1HaQXabyw73YvMe5rrE8gD/pg0UY6alGThTiUZ1CasaPsfqOY82vfH7VPxg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231221)(944501327)(52105095)(93006095)(93001095)(3002001)(10201501046)(6041310)(20161123562045)(20161123558120)(20161123564045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:DM5PR0701MB3670; BCL:0; PCL:0; RULEID:; SRVR:DM5PR0701MB3670; X-Forefront-PRVS: 06290ECA9D X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(979002)(39850400004)(376002)(346002)(366004)(396003)(39380400002)(189003)(199004)(25786009)(16526019)(52116002)(81166006)(81156014)(76176011)(8676002)(7696005)(478600001)(72206003)(51416003)(305945005)(26005)(386003)(7736002)(186003)(2361001)(59450400001)(86362001)(47776003)(69596002)(2906002)(66066001)(4326008)(68736007)(2351001)(55016002)(97736004)(21086003)(50226002)(6666003)(107886003)(4720700003)(36756003)(8936002)(16586007)(316002)(52396003)(6116002)(106356001)(11346002)(53936002)(105586002)(5660300001)(6916009)(3846002)(486005)(446003)(476003)(48376002)(50466002)(486005)(956004)(2616005)(969003)(989001)(999001)(1009001)(1019001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR0701MB3670; 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; DM5PR0701MB3670; 23:EBY/j+/uVJI7bST2bRv4CWE99hNw/IqHzdqscOY?= 9pPTbrbW+S8yoUPSZaTVBK0g3M7bVXNf71c2+APvjmOPUeIv9krPqhahBNGrepdoqYVpvkaC/yJoyXGsCP1TxchsQGgwAxxmLqyRiGxToqt+UOmhtFidNwqwL7oYE3Zeaj6FTy/z5s8BkXRL/BZ2FFnItuRvSbgkaTnzK/cxWjz+PzXOfuQXiVkKhNGb0/Bg/cftkopWh8YgWxFqi3GOO8Kwg/UquH0jaDleMaAG+GskKRB8D4ZPvfjvXMHG6FhsWZ1fcOqlLOkDv9+s9lPar1RQirw/7SePXy6dfuBkyVD2HR8olWYaI/2twLh6h/ktb6VaPE2uxWGixotpWlD+IGt8qJN+qhAGzVFiHXTLvCCg1SLDdB8LWL/ENnS88T5bM9YwAXbOuBAC0CmnEPWvGWiHbVq5jOzgVeZDVoOHZr0mN2+nns/N85ppVaL7jfAXvx8LiJb7SQ5J6MCX8tVMReMryWjPRp5YsvOkccra7dPg+3lIYQRhSim6961uFrZU0c5jrgaKfoPuQqDU3iuJ0SHYBZLJkkng5SL7bS8FHLAmj5ZmI73uxReOyBCd+u+Fcm3EpeU6+ZxO152ZVt4SaYMh1HKvDmszhR7pgpGJL487YGU/aN5f4kaMXsEmnrl17E6aUmBDnUHJ/fzKluB8aZNruZhsU8JMWIOpKbXkqXGPaFW3haiCZ54SM5krAta6IcbD/rxdZoatdADm6hiiCva/Ro4dFNAzvtUBWJ6WndTOCQRJaAC5x2n+9OOpWySTF1qC27l0sKT2pkmIV1bB+mazqaqn3NMoOV9Ff2A9GhK5lszlcuv5hhIyn6tMIKkt9YBJvknW27i/q9Lky84fq9KMsGbqbP4IIaisjU3mHq2u0B90HNZchLWXQy4CmkN2AYxGwZ2tiUJgVkeBu5PyUWDUjaHf83vdlw7nwXSI9DW4LUm/CCXXEgwRwjwFwdBCVHG/8H55l7QL9CkwJMMTsq+Ql/NppV91nsA0qaFClpaOcTCfMQp8sQFdfBO8ripqq7fVzVywzKmncUKz6U9+5tJ/Hp3xxInkhp2QzMsUVek9roepVZMZjoja9qUGT45ea4qSql90Ml2MJ08JE3JVIYycOfcpOiIxhcF3LZzMMaQy9gxtOJdgetZiH7X6YGr5lnaNcJhPYpFOS5MEb1IgVhu4fLwBvbPZoQduN3fQMn5253YFr1pI1nvevkmFrS3TB3+shFWXHN8x1m9abG5UbSPtBunxRVRmtkbfhOrUz6k6OfVP6AmssqehcEIas9/o3SwyttDFyHv1kBOJyJRzo5Ty0r9FHpXt5VGj5VeTX3sKCd0Tv5O8Bk2CRy7qNyjBF+VCswdLR/DUaQVcS3epopAR027BpVLu/qJSl5mfJWQfaJwCNWWdiIo7eBlTcubaPXXYBjts9MIuqCu2YhFXXydwR X-Microsoft-Antispam-Message-Info: 36sNDTBSTdTVPLizCBZ4tRSWZlmNjkmrKASk/UM5LQon5RRpjO6MgO9Cs+Ea9hB+g6dXo1M3Lgx23H5tLhwlU5udU8JME16vlIbgHawaO5EyjS6Ri5IRIgPaOurl+RTr+Tp/dDzW+rYxaG6hxuLM5tDbcqY1NjR94iXrKy5n5GgOlkKvqw96sWbbelqVUZnP X-Microsoft-Exchange-Diagnostics: 1; DM5PR0701MB3670; 6:2s9ejBZBUNTgG9G+5eWazjxTGGd8A3qvDGhDXC33IoFaHo1a8SVn7lVSAdBCp52p/wp3wHFJZgMB/A3R3JBTmb5VZ9PRbVMpqvf3YCIknXx1wMlAnzLAMM12omZ27XzrmyO+DE5EQWM0sq4kmiH+RrXjJ73HvihlwSew7qIDeJMhqqoi1PykclZAVv8Mg6+DwCcaA5BPwDmYaTfzT8igNHnU704//JYEONSC0mjf+Mxfe7Tj6gqlyUNF1NMYWqWtt5Z793HuKfLjvvCiD6nwm6BT0VzqN/sCVdMz6mqpWtJ3X14ePH+OqomfmdYNqZBqF+3SLLKaDpBeKK0VuUgFVScAYRMliTtJp8vWi3TzBqovwclbdvE6YspNEoooL378ghoQGmFvedRXuJSWLeySw7DjZKUHkNQ93ft9zAIfhJfNbZ6svx8YQmQMUWRrYovjBSJ7SBIU8xihrNH8VN48iw==; 5:3S5MV4bphLYgaw67thB0tZomcWvHmanoob2nbtPoUsJwidx8OwPgub0CFjTb1YqaFBhatvyhgxJsyNhk0ZYryW0qMOz4YX7niAJ8K05VRe2MfScsi3DoYeRHEV3ISE26tkz6XcXOx/SoJpn2O4EepGTljtgkda1xM9WDP15SPAc=; 24:rZI5dGyMk5dMN7q9SxaUXoJpCGq1LY+UhnwlKZ3sMVDfGAn8yquU/OEwFIkb7R1B2zycD3/CHPD/fHskUhnIwgEHcCDCXrvjYORdkw2d5IQ= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM5PR0701MB3670; 7:n/UDM34iATWzkrwJL64FHvPniqMF2kQ9f2Zl3TGY4iQoF764iCQjZ2K+H3NNPKzPje4FK2XPFDJ+mH59+fIM3JvAWAjWN551B6KNIEtDSpJyp+y8GppI4eQTlqHU8z1CUWyBhl8mYh0s8Nta8u9GuQFXYlANiP5fwnZSJXJorVH+KyjnvLU6bduiHkVimgUBViT7qb1R+ysKRTUBz/c7OkcDh5/7T+tzUeiUk0eS6KCMqCEtsftrQFj+hnjR8I8G X-OriginatorOrg: cavium.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Apr 2018 05:47:57.1536 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 0e8be1b4-9787-4351-983c-08d597941f3e X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 711e4ccf-2e9b-4bcf-a551-4094005b6194 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR0701MB3670 Subject: [dpdk-dev] [PATCH 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: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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