13 return time.strftime(format,time.localtime())
15 def modprobe(module, args = ""):
16 ret = os.system("/sbin/modprobe %s %s" % (module, args))
17 if os.WEXITSTATUS(ret) == 0:
18 globals()['loadedmodules'].write("%s\n" % module)
25 kernel = os.uname()[2]
29 if os.path.exists(kernel):
32 path = "/lib/modules/%s/modules.pcimap" % kernel
34 blacklisted_modules = []
35 blacklists = ("blacklist", "blacklist-compat", "blacklist-firewire")
36 for blacklist in blacklists:
37 blf = "/etc/modprobe.d/%s" % blacklist
38 if os.path.exists(blf):
40 for i in f.readlines():
41 if i.startswith("blacklist"):
42 blacklisted_modules.append(i.split()[1])
44 blacklisted_modules = list(set(blacklisted_modules))
46 pcimap = pypcimap.PCIMap(path)
47 print now(),"pl_hwinit: loading applicable modules"
48 devices = pypci.get_devices()
52 globals()['loadedmodules'] = file('/tmp/loadedmodules', 'w')
53 for slot in sorted(devices.keys()):
55 modules = pcimap.get(dev)
56 base = (dev[4] & 0xff0000) >> 16
58 if base == 0x01 or base == 0x02:
59 # storage or network device, in that order
60 missing.append((slot, dev))
67 # FIXME: This needs improved logic in the case of multiple matching modules
68 for module in modules:
69 if module not in blacklisted_modules:
70 print now(),"pl_hwinit: found and loading module %s (%s)" % (module, slot)
73 if network_devices == 0:
74 print now(),"pl_hwinit: no supported network devices found!"
75 print now(),"pl_hwinit: the following devices were found, but have no driver:"
76 print now(),"pl_hwinit: ", "\npl_hwinit: ".join(missing)
78 # XXX: could check for storage devices too, but older kernels have a lot of that built-in
80 # sd_mod won't get loaded automatically
81 print now(),"pl_hwinit: loading sd_mod"
84 # load usb_storage to support node conf files on flash disks
85 print now(),"pl_hwinit: loading usb_storage"
86 modprobe("usb_storage")
88 print now(),"pl_hwinit: loading floppy device driver"
89 modprobe("floppy","floppy=0,allowed_drive_mask")
91 # always wait a bit between loading the usb drivers, and checking /sys/
92 # for usb devices (this isn't necessarily for waiting for mass storage files,
94 print now(),"pl_hwinit: waiting for usb system to initialize."
97 # sometimes, flash devices take a while to initialize. in fact, the kernel
98 # intentionally waits 5 seconds for a device to 'settle'. some take even longer
99 # to show up. if there are any mass storage devices on the system, try to
100 # delay until they come online, up to a max delay of 30s.
102 # the way this will be done is to look for files in /sys/devices that are named
103 # 'bInterfaceClass', these will be a list of the usb devices on the system, and
104 # their primary usb device interface class ids. The base directory these files
105 # exist in will be the full path to the /sys/device entry for that device.
106 # for each mass storage devices (they have an interface class value of 08),
107 # we wait for a new symbolic link named 'driver' to exist in that directory,
108 # indicating the kernel loaded a driver for that device.
110 # usb interface class id for mass storage
111 INTERFACE_CLASS_MASS_STORAGE = "08"
113 # how long to wait in seconds before continuing on if devices
115 MAX_USB_WAIT_TIME = 30
117 # low long in seconds to wait between checks
118 PER_CHECK_USB_WAIT_TIME = 5
121 # find out if the device identified by the /sys dir has a module
122 # loaded for it. check for a symlink in the dir named driver.
123 def does_device_dir_have_driver(device):
124 return os.path.exists(os.path.join(device, "driver"))
126 def filter_and_add(list, directory, files):
127 if ("bInterfaceClass" in files and
128 int(file(os.path.join(directory, "bInterfaceClass")).read(), 16) == INTERFACE_CLASS_MASS_STORAGE):
129 list.append(directory)
132 os.path.walk("/sys/devices", filter_and_add, wait_dev_list)
134 if len(wait_dev_list) > 0:
135 print now(),"pl_hwinit: found USB mass storage device(s). Attempting to wait"
136 print now(),"pl_hwinit: up to %d seconds for them to come online." % MAX_USB_WAIT_TIME
140 while total_wait_time < MAX_USB_WAIT_TIME:
141 total_wait_time += PER_CHECK_USB_WAIT_TIME
143 print now(),"pl_hwinit: waiting %d seconds." % PER_CHECK_USB_WAIT_TIME
144 time.sleep(PER_CHECK_USB_WAIT_TIME)
146 all_devices_online = True
147 for device in wait_dev_list:
148 if not does_device_dir_have_driver(device):
149 all_devices_online = False
151 if all_devices_online:
153 print now(),"pl_hwinit: looks like the devices are now online."
156 print now(),"pl_hwinit: not all devices online yet, waiting..."
159 print now(),"pl_hwinit: Succesfully waited for USB mass storage devices"
160 print now(),"pl_hwinit: to come online."
162 print now(),"pl_hwinit: One or more USB mass storage devices did not"
163 print now(),"pl_hwinit: initialize in time. Continuing anyway."
165 if __name__ == "__main__":