Skip to content

Commit 2fb22a8

Browse files
runderwoDominik Brodowski
authored andcommitted
Disable write buffering on Toshiba ToPIC95
Disable write buffering on the Toshiba ToPIC95 if it is enabled by somebody (it is not supposed to be a power-on default according to the datasheet). On the ToPIC95, practically no 32-bit Cardbus card will work under heavy load without locking up the whole system if this is left enabled. I tried about a dozen. It does not affect 16-bit cards. This is similar to the O2 bugs in early controller revisions it seems. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=55961 Cc: <[email protected]> Signed-off-by: Ryan C. Underwood <[email protected]> Signed-off-by: Dominik Brodowski <[email protected]>
1 parent f2e6cf7 commit 2fb22a8

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

drivers/pcmcia/topic.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,9 @@
104104
#define TOPIC_EXCA_IF_CONTROL 0x3e /* 8 bit */
105105
#define TOPIC_EXCA_IFC_33V_ENA 0x01
106106

107+
#define TOPIC_PCI_CFG_PPBCN 0x3e /* 16-bit */
108+
#define TOPIC_PCI_CFG_PPBCN_WBEN 0x0400
109+
107110
static void topic97_zoom_video(struct pcmcia_socket *sock, int onoff)
108111
{
109112
struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket);
@@ -138,6 +141,7 @@ static int topic97_override(struct yenta_socket *socket)
138141
static int topic95_override(struct yenta_socket *socket)
139142
{
140143
u8 fctrl;
144+
u16 ppbcn;
141145

142146
/* enable 3.3V support for 16bit cards */
143147
fctrl = exca_readb(socket, TOPIC_EXCA_IF_CONTROL);
@@ -146,6 +150,18 @@ static int topic95_override(struct yenta_socket *socket)
146150
/* tell yenta to use exca registers to power 16bit cards */
147151
socket->flags |= YENTA_16BIT_POWER_EXCA | YENTA_16BIT_POWER_DF;
148152

153+
/* Disable write buffers to prevent lockups under load with numerous
154+
Cardbus cards, observed on Tecra 500CDT and reported elsewhere on the
155+
net. This is not a power-on default according to the datasheet
156+
but some BIOSes seem to set it. */
157+
if (pci_read_config_word(socket->dev, TOPIC_PCI_CFG_PPBCN, &ppbcn) == 0
158+
&& socket->dev->revision <= 7
159+
&& (ppbcn & TOPIC_PCI_CFG_PPBCN_WBEN)) {
160+
ppbcn &= ~TOPIC_PCI_CFG_PPBCN_WBEN;
161+
pci_write_config_word(socket->dev, TOPIC_PCI_CFG_PPBCN, ppbcn);
162+
dev_info(&socket->dev->dev, "Disabled ToPIC95 Cardbus write buffers.\n");
163+
}
164+
149165
return 0;
150166
}
151167

0 commit comments

Comments
 (0)