From: Jiawen Wu <jiawenwu@trustnetic.com>
To: dev@dpdk.org
Cc: Jiawen Wu <jiawenwu@trustnetic.com>
Subject: [PATCH 8/8] net/txgbe: add SFP hot-plug identification support
Date: Wed, 18 Jan 2023 14:00:39 +0800 [thread overview]
Message-ID: <20230118060039.3074016-9-jiawenwu@trustnetic.com> (raw)
In-Reply-To: <20230118060039.3074016-1-jiawenwu@trustnetic.com>
Support to identify the new SFP/SFP+ module when the device is started.
Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
---
doc/guides/rel_notes/release_23_03.rst | 1 +
drivers/net/txgbe/base/txgbe_regs.h | 1 +
drivers/net/txgbe/txgbe_ethdev.c | 70 +++++++++++++++++++++++---
3 files changed, 65 insertions(+), 7 deletions(-)
diff --git a/doc/guides/rel_notes/release_23_03.rst b/doc/guides/rel_notes/release_23_03.rst
index e64cb2d974..3c43b75ac0 100644
--- a/doc/guides/rel_notes/release_23_03.rst
+++ b/doc/guides/rel_notes/release_23_03.rst
@@ -62,6 +62,7 @@ New Features
* **Updated Wangxun txgbe driver.**
* Added chip overheat detection support.
+ * Added SFP hot-plug identification support.
Removed Items
diff --git a/drivers/net/txgbe/base/txgbe_regs.h b/drivers/net/txgbe/base/txgbe_regs.h
index 911bb6e04e..bc2854b01a 100644
--- a/drivers/net/txgbe/base/txgbe_regs.h
+++ b/drivers/net/txgbe/base/txgbe_regs.h
@@ -1579,6 +1579,7 @@ enum txgbe_5tuple_protocol {
#define TXGBE_GPIOINTMASK 0x014834
#define TXGBE_GPIOINTTYPE 0x014838
#define TXGBE_GPIOINTSTAT 0x014840
+#define TXGBE_GPIORAWINTSTAT 0x014844
#define TXGBE_GPIOEOI 0x01484C
diff --git a/drivers/net/txgbe/txgbe_ethdev.c b/drivers/net/txgbe/txgbe_ethdev.c
index ce7cf2506d..a502618bc5 100644
--- a/drivers/net/txgbe/txgbe_ethdev.c
+++ b/drivers/net/txgbe/txgbe_ethdev.c
@@ -114,6 +114,7 @@ static int txgbe_dev_interrupt_get_status(struct rte_eth_dev *dev,
static int txgbe_dev_interrupt_action(struct rte_eth_dev *dev,
struct rte_intr_handle *handle);
static void txgbe_dev_interrupt_handler(void *param);
+static void txgbe_dev_detect_sfp(void *param);
static void txgbe_dev_interrupt_delayed_handler(void *param);
static void txgbe_configure_msix(struct rte_eth_dev *dev);
@@ -1535,11 +1536,20 @@ txgbe_dev_phy_intr_setup(struct rte_eth_dev *dev)
{
struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
struct txgbe_interrupt *intr = TXGBE_DEV_INTR(dev);
+ u8 device_type = hw->subsystem_device_id & 0xF0;
uint32_t gpie;
- gpie = rd32(hw, TXGBE_GPIOINTEN);
- gpie |= TXGBE_GPIOBIT_6;
- wr32(hw, TXGBE_GPIOINTEN, gpie);
+ if (device_type != TXGBE_DEV_ID_MAC_XAUI &&
+ device_type != TXGBE_DEV_ID_MAC_SGMII) {
+ gpie = rd32(hw, TXGBE_GPIOINTEN);
+ gpie |= TXGBE_GPIOBIT_2 | TXGBE_GPIOBIT_3 | TXGBE_GPIOBIT_6;
+ wr32(hw, TXGBE_GPIOINTEN, gpie);
+
+ gpie = rd32(hw, TXGBE_GPIOINTTYPE);
+ gpie |= TXGBE_GPIOBIT_2 | TXGBE_GPIOBIT_3 | TXGBE_GPIOBIT_6;
+ wr32(hw, TXGBE_GPIOINTTYPE, gpie);
+ }
+
intr->mask_misc |= TXGBE_ICRMISC_GPIO;
intr->mask_misc |= TXGBE_ICRMISC_ANDONE;
intr->mask_misc |= TXGBE_ICRMISC_HEAT;
@@ -1648,6 +1658,7 @@ txgbe_dev_start(struct rte_eth_dev *dev)
PMD_INIT_FUNC_TRACE();
/* Stop the link setup handler before resetting the HW. */
+ rte_eal_alarm_cancel(txgbe_dev_detect_sfp, dev);
rte_eal_alarm_cancel(txgbe_dev_setup_link_alarm_handler, dev);
/* disable uio/vfio intr/eventfd mapping */
@@ -1880,6 +1891,7 @@ txgbe_dev_stop(struct rte_eth_dev *dev)
PMD_INIT_FUNC_TRACE();
+ rte_eal_alarm_cancel(txgbe_dev_detect_sfp, dev);
rte_eal_alarm_cancel(txgbe_dev_setup_link_alarm_handler, dev);
/* disable interrupts */
@@ -2673,6 +2685,51 @@ txgbe_dev_supported_ptypes_get(struct rte_eth_dev *dev)
return NULL;
}
+static void
+txgbe_dev_detect_sfp(void *param)
+{
+ struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
+ struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
+ s32 err;
+
+ err = hw->phy.identify_sfp(hw);
+ if (err == TXGBE_ERR_SFP_NOT_SUPPORTED) {
+ PMD_DRV_LOG(ERR, "Unsupported SFP+ module type was detected.");
+ } else if (err == TXGBE_ERR_SFP_NOT_PRESENT) {
+ PMD_DRV_LOG(INFO, "SFP not present.");
+ } else if (err == 0) {
+ hw->mac.setup_sfp(hw);
+ PMD_DRV_LOG(INFO, "detected SFP+: %d\n", hw->phy.sfp_type);
+ txgbe_dev_setup_link_alarm_handler(dev);
+ txgbe_dev_link_update(dev, 0);
+ }
+}
+
+static void
+txgbe_dev_sfp_event(struct rte_eth_dev *dev)
+{
+ struct txgbe_interrupt *intr = TXGBE_DEV_INTR(dev);
+ struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
+ u32 reg;
+
+ wr32(hw, TXGBE_GPIOINTMASK, 0xFF);
+ reg = rd32(hw, TXGBE_GPIORAWINTSTAT);
+ if (reg & TXGBE_GPIOBIT_2) {
+ wr32(hw, TXGBE_GPIOEOI, TXGBE_GPIOBIT_2);
+ rte_eal_alarm_set(1000 * 100, txgbe_dev_detect_sfp, dev);
+ }
+ if (reg & TXGBE_GPIOBIT_3) {
+ wr32(hw, TXGBE_GPIOEOI, TXGBE_GPIOBIT_3);
+ intr->flags |= TXGBE_FLAG_NEED_LINK_UPDATE;
+ }
+ if (reg & TXGBE_GPIOBIT_6) {
+ wr32(hw, TXGBE_GPIOEOI, TXGBE_GPIOBIT_6);
+ intr->flags |= TXGBE_FLAG_NEED_LINK_UPDATE;
+ }
+
+ wr32(hw, TXGBE_GPIOINTMASK, 0);
+}
+
static void
txgbe_dev_overheat(struct rte_eth_dev *dev)
{
@@ -2972,9 +3029,6 @@ txgbe_dev_interrupt_get_status(struct rte_eth_dev *dev,
rte_intr_type_get(intr_handle) != RTE_INTR_HANDLE_VFIO_MSIX)
wr32(hw, TXGBE_PX_INTA, 1);
- /* clear all cause mask */
- txgbe_disable_intr(hw);
-
/* read-on-clear nic registers here */
eicr = ((u32 *)hw->isb_mem)[TXGBE_ISB_MISC];
PMD_DRV_LOG(DEBUG, "eicr %x", eicr);
@@ -3000,6 +3054,8 @@ txgbe_dev_interrupt_get_status(struct rte_eth_dev *dev,
if (eicr & TXGBE_ICRMISC_HEAT)
intr->flags |= TXGBE_FLAG_OVERHEAT;
+ ((u32 *)hw->isb_mem)[TXGBE_ISB_MISC] = 0;
+
return 0;
}
@@ -3064,7 +3120,7 @@ txgbe_dev_interrupt_action(struct rte_eth_dev *dev,
}
if (intr->flags & TXGBE_FLAG_PHY_INTERRUPT) {
- hw->phy.handle_lasi(hw);
+ txgbe_dev_sfp_event(dev);
intr->flags &= ~TXGBE_FLAG_PHY_INTERRUPT;
}
--
2.27.0
next prev parent reply other threads:[~2023-01-18 6:05 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-18 6:00 [PATCH 0/8] Wangxun fixes and new supports Jiawen Wu
2023-01-18 6:00 ` [PATCH 1/8] net/txgbe: fix Rx buffer size in configure register Jiawen Wu
2023-01-27 15:36 ` Ferruh Yigit
2023-02-01 2:34 ` Jiawen Wu
2023-02-01 10:40 ` Ferruh Yigit
2023-01-18 6:00 ` [PATCH 2/8] net/txgbe: fix default signal quality value for KX/KX4 Jiawen Wu
2023-01-18 6:00 ` [PATCH 3/8] net/txgbe: fix packet type to parse from offload flags Jiawen Wu
2023-01-27 15:36 ` Ferruh Yigit
2023-02-01 3:14 ` Jiawen Wu
2023-02-01 10:41 ` Ferruh Yigit
2023-01-18 6:00 ` [PATCH 4/8] net/ngbe: " Jiawen Wu
2023-01-27 15:37 ` Ferruh Yigit
2023-01-18 6:00 ` [PATCH 5/8] net/ngbe: add spinlock protection on YT PHY Jiawen Wu
2023-01-18 6:00 ` [PATCH 6/8] net/ngbe: add chip overheat support Jiawen Wu
2023-01-18 6:00 ` [PATCH 7/8] net/txgbe: " Jiawen Wu
2023-01-18 6:00 ` Jiawen Wu [this message]
2023-01-27 15:38 ` [PATCH 8/8] net/txgbe: add SFP hot-plug identification support Ferruh Yigit
2023-02-02 9:21 ` [PATCH v2 00/10] Wangxun fixes and new supports Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 01/10] net/ngbe: fix Rx buffer size in configure register Jiawen Wu
2023-02-08 10:28 ` Ferruh Yigit
2023-02-09 9:00 ` Jiawen Wu
2023-02-14 8:15 ` Jiawen Wu
2023-02-14 9:55 ` Ferruh Yigit
2023-02-15 9:35 ` Ferruh Yigit
2023-02-15 10:09 ` Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 02/10] net/txgbe: " Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 03/10] net/txgbe: fix default signal quality value for KX/KX4 Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 04/10] net/txgbe: fix packet type to parse from offload flags Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 05/10] net/ngbe: " Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 06/10] net/ngbe: add spinlock protection on YT PHY Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 07/10] net/ngbe: add chip overheat support Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 08/10] net/txgbe: " Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 09/10] net/txgbe: fix interrupt loss Jiawen Wu
2023-02-02 9:21 ` [PATCH v2 10/10] net/txgbe: add SFP hot-plug identification support Jiawen Wu
2023-02-08 12:23 ` [PATCH v2 00/10] Wangxun fixes and new supports Ferruh Yigit
2023-02-15 2:00 ` [PATCH v3] net/txgbe: fix Rx buffer size in configure register Jiawen Wu
2023-02-15 10:24 ` Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230118060039.3074016-9-jiawenwu@trustnetic.com \
--to=jiawenwu@trustnetic.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).