lkml.org 
[lkml]   [2004]   [Nov]   [1]   [last100]   RSS Feed
Views: [more markup]  [less markup]  [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
DateMon, 01 Nov 2004 10:59:13 +0000
FromDavid Vrabel <>
SubjectRe: [patch] PCI: Add is_bridge to pci_dev to allow fixups to disable bridge functionality.
Greg KH wrote:
> On Tue, Oct 19, 2004 at 12:22:49PM +0100, David Vrabel wrote:
> >>The plan was to make the CardBus driver (drivers/pcmcia/yenta_socket.c) 
>>honour the is_bridge flag and not bother with CardBus stuff if it's cleared.> > But why can't any code that wants to check this, just look at the
> dev->hdr_type instead?  I don't think we need to add a new bit for this
> because of that, right?

Using the is_bridge flag allows PCI device fixups to disable the CardBus 
portion of the driver.  And you obviously can't tweak the hdr_type since 
the device header is still a CardBus/bridge type header.

e.g., I have:

static void __devinit pci_fixup_mercury_pci1520(struct pci_dev *dev)
{
         if (!machine_is_arcom_mercury())
                 return;
         dev->is_bridge = 0;
}
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1520, 
pci_fixup_mercury_pci1520);
> Also, your patch was linewrapped :(

Hmm.  Looks fine here.  I've attached it instead this time.

David Vrabel
-- 
David Vrabel, Design Engineer

Arcom, Clifton Road           Tel: +44 (0)1223 411200 ext. 3233
Cambridge CB1 7EA, UK         Web: http://www.arcom.com/
Index: linux-2.6-armbe/drivers/pci/probe.c
===================================================================
--- linux-2.6-armbe.orig/drivers/pci/probe.c	2004-10-14 11:26:38.000000000 +0100
+++ linux-2.6-armbe/drivers/pci/probe.c	2004-10-19 12:00:00.000000000 +0100
@@ -610,6 +610,8 @@
 	dev->devfn = devfn;
 	dev->hdr_type = hdr_type & 0x7f;
 	dev->multifunction = !!(hdr_type & 0x80);
+	dev->is_bridge = (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE
+			  || dev->hdr_type == PCI_HEADER_TYPE_CARDBUS);
 	dev->vendor = l & 0xffff;
 	dev->device = (l >> 16) & 0xffff;
 	dev->cfg_size = pci_cfg_space_size(dev);
@@ -718,8 +720,7 @@
 	pcibios_fixup_bus(bus);
 	for (pass=0; pass < 2; pass++)
 		list_for_each_entry(dev, &bus->devices, bus_list) {
-			if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE ||
-			    dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
+			if  (dev->is_bridge)
 				max = pci_scan_bridge(bus, dev, max, pass);
 		}
 
Index: linux-2.6-armbe/include/linux/pci.h
===================================================================
--- linux-2.6-armbe.orig/include/linux/pci.h	2004-10-14 11:26:38.000000000 +0100
+++ linux-2.6-armbe/include/linux/pci.h	2004-10-14 11:43:24.000000000 +0100
@@ -532,6 +532,7 @@
 	/* These fields are used by common fixups */
 	unsigned int	transparent:1;	/* Transparent PCI bridge */
 	unsigned int	multifunction:1;/* Part of multi-function device */
+	unsigned int	is_bridge:1;	/* A PCI or CardBus bridge */
 	/* keep track of device state */
 	unsigned int	is_enabled:1;	/* pci_enable_device has been called */
 	unsigned int	is_busmaster:1; /* device is busmaster */
\
 
 \ /
  Last update: 2005-03-22 14:07    [from the cache]
©2003-2008