summaryrefslogtreecommitdiff
path: root/drivers/infiniband
diff options
context:
space:
mode:
authorJunxian Huang <huangjunxian6@hisilicon.com>2025-11-12 17:35:10 +0800
committerLeon Romanovsky <leon@kernel.org>2025-11-24 02:58:30 -0500
commitd70f30cef2dfa65757d8146d6d0524b6872e9845 (patch)
treee46266cc02ceb5e8fd015551fbfb13d0cbac4cc9 /drivers/infiniband
parente72d274f8f5b9912c8e6590004a470a1ad8f4983 (diff)
RDMA/hns: Support reset recovery for bond
Re-set bond configuration to HW after HW reset. Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com> Link: https://patch.msgid.link/20251112093510.3696363-9-huangjunxian6@hisilicon.com Signed-off-by: Leon Romanovsky <leon@kernel.org>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r--drivers/infiniband/hw/hns/hns_roce_bond.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/hns/hns_roce_bond.c b/drivers/infiniband/hw/hns/hns_roce_bond.c
index 0604ee55011e..cc85f3ce1f3e 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);
}