* Copyright (c) 2002 Quentin Garnier <cube@cubidou.net>
* Copyright (c) 2002 Martin Mares <mj@ucw.cz>
*
- * Can be freely distributed and used under the terms of the GNU GPL.
+ * Can be freely distributed and used under the terms of the GNU GPL v2+.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
*/
/*
static void
nbsd_config(struct pci_access *a)
{
- a->method_params[PCI_ACCESS_NBSD_LIBPCI] = PATH_NBSD_DEVICE;
+ pci_define_param(a, "nbsd.path", PCI_PATH_NBSD_DEVICE, "Path to the NetBSD PCI device");
}
static int
nbsd_detect(struct pci_access *a)
{
- char *name = a->method_params[PCI_ACCESS_NBSD_LIBPCI];
+ char *name = pci_get_param(a, "nbsd.path");
if (access(name, R_OK))
{
a->warning("Cannot open %s", name);
return 0;
}
+
+ if (!access(name, W_OK))
+ a->writeable = O_RDWR;
a->debug("...using %s", name);
return 1;
}
static void
nbsd_init(struct pci_access *a)
{
- char *name = a->method_params[PCI_ACCESS_NBSD_LIBPCI];
+ char *name = pci_get_param(a, "nbsd.path");
+ int mode = a->writeable ? O_RDWR : O_RDONLY;
- a->fd = open(name, O_RDWR, 0);
+ a->fd = open(name, mode, 0);
if (a->fd < 0)
a->error("nbsd_init: %s open failed", name);
}
if (!(len == 1 || len == 2 || len == 4))
return pci_generic_block_read(d, pos, buf, len);
+ if (d->domain || pos >= 4096)
+ return 0;
+
shift = 8*(pos % 4);
pos &= ~3;
-
+
if (pcibus_conf_read(d->access->fd, d->bus, d->dev, d->func, pos, &val) < 0)
d->access->error("nbsd_read: pci_bus_conf_read() failed");
if (!(len == 1 || len == 2 || len == 4))
return pci_generic_block_write(d, pos, buf, len);
+ if (d->domain || pos >= 256)
+ return 0;
+
/*
* BEWARE: NetBSD seems to support only 32-bit access, so we have
* to emulate byte and word writes by read-modify-write, possibly
val = le32_to_cpu(*(u32*)buf);
break;
}
-
+
if (pcibus_conf_write(d->access->fd, d->bus, d->dev, d->func, pos, val) < 0)
d->access->error("nbsd_write: pci_bus_conf_write() failed");
}
struct pci_methods pm_nbsd_libpci = {
- "NetBSD-libpci",
+ "nbsd-libpci",
+ "NetBSD libpci",
nbsd_config,
nbsd_detect,
nbsd_init,
pci_generic_fill_info,
nbsd_read,
nbsd_write,
+ NULL, /* read_vpd */
NULL, /* dev_init */
NULL /* dev_cleanup */
};