19c067b84SDoug Ambrisko /* SPDX-License-Identifier: BSD-3-Clause
29c067b84SDoug Ambrisko * Copyright 2008-2017 Cisco Systems, Inc. All rights reserved.
39c067b84SDoug Ambrisko * Copyright 2007 Nuova Systems, Inc. All rights reserved.
49c067b84SDoug Ambrisko */
59c067b84SDoug Ambrisko
69c067b84SDoug Ambrisko #ifndef _VNIC_RQ_H_
79c067b84SDoug Ambrisko #define _VNIC_RQ_H_
89c067b84SDoug Ambrisko
99c067b84SDoug Ambrisko #include "vnic_dev.h"
109c067b84SDoug Ambrisko #include "vnic_cq.h"
119c067b84SDoug Ambrisko
129c067b84SDoug Ambrisko /* Receive queue control */
139c067b84SDoug Ambrisko struct vnic_rq_ctrl {
149c067b84SDoug Ambrisko u64 ring_base; /* 0x00 */
159c067b84SDoug Ambrisko #define RX_RING_BASE 0x00
169c067b84SDoug Ambrisko u32 ring_size; /* 0x08 */
179c067b84SDoug Ambrisko #define RX_RING_SIZE 0x08
189c067b84SDoug Ambrisko u32 pad0;
199c067b84SDoug Ambrisko u32 posted_index; /* 0x10 */
209c067b84SDoug Ambrisko #define RX_POSTED_INDEX 0x10
219c067b84SDoug Ambrisko u32 pad1;
229c067b84SDoug Ambrisko u32 cq_index; /* 0x18 */
239c067b84SDoug Ambrisko #define RX_CQ_INDEX 0x18
249c067b84SDoug Ambrisko u32 pad2;
259c067b84SDoug Ambrisko u32 enable; /* 0x20 */
269c067b84SDoug Ambrisko #define RX_ENABLE 0x20
279c067b84SDoug Ambrisko u32 pad3;
289c067b84SDoug Ambrisko u32 running; /* 0x28 */
299c067b84SDoug Ambrisko #define RX_RUNNING 0x28
309c067b84SDoug Ambrisko u32 pad4;
319c067b84SDoug Ambrisko u32 fetch_index; /* 0x30 */
329c067b84SDoug Ambrisko #define RX_FETCH_INDEX 0x30
339c067b84SDoug Ambrisko u32 pad5;
349c067b84SDoug Ambrisko u32 error_interrupt_enable; /* 0x38 */
359c067b84SDoug Ambrisko #define RX_ERROR_INTR_ENABLE 0x38
369c067b84SDoug Ambrisko u32 pad6;
379c067b84SDoug Ambrisko u32 error_interrupt_offset; /* 0x40 */
389c067b84SDoug Ambrisko #define RX_ERROR_INTR_OFFSET 0x40
399c067b84SDoug Ambrisko u32 pad7;
409c067b84SDoug Ambrisko u32 error_status; /* 0x48 */
419c067b84SDoug Ambrisko #define RX_ERROR_STATUS 0x48
429c067b84SDoug Ambrisko u32 pad8;
439c067b84SDoug Ambrisko u32 tcp_sn; /* 0x50 */
449c067b84SDoug Ambrisko #define RX_TCP_SN 0x50
459c067b84SDoug Ambrisko u32 pad9;
469c067b84SDoug Ambrisko u32 unused; /* 0x58 */
479c067b84SDoug Ambrisko u32 pad10;
489c067b84SDoug Ambrisko u32 dca_select; /* 0x60 */
499c067b84SDoug Ambrisko #define RX_DCA_SELECT 0x60
509c067b84SDoug Ambrisko u32 pad11;
519c067b84SDoug Ambrisko u32 dca_value; /* 0x68 */
529c067b84SDoug Ambrisko #define RX_DCA_VALUE 0x68
539c067b84SDoug Ambrisko u32 pad12;
549c067b84SDoug Ambrisko u32 data_ring; /* 0x70 */
559c067b84SDoug Ambrisko };
569c067b84SDoug Ambrisko
579c067b84SDoug Ambrisko struct vnic_rq {
589c067b84SDoug Ambrisko unsigned int index;
599c067b84SDoug Ambrisko unsigned int posted_index;
609c067b84SDoug Ambrisko struct vnic_dev *vdev;
619c067b84SDoug Ambrisko struct vnic_res *ctrl;
629c067b84SDoug Ambrisko struct vnic_dev_ring ring;
639c067b84SDoug Ambrisko int num_free_mbufs;
649c067b84SDoug Ambrisko struct rte_mbuf **mbuf_ring; /* array of allocated mbufs */
659c067b84SDoug Ambrisko unsigned int mbuf_next_idx; /* next mb to consume */
669c067b84SDoug Ambrisko void *os_buf_head;
679c067b84SDoug Ambrisko unsigned int pkts_outstanding;
689c067b84SDoug Ambrisko uint16_t rx_nb_hold;
699c067b84SDoug Ambrisko uint16_t rx_free_thresh;
709c067b84SDoug Ambrisko unsigned int socket_id;
719c067b84SDoug Ambrisko struct rte_mempool *mp;
729c067b84SDoug Ambrisko uint16_t rxst_idx;
739c067b84SDoug Ambrisko uint32_t tot_pkts;
749c067b84SDoug Ambrisko uint8_t in_use;
759c067b84SDoug Ambrisko unsigned int max_mbufs_per_pkt;
769c067b84SDoug Ambrisko uint16_t tot_nb_desc;
779c067b84SDoug Ambrisko bool need_initial_post;
789c067b84SDoug Ambrisko struct iflib_dma_info data;
799c067b84SDoug Ambrisko };
809c067b84SDoug Ambrisko
vnic_rq_desc_avail(struct vnic_rq * rq)819c067b84SDoug Ambrisko static inline unsigned int vnic_rq_desc_avail(struct vnic_rq *rq)
829c067b84SDoug Ambrisko {
839c067b84SDoug Ambrisko /* how many does SW own? */
849c067b84SDoug Ambrisko return rq->ring.desc_avail;
859c067b84SDoug Ambrisko }
869c067b84SDoug Ambrisko
vnic_rq_desc_used(struct vnic_rq * rq)879c067b84SDoug Ambrisko static inline unsigned int vnic_rq_desc_used(struct vnic_rq *rq)
889c067b84SDoug Ambrisko {
899c067b84SDoug Ambrisko /* how many does HW own? */
909c067b84SDoug Ambrisko return rq->ring.desc_count - rq->ring.desc_avail - 1;
919c067b84SDoug Ambrisko }
929c067b84SDoug Ambrisko
939c067b84SDoug Ambrisko enum desc_return_options {
949c067b84SDoug Ambrisko VNIC_RQ_RETURN_DESC,
959c067b84SDoug Ambrisko VNIC_RQ_DEFER_RETURN_DESC,
969c067b84SDoug Ambrisko };
979c067b84SDoug Ambrisko
vnic_rq_fill(struct vnic_rq * rq,int (* buf_fill)(struct vnic_rq * rq))989c067b84SDoug Ambrisko static inline int vnic_rq_fill(struct vnic_rq *rq,
999c067b84SDoug Ambrisko int (*buf_fill)(struct vnic_rq *rq))
1009c067b84SDoug Ambrisko {
1019c067b84SDoug Ambrisko int err;
1029c067b84SDoug Ambrisko
1039c067b84SDoug Ambrisko while (vnic_rq_desc_avail(rq) > 0) {
1049c067b84SDoug Ambrisko
1059c067b84SDoug Ambrisko err = (*buf_fill)(rq);
1069c067b84SDoug Ambrisko if (err)
1079c067b84SDoug Ambrisko return err;
1089c067b84SDoug Ambrisko }
1099c067b84SDoug Ambrisko
1109c067b84SDoug Ambrisko return 0;
1119c067b84SDoug Ambrisko }
1129c067b84SDoug Ambrisko
vnic_rq_fill_count(struct vnic_rq * rq,int (* buf_fill)(struct vnic_rq * rq),unsigned int count)1139c067b84SDoug Ambrisko static inline int vnic_rq_fill_count(struct vnic_rq *rq,
1149c067b84SDoug Ambrisko int (*buf_fill)(struct vnic_rq *rq), unsigned int count)
1159c067b84SDoug Ambrisko {
1169c067b84SDoug Ambrisko int err;
1179c067b84SDoug Ambrisko
1189c067b84SDoug Ambrisko while ((vnic_rq_desc_avail(rq) > 0) && (count--)) {
1199c067b84SDoug Ambrisko
1209c067b84SDoug Ambrisko err = (*buf_fill)(rq);
1219c067b84SDoug Ambrisko if (err)
1229c067b84SDoug Ambrisko return err;
1239c067b84SDoug Ambrisko }
1249c067b84SDoug Ambrisko
1259c067b84SDoug Ambrisko return 0;
1269c067b84SDoug Ambrisko }
1279c067b84SDoug Ambrisko
1289c067b84SDoug Ambrisko void vnic_rq_free(struct vnic_rq *rq);
1299c067b84SDoug Ambrisko void vnic_rq_init_start(struct vnic_rq *rq, unsigned int cq_index,
1309c067b84SDoug Ambrisko unsigned int fetch_index, unsigned int posted_index,
1319c067b84SDoug Ambrisko unsigned int error_interrupt_enable,
1329c067b84SDoug Ambrisko unsigned int error_interrupt_offset);
1339c067b84SDoug Ambrisko void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
1349c067b84SDoug Ambrisko unsigned int error_interrupt_enable,
1359c067b84SDoug Ambrisko unsigned int error_interrupt_offset);
1369c067b84SDoug Ambrisko void vnic_rq_error_out(struct vnic_rq *rq, unsigned int error);
1379c067b84SDoug Ambrisko unsigned int vnic_rq_error_status(struct vnic_rq *rq);
1389c067b84SDoug Ambrisko void vnic_rq_enable(struct vnic_rq *rq);
1399c067b84SDoug Ambrisko int vnic_rq_disable(struct vnic_rq *rq);
1409c067b84SDoug Ambrisko void vnic_rq_clean(struct vnic_rq *rq);
1419c067b84SDoug Ambrisko
1429c067b84SDoug Ambrisko #endif /* _VNIC_RQ_H_ */
143