[PATCH V2] pcmcia/yenta: add module parameter for O2 speedups

Dominik Brodowski linux at dominikbrodowski.net
Sun Jan 10 14:59:27 EST 2010


Hey,

On Sun, Jan 10, 2010 at 09:41:24AM +0100, Wolfram Sang wrote:
> 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 at pengutronix.de>
> Tested-by: frodone at gmail.com
> Cc: Dominik Brodowski <linux at dominikbrodowski.net>
> ---
> 
> Changes since V1:
> 
> - fix a whitespace issue
> - add the comment "user may override"
> 
>  drivers/pcmcia/o2micro.h      |   41 +++++++++++++++++++++++++++--------------
>  drivers/pcmcia/yenta_socket.c |    5 +++++
>  2 files changed, 32 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/pcmcia/o2micro.h b/drivers/pcmcia/o2micro.h
> index 624442f..72d8f33 100644
> --- a/drivers/pcmcia/o2micro.h
> +++ b/drivers/pcmcia/o2micro.h
> @@ -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));
> +			config_writeb(socket, O2_RESERVED2,
> +			              b & ~(O2_RES_READ_PREFETCH | O2_RES_WRITE_BURST));
>  		}
>  	}
>  
> diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
> index e4d12ac..041a75a 100644
> --- a/drivers/pcmcia/yenta_socket.c
> +++ b/drivers/pcmcia/yenta_socket.c
> @@ -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)");

Is using a string module_param the preferred case for such tristates now?

Best,
	Dominik



More information about the linux-pcmcia mailing list