| From 7d55051c5318d8861d7658e2f3c4f4a97bb8cd4f Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 4 Apr 2022 11:35:47 -0700 |
| Subject: ice: Set txq_teid to ICE_INVAL_TEID on ring creation |
| |
| From: Anatolii Gerasymenko <anatolii.gerasymenko@intel.com> |
| |
| [ Upstream commit ccfee1822042b87e5135d33cad8ea353e64612d2 ] |
| |
| When VF is freshly created, but not brought up, ring->txq_teid |
| value is by default set to 0. |
| But 0 is a valid TEID. On some platforms the Root Node of |
| Tx scheduler has a TEID = 0. This can cause issues as shown below. |
| |
| The proper way is to set ring->txq_teid to ICE_INVAL_TEID (0xFFFFFFFF). |
| |
| Testing Hints: |
| echo 1 > /sys/class/net/ens785f0/device/sriov_numvfs |
| ip link set dev ens785f0v0 up |
| ip link set dev ens785f0v0 down |
| |
| If we have freshly created VF and quickly turn it on and off, so there |
| would be no time to reach VIRTCHNL_OP_CONFIG_VSI_QUEUES stage, then |
| VIRTCHNL_OP_DISABLE_QUEUES stage will fail with error: |
| [ 639.531454] disable queue 89 failed 14 |
| [ 639.532233] Failed to disable LAN Tx queues, error: ICE_ERR_AQ_ERROR |
| [ 639.533107] ice 0000:02:00.0: Failed to stop Tx ring 0 on VSI 5 |
| |
| The reason for the fail is that we are trying to send AQ command to |
| delete queue 89, which has never been created and receive an "invalid |
| argument" error from firmware. |
| |
| As this queue has never been created, it's teid and ring->txq_teid |
| have default value 0. |
| ice_dis_vsi_txq has a check against non-existent queues: |
| |
| node = ice_sched_find_node_by_teid(pi->root, q_teids[i]); |
| if (!node) |
| continue; |
| |
| But on some platforms the Root Node of Tx scheduler has a teid = 0. |
| Hence, ice_sched_find_node_by_teid finds a node with teid = 0 (it is |
| pi->root), and we go further to submit an erroneous request to firmware. |
| |
| Fixes: 37bb83901286 ("ice: Move common functions out of ice_main.c part 7/7") |
| Signed-off-by: Anatolii Gerasymenko <anatolii.gerasymenko@intel.com> |
| Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> |
| Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com> |
| Signed-off-by: Alice Michael <alice.michael@intel.com> |
| Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> |
| Signed-off-by: Paolo Abeni <pabeni@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/intel/ice/ice_lib.c | 1 + |
| 1 file changed, 1 insertion(+) |
| |
| diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c |
| index e39e299e79a4..a3514a5e067a 100644 |
| --- a/drivers/net/ethernet/intel/ice/ice_lib.c |
| +++ b/drivers/net/ethernet/intel/ice/ice_lib.c |
| @@ -1409,6 +1409,7 @@ static int ice_vsi_alloc_rings(struct ice_vsi *vsi) |
| ring->tx_tstamps = &pf->ptp.port.tx; |
| ring->dev = dev; |
| ring->count = vsi->num_tx_desc; |
| + ring->txq_teid = ICE_INVAL_TEID; |
| WRITE_ONCE(vsi->tx_rings[i], ring); |
| } |
| |
| -- |
| 2.35.1 |
| |