From 88eb414beca3ab29f40a6e422faa790ddaae2918 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Wed, 1 Apr 2015 16:51:02 +0200 Subject: [PATCH] udev: net_id - support multi-port enpo* device names I'd argue that having firmware labels for such devices makes no sense, but they exist, so make sure we handle them as best as we can. --- src/udev/udev-builtin-net_id.c | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c index 99caa0a2a..6a5ada688 100644 --- a/src/udev/udev-builtin-net_id.c +++ b/src/udev/udev-builtin-net_id.c @@ -35,7 +35,7 @@ * Type of names: * b -- BCMA bus core number * ccw -- CCW bus group name - * o -- on-board device index number + * o[d] -- on-board device index number * s[f][d] -- hotplug slot index number * x -- MAC address * [P]ps[f][d/] @@ -128,22 +128,39 @@ struct netnames { /* retrieve on-board index number and label from firmware */ static int dev_pci_onboard(struct udev_device *dev, struct netnames *names) { - const char *index; + unsigned dev_port = 0; + size_t l; + char *s; + const char *attr; int idx; /* ACPI _DSM -- device specific method for naming a PCI or PCI Express device */ - index = udev_device_get_sysattr_value(names->pcidev, "acpi_index"); + attr = udev_device_get_sysattr_value(names->pcidev, "acpi_index"); /* SMBIOS type 41 -- Onboard Devices Extended Information */ - if (!index) - index = udev_device_get_sysattr_value(names->pcidev, "index"); - if (!index) + if (!attr) + attr = udev_device_get_sysattr_value(names->pcidev, "index"); + if (!attr) return -ENOENT; - idx = strtoul(index, NULL, 0); + + idx = strtoul(attr, NULL, 0); if (idx <= 0) return -EINVAL; - snprintf(names->pci_onboard, sizeof(names->pci_onboard), "o%d", idx); + + /* kernel provided multi-device index */ + attr = udev_device_get_sysattr_value(dev, "dev_port"); + if (attr) + dev_port = strtol(attr, NULL, 10); + + s = names->pci_onboard; + l = sizeof(names->pci_onboard); + l = strpcpyf(&s, l, "o%d", idx); + if (dev_port > 0) + l = strpcpyf(&s, l, "d%d", dev_port); + if (l == 0) + names->pci_onboard[0] = '\0'; names->pci_onboard_label = udev_device_get_sysattr_value(names->pcidev, "label"); + return 0; }