| 334 | } |
| 335 | |
| 336 | uint32_t |
| 337 | ionic_cq_service(struct ionic_cq *cq, uint32_t work_to_do, |
| 338 | ionic_cq_cb cb, void *cb_arg) |
| 339 | { |
| 340 | uint32_t work_done = 0; |
| 341 | |
| 342 | if (work_to_do == 0) |
| 343 | return 0; |
| 344 | |
| 345 | while (cb(cq, cq->tail_idx, cb_arg)) { |
| 346 | cq->tail_idx = Q_NEXT_TO_SRVC(cq, 1); |
| 347 | if (cq->tail_idx == 0) |
| 348 | cq->done_color = !cq->done_color; |
| 349 | |
| 350 | if (++work_done == work_to_do) |
| 351 | break; |
| 352 | } |
| 353 | |
| 354 | return work_done; |
| 355 | } |
| 356 | |
| 357 | int |
| 358 | ionic_q_init(struct ionic_queue *q, uint32_t index, uint16_t num_descs) |