[dpdk-dev,1/2] net/enic: fix error in init of RQ when not using Rx scatter
Commit Message
From: Nelson Escobar <neescoba@cisco.com>
The Rx scatter patch was accidentally setting the index of the
secondary receive queue in the primary receive queue's initialization
when the secondary receive queue wasn't needed and was disabled. This
caused some misleading hardware counters in some situations.
Fixes: 856d7ba7ed22 ("net/enic: support scattered Rx")
Signed-off-by: Nelson Escobar <neescoba@cisco.com>
Reviewed-by: John Daley <johndale@cisco.com>
---
drivers/net/enic/base/vnic_rq.c | 6 ++++--
drivers/net/enic/base/vnic_rq.h | 1 +
drivers/net/enic/enic_main.c | 2 ++
3 files changed, 7 insertions(+), 2 deletions(-)
Comments
On Wed, Oct 12, 2016 at 01:11:28PM -0700, John Daley wrote:
> From: Nelson Escobar <neescoba@cisco.com>
>
> The Rx scatter patch was accidentally setting the index of the
> secondary receive queue in the primary receive queue's initialization
> when the secondary receive queue wasn't needed and was disabled. This
> caused some misleading hardware counters in some situations.
>
> Fixes: 856d7ba7ed22 ("net/enic: support scattered Rx")
>
> Signed-off-by: Nelson Escobar <neescoba@cisco.com>
> Reviewed-by: John Daley <johndale@cisco.com>
Patchset applied to dpdk-next-net/rel_16_11
/Bruce
@@ -87,9 +87,11 @@ void vnic_rq_init_start(struct vnic_rq *rq, unsigned int cq_index,
iowrite32(0, &rq->ctrl->error_status);
iowrite32(fetch_index, &rq->ctrl->fetch_index);
iowrite32(posted_index, &rq->ctrl->posted_index);
- if (rq->is_sop)
- iowrite32(((rq->is_sop << 10) | rq->data_queue_idx),
+ if (rq->data_queue_enable)
+ iowrite32(((1 << 10) | rq->data_queue_idx),
&rq->ctrl->data_ring);
+ else
+ iowrite32(0, &rq->ctrl->data_ring);
}
void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
@@ -91,6 +91,7 @@ struct vnic_rq {
uint16_t rxst_idx;
uint32_t tot_pkts;
uint16_t data_queue_idx;
+ uint8_t data_queue_enable;
uint8_t is_sop;
uint8_t in_use;
struct rte_mbuf *pkt_first_seg;
@@ -640,10 +640,12 @@ int enic_alloc_rq(struct enic *enic, uint16_t queue_idx,
if (mbufs_per_pkt > 1) {
dev_info(enic, "Rq %u Scatter rx mode in use\n", queue_idx);
+ rq_sop->data_queue_enable = 1;
rq_data->in_use = 1;
} else {
dev_info(enic, "Rq %u Scatter rx mode not being used\n",
queue_idx);
+ rq_sop->data_queue_enable = 0;
rq_data->in_use = 0;
}