pcmcia: add new CIS access helpers

As a replacement to pcmcia_get_{first,next}_tuple() and
pcmcia_get_tuple_data(), three new -- and easier to use --
functions are added:

- pcmcia_get_tuple() to get the very first CIS entry of one
  type.

- pcmcia_loop_tuple() to loop over all CIS entries of one type.

- pcmcia_get_mac_from_cis() to read out the hardware MAC address
  from CISTPL_FUNCE.

Only a handful of drivers need these functions anyway, as most
CIS access is already handled by pcmcia_loop_config(), which
now shares the same backed (pccard_loop_tuple()) with
pcmcia_loop_tuple().

A pcmcia_get_mac_from_cis() bug noted by Komuro
<komurojun-mbn@nifty.com> has been fixed in this revision.

Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
This commit is contained in:
Dominik Brodowski
2009-10-18 23:32:33 +02:00
parent af757923a9
commit 91284224da
6 changed files with 311 additions and 53 deletions

View File

@@ -34,6 +34,7 @@
struct pcmcia_socket;
struct pcmcia_device;
struct config_t;
struct net_device;
/* dynamic device IDs for PCMCIA device drivers. See
* Documentation/pcmcia/driver.txt for details.
@@ -176,26 +177,39 @@ const char *pcmcia_error_ret(int ret);
pcmcia_error_ret(ret)); \
}
/* CIS access.
* Use the pcmcia_* versions in PCMCIA drivers
/*
* CIS access.
*
* Please use the following functions to access CIS tuples:
* - pcmcia_get_tuple()
* - pcmcia_loop_tuple()
* - pcmcia_get_mac_from_cis()
*
* To parse a tuple_t, pcmcia_parse_tuple() exists. Its interface
* might change in future.
*/
/* get the very first CIS entry of type @code. Note that buf is pointer
* to u8 *buf; and that you need to kfree(buf) afterwards. */
size_t pcmcia_get_tuple(struct pcmcia_device *p_dev, cisdata_t code,
u8 **buf);
/* loop over CIS entries */
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);
/* get the MAC address from CISTPL_FUNCE */
int pcmcia_get_mac_from_cis(struct pcmcia_device *p_dev,
struct net_device *dev);
/* parse a tuple_t */
int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse);
int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
tuple_t *tuple);
#define pcmcia_get_first_tuple(p_dev, tuple) \
pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple)
int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
tuple_t *tuple);
#define pcmcia_get_next_tuple(p_dev, tuple) \
pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple)
int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
#define pcmcia_get_tuple_data(p_dev, tuple) \
pccard_get_tuple_data(p_dev->socket, tuple)
/* loop CIS entries for valid configuration */
int pcmcia_loop_config(struct pcmcia_device *p_dev,
int (*conf_check) (struct pcmcia_device *p_dev,
@@ -215,6 +229,21 @@ int pcmcia_reset_card(struct pcmcia_socket *skt);
int pcmcia_access_configuration_register(struct pcmcia_device *p_dev,
conf_reg_t *reg);
/* deprecated -- do not use in drivers. */
int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
tuple_t *tuple);
#define pcmcia_get_first_tuple(p_dev, tuple) \
pccard_get_first_tuple(p_dev->socket, p_dev->func, tuple)
int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
tuple_t *tuple);
#define pcmcia_get_next_tuple(p_dev, tuple) \
pccard_get_next_tuple(p_dev->socket, p_dev->func, tuple)
int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
#define pcmcia_get_tuple_data(p_dev, tuple) \
pccard_get_tuple_data(p_dev->socket, tuple)
/* device configuration */
int pcmcia_request_io(struct pcmcia_device *p_dev, io_req_t *req);
int pcmcia_request_irq(struct pcmcia_device *p_dev, irq_req_t *req);