Skip to content

Commit 4e8b829

Browse files
authored
[driver][virtio]fix virtio net rx error (#9170)
fix virtio net rx error
1 parent 4122f6d commit 4e8b829

File tree

1 file changed

+4
-52
lines changed

1 file changed

+4
-52
lines changed

Diff for: components/drivers/virtio/virtio_net.c

+4-52
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@ static rt_err_t virtio_net_tx(rt_device_t dev, struct pbuf *p)
2424
struct virtio_device *virtio_dev = &virtio_net_dev->virtio_dev;
2525
struct virtq *queue_tx = &virtio_dev->queues[VIRTIO_NET_QUEUE_TX];
2626

27-
#ifdef RT_USING_SMP
28-
rt_base_t level = rt_spin_lock_irqsave(&virtio_dev->spinlock);
29-
#endif
30-
3127
id = (queue_tx->avail->idx * 2) % queue_tx->num;
3228

3329
virtio_net_dev->info[id].hdr.flags = 0;
@@ -56,76 +52,44 @@ static rt_err_t virtio_net_tx(rt_device_t dev, struct pbuf *p)
5652
virtio_alloc_desc(virtio_dev, VIRTIO_NET_QUEUE_TX);
5753
virtio_alloc_desc(virtio_dev, VIRTIO_NET_QUEUE_TX);
5854

59-
#ifdef RT_USING_SMP
60-
rt_spin_unlock_irqrestore(&virtio_dev->spinlock, level);
61-
#endif
62-
6355
return RT_EOK;
6456
}
6557

6658
static struct pbuf *virtio_net_rx(rt_device_t dev)
6759
{
6860
rt_uint16_t id;
6961
rt_uint32_t len;
70-
struct pbuf *p = RT_NULL, *new, *ret = RT_NULL;
62+
struct pbuf *p = RT_NULL;
7163
struct virtio_net_device *virtio_net_dev = (struct virtio_net_device *)dev;
7264
struct virtio_device *virtio_dev = &virtio_net_dev->virtio_dev;
7365
struct virtq *queue_rx = &virtio_dev->queues[VIRTIO_NET_QUEUE_RX];
7466

75-
while (queue_rx->used_idx != queue_rx->used->idx)
67+
if (queue_rx->used_idx != queue_rx->used->idx)
7668
{
77-
#ifdef RT_USING_SMP
78-
rt_base_t level = rt_spin_lock_irqsave(&virtio_dev->spinlock);
79-
#endif
8069
id = (queue_rx->used->ring[queue_rx->used_idx % queue_rx->num].id + 1) % queue_rx->num;
8170
len = queue_rx->used->ring[queue_rx->used_idx % queue_rx->num].len - VIRTIO_NET_HDR_SIZE;
8271

83-
#ifdef RT_USING_SMP
84-
rt_spin_unlock_irqrestore(&virtio_dev->spinlock, level);
85-
#endif
8672
if (len > VIRTIO_NET_PAYLOAD_MAX_SIZE)
8773
{
8874
rt_kprintf("%s: Receive buffer's size = %u is too big!\n", virtio_net_dev->parent.parent.parent.name, len);
8975
len = VIRTIO_NET_PAYLOAD_MAX_SIZE;
9076
}
9177

92-
new = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
93-
94-
if (p != RT_NULL)
95-
{
96-
p->next = new;
97-
p = p->next;
98-
}
99-
else
100-
{
101-
p = new;
102-
ret = p;
103-
}
78+
p = pbuf_alloc(PBUF_RAW, len, PBUF_RAM);
10479

10580
if (p != RT_NULL)
10681
{
107-
#ifdef RT_USING_SMP
108-
level = rt_spin_lock_irqsave(&virtio_dev->spinlock);
109-
#endif
11082
rt_memcpy(p->payload, (void *)queue_rx->desc[id].addr - PV_OFFSET, len);
11183

11284
queue_rx->used_idx++;
11385

11486
virtio_submit_chain(virtio_dev, VIRTIO_NET_QUEUE_RX, id - 1);
11587

11688
virtio_queue_notify(virtio_dev, VIRTIO_NET_QUEUE_RX);
117-
118-
#ifdef RT_USING_SMP
119-
rt_spin_unlock_irqrestore(&virtio_dev->spinlock, level);
120-
#endif
121-
}
122-
else
123-
{
124-
break;
12589
}
12690
}
12791

128-
return ret;
92+
return p;
12993
}
13094

13195
static rt_err_t virtio_net_init(rt_device_t dev)
@@ -214,10 +178,6 @@ static void virtio_net_isr(int irqno, void *param)
214178
struct virtio_device *virtio_dev = &virtio_net_dev->virtio_dev;
215179
struct virtq *queue_rx = &virtio_dev->queues[VIRTIO_NET_QUEUE_RX];
216180

217-
#ifdef RT_USING_SMP
218-
rt_base_t level = rt_spin_lock_irqsave(&virtio_dev->spinlock);
219-
#endif
220-
221181
virtio_interrupt_ack(virtio_dev);
222182
rt_hw_dsb();
223183

@@ -227,10 +187,6 @@ static void virtio_net_isr(int irqno, void *param)
227187

228188
eth_device_ready(&virtio_net_dev->parent);
229189
}
230-
231-
#ifdef RT_USING_SMP
232-
rt_spin_unlock_irqrestore(&virtio_dev->spinlock, level);
233-
#endif
234190
}
235191

236192
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)
253209

254210
virtio_net_dev->config = (struct virtio_net_config *)virtio_dev->mmio_config->config;
255211

256-
#ifdef RT_USING_SMP
257-
rt_spin_lock_init(&virtio_dev->spinlock);
258-
#endif
259-
260212
virtio_reset_device(virtio_dev);
261213
virtio_status_acknowledge_driver(virtio_dev);
262214

0 commit comments

Comments
 (0)