static void
proc_config(struct pci_access *a)
{
- a->method_params[PCI_ACCESS_PROC_BUS_PCI] = PATH_PROC_BUS_PCI;
+ pci_define_param(a, "proc.path", PCI_PATH_PROC_BUS_PCI, "Path to the procfs bus tree");
}
static int
proc_detect(struct pci_access *a)
{
- char *name = a->method_params[PCI_ACCESS_PROC_BUS_PCI];
+ char *name = pci_get_param(a, "proc.path");
if (access(name, R_OK))
{
FILE *f;
char buf[512];
- if (snprintf(buf, sizeof(buf), "%s/devices", a->method_params[PCI_ACCESS_PROC_BUS_PCI]) == sizeof(buf))
+ if (snprintf(buf, sizeof(buf), "%s/devices", pci_get_param(a, "proc.path")) == sizeof(buf))
a->error("File name too long");
f = fopen(buf, "r");
if (!f)
d->func = PCI_FUNC(dfn & 0xff);
d->vendor_id = vend >> 16U;
d->device_id = vend & 0xffff;
- known = PCI_FILL_IDENT;
+ known = 0;
if (!a->buscentric)
{
- known |= PCI_FILL_IRQ | PCI_FILL_BASES;
+ known |= PCI_FILL_IDENT | PCI_FILL_IRQ | PCI_FILL_BASES;
if (cnt >= 10)
known |= PCI_FILL_ROM_BASE;
if (cnt >= 17)
if (a->fd >= 0)
close(a->fd);
e = snprintf(buf, sizeof(buf), "%s/%02x/%02x.%d",
- a->method_params[PCI_ACCESS_PROC_BUS_PCI],
+ pci_get_param(a, "proc.path"),
d->bus, d->dev, d->func);
if (e < 0 || e >= (int) sizeof(buf))
a->error("File name too long");
a->fd_rw = a->writeable || rw;
a->fd = open(buf, a->fd_rw ? O_RDWR : O_RDONLY);
+ if (a->fd < 0)
+ {
+ e = snprintf(buf, sizeof(buf), "%s/%04x:%02x/%02x.%d",
+ pci_get_param(a, "proc.path"),
+ d->domain, d->bus, d->dev, d->func);
+ if (e < 0 || e >= (int) sizeof(buf))
+ a->error("File name too long");
+ a->fd = open(buf, a->fd_rw ? O_RDWR : O_RDONLY);
+ }
if (a->fd < 0)
a->warning("Cannot open %s", buf);
a->cached_dev = d;
return 0;
}
else if (res != len)
- d->access->warning("proc_read: tried to read %d bytes at %d, but got only %d", len, pos, res);
+ return 0;
return 1;
}
}
struct pci_methods pm_linux_proc = {
- "Linux-proc",
+ "linux-proc",
+ "The proc file system on Linux",
proc_config,
proc_detect,
proc_init,
pci_generic_fill_info,
proc_read,
proc_write,
+ NULL, /* read_vpd */
NULL, /* init_dev */
proc_cleanup_dev
};