[PATCH net-next v12 3/8] hinic3: Refactor channel state machine for dynamic queue configuration
From: Fan Gong <gongfan1@huawei.com>
Date: 2026-07-27 06:55:23
Also in:
linux-doc, lkml
Subsystem:
huawei 3rd gen ethernet driver, networking drivers, the rest · Maintainers:
Fan Gong, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Renames hinic3_uninit_qps() to hinic3_get_cur_qps(). Splits hinic3_open_channel() into hinic3_prepare_channel() and hinic3_open_channel(). Co-developed-by: Wu Di <redacted> Signed-off-by: Wu Di <redacted> Co-developed-by: Teng Peisen <redacted> Signed-off-by: Teng Peisen <redacted> Signed-off-by: Fan Gong <gongfan1@huawei.com> --- .../huawei/hinic3/hinic3_netdev_ops.c | 27 ++++++++++++++++--- .../ethernet/huawei/hinic3/hinic3_nic_io.c | 4 +-- .../ethernet/huawei/hinic3/hinic3_nic_io.h | 4 +-- 3 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/drivers/net/ethernet/huawei/hinic3/hinic3_netdev_ops.c b/drivers/net/ethernet/huawei/hinic3/hinic3_netdev_ops.c
index da73811641a9..def671abf064 100644
--- a/drivers/net/ethernet/huawei/hinic3/hinic3_netdev_ops.c
+++ b/drivers/net/ethernet/huawei/hinic3/hinic3_netdev_ops.c@@ -288,7 +288,8 @@ static void hinic3_free_channel_resources(struct net_device *netdev, hinic3_free_qps(nic_dev, qp_params); } -static int hinic3_open_channel(struct net_device *netdev) +static int hinic3_prepare_channel(struct net_device *netdev, + struct hinic3_dyna_txrxq_params *qp_params) { struct hinic3_nic_dev *nic_dev = netdev_priv(netdev); int err;
@@ -299,12 +300,25 @@ static int hinic3_open_channel(struct net_device *netdev) return err; } - err = hinic3_configure_txrxqs(netdev, &nic_dev->q_params); + err = hinic3_configure_txrxqs(netdev, qp_params); if (err) { netdev_err(netdev, "Failed to configure txrxqs\n"); goto err_free_qp_ctxts; } + return 0; + +err_free_qp_ctxts: + hinic3_free_qp_ctxts(nic_dev); + + return err; +} + +static int hinic3_open_channel(struct net_device *netdev) +{ + struct hinic3_nic_dev *nic_dev = netdev_priv(netdev); + int err; + err = hinic3_qps_irq_init(netdev); if (err) { netdev_err(netdev, "Failed to init txrxq irq\n");
@@ -321,6 +335,7 @@ static int hinic3_open_channel(struct net_device *netdev) err_uninit_qps_irq: hinic3_qps_irq_uninit(netdev); + err_free_qp_ctxts: hinic3_free_qp_ctxts(nic_dev);
@@ -458,6 +473,10 @@ static int hinic3_open(struct net_device *netdev) hinic3_init_qps(nic_dev, &qp_params); + err = hinic3_prepare_channel(netdev, &nic_dev->q_params); + if (err) + goto err_uninit_qps; + err = hinic3_open_channel(netdev); if (err) goto err_uninit_qps;
@@ -473,7 +492,7 @@ static int hinic3_open(struct net_device *netdev) err_close_channel: hinic3_close_channel(netdev); err_uninit_qps: - hinic3_uninit_qps(nic_dev, &qp_params); + hinic3_get_cur_qps(nic_dev, &qp_params); hinic3_free_channel_resources(netdev, &qp_params, &nic_dev->q_params); err_destroy_num_qps: hinic3_destroy_num_qps(netdev);
@@ -495,7 +514,7 @@ static int hinic3_close(struct net_device *netdev) hinic3_vport_down(netdev); hinic3_close_channel(netdev); - hinic3_uninit_qps(nic_dev, &qp_params); + hinic3_get_cur_qps(nic_dev, &qp_params); hinic3_free_channel_resources(netdev, &qp_params, &nic_dev->q_params); return 0;
diff --git a/drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.c b/drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.c
index 87e736adba02..0e7a0ccfba98 100644
--- a/drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.c
+++ b/drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.c@@ -484,8 +484,8 @@ void hinic3_init_qps(struct hinic3_nic_dev *nic_dev, } } -void hinic3_uninit_qps(struct hinic3_nic_dev *nic_dev, - struct hinic3_dyna_qp_params *qp_params) +void hinic3_get_cur_qps(struct hinic3_nic_dev *nic_dev, + struct hinic3_dyna_qp_params *qp_params) { struct hinic3_nic_io *nic_io = nic_dev->nic_io;
diff --git a/drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.h b/drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.h
index 12eefabcf1db..cd33f197216f 100644
--- a/drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.h
+++ b/drivers/net/ethernet/huawei/hinic3/hinic3_nic_io.h@@ -136,8 +136,8 @@ void hinic3_free_qps(struct hinic3_nic_dev *nic_dev, struct hinic3_dyna_qp_params *qp_params); void hinic3_init_qps(struct hinic3_nic_dev *nic_dev, struct hinic3_dyna_qp_params *qp_params); -void hinic3_uninit_qps(struct hinic3_nic_dev *nic_dev, - struct hinic3_dyna_qp_params *qp_params); +void hinic3_get_cur_qps(struct hinic3_nic_dev *nic_dev, + struct hinic3_dyna_qp_params *qp_params); int hinic3_init_qp_ctxts(struct hinic3_nic_dev *nic_dev); void hinic3_free_qp_ctxts(struct hinic3_nic_dev *nic_dev);
--
2.54.0