| 446 | |
| 447 | |
| 448 | static inline void |
| 449 | virtqueue_enqueue_xmit_inorder(struct virtnet_tx *txvq, |
| 450 | struct rte_mbuf **cookies, |
| 451 | uint16_t num) |
| 452 | { |
| 453 | struct vq_desc_extra *dxp; |
| 454 | struct virtqueue *vq = virtnet_txq_to_vq(txvq); |
| 455 | struct vring_desc *start_dp; |
| 456 | struct virtio_net_hdr *hdr; |
| 457 | uint16_t idx; |
| 458 | int16_t head_size = vq->hw->vtnet_hdr_size; |
| 459 | uint16_t i = 0; |
| 460 | |
| 461 | idx = vq->vq_desc_head_idx; |
| 462 | start_dp = vq->vq_split.ring.desc; |
| 463 | |
| 464 | while (i < num) { |
| 465 | idx = idx & (vq->vq_nentries - 1); |
| 466 | dxp = &vq->vq_descx[vq->vq_avail_idx & (vq->vq_nentries - 1)]; |
| 467 | dxp->cookie = (void *)cookies[i]; |
| 468 | dxp->ndescs = 1; |
| 469 | virtio_update_packet_stats(&txvq->stats, cookies[i]); |
| 470 | |
| 471 | hdr = rte_pktmbuf_mtod_offset(cookies[i], |
| 472 | struct virtio_net_hdr *, -head_size); |
| 473 | |
| 474 | /* if offload disabled, hdr is not zeroed yet, do it now */ |
| 475 | if (!vq->hw->has_tx_offload) |
| 476 | virtqueue_clear_net_hdr(hdr); |
| 477 | else |
| 478 | virtqueue_xmit_offload(hdr, cookies[i]); |
| 479 | |
| 480 | start_dp[idx].addr = VIRTIO_MBUF_DATA_DMA_ADDR(cookies[i], vq) - head_size; |
| 481 | start_dp[idx].len = cookies[i]->data_len + head_size; |
| 482 | start_dp[idx].flags = 0; |
| 483 | |
| 484 | |
| 485 | vq_update_avail_ring(vq, idx); |
| 486 | |
| 487 | idx++; |
| 488 | i++; |
| 489 | }; |
| 490 | |
| 491 | vq->vq_free_cnt = (uint16_t)(vq->vq_free_cnt - num); |
| 492 | vq->vq_desc_head_idx = idx & (vq->vq_nentries - 1); |
| 493 | } |
| 494 | |
| 495 | static inline void |
| 496 | virtqueue_enqueue_xmit_packed_fast(struct virtnet_tx *txvq, |
no test coverage detected