132 lines
3.8 KiB
C
132 lines
3.8 KiB
C
|
/*
|
||
|
* Copyright 2009 Hauke Mehrtens <hauke@hauke-m.de>
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License version 2 as
|
||
|
* published by the Free Software Foundation.
|
||
|
*
|
||
|
* Compatibility file for Linux wireless for kernels 2.6.33.
|
||
|
*/
|
||
|
|
||
|
#include <linux/compat.h>
|
||
|
|
||
|
#if defined(CONFIG_PCCARD) || defined(CONFIG_PCCARD_MODULE)
|
||
|
|
||
|
/**
|
||
|
* pccard_loop_tuple() - loop over tuples in the CIS
|
||
|
* @s: the struct pcmcia_socket where the card is inserted
|
||
|
* @function: the device function we loop for
|
||
|
* @code: which CIS code shall we look for?
|
||
|
* @parse: buffer where the tuple shall be parsed (or NULL, if no parse)
|
||
|
* @priv_data: private data to be passed to the loop_tuple function.
|
||
|
* @loop_tuple: function to call for each CIS entry of type @function. IT
|
||
|
* gets passed the raw tuple, the paresed tuple (if @parse is
|
||
|
* set) and @priv_data.
|
||
|
*
|
||
|
* pccard_loop_tuple() loops over all CIS entries of type @function, and
|
||
|
* calls the @loop_tuple function for each entry. If the call to @loop_tuple
|
||
|
* returns 0, the loop exits. Returns 0 on success or errorcode otherwise.
|
||
|
*/
|
||
|
int pccard_loop_tuple(struct pcmcia_socket *s, unsigned int function,
|
||
|
cisdata_t code, cisparse_t *parse, void *priv_data,
|
||
|
int (*loop_tuple) (tuple_t *tuple,
|
||
|
cisparse_t *parse,
|
||
|
void *priv_data))
|
||
|
{
|
||
|
tuple_t tuple;
|
||
|
cisdata_t *buf;
|
||
|
int ret;
|
||
|
|
||
|
buf = kzalloc(256, GFP_KERNEL);
|
||
|
if (buf == NULL) {
|
||
|
dev_printk(KERN_WARNING, &s->dev, "no memory to read tuple\n");
|
||
|
return -ENOMEM;
|
||
|
}
|
||
|
|
||
|
tuple.TupleData = buf;
|
||
|
tuple.TupleDataMax = 255;
|
||
|
tuple.TupleOffset = 0;
|
||
|
tuple.DesiredTuple = code;
|
||
|
tuple.Attributes = 0;
|
||
|
|
||
|
ret = pccard_get_first_tuple(s, function, &tuple);
|
||
|
while (!ret) {
|
||
|
if (pccard_get_tuple_data(s, &tuple))
|
||
|
goto next_entry;
|
||
|
|
||
|
if (parse)
|
||
|
if (pcmcia_parse_tuple(&tuple, parse))
|
||
|
goto next_entry;
|
||
|
|
||
|
ret = loop_tuple(&tuple, parse, priv_data);
|
||
|
if (!ret)
|
||
|
break;
|
||
|
|
||
|
next_entry:
|
||
|
ret = pccard_get_next_tuple(s, function, &tuple);
|
||
|
}
|
||
|
|
||
|
kfree(buf);
|
||
|
return ret;
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(pccard_loop_tuple);
|
||
|
/* Source: drivers/pcmcia/cistpl.c */
|
||
|
|
||
|
#if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE)
|
||
|
|
||
|
struct pcmcia_loop_mem {
|
||
|
struct pcmcia_device *p_dev;
|
||
|
void *priv_data;
|
||
|
int (*loop_tuple) (struct pcmcia_device *p_dev,
|
||
|
tuple_t *tuple,
|
||
|
void *priv_data);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* pcmcia_do_loop_tuple() - internal helper for pcmcia_loop_config()
|
||
|
*
|
||
|
* pcmcia_do_loop_tuple() is the internal callback for the call from
|
||
|
* pcmcia_loop_tuple() to pccard_loop_tuple(). Data is transferred
|
||
|
* by a struct pcmcia_cfg_mem.
|
||
|
*/
|
||
|
static int pcmcia_do_loop_tuple(tuple_t *tuple, cisparse_t *parse, void *priv)
|
||
|
{
|
||
|
struct pcmcia_loop_mem *loop = priv;
|
||
|
|
||
|
return loop->loop_tuple(loop->p_dev, tuple, loop->priv_data);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* pcmcia_loop_tuple() - loop over tuples in the CIS
|
||
|
* @p_dev: the struct pcmcia_device which we need to loop for.
|
||
|
* @code: which CIS code shall we look for?
|
||
|
* @priv_data: private data to be passed to the loop_tuple function.
|
||
|
* @loop_tuple: function to call for each CIS entry of type @function. IT
|
||
|
* gets passed the raw tuple and @priv_data.
|
||
|
*
|
||
|
* pcmcia_loop_tuple() loops over all CIS entries of type @function, and
|
||
|
* calls the @loop_tuple function for each entry. If the call to @loop_tuple
|
||
|
* returns 0, the loop exits. Returns 0 on success or errorcode otherwise.
|
||
|
*/
|
||
|
int pcmcia_loop_tuple(struct pcmcia_device *p_dev, cisdata_t code,
|
||
|
int (*loop_tuple) (struct pcmcia_device *p_dev,
|
||
|
tuple_t *tuple,
|
||
|
void *priv_data),
|
||
|
void *priv_data)
|
||
|
{
|
||
|
struct pcmcia_loop_mem loop = {
|
||
|
.p_dev = p_dev,
|
||
|
.loop_tuple = loop_tuple,
|
||
|
.priv_data = priv_data};
|
||
|
|
||
|
return pccard_loop_tuple(p_dev->socket, p_dev->func, code, NULL,
|
||
|
&loop, pcmcia_do_loop_tuple);
|
||
|
}
|
||
|
EXPORT_SYMBOL_GPL(pcmcia_loop_tuple);
|
||
|
/* Source: drivers/pcmcia/pcmcia_resource.c */
|
||
|
|
||
|
#endif /* CONFIG_PCMCIA */
|
||
|
|
||
|
#endif /* CONFIG_PCCARD */
|
||
|
|