]> mj.ucw.cz Git - pciutils.git/blobdiff - lib/caps.c
Fix stripping in cross-compiling mode
[pciutils.git] / lib / caps.c
index 4f415898b045581bf3c49b981e885ff801d0039f..039c86f7e206a6bf5ec7a7bb0b85491a65eaacfa 100644 (file)
@@ -15,8 +15,12 @@ pci_add_cap(struct pci_dev *d, unsigned int addr, unsigned int id, unsigned int
 {
   struct pci_cap *cap = pci_malloc(d->access, sizeof(*cap));
 
-  cap->next = d->first_cap;
-  d->first_cap = cap;
+  if (d->last_cap)
+    d->last_cap->next = cap;
+  else
+    d->first_cap = cap;
+  d->last_cap = cap;
+  cap->next = NULL;
   cap->addr = addr;
   cap->id = id;
   cap->type = type;
@@ -76,17 +80,16 @@ pci_scan_ext_caps(struct pci_dev *d)
   while (where);
 }
 
-unsigned int
+void
 pci_scan_caps(struct pci_dev *d, unsigned int want_fields)
 {
-  if ((want_fields & PCI_FILL_EXT_CAPS) && !(d->known_fields & PCI_FILL_CAPS))
+  if (want_fields & PCI_FILL_EXT_CAPS)
     want_fields |= PCI_FILL_CAPS;
 
-  if (want_fields & PCI_FILL_CAPS)
+  if (want_fill(d, want_fields, PCI_FILL_CAPS))
     pci_scan_trad_caps(d);
-  if (want_fields & PCI_FILL_EXT_CAPS)
+  if (want_fill(d, want_fields, PCI_FILL_EXT_CAPS))
     pci_scan_ext_caps(d);
-  return want_fields;
 }
 
 void
@@ -110,38 +113,34 @@ pci_find_cap(struct pci_dev *d, unsigned int id, unsigned int type)
 /**
  * Finds a particular capability of a device
  *
- * To select one capability if there are more than one with the same id you
+ * To select one capability if there are more than one with the same id, you
  * can provide a pointer to an unsigned int that contains the index which you
  * want as cap_number. If you don't care and are fine with the first one you
- * can supply NULL. To cap_number the acutal number of capablities with that id
- * will be written.
- *
- * @param d          Which device to target
- * @param id         Capability ID
- * @param type       PCI_FILL_CAPS or PCI_FILL_EXT_CAPS
- * @param cap_number Which instance of a capability to target
- * @returns          pointer to capability structure or NULL if not found
+ * can supply NULL. The cap_number will be replaced by the actual number
+ * of capabilities with that id.
  */
 struct pci_cap *
 pci_find_cap_nr(struct pci_dev *d, unsigned int id, unsigned int type,
                 unsigned int *cap_number)
 {
   struct pci_cap *c;
-  unsigned int target = 0;
-  if (cap_number != NULL)
+  struct pci_cap *found = NULL;
+  unsigned int target = (cap_number ? *cap_number : 0);
+  unsigned int index = 0;
+
+  pci_fill_info_v38(d, ((type == PCI_CAP_NORMAL) ? PCI_FILL_CAPS : PCI_FILL_EXT_CAPS));
+
+  for (c=d->first_cap; c; c=c->next)
     {
-      target = *cap_number;
-      *cap_number = 0;
+      if (c->type == type && c->id == id)
+       {
+         if (target == index)
+           found = c;
+         index++;
+       }
     }
 
-  pci_fill_info_v35(d, ((type == PCI_CAP_NORMAL)
-                        ? PCI_FILL_CAPS
-                        : PCI_FILL_EXT_CAPS));
-  for (c=d->first_cap; c; c=c->next)
-    if (c->type == type && c->id == id)
-      if (cap_number == NULL || target == *cap_number)
-        return c;
-      else
-       (*cap_number)++;
-  return NULL;
+  if (cap_number)
+    *cap_number = index;
+  return found;
 }