From: Junxian Huang Date: Wed, 12 Nov 2025 09:35:10 +0000 (+0800) Subject: RDMA/hns: Support reset recovery for bond X-Git-Tag: v6.19-rc1~130^2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d70f30cef2dfa65757d8146d6d0524b6872e9845;p=thirdparty%2Fkernel%2Flinux.git RDMA/hns: Support reset recovery for bond Re-set bond configuration to HW after HW reset. Signed-off-by: Junxian Huang Link: https://patch.msgid.link/20251112093510.3696363-9-huangjunxian6@hisilicon.com Signed-off-by: Leon Romanovsky --- diff --git a/drivers/infiniband/hw/hns/hns_roce_bond.c b/drivers/infiniband/hw/hns/hns_roce_bond.c index 0604ee55011e9..cc85f3ce1f3e3 100644 --- a/drivers/infiniband/hw/hns/hns_roce_bond.c +++ b/drivers/infiniband/hw/hns/hns_roce_bond.c @@ -160,6 +160,15 @@ static void hns_roce_bond_get_active_slave(struct hns_roce_bond_group *bond_grp) bond_grp->active_slave_map = active_slave_map; } +static int hns_roce_recover_bond(struct hns_roce_bond_group *bond_grp, + struct hns_roce_dev *hr_dev) +{ + bond_grp->main_hr_dev = hr_dev; + hns_roce_bond_get_active_slave(bond_grp); + + return hns_roce_cmd_bond(bond_grp, HNS_ROCE_SET_BOND); +} + static void hns_roce_slave_uninit(struct hns_roce_bond_group *bond_grp, u8 func_idx) { @@ -918,11 +927,22 @@ void hns_roce_dealloc_bond_grp(void) int hns_roce_bond_init(struct hns_roce_dev *hr_dev) { struct net_device *net_dev = get_hr_netdev(hr_dev, 0); + struct hns_roce_v2_priv *priv = hr_dev->priv; struct hns_roce_bond_group *bond_grp; u8 bus_num = get_hr_bus_num(hr_dev); + int ret; bond_grp = hns_roce_get_bond_grp(net_dev, bus_num); + if (priv->handle->rinfo.reset_state == HNS_ROCE_STATE_RST_INIT) { + ret = hns_roce_recover_bond(bond_grp, hr_dev); + if (ret) { + dev_err(hr_dev->dev, + "failed to recover RoCE bond, ret = %d.\n", ret); + return ret; + } + } + return hns_roce_set_bond_netdev(bond_grp, hr_dev); }