Lines Matching refs:vring

71  * @num: vring size (number of descriptors)
72 * @align: vring alignment size
73 * @index: vring index
74 * @vdev_id: vring virtio id (VIRTIO_ID_xxx)
98 /* Check whether vring is in drop mode. */
186 * @vring: Tx/Rx ring
203 struct mlxbf_tmfifo_vring *vring[2];
249 struct mlxbf_tmfifo_vring *vring;
253 vring = &tm_vdev->vrings[i];
254 if (vring->va) {
255 size = vring_size(vring->num, vring->align);
257 vring->va, vring->dma);
258 vring->va = NULL;
259 if (vring->vq) {
260 vring_del_virtqueue(vring->vq);
261 vring->vq = NULL;
271 struct mlxbf_tmfifo_vring *vring;
278 vring = &tm_vdev->vrings[i];
279 vring->fifo = fifo;
280 vring->num = MLXBF_TMFIFO_VRING_SIZE;
281 vring->align = SMP_CACHE_BYTES;
282 vring->index = i;
283 vring->vdev_id = tm_vdev->vdev.id.device;
284 vring->drop_desc.len = VRING_DROP_DESC_MAX_LEN;
287 size = vring_size(vring->num, vring->align);
295 vring->va = va;
296 vring->dma = dma;
325 /* Get the next packet descriptor from the vring. */
327 mlxbf_tmfifo_get_next_desc(struct mlxbf_tmfifo_vring *vring)
329 const struct vring *vr = virtqueue_get_vring(vring->vq);
330 struct virtio_device *vdev = vring->vq->vdev;
333 if (vring->next_avail == virtio16_to_cpu(vdev, vr->avail->idx))
339 idx = vring->next_avail % vr->num;
344 vring->next_avail++;
350 static void mlxbf_tmfifo_release_desc(struct mlxbf_tmfifo_vring *vring,
353 const struct vring *vr = virtqueue_get_vring(vring->vq);
354 struct virtio_device *vdev = vring->vq->vdev;
372 static u32 mlxbf_tmfifo_get_pkt_len(struct mlxbf_tmfifo_vring *vring,
375 const struct vring *vr = virtqueue_get_vring(vring->vq);
376 struct virtio_device *vdev = vring->vq->vdev;
390 static void mlxbf_tmfifo_release_pkt(struct mlxbf_tmfifo_vring *vring)
395 if (vring->desc_head) {
396 desc_head = vring->desc_head;
397 len = vring->pkt_len;
399 desc_head = mlxbf_tmfifo_get_next_desc(vring);
400 len = mlxbf_tmfifo_get_pkt_len(vring, desc_head);
404 mlxbf_tmfifo_release_desc(vring, desc_head, len);
406 vring->pkt_len = 0;
407 vring->desc = NULL;
408 vring->desc_head = NULL;
411 static void mlxbf_tmfifo_init_net_desc(struct mlxbf_tmfifo_vring *vring,
414 struct virtio_device *vdev = vring->vq->vdev;
423 mlxbf_tmfifo_get_next_pkt(struct mlxbf_tmfifo_vring *vring, bool is_rx)
427 desc = mlxbf_tmfifo_get_next_desc(vring);
428 if (desc && is_rx && vring->vdev_id == VIRTIO_ID_NET)
429 mlxbf_tmfifo_init_net_desc(vring, desc, is_rx);
431 vring->desc_head = desc;
432 vring->desc = desc;
454 struct mlxbf_tmfifo_vring *vring,
457 const struct vring *vr = virtqueue_get_vring(vring->vq);
487 struct mlxbf_tmfifo_vring *vring)
492 desc = mlxbf_tmfifo_get_next_desc(vring);
495 len = mlxbf_tmfifo_get_pkt_len(vring, desc);
499 mlxbf_tmfifo_release_desc(vring, desc, len);
503 mlxbf_tmfifo_console_output_one(cons, vring, desc);
504 mlxbf_tmfifo_release_desc(vring, desc, len);
505 desc = mlxbf_tmfifo_get_next_desc(vring);
601 static void mlxbf_tmfifo_rxtx_word(struct mlxbf_tmfifo_vring *vring,
605 struct virtio_device *vdev = vring->vq->vdev;
606 struct mlxbf_tmfifo *fifo = vring->fifo;
617 if (vring->cur_len + sizeof(u64) <= len) {
620 if (!IS_VRING_DROP(vring))
621 memcpy(addr + vring->cur_len, &data,
624 memcpy(&data, addr + vring->cur_len,
627 vring->cur_len += sizeof(u64);
631 if (!IS_VRING_DROP(vring))
632 memcpy(addr + vring->cur_len, &data,
633 len - vring->cur_len);
636 memcpy(&data, addr + vring->cur_len,
637 len - vring->cur_len);
639 vring->cur_len = len;
650 * In Rx case, the packet might be found to belong to a different vring since
654 static void mlxbf_tmfifo_rxtx_header(struct mlxbf_tmfifo_vring *vring,
658 struct mlxbf_tmfifo *fifo = vring->fifo;
690 * Check whether the new packet still belongs to this vring.
691 * If not, update the pkt_len of the new vring.
693 if (vdev_id != vring->vdev_id) {
698 vring->desc = *desc;
699 vring = &tm_dev2->vrings[MLXBF_TMFIFO_VRING_RX];
703 if (drop_rx && !IS_VRING_DROP(vring)) {
704 if (vring->desc_head)
705 mlxbf_tmfifo_release_pkt(vring);
706 *desc = &vring->drop_desc;
707 vring->desc_head = *desc;
708 vring->desc = *desc;
711 vring->pkt_len = ntohs(hdr.len) + hdr_len;
714 hdr_len = (vring->vdev_id == VIRTIO_ID_NET) ?
716 vring->pkt_len = mlxbf_tmfifo_get_pkt_len(vring, *desc);
717 hdr.type = (vring->vdev_id == VIRTIO_ID_NET) ?
719 hdr.len = htons(vring->pkt_len - hdr_len);
723 vring->cur_len = hdr_len;
724 vring->rem_len = vring->pkt_len;
725 fifo->vring[is_rx] = vring;
733 static bool mlxbf_tmfifo_rxtx_one_desc(struct mlxbf_tmfifo_vring *vring,
736 const struct vring *vr = virtqueue_get_vring(vring->vq);
737 struct mlxbf_tmfifo *fifo = vring->fifo;
744 vdev = &fifo->vdev[vring->vdev_id]->vdev;
747 if (!vring->desc) {
748 desc = mlxbf_tmfifo_get_next_pkt(vring, is_rx);
752 desc = &vring->drop_desc;
753 vring->desc_head = desc;
754 vring->desc = desc;
760 desc = vring->desc;
764 if (vring->pkt_len == 0) {
765 mlxbf_tmfifo_rxtx_header(vring, &desc, is_rx, &vring_change);
776 if (len > vring->rem_len)
777 len = vring->rem_len;
780 if (vring->cur_len < len) {
781 mlxbf_tmfifo_rxtx_word(vring, desc, is_rx, len);
786 if (vring->cur_len == len) {
787 vring->cur_len = 0;
788 vring->rem_len -= len;
791 if (!IS_VRING_DROP(vring) && vring->rem_len > 0 &&
800 fifo->vring[is_rx] = NULL;
801 if (!IS_VRING_DROP(vring)) {
802 mlxbf_tmfifo_release_pkt(vring);
804 vring->pkt_len = 0;
805 vring->desc_head = NULL;
806 vring->desc = NULL;
818 vring_interrupt(0, vring->vq);
824 vring->desc = desc;
829 static void mlxbf_tmfifo_check_tx_timeout(struct mlxbf_tmfifo_vring *vring)
834 if (vring->vdev_id != VIRTIO_ID_NET)
838 if (!vring->tx_timeout) {
840 vring->tx_timeout = jiffies +
843 } else if (time_before(jiffies, vring->tx_timeout)) {
855 vring->rem_padding = round_up(vring->rem_len, sizeof(u64));
856 mlxbf_tmfifo_release_pkt(vring);
857 vring->cur_len = 0;
858 vring->rem_len = 0;
859 vring->fifo->vring[0] = NULL;
868 spin_lock_irqsave(&vring->fifo->spin_lock[0], flags);
869 vring_interrupt(0, vring->vq);
870 spin_unlock_irqrestore(&vring->fifo->spin_lock[0], flags);
874 static void mlxbf_tmfifo_rxtx(struct mlxbf_tmfifo_vring *vring, bool is_rx)
876 int avail = 0, devid = vring->vdev_id;
880 fifo = vring->fifo;
886 /* Return if another vring is running. */
887 if (fifo->vring[is_rx] && fifo->vring[is_rx] != vring)
908 vring->tx_timeout = 0;
909 while (vring->rem_padding >= sizeof(u64)) {
910 writeq(0, vring->fifo->tx.data);
911 vring->rem_padding -= sizeof(u64);
924 more = mlxbf_tmfifo_rxtx_one_desc(vring, is_rx, &avail);
929 mlxbf_tmfifo_check_tx_timeout(vring);
937 struct mlxbf_tmfifo_vring *vring;
947 vring = &tm_vdev->vrings[queue_id];
948 if (vring->vq)
949 mlxbf_tmfifo_rxtx(vring, is_rx);
979 struct mlxbf_tmfifo_vring *vring = vq->priv;
984 fifo = vring->fifo;
990 if (vring->index & BIT(0)) {
993 * In such case, the vring needs to be served right away. For
997 if (vring->vdev_id == VIRTIO_ID_CONSOLE) {
1000 mlxbf_tmfifo_console_output(tm_vdev, vring);
1039 struct mlxbf_tmfifo_vring *vring;
1044 vring = &tm_vdev->vrings[i];
1047 if (vring->desc)
1048 mlxbf_tmfifo_release_pkt(vring);
1049 vq = vring->vq;
1051 vring->vq = NULL;
1067 struct mlxbf_tmfifo_vring *vring;
1079 vring = &tm_vdev->vrings[i];
1081 /* zero vring */
1082 size = vring_size(vring->num, vring->align);
1083 memset(vring->va, 0, size);
1084 vq = vring_new_virtqueue(i, vring->num, vring->align, vdev,
1085 false, false, vring->va,
1094 vq->num_max = vring->num;
1096 vq->priv = vring;
1102 vring->vq = vq;
1220 dev_err(dev, "unable to allocate vring\n");