From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 0A5104649D; Fri, 28 Mar 2025 06:16:53 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id D569540B8F; Fri, 28 Mar 2025 06:15:28 +0100 (CET) Received: from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166]) by mails.dpdk.org (Postfix) with ESMTP id F0CCB40A70 for ; Fri, 28 Mar 2025 06:15:25 +0100 (CET) X-QQ-mid: bizesmtpsz12t1743138919t93mac X-QQ-Originating-IP: ryh5UxzRxV8913p733egaZ1kclwY15xTT5E99ZL9iVE= Received: from steven.localdomain ( [103.233.162.252]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 28 Mar 2025 13:15:18 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 16372285498097967510 EX-QQ-RecipientCnt: 5 From: Wenbo Cao To: thomas@monjalon.net Cc: stephen@networkplumber.org, dev@dpdk.org, yaojun@mucse.com, Wenbo Cao Subject: [PATCH v17 13/29] net/rnp: add support link setup operations Date: Fri, 28 Mar 2025 05:14:28 +0000 Message-Id: <20250328051444.1019208-14-caowenbo@mucse.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20250328051444.1019208-1-caowenbo@mucse.com> References: <20250328051444.1019208-1-caowenbo@mucse.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtpsz:mucse.com:qybglogicsvrgz:qybglogicsvrgz5a-0 X-QQ-XMAILINFO: NWzrnUT2t5vtAFAxBzVmUdn8XtFIGj0iTpg+mm1GjFa3zoo6hSw4ItTy glvgHhE8QY6lqs+KBC2LYLa8NV3517/UOTJUo+qi2zQH5YARYDVlnICAmT5msK4GiP/3OdG cgmZUW6z+DEbRvzCVSGVIlDgx5X0SIntkKihxulqX8Ce47nu9+Y1dY4Zaa9nv0seYl33UG2 qb6jF2YkRD50UkimJK0TizWD0hptvGejX4bXk0LRKHn5y0i38q9YRP7C5V5xljizSnBW9MG lu8/5tJl2zXavnv02AETo9TjiarYcvOzqDwUHrNIPFORaDyPqChVuAHE1r1e0sCjAkf6uGz 8bk03VHvvVizC1aV6gqLlyK5FbI4jfZZqG/M2sX4dtWNM8RcEUjsHTDDqY4P2Y8+LRf5NNC lFKDy8RhO1aj07qbyClGHqamXy1BuoJSrJ0Yv0q3CW+3u7CAkuzlV0/J12PGJHmlS3yDfCs QjYoebGGrhkDuh8e2zOkniz4X0bSACvczoWIG7Los1rvY911XSMouhPW8II4CWG/f+PmJG5 f4pr10YE0uCMMTngihBk+sDg06lIxnE6MwYosMuQNG0xWbiuoThCEir1BXnBBpq8jWlOwtA bs9EkAOR8VcfQZgWjbXY03ei/3LCqUyhTltEcqZVhoix0N7lmvzx/gh554UR2vOKEQ4mRBx ie0djA6MiHTBP5NircptmWAi9AMESDV2wxS5SCPMSNMKMbYajjLg+NDZDhCIHH3uufeo2VU BtF9LbDB4oxqWVhvvKbI5fee48LKGMsKVrlHwWJOmx8x9a2C6uidE0fMWK+l/jpG0qcrlYt hwssf5qN+dH7++Xq1GTOlKORBx9sDSG/7EeWuXhegpqFnf5hZG3lGGUPv4zXPubmMuy9Mry AHx4oaMsjtAseMQDaqznbejJIUzX1yEc2ct27JUBi4Za3Q6s0uOrRizqaGalx8rBoycvtP/ RRUKafqAMyGoFuqvRq6/4iX0vbwRhdids20RjloHV7Wkfppfovi8qxYZ4X6zoR0Vn29yaaT 9IsDjAsdG47wkLXCgCKpWDqQSln7XIYFwF4i4MhcyGBXgCdPv3NnPUwK9w+vk3HtleySy7Z g== X-QQ-XMRINFO: MSVp+SPm3vtS1Vd6Y4Mggwc= 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 add set link_down/link_up implement Signed-off-by: Wenbo Cao --- doc/guides/nics/rnp.rst | 2 + drivers/net/rnp/base/rnp_eth_regs.h | 3 + drivers/net/rnp/base/rnp_fw_cmd.c | 22 +++++++ drivers/net/rnp/base/rnp_fw_cmd.h | 6 ++ drivers/net/rnp/base/rnp_mbx_fw.c | 33 ++++++++++ drivers/net/rnp/base/rnp_mbx_fw.h | 1 + drivers/net/rnp/rnp_ethdev.c | 10 ++- drivers/net/rnp/rnp_link.c | 97 +++++++++++++++++++++++++++++ drivers/net/rnp/rnp_link.h | 2 + 9 files changed, 175 insertions(+), 1 deletion(-) diff --git a/doc/guides/nics/rnp.rst b/doc/guides/nics/rnp.rst index 4d4f3ebffe..8677b6c775 100644 --- a/doc/guides/nics/rnp.rst +++ b/doc/guides/nics/rnp.rst @@ -78,6 +78,8 @@ Listed below are the rte_eth functions supported: * ``rte_eth_dev_rss_hash_update`` * ``rte_eth_dev_rss_reta_query`` * ``rte_eth_dev_rss_reta_update`` +* ``rte_eth_dev_set_link_down`` +* ``rte_eth_dev_set_link_up`` * ``rte_eth_promiscuous_disable`` * ``rte_eth_promiscuous_enable`` * ``rte_eth_allmulticast_enable`` diff --git a/drivers/net/rnp/base/rnp_eth_regs.h b/drivers/net/rnp/base/rnp_eth_regs.h index be7ed5b886..c74886e70c 100644 --- a/drivers/net/rnp/base/rnp_eth_regs.h +++ b/drivers/net/rnp/base/rnp_eth_regs.h @@ -5,6 +5,9 @@ #ifndef _RNP_ETH_REGS_H #define _RNP_ETH_REGS_H +#define RNP_ETH_TX_FIFO_STATE _ETH_(0x0330) +#define RNP_ETH_TX_FIFO_EMPT(lane) ((1 << (lane)) | (1 << ((lane) + 4))) + #define RNP_E_ENG_BYPASS _ETH_(0x8000) #define RNP_E_VXLAN_PARSE_EN _ETH_(0x8004) #define RNP_E_FILTER_EN _ETH_(0x801c) diff --git a/drivers/net/rnp/base/rnp_fw_cmd.c b/drivers/net/rnp/base/rnp_fw_cmd.c index a4a2171868..ed0eddfd1f 100644 --- a/drivers/net/rnp/base/rnp_fw_cmd.c +++ b/drivers/net/rnp/base/rnp_fw_cmd.c @@ -107,6 +107,25 @@ rnp_build_lane_evet_mask(struct rnp_mbx_fw_cmd_req *req, arg->event_en = req_arg->param2; } +static void +rnp_build_ifup_down(struct rnp_mbx_fw_cmd_req *req, + struct rnp_fw_req_arg *req_arg, + void *cookie) +{ + struct rnp_ifup_down_req *arg = + (struct rnp_ifup_down_req *)req->data; + + req->flags = 0; + req->opcode = RNP_IFUP_DOWN; + req->datalen = sizeof(*arg); + req->cookie = cookie; + req->reply_lo = 0; + req->reply_hi = 0; + + arg->nr_lane = req_arg->param0; + arg->up = req_arg->param1; +} + int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req, struct rnp_fw_req_arg *arg, void *cookie) @@ -132,6 +151,9 @@ int rnp_build_fwcmd_req(struct rnp_mbx_fw_cmd_req *req, case RNP_SET_LANE_EVENT_EN: rnp_build_lane_evet_mask(req, arg, cookie); break; + case RNP_IFUP_DOWN: + rnp_build_ifup_down(req, arg, cookie); + break; default: err = -EOPNOTSUPP; } diff --git a/drivers/net/rnp/base/rnp_fw_cmd.h b/drivers/net/rnp/base/rnp_fw_cmd.h index 6c6fd1803e..26db07ad36 100644 --- a/drivers/net/rnp/base/rnp_fw_cmd.h +++ b/drivers/net/rnp/base/rnp_fw_cmd.h @@ -309,6 +309,12 @@ struct rnp_link_stat_req { struct rnp_port_stat states[RNP_MAX_PORT_OF_PF]; }; +struct rnp_ifup_down_req { + u32 nr_lane; + u32 up; + u8 rsvd[24]; +}; + struct rnp_mbx_fw_cmd_req { u16 flags; u16 opcode; diff --git a/drivers/net/rnp/base/rnp_mbx_fw.c b/drivers/net/rnp/base/rnp_mbx_fw.c index c7e3b6819d..3e7cf7f9ad 100644 --- a/drivers/net/rnp/base/rnp_mbx_fw.c +++ b/drivers/net/rnp/base/rnp_mbx_fw.c @@ -460,3 +460,36 @@ rnp_rcv_msg_from_fw(struct rnp_eth_adapter *adapter, u32 *msgbuf) return 0; } + +static void rnp_link_stat_reset(struct rnp_hw *hw, u16 lane) +{ + u32 state; + + spin_lock(&hw->link_sync); + state = RNP_E_REG_RD(hw, RNP_FW_LINK_SYNC); + state &= ~RNP_LINK_MAGIC_MASK; + state |= RNP_LINK_MAGIC_CODE; + state &= ~RTE_BIT32(lane); + + RNP_E_REG_WR(hw, RNP_FW_LINK_SYNC, state); + rte_spinlock_unlock(&hw->link_sync); +} + +int rnp_mbx_fw_ifup_down(struct rnp_eth_port *port, bool up) +{ + u16 nr_lane = port->attr.nr_lane; + struct rnp_hw *hw = port->hw; + struct rnp_fw_req_arg arg; + int err; + + memset(&arg, 0, sizeof(arg)); + arg.opcode = RNP_IFUP_DOWN; + arg.param0 = nr_lane; + arg.param1 = up; + + err = rnp_fw_send_norep_cmd(port, &arg); + /* force firmware send irq event to dpdk */ + if (!err && up) + rnp_link_stat_reset(hw, nr_lane); + return err; +} diff --git a/drivers/net/rnp/base/rnp_mbx_fw.h b/drivers/net/rnp/base/rnp_mbx_fw.h index 159a0237be..397d2ec8c4 100644 --- a/drivers/net/rnp/base/rnp_mbx_fw.h +++ b/drivers/net/rnp/base/rnp_mbx_fw.h @@ -19,5 +19,6 @@ int rnp_fw_init(struct rnp_hw *hw); int rnp_rcv_msg_from_fw(struct rnp_eth_adapter *adapter, u32 *msgbuf); int rnp_fw_mbx_ifup_down(struct rnp_eth_port *port, int up); int rnp_mbx_fw_lane_link_event_en(struct rnp_eth_port *port, bool en); +int rnp_mbx_fw_ifup_down(struct rnp_eth_port *port, bool up); #endif /* _RNP_MBX_FW_H_ */ diff --git a/drivers/net/rnp/rnp_ethdev.c b/drivers/net/rnp/rnp_ethdev.c index 2a13bf8c96..4f82c08d28 100644 --- a/drivers/net/rnp/rnp_ethdev.c +++ b/drivers/net/rnp/rnp_ethdev.c @@ -325,9 +325,14 @@ static int rnp_dev_start(struct rte_eth_dev *eth_dev) if (ret) goto rxq_start_failed; rnp_mac_init(eth_dev); - rnp_mbx_fw_lane_link_event_en(port, lsc); + ret = rnp_mbx_fw_lane_link_event_en(port, lsc); + if (ret < 0) + goto rxq_start_failed; if (!lsc) rnp_run_link_poll_task(port); + ret = rnp_dev_set_link_up(eth_dev); + if (ret < 0) + goto rxq_start_failed; /* enable eth rx flow */ RNP_RX_ETH_ENABLE(hw, lane); port->port_stopped = 0; @@ -415,6 +420,7 @@ static int rnp_dev_stop(struct rte_eth_dev *eth_dev) /* clear the recorded link status */ memset(&link, 0, sizeof(link)); rte_eth_linkstatus_set(eth_dev, &link); + rnp_dev_set_link_down(eth_dev); ret = rnp_disable_all_tx_queue(eth_dev); if (ret < 0) { RNP_PMD_ERR("port[%u] disable tx queue failed", data->port_id); @@ -665,6 +671,8 @@ static const struct eth_dev_ops rnp_eth_dev_ops = { .rss_hash_conf_get = rnp_dev_rss_hash_conf_get, /* link impl */ .link_update = rnp_dev_link_update, + .dev_set_link_up = rnp_dev_set_link_up, + .dev_set_link_down = rnp_dev_set_link_down, }; static void diff --git a/drivers/net/rnp/rnp_link.c b/drivers/net/rnp/rnp_link.c index da8d84ba9b..7393bc1448 100644 --- a/drivers/net/rnp/rnp_link.c +++ b/drivers/net/rnp/rnp_link.c @@ -337,3 +337,100 @@ rnp_cancel_link_poll_task(struct rnp_eth_port *port) { rte_eal_alarm_cancel(rnp_dev_link_task, port->eth_dev); } + +int rnp_dev_set_link_up(struct rte_eth_dev *eth_dev) +{ + struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev); + uint16_t nr_lane = port->attr.nr_lane; + struct rnp_hw *hw = port->hw; + struct rnp_rx_queue *rxq; + uint16_t timeout; + uint16_t index; + uint32_t state; + uint16_t idx; + int ret = 0; + + PMD_INIT_FUNC_TRACE(); + + if (port->attr.link_ready) + return 0; + /* Cur link-state Is Down Verity The Rx Dma Queue State Is Empty */ + for (idx = 0; idx < eth_dev->data->nb_rx_queues; idx++) { + rxq = eth_dev->data->rx_queues[idx]; + if (!rxq) + continue; + index = rxq->attr.index; + timeout = 0; + do { + if (!RNP_E_REG_RD(hw, RNP_RXQ_READY(index))) + break; + rte_delay_us(10); + timeout++; + } while (timeout < 1000); + } + ret = rnp_mbx_fw_ifup_down(port, TRUE); + if (ret) { + RNP_PMD_WARN("port[%d] is set linkup failed", + eth_dev->data->port_id); + return ret; + } + timeout = 0; + do { + rte_io_rmb(); + state = RNP_E_REG_RD(hw, RNP_FW_LINK_SYNC); + if (state & RTE_BIT32(nr_lane)) + break; + timeout++; + rte_delay_us(10); + } while (timeout < 100); + + return ret; +} + +int rnp_dev_set_link_down(struct rte_eth_dev *eth_dev) +{ + struct rnp_eth_port *port = RNP_DEV_TO_PORT(eth_dev); + uint16_t nr_lane = port->attr.nr_lane; + struct rnp_hw *hw = port->hw; + struct rnp_tx_queue *txq; + uint32_t timeout = 0; + uint32_t check_v; + uint32_t state; + uint16_t idx; + + PMD_INIT_FUNC_TRACE(); + RNP_RX_ETH_DISABLE(hw, nr_lane); + for (idx = 0; idx < eth_dev->data->nb_tx_queues; idx++) { + txq = eth_dev->data->tx_queues[idx]; + if (!txq) + continue; + txq->tx_link = false; + } + /* 2 Check eth tx fifo empty state */ + do { + state = RNP_E_REG_RD(hw, RNP_ETH_TX_FIFO_STATE); + check_v = RNP_ETH_TX_FIFO_EMPT(nr_lane); + state &= check_v; + if (state == check_v) + break; + rte_delay_us(10); + timeout++; + if (timeout >= 1000) { + RNP_PMD_WARN("lane[%d] isn't empty of link-down action", + nr_lane); + break; + } + } while (1); + /* 3 Tell Firmware Do Link-down Event Work */ + rnp_mbx_fw_ifup_down(port, FALSE); + /* 4 Wait For Link-Down that Firmware Do done */ + timeout = 0; + do { + if (!port->attr.link_ready) + break; + rte_delay_us(10); + timeout++; + } while (timeout < 2000); + + return 0; +} diff --git a/drivers/net/rnp/rnp_link.h b/drivers/net/rnp/rnp_link.h index e59b7bf120..2ed4fe5fe2 100644 --- a/drivers/net/rnp/rnp_link.h +++ b/drivers/net/rnp/rnp_link.h @@ -46,5 +46,7 @@ int rnp_dev_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete); void rnp_run_link_poll_task(struct rnp_eth_port *port); void rnp_cancel_link_poll_task(struct rnp_eth_port *port); +int rnp_dev_set_link_up(struct rte_eth_dev *eth_dev); +int rnp_dev_set_link_down(struct rte_eth_dev *eth_dev); #endif /* _RNP_LINK_H_ */ -- 2.25.1