linux/drivers/pci/vpd.c
<<
>>
Prefs
   1/*
   2 * File:        vpd.c
   3 * Purpose:     Provide PCI VPD support
   4 *
   5 * Copyright (C) 2010 Broadcom Corporation.
   6 */
   7
   8#include <linux/pci.h>
   9
  10int pci_vpd_find_tag(const u8 *buf, unsigned int off, unsigned int len, u8 rdt)
  11{
  12        int i;
  13
  14        for (i = off; i < len; ) {
  15                u8 val = buf[i];
  16
  17                if (val & PCI_VPD_LRDT) {
  18                        /* Don't return success of the tag isn't complete */
  19                        if (i + PCI_VPD_LRDT_TAG_SIZE > len)
  20                                break;
  21
  22                        if (val == rdt)
  23                                return i;
  24
  25                        i += PCI_VPD_LRDT_TAG_SIZE +
  26                             pci_vpd_lrdt_size(&buf[i]);
  27                } else {
  28                        u8 tag = val & ~PCI_VPD_SRDT_LEN_MASK;
  29
  30                        if (tag == rdt)
  31                                return i;
  32
  33                        if (tag == PCI_VPD_SRDT_END)
  34                                break;
  35
  36                        i += PCI_VPD_SRDT_TAG_SIZE +
  37                             pci_vpd_srdt_size(&buf[i]);
  38                }
  39        }
  40
  41        return -ENOENT;
  42}
  43EXPORT_SYMBOL_GPL(pci_vpd_find_tag);
  44
  45int pci_vpd_find_info_keyword(const u8 *buf, unsigned int off,
  46                              unsigned int len, const char *kw)
  47{
  48        int i;
  49
  50        for (i = off; i + PCI_VPD_INFO_FLD_HDR_SIZE <= off + len;) {
  51                if (buf[i + 0] == kw[0] &&
  52                    buf[i + 1] == kw[1])
  53                        return i;
  54
  55                i += PCI_VPD_INFO_FLD_HDR_SIZE +
  56                     pci_vpd_info_field_size(&buf[i]);
  57        }
  58
  59        return -ENOENT;
  60}
  61EXPORT_SYMBOL_GPL(pci_vpd_find_info_keyword);
  62
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.