You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
179 lines
6.5 KiB
179 lines
6.5 KiB
4 years ago
|
From 4e8d6fa65af502f450f0b460aa34934727bed4e9 Mon Sep 17 00:00:00 2001
|
||
|
From: Alaa Hleihel <ahleihel@redhat.com>
|
||
|
Date: Tue, 12 May 2020 10:54:22 -0400
|
||
|
Subject: [PATCH 155/312] [netdrv] net/mlx5e: Reset RQ doorbell counter before
|
||
|
moving RQ state from RST to RDY
|
||
|
|
||
|
Message-id: <20200512105530.4207-57-ahleihel@redhat.com>
|
||
|
Patchwork-id: 306929
|
||
|
Patchwork-instance: patchwork
|
||
|
O-Subject: [RHEL8.3 BZ 1789382 056/124] net/mlx5e: Reset RQ doorbell counter before moving RQ state from RST to RDY
|
||
|
Bugzilla: 1789382
|
||
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
||
|
RH-Acked-by: Kamal Heib <kheib@redhat.com>
|
||
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
||
|
|
||
|
Bugzilla: http://bugzilla.redhat.com/1789382
|
||
|
Upstream: v5.6-rc3
|
||
|
|
||
|
commit 5ee090ed0da649b1febae2b7c285ac77d1e55a0c
|
||
|
Author: Aya Levin <ayal@mellanox.com>
|
||
|
Date: Mon Dec 9 14:08:18 2019 +0200
|
||
|
|
||
|
net/mlx5e: Reset RQ doorbell counter before moving RQ state from RST to RDY
|
||
|
|
||
|
Initialize RQ doorbell counters to zero prior to moving an RQ from RST
|
||
|
to RDY state. Per HW spec, when RQ is back to RDY state, the descriptor
|
||
|
ID on the completion is reset. The doorbell record must comply.
|
||
|
|
||
|
Fixes: 8276ea1353a4 ("net/mlx5e: Report and recover from CQE with error on RQ")
|
||
|
Signed-off-by: Aya Levin <ayal@mellanox.com>
|
||
|
Reported-by: Tariq Toukan <tariqt@mellanox.com>
|
||
|
Reviewed-by: Tariq Toukan <tariqt@mellanox.com>
|
||
|
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
|
||
|
|
||
|
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
|
||
|
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
|
||
|
---
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h | 8 +++++
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 3 ++
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/wq.c | 39 +++++++++++++++++------
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/wq.h | 2 ++
|
||
|
4 files changed, 43 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h b/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h
|
||
|
index 7c8796d9743f..a226277b0980 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h
|
||
|
@@ -179,6 +179,14 @@ mlx5e_tx_dma_unmap(struct device *pdev, struct mlx5e_sq_dma *dma)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+static inline void mlx5e_rqwq_reset(struct mlx5e_rq *rq)
|
||
|
+{
|
||
|
+ if (rq->wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ)
|
||
|
+ mlx5_wq_ll_reset(&rq->mpwqe.wq);
|
||
|
+ else
|
||
|
+ mlx5_wq_cyc_reset(&rq->wqe.wq);
|
||
|
+}
|
||
|
+
|
||
|
/* SW parser related functions */
|
||
|
|
||
|
struct mlx5e_swp_spec {
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
||
|
index 7815cae1af54..c9b9c6cb1677 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
||
|
@@ -713,6 +713,9 @@ int mlx5e_modify_rq_state(struct mlx5e_rq *rq, int curr_state, int next_state)
|
||
|
if (!in)
|
||
|
return -ENOMEM;
|
||
|
|
||
|
+ if (curr_state == MLX5_RQC_STATE_RST && next_state == MLX5_RQC_STATE_RDY)
|
||
|
+ mlx5e_rqwq_reset(rq);
|
||
|
+
|
||
|
rqc = MLX5_ADDR_OF(modify_rq_in, in, ctx);
|
||
|
|
||
|
MLX5_SET(modify_rq_in, in, rq_state, curr_state);
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wq.c b/drivers/net/ethernet/mellanox/mlx5/core/wq.c
|
||
|
index 02f7e4a39578..01f075fac276 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/wq.c
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/wq.c
|
||
|
@@ -94,6 +94,13 @@ void mlx5_wq_cyc_wqe_dump(struct mlx5_wq_cyc *wq, u16 ix, u8 nstrides)
|
||
|
print_hex_dump(KERN_WARNING, "", DUMP_PREFIX_OFFSET, 16, 1, wqe, len, false);
|
||
|
}
|
||
|
|
||
|
+void mlx5_wq_cyc_reset(struct mlx5_wq_cyc *wq)
|
||
|
+{
|
||
|
+ wq->wqe_ctr = 0;
|
||
|
+ wq->cur_sz = 0;
|
||
|
+ mlx5_wq_cyc_update_db_record(wq);
|
||
|
+}
|
||
|
+
|
||
|
int mlx5_wq_qp_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
void *qpc, struct mlx5_wq_qp *wq,
|
||
|
struct mlx5_wq_ctrl *wq_ctrl)
|
||
|
@@ -192,6 +199,19 @@ int mlx5_cqwq_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
+static void mlx5_wq_ll_init_list(struct mlx5_wq_ll *wq)
|
||
|
+{
|
||
|
+ struct mlx5_wqe_srq_next_seg *next_seg;
|
||
|
+ int i;
|
||
|
+
|
||
|
+ for (i = 0; i < wq->fbc.sz_m1; i++) {
|
||
|
+ next_seg = mlx5_wq_ll_get_wqe(wq, i);
|
||
|
+ next_seg->next_wqe_index = cpu_to_be16(i + 1);
|
||
|
+ }
|
||
|
+ next_seg = mlx5_wq_ll_get_wqe(wq, i);
|
||
|
+ wq->tail_next = &next_seg->next_wqe_index;
|
||
|
+}
|
||
|
+
|
||
|
int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
void *wqc, struct mlx5_wq_ll *wq,
|
||
|
struct mlx5_wq_ctrl *wq_ctrl)
|
||
|
@@ -199,9 +219,7 @@ int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
u8 log_wq_stride = MLX5_GET(wq, wqc, log_wq_stride);
|
||
|
u8 log_wq_sz = MLX5_GET(wq, wqc, log_wq_sz);
|
||
|
struct mlx5_frag_buf_ctrl *fbc = &wq->fbc;
|
||
|
- struct mlx5_wqe_srq_next_seg *next_seg;
|
||
|
int err;
|
||
|
- int i;
|
||
|
|
||
|
err = mlx5_db_alloc_node(mdev, &wq_ctrl->db, param->db_numa_node);
|
||
|
if (err) {
|
||
|
@@ -220,13 +238,7 @@ int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
|
||
|
mlx5_init_fbc(wq_ctrl->buf.frags, log_wq_stride, log_wq_sz, fbc);
|
||
|
|
||
|
- for (i = 0; i < fbc->sz_m1; i++) {
|
||
|
- next_seg = mlx5_wq_ll_get_wqe(wq, i);
|
||
|
- next_seg->next_wqe_index = cpu_to_be16(i + 1);
|
||
|
- }
|
||
|
- next_seg = mlx5_wq_ll_get_wqe(wq, i);
|
||
|
- wq->tail_next = &next_seg->next_wqe_index;
|
||
|
-
|
||
|
+ mlx5_wq_ll_init_list(wq);
|
||
|
wq_ctrl->mdev = mdev;
|
||
|
|
||
|
return 0;
|
||
|
@@ -237,6 +249,15 @@ int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
+void mlx5_wq_ll_reset(struct mlx5_wq_ll *wq)
|
||
|
+{
|
||
|
+ wq->head = 0;
|
||
|
+ wq->wqe_ctr = 0;
|
||
|
+ wq->cur_sz = 0;
|
||
|
+ mlx5_wq_ll_init_list(wq);
|
||
|
+ mlx5_wq_ll_update_db_record(wq);
|
||
|
+}
|
||
|
+
|
||
|
void mlx5_wq_destroy(struct mlx5_wq_ctrl *wq_ctrl)
|
||
|
{
|
||
|
mlx5_frag_buf_free(wq_ctrl->mdev, &wq_ctrl->buf);
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/wq.h b/drivers/net/ethernet/mellanox/mlx5/core/wq.h
|
||
|
index d9a94bc223c0..4cadc336593f 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/wq.h
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/wq.h
|
||
|
@@ -80,6 +80,7 @@ int mlx5_wq_cyc_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
void *wqc, struct mlx5_wq_cyc *wq,
|
||
|
struct mlx5_wq_ctrl *wq_ctrl);
|
||
|
void mlx5_wq_cyc_wqe_dump(struct mlx5_wq_cyc *wq, u16 ix, u8 nstrides);
|
||
|
+void mlx5_wq_cyc_reset(struct mlx5_wq_cyc *wq);
|
||
|
|
||
|
int mlx5_wq_qp_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
void *qpc, struct mlx5_wq_qp *wq,
|
||
|
@@ -92,6 +93,7 @@ int mlx5_cqwq_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
int mlx5_wq_ll_create(struct mlx5_core_dev *mdev, struct mlx5_wq_param *param,
|
||
|
void *wqc, struct mlx5_wq_ll *wq,
|
||
|
struct mlx5_wq_ctrl *wq_ctrl);
|
||
|
+void mlx5_wq_ll_reset(struct mlx5_wq_ll *wq);
|
||
|
|
||
|
void mlx5_wq_destroy(struct mlx5_wq_ctrl *wq_ctrl);
|
||
|
|
||
|
--
|
||
|
2.13.6
|
||
|
|