Re: [systemd-devel] [PATCH] udev: handle network controllers in nonstandard domains

2013-06-18 Thread Kay Sievers
On Wed, Jun 12, 2013 at 3:32 PM, Sean McGovern gsean...@gmail.com wrote:
 Onboard network controllers are not always on PCI domain 0.

Applied it with a couple of trivial changes.

Thanks,
Kay
___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel


[systemd-devel] [PATCH] udev: handle network controllers in nonstandard domains

2013-06-12 Thread Sean McGovern
Onboard network controllers are not always on PCI domain 0.
---
 src/udev/udev-builtin-net_id.c | 22 +-
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
index 5719021..c8d3ad3 100644
--- a/src/udev/udev-builtin-net_id.c
+++ b/src/udev/udev-builtin-net_id.c
@@ -35,13 +35,15 @@
  *   oindex  -- on-board device index number
  *   sslot[ffunction][ddev_id]   -- hotplug slot index number
  *   xMAC-- MAC address
- *   pbussslot[ffunction][ddev_id] -- PCI geographical location
+ *   [Pdomain]pbussslot[ffunction][ddev_id] -- PCI geographical 
location
  *   pbussslot[ffunction][uport][..][cconfig][iinterface]
  * -- USB port number chain
  *
  * All multi-function PCI devices will carry the [ffunction] number in the
  * device name, including the function 0 device.
  *
+ * When using PCI geography, The PCI domain is only prepended when it is not 0.
+ *
  * For USB devices the full chain of port numbers of hubs is composed. If the
  * name gets longer than the maximum number of 15 characters, the name is not
  * exported.
@@ -163,6 +165,7 @@ out:
 
 static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
 struct udev *udev = udev_device_get_udev(names-pcidev);
+unsigned long domain;
 unsigned int bus;
 unsigned int slot;
 unsigned int func;
@@ -171,6 +174,7 @@ static int dev_pci_slot(struct udev_device *dev, struct 
netnames *names) {
 char *s;
 const char *attr;
 struct udev_device *pci = NULL;
+char *sysname;
 char slots[256];
 DIR *dir;
 struct dirent *dent;
@@ -178,8 +182,10 @@ static int dev_pci_slot(struct udev_device *dev, struct 
netnames *names) {
 int hotplug_slot = 0;
 int err = 0;
 
-if (sscanf(udev_device_get_sysname(names-pcidev), :%x:%x.%d, 
bus, slot, func) != 3)
-return -ENOENT;
+sysname = udev_device_get_sysname(names-pcidev);
+
+if(sscanf(sysname, %lx:%x:%x.%d, domain, bus, slot, func) != 4)
+return -ENOENT;
 
 /* kernel provided multi-device index */
 attr = udev_device_get_sysattr_value(dev, dev_id);
@@ -188,7 +194,10 @@ static int dev_pci_slot(struct udev_device *dev, struct 
netnames *names) {
 
 /* compose a name based on the raw kernel's PCI bus, slot numbers */
 s = names-pci_path;
-l = strpcpyf(s, sizeof(names-pci_path), p%ds%d, bus, slot);
+l = sizeof(names-pci_path);
+if (domain  0)
+l = strpcpyf(s, l, P%ld, domain);
+l = strpcpyf(s, l, p%ds%d, bus, slot);
 if (func  0 || is_pci_multifunction(names-pcidev))
 l = strpcpyf(s, l, f%d, func);
 if (dev_id  0)
@@ -236,7 +245,10 @@ static int dev_pci_slot(struct udev_device *dev, struct 
netnames *names) {
 
 if (hotplug_slot  0) {
 s = names-pci_slot;
-l = strpcpyf(s, sizeof(names-pci_slot), s%d, hotplug_slot);
+l = sizeof(names-pci_slot);
+if (domain  0)
+l = strpcpyf(s, l, P%ld, domain);
+l = strpcpyf(s, l, s%d, hotplug_slot);
 if (func  0 || is_pci_multifunction(names-pcidev))
 l = strpcpyf(s, l, f%d, func);
 if (dev_id  0)
-- 
1.8.2.1

___
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel