Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Apr 2005 06:15:35 -0700
From:      Bruce M Simpson <bms@spc.org>
To:        freebsd-current@freebsd.org
Subject:   [PATCH] Allow pciconf(8) to be used with CardBus devices
Message-ID:  <20050412131535.GA784@empiric.icir.org>

next in thread | raw e-mail | index | archive | help

--y0ulUmNC+osPPQO6
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi,

Here is a patch which allows pciconf to manipulate configuration space
registers on CardBus devices, in addition to devices which are direct
children of "pci" instances.

The patch is against branch RELENG_5_4. If there are no objections I'd like
to commit it to -HEAD.

Thanks,
BMS

--y0ulUmNC+osPPQO6
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="cardbus_pciconf.patch"

Index: /usr/src/sys/dev/pci/pci_user.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pci/pci_user.c,v
retrieving revision 1.17
diff -u -p -r1.17 pci_user.c
--- /usr/src/sys/dev/pci/pci_user.c	16 Jun 2004 09:46:53 -0000	1.17
+++ /usr/src/sys/dev/pci/pci_user.c	12 Apr 2005 12:54:15 -0000
@@ -173,7 +173,7 @@ pci_conf_match(struct pci_match_conf *ma
 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;
@@ -386,20 +386,23 @@ getconfexit:
 				    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,
@@ -407,8 +410,8 @@ getconfexit:
 							  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,

--y0ulUmNC+osPPQO6--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050412131535.GA784>