summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdk-stage1/Makefile2
-rw-r--r--mdk-stage1/NEWS3
-rw-r--r--mdk-stage1/probing.c55
-rw-r--r--mdk-stage1/probing.h9
-rw-r--r--mdk-stage1/stage1.c2
5 files changed, 69 insertions, 2 deletions
diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile
index 334511a31..067670198 100644
--- a/mdk-stage1/Makefile
+++ b/mdk-stage1/Makefile
@@ -15,7 +15,7 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-VERSION=1.40
+VERSION=1.41
PRODUCT=drakx-installer-binaries
#
diff --git a/mdk-stage1/NEWS b/mdk-stage1/NEWS
index c010ca27a..55c4fa5c9 100644
--- a/mdk-stage1/NEWS
+++ b/mdk-stage1/NEWS
@@ -1,3 +1,6 @@
+1.41:
+- load needed modules for known virtio devices, fixes #51804
+
1.39:
- set uevent helper which will load firmware and do not set firmware
timeout to 1 second (it will fail if firmware is not there)
diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c
index 632827e34..4ca30fbe4 100644
--- a/mdk-stage1/probing.c
+++ b/mdk-stage1/probing.c
@@ -315,6 +315,54 @@ void probe_pci_modules(enum driver_type type, char **pci_modules, unsigned int
pciusb_free(&entries);
}
+/** Loads modules for known virtio devices
+ *
+ * virtio modules are not being loaded using the PCI probing mechanism
+ * because pcitable.gz does not have IDs for these devices.
+ *
+ * The possible correct solution for it is to fix the script which
+ * generates pcitable.gz to handle the virtio_device_id structure.
+ */
+void probe_virtio_modules(void)
+{
+ struct pciusb_entries entries;
+ int i;
+ char *name;
+ char *options;
+
+ entries = pci_probe();
+ for (i = 0; i < entries.nb; i++) {
+ struct pciusb_entry *e = &entries.entries[i];
+ if (e->vendor == VIRTIO_PCI_VENDOR) {
+ name = NULL;
+ options = NULL;
+
+ switch (e->device) {
+ case VIRTIO_ID_PCI:
+ name = "virtio_pci";
+ break;
+ case VIRTIO_ID_NET:
+ name = "virtio_net";
+ options = "csum=0";
+ break;
+ case VIRTIO_ID_BLOCK:
+ name = "virtio_blk";
+ break;
+ case VIRTIO_ID_BALLOON:
+ name = "virtio_balloon";
+ break;
+ default:
+ log_message("warning: unknown virtio device %04x", e->device);
+ }
+ if (name) {
+ log_message("virtio: loading %s", name);
+ my_insmod(name, ANY_DRIVER_TYPE, options, 0);
+ }
+ }
+ }
+ pciusb_free(&entries);
+}
+
#ifdef ENABLE_USB
void probe_that_type(enum driver_type type, enum media_bus bus)
#else
@@ -323,6 +371,7 @@ void probe_that_type(enum driver_type type, enum media_bus bus __attribute__ ((u
{
static int already_probed_usb_controllers = 0;
static int already_loaded_usb_scsi = 0;
+ static int already_probed_virtio_devices = 0;
/* ---- PCI probe ---------------------------------------------- */
if (bus != BUS_USB) {
@@ -352,6 +401,12 @@ void probe_that_type(enum driver_type type, enum media_bus bus __attribute__ ((u
probe_pci_modules(type, usb_controller_modules, usb_controller_modules_len);
break;
#endif
+ case VIRTIO_DEVICES:
+ if (already_probed_virtio_devices)
+ break;
+ probe_virtio_modules();
+ already_probed_virtio_devices = 1;
+ break;
default:
break;
}
diff --git a/mdk-stage1/probing.h b/mdk-stage1/probing.h
index 5b4c8d080..15dec7392 100644
--- a/mdk-stage1/probing.h
+++ b/mdk-stage1/probing.h
@@ -24,10 +24,17 @@
enum media_type { CDROM, DISK, FLOPPY, TAPE, UNKNOWN_MEDIA };
-enum driver_type { MEDIA_ADAPTERS, NETWORK_DEVICES, USB_CONTROLLERS, ANY_DRIVER_TYPE };
+enum driver_type { MEDIA_ADAPTERS, NETWORK_DEVICES, USB_CONTROLLERS,
+ VIRTIO_DEVICES, ANY_DRIVER_TYPE };
enum media_bus { BUS_IDE, BUS_SCSI, BUS_USB, BUS_PCMCIA, BUS_ANY };
+#define VIRTIO_PCI_VENDOR 0x1af4
+#define VIRTIO_ID_PCI 0x1000
+#define VIRTIO_ID_NET 0x1001
+#define VIRTIO_ID_BLOCK 0x1002
+#define VIRTIO_ID_BALLOON 0x1005
+
void find_media(enum media_bus bus);
void get_medias(enum media_type media, char *** names, char *** models, enum media_bus bus);
char ** get_net_devices(void);
diff --git a/mdk-stage1/stage1.c b/mdk-stage1/stage1.c
index 8376e7e79..47473e9d7 100644
--- a/mdk-stage1/stage1.c
+++ b/mdk-stage1/stage1.c
@@ -426,6 +426,8 @@ int main(int argc __attribute__ ((unused)), char **argv __attribute__ ((unused))
init_firmware_loader();
init_frontend("Welcome to " DISTRIB_DESCR ", " __DATE__ " " __TIME__);
+ probe_that_type(VIRTIO_DEVICES, BUS_ANY);
+
/* load usb interface as soon as possible, helps usb mouse detection in stage2 */
probe_that_type(USB_CONTROLLERS, BUS_USB);