pci_read_config16()

Read 16-bit values from the configuration space of a device

Synopsis:

#include <hw/pci.h>

int pci_read_config16( unsigned bus,
                       unsigned dev_func,
                       unsigned offset,
                       unsigned count,
                       char* buff );

Arguments:

bus
The bus number.
dev_func
The name of the device or function.
offset
The register offset into the configuration space. This offset must be aligned to a 16-bit boundary (that is 0, 2, 4, …, 254 bytes).
count
The number of 16-bit values to read.
buff
A pointer to a buffer where the requested 16-bit values are placed.

Library:

libc

Use the -l c option to qcc to link against this library. This library is usually included automatically.

Description:

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>.


Note:
  • You must successfully call pci_attach() before calling any of the other PCI functions.
  • The pci_read_config*() functions can return inconsistent data if another process is extensively using the PCI bus.

Returns:

PCI_BAD_REGISTER_NUMBER
An invalid offset register number was given.
PCI_BUFFER_TOO_SMALL
The PCI BIOS server reads only 50 words at a time; count is too large.
PCI_SUCCESS
The device or function was found.
-1
You haven't called pci_attach(), or the call to it failed.

Examples:

List all the Ethernet devices 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().

Classification:

QNX Neutrino

Safety:
Cancellation point Yes
Interrupt handler No
Signal handler Yes
Thread Yes

See also:

pci_attach(), pci_attach_device(), pci_detach(), pci_detach_device(), pci_find_class(), pci_find_device(), pci_present(), pci_read_config(), pci_read_config8(), pci_read_config32(), pci_rescan_bus(), pci_write_config(), pci_write_config8(), pci_write_config16(), pci_write_config32()