Files
kernel/kernel-modules/intel-i40e/files/i40e-Enable-getting-link-status-from-VF.patch
Babak Sarashki 71eeead3cd Driver work: ice iavf and i40e in support of E810
Add ice driver (version 1.2.1) and upgrade iavf driver to
version 4.0.1.

The iavf upgrade to 4.0.1 requires upreving the i40e driver
to version 2.14.13 for compatibility.

Story: 2008436
Task: 41398

Signed-off-by: Babak Sarashki <babak.sarashki@windriver.com>
Change-Id: I80c29626360ad4d30798b982909cdba1dbd969e1
2021-02-24 22:08:29 +00:00

134 lines
4.5 KiB
Diff

From 647a8819680fb79b0416d0883096e49cc746db0e Mon Sep 17 00:00:00 2001
From: Steven Webster <steven.webster@windriver.com>
Date: Thu, 25 Jun 2020 11:23:05 -0400
Subject: [PATCH] From b8c666367cd98a2b0033c043f6f206abd8e238a6 Mon Sep 17
00:00:00 2001 Message-Id:
<b8c666367cd98a2b0033c043f6f206abd8e238a6.1572295393.git.Jim.Somerville@windriver.com>
From: Vadim Suraev <vsuraev@northforgeinc.com> Date: Mon, 8 Feb 2016 15:57:30
-0500 Subject: [PATCH 1/2] i40e: Enable getting link status from VF
Add handling of custom OP code sent from the PMD VF to get link status via the
virtual channel interface.
Signed-off-by: Allain Legacy <allain.legacy@windriver.com>
Signed-off-by: eric zhang <eric.zhang@windriver.com>
Signed-off-by: Jim Somerville <Jim.Somerville@windriver.com>
Signed-off-by: Steven Webster <Steven.Webster@windriver.com>
Signed-off-by: Babak Sarashki <babak.sarashki@windriver.com>
---
src/i40e_virtchnl_pf.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++
src/virtchnl.h | 1 +
2 files changed, 79 insertions(+)
diff --git a/src/i40e_virtchnl_pf.c b/src/i40e_virtchnl_pf.c
index b7325d0..0542c92 100644
--- a/src/i40e_virtchnl_pf.c
+++ b/src/i40e_virtchnl_pf.c
@@ -3198,6 +3198,81 @@ err_out:
aq_ret);
}
+struct i40e_eth_link {
+ uint16_t link_speed; /**< ETH_LINK_SPEED_[10, 100, 1000, 10000] */
+ uint16_t link_duplex; /**< ETH_LINK_[HALF_DUPLEX, FULL_DUPLEX] */
+ uint8_t link_status : 1; /**< 1 -> link up, 0 -> link down */
+}__attribute__((aligned(8)));
+
+#define ETH_LINK_SPEED_AUTONEG 0 /**< Auto-negotiate link speed. */
+#define ETH_LINK_SPEED_10 10 /**< 10 megabits/second. */
+#define ETH_LINK_SPEED_100 100 /**< 100 megabits/second. */
+#define ETH_LINK_SPEED_1000 1000 /**< 1 gigabits/second. */
+#define ETH_LINK_SPEED_10000 10000 /**< 10 gigabits/second. */
+#define ETH_LINK_SPEED_10G 10000 /**< alias of 10 gigabits/second. */
+#define ETH_LINK_SPEED_20G 20000 /**< 20 gigabits/second. */
+#define ETH_LINK_SPEED_40G 40000 /**< 40 gigabits/second. */
+
+#define ETH_LINK_AUTONEG_DUPLEX 0 /**< Auto-negotiate duplex. */
+#define ETH_LINK_HALF_DUPLEX 1 /**< Half-duplex connection. */
+#define ETH_LINK_FULL_DUPLEX 2 /**< Full-duplex connection. */
+
+static void
+i40e_vc_get_link_status(struct i40e_vf *vf)
+{
+ struct i40e_pf *pf = vf->pf;
+ struct i40e_hw *hw;
+ i40e_status aq_ret = I40E_SUCCESS;
+ i40e_status status;
+ struct i40e_eth_link eth_link;
+ bool new_link;
+
+ if (!test_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states) ||
+ !test_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps)) {
+ aq_ret = I40E_ERR_PARAM;
+ goto error_param;
+ }
+ hw = &pf->hw;
+
+ /* set this to force the get_link_status call to refresh state */
+ pf->hw.phy.get_link_info = true;
+
+ status = i40e_get_link_status(&pf->hw, &new_link);
+ if (status != I40E_SUCCESS) {
+ dev_dbg(&pf->pdev->dev, "couldn't get link state, status: %d\n",
+ status);
+ aq_ret = I40E_ERR_INVALID_LINK_SETTINGS;
+ goto error_param;
+ }
+
+ /* Update link status first to acquire latest link change */
+ eth_link.link_status = new_link ? 1 : 0;
+
+ switch(hw->phy.link_info.link_speed) {
+ case I40E_LINK_SPEED_40GB:
+ eth_link.link_speed = ETH_LINK_SPEED_40G;
+ break;
+ case I40E_LINK_SPEED_10GB:
+ eth_link.link_speed = ETH_LINK_SPEED_10G;
+ break;
+ case I40E_LINK_SPEED_1GB:
+ eth_link.link_speed = ETH_LINK_SPEED_1000;
+ break;
+ case I40E_LINK_SPEED_100MB:
+ eth_link.link_speed = ETH_LINK_SPEED_100;
+ break;
+ default:
+ eth_link.link_speed = ETH_LINK_SPEED_AUTONEG;
+ break;
+ }
+ eth_link.link_duplex = ETH_LINK_FULL_DUPLEX;/* always */
+
+error_param:
+ i40e_vc_send_msg_to_vf(vf, VIRTCHNL_OP_GET_LINK_STAT,
+ aq_ret, (uint8_t *)&eth_link,
+ sizeof(eth_link));
+}
+
/**
* i40e_vc_config_queues_msg
* @vf: pointer to the VF info
@@ -5065,6 +5140,9 @@ int i40e_vc_process_vf_msg(struct i40e_pf *pf, s16 vf_id, u32 v_opcode,
case VIRTCHNL_OP_REQUEST_QUEUES:
ret = i40e_vc_request_queues_msg(vf, msg);
break;
+ case VIRTCHNL_OP_GET_LINK_STAT:
+ i40e_vc_get_link_status(vf);
+ break;
#ifdef __TC_MQPRIO_MODE_MAX
case VIRTCHNL_OP_ENABLE_CHANNELS:
ret = i40e_vc_add_qch_msg(vf, msg);
diff --git a/src/virtchnl.h b/src/virtchnl.h
index 4db8bf4..b72f679 100644
--- a/src/virtchnl.h
+++ b/src/virtchnl.h
@@ -132,6 +132,7 @@ enum virtchnl_ops {
/* opcodes 39, 40, 41, 42 and 43 are reserved */
/* opcode 44 is reserved */
/* opcode 45, 46, 47, 48 and 49 are reserved */
+ VIRTCHNL_OP_GET_LINK_STAT = 0x101,
VIRTCHNL_OP_MAX,
};
--
1.8.3.1