293{
296 void *vq_addr;
298 unsigned long ring_size, heap_size;
300
301
305 }
306
307
309
310
314 } else {
316 }
317 }
318
320 if (vq_addr ==
NULL) {
322 }
323
324
329 } else {
333 }
334
335 if (!vq) {
337 goto err_new_queue;
338 }
339
340
348
350
354 "%p: bad notification offset %u (x %u) "
355 "for queue %u > %zd",
360 goto err_map_notify;
361 }
364 } else {
369 }
370
373 goto err_map_notify;
374 }
375
377 msix_vec =
vdev->
device->set_queue_vector(vq, msix_vec);
380 goto err_assign_vector;
381 }
382 }
383
384
386
389
390err_assign_vector:
391err_map_notify:
393err_new_queue:
397}
static NTSTATUS vio_modern_query_vq_alloc(VirtIODevice *vdev, unsigned index, unsigned short *pNumEntries, unsigned long *pRingSize, unsigned long *pHeapSize)
struct virtqueue * vring_new_virtqueue_packed(unsigned int index, unsigned int num, unsigned int vring_align, VirtIODevice *vdev, void *pages, void(*notify)(struct virtqueue *), void *control)
struct virtqueue * vring_new_virtqueue_split(unsigned int index, unsigned int num, unsigned int vring_align, VirtIODevice *vdev, void *pages, void(*notify)(struct virtqueue *), void *control)
#define NT_SUCCESS(StatCode)
#define STATUS_DEVICE_BUSY
#define STATUS_INSUFFICIENT_RESOURCES
#define mem_get_physical_address(vdev, virt)
#define mem_alloc_nonpaged_block(vdev, size)
#define iowrite64_twopart(vdev, val, lo_addr, hi_addr)
#define mem_alloc_contiguous_pages(vdev, size)
void vp_notify(struct virtqueue *vq)