diff options
Diffstat (limited to 'mdk-stage1')
-rw-r--r-- | mdk-stage1/.cvsignore | 1 | ||||
-rw-r--r-- | mdk-stage1/Makefile | 26 | ||||
-rw-r--r-- | mdk-stage1/probing.c | 144 | ||||
-rw-r--r-- | mdk-stage1/probing.h | 2 | ||||
-rw-r--r-- | mdk-stage1/usb-resource/.cvsignore | 1 | ||||
-rw-r--r-- | mdk-stage1/usb-resource/Makefile | 25 | ||||
-rwxr-xr-x | mdk-stage1/usb-resource/update-usb-ids.pl | 73 |
7 files changed, 248 insertions, 24 deletions
diff --git a/mdk-stage1/.cvsignore b/mdk-stage1/.cvsignore index c2cd01c54..36f56f6b5 100644 --- a/mdk-stage1/.cvsignore +++ b/mdk-stage1/.cvsignore @@ -8,3 +8,4 @@ debug.log *.rdz* mkinitrd_helper.tar.bz2 hack_* +stage1-usbnet diff --git a/mdk-stage1/Makefile b/mdk-stage1/Makefile index a27d829a9..52a7fe792 100644 --- a/mdk-stage1/Makefile +++ b/mdk-stage1/Makefile @@ -43,7 +43,7 @@ top_dir = . include $(top_dir)/Makefile.common -DEFS = -DVERSION=\"$(VERSION)\" #-DSPAWN_SHELL +DEFS = -DVERSION=\"$(VERSION)\" -DSPAWN_SHELL COMPILE = $(CC) $(DEFS) $(CFLAGS) @@ -122,6 +122,9 @@ STAGE1OBJS-NETWORK = $(subst .c,-NETWORK.o,$(STAGE1SRC) $(NETWORKSRC)) NETWORK_DEFS = -DDISABLE_CDROM -DDISABLE_DISK +STAGE1OBJS-USBNET = $(subst .c,-USBNET.o,$(STAGE1SRC) $(NETWORKSRC)) + + STAGE1OBJS-FULL = $(subst .c,-FULL.o,$(STAGE1SRC) $(CDROMSRC) $(DISKSRC) $(NETWORKSRC)) @@ -141,13 +144,13 @@ endif BINS = init stage1-full ifeq (i386, $(ARCH)) -BINS += stage1-cdrom stage1-disk stage1-network +BINS += stage1-cdrom stage1-disk stage1-network stage1-usbnet endif ifneq (ia64, $(ARCH)) DIRS = dietlibc endif -DIRS += mar pci-resource bzlib $(INSMOD) slang newt ppp/pppd rp-pppoe/src +DIRS += mar pci-resource usb-resource bzlib $(INSMOD) slang newt ppp/pppd rp-pppoe/src ifeq (i386,$(ARCH)) DIRS += pcmcia endif @@ -161,6 +164,9 @@ PCMCIA_DEFS = -DENABLE_PCMCIA endif +USBNET_DEFS_GEN = -DENABLE_USB -DENABLE_USBNET +USBNET_DEFS = $(USBNET_DEFS_GEN) -DDISABLE_PCINET + all: dirs $(BINS) dirs: @@ -184,6 +190,10 @@ stage1-network: $(STAGE1OBJS-NETWORK) $(STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(CC) $(LDFLAGS_STAGE1) -o $@ $^ $(STRIPCMD) $@ +stage1-usbnet: $(STAGE1OBJS-USBNET) $(STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) $(STAGE1_LIBC) + $(CC) $(LDFLAGS_STAGE1) -o $@ $^ + $(STRIPCMD) $@ + stage1-full: $(STAGE1OBJS-FULL) $(STAGE1_OWN_LIBS) $(STAGE1_NETWORK_LIBS) $(FRONTEND_LINK) $(PCMCIA_LIB) $(STAGE1_LIBC) $(CC) $(LDFLAGS_STAGE1) -o $@ $^ $(STRIPCMD) $@ @@ -201,8 +211,11 @@ $(STAGE1OBJS-DISK): %-DISK.o: %.c $(STAGE1OBJS-NETWORK): %-NETWORK.o: %.c $(COMPILE) $(INCLUDES) $(NETWORK_DEFS) -c $< -o $@ +$(STAGE1OBJS-USBNET): %-USBNET.o: %.c + $(COMPILE) $(INCLUDES) $(NETWORK_DEFS) $(USBNET_DEFS) -c $< -o $@ + $(STAGE1OBJS-FULL): %-FULL.o: %.c - $(COMPILE) $(INCLUDES) $(PCMCIA_DEFS) -c $< -o $@ + $(COMPILE) $(INCLUDES) $(USBNET_DEFS_GEN) $(PCMCIA_DEFS) -c $< -o $@ .c.o: $(COMPILE) $(INCLUDES) -c $< @@ -238,3 +251,8 @@ endif *-DISK.o: %-DISK.o: %.o *-NETWORK.o: %-NETWORK.o: %.o + +*-USBNET.o: %-USBNET.o: %.o + +*-FULL.o: %-FULL.o: %.o + diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c index dc8340ea8..420f863d2 100644 --- a/mdk-stage1/probing.c +++ b/mdk-stage1/probing.c @@ -22,7 +22,7 @@ /* * This contains stuff related to probing: - * (1) any (actually SCSI and NET only) devices (autoprobe for PCI) + * (1) any (actually only SCSI, NET, USB Controllers) devices (autoprobe for PCI and USB) * (2) IDE media * (3) SCSI media * (4) ETH devices @@ -39,12 +39,16 @@ #include <sys/socket.h> #include <net/if.h> #include <sys/ioctl.h> +#include <sys/mount.h> #include "stage1.h" #include "log.h" #include "frontend.h" #include "modules.h" #include "pci-resource/pci-ids.h" +#ifdef ENABLE_USB +#include "usb-resource/usb-ids.h" +#endif #include "probing.h" @@ -61,9 +65,14 @@ struct media_info { static void warning_insmod_failed(enum insmod_return r) { - if (r != INSMOD_OK - && !(IS_AUTOMATIC && r == INSMOD_FAILED_FILE_NOT_FOUND)) - stg1_error_message("Warning, installation of driver failed. (please include msg from <Alt-F3> for bugreports)"); + if (IS_AUTOMATIC && r == INSMOD_FAILED_FILE_NOT_FOUND) + return; + if (r != INSMOD_OK) { + if (r == INSMOD_FAILED_FILE_NOT_FOUND) + stg1_error_message("This floppy doesn't contain the driver."); + else + stg1_error_message("Warning, installation of driver failed. (please include msg from <Alt-F3> for bugreports)"); + } } #ifndef DISABLE_NETWORK @@ -116,37 +125,47 @@ char * get_net_intf_description(char * intf_name) static void probe_that_type(enum driver_type type) { - if (IS_EXPERT) + if (IS_EXPERT) { ask_insmod(type); - else { - /* ---- PCI probe */ + return; + } + + + /* ---- PCI probe ---------------------------------------------- */ + { FILE * f; int len = 0; char buf[200]; struct pci_module_map * pcidb = NULL; - f = fopen("/proc/bus/pci/devices", "rb"); - - if (!f) { - log_message("PCI: could not open proc file"); - return; - } - switch (type) { - case SCSI_ADAPTERS: #ifndef DISABLE_MEDIAS + case SCSI_ADAPTERS: pcidb = scsi_pci_ids; len = scsi_num_ids; -#endif break; - case NETWORK_DEVICES: +#endif #ifndef DISABLE_NETWORK +#ifndef DISABLE_PCINET + case NETWORK_DEVICES: pcidb = eth_pci_ids; len = eth_num_ids; + break; +#endif #endif +#ifdef ENABLE_USB + case USB_CONTROLLERS: + pcidb = usb_pci_ids; + len = usb_num_ids; break; +#endif default: - return; + goto end_pci_probe; + } + + if (!(f = fopen("/proc/bus/pci/devices", "rb"))) { + log_message("PCI: could not open proc file"); + goto end_pci_probe; } while (1) { @@ -186,12 +205,96 @@ static void probe_that_type(enum driver_type type) net_discovered_interface(NULL); } #endif +#ifdef ENABLE_USB + if (type == USB_CONTROLLERS) { + stg1_info_message("About to load driver for usb controller `%s'.", pcidb[i].module); + warning_insmod_failed(my_insmod(pcidb[i].module, USB_CONTROLLERS, NULL)); + } +#endif } } } + fclose(f); + end_pci_probe: + } + +#ifdef ENABLE_USB + /* ---- USB probe ---------------------------------------------- */ + { + static int already_probed_usb_controllers = 0; + static int already_mounted_usbdev = 0; + + FILE * f; + int len = 0; + char buf[200]; + struct usb_module_map * usbdb = NULL; + + switch (type) { +#ifdef ENABLE_USBNET + case NETWORK_DEVICES: + usbdb = usbnet_usb_ids; + len = usbnet_usb_num_ids; + break; +#endif + default: + goto end_usb_probe; + } + + if (!already_probed_usb_controllers) { + already_probed_usb_controllers = 1; + probe_that_type(USB_CONTROLLERS); + } + + if (!already_mounted_usbdev) { + already_mounted_usbdev = 1; + if (mount("/proc/bus/usb", "/proc/bus/usb", "usbdevfs", 0, NULL)) { + log_message("USB: couldn't mount /proc/bus/usb"); + goto end_usb_probe; + } + wait_message("Waiting for USB stuff to show up."); + sleep(2); /* sucking background work */ + remove_wait_message(); + } + + if (!(f = fopen("/proc/bus/usb/devices", "rb"))) { + log_message("USB: could not open proc file"); + goto end_usb_probe; + } + + while (1) { + int i, vendor, id; + + if (!fgets(buf, sizeof(buf), f)) break; + + if (strstr(buf, "Keyboard")) { + my_insmod("usbkbd", ANY_DRIVER_TYPE, NULL); + my_insmod("keybdev", ANY_DRIVER_TYPE, NULL); + } + + if (sscanf(buf, "P: Vendor=%x ProdID=%x", &vendor, &id) != 2) + continue; + + for (i = 0; i < len; i++) { + if (usbdb[i].vendor == vendor && usbdb[i].id == id) { + log_message("USB: device %04x %04x is \"%s\" (%s)", vendor, id, usbdb[i].name, usbdb[i].module); +#ifdef ENABLE_USBNET + if (type == NETWORK_DEVICES) { + stg1_info_message("About to load driver for usb network device:\n \n%s", usbdb[i].name); + prepare_intf_descr(usbdb[i].name); + warning_insmod_failed(my_insmod(usbdb[i].module, NETWORK_DEVICES, NULL)); + if (intf_descr_for_discover) /* for modules providing more than one net intf */ + net_discovered_interface(NULL); + } +#endif + + } + } + } fclose(f); + end_usb_probe: } +#endif } @@ -470,10 +573,13 @@ int net_device_available(char * device) { char ** get_net_devices(void) { char * devices[] = { - "eth0", "eth1", "eth2", "eth3", + "eth0", "eth1", "eth2", "eth3", "eth4", "eth5", "tr0", "plip0", "plip1", "plip2", "fddi0", +#ifdef ENABLE_USBNET + "usb0", "usb1", "usb2", "usb3", +#endif NULL }; char ** ptr = devices; diff --git a/mdk-stage1/probing.h b/mdk-stage1/probing.h index ea618b7b1..d2bf1e567 100644 --- a/mdk-stage1/probing.h +++ b/mdk-stage1/probing.h @@ -24,7 +24,7 @@ enum media_type { CDROM, DISK, FLOPPY, TAPE, UNKNOWN_MEDIA }; -enum driver_type { SCSI_ADAPTERS, NETWORK_DEVICES, ANY_DRIVER_TYPE }; +enum driver_type { SCSI_ADAPTERS, NETWORK_DEVICES, USB_CONTROLLERS, ANY_DRIVER_TYPE }; void get_medias(enum media_type media, char *** names, char *** models); char ** get_net_devices(void); diff --git a/mdk-stage1/usb-resource/.cvsignore b/mdk-stage1/usb-resource/.cvsignore new file mode 100644 index 000000000..a7d0cfa9a --- /dev/null +++ b/mdk-stage1/usb-resource/.cvsignore @@ -0,0 +1 @@ +usb-ids.h diff --git a/mdk-stage1/usb-resource/Makefile b/mdk-stage1/usb-resource/Makefile new file mode 100644 index 000000000..eb80ce6da --- /dev/null +++ b/mdk-stage1/usb-resource/Makefile @@ -0,0 +1,25 @@ + #****************************************************************************** + # + # $Id$ + # + # Guillaume Cottenceau (gc@mandrakesoft.com) + # + # Copyright 2000 MandrakeSoft + # + # This software may be freely redistributed under the terms of the GNU + # public license. + # + # You should have received a copy of the GNU General Public License + # along with this program; if not, write to the Free Software + # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + # + #***************************************************************************** + + +all: usb-ids.h + +usb-ids.h: /usr/share/ldetect-lst/usbtable update-usb-ids.pl + perl update-usb-ids.pl > $@ || rm -f $@ + +clean: + rm -f usb-ids.h diff --git a/mdk-stage1/usb-resource/update-usb-ids.pl b/mdk-stage1/usb-resource/update-usb-ids.pl new file mode 100755 index 000000000..b7184bade --- /dev/null +++ b/mdk-stage1/usb-resource/update-usb-ids.pl @@ -0,0 +1,73 @@ +#!/usr/bin/perl + + +sub cat_ { local *F; open F, $_[0] or $_[1] ? die "cat of file $_[0] failed: $!\n" : return; my @l = <F>; wantarray ? @l : join '', @l } + + +-x "../mar/mar" or die "\t*FAILED* Sorry, need ../mar/mar binary\n"; + + +my @usbtable_tmp = cat_("/usr/share/ldetect-lst/usbtable"); +my @usbtable; +foreach (@usbtable_tmp) { + next if /\s*#/; + /\s*(\S+)\s+(\S+)\s+"(\S+)"\s+"([^"]*)"/ or next; + push @usbtable, { 'vendor' => $1, 'id' => $2, 'module' => $3, 'description' => $4 }; +} + + +print ' +struct usb_module_map { + unsigned short vendor; /* vendor */ + unsigned short id; /* device */ + const char *name; /* human readable name */ + const char *module; /* module to load */ +}; +'; + +print "#ifdef ENABLE_USB +struct pci_module_map usb_pci_ids[] = { + +"; + +require '/usr/bin/merge2pcitable.pl'; +my $drivers = read_pcitable("/usr/share/ldetect-lst/pcitable"); + +while (my ($k, $v) = each %$drivers) { + $v->[0] =~ /^usb-/ or next; + $k =~ /^(....)(....)/; + printf qq|\t{ 0x%s, 0x%s, "", "%s" },\n|, + $1, $2, $v->[0]; +} + +print "}; +int usb_num_ids=sizeof(usb_pci_ids)/sizeof(struct pci_module_map); +#endif +"; + + +my @t = ('usbnet'); + + +foreach $type (@t) { + my $modulez; + foreach (glob("../../all.modules/*/${type}_modules.mar")) { + -f $_ or die "\t*FAILED* Sorry, need $_ mar file\n"; + push @$modulez, (`../mar/mar -l $_`); + } + + print "#ifdef ENABLE_".uc($type)." +struct usb_module_map ${type}_usb_ids[] = { +"; + foreach my $usbentry (@usbtable) { + grep(/^\t$usbentry->{'module'}\.o\s/, @$modulez) or next; + printf qq|\t{ %s, %s, ( "%s" ), ( "%s" ) },\n|, + $usbentry->{'vendor'}, $usbentry->{'id'}, $usbentry->{'description'}, $usbentry->{'module'}; + } + + print "}; +int ${type}_usb_num_ids=sizeof(${type}_usb_ids)/sizeof(struct usb_module_map); +#endif +"; + +} |