From: Russell King <rmk@arm.linux.org.uk>

Below is a patch which is the result of work sent by Linus to myself,
cleaned by Dominik, and a change for PCMCIA ISA IRQ routing stuff from the
2.4-ac tree.

Linus said:
> Here's a patch that apparently improves throughput on Texas Instrument
> 1520 controllers a lot by enabling memory bursting. Apparently to the
> point that without this you can't even do things like 802.11g without
> starting to drop data.
and later:
> So this seems to be not a 1520-specific thing, but a generic 12xx+ thing,
> and we migth want to just enhance the current 12xx stuff and add the ID
> for the 1520 to use that too..

Before I push this to Linus, I'd like people with TI cardbus bridges to
test this patch and ensure that there are no unfortunate side effects.




 drivers/pcmcia/ti113x.h       |   32 ++++++++++++++++++++++++++++++++
 drivers/pcmcia/yenta_socket.c |   25 ++++++++++++++++---------
 include/linux/pci_ids.h       |    3 ++-
 3 files changed, 50 insertions(+), 10 deletions(-)

diff -puN drivers/pcmcia/ti113x.h~enable-cardbus-bursting drivers/pcmcia/ti113x.h
--- 25/drivers/pcmcia/ti113x.h~enable-cardbus-bursting	2003-06-21 20:52:10.000000000 -0700
+++ 25-akpm/drivers/pcmcia/ti113x.h	2003-06-21 20:52:10.000000000 -0700
@@ -175,6 +175,27 @@ static int ti_override(struct yenta_sock
 	new = reg & ~I365_INTR_ENA;
 	if (new != reg)
 		exca_writeb(socket, I365_INTCTL, new);
+
+	/*
+	 * If ISA interrupts don't work, then fall back to routing card
+	 * interrupts to the PCI interrupt of the socket.
+	 */
+	if (!socket->socket.irq_mask) {
+		int irqmux, devctl;
+
+		printk (KERN_INFO "ti113x: Routing card interrupts to PCI\n");
+
+		devctl = config_readb(socket, TI113X_DEVICE_CONTROL);
+		devctl &= ~TI113X_DCR_IMODE_MASK;
+
+		irqmux = config_readl(socket, TI122X_IRQMUX);
+		irqmux = (irqmux & ~0x0f) | 0x02; /* route INTA */
+		irqmux = (irqmux & ~0xf0) | 0x20; /* route INTB */
+
+		config_writel(socket, TI122X_IRQMUX, irqmux);
+		config_writeb(socket, TI113X_DEVICE_CONTROL, devctl);
+	}
+
 	socket->socket.ss_entry->init = ti_init;
 	return 0;
 }
@@ -241,6 +262,17 @@ static int ti1250_override(struct yenta_
 	return 0;
 }
 
+
+static int ti12xx_override(struct yenta_socket *socket)
+{
+	/* make sure that memory burst is active */
+	ti_sysctl(socket) = config_readl(socket, TI113X_SYSTEM_CONTROL);
+	ti_sysctl(socket) |= TI122X_SCR_MRBURSTUP;
+	config_writel(socket, TI113X_SYSTEM_CONTROL, ti_sysctl(socket));
+
+	return ti113x_override(socket);
+}
+
 #endif /* CONFIG_CARDBUS */
 
 #endif /* _LINUX_TI113X_H */
diff -puN drivers/pcmcia/yenta_socket.c~enable-cardbus-bursting drivers/pcmcia/yenta_socket.c
--- 25/drivers/pcmcia/yenta_socket.c~enable-cardbus-bursting	2003-06-21 20:52:10.000000000 -0700
+++ 25-akpm/drivers/pcmcia/yenta_socket.c	2003-06-21 20:52:10.000000000 -0700
@@ -807,23 +807,30 @@ struct cardbus_override_struct {
 	unsigned short device;
 	int (*override) (struct yenta_socket *socket);
 } cardbus_override[] = {
-	{ PD(TI,1130),	&ti113x_override },
 	{ PD(TI,1031),	&ti_override },
-	{ PD(TI,1131),	&ti113x_override },
-	{ PD(TI,1250),	&ti1250_override },
-	{ PD(TI,1220),	&ti_override },
-	{ PD(TI,1221),	&ti_override },
+
+	/* TBD: Check if these TI variants can use more
+	 * advanced overrides instead */
 	{ PD(TI,1210),	&ti_override },
-	{ PD(TI,1450),	&ti_override },
-	{ PD(TI,1225),	&ti_override },
-	{ PD(TI,1251A),	&ti_override },
 	{ PD(TI,1211),	&ti_override },
+	{ PD(TI,1251A),	&ti_override },
 	{ PD(TI,1251B),	&ti_override },
-	{ PD(TI,1410),	ti1250_override },
 	{ PD(TI,1420),	&ti_override },
+	{ PD(TI,1450),	&ti_override },
 	{ PD(TI,4410),	&ti_override },
 	{ PD(TI,4451),	&ti_override },
 
+	{ PD(TI,1130),	&ti113x_override },
+	{ PD(TI,1131),	&ti113x_override },
+
+	{ PD(TI,1220),	&ti12xx_override },
+	{ PD(TI,1221),	&ti12xx_override },
+	{ PD(TI,1225),	&ti12xx_override },
+	{ PD(TI,1520),  &ti12xx_override },
+
+	{ PD(TI,1250),	&ti1250_override },
+	{ PD(TI,1410),	&ti1250_override },
+
 	{ PD(RICOH,RL5C465), &ricoh_override },
 	{ PD(RICOH,RL5C466), &ricoh_override },
 	{ PD(RICOH,RL5C475), &ricoh_override },
diff -puN include/linux/pci_ids.h~enable-cardbus-bursting include/linux/pci_ids.h
--- 25/include/linux/pci_ids.h~enable-cardbus-bursting	2003-06-21 20:52:10.000000000 -0700
+++ 25-akpm/include/linux/pci_ids.h	2003-06-21 20:52:10.000000000 -0700
@@ -668,7 +668,6 @@
 #define PCI_DEVICE_ID_TI_1220		0xac17
 #define PCI_DEVICE_ID_TI_1221		0xac19
 #define PCI_DEVICE_ID_TI_1210		0xac1a
-#define PCI_DEVICE_ID_TI_1410		0xac50
 #define PCI_DEVICE_ID_TI_1450		0xac1b
 #define PCI_DEVICE_ID_TI_1225		0xac1c
 #define PCI_DEVICE_ID_TI_1251A		0xac1d
@@ -676,7 +675,9 @@
 #define PCI_DEVICE_ID_TI_1251B		0xac1f
 #define PCI_DEVICE_ID_TI_4410		0xac41
 #define PCI_DEVICE_ID_TI_4451		0xac42
+#define PCI_DEVICE_ID_TI_1410		0xac50
 #define PCI_DEVICE_ID_TI_1420		0xac51
+#define PCI_DEVICE_ID_TI_1520		0xac55
 
 #define PCI_VENDOR_ID_SONY		0x104d
 #define PCI_DEVICE_ID_SONY_CXD3222	0x8039

_