Michal Suchanek ee8f7f
From 334c4241472916851d97aae209aedf1927ec84e3 Mon Sep 17 00:00:00 2001
Michal Suchanek ee8f7f
From: Lijun Pan <lijunp213@gmail.com>
Michal Suchanek ee8f7f
Date: Tue, 13 Apr 2021 03:31:44 -0500
Michal Suchanek ee8f7f
Subject: [PATCH] ibmvnic: improve failover sysfs entry
Michal Suchanek ee8f7f
Michal Suchanek ee8f7f
References: bsc#1043990 ltc#155681 git-fixes
Michal Suchanek ee8f7f
Patch-mainline: v5.13-rc1
Michal Suchanek ee8f7f
Git-commit: 334c4241472916851d97aae209aedf1927ec84e3
Michal Suchanek ee8f7f
Michal Suchanek ee8f7f
The current implementation relies on H_IOCTL call to issue a
Michal Suchanek ee8f7f
H_SESSION_ERR_DETECTED command to let the hypervisor to send a failover
Michal Suchanek ee8f7f
signal. However, it may not work if there is no backup device or if
Michal Suchanek ee8f7f
the vnic is already in error state,
Michal Suchanek ee8f7f
e.g., "ibmvnic 30000003 env3: rx buffer returned with rc 6".
Michal Suchanek ee8f7f
Add a last resort, that is to schedule a failover reset via CRQ command.
Michal Suchanek ee8f7f
Michal Suchanek ee8f7f
Signed-off-by: Lijun Pan <lijunp213@gmail.com>
Michal Suchanek ee8f7f
Signed-off-by: David S. Miller <davem@davemloft.net>
Michal Suchanek ee8f7f
Acked-by: Michal Suchanek <msuchanek@suse.de>
Michal Suchanek ee8f7f
---
Michal Suchanek ee8f7f
 drivers/net/ethernet/ibm/ibmvnic.c | 14 ++++++++------
Michal Suchanek ee8f7f
 1 file changed, 8 insertions(+), 6 deletions(-)
Michal Suchanek ee8f7f
Michal Suchanek ee8f7f
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
Michal Suchanek ee8f7f
index ee9bf18c597f..0961d36833d5 100644
Michal Suchanek ee8f7f
--- a/drivers/net/ethernet/ibm/ibmvnic.c
Michal Suchanek ee8f7f
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
Michal Suchanek ee8f7f
@@ -5503,7 +5503,7 @@ static ssize_t failover_store(struct device *dev, struct device_attribute *attr,
Michal Suchanek ee8f7f
 	if (rc) {
Michal Suchanek ee8f7f
 		netdev_err(netdev, "Couldn't retrieve session token, rc %ld\n",
Michal Suchanek ee8f7f
 			   rc);
Michal Suchanek ee8f7f
-		return -EINVAL;
Michal Suchanek ee8f7f
+		goto last_resort;
Michal Suchanek ee8f7f
 	}
Michal Suchanek ee8f7f
 
Michal Suchanek ee8f7f
 	session_token = (__be64)retbuf[0];
Michal Suchanek ee8f7f
@@ -5511,15 +5511,17 @@ static ssize_t failover_store(struct device *dev, struct device_attribute *attr,
Michal Suchanek ee8f7f
 		   be64_to_cpu(session_token));
Michal Suchanek ee8f7f
 	rc = plpar_hcall_norets(H_VIOCTL, adapter->vdev->unit_address,
Michal Suchanek ee8f7f
 				H_SESSION_ERR_DETECTED, session_token, 0, 0);
Michal Suchanek ee8f7f
-	if (rc) {
Michal Suchanek ee8f7f
-		netdev_err(netdev, "Client initiated failover failed, rc %ld\n",
Michal Suchanek ee8f7f
+	if (rc)
Michal Suchanek ee8f7f
+		netdev_err(netdev,
Michal Suchanek ee8f7f
+			   "H_VIOCTL initiated failover failed, rc %ld\n",
Michal Suchanek ee8f7f
 			   rc);
Michal Suchanek ee8f7f
-		return -EINVAL;
Michal Suchanek ee8f7f
-	}
Michal Suchanek ee8f7f
+
Michal Suchanek ee8f7f
+last_resort:
Michal Suchanek ee8f7f
+	netdev_dbg(netdev, "Trying to send CRQ_CMD, the last resort\n");
Michal Suchanek ee8f7f
+	ibmvnic_reset(adapter, VNIC_RESET_FAILOVER);
Michal Suchanek ee8f7f
 
Michal Suchanek ee8f7f
 	return count;
Michal Suchanek ee8f7f
 }
Michal Suchanek ee8f7f
-
Michal Suchanek ee8f7f
 static DEVICE_ATTR_WO(failover);
Michal Suchanek ee8f7f
 
Michal Suchanek ee8f7f
 static unsigned long ibmvnic_get_desired_dma(struct vio_dev *vdev)
Michal Suchanek ee8f7f
-- 
Michal Suchanek ee8f7f
2.26.2
Michal Suchanek ee8f7f