at v2.6.12 68 lines 1.7 kB view raw
1#include <linux/kernel.h> 2#include <linux/pci.h> 3#include <linux/module.h> 4#include "pci.h" 5 6int pci_hotplug (struct device *dev, char **envp, int num_envp, 7 char *buffer, int buffer_size) 8{ 9 struct pci_dev *pdev; 10 char *scratch; 11 int i = 0; 12 int length = 0; 13 14 if (!dev) 15 return -ENODEV; 16 17 pdev = to_pci_dev(dev); 18 if (!pdev) 19 return -ENODEV; 20 21 scratch = buffer; 22 23 /* stuff we want to pass to /sbin/hotplug */ 24 envp[i++] = scratch; 25 length += scnprintf (scratch, buffer_size - length, "PCI_CLASS=%04X", 26 pdev->class); 27 if ((buffer_size - length <= 0) || (i >= num_envp)) 28 return -ENOMEM; 29 ++length; 30 scratch += length; 31 32 envp[i++] = scratch; 33 length += scnprintf (scratch, buffer_size - length, "PCI_ID=%04X:%04X", 34 pdev->vendor, pdev->device); 35 if ((buffer_size - length <= 0) || (i >= num_envp)) 36 return -ENOMEM; 37 ++length; 38 scratch += length; 39 40 envp[i++] = scratch; 41 length += scnprintf (scratch, buffer_size - length, 42 "PCI_SUBSYS_ID=%04X:%04X", pdev->subsystem_vendor, 43 pdev->subsystem_device); 44 if ((buffer_size - length <= 0) || (i >= num_envp)) 45 return -ENOMEM; 46 ++length; 47 scratch += length; 48 49 envp[i++] = scratch; 50 length += scnprintf (scratch, buffer_size - length, "PCI_SLOT_NAME=%s", 51 pci_name(pdev)); 52 if ((buffer_size - length <= 0) || (i >= num_envp)) 53 return -ENOMEM; 54 55 envp[i++] = scratch; 56 length += scnprintf (scratch, buffer_size - length, 57 "MODALIAS=pci:v%08Xd%08Xsv%08Xsd%08Xbc%02Xsc%02Xi%02x\n", 58 pdev->vendor, pdev->device, 59 pdev->subsystem_vendor, pdev->subsystem_device, 60 (u8)(pdev->class >> 16), (u8)(pdev->class >> 8), 61 (u8)(pdev->class)); 62 if ((buffer_size - length <= 0) || (i >= num_envp)) 63 return -ENOMEM; 64 65 envp[i] = NULL; 66 67 return 0; 68}