|
|
@@ -604,29 +604,31 @@ static void mlxsw_pci_cq_tasklet(unsigned long data)
|
|
|
u16 wqe_counter = mlxsw_pci_cqe_wqe_counter_get(cqe);
|
|
|
u8 sendq = mlxsw_pci_cqe_sr_get(q->u.cq.v, cqe);
|
|
|
u8 dqn = mlxsw_pci_cqe_dqn_get(q->u.cq.v, cqe);
|
|
|
+ char ncqe[MLXSW_PCI_CQE_SIZE_MAX];
|
|
|
+
|
|
|
+ memcpy(ncqe, cqe, q->elem_size);
|
|
|
+ mlxsw_pci_queue_doorbell_consumer_ring(mlxsw_pci, q);
|
|
|
|
|
|
if (sendq) {
|
|
|
struct mlxsw_pci_queue *sdq;
|
|
|
|
|
|
sdq = mlxsw_pci_sdq_get(mlxsw_pci, dqn);
|
|
|
mlxsw_pci_cqe_sdq_handle(mlxsw_pci, sdq,
|
|
|
- wqe_counter, cqe);
|
|
|
+ wqe_counter, ncqe);
|
|
|
q->u.cq.comp_sdq_count++;
|
|
|
} else {
|
|
|
struct mlxsw_pci_queue *rdq;
|
|
|
|
|
|
rdq = mlxsw_pci_rdq_get(mlxsw_pci, dqn);
|
|
|
mlxsw_pci_cqe_rdq_handle(mlxsw_pci, rdq,
|
|
|
- wqe_counter, q->u.cq.v, cqe);
|
|
|
+ wqe_counter, q->u.cq.v, ncqe);
|
|
|
q->u.cq.comp_rdq_count++;
|
|
|
}
|
|
|
if (++items == credits)
|
|
|
break;
|
|
|
}
|
|
|
- if (items) {
|
|
|
- mlxsw_pci_queue_doorbell_consumer_ring(mlxsw_pci, q);
|
|
|
+ if (items)
|
|
|
mlxsw_pci_queue_doorbell_arm_consumer_ring(mlxsw_pci, q);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
static u16 mlxsw_pci_cq_elem_count(const struct mlxsw_pci_queue *q)
|