From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by smtp.lore.kernel.org (Postfix) with ESMTP id B16D5CDB47F for ; Wed, 24 Jun 2026 11:55:02 +0000 (UTC) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E01AF40E26; Wed, 24 Jun 2026 13:53:44 +0200 (CEST) Received: from smtpbgau2.qq.com (smtpbgau2.qq.com [54.206.34.216]) by mails.dpdk.org (Postfix) with ESMTP id E7C5840677; Wed, 24 Jun 2026 13:53:40 +0200 (CEST) X-QQ-mid: esmtpgz10t1782302017t44b92843 X-QQ-Originating-IP: MY8Co4/RdaW4OHY+3HqrcmE/9Vaa+2Hxbv3BIbq2JBY= Received: from DSK-zaiyuwang.trustnetic.com ( [115.204.248.247]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 24 Jun 2026 19:53:36 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 3678933712675038907 EX-QQ-RecipientCnt: 4 From: Zaiyu Wang To: dev@dpdk.org Cc: Zaiyu Wang , stable@dpdk.org, Jiawen Wu Subject: [PATCH v10 17/21] net/txgbe: fix get module info operation Date: Wed, 24 Jun 2026 19:52:49 +0800 Message-Id: <20260624115254.20348-18-zaiyuwang@trustnetic.com> X-Mailer: git-send-email 2.21.0.windows.1 In-Reply-To: <20260624115254.20348-1-zaiyuwang@trustnetic.com> References: <20260423034024.14404-1-zaiyuwang@trustnetic.com> <20260624115254.20348-1-zaiyuwang@trustnetic.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: esmtpgz:trustnetic.com:qybglogicsvrsz:qybglogicsvrsz3b-0 X-QQ-XMAILINFO: OKgraWJYmkAvjim1/lyTI+rFjkbZdVHQ+4MPA5xUWfEm7pajmPh8KfQh Wg8Gh8tgACPDPZb6APb5jYHDV8h53QaUx2KQ1F9pT+InGiA4nWb+67r3UGuKBVqRyrqhqfm WfjC46KfqdtEkjgTP7+xamgMecTheVm2aAKhDKG4QIpUHzjr+hl09VPj9O7r9wFTga0Mj4l Y1x2Vl/y1LljMAJKWzwrHDom4s8W+LvBkuH3pSu70YLgmlMzgYWV0HVp1rwr6HaK4qhIVEO p5HpNkGPi2Ou8/aNMQNTMaBAxs+Gl7KNl0GZkdJMEVTSVrGyDotzIHys54e7qR4DEheir8j 02ZZ/GbAAMmxu/GxtUDDz+YxMKfoYvoRNVBch9yLmWmWggLjfheNTNnuHDgLkjFO4KQW3xI jVup7zS55iCADVRQHLrJrVmV9DtsVxkWb8ogF2Pth3Z4pHU+e0vfbsltqwNMQ0VLSgJioZd g+wRLLgH+l1IzPVTERYfaod3VkCV5m/7J70cD9zW80D9oALq0qinO5Q3ijSxNxZULxNAfxW IXiMCp7d55hGa8VlNydBzj3TccJbT4dLaRP38MB6D2K7z7QE/3QWhpynn5et9iBzMaK0jkv 1epmoqa1+Q1a2OR0a8W/KFr7LOBhkGHhNhs9KGwnKa0LfLfN4eJRQ/ko0/CKzZx7+LVxemL pQSJ0sgeBayZ5nHYq5kk8/wRHDLPT23bCUP2aW1PMqMhstPhefBfpd/wUcPS70ErJQGfcwt vRQanaJhWiDCuf4MQn5GcNoH0kPbeswdEgUdQCjrYkmVALRwMb5MyCQPGG+t8fKwlQWBzq8 Ot5IKjJcUvIejtvE+awTLWkBmmKSYbmFRnEvs9FH0DnEGVtqYGDHzlNGfm6I6PqPfscZl3W lZZ2XIT0YCpS/qdrTB44Lj7wnyOdJauHNkH5W6oN1HYMTEteBmrp5T2nOLf+uMgGxRU05Ot 9rEede1GGan9KpWxuoqHhAxWdtFiASfIZhq9neExhK06lTmOHFgrgedvjMH8JFxFhfL63Z5 r36cvguzsmA9Ok59q2TdIle7qbHE2VyezJYAJuc5X3NZE5u592pUgYe5dn0uyUS4xz9mHQY 6m75AJeQN/vlpkysq6J8ef4Y52i/acsEtbVvNgySRxE4vEVVDNyDE1gSEoR638AtIwKHWtS GAGpFjiCunhqNYk= X-QQ-XMRINFO: OD9hHCdaPRBwH5bRRRw8tsiH4UAatJqXfg== X-QQ-RECHKSPAM: 0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The original I2C access flow in the module information retrieval process was flawed. Correct the implementation to properly fetch module info. Fixes: abf042d32b39 ("net/txgbe: add Amber-Lite 25G/40G NICs") Cc: stable@dpdk.org Signed-off-by: Zaiyu Wang --- drivers/net/txgbe/base/txgbe_phy.h | 6 +- drivers/net/txgbe/txgbe_ethdev.c | 118 +++++++++++++++++++++++------ 2 files changed, 98 insertions(+), 26 deletions(-) diff --git a/drivers/net/txgbe/base/txgbe_phy.h b/drivers/net/txgbe/base/txgbe_phy.h index 20c80d9d88..31bdceb35b 100644 --- a/drivers/net/txgbe/base/txgbe_phy.h +++ b/drivers/net/txgbe/base/txgbe_phy.h @@ -258,10 +258,14 @@ #define TXGBE_SFF_CABLE_DA_ACTIVE 0x8 #define TXGBE_SFF_CABLE_SPEC_COMP 0x3C #define TXGBE_SFF_SFF_8472_SWAP 0x5C +#define TXGBE_SFF_DDM_IMPLEMENTED 0x40 #define TXGBE_SFF_SFF_8472_COMP 0x5E #define TXGBE_SFF_SFF_8472_OSCB 0x6E #define TXGBE_SFF_SFF_8472_ESCB 0x76 -#define TXGBE_SFF_QSFP_PAGE_SELECT 0x7F +#define TXGBE_SFF_SFF_REVISION_ADDR 0x01 +#define TXGBE_SFF_QSFP_PAGE_SELECT 0x7F + +#define TXGBE_MODULE_QSFP_MAX_LEN 640 #define TXGBE_SFF_IDENTIFIER_QSFP 0x0C #define TXGBE_SFF_IDENTIFIER_QSFP_PLUS 0x0D diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c index 3e19591257..f373656342 100644 --- a/drivers/net/txgbe/txgbe_ethdev.c +++ b/drivers/net/txgbe/txgbe_ethdev.c @@ -5348,41 +5348,109 @@ txgbe_get_module_info(struct rte_eth_dev *dev, struct txgbe_hw *hw = TXGBE_DEV_HW(dev); uint32_t status; uint8_t sff8472_rev, addr_mode; + uint8_t identifier; + uint8_t sff8636_rev; bool page_swap = false; + uint32_t value; - /* Check whether we support SFF-8472 or not */ - status = hw->phy.read_i2c_eeprom(hw, - TXGBE_SFF_SFF_8472_COMP, - &sff8472_rev); - if (status != 0) - return -EIO; + if (hw->mac.type == txgbe_mac_aml40) { + value = rd32(hw, TXGBE_GPIOEXT); + if (value & TXGBE_SFP1_MOD_PRST_LS) { + PMD_DRV_LOG(WARNING, "QSFP module not present, cannot get module info."); + return -EINVAL; + } + } + + if (hw->mac.type == txgbe_mac_aml) { + value = rd32(hw, TXGBE_GPIOEXT); + if (value & TXGBE_SFP1_MOD_ABS_LS) { + PMD_DRV_LOG(WARNING, "SFP module not present, cannot get module info."); + return -EINVAL; + } + } - /* addressing mode is not supported */ - status = hw->phy.read_i2c_eeprom(hw, - TXGBE_SFF_SFF_8472_SWAP, - &addr_mode); + status = hw->mac.acquire_swfw_sync(hw, TXGBE_MNGSEM_SWPHY); if (status != 0) - return -EIO; + return -EBUSY; - if (addr_mode & TXGBE_SFF_ADDRESSING_MODE) { - PMD_DRV_LOG(ERR, - "Address change required to access page 0xA2, " - "but not supported. Please report the module " - "type to the driver maintainers."); - page_swap = true; + if (hw->mac.type == txgbe_mac_aml40) { + status = hw->phy.read_i2c_sff8636(hw, 0, + TXGBE_SFF_IDENTIFIER, + &identifier); + } else { + status = hw->phy.read_i2c_eeprom(hw, + TXGBE_SFF_IDENTIFIER, + &identifier); } - if (sff8472_rev == TXGBE_SFF_SFF_8472_UNSUP || page_swap) { - /* We have a SFP, but it does not support SFF-8472 */ - modinfo->type = RTE_ETH_MODULE_SFF_8079; - modinfo->eeprom_len = RTE_ETH_MODULE_SFF_8079_LEN; - } else { - /* We have a SFP which supports a revision of SFF-8472. */ - modinfo->type = RTE_ETH_MODULE_SFF_8472; - modinfo->eeprom_len = RTE_ETH_MODULE_SFF_8472_LEN; + if (status != 0) + goto ERROR_IO; + + switch (identifier) { + case TXGBE_SFF_IDENTIFIER_SFP: + /* Check whether we support SFF-8472 or not */ + status = hw->phy.read_i2c_eeprom(hw, + TXGBE_SFF_SFF_8472_COMP, + &sff8472_rev); + if (status != 0) + goto ERROR_IO; + + /* addressing mode is not supported */ + status = hw->phy.read_i2c_eeprom(hw, + TXGBE_SFF_SFF_8472_SWAP, + &addr_mode); + if (status != 0) + goto ERROR_IO; + + if (addr_mode & TXGBE_SFF_ADDRESSING_MODE) { + PMD_DRV_LOG(ERR, + "Address change required to access page 0xA2, " + "but not supported. Please report the module " + "type to the driver maintainers."); + page_swap = true; + } + + if (sff8472_rev == TXGBE_SFF_SFF_8472_UNSUP || page_swap || + !(addr_mode & TXGBE_SFF_DDM_IMPLEMENTED)) { + /* We have a SFP, but it does not support SFF-8472 */ + modinfo->type = RTE_ETH_MODULE_SFF_8079; + modinfo->eeprom_len = RTE_ETH_MODULE_SFF_8079_LEN; + } else { + /* We have a SFP which supports a revision of SFF-8472. */ + modinfo->type = RTE_ETH_MODULE_SFF_8472; + modinfo->eeprom_len = RTE_ETH_MODULE_SFF_8472_LEN; + } + break; + case TXGBE_SFF_IDENTIFIER_QSFP: + case TXGBE_SFF_IDENTIFIER_QSFP_PLUS: + status = hw->phy.read_i2c_sff8636(hw, 0, + TXGBE_SFF_SFF_REVISION_ADDR, + &sff8636_rev); + if (status != 0) + goto ERROR_IO; + /* Check revision compliance */ + if (sff8636_rev > 0x02) { + /* Module is SFF-8636 compliant */ + modinfo->type = RTE_ETH_MODULE_SFF_8636; + modinfo->eeprom_len = TXGBE_MODULE_QSFP_MAX_LEN; + } else { + modinfo->type = RTE_ETH_MODULE_SFF_8436; + modinfo->eeprom_len = TXGBE_MODULE_QSFP_MAX_LEN; + } + break; + default: + PMD_DRV_LOG(ERR, "SFF Module Type not recognized, identifier=0x%x", identifier); + hw->mac.release_swfw_sync(hw, TXGBE_MNGSEM_SWPHY); + return -EINVAL; } + hw->mac.release_swfw_sync(hw, TXGBE_MNGSEM_SWPHY); return 0; + +ERROR_IO: + PMD_DRV_LOG(ERR, "I2C IO ERROR."); + hw->mac.release_swfw_sync(hw, TXGBE_MNGSEM_SWPHY); + return -EIO; } static int -- 2.21.0.windows.1