Lines Matching refs:ring

40     DescRing *ring;  member
58 PCIDevice *dev = PCI_DEVICE(info->ring->r); in desc_get_buf()
74 PCIDevice *dev = PCI_DEVICE(info->ring->r); in desc_set_buf()
91 return info->ring; in desc_get_ring()
94 int desc_ring_index(DescRing *ring) in desc_ring_index() argument
96 return ring->index; in desc_ring_index()
99 static bool desc_ring_empty(DescRing *ring) in desc_ring_empty() argument
101 return ring->head == ring->tail; in desc_ring_empty()
104 bool desc_ring_set_base_addr(DescRing *ring, uint64_t base_addr) in desc_ring_set_base_addr() argument
108 ") not 8-byte aligned\n", ring->index, base_addr); in desc_ring_set_base_addr()
112 ring->base_addr = base_addr; in desc_ring_set_base_addr()
117 uint64_t desc_ring_get_base_addr(DescRing *ring) in desc_ring_get_base_addr() argument
119 return ring->base_addr; in desc_ring_get_base_addr()
122 bool desc_ring_set_size(DescRing *ring, uint32_t size) in desc_ring_set_size() argument
128 "or in range [2, 64K]\n", ring->index, size); in desc_ring_set_size()
132 for (i = 0; i < ring->size; i++) { in desc_ring_set_size()
133 g_free(ring->info[i].buf); in desc_ring_set_size()
136 ring->size = size; in desc_ring_set_size()
137 ring->head = ring->tail = 0; in desc_ring_set_size()
139 ring->info = g_renew(DescInfo, ring->info, size); in desc_ring_set_size()
141 memset(ring->info, 0, size * sizeof(DescInfo)); in desc_ring_set_size()
144 ring->info[i].ring = ring; in desc_ring_set_size()
150 uint32_t desc_ring_get_size(DescRing *ring) in desc_ring_get_size() argument
152 return ring->size; in desc_ring_get_size()
155 static DescInfo *desc_read(DescRing *ring, uint32_t index) in desc_read() argument
157 PCIDevice *dev = PCI_DEVICE(ring->r); in desc_read()
158 DescInfo *info = &ring->info[index]; in desc_read()
159 hwaddr addr = ring->base_addr + (sizeof(RockerDesc) * index); in desc_read()
166 static void desc_write(DescRing *ring, uint32_t index) in desc_write() argument
168 PCIDevice *dev = PCI_DEVICE(ring->r); in desc_write()
169 DescInfo *info = &ring->info[index]; in desc_write()
170 hwaddr addr = ring->base_addr + (sizeof(RockerDesc) * index); in desc_write()
175 static bool desc_ring_base_addr_check(DescRing *ring) in desc_ring_base_addr_check() argument
177 if (!ring->base_addr) { in desc_ring_base_addr_check()
179 ring->index); in desc_ring_base_addr_check()
185 static DescInfo *__desc_ring_fetch_desc(DescRing *ring) in __desc_ring_fetch_desc() argument
187 return desc_read(ring, ring->tail); in __desc_ring_fetch_desc()
190 DescInfo *desc_ring_fetch_desc(DescRing *ring) in desc_ring_fetch_desc() argument
192 if (desc_ring_empty(ring) || !desc_ring_base_addr_check(ring)) { in desc_ring_fetch_desc()
196 return desc_read(ring, ring->tail); in desc_ring_fetch_desc()
199 static bool __desc_ring_post_desc(DescRing *ring, int err) in __desc_ring_post_desc() argument
202 DescInfo *info = &ring->info[ring->tail]; in __desc_ring_post_desc()
205 desc_write(ring, ring->tail); in __desc_ring_post_desc()
206 ring->tail = (ring->tail + 1) % ring->size; in __desc_ring_post_desc()
210 return ring->credits++ == 0; in __desc_ring_post_desc()
213 bool desc_ring_post_desc(DescRing *ring, int err) in desc_ring_post_desc() argument
215 if (desc_ring_empty(ring)) { in desc_ring_post_desc()
217 ring->index); in desc_ring_post_desc()
221 if (!desc_ring_base_addr_check(ring)) { in desc_ring_post_desc()
225 return __desc_ring_post_desc(ring, err); in desc_ring_post_desc()
228 static bool ring_pump(DescRing *ring) in ring_pump() argument
239 if (ring->consume) { in ring_pump()
240 while (ring->head != ring->tail) { in ring_pump()
241 info = __desc_ring_fetch_desc(ring); in ring_pump()
242 err = ring->consume(ring->r, info); in ring_pump()
243 if (__desc_ring_post_desc(ring, err)) { in ring_pump()
252 bool desc_ring_set_head(DescRing *ring, uint32_t new) in desc_ring_set_head() argument
254 uint32_t tail = ring->tail; in desc_ring_set_head()
255 uint32_t head = ring->head; in desc_ring_set_head()
257 if (!desc_ring_base_addr_check(ring)) { in desc_ring_set_head()
261 if (new >= ring->size) { in desc_ring_set_head()
263 new, ring->index, ring->size); in desc_ring_set_head()
271 ring->index, head, tail, new); in desc_ring_set_head()
275 if (new == ring->head) { in desc_ring_set_head()
279 ring->head = new; in desc_ring_set_head()
281 return ring_pump(ring); in desc_ring_set_head()
284 uint32_t desc_ring_get_head(DescRing *ring) in desc_ring_get_head() argument
286 return ring->head; in desc_ring_get_head()
289 uint32_t desc_ring_get_tail(DescRing *ring) in desc_ring_get_tail() argument
291 return ring->tail; in desc_ring_get_tail()
294 void desc_ring_set_ctrl(DescRing *ring, uint32_t val) in desc_ring_set_ctrl() argument
297 DPRINTF("ring[%d] resetting\n", ring->index); in desc_ring_set_ctrl()
298 desc_ring_reset(ring); in desc_ring_set_ctrl()
302 bool desc_ring_ret_credits(DescRing *ring, uint32_t credits) in desc_ring_ret_credits() argument
304 if (credits > ring->credits) { in desc_ring_ret_credits()
306 "than are outstanding (%d)\n", credits, ring->credits); in desc_ring_ret_credits()
307 ring->credits = 0; in desc_ring_ret_credits()
311 ring->credits -= credits; in desc_ring_ret_credits()
315 return ring->credits > 0; in desc_ring_ret_credits()
318 uint32_t desc_ring_get_credits(DescRing *ring) in desc_ring_get_credits() argument
320 return ring->credits; in desc_ring_get_credits()
323 void desc_ring_set_consume(DescRing *ring, desc_ring_consume *consume, in desc_ring_set_consume() argument
326 ring->consume = consume; in desc_ring_set_consume()
327 ring->msix_vector = vector; in desc_ring_set_consume()
330 unsigned desc_ring_get_msix_vector(DescRing *ring) in desc_ring_get_msix_vector() argument
332 return ring->msix_vector; in desc_ring_get_msix_vector()
337 DescRing *ring; in desc_ring_alloc() local
339 ring = g_new0(DescRing, 1); in desc_ring_alloc()
341 ring->r = r; in desc_ring_alloc()
342 ring->index = index; in desc_ring_alloc()
344 return ring; in desc_ring_alloc()
347 void desc_ring_free(DescRing *ring) in desc_ring_free() argument
349 g_free(ring->info); in desc_ring_free()
350 g_free(ring); in desc_ring_free()
353 void desc_ring_reset(DescRing *ring) in desc_ring_reset() argument
355 ring->base_addr = 0; in desc_ring_reset()
356 ring->size = 0; in desc_ring_reset()
357 ring->head = 0; in desc_ring_reset()
358 ring->tail = 0; in desc_ring_reset()
359 ring->ctrl = 0; in desc_ring_reset()
360 ring->credits = 0; in desc_ring_reset()