hotplug.c 1.7 KB

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