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:
bms 2005-04-13 17:34:38 +00:00
parent 7287eb95eb
commit ad7308e5dc

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,