From: Russell King 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 _