These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / SLOF / lib / libvirtio / virtio-9p.c
index 5a5fd01..fc5db91 100644 (file)
@@ -19,6 +19,7 @@
 #include "virtio-9p.h"
 #include "p9.h"
 
+static struct vqs vq;
 
 /**
  * Notes for 9P Server config:
@@ -86,7 +87,7 @@ static void dprint_buffer(const char *name, uint8_t *buffer, int length)
  * @return     0 = success, -ve = error.
  */
 static int virtio_9p_transact(void *opaque, uint8_t *tx, int tx_size, uint8_t *rx,
-                             int *rx_size)
+                             uint32_t *rx_size)
 {
        struct virtio_device *dev = opaque;
        struct vring_desc *desc;
@@ -165,6 +166,7 @@ int virtio_9p_init(struct virtio_device *dev, void *tx_buf, void *rx_buf,
                   int buf_size)
 {
        struct vring_avail *vq_avail;
+       int status = VIRTIO_STAT_ACKNOWLEDGE;
 
        /* Check for double open */
        if (__buf_size)
@@ -174,28 +176,31 @@ int virtio_9p_init(struct virtio_device *dev, void *tx_buf, void *rx_buf,
         dprintf("%s : device at %p\n", __func__, dev->base);
         dprintf("%s : type is %04x\n", __func__, dev->type);
 
-       /* Reset device */
-       // XXX That will clear the virtq base. We need to move
-       //     initializing it to here anyway
-       //
-       //       virtio_reset_device(dev);
+       /* Keep it disabled until the driver is 1.0 capable */
+       dev->is_modern = false;
+
+       virtio_reset_device(dev);
 
        /* Acknowledge device. */
-       virtio_set_status(dev, VIRTIO_STAT_ACKNOWLEDGE);
+       virtio_set_status(dev, status);
 
        /* Tell HV that we know how to drive the device. */
-       virtio_set_status(dev, VIRTIO_STAT_ACKNOWLEDGE | VIRTIO_STAT_DRIVER);
+       status |= VIRTIO_STAT_DRIVER;
+       virtio_set_status(dev, status);
 
        /* Device specific setup - we do not support special features */
        virtio_set_guest_features(dev,  0);
 
+       if (virtio_queue_init_vq(dev, &vq, 0))
+               goto dev_error;
+
        vq_avail = virtio_get_vring_avail(dev, 0);
        vq_avail->flags = VRING_AVAIL_F_NO_INTERRUPT;
        vq_avail->idx = 0;
 
        /* Tell HV that setup succeeded */
-       virtio_set_status(dev, VIRTIO_STAT_ACKNOWLEDGE | VIRTIO_STAT_DRIVER
-                         |VIRTIO_STAT_DRIVER_OK);
+       status |= VIRTIO_STAT_DRIVER_OK;
+       virtio_set_status(dev, status);
 
        /* Setup 9P library. */
        p9_reg_transport(virtio_9p_transact, dev,(uint8_t *)tx_buf,
@@ -203,6 +208,12 @@ int virtio_9p_init(struct virtio_device *dev, void *tx_buf, void *rx_buf,
 
        dprintf("%s : complete\n", __func__);
        return 0;
+
+dev_error:
+       printf("%s: failed\n", __func__);
+       status |= VIRTIO_STAT_FAILED;
+       virtio_set_status(dev, status);
+       return -1;
 }
 
 /**
@@ -228,7 +239,7 @@ void virtio_9p_shutdown(struct virtio_device *dev)
  * @param buffer[out]  Where to read the file to.
  * @return     +ve = amount of data read, -ve = error.
  */
-int virtio_9p_load(struct virtio_device *dev, const char *file_name, uint8_t *buffer)
+long virtio_9p_load(struct virtio_device *dev, const char *file_name, uint8_t *buffer)
 {
        int rc;
        uint16_t tag_len;
@@ -332,5 +343,5 @@ cleanup_connection:
 
 
        dprintf("%s : complete, read %llu bytes\n", __func__, offset);
-       return rc == 0 ? offset : rc;
+       return rc == 0 ? (long)offset : rc;
 }