From 17ac5e9fec1e07bd18ae1407043c300cb4695ede Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Fri, 9 Dec 2005 05:36:41 +0000 Subject: [PATCH] Push the fallback drivers to the end of the list so driver probe order stays useful. --- hw/xfree86/common/xf86Config.c | 48 +++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 6f724effe..4cfe8c2d2 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -458,9 +458,55 @@ static char ** GenerateDriverlist(char * dirname, char * drivernames) { #ifdef XFree86LOADER + char **ret; char *subdirs[] = { dirname, NULL }; static const char *patlist[] = {"(.*)_drv\\.so", "(.*)_drv\\.o", NULL}; - return LoaderListDirs(subdirs, patlist); + ret = LoaderListDirs(subdirs, patlist); + + /* fix up the probe order for video drivers */ + if (strstr(dirname, "drivers")) { + char **tmp, **vesa, **vga, **fbdev, **wsfb; + char *x; + + /* walk to the end of the list */ + for (tmp = ret; *tmp && **tmp; tmp++) ; + tmp--; + + /* + * for each of the fallback drivers, if we find it in the list, + * swap it with the last available non-fallback driver. + */ + for (vga = ret; vga != tmp; vga++) { + if (strstr(*vga, "vga")) { + x = *vga; *vga = *tmp; *tmp = x; + tmp--; + break; + } + } + for (vesa = ret; vesa != tmp; vesa++) { + if (strstr(*vesa, "vesa")) { + x = *vesa; *vesa = *tmp; *tmp = x; + tmp--; + break; + } + } + for (fbdev = ret; fbdev != tmp; fbdev++) { + if (strstr(*fbdev, "fbdev")) { + x = *fbdev; *fbdev = *tmp; *fbdev = x; + tmp--; + break; + } + } + for (wsfb = ret; wsfb != tmp; wsfb++) { + if (strstr(*wsfb, "wsfb")) { + x = *wsfb; *wsfb = *tmp; *wsfb = x; + tmp--; + break; + } + } + } + + return ret; #else /* non-loadable server */ char *cp, **driverlist; int count;