You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.8 KiB
72 lines
2.8 KiB
From 88eb414beca3ab29f40a6e422faa790ddaae2918 Mon Sep 17 00:00:00 2001 |
|
From: Tom Gundersen <teg@jklm.no> |
|
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 99caa0a2ab..6a5ada6883 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<number> -- BCMA bus core number |
|
* ccw<name> -- CCW bus group name |
|
- * o<index> -- on-board device index number |
|
+ * o<index>[d<dev_port>] -- on-board device index number |
|
* s<slot>[f<function>][d<dev_port>] -- hotplug slot index number |
|
* x<MAC> -- MAC address |
|
* [P<domain>]p<bus>s<slot>[f<function>][d<dev_id>/<dev_port>] |
|
@@ -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; |
|
} |
|
|
|
|