Driver Setup for Virtio driver

Tim Bisson bissont at mac.com
Sat Oct 23 16:52:57 PDT 2010


Hi,

I started porting the NetBSD virtio drivers from NetBSD to DragonFly. 
I'm currently working through the virtio-net attach routine and setting 
up the appropriate infrastructure.

I believe I'm creating the drivers incorrectly. To set some context, I'm 
developing with a networking virtio device on VirtualBox. When I start 
the dragonfly VM, there is a single PCI device that shows up, which is a 
virtio device:
00:08.0 Ethernet controller: Qumranet, Inc. Virtio network device

The way I currently have the drivers structured is there a virtiobus 
driver (pci child), which has all the infrastructure routines, and then 
there are child drivers: virtio-net, virtio-blk, etc, which will end up 
calling routines in the virtiobus driver to setup dma, etc.

When I load the virtiobus driver, probe and attach are successfull for 
that PCI device. Then when I load the virtio-net driver, probe isn't 
called because that device has already been satisfied. In order to get 
around that, I implemented the identify() routine in the virtio-net 
driver, which is called when I load the driver. If the device is of our 
type (networking, block, etc), then we add a new child device to the 
parent (virtiobus) of the appropriate type and force a probe. The pseudo 
code is below.

virtiobus.c:
virtio_probe(){
    if (is virtio device){ /*pci_get_device*()*/
        return 0;
    }
}
virtio-net.c:
netvirtio_identify(){
    if (is a virtio network subdevice){ /*pci_read_config(subdevice)*/
        dev = device_add_child();
        bus_generic_probe(dev);
    }
}
netvirtio_probe(){
    return 0; /*only called if identify succeeds*/
}
netvirtio_attach(){
    set stuff up;
}
I'm not sure if this was the right way to go about it, so any 
tips/suggestions are appreciated.
Tim

The code I'm currently working on is at:
http://gitorious.org/virtio-drivers





More information about the Kernel mailing list