[Karmic] SRU: PCI/cardbus: Add a fixup hook and fix powerpc

Leann Ogasawara leann.ogasawara at canonical.com
Wed Jan 27 18:01:49 UTC 2010


On Wed, 2010-01-27 at 10:38 +0000, Andy Whitcroft wrote:
> On Tue, Jan 19, 2010 at 12:48:21PM +0100, Stefan Bader wrote:
> > SRU Justication:
> > 
> > Impact: On powerpc, the cardbus code needs to run through fixup code,
> > otherwise the kernel will crash with inserted cards.
> > 
> > Fix: The patch, backported from upstream, will create a fixup function
> > which is doing nothing on all architectures but powerpc. And for powerpc
> > it will call the required fixup code.
> > For Lucid this has been forwarded to stable at kernel.org, but the 2.6.31.y
> > support ended now.
> > 
> > Testcase: see bug report.
> > 
> > From 8a76c709711ef4d555baa1ba540f45a6c6d8b440 Mon Sep 17 00:00:00 2001
> > From: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> > Date: Wed, 9 Dec 2009 17:52:13 +1100
> > Subject: [PATCH] PCI/cardbus: Add a fixup hook and fix powerpc
> > 
> > BugLink: http://bugs.launchpad.net/bugs/455723
> > 
> > commit 2d1c861871d767153538a77c498752b36d4bb4b8 upstream
> > 
> > The cardbus code creates PCI devices without ever going through the
> > necessary fixup bits and pieces that normal PCI devices go through.
> > 
> > There's in fact a commented out call to pcibios_fixup_bus() in there,
> > it's commented because ... it doesn't work.
> > 
> > I could make pcibios_fixup_bus() do the right thing on powerpc easily
> > but I felt it cleaner instead to provide a specific hook pci_fixup_cardbus
> > for which a weak empty implementation is provided by the PCI core.
> > 
> > This fixes cardbus on powerbooks and probably all other PowerPC
> > platforms which was broken completely for ever on some platforms and
> > since 2.6.31 on others such as PowerBooks when we made the DMA ops
> > mandatory (since those are setup by the fixups).
> > 
> > Acked-by: Dominik Brodowski <linux at dominikbrodowski.net>
> > Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> > Signed-off-by: Jesse Barnes <jbarnes at virtuousgeek.org>
> > Signed-off-by: Stefan Bader <stefan.bader at canonical.com>
> > Acked-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
> > Acked-by: Jesse Barnes <jbarnes at virtuousgeek.org>
> > ---
> >  arch/powerpc/kernel/pci-common.c |   13 +++++++++++++
> >  drivers/pci/pci.c                |    5 +++++
> >  drivers/pcmcia/cardbus.c         |    2 +-
> >  include/linux/pci.h              |    3 +++
> >  4 files changed, 22 insertions(+), 1 deletions(-)
> > 
> > diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c
> > index e8dfdbd..cadbed6 100644
> > --- a/arch/powerpc/kernel/pci-common.c
> > +++ b/arch/powerpc/kernel/pci-common.c
> > @@ -1107,6 +1107,12 @@ void __devinit pcibios_setup_bus_devices(struct pci_bus *bus)
> >  	list_for_each_entry(dev, &bus->devices, bus_list) {
> >  		struct dev_archdata *sd = &dev->dev.archdata;
> >  
> > +		/* Cardbus can call us to add new devices to a bus, so ignore
> > +		 * those who are already fully discovered
> > +		 */
> > +		if (dev->is_added)
> > +			continue;
> > +
> >  		/* Setup OF node pointer in archdata */
> >  		sd->of_node = pci_device_to_OF_node(dev);
> >  
> > @@ -1147,6 +1153,13 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus)
> >  }
> >  EXPORT_SYMBOL(pcibios_fixup_bus);
> >  
> > +void __devinit pci_fixup_cardbus(struct pci_bus *bus)
> > +{
> > +	/* Now fixup devices on that bus */
> > +	pcibios_setup_bus_devices(bus);
> > +}
> > +
> > +
> >  static int skip_isa_ioresource_align(struct pci_dev *dev)
> >  {
> >  	if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) &&
> > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> > index 4e4c295..6477722 100644
> > --- a/drivers/pci/pci.c
> > +++ b/drivers/pci/pci.c
> > @@ -2723,6 +2723,11 @@ int __attribute__ ((weak)) pci_ext_cfg_avail(struct pci_dev *dev)
> >  	return 1;
> >  }
> >  
> > +void __weak pci_fixup_cardbus(struct pci_bus *bus)
> > +{
> > +}
> > +EXPORT_SYMBOL(pci_fixup_cardbus);
> > +
> >  static int __init pci_setup(char *str)
> >  {
> >  	while (str) {
> > diff --git a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c
> > index db77e1f..5c26793 100644
> > --- a/drivers/pcmcia/cardbus.c
> > +++ b/drivers/pcmcia/cardbus.c
> > @@ -214,7 +214,7 @@ int __ref cb_alloc(struct pcmcia_socket * s)
> >  	unsigned int max, pass;
> >  
> >  	s->functions = pci_scan_slot(bus, PCI_DEVFN(0, 0));
> > -//	pcibios_fixup_bus(bus);
> > +	pci_fixup_cardbus(bus);
> >  
> >  	max = bus->secondary;
> >  	for (pass = 0; pass < 2; pass++)
> > diff --git a/include/linux/pci.h b/include/linux/pci.h
> > index f5c7cd3..2547515 100644
> > --- a/include/linux/pci.h
> > +++ b/include/linux/pci.h
> > @@ -564,6 +564,9 @@ void pcibios_align_resource(void *, struct resource *, resource_size_t,
> >  				resource_size_t);
> >  void pcibios_update_irq(struct pci_dev *, int irq);
> >  
> > +/* Weak but can be overriden by arch */
> > +void pci_fixup_cardbus(struct pci_bus *);
> > +
> >  /* Generic PCI functions used internally */
> >  
> >  extern struct pci_bus *pci_find_bus(int domain, int busnr);
> 
> Looks to only effect a change on powerpc.  Seems ok to me.
> 
> Acked-by: Andy Whitcroft <apw at canonical.com>

Looks fine to me as well.

Acked-by: Leann Ogasawara <leann.ogasawara at canonical.com>






More information about the kernel-team mailing list