static void virtio_blk_intr(unsigned int irqs) { if (virtio_had_irq(blk_dev)) virtio_blk_device_intr(); else virtio_blk_spurious_intr(); virtio_irq_enable(blk_dev); }
static void virtio_net_intr(message *m) { /* Check and clear interrupt flag */ if (virtio_had_irq(net_dev)) { virtio_net_check_queues(); } else { if (!spurious_interrupt) dput(("Spurious interrupt")); spurious_interrupt = 1; } virtio_net_check_pending(); virtio_irq_enable(net_dev); }
static void virtio_net_intr(unsigned int __unused mask) { /* Check and clear interrupt flag */ if (virtio_had_irq(net_dev)) { virtio_net_check_queues(); } else { if (!spurious_interrupt) dput(("Spurious interrupt")); spurious_interrupt = 1; } virtio_net_check_pending(); virtio_irq_enable(net_dev); /* Readd packets to the receive queue as necessary. */ virtio_net_refill_rx_queue(); }
int init_virtio_net() { virtio_dev_t dev = to_virtio_dev_t(&pci_vn); if (virtio_setup_device(dev, VIRTIO_NET_SUBID, 1)) { virtio_net_read_config(&pci_vn); /* virtio-net has at least 2 queues */ int queues = 2; if (pci_vn._ctrl_vq) { queues++; } int ret = virtio_alloc_queues(dev, queues); pci_d("virtio_alloc_queues ret:%d\n", ret); if (virtio_net_alloc_bufs() != OK) panic("%s: Buffer allocation failed", name); pci_d("virtio_net_alloc_bufs:%d\n", ret); virtio_net_init_queues(); pci_d("virtio_net_init_queues:%d\n", ret); /* Add packets to the receive queue. */ virtio_net_refill_rx_queue(); pci_d("virtio_net_refill_rx_queue:%d\n", ret); virtio_device_ready(to_virtio_dev_t(&pci_vn)); pci_d("virtio_device_ready:%d\n", ret); // virtio_irq_enable(to_virtio_dev_t(&pci_vn)); bool virtio_had_irq(struct virtio_device *dev); pci_d("had_irq:%d\n", virtio_had_irq(to_virtio_dev_t(&pci_vn))); set_timeout(1000, vn_timeout); sti(); } return OK; }