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