X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fcaps.c;h=039c86f7e206a6bf5ec7a7bb0b85491a65eaacfa;hb=0766bfa0f557430a6dd3256d45a5b756499f9f7b;hp=4f415898b045581bf3c49b981e885ff801d0039f;hpb=c22c314a322e2243983d2f356a5f0532b2d846a5;p=pciutils.git diff --git a/lib/caps.c b/lib/caps.c index 4f41589..039c86f 100644 --- a/lib/caps.c +++ b/lib/caps.c @@ -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; }