int pcmcia_loop_config(struct pcmcia_device *p_dev, int (*conf_check) (struct pcmcia_device *p_dev, cistpl_cftable_entry_t *cfg, cistpl_cftable_entry_t *dflt, unsigned int vcc, void *priv_data), void *priv_data) { struct pcmcia_cfg_mem *cfg_mem; int ret; cfg_mem = kzalloc(sizeof(struct pcmcia_cfg_mem), GFP_KERNEL); if (cfg_mem == NULL) return -ENOMEM; cfg_mem->p_dev = p_dev; cfg_mem->conf_check = conf_check; cfg_mem->priv_data = priv_data; ret = pccard_loop_tuple(p_dev->socket, p_dev->func, CISTPL_CFTABLE_ENTRY, &cfg_mem->parse, cfg_mem, pcmcia_do_loop_config); kfree(cfg_mem); return ret; }
/** * 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); }