[NETKVM] Import NetKVM network adapter driver by Red Hat
[reactos.git] / drivers / network / dd / netkvm / virtio / VirtIO.h
diff --git a/drivers/network/dd/netkvm/virtio/VirtIO.h b/drivers/network/dd/netkvm/virtio/VirtIO.h
new file mode 100644 (file)
index 0000000..030e918
--- /dev/null
@@ -0,0 +1,128 @@
+#ifndef _LINUX_VIRTIO_H
+#define _LINUX_VIRTIO_H
+
+#include "virtio_ring.h"
+
+#define scatterlist VirtIOBufferDescriptor
+
+struct VirtIOBufferDescriptor {
+    PHYSICAL_ADDRESS physAddr;
+    ULONG length;
+};
+
+typedef int (*proc_virtqueue_add_buf)(
+    struct virtqueue *vq,
+    struct scatterlist sg[],
+    unsigned int out_num,
+    unsigned int in_num,
+    void *opaque,
+    void *va_indirect,
+    ULONGLONG phys_indirect);
+
+typedef bool(*proc_virtqueue_kick_prepare)(struct virtqueue *vq);
+
+typedef void(*proc_virtqueue_kick_always)(struct virtqueue *vq);
+
+typedef void * (*proc_virtqueue_get_buf)(struct virtqueue *vq, unsigned int *len);
+
+typedef void(*proc_virtqueue_disable_cb)(struct virtqueue *vq);
+
+typedef bool(*proc_virtqueue_enable_cb)(struct virtqueue *vq);
+
+typedef bool(*proc_virtqueue_enable_cb_delayed)(struct virtqueue *vq);
+
+typedef void * (*proc_virtqueue_detach_unused_buf)(struct virtqueue *vq);
+
+typedef BOOLEAN(*proc_virtqueue_is_interrupt_enabled)(struct virtqueue *vq);
+
+typedef BOOLEAN(*proc_virtqueue_has_buf)(struct virtqueue *vq);
+
+typedef void(*proc_virtqueue_shutdown)(struct virtqueue *vq);
+
+/* Represents one virtqueue; only data pointed to by the vring structure is exposed to the host */
+struct virtqueue {
+    VirtIODevice *vdev;
+    unsigned int index;
+    void (*notification_cb)(struct virtqueue *vq);
+    void         *notification_addr;
+    void         *avail_va;
+    void         *used_va;
+    proc_virtqueue_add_buf add_buf;
+    proc_virtqueue_kick_prepare kick_prepare;
+    proc_virtqueue_kick_always kick_always;
+    proc_virtqueue_get_buf get_buf;
+    proc_virtqueue_disable_cb disable_cb;
+    proc_virtqueue_enable_cb enable_cb;
+    proc_virtqueue_enable_cb_delayed enable_cb_delayed;
+    proc_virtqueue_detach_unused_buf detach_unused_buf;
+    proc_virtqueue_is_interrupt_enabled is_interrupt_enabled;
+    proc_virtqueue_has_buf has_buf;
+    proc_virtqueue_shutdown shutdown;
+};
+
+static inline int virtqueue_add_buf(
+    struct virtqueue *vq,
+    struct scatterlist sg[],
+    unsigned int out_num,
+    unsigned int in_num,
+    void *opaque,
+    void *va_indirect,
+    ULONGLONG phys_indirect)
+{
+    return vq->add_buf(vq, sg, out_num, in_num, opaque, va_indirect, phys_indirect);
+}
+
+static inline bool virtqueue_kick_prepare(struct virtqueue *vq)
+{
+    return vq->kick_prepare(vq);
+}
+
+static inline void virtqueue_kick_always(struct virtqueue *vq)
+{
+    vq->kick_always(vq);
+}
+
+static inline void *virtqueue_get_buf(struct virtqueue *vq, unsigned int *len)
+{
+    return vq->get_buf(vq, len);
+}
+
+static inline void virtqueue_disable_cb(struct virtqueue *vq)
+{
+    vq->disable_cb(vq);
+}
+
+static inline bool virtqueue_enable_cb(struct virtqueue *vq)
+{
+    return vq->enable_cb(vq);
+}
+
+static inline bool virtqueue_enable_cb_delayed(struct virtqueue *vq)
+{
+    return vq->enable_cb_delayed(vq);
+}
+
+static inline void *virtqueue_detach_unused_buf(struct virtqueue *vq)
+{
+    return vq->detach_unused_buf(vq);
+}
+
+static inline BOOLEAN virtqueue_is_interrupt_enabled(struct virtqueue *vq)
+{
+    return vq->is_interrupt_enabled(vq);
+}
+
+static inline BOOLEAN virtqueue_has_buf(struct virtqueue *vq)
+{
+    return vq->has_buf(vq);
+}
+
+static inline void virtqueue_shutdown(struct virtqueue *vq)
+{
+    vq->shutdown(vq);
+}
+
+void virtqueue_notify(struct virtqueue *vq);
+void virtqueue_kick(struct virtqueue *vq);
+
+#endif /* _LINUX_VIRTIO_H */