|
@@ -20,9 +20,6 @@
|
|
/* The pointer to our (page) of device descriptions. */
|
|
/* The pointer to our (page) of device descriptions. */
|
|
static void *lguest_devices;
|
|
static void *lguest_devices;
|
|
|
|
|
|
-/* Unique numbering for lguest devices. */
|
|
|
|
-static unsigned int dev_index;
|
|
|
|
-
|
|
|
|
/* For Guests, device memory can be used as normal memory, so we cast away the
|
|
/* For Guests, device memory can be used as normal memory, so we cast away the
|
|
* __iomem to quieten sparse. */
|
|
* __iomem to quieten sparse. */
|
|
static inline void *lguest_map(unsigned long phys_addr, unsigned long pages)
|
|
static inline void *lguest_map(unsigned long phys_addr, unsigned long pages)
|
|
@@ -325,8 +322,10 @@ static struct device lguest_root = {
|
|
* As Andrew Tridgell says, "Untested code is buggy code".
|
|
* As Andrew Tridgell says, "Untested code is buggy code".
|
|
*
|
|
*
|
|
* It's worth reading this carefully: we start with a pointer to the new device
|
|
* It's worth reading this carefully: we start with a pointer to the new device
|
|
- * descriptor in the "lguest_devices" page. */
|
|
|
|
-static void add_lguest_device(struct lguest_device_desc *d)
|
|
|
|
|
|
+ * descriptor in the "lguest_devices" page, and the offset into the device
|
|
|
|
+ * descriptor page so we can uniquely identify it if things go badly wrong. */
|
|
|
|
+static void add_lguest_device(struct lguest_device_desc *d,
|
|
|
|
+ unsigned int offset)
|
|
{
|
|
{
|
|
struct lguest_device *ldev;
|
|
struct lguest_device *ldev;
|
|
|
|
|
|
@@ -334,18 +333,14 @@ static void add_lguest_device(struct lguest_device_desc *d)
|
|
* it. */
|
|
* it. */
|
|
ldev = kzalloc(sizeof(*ldev), GFP_KERNEL);
|
|
ldev = kzalloc(sizeof(*ldev), GFP_KERNEL);
|
|
if (!ldev) {
|
|
if (!ldev) {
|
|
- printk(KERN_EMERG "Cannot allocate lguest dev %u\n",
|
|
|
|
- dev_index++);
|
|
|
|
|
|
+ printk(KERN_EMERG "Cannot allocate lguest dev %u type %u\n",
|
|
|
|
+ offset, d->type);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
/* This devices' parent is the lguest/ dir. */
|
|
/* This devices' parent is the lguest/ dir. */
|
|
ldev->vdev.dev.parent = &lguest_root;
|
|
ldev->vdev.dev.parent = &lguest_root;
|
|
/* We have a unique device index thanks to the dev_index counter. */
|
|
/* We have a unique device index thanks to the dev_index counter. */
|
|
- ldev->vdev.index = dev_index++;
|
|
|
|
- /* The device type comes straight from the descriptor. There's also a
|
|
|
|
- * device vendor field in the virtio_device struct, which we leave as
|
|
|
|
- * 0. */
|
|
|
|
ldev->vdev.id.device = d->type;
|
|
ldev->vdev.id.device = d->type;
|
|
/* We have a simple set of routines for querying the device's
|
|
/* We have a simple set of routines for querying the device's
|
|
* configuration information and setting its status. */
|
|
* configuration information and setting its status. */
|
|
@@ -357,8 +352,8 @@ static void add_lguest_device(struct lguest_device_desc *d)
|
|
* virtio_device and calls device_register(). This makes the bus
|
|
* virtio_device and calls device_register(). This makes the bus
|
|
* infrastructure look for a matching driver. */
|
|
* infrastructure look for a matching driver. */
|
|
if (register_virtio_device(&ldev->vdev) != 0) {
|
|
if (register_virtio_device(&ldev->vdev) != 0) {
|
|
- printk(KERN_ERR "Failed to register lguest device %u\n",
|
|
|
|
- ldev->vdev.index);
|
|
|
|
|
|
+ printk(KERN_ERR "Failed to register lguest dev %u type %u\n",
|
|
|
|
+ offset, d->type);
|
|
kfree(ldev);
|
|
kfree(ldev);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -379,7 +374,7 @@ static void scan_devices(void)
|
|
break;
|
|
break;
|
|
|
|
|
|
printk("Device at %i has size %u\n", i, desc_size(d));
|
|
printk("Device at %i has size %u\n", i, desc_size(d));
|
|
- add_lguest_device(d);
|
|
|
|
|
|
+ add_lguest_device(d, i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|