From 8412dc83e50649c6b3e2f27579f5a2cd6501a5c6 Mon Sep 17 00:00:00 2001 From: Marc Fiuczynski Date: Fri, 24 Mar 2006 04:45:15 +0000 Subject: [PATCH] Support "other storage device" PCI class. Fix to search for drivers that match the full PCI_ID first and then look for drivers that use PCI_ANY for subdevice and subvendor ids. --- source/systeminfo.py | 170 +++++++++++++++++++++++++------------------ 1 file changed, 101 insertions(+), 69 deletions(-) diff --git a/source/systeminfo.py b/source/systeminfo.py index aa31e10..8de50b7 100755 --- a/source/systeminfo.py +++ b/source/systeminfo.py @@ -66,7 +66,7 @@ import os import popen2 import merge_hw_tables - +hwdatapath = "usr/share/hwdata" class systeminfo: """ a utility class for finding and returning information about @@ -93,10 +93,15 @@ class systeminfo: MODULE_CLASS_NETWORK= "network" MODULE_CLASS_SCSI= "scsi" - PCI_CLASS_NETWORK= "0200" - PCI_CLASS_RAID= "0104" - PCI_CLASS_RAID2= "0100" - PCI_CLASS_IDE= "0101" + PCI_CLASS_NETWORK_ETHERNET=0x0200L + PCI_CLASS_STORAGE_SCSI=0x0100L + PCI_CLASS_STORAGE_IDE=0x0101L + PCI_CLASS_STORAGE_FLOPPY=0x0102L + PCI_CLASS_STORAGE_IPI=0x0103L + PCI_CLASS_STORAGE_RAID=0x0104L + PCI_CLASS_STORAGE_OTHER=0x0180L + + PCI_ANY=0xffffffffL def get_total_phsyical_mem(self): """ @@ -330,7 +335,7 @@ class systeminfo: print( "Using kernel version %s" % kernel_version ) # test to make sure the three files we need are present - pcitable_path = "%s/usr/share/hwdata/pcitable" % install_root + pcitable_path = "%s/%s/pcitable" % (install_root,hwdatapath) modules_pcimap_path = "%s/lib/modules/%s/modules.pcimap" % \ (install_root,kernel_version) modules_dep_path = "%s/lib/modules/%s/modules.dep" % \ @@ -371,6 +376,9 @@ class systeminfo: else: print( "Successfully ran %s" % self.LSPCI_CMD ) + # for every lspci line, parse in the four tuple PCI id and the + # search for the corresponding driver from the dictionary + # generated by merge_hw_tables for line in lspci_prog.fromchild: if string.strip(line) == "": continue @@ -379,86 +387,110 @@ class systeminfo: try: classid= self.remove_quotes(parts[2]) + classid= long(classid,16) except IndexError: - print( "Skipping invalid line:", string.strip(line) ) + print( "Skipping invalid classid:", string.strip(line) ) continue + except ValueError, e: + print( "Skipping invalid classid:", string.strip(line) ) + continue + - if classid not in (self.PCI_CLASS_NETWORK, - self.PCI_CLASS_RAID, - self.PCI_CLASS_RAID2, - self.PCI_CLASS_IDE): + if classid not in (self.PCI_CLASS_NETWORK_ETHERNET, + self.PCI_CLASS_STORAGE_SCSI, + self.PCI_CLASS_STORAGE_RAID, + self.PCI_CLASS_STORAGE_OTHER, + self.PCI_CLASS_STORAGE_IDE): continue + vendorid = self.PCI_ANY + deviceid = self.PCI_ANY + subvendorid = self.PCI_ANY + subdeviceid = self.PCI_ANY + + # parse in vendorid try: vendorid= self.remove_quotes(parts[3]) vendorid= long(vendorid,16) + except IndexError: + print( "Skipping invalid vendorid:", string.strip(line) ) + continue + except ValueError, e: + print( "Skipping invalid vendorid:", string.strip(line) ) + continue + + # parse in deviceid + try: deviceid= self.remove_quotes(parts[4]) deviceid= long(deviceid,16) except IndexError: - print( "Skipping invalid line:", string.strip(line) ) + print( "Skipping invalid deviceid:", string.strip(line) ) continue except ValueError, e: - print( "Skipping invalid line:", string.strip(line) ) + print( "Skipping invalid deviceid:", string.strip(line) ) continue + # Now get the subvendor & subdevice portion by searching + # parts[5:] of the lspci output. Note that we have to skip + # the portions of the lspci output string that indicate + # revision info. - # full device id with subvednor & subdevice set to ANY - PCI_ANY = 0xffffffffL - full_id= (vendorid,deviceid,PCI_ANY,PCI_ANY) - module = all_pci_ids.get(full_id, None) - if module is None: - # continue searching parts[5:] for module with - # subvendor first and then subdevice - subvendorindex = -1 - subdeviceindex = -1 - for i in range(5,len(parts)): - p = self.remove_quotes(parts[i]) - if p[0] != '-': - subvendorindex = i - break - - if subvendorindex != -1: - try: - subvendorid= self.remove_quotes(parts[subvendorindex]) - subvendorid= long(subvendorid,16) - except IndexError: - print( "Skipping invalid line:", string.strip(line) ) - continue - except ValueError, e: - print( "Skipping invalid line:", string.strip(line) ) - continue - - full_id=(vendorid,deviceid,subvendorid,PCI_ANY) - module = all_pci_ids.get(full_id, None) - if module is None: - for i in range(subvendorindex+1,len(parts)): - p = self.remove_quotes(parts[i]) - if p[0] != '-': - subdeviceindex = i - break + # parse in subvendorid + subvendorindex = -1 + for i in range(5,len(parts)): + p = self.remove_quotes(parts[i]) + if p[0] != '-': + subvendorindex = i + break - if subdeviceindex != -1: - try: - subdeviceid= self.remove_quotes(parts[subdeviceindex]) - subdeviceid= long(subdeviceid,16) - except IndexError: - print( "Skipping invalid line:", string.strip(line) ) - continue - except ValueError, e: - print( "Skipping invalid line:", string.strip(line) ) - continue - - full_id= (vendorid,deviceid,subvendorid,subdeviceid) - module = all_pci_ids.get(full_id, None) - if module is None: - continue - - if classid == self.PCI_CLASS_NETWORK: - network_mods.append(module[0]) - elif classid in (self.PCI_CLASS_RAID, - self.PCI_CLASS_RAID2, - self.PCI_CLASS_IDE): - scsi_mods.append(module[0]) + if subvendorindex != -1: + try: + subvendorid= self.remove_quotes(parts[subvendorindex]) + subvendorid= long(subvendorid,16) + except IndexError: + print( "Skipping invalid line:", string.strip(line) ) + continue + except ValueError, e: + print( "Skipping invalid line:", string.strip(line) ) + continue + + # parse in subdeviceid + subdeviceindex = -1 + for i in range(subvendorindex+1,len(parts)): + p = self.remove_quotes(parts[i]) + if p[0] != '-': + subdeviceindex = i + break + if subdeviceindex != -1: + error_msg = "Skipping invalid subdeviceid:" + try: + subdeviceid= self.remove_quotes(parts[subdeviceindex]) + subdeviceid= long(subdeviceid,16) + except IndexError: + print( error_msg, string.strip(line) ) + continue + except ValueError, e: + print( error_msg, string.strip(line) ) + continue + + # search for driver that most closely matches the full_id + # to drivers that can handle any subvendor/subdevice + # version of the hardware. + full_ids = ((vendorid,deviceid,subvendorid,subdeviceid), + (vendorid,deviceid,subvendorid,self.PCI_ANY), + (vendorid,deviceid,self.PCI_ANY,self.PCI_ANY)) + + for full_id in full_ids: + module = all_pci_ids.get(full_id, None) + if module is not None: + if classid == self.PCI_CLASS_NETWORK_ETHERNET: + network_mods.append(module[0]) + elif classid in (self.PCI_CLASS_STORAGE_SCSI, + self.PCI_CLASS_STORAGE_RAID, + self.PCI_CLASS_STORAGE_OTHER, + self.PCI_CLASS_STORAGE_IDE): + scsi_mods.append(module[0]) + break system_mods[self.MODULE_CLASS_SCSI]= scsi_mods system_mods[self.MODULE_CLASS_NETWORK]= network_mods -- 2.43.0