PCI Bus Card Problems

Russell King rmk+pcmcia at arm.linux.org.uk
Thu Sep 1 05:02:25 EDT 2005


On Thu, Sep 01, 2005 at 11:19:33AM +0300, Itzhak Ben-Akiva wrote:
> I'm writing again because I have been working on a problem with
> cardbus/pcmcia, which is used to connect a Bluetooth pcmcia card (Anycom
> Blue CF - 300), on ARM Integrator/AP for quite some time without any
> success so far. I have searched the web up and down and I tried anything
> I could found on the subject of PCI interrupt probing failure, but still
> no success. I couldn't find any information on incompatibility of my pci
> bus card and ARM platform. Because of that, I tried two different pci
> bus cards that work properly on linux-x86, but they did not work on ARM.
> Therefore, either I'm missing something in the kernel's configuration
> for ARM or there is a problem with pcmcia on ARM Integrator. However, I
> haven't found any information on this in the web. 

I never finished my fixing of yenta to be architecture independent
since I took on the role of PCMCIA maintainer (which I've subsequently
dropped and virtually completely stopped working on PCMCIA.)  Hence,
the fixes never got completed and merged.

The problem is that yenta itself does resource allocation for the
bridge, and makes assumptions that there's a 1:1 mapping between
resources and PCI BARs.  This is not true on some platforms such
as the one you're using.

Since ARM uses the generic PCI subsystem setup code, I was able to
just #if 0...#endif out all the x86 specific code in yenta and have
it work... IOW something like this:

diff -u linux-2.5-pcmcia/drivers/pcmcia/yenta_socket.c linux/drivers/pcmcia/yenta_socket.c
--- linux-2.5-pcmcia/drivers/pcmcia/yenta_socket.c	Sun Mar 23 11:57:21 2003
+++ linux/drivers/pcmcia/yenta_socket.c	Fri Mar 28 23:17:12 2003
@@ -524,6 +524,7 @@
 	return 0;
 }
 
+#if 0
 /*
  * Use an adaptive allocation for the memory resource,
  * sometimes the memory behind pci bridges is limited:
@@ -698,6 +699,7 @@
 		res->start = res->end = 0;
 	}
 }
+#endif
 
 
 /*
@@ -721,8 +723,9 @@
 
 	if (sock->base)
 		iounmap(sock->base);
+#if 0
 	yenta_free_resources(sock);
-
+#endif
 	pci_release_regions(dev);
 	pci_disable_device(dev);
 	pci_set_drvdata(dev, NULL);
@@ -940,6 +943,7 @@
 	pci_set_power_state(socket->dev, 0);
 
 	config_writel(socket, CB_LEGACY_MODE_BASE, 0);
+#if 0
 	config_writel(socket, PCI_BASE_ADDRESS_0, dev->resource[0].start);
 	config_writew(socket, PCI_COMMAND,
 			PCI_COMMAND_IO |
@@ -955,6 +959,7 @@
 		(dev->subordinate->subordinate << 16) | /* subordinate bus */
 		(dev->subordinate->secondary << 8) |  /* secondary bus */
 		dev->subordinate->primary);		   /* primary bus */
+#endif
 
 	/*
 	 * Set up the bridging state:
@@ -1037,9 +1042,14 @@
 	/* Disable all events */
 	cb_writel(socket, CB_SOCKET_MASK, 0x0);
 
+#if 0
 	/* Set up the bridge regions.. */
 	yenta_allocate_resources(socket);
+#endif
 
+	pci_set_master(dev);
+	/* FIXME: should we also pci_set_mwi(dev); ? */
+
 	socket->cb_irq = dev->irq;
 
 	/* Do we have special options for the device? */


-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:  2.6 Serial core



More information about the linux-pcmcia mailing list