static int virtio_blk_probe(int skip) { int r; /* sub device id for virtio-blk is 0x0002 */ blk_dev = virtio_setup_device(0x0002, name, blkf, sizeof(blkf) / sizeof(blkf[0]), VIRTIO_BLK_NUM_THREADS, skip); if (!blk_dev) return ENXIO; /* virtio-blk has one queue only */ if ((r = virtio_alloc_queues(blk_dev, 1)) != OK) { virtio_free_device(blk_dev); return r; } /* Allocate memory for headers and status */ if ((r = virtio_blk_alloc_requests() != OK)) { virtio_free_queues(blk_dev); virtio_free_device(blk_dev); return r; } virtio_blk_config(); /* Let the host now that we are ready */ virtio_device_ready(blk_dev); virtio_irq_enable(blk_dev); return OK; }
static void virtio_blk_cleanup(void) { /* Just free the memory we allocated */ virtio_blk_free_requests(); virtio_reset_device(blk_dev); virtio_free_queues(blk_dev); virtio_free_device(blk_dev); blk_dev = NULL; }
/* * The driver is terminating. Clean up. */ static void virtio_net_stop(void) { dput(("Terminating")); free_contig(data_vir, PACKET_BUF_SZ); free_contig(hdrs_vir, BUF_PACKETS * sizeof(hdrs_vir[0])); free(packets); virtio_reset_device(net_dev); virtio_free_queues(net_dev); virtio_free_device(net_dev); net_dev = NULL; }
static void sef_cb_signal_handler(int signo) { if (signo != SIGTERM) return; dput(("Terminating")); free_contig(data_vir, PACKET_BUF_SZ); free_contig(hdrs_vir, BUF_PACKETS * sizeof(hdrs_vir[0])); free(packets); virtio_reset_device(net_dev); virtio_free_queues(net_dev); virtio_free_device(net_dev); net_dev = NULL; exit(1); }