[RFC] [PATCH 5/7] pcmcia: use pcmcia_loop_config in ISDN pcmcia drivers

Karsten Keil kkeil at suse.de
Tue Jul 29 11:45:19 EDT 2008


On Tue, Jul 29, 2008 at 09:20:25AM +0200, Dominik Brodowski wrote:
> Use the config loop helper in ISDN pcmcia drivers.
> 

Acked-by: Karsten Keil <kkeil at suse.de>

> CC: isdn4linux at listserv.isdn4linux.de
> Signed-off-by: Dominik Brodowski <linux at dominikbrodowski.net>
> ---
>  drivers/isdn/hardware/avm/avm_cs.c |   80 ++++++++++-------------------------
>  drivers/isdn/hisax/avma1_cs.c      |   76 +++++++++-------------------------
>  drivers/isdn/hisax/elsa_cs.c       |   71 ++++++++++----------------------
>  drivers/isdn/hisax/teles_cs.c      |   71 ++++++++++----------------------
>  4 files changed, 87 insertions(+), 211 deletions(-)
> 
> diff --git a/drivers/isdn/hardware/avm/avm_cs.c b/drivers/isdn/hardware/avm/avm_cs.c
> index a5b941c..7a1ead1 100644
> --- a/drivers/isdn/hardware/avm/avm_cs.c
> +++ b/drivers/isdn/hardware/avm/avm_cs.c
> @@ -154,78 +154,44 @@ static void avmcs_detach(struct pcmcia_device *link)
>      
>  ======================================================================*/
>  
> -static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -		     cisparse_t *parse)
> +static int avmcs_configcheck(struct pcmcia_device *p_dev,
> +			     cistpl_cftable_entry_t *cf,
> +			     void *priv_data)
>  {
> -    int i = pcmcia_get_tuple_data(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return pcmcia_parse_tuple(handle, tuple, parse);
> -}
> -
> -static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -		     cisparse_t *parse)
> -{
> -    int i = pcmcia_get_first_tuple(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return get_tuple(handle, tuple, parse);
> -}
> -
> -static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -		     cisparse_t *parse)
> -{
> -    int i = pcmcia_get_next_tuple(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return get_tuple(handle, tuple, parse);
> +	if (cf->io.nwin <= 0)
> +		return -ENODEV;
> +
> +	p_dev->conf.ConfigIndex = cf->index;
> +	p_dev->io.BasePort1 = cf->io.win[0].base;
> +	p_dev->io.NumPorts1 = cf->io.win[0].len;
> +	p_dev->io.NumPorts2 = 0;
> +	printk(KERN_INFO "avm_cs: testing i/o %#x-%#x\n",
> +	       p_dev->io.BasePort1,
> +	       p_dev->io.BasePort1+p_dev->io.NumPorts1-1);
> +	return pcmcia_request_io(p_dev, &p_dev->io);
>  }
>  
>  static int avmcs_config(struct pcmcia_device *link)
>  {
> -    tuple_t tuple;
> -    cisparse_t parse;
> -    cistpl_cftable_entry_t *cf = &parse.cftable_entry;
>      local_info_t *dev;
>      int i;
> -    u_char buf[64];
>      char devname[128];
>      int cardtype;
>      int (*addcard)(unsigned int port, unsigned irq);
>  
>      dev = link->priv;
>  
> -    do {
> -	devname[0] = 0;
> -	if (link->prod_id[1])
> -		strlcpy(devname, link->prod_id[1], sizeof(devname));
> -
> -	/*
> -         * find IO port
> -         */
> -	tuple.TupleData = (cisdata_t *)buf;
> -	tuple.TupleOffset = 0; tuple.TupleDataMax = 255;
> -	tuple.Attributes = 0;
> -	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
> -	i = first_tuple(link, &tuple, &parse);
> -	while (i == CS_SUCCESS) {
> -	    if (cf->io.nwin > 0) {
> -		link->conf.ConfigIndex = cf->index;
> -		link->io.BasePort1 = cf->io.win[0].base;
> -		link->io.NumPorts1 = cf->io.win[0].len;
> -		link->io.NumPorts2 = 0;
> -                printk(KERN_INFO "avm_cs: testing i/o %#x-%#x\n",
> -			link->io.BasePort1,
> -		        link->io.BasePort1+link->io.NumPorts1-1);
> -		i = pcmcia_request_io(link, &link->io);
> -		if (i == CS_SUCCESS) goto found_port;
> -	    }
> -	    i = next_tuple(link, &tuple, &parse);
> -	}
> +    devname[0] = 0;
> +    if (link->prod_id[1])
> +	    strlcpy(devname, link->prod_id[1], sizeof(devname));
>  
> -found_port:
> -	if (i != CS_SUCCESS) {
> -	    cs_error(link, RequestIO, i);
> -	    break;
> -	}
> +    /*
> +     * find IO port
> +     */
> +    if (pcmcia_loop_config(link, avmcs_configcheck, NULL))
> +	    return -ENODEV;
>  
> +    do {
>  	/*
>  	 * allocate an interrupt line
>  	 */
> diff --git a/drivers/isdn/hisax/avma1_cs.c b/drivers/isdn/hisax/avma1_cs.c
> index fc6cc2c..8142d9f 100644
> --- a/drivers/isdn/hisax/avma1_cs.c
> +++ b/drivers/isdn/hisax/avma1_cs.c
> @@ -174,38 +174,28 @@ static void avma1cs_detach(struct pcmcia_device *link)
>      
>  ======================================================================*/
>  
> -static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -		     cisparse_t *parse)
> +static int avma1cs_configcheck(struct pcmcia_device *p_dev,
> +			     cistpl_cftable_entry_t *cf,
> +			     void *priv_data)
>  {
> -    int i = pcmcia_get_tuple_data(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return pcmcia_parse_tuple(handle, tuple, parse);
> +	if (cf->io.nwin <= 0)
> +		return -ENODEV;
> +
> +	p_dev->conf.ConfigIndex = cf->index;
> +	p_dev->io.BasePort1 = cf->io.win[0].base;
> +	p_dev->io.NumPorts1 = cf->io.win[0].len;
> +	p_dev->io.NumPorts2 = 0;
> +	printk(KERN_INFO "avma1_cs: testing i/o %#x-%#x\n",
> +	       p_dev->io.BasePort1,
> +	       p_dev->io.BasePort1+p_dev->io.NumPorts1-1);
> +	return pcmcia_request_io(p_dev, &p_dev->io);
>  }
>  
> -static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -		     cisparse_t *parse)
> -{
> -    int i = pcmcia_get_first_tuple(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return get_tuple(handle, tuple, parse);
> -}
> -
> -static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -		     cisparse_t *parse)
> -{
> -    int i = pcmcia_get_next_tuple(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return get_tuple(handle, tuple, parse);
> -}
>  
>  static int avma1cs_config(struct pcmcia_device *link)
>  {
> -    tuple_t tuple;
> -    cisparse_t parse;
> -    cistpl_cftable_entry_t *cf = &parse.cftable_entry;
>      local_info_t *dev;
>      int i;
> -    u_char buf[64];
>      char devname[128];
>      IsdnCard_t	icard;
>      int busy = 0;
> @@ -214,40 +204,14 @@ static int avma1cs_config(struct pcmcia_device *link)
>  
>      DEBUG(0, "avma1cs_config(0x%p)\n", link);
>  
> -    do {
> -	devname[0] = 0;
> -	if (link->prod_id[1])
> -		strlcpy(devname, link->prod_id[1], sizeof(devname));
> +    devname[0] = 0;
> +    if (link->prod_id[1])
> +	    strlcpy(devname, link->prod_id[1], sizeof(devname));
>  
> -	/*
> -         * find IO port
> -         */
> -	tuple.TupleData = (cisdata_t *)buf;
> -	tuple.TupleOffset = 0; tuple.TupleDataMax = 255;
> -	tuple.Attributes = 0;
> -	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
> -	i = first_tuple(link, &tuple, &parse);
> -	while (i == CS_SUCCESS) {
> -	    if (cf->io.nwin > 0) {
> -		link->conf.ConfigIndex = cf->index;
> -		link->io.BasePort1 = cf->io.win[0].base;
> -		link->io.NumPorts1 = cf->io.win[0].len;
> -		link->io.NumPorts2 = 0;
> -		printk(KERN_INFO "avma1_cs: testing i/o %#x-%#x\n",
> -			link->io.BasePort1,
> -			link->io.BasePort1+link->io.NumPorts1 - 1);
> -		i = pcmcia_request_io(link, &link->io);
> -		if (i == CS_SUCCESS) goto found_port;
> -	    }
> -	    i = next_tuple(link, &tuple, &parse);
> -	}
> +    if (pcmcia_loop_config(link, avma1cs_configcheck, NULL))
> +	    return -ENODEV;
>  
> -found_port:
> -	if (i != CS_SUCCESS) {
> -	    cs_error(link, RequestIO, i);
> -	    break;
> -	}
> -	
> +    do {
>  	/*
>  	 * allocate an interrupt line
>  	 */
> diff --git a/drivers/isdn/hisax/elsa_cs.c b/drivers/isdn/hisax/elsa_cs.c
> index db7e644..b85b07d 100644
> --- a/drivers/isdn/hisax/elsa_cs.c
> +++ b/drivers/isdn/hisax/elsa_cs.c
> @@ -203,68 +203,41 @@ static void elsa_cs_detach(struct pcmcia_device *link)
>      device available to the system.
>  
>  ======================================================================*/
> -static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -                     cisparse_t *parse)
> -{
> -    int i = pcmcia_get_tuple_data(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return pcmcia_parse_tuple(handle, tuple, parse);
> -}
>  
> -static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -                     cisparse_t *parse)
> +static int elsa_cs_configcheck(struct pcmcia_device *p_dev,
> +			       cistpl_cftable_entry_t *cf,
> +			       void *priv_data)
>  {
> -    int i = pcmcia_get_first_tuple(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return get_tuple(handle, tuple, parse);
> -}
> +	int j;
>  
> -static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -                     cisparse_t *parse)
> -{
> -    int i = pcmcia_get_next_tuple(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return get_tuple(handle, tuple, parse);
> +        if ( (cf->io.nwin > 0) && cf->io.win[0].base) {
> +		printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n");
> +		p_dev->conf.ConfigIndex = cf->index;
> +		p_dev->io.BasePort1 = cf->io.win[0].base;
> +		if (!pcmcia_request_io(p_dev, &p_dev->io))
> +			return 0;
> +        } else {
> +		printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n");
> +		p_dev->conf.ConfigIndex = cf->index;
> +		for (j = 0x2f0; j > 0x100; j -= 0x10) {
> +			p_dev->io.BasePort1 = j;
> +			if (!pcmcia_request_io(p_dev, &p_dev->io))
> +				return 0;
> +		}
> +        }
> +	return -ENODEV;
>  }
>  
>  static int elsa_cs_config(struct pcmcia_device *link)
>  {
> -    tuple_t tuple;
> -    cisparse_t parse;
>      local_info_t *dev;
> -    int i, j, last_fn;
> -    u_short buf[128];
> -    cistpl_cftable_entry_t *cf = &parse.cftable_entry;
> +    int i, last_fn;
>      IsdnCard_t icard;
>  
>      DEBUG(0, "elsa_config(0x%p)\n", link);
>      dev = link->priv;
>  
> -    tuple.TupleData = (cisdata_t *)buf;
> -    tuple.TupleOffset = 0; tuple.TupleDataMax = 255;
> -    tuple.Attributes = 0;
> -    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
> -    i = first_tuple(link, &tuple, &parse);
> -    while (i == CS_SUCCESS) {
> -        if ( (cf->io.nwin > 0) && cf->io.win[0].base) {
> -            printk(KERN_INFO "(elsa_cs: looks like the 96 model)\n");
> -            link->conf.ConfigIndex = cf->index;
> -            link->io.BasePort1 = cf->io.win[0].base;
> -            i = pcmcia_request_io(link, &link->io);
> -            if (i == CS_SUCCESS) break;
> -        } else {
> -          printk(KERN_INFO "(elsa_cs: looks like the 97 model)\n");
> -          link->conf.ConfigIndex = cf->index;
> -          for (i = 0, j = 0x2f0; j > 0x100; j -= 0x10) {
> -            link->io.BasePort1 = j;
> -            i = pcmcia_request_io(link, &link->io);
> -            if (i == CS_SUCCESS) break;
> -          }
> -          break;
> -        }
> -        i = next_tuple(link, &tuple, &parse);
> -    }
> -
> +    i = pcmcia_loop_config(link, elsa_cs_configcheck, NULL);
>      if (i != CS_SUCCESS) {
>  	last_fn = RequestIO;
>  	goto cs_failed;
> diff --git a/drivers/isdn/hisax/teles_cs.c b/drivers/isdn/hisax/teles_cs.c
> index ab4bd45..fc4d024 100644
> --- a/drivers/isdn/hisax/teles_cs.c
> +++ b/drivers/isdn/hisax/teles_cs.c
> @@ -193,68 +193,41 @@ static void teles_detach(struct pcmcia_device *link)
>      device available to the system.
>  
>  ======================================================================*/
> -static int get_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -                     cisparse_t *parse)
> -{
> -    int i = pcmcia_get_tuple_data(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return pcmcia_parse_tuple(handle, tuple, parse);
> -}
>  
> -static int first_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -                     cisparse_t *parse)
> +static int teles_cs_configcheck(struct pcmcia_device *p_dev,
> +				cistpl_cftable_entry_t *cf,
> +				void *priv_data)
>  {
> -    int i = pcmcia_get_first_tuple(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return get_tuple(handle, tuple, parse);
> -}
> +	int j;
>  
> -static int next_tuple(struct pcmcia_device *handle, tuple_t *tuple,
> -                     cisparse_t *parse)
> -{
> -    int i = pcmcia_get_next_tuple(handle, tuple);
> -    if (i != CS_SUCCESS) return i;
> -    return get_tuple(handle, tuple, parse);
> +        if ( (cf->io.nwin > 0) && cf->io.win[0].base) {
> +		printk(KERN_INFO "(teles_cs: looks like the 96 model)\n");
> +		p_dev->conf.ConfigIndex = cf->index;
> +		p_dev->io.BasePort1 = cf->io.win[0].base;
> +		if (!pcmcia_request_io(p_dev, &p_dev->io))
> +			return 0;
> +        } else {
> +		printk(KERN_INFO "(teles_cs: looks like the 97 model)\n");
> +		p_dev->conf.ConfigIndex = cf->index;
> +		for (j = 0x2f0; j > 0x100; j -= 0x10) {
> +			p_dev->io.BasePort1 = j;
> +			if (!pcmcia_request_io(p_dev, &p_dev->io))
> +				return 0;
> +		}
> +        }
> +	return -ENODEV;
>  }
>  
>  static int teles_cs_config(struct pcmcia_device *link)
>  {
> -    tuple_t tuple;
> -    cisparse_t parse;
>      local_info_t *dev;
> -    int i, j, last_fn;
> -    u_short buf[128];
> -    cistpl_cftable_entry_t *cf = &parse.cftable_entry;
> +    int i, last_fn;
>      IsdnCard_t icard;
>  
>      DEBUG(0, "teles_config(0x%p)\n", link);
>      dev = link->priv;
>  
> -    tuple.TupleData = (cisdata_t *)buf;
> -    tuple.TupleOffset = 0; tuple.TupleDataMax = 255;
> -    tuple.Attributes = 0;
> -    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;
> -    i = first_tuple(link, &tuple, &parse);
> -    while (i == CS_SUCCESS) {
> -        if ( (cf->io.nwin > 0) && cf->io.win[0].base) {
> -            printk(KERN_INFO "(teles_cs: looks like the 96 model)\n");
> -            link->conf.ConfigIndex = cf->index;
> -            link->io.BasePort1 = cf->io.win[0].base;
> -            i = pcmcia_request_io(link, &link->io);
> -            if (i == CS_SUCCESS) break;
> -        } else {
> -          printk(KERN_INFO "(teles_cs: looks like the 97 model)\n");
> -          link->conf.ConfigIndex = cf->index;
> -          for (i = 0, j = 0x2f0; j > 0x100; j -= 0x10) {
> -            link->io.BasePort1 = j;
> -            i = pcmcia_request_io(link, &link->io);
> -            if (i == CS_SUCCESS) break;
> -          }
> -          break;
> -        }
> -        i = next_tuple(link, &tuple, &parse);
> -    }
> -
> +    i = pcmcia_loop_config(link, teles_cs_configcheck, NULL);
>      if (i != CS_SUCCESS) {
>  	last_fn = RequestIO;
>  	goto cs_failed;
> -- 
> 1.5.4.3

-- 
Karsten Keil
SuSE Labs
ISDN and VOIP development
SUSE LINUX Products GmbH, Maxfeldstr.5 90409 Nuernberg, GF: Markus Rex, HRB 16746 (AG Nuernberg)



More information about the linux-pcmcia mailing list