1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-21 15:45:02 +00:00

Use pci_find_bsf() to retrieve the PCI device associated with

a bus/device/function tuple.
This change enables pciconf(8) to work with CardBus devices.

Reviewed by:	imp
This commit is contained in:
Bruce M Simpson 2005-04-13 17:34:38 +00:00
parent b7fd00d97c
commit 37ce43b71e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=145022

View File

@ -166,7 +166,7 @@ pci_conf_match(struct pci_match_conf *matches, int num_matches,
static int
pci_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td)
{
device_t pci, pcib;
device_t pcidev;
struct pci_io *io;
const char *name;
int error;
@ -379,20 +379,23 @@ pci_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *t
io->pi_reg + io->pi_width > PCI_REGMAX ||
io->pi_reg & (io->pi_width - 1))
error = EINVAL;
/*
* Assume that the user-level bus number is
* actually the pciN instance number. We map
* from that to the real pcib+bus combination.
* in fact the physical PCI bus number.
* Look up the grandparent, i.e. the bridge device,
* so that we can issue configuration space cycles.
*/
pci = devclass_get_device(devclass_find("pci"),
io->pi_sel.pc_bus);
if (pci) {
int b = pcib_get_bus(pci);
pcib = device_get_parent(pci);
pcidev = pci_find_bsf(io->pi_sel.pc_bus,
io->pi_sel.pc_dev, io->pi_sel.pc_func);
if (pcidev) {
device_t busdev, brdev;
busdev = device_get_parent(pcidev);
brdev = device_get_parent(busdev);
if (cmd == PCIOCWRITE)
PCIB_WRITE_CONFIG(pcib,
b,
PCIB_WRITE_CONFIG(brdev,
io->pi_sel.pc_bus,
io->pi_sel.pc_dev,
io->pi_sel.pc_func,
io->pi_reg,
@ -400,8 +403,8 @@ pci_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *t
io->pi_width);
else
io->pi_data =
PCIB_READ_CONFIG(pcib,
b,
PCIB_READ_CONFIG(brdev,
io->pi_sel.pc_bus,
io->pi_sel.pc_dev,
io->pi_sel.pc_func,
io->pi_reg,