summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorzms123456 <[email protected]>2024-07-13 22:16:03 +0800
committerGitHub <[email protected]>2024-07-13 22:16:03 +0800
commit4e8b8290ab9d04d9489140e04a5f64a8f9ed050c (patch)
treea664594197c7365512a0ca30da1225c563b001c3 /components
parent4122f6d8b898fa26ff528dce4d1f8afaa829e8a2 (diff)
[driver][virtio]fix virtio net rx error (#9170)
fix virtio net rx error
Diffstat (limited to 'components')
-rw-r--r--components/drivers/virtio/virtio_net.c56
1 files changed, 4 insertions, 52 deletions
diff --git a/components/drivers/virtio/virtio_net.c b/components/drivers/virtio/virtio_net.c
index 93a30eebab..d92421b656 100644
--- a/components/drivers/virtio/virtio_net.c
+++ b/components/drivers/virtio/virtio_net.c
@@ -24,10 +24,6 @@ static rt_err_t virtio_net_tx(rt_device_t dev, struct pbuf *p)
struct virtio_device *virtio_dev = &virtio_net_dev->virtio_dev;
struct virtq *queue_tx = &virtio_dev->queues[VIRTIO_NET_QUEUE_TX];
-#ifdef RT_USING_SMP
- rt_base_t level = rt_spin_lock_irqsave(&virtio_dev->spinlock);
-#endif
-
id = (queue_tx->avail->idx * 2) % queue_tx->num;
virtio_net_dev->info[id].hdr.flags = 0;
@@ -56,10 +52,6 @@ static rt_err_t virtio_net_tx(rt_device_t dev, struct pbuf *p)
virtio_alloc_desc(virtio_dev, VIRTIO_NET_QUEUE_TX);
virtio_alloc_desc(virtio_dev, VIRTIO_NET_QUEUE_TX);
-#ifdef RT_USING_SMP
- rt_spin_unlock_irqrestore(&virtio_dev->spinlock, level);
-#endif
-
return RT_EOK;
}
@@ -67,46 +59,26 @@ static struct pbuf *virtio_net_rx(rt_device_t dev)
{
rt_uint16_t id;
rt_uint32_t len;
- struct pbuf *p = RT_NULL, *new, *ret = RT_NULL;
+ struct pbuf *p = RT_NULL;
struct virtio_net_device *virtio_net_dev = (struct virtio_net_device *)dev;
struct virtio_device *virtio_dev = &virtio_net_dev->virtio_dev;
struct virtq *queue_rx = &virtio_dev->queues[VIRTIO_NET_QUEUE_RX];
- while (queue_rx->used_idx != queue_rx->used->idx)
+ if (queue_rx->used_idx != queue_rx->used->idx)
{
-#ifdef RT_USING_SMP
- rt_base_t level = rt_spin_lock_irqsave(&virtio_dev->spinlock);
-#endif
id = (queue_rx->used->ring[queue_rx->used_idx % queue_rx->num].id + 1) % queue_rx->num;
len = queue_rx->used->ring[queue_rx->used_idx % queue_rx->num].len - VIRTIO_NET_HDR_SIZE;
-#ifdef RT_USING_SMP
- rt_spin_unlock_irqrestore(&virtio_dev->spinlock, level);
-#endif
if (len > VIRTIO_NET_PAYLOAD_MAX_SIZE)
{
rt_kprintf("%s: Receive buffer's size = %u is too big!\n", virtio_net_dev->parent.parent.parent.name, len);
len = VIRTIO_NET_PAYLOAD_MAX_SIZE;
}
- new = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
-
- if (p != RT_NULL)
- {
- p->next = new;
- p = p->next;
- }
- else
- {
- p = new;
- ret = p;
- }
+ p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
if (p != RT_NULL)
{
-#ifdef RT_USING_SMP
- level = rt_spin_lock_irqsave(&virtio_dev->spinlock);
-#endif
rt_memcpy(p->payload, (void *)queue_rx->desc[id].addr - PV_OFFSET, len);
queue_rx->used_idx++;
@@ -114,18 +86,10 @@ static struct pbuf *virtio_net_rx(rt_device_t dev)
virtio_submit_chain(virtio_dev, VIRTIO_NET_QUEUE_RX, id - 1);
virtio_queue_notify(virtio_dev, VIRTIO_NET_QUEUE_RX);
-
-#ifdef RT_USING_SMP
- rt_spin_unlock_irqrestore(&virtio_dev->spinlock, level);
-#endif
- }
- else
- {
- break;
}
}
- return ret;
+ return p;
}
static rt_err_t virtio_net_init(rt_device_t dev)
@@ -214,10 +178,6 @@ static void virtio_net_isr(int irqno, void *param)
struct virtio_device *virtio_dev = &virtio_net_dev->virtio_dev;
struct virtq *queue_rx = &virtio_dev->queues[VIRTIO_NET_QUEUE_RX];
-#ifdef RT_USING_SMP
- rt_base_t level = rt_spin_lock_irqsave(&virtio_dev->spinlock);
-#endif
-
virtio_interrupt_ack(virtio_dev);
rt_hw_dsb();
@@ -227,10 +187,6 @@ static void virtio_net_isr(int irqno, void *param)
eth_device_ready(&virtio_net_dev->parent);
}
-
-#ifdef RT_USING_SMP
- rt_spin_unlock_irqrestore(&virtio_dev->spinlock, level);
-#endif
}
rt_err_t rt_virtio_net_init(rt_ubase_t *mmio_base, rt_uint32_t irq)
@@ -253,10 +209,6 @@ rt_err_t rt_virtio_net_init(rt_ubase_t *mmio_base, rt_uint32_t irq)
virtio_net_dev->config = (struct virtio_net_config *)virtio_dev->mmio_config->config;
-#ifdef RT_USING_SMP
- rt_spin_lock_init(&virtio_dev->spinlock);
-#endif
-
virtio_reset_device(virtio_dev);
virtio_status_acknowledge_driver(virtio_dev);