bool device_lost;
        unsigned int config_ready;
        void *airq_info;
+       u64 dma_mask;
 };
 
 struct vq_info_block_legacy {
                info->info_block->s.desc = queue;
                info->info_block->s.index = i;
                info->info_block->s.num = info->num;
-               info->info_block->s.avail = (__u64)virtqueue_get_avail(vq);
-               info->info_block->s.used = (__u64)virtqueue_get_used(vq);
+               info->info_block->s.avail = (__u64)virtqueue_get_avail_addr(vq);
+               info->info_block->s.used = (__u64)virtqueue_get_used_addr(vq);
                ccw->count = sizeof(info->info_block->s);
        }
        ccw->cmd_code = CCW_CMD_SET_VQ;
 static void ccw_transport_features(struct virtio_device *vdev)
 {
        /*
-        * Packed ring isn't enabled on virtio_ccw for now,
-        * because virtio_ccw uses some legacy accessors,
-        * e.g. virtqueue_get_avail() and virtqueue_get_used()
-        * which aren't available in packed ring currently.
+        * There shouldn't be anything that precludes supporting packed.
+        * TODO: Remove the limitation after having another look into this.
         */
        __virtio_clear_bit(vdev, VIRTIO_F_RING_PACKED);
 }
                ret = -ENOMEM;
                goto out_free;
        }
+
+       vcdev->vdev.dev.parent = &cdev->dev;
+       cdev->dev.dma_mask = &vcdev->dma_mask;
+       /* we are fine with common virtio infrastructure using 64 bit DMA */
+       ret = dma_set_mask_and_coherent(&cdev->dev, DMA_BIT_MASK(64));
+       if (ret) {
+               dev_warn(&cdev->dev, "Failed to enable 64-bit DMA.\n");
+               goto out_free;
+       }
+
        vcdev->config_block = kzalloc(sizeof(*vcdev->config_block),
                                   GFP_DMA | GFP_KERNEL);
        if (!vcdev->config_block) {
 
        vcdev->is_thinint = virtio_ccw_use_airq; /* at least try */
 
-       vcdev->vdev.dev.parent = &cdev->dev;
        vcdev->vdev.dev.release = virtio_ccw_release_dev;
        vcdev->vdev.config = &virtio_ccw_config_ops;
        vcdev->cdev = cdev;
 
 dma_addr_t virtqueue_get_avail_addr(struct virtqueue *vq);
 dma_addr_t virtqueue_get_used_addr(struct virtqueue *vq);
 
-/*
- * Legacy accessors -- in almost all cases, these are the wrong functions
- * to use.
- */
-static inline void *virtqueue_get_desc(struct virtqueue *vq)
-{
-       return virtqueue_get_vring(vq)->desc;
-}
-static inline void *virtqueue_get_avail(struct virtqueue *vq)
-{
-       return virtqueue_get_vring(vq)->avail;
-}
-static inline void *virtqueue_get_used(struct virtqueue *vq)
-{
-       return virtqueue_get_vring(vq)->used;
-}
-
 /**
  * virtio_device - representation of a device using virtio
  * @index: unique position on the virtio bus