pcmcia/yenta: add module parameter for O2 speedups
authorWolfram Sang <w.sang@pengutronix.de>
Sun, 10 Jan 2010 08:41:24 +0000 (09:41 +0100)
committerDominik Brodowski <linux@dominikbrodowski.net>
Wed, 17 Feb 2010 16:37:35 +0000 (17:37 +0100)
O2-bridges can do read prefetch and write burst. However, for some combinations
of older bridges and cards, this causes problems, so it is disabled for those
bridges. Now, as some users know their setup works with the speedups enabled, a
new parameter is introduced to the driver. Now, a user can specifically enable
or disable these features, while the default is what we have today: detect the
bridge and decide accordingly. Fixes Bugzilla entry 15014.

Simplify and unify the printouts, fix a whitespace issue while we are here.

Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
Tested-by: frodone@gmail.com
[linux@dominikbrodowski.net: whitespace fixes]
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
drivers/pcmcia/o2micro.h
drivers/pcmcia/yenta_socket.c

index 624442fc0d35ceb7d609be947fb2c7dda2e20d5d..e74bebac26950b2c9d5869c310f835ef99662b64 100644 (file)
@@ -116,13 +116,12 @@ static int o2micro_override(struct yenta_socket *socket)
         * from Eric Still, 02Micro.
         */
        u8 a, b;
+       bool use_speedup;
 
        if (PCI_FUNC(socket->dev->devfn) == 0) {
                a = config_readb(socket, O2_RESERVED1);
                b = config_readb(socket, O2_RESERVED2);
-
-               dev_printk(KERN_INFO, &socket->dev->dev,
-                          "O2: res at 0x94/0xD4: %02x/%02x\n", a, b);
+               dev_dbg(&socket->dev->dev, "O2: 0x94/0xD4: %02x/%02x\n", a, b);
 
                switch (socket->dev->device) {
                /*
@@ -135,23 +134,37 @@ static int o2micro_override(struct yenta_socket *socket)
                case PCI_DEVICE_ID_O2_6812:
                case PCI_DEVICE_ID_O2_6832:
                case PCI_DEVICE_ID_O2_6836:
-               case PCI_DEVICE_ID_O2_6933:
-                       dev_printk(KERN_INFO, &socket->dev->dev,
-                                  "Yenta O2: old bridge, disabling read "
-                                  "prefetch/write burst\n");
-                       config_writeb(socket, O2_RESERVED1,
-                                     a & ~(O2_RES_READ_PREFETCH | O2_RES_WRITE_BURST));
-                       config_writeb(socket, O2_RESERVED2,
-                                     b & ~(O2_RES_READ_PREFETCH | O2_RES_WRITE_BURST));
+               case PCI_DEVICE_ID_O2_6933:
+                       use_speedup = false;
                        break;
-
                default:
-                       dev_printk(KERN_INFO , &socket->dev->dev,
-                                  "O2: enabling read prefetch/write burst\n");
+                       use_speedup = true;
+                       break;
+               }
+
+               /* the user may override our decision */
+               if (strcasecmp(o2_speedup, "on") == 0)
+                       use_speedup = true;
+               else if (strcasecmp(o2_speedup, "off") == 0)
+                       use_speedup = false;
+               else if (strcasecmp(o2_speedup, "default") != 0)
+                       dev_warn(&socket->dev->dev,
+                               "O2: Unknown parameter, using 'default'");
+
+               if (use_speedup) {
+                       dev_info(&socket->dev->dev,
+                               "O2: enabling read prefetch/write burst\n");
+                       config_writeb(socket, O2_RESERVED1,
+                                     a | O2_RES_READ_PREFETCH | O2_RES_WRITE_BURST);
+                       config_writeb(socket, O2_RESERVED2,
+                                     b | O2_RES_READ_PREFETCH | O2_RES_WRITE_BURST);
+               } else {
+                       dev_info(&socket->dev->dev,
+                               "O2: disabling read prefetch/write burst\n");
                        config_writeb(socket, O2_RESERVED1,
-                                     a | O2_RES_READ_PREFETCH | O2_RES_WRITE_BURST);
+                                     a & ~(O2_RES_READ_PREFETCH | O2_RES_WRITE_BURST));
                        config_writeb(socket, O2_RESERVED2,
-                                     b | O2_RES_READ_PREFETCH | O2_RES_WRITE_BURST);
+                                     b & ~(O2_RES_READ_PREFETCH | O2_RES_WRITE_BURST));
                }
        }
 
index e4d12acdd525d2a5acb1337f52d2c3a2fc441c9e..041a75a7e55eeb2f86e1b60cc05c0be7d0fc541d 100644 (file)
@@ -37,6 +37,11 @@ static int pwr_irqs_off;
 module_param(pwr_irqs_off, bool, 0644);
 MODULE_PARM_DESC(pwr_irqs_off, "Force IRQs off during power-on of slot. Use only when seeing IRQ storms!");
 
+static char o2_speedup[] = "default";
+module_param_string(o2_speedup, o2_speedup, sizeof(o2_speedup), 0444);
+MODULE_PARM_DESC(o2_speedup, "Use prefetch/burst for O2-bridges: 'on', 'off' "
+       "or 'default' (uses recommended behaviour for the detected bridge)");
+
 #define debug(x, s, args...) dev_dbg(&s->dev->dev, x, ##args)
 
 /* Don't ask.. */