names.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * PCI Class and Device Name Tables
  3.  *
  4.  * Copyright 1993--1999 Drew Eckhardt, Frederic Potter,
  5.  * David Mosberger-Tang, Martin Mares
  6.  */
  7. #include <linux/config.h>
  8. #include <linux/types.h>
  9. #include <linux/kernel.h>
  10. #include <linux/pci.h>
  11. #include <linux/init.h>
  12. #ifdef CONFIG_PCI_NAMES
  13. struct pci_device_info {
  14. unsigned short device;
  15. unsigned short seen;
  16. const char *name;
  17. };
  18. struct pci_vendor_info {
  19. unsigned short vendor;
  20. unsigned short nr;
  21. const char *name;
  22. struct pci_device_info *devices;
  23. };
  24. /*
  25.  * This is ridiculous, but we want the strings in
  26.  * the .init section so that they don't take up
  27.  * real memory.. Parse the same file multiple times
  28.  * to get all the info.
  29.  */
  30. #define VENDOR( vendor, name ) static char __vendorstr_##vendor[] __initdata = name;
  31. #define ENDVENDOR()
  32. #define DEVICE( vendor, device, name )  static char __devicestr_##vendor##device[] __initdata = name;
  33. #include "devlist.h"
  34. #define VENDOR( vendor, name ) static struct pci_device_info __devices_##vendor[] __initdata = {
  35. #define ENDVENDOR() };
  36. #define DEVICE( vendor, device, name ) { 0x##device, 0, __devicestr_##vendor##device },
  37. #include "devlist.h"
  38. static struct pci_vendor_info __initdata pci_vendor_list[] = {
  39. #define VENDOR( vendor, name ) { 0x##vendor, sizeof(__devices_##vendor) / sizeof(struct pci_device_info), __vendorstr_##vendor, __devices_##vendor },
  40. #define ENDVENDOR()
  41. #define DEVICE( vendor, device, name )
  42. #include "devlist.h"
  43. };
  44. #define VENDORS (sizeof(pci_vendor_list)/sizeof(struct pci_vendor_info))
  45. void __devinit pci_name_device(struct pci_dev *dev)
  46. {
  47. const struct pci_vendor_info *vendor_p = pci_vendor_list;
  48. int i = VENDORS;
  49. char *name = dev->name;
  50. do {
  51. if (vendor_p->vendor == dev->vendor)
  52. goto match_vendor;
  53. vendor_p++;
  54. } while (--i);
  55. /* Couldn't find either the vendor nor the device */
  56. sprintf(name, "PCI device %04x:%04x", dev->vendor, dev->device);
  57. return;
  58. match_vendor: {
  59. struct pci_device_info *device_p = vendor_p->devices;
  60. int i = vendor_p->nr;
  61. while (i > 0) {
  62. if (device_p->device == dev->device)
  63. goto match_device;
  64. device_p++;
  65. i--;
  66. }
  67. /* Ok, found the vendor, but unknown device */
  68. sprintf(name, "PCI device %04x:%04x (%s)", dev->vendor, dev->device, vendor_p->name);
  69. return;
  70. /* Full match */
  71. match_device: {
  72. char *n = name + sprintf(name, "%s %s", vendor_p->name, device_p->name);
  73. int nr = device_p->seen + 1;
  74. device_p->seen = nr;
  75. if (nr > 1)
  76. sprintf(n, " (#%d)", nr);
  77. }
  78. }
  79. }
  80. /*
  81.  *  Class names. Not in .init section as they are needed in runtime.
  82.  */
  83. static u16 pci_class_numbers[] = {
  84. #define CLASS(x,y) 0x##x,
  85. #include "classlist.h"
  86. };
  87. static char *pci_class_names[] = {
  88. #define CLASS(x,y) y,
  89. #include "classlist.h"
  90. };
  91. char *
  92. pci_class_name(u32 class)
  93. {
  94. int i;
  95. for(i=0; i<sizeof(pci_class_numbers)/sizeof(pci_class_numbers[0]); i++)
  96. if (pci_class_numbers[i] == class)
  97. return pci_class_names[i];
  98. return NULL;
  99. }
  100. #else
  101. void __init pci_name_device(struct pci_dev *dev)
  102. {
  103. }
  104. char *
  105. pci_class_name(u32 class)
  106. {
  107. return NULL;
  108. }
  109. #endif /* CONFIG_PCI_NAMES */