Read 16-bit values from the configuration space of a device
#include <hw/pci.h>
int pci_read_config16( unsigned bus,
                       unsigned dev_func,
                       unsigned offset,
                       unsigned count,
                       char* buff );
libc
Use the -l c option to qcc to link against this library. This library is usually included automatically.
The pci_read_config16() function reads the specified number of 16-bit values from the configuration space of the given device or function. For the details of the configuration space, see the _pci_config_regs structure in <hw/pci.h>.
List all the Ethernet interfaces on the system:
int pci;
unsigned short vid;
unsigned short did;
int indx = 0;
unsigned bus;
unsigned func;
pci = pci_attach(0);
if (pci != -1)
{
   while (pci_find_class(
             PCI_CLASS_NETWORK | PCI_SUBCLASS_NETWORK_ETHERNET,
             indx, &bus, &func) == PCI_SUCCESS)
   {
      printf("Found an Ethernet board at index %d\n", indx);
      if (pci_read_config16( bus, func,
             offsetof (struct _pci_config_regs, Vendor_ID),
             1, &vid) != PCI_SUCCESS)
      {
         printf ("Failed to get the vendor ID\n");
         vid = 0;
      }
      if (pci_read_config16( bus, func,
             offsetof (struct _pci_config_regs, Device_ID),
             1, &did) != PCI_SUCCESS)
      {
         printf ("Failed to get the device ID\n");
         did = 0;
      }
      printf("  Vendor ID: 0x%04hX\n", vid);
      printf("  Device ID: 0x%04hX\n", did);
      indx++;
   }
   pci_detach(pci);
}
else
{
    perror("Failed to attach to PCI");
}
See also pci_attach_device().
| Safety: | |
|---|---|
| Cancellation point | Yes | 
| Interrupt handler | No | 
| Signal handler | Yes | 
| Thread | Yes |