FILE_CONFIG_NAME);
device_port = file_name_lookup(server, 0, 0);
+ if (device_port == MACH_PORT_NULL)
+ d->access->error("Cannot find the PCI arbiter");
+
*((mach_port_t *) d->aux) = device_port;
return device_port;
}
DIR *dir;
struct dirent *entry;
char path[NAME_MAX];
- uint32_t vd;
- uint8_t ht;
struct pci_dev *d;
dir = opendir(parent);
d->bus = bus;
d->dev = dev;
d->func = func;
-
- /* Get the arbiter port */
- if (device_port_lookup(d) == MACH_PORT_NULL)
- {
- if (closedir(dir) < 0)
- a->warning("Cannot close directory: %s (%s)", parent,
- strerror(errno));
- a->error("Cannot find the PCI arbiter");
- }
-
pci_link_dev(a, d);
-
- vd = pci_read_long(d, PCI_VENDOR_ID);
- ht = pci_read_byte(d, PCI_HEADER_TYPE);
-
- d->vendor_id = vd & 0xffff;
- d->device_id = vd >> 16U;
- d->known_fields = PCI_FILL_IDENT;
- d->hdrtype = ht;
}
}
int err;
size_t nread;
char *data;
- mach_port_t device_port;
-
- nread = len;
- device_port = device_port_lookup(d);
- if (device_port == MACH_PORT_NULL)
- d->access->error("Cannot find the PCI arbiter");
+ mach_port_t device_port = device_port_lookup(d);
if (len > 4)
- err = !pci_generic_block_read(d, pos, buf, nread);
- else
- {
- data = (char *) buf;
- err = pci_conf_read(device_port, pos, &data, &nread, len);
+ return pci_generic_block_read(d, pos, buf, len);
- if (data != (char *) buf)
- {
- if (nread > (size_t) len) /* Sanity check for bogus server. */
- {
- vm_deallocate(mach_task_self(), (vm_address_t) data, nread);
- return 0;
- }
+ data = (char *) buf;
+ err = pci_conf_read(device_port, pos, &data, &nread, len);
- memcpy(buf, data, nread);
+ if (data != (char *) buf)
+ {
+ if (nread > (size_t) len) /* Sanity check for bogus server. */
+ {
vm_deallocate(mach_task_self(), (vm_address_t) data, nread);
+ return 0;
}
+
+ memcpy(buf, data, nread);
+ vm_deallocate(mach_task_self(), (vm_address_t) data, nread);
}
- if (err)
- return 0;
- return nread == (size_t) len;
+ return !err && nread == (size_t) len;
}
/*
{
int err;
size_t nwrote;
- mach_port_t device_port;
-
- nwrote = len;
- device_port = device_port_lookup(d);
- if (device_port == MACH_PORT_NULL)
- d->access->error("Cannot find the PCI arbiter");
+ mach_port_t device_port = device_port_lookup(d);
if (len > 4)
- err = !pci_generic_block_write(d, pos, buf, len);
- else
- err = pci_conf_write(device_port, pos, (char *) buf, len, &nwrote);
- if (err)
- return 0;
+ return pci_generic_block_write(d, pos, buf, len);
+
+ err = pci_conf_write(device_port, pos, (char *) buf, len, &nwrote);
- return nwrote == (size_t) len;
+ return !err && nwrote == (size_t) len;
}
/* Get requested info from the server */
static void
hurd_fill_regions(struct pci_dev *d)
{
- mach_port_t device_port = *((mach_port_t *) d->aux);
+ mach_port_t device_port = device_port_lookup(d);
struct pci_bar regions[6];
char *buf = (char *) ®ions;
size_t size = sizeof(regions);
hurd_fill_rom(struct pci_dev *d)
{
struct pci_xrom_bar rom;
- mach_port_t device_port = *((mach_port_t *) d->aux);
+ mach_port_t device_port = device_port_lookup(d);
char *buf = (char *) &rom;
size_t size = sizeof(rom);