Hello community, here is the log from the commit of package biosdevname for openSUSE:Factory checked in at 2014-08-15 09:58:12 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/biosdevname (Old) and /work/SRC/openSUSE:Factory/.biosdevname.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "biosdevname" Changes: -------- --- /work/SRC/openSUSE:Factory/biosdevname/biosdevname.changes 2014-06-24 15:15:34.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.biosdevname.new/biosdevname.changes 2014-08-15 09:58:13.000000000 +0200 @@ -1,0 +2,8 @@ +Tue Aug 12 16:03:10 UTC 2014 - [email protected] + +- Add mainline commit: 51b8cdb0b60df3baa + With this patch, the info can be showed correctly if there are two or more + PCI root ports in the same Bus ID/Device ID (bnc#890562) + Add: fix_several_PCI_root_ports_in_one_bus.patch + +------------------------------------------------------------------- New: ---- fix_several_PCI_root_ports_in_one_bus.patch ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ biosdevname.spec ++++++ --- /var/tmp/diff_new_pack.Fjd602/_old 2014-08-15 09:58:15.000000000 +0200 +++ /var/tmp/diff_new_pack.Fjd602/_new 2014-08-15 09:58:15.000000000 +0200 @@ -16,6 +16,7 @@ # + Name: biosdevname Version: 0.5.0 Release: 0 @@ -34,6 +35,7 @@ Patch3: whitelist-dell Patch4: udev-rule-path.patch Patch5: biosdevname_udevrule_rename_all_network_devices.patch +Patch6: fix_several_PCI_root_ports_in_one_bus.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: automake BuildRequires: pciutils-devel @@ -65,6 +67,7 @@ %patch3 -p1 %patch4 -p1 %patch5 -p1 +%patch6 -p1 %build # this is a udev rule, so it needs to live in / rather than /usr ++++++ fix_several_PCI_root_ports_in_one_bus.patch ++++++ From: Jordan Hargrave <[email protected]> Subject: From Adrian Huang References: bnc#890562 Patch-Mainline: yes Git-commit: 51b8cdb0b60df3baa1be4ea3d8c303b0198465d3 Git-repo: linux.dell.com/biosdevname.git Signed-off-by: Thomas Renninger <[email protected]> The command "biosdevname -d" shows the field "SMBIOS Lable" with "MEZZ2" for all network interfaces when there are two or more PCI root ports in the same Bus ID/Device ID. With this patch, the info can be showed correctly if there are two or more PCI root ports in the same Bus ID/Device ID. For example, the field of the "p4p1" and "p4p2" would be showed as "MEZZ1". This patch is based on v0.5.1. Signed-off-by: Adrian Huang <[email protected]> diff --git a/src/dmidecode/dmidecode.c b/src/dmidecode/dmidecode.c index f766b8c..4acac01 100644 --- a/src/dmidecode/dmidecode.c +++ b/src/dmidecode/dmidecode.c @@ -48,6 +48,27 @@ extern int smver_mjr, smver_mnr, is_valid_smbios; #define dprintf(a...) #endif +struct dmi_type9 +{ + u8 hdrtype; + u8 hdrlength; + u16 hdrhandle; + + u8 ref; + u8 type; + u8 buswidth; + u8 usage; + u8 length; + u16 id; + u8 flags1; + /* 2.1+ */ + u8 flags2; + /* 2.6+ */ + u16 segment; + u8 bus; + u8 devfn; +} __attribute__((packed)); + static const char *bad_index = "<BAD INDEX>"; /* @@ -116,8 +137,7 @@ int smbios_setslot(const struct libbiosdevname_state *state, int domain, int bus, int device, int func, int type, int slot, int index, const char *label) { - struct pci_device *pdev, *n; - int i; + struct pci_device *pdev; dprintf("setslot: %.4x:%.2x:%.2x.%x = type:%x slot(%2d %2d) %s\n", domain, bus, device, func, type, slot, index, label); @@ -128,7 +148,7 @@ int smbios_setslot(const struct libbiosdevname_state *state, (bus == 0xFF && device == 0x1F && func == 0x7)) { dprintf(" disabled\n"); - return; + return -1; } list_for_each_entry(pdev, &state->pci_devices, node) { @@ -164,7 +184,8 @@ int smbios_setslot(const struct libbiosdevname_state *state, static void dmi_decode(struct dmi_header *h, u16 ver, const struct libbiosdevname_state *state) { u8 *data=h->data; - int domain, bus, device, function, i; + + int domain, bus, device, function; switch(h->type) { case 9: /* 3.3.10 System Slots */ @@ -173,7 +194,11 @@ static void dmi_decode(struct dmi_header *h, u16 ver, const struct libbiosdevnam bus = data[0x0F]; device = (data[0x10]>>3)&0x1F; function = data[0x10] & 7; - smbios_setslot(state, domain, bus, device, -1, + + /* Root ports can be on multiport device.. scan single */ + if (!is_root_port(state, domain, bus, device, function)) + function = -1; + smbios_setslot(state, domain, bus, device, function, 0x00, WORD(data+0x09), 0x00, dmi_string(h, data[0x04])); } diff --git a/src/pci.c b/src/pci.c index 7a7cb36..168cd59 100644 --- a/src/pci.c +++ b/src/pci.c @@ -876,3 +876,31 @@ struct pci_device * find_dev_by_pci_name(const struct libbiosdevname_state *stat return find_pci_dev_by_pci_addr(state, domain, bus, device, func); } + +int is_root_port(const struct libbiosdevname_state *state, + int domain, int bus, int device, int func) +{ + struct pci_device *pdev; + int pos; + u16 flag; + + pdev = find_pci_dev_by_pci_addr(state, domain, bus, device, func); + + if (!pdev || !pdev->pci_dev) + return 0; + + pos = pci_find_capability(pdev->pci_dev, PCI_CAP_ID_EXP); + if (pos != 0) { + u8 type; + + flag = pci_read_word(pdev->pci_dev, pos + PCI_EXP_FLAGS); + + type = (flag & PCI_EXP_FLAGS_TYPE) >> 4; + + if (type == PCI_EXP_TYPE_ROOT_PORT) + return 1; + } + + return 0; +} + diff --git a/src/pci.h b/src/pci.h index eacb539..ab2eb64 100644 --- a/src/pci.h +++ b/src/pci.h @@ -102,5 +102,7 @@ static inline int pci_domain_nr(const struct pci_dev *dev) } #endif +int is_root_port(const struct libbiosdevname_state *state, + int domain, int bus, int device, int func); #endif /* PCI_H_INCLUDED */ -- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
