1*9c067b84SDoug Ambrisko /* SPDX-License-Identifier: BSD-3-Clause
2*9c067b84SDoug Ambrisko * Copyright 2008-2017 Cisco Systems, Inc. All rights reserved.
3*9c067b84SDoug Ambrisko * Copyright 2007 Nuova Systems, Inc. All rights reserved.
4*9c067b84SDoug Ambrisko */
5*9c067b84SDoug Ambrisko
6*9c067b84SDoug Ambrisko #ifndef _VNIC_RQ_H_
7*9c067b84SDoug Ambrisko #define _VNIC_RQ_H_
8*9c067b84SDoug Ambrisko
9*9c067b84SDoug Ambrisko #include "vnic_dev.h"
10*9c067b84SDoug Ambrisko #include "vnic_cq.h"
11*9c067b84SDoug Ambrisko
12*9c067b84SDoug Ambrisko /* Receive queue control */
13*9c067b84SDoug Ambrisko struct vnic_rq_ctrl {
14*9c067b84SDoug Ambrisko u64 ring_base; /* 0x00 */
15*9c067b84SDoug Ambrisko #define RX_RING_BASE 0x00
16*9c067b84SDoug Ambrisko u32 ring_size; /* 0x08 */
17*9c067b84SDoug Ambrisko #define RX_RING_SIZE 0x08
18*9c067b84SDoug Ambrisko u32 pad0;
19*9c067b84SDoug Ambrisko u32 posted_index; /* 0x10 */
20*9c067b84SDoug Ambrisko #define RX_POSTED_INDEX 0x10
21*9c067b84SDoug Ambrisko u32 pad1;
22*9c067b84SDoug Ambrisko u32 cq_index; /* 0x18 */
23*9c067b84SDoug Ambrisko #define RX_CQ_INDEX 0x18
24*9c067b84SDoug Ambrisko u32 pad2;
25*9c067b84SDoug Ambrisko u32 enable; /* 0x20 */
26*9c067b84SDoug Ambrisko #define RX_ENABLE 0x20
27*9c067b84SDoug Ambrisko u32 pad3;
28*9c067b84SDoug Ambrisko u32 running; /* 0x28 */
29*9c067b84SDoug Ambrisko #define RX_RUNNING 0x28
30*9c067b84SDoug Ambrisko u32 pad4;
31*9c067b84SDoug Ambrisko u32 fetch_index; /* 0x30 */
32*9c067b84SDoug Ambrisko #define RX_FETCH_INDEX 0x30
33*9c067b84SDoug Ambrisko u32 pad5;
34*9c067b84SDoug Ambrisko u32 error_interrupt_enable; /* 0x38 */
35*9c067b84SDoug Ambrisko #define RX_ERROR_INTR_ENABLE 0x38
36*9c067b84SDoug Ambrisko u32 pad6;
37*9c067b84SDoug Ambrisko u32 error_interrupt_offset; /* 0x40 */
38*9c067b84SDoug Ambrisko #define RX_ERROR_INTR_OFFSET 0x40
39*9c067b84SDoug Ambrisko u32 pad7;
40*9c067b84SDoug Ambrisko u32 error_status; /* 0x48 */
41*9c067b84SDoug Ambrisko #define RX_ERROR_STATUS 0x48
42*9c067b84SDoug Ambrisko u32 pad8;
43*9c067b84SDoug Ambrisko u32 tcp_sn; /* 0x50 */
44*9c067b84SDoug Ambrisko #define RX_TCP_SN 0x50
45*9c067b84SDoug Ambrisko u32 pad9;
46*9c067b84SDoug Ambrisko u32 unused; /* 0x58 */
47*9c067b84SDoug Ambrisko u32 pad10;
48*9c067b84SDoug Ambrisko u32 dca_select; /* 0x60 */
49*9c067b84SDoug Ambrisko #define RX_DCA_SELECT 0x60
50*9c067b84SDoug Ambrisko u32 pad11;
51*9c067b84SDoug Ambrisko u32 dca_value; /* 0x68 */
52*9c067b84SDoug Ambrisko #define RX_DCA_VALUE 0x68
53*9c067b84SDoug Ambrisko u32 pad12;
54*9c067b84SDoug Ambrisko u32 data_ring; /* 0x70 */
55*9c067b84SDoug Ambrisko };
56*9c067b84SDoug Ambrisko
57*9c067b84SDoug Ambrisko struct vnic_rq {
58*9c067b84SDoug Ambrisko unsigned int index;
59*9c067b84SDoug Ambrisko unsigned int posted_index;
60*9c067b84SDoug Ambrisko struct vnic_dev *vdev;
61*9c067b84SDoug Ambrisko struct vnic_res *ctrl;
62*9c067b84SDoug Ambrisko struct vnic_dev_ring ring;
63*9c067b84SDoug Ambrisko int num_free_mbufs;
64*9c067b84SDoug Ambrisko struct rte_mbuf **mbuf_ring; /* array of allocated mbufs */
65*9c067b84SDoug Ambrisko unsigned int mbuf_next_idx; /* next mb to consume */
66*9c067b84SDoug Ambrisko void *os_buf_head;
67*9c067b84SDoug Ambrisko unsigned int pkts_outstanding;
68*9c067b84SDoug Ambrisko uint16_t rx_nb_hold;
69*9c067b84SDoug Ambrisko uint16_t rx_free_thresh;
70*9c067b84SDoug Ambrisko unsigned int socket_id;
71*9c067b84SDoug Ambrisko struct rte_mempool *mp;
72*9c067b84SDoug Ambrisko uint16_t rxst_idx;
73*9c067b84SDoug Ambrisko uint32_t tot_pkts;
74*9c067b84SDoug Ambrisko uint8_t in_use;
75*9c067b84SDoug Ambrisko unsigned int max_mbufs_per_pkt;
76*9c067b84SDoug Ambrisko uint16_t tot_nb_desc;
77*9c067b84SDoug Ambrisko bool need_initial_post;
78*9c067b84SDoug Ambrisko struct iflib_dma_info data;
79*9c067b84SDoug Ambrisko };
80*9c067b84SDoug Ambrisko
vnic_rq_desc_avail(struct vnic_rq * rq)81*9c067b84SDoug Ambrisko static inline unsigned int vnic_rq_desc_avail(struct vnic_rq *rq)
82*9c067b84SDoug Ambrisko {
83*9c067b84SDoug Ambrisko /* how many does SW own? */
84*9c067b84SDoug Ambrisko return rq->ring.desc_avail;
85*9c067b84SDoug Ambrisko }
86*9c067b84SDoug Ambrisko
vnic_rq_desc_used(struct vnic_rq * rq)87*9c067b84SDoug Ambrisko static inline unsigned int vnic_rq_desc_used(struct vnic_rq *rq)
88*9c067b84SDoug Ambrisko {
89*9c067b84SDoug Ambrisko /* how many does HW own? */
90*9c067b84SDoug Ambrisko return rq->ring.desc_count - rq->ring.desc_avail - 1;
91*9c067b84SDoug Ambrisko }
92*9c067b84SDoug Ambrisko
93*9c067b84SDoug Ambrisko enum desc_return_options {
94*9c067b84SDoug Ambrisko VNIC_RQ_RETURN_DESC,
95*9c067b84SDoug Ambrisko VNIC_RQ_DEFER_RETURN_DESC,
96*9c067b84SDoug Ambrisko };
97*9c067b84SDoug Ambrisko
vnic_rq_fill(struct vnic_rq * rq,int (* buf_fill)(struct vnic_rq * rq))98*9c067b84SDoug Ambrisko static inline int vnic_rq_fill(struct vnic_rq *rq,
99*9c067b84SDoug Ambrisko int (*buf_fill)(struct vnic_rq *rq))
100*9c067b84SDoug Ambrisko {
101*9c067b84SDoug Ambrisko int err;
102*9c067b84SDoug Ambrisko
103*9c067b84SDoug Ambrisko while (vnic_rq_desc_avail(rq) > 0) {
104*9c067b84SDoug Ambrisko
105*9c067b84SDoug Ambrisko err = (*buf_fill)(rq);
106*9c067b84SDoug Ambrisko if (err)
107*9c067b84SDoug Ambrisko return err;
108*9c067b84SDoug Ambrisko }
109*9c067b84SDoug Ambrisko
110*9c067b84SDoug Ambrisko return 0;
111*9c067b84SDoug Ambrisko }
112*9c067b84SDoug Ambrisko
vnic_rq_fill_count(struct vnic_rq * rq,int (* buf_fill)(struct vnic_rq * rq),unsigned int count)113*9c067b84SDoug Ambrisko static inline int vnic_rq_fill_count(struct vnic_rq *rq,
114*9c067b84SDoug Ambrisko int (*buf_fill)(struct vnic_rq *rq), unsigned int count)
115*9c067b84SDoug Ambrisko {
116*9c067b84SDoug Ambrisko int err;
117*9c067b84SDoug Ambrisko
118*9c067b84SDoug Ambrisko while ((vnic_rq_desc_avail(rq) > 0) && (count--)) {
119*9c067b84SDoug Ambrisko
120*9c067b84SDoug Ambrisko err = (*buf_fill)(rq);
121*9c067b84SDoug Ambrisko if (err)
122*9c067b84SDoug Ambrisko return err;
123*9c067b84SDoug Ambrisko }
124*9c067b84SDoug Ambrisko
125*9c067b84SDoug Ambrisko return 0;
126*9c067b84SDoug Ambrisko }
127*9c067b84SDoug Ambrisko
128*9c067b84SDoug Ambrisko void vnic_rq_free(struct vnic_rq *rq);
129*9c067b84SDoug Ambrisko void vnic_rq_init_start(struct vnic_rq *rq, unsigned int cq_index,
130*9c067b84SDoug Ambrisko unsigned int fetch_index, unsigned int posted_index,
131*9c067b84SDoug Ambrisko unsigned int error_interrupt_enable,
132*9c067b84SDoug Ambrisko unsigned int error_interrupt_offset);
133*9c067b84SDoug Ambrisko void vnic_rq_init(struct vnic_rq *rq, unsigned int cq_index,
134*9c067b84SDoug Ambrisko unsigned int error_interrupt_enable,
135*9c067b84SDoug Ambrisko unsigned int error_interrupt_offset);
136*9c067b84SDoug Ambrisko unsigned int vnic_rq_error_status(struct vnic_rq *rq);
137*9c067b84SDoug Ambrisko void vnic_rq_enable(struct vnic_rq *rq);
138*9c067b84SDoug Ambrisko int vnic_rq_disable(struct vnic_rq *rq);
139*9c067b84SDoug Ambrisko void vnic_rq_clean(struct vnic_rq *rq);
140*9c067b84SDoug Ambrisko
141*9c067b84SDoug Ambrisko #endif /* _VNIC_RQ_H_ */
142