Lines Matching defs:vring
64 * @num: vring size (number of descriptors)
65 * @align: vring alignment size
66 * @index: vring index
67 * @vdev_id: vring virtio id (VIRTIO_ID_xxx)
88 /* Check whether vring is in drop mode. */
161 * @vring: Tx/Rx ring
176 struct mlxbf_tmfifo_vring *vring[2];
221 struct mlxbf_tmfifo_vring *vring;
225 vring = &tm_vdev->vrings[i];
226 if (vring->va) {
227 size = vring_size(vring->num, vring->align);
229 vring->va, vring->dma);
230 vring->va = NULL;
231 if (vring->vq) {
232 vring_del_virtqueue(vring->vq);
233 vring->vq = NULL;
243 struct mlxbf_tmfifo_vring *vring;
250 vring = &tm_vdev->vrings[i];
251 vring->fifo = fifo;
252 vring->num = MLXBF_TMFIFO_VRING_SIZE;
253 vring->align = SMP_CACHE_BYTES;
254 vring->index = i;
255 vring->vdev_id = tm_vdev->vdev.id.device;
256 vring->drop_desc.len = VRING_DROP_DESC_MAX_LEN;
259 size = vring_size(vring->num, vring->align);
267 vring->va = va;
268 vring->dma = dma;
297 /* Get the next packet descriptor from the vring. */
299 mlxbf_tmfifo_get_next_desc(struct mlxbf_tmfifo_vring *vring)
301 const struct vring *vr = virtqueue_get_vring(vring->vq);
302 struct virtio_device *vdev = vring->vq->vdev;
305 if (vring->next_avail == virtio16_to_cpu(vdev, vr->avail->idx))
311 idx = vring->next_avail % vr->num;
316 vring->next_avail++;
322 static void mlxbf_tmfifo_release_desc(struct mlxbf_tmfifo_vring *vring,
325 const struct vring *vr = virtqueue_get_vring(vring->vq);
326 struct virtio_device *vdev = vring->vq->vdev;
344 static u32 mlxbf_tmfifo_get_pkt_len(struct mlxbf_tmfifo_vring *vring,
347 const struct vring *vr = virtqueue_get_vring(vring->vq);
348 struct virtio_device *vdev = vring->vq->vdev;
362 static void mlxbf_tmfifo_release_pkt(struct mlxbf_tmfifo_vring *vring)
367 if (vring->desc_head) {
368 desc_head = vring->desc_head;
369 len = vring->pkt_len;
371 desc_head = mlxbf_tmfifo_get_next_desc(vring);
372 len = mlxbf_tmfifo_get_pkt_len(vring, desc_head);
376 mlxbf_tmfifo_release_desc(vring, desc_head, len);
378 vring->pkt_len = 0;
379 vring->desc = NULL;
380 vring->desc_head = NULL;
383 static void mlxbf_tmfifo_init_net_desc(struct mlxbf_tmfifo_vring *vring,
386 struct virtio_device *vdev = vring->vq->vdev;
395 mlxbf_tmfifo_get_next_pkt(struct mlxbf_tmfifo_vring *vring, bool is_rx)
399 desc = mlxbf_tmfifo_get_next_desc(vring);
400 if (desc && is_rx && vring->vdev_id == VIRTIO_ID_NET)
401 mlxbf_tmfifo_init_net_desc(vring, desc, is_rx);
403 vring->desc_head = desc;
404 vring->desc = desc;
426 struct mlxbf_tmfifo_vring *vring,
429 const struct vring *vr = virtqueue_get_vring(vring->vq);
459 struct mlxbf_tmfifo_vring *vring)
464 desc = mlxbf_tmfifo_get_next_desc(vring);
467 len = mlxbf_tmfifo_get_pkt_len(vring, desc);
471 mlxbf_tmfifo_release_desc(vring, desc, len);
475 mlxbf_tmfifo_console_output_one(cons, vring, desc);
476 mlxbf_tmfifo_release_desc(vring, desc, len);
477 desc = mlxbf_tmfifo_get_next_desc(vring);
573 static void mlxbf_tmfifo_rxtx_word(struct mlxbf_tmfifo_vring *vring,
577 struct virtio_device *vdev = vring->vq->vdev;
578 struct mlxbf_tmfifo *fifo = vring->fifo;
589 if (vring->cur_len + sizeof(u64) <= len) {
592 if (!IS_VRING_DROP(vring))
593 memcpy(addr + vring->cur_len, &data,
596 memcpy(&data, addr + vring->cur_len,
599 vring->cur_len += sizeof(u64);
603 if (!IS_VRING_DROP(vring))
604 memcpy(addr + vring->cur_len, &data,
605 len - vring->cur_len);
608 memcpy(&data, addr + vring->cur_len,
609 len - vring->cur_len);
611 vring->cur_len = len;
622 * In Rx case, the packet might be found to belong to a different vring since
626 static void mlxbf_tmfifo_rxtx_header(struct mlxbf_tmfifo_vring *vring,
630 struct mlxbf_tmfifo *fifo = vring->fifo;
662 * Check whether the new packet still belongs to this vring.
663 * If not, update the pkt_len of the new vring.
665 if (vdev_id != vring->vdev_id) {
670 vring->desc = *desc;
671 vring = &tm_dev2->vrings[MLXBF_TMFIFO_VRING_RX];
675 if (drop_rx && !IS_VRING_DROP(vring)) {
676 if (vring->desc_head)
677 mlxbf_tmfifo_release_pkt(vring);
678 *desc = &vring->drop_desc;
679 vring->desc_head = *desc;
680 vring->desc = *desc;
683 vring->pkt_len = ntohs(hdr.len) + hdr_len;
686 hdr_len = (vring->vdev_id == VIRTIO_ID_NET) ?
688 vring->pkt_len = mlxbf_tmfifo_get_pkt_len(vring, *desc);
689 hdr.type = (vring->vdev_id == VIRTIO_ID_NET) ?
691 hdr.len = htons(vring->pkt_len - hdr_len);
695 vring->cur_len = hdr_len;
696 vring->rem_len = vring->pkt_len;
697 fifo->vring[is_rx] = vring;
705 static bool mlxbf_tmfifo_rxtx_one_desc(struct mlxbf_tmfifo_vring *vring,
708 const struct vring *vr = virtqueue_get_vring(vring->vq);
709 struct mlxbf_tmfifo *fifo = vring->fifo;
716 vdev = &fifo->vdev[vring->vdev_id]->vdev;
719 if (!vring->desc) {
720 desc = mlxbf_tmfifo_get_next_pkt(vring, is_rx);
724 desc = &vring->drop_desc;
725 vring->desc_head = desc;
726 vring->desc = desc;
732 desc = vring->desc;
736 if (vring->pkt_len == 0) {
737 mlxbf_tmfifo_rxtx_header(vring, &desc, is_rx, &vring_change);
748 if (len > vring->rem_len)
749 len = vring->rem_len;
752 if (vring->cur_len < len) {
753 mlxbf_tmfifo_rxtx_word(vring, desc, is_rx, len);
758 if (vring->cur_len == len) {
759 vring->cur_len = 0;
760 vring->rem_len -= len;
763 if (!IS_VRING_DROP(vring) && vring->rem_len > 0 &&
772 fifo->vring[is_rx] = NULL;
773 if (!IS_VRING_DROP(vring)) {
774 mlxbf_tmfifo_release_pkt(vring);
776 vring->pkt_len = 0;
777 vring->desc_head = NULL;
778 vring->desc = NULL;
790 vring_interrupt(0, vring->vq);
796 vring->desc = desc;
802 static void mlxbf_tmfifo_rxtx(struct mlxbf_tmfifo_vring *vring, bool is_rx)
804 int avail = 0, devid = vring->vdev_id;
808 fifo = vring->fifo;
814 /* Return if another vring is running. */
815 if (fifo->vring[is_rx] && fifo->vring[is_rx] != vring)
840 more = mlxbf_tmfifo_rxtx_one_desc(vring, is_rx, &avail);
849 struct mlxbf_tmfifo_vring *vring;
859 vring = &tm_vdev->vrings[queue_id];
860 if (vring->vq)
861 mlxbf_tmfifo_rxtx(vring, is_rx);
891 struct mlxbf_tmfifo_vring *vring = vq->priv;
896 fifo = vring->fifo;
902 if (vring->index & BIT(0)) {
905 * In such case, the vring needs to be served right away. For
909 if (vring->vdev_id == VIRTIO_ID_CONSOLE) {
912 mlxbf_tmfifo_console_output(tm_vdev, vring);
951 struct mlxbf_tmfifo_vring *vring;
956 vring = &tm_vdev->vrings[i];
959 if (vring->desc)
960 mlxbf_tmfifo_release_pkt(vring);
961 vq = vring->vq;
963 vring->vq = NULL;
979 struct mlxbf_tmfifo_vring *vring;
991 vring = &tm_vdev->vrings[i];
993 /* zero vring */
994 size = vring_size(vring->num, vring->align);
995 memset(vring->va, 0, size);
996 vq = vring_new_virtqueue(i, vring->num, vring->align, vdev,
997 false, false, vring->va,
1007 vring->vq = vq;
1008 vq->priv = vring;
1126 dev_err(dev, "unable to allocate vring\n");