Lines Matching refs:s

62 void release_cis_mem(struct pcmcia_socket *s)  in release_cis_mem()  argument
64 mutex_lock(&s->ops_mutex); in release_cis_mem()
65 if (s->cis_mem.flags & MAP_ACTIVE) { in release_cis_mem()
66 s->cis_mem.flags &= ~MAP_ACTIVE; in release_cis_mem()
67 s->ops->set_mem_map(s, &s->cis_mem); in release_cis_mem()
68 if (s->cis_mem.res) { in release_cis_mem()
69 release_resource(s->cis_mem.res); in release_cis_mem()
70 kfree(s->cis_mem.res); in release_cis_mem()
71 s->cis_mem.res = NULL; in release_cis_mem()
73 iounmap(s->cis_virt); in release_cis_mem()
74 s->cis_virt = NULL; in release_cis_mem()
76 mutex_unlock(&s->ops_mutex); in release_cis_mem()
87 static void __iomem *set_cis_map(struct pcmcia_socket *s, in set_cis_map() argument
90 pccard_mem_map *mem = &s->cis_mem; in set_cis_map()
93 if (!(s->features & SS_CAP_STATIC_MAP) && (mem->res == NULL)) { in set_cis_map()
94 mem->res = pcmcia_find_mem_region(0, s->map_size, in set_cis_map()
95 s->map_size, 0, s); in set_cis_map()
97 dev_printk(KERN_NOTICE, &s->dev, in set_cis_map()
101 s->cis_virt = NULL; in set_cis_map()
104 if (!(s->features & SS_CAP_STATIC_MAP) && (!s->cis_virt)) in set_cis_map()
105 s->cis_virt = ioremap(mem->res->start, s->map_size); in set_cis_map()
110 ret = s->ops->set_mem_map(s, mem); in set_cis_map()
112 iounmap(s->cis_virt); in set_cis_map()
113 s->cis_virt = NULL; in set_cis_map()
117 if (s->features & SS_CAP_STATIC_MAP) { in set_cis_map()
118 if (s->cis_virt) in set_cis_map()
119 iounmap(s->cis_virt); in set_cis_map()
120 s->cis_virt = ioremap(mem->static_start, s->map_size); in set_cis_map()
123 return s->cis_virt; in set_cis_map()
136 int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr, in pcmcia_read_cis_mem() argument
142 dev_dbg(&s->dev, "pcmcia_read_cis_mem(%d, %#x, %u)\n", attr, addr, len); in pcmcia_read_cis_mem()
153 sys = set_cis_map(s, 0, MAP_ACTIVE | in pcmcia_read_cis_mem()
156 dev_dbg(&s->dev, "could not map memory\n"); in pcmcia_read_cis_mem()
172 dev_dbg(&s->dev, in pcmcia_read_cis_mem()
185 card_offset = addr & ~(s->map_size-1); in pcmcia_read_cis_mem()
187 sys = set_cis_map(s, card_offset, flags); in pcmcia_read_cis_mem()
189 dev_dbg(&s->dev, "could not map memory\n"); in pcmcia_read_cis_mem()
193 end = sys + s->map_size; in pcmcia_read_cis_mem()
194 sys = sys + (addr & (s->map_size-1)); in pcmcia_read_cis_mem()
200 card_offset += s->map_size; in pcmcia_read_cis_mem()
204 dev_dbg(&s->dev, " %#2.2x %#2.2x %#2.2x %#2.2x ...\n", in pcmcia_read_cis_mem()
217 int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr, in pcmcia_write_cis_mem() argument
223 dev_dbg(&s->dev, in pcmcia_write_cis_mem()
235 sys = set_cis_map(s, 0, MAP_ACTIVE | in pcmcia_write_cis_mem()
238 dev_dbg(&s->dev, "could not map memory\n"); in pcmcia_write_cis_mem()
259 card_offset = addr & ~(s->map_size-1); in pcmcia_write_cis_mem()
261 sys = set_cis_map(s, card_offset, flags); in pcmcia_write_cis_mem()
263 dev_dbg(&s->dev, "could not map memory\n"); in pcmcia_write_cis_mem()
267 end = sys + s->map_size; in pcmcia_write_cis_mem()
268 sys = sys + (addr & (s->map_size-1)); in pcmcia_write_cis_mem()
274 card_offset += s->map_size; in pcmcia_write_cis_mem()
289 static int read_cis_cache(struct pcmcia_socket *s, int attr, u_int addr, in read_cis_cache() argument
295 if (s->state & SOCKET_CARDBUS) in read_cis_cache()
298 mutex_lock(&s->ops_mutex); in read_cis_cache()
299 if (s->fake_cis) { in read_cis_cache()
300 if (s->fake_cis_len >= addr+len) in read_cis_cache()
301 memcpy(ptr, s->fake_cis+addr, len); in read_cis_cache()
306 mutex_unlock(&s->ops_mutex); in read_cis_cache()
310 list_for_each_entry(cis, &s->cis_cache, node) { in read_cis_cache()
313 mutex_unlock(&s->ops_mutex); in read_cis_cache()
318 ret = pcmcia_read_cis_mem(s, attr, addr, len, ptr); in read_cis_cache()
328 list_add(&cis->node, &s->cis_cache); in read_cis_cache()
331 mutex_unlock(&s->ops_mutex); in read_cis_cache()
337 remove_cis_cache(struct pcmcia_socket *s, int attr, u_int addr, u_int len) in remove_cis_cache() argument
341 mutex_lock(&s->ops_mutex); in remove_cis_cache()
342 list_for_each_entry(cis, &s->cis_cache, node) in remove_cis_cache()
348 mutex_unlock(&s->ops_mutex); in remove_cis_cache()
358 void destroy_cis_cache(struct pcmcia_socket *s) in destroy_cis_cache() argument
363 list_for_each_safe(l, n, &s->cis_cache) { in destroy_cis_cache()
373 int verify_cis_cache(struct pcmcia_socket *s) in verify_cis_cache() argument
379 if (s->state & SOCKET_CARDBUS) in verify_cis_cache()
384 dev_printk(KERN_WARNING, &s->dev, in verify_cis_cache()
388 mutex_lock(&s->ops_mutex); in verify_cis_cache()
389 list_for_each_entry(cis, &s->cis_cache, node) { in verify_cis_cache()
395 ret = pcmcia_read_cis_mem(s, cis->attr, cis->addr, len, buf); in verify_cis_cache()
398 mutex_unlock(&s->ops_mutex); in verify_cis_cache()
403 mutex_unlock(&s->ops_mutex); in verify_cis_cache()
413 int pcmcia_replace_cis(struct pcmcia_socket *s, in pcmcia_replace_cis() argument
417 dev_printk(KERN_WARNING, &s->dev, "replacement CIS too big\n"); in pcmcia_replace_cis()
420 mutex_lock(&s->ops_mutex); in pcmcia_replace_cis()
421 kfree(s->fake_cis); in pcmcia_replace_cis()
422 s->fake_cis = kmalloc(len, GFP_KERNEL); in pcmcia_replace_cis()
423 if (s->fake_cis == NULL) { in pcmcia_replace_cis()
424 dev_printk(KERN_WARNING, &s->dev, "no memory to replace CIS\n"); in pcmcia_replace_cis()
425 mutex_unlock(&s->ops_mutex); in pcmcia_replace_cis()
428 s->fake_cis_len = len; in pcmcia_replace_cis()
429 memcpy(s->fake_cis, data, len); in pcmcia_replace_cis()
430 dev_info(&s->dev, "Using replacement CIS\n"); in pcmcia_replace_cis()
431 mutex_unlock(&s->ops_mutex); in pcmcia_replace_cis()
449 int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, in pccard_get_first_tuple() argument
452 if (!s) in pccard_get_first_tuple()
455 if (!(s->state & SOCKET_PRESENT) || (s->state & SOCKET_CARDBUS)) in pccard_get_first_tuple()
463 if ((s->functions > 1) && !(tuple->Attributes & TUPLE_RETURN_COMMON)) { in pccard_get_first_tuple()
466 if (pccard_get_next_tuple(s, function, tuple) == 0) { in pccard_get_first_tuple()
468 if (pccard_get_next_tuple(s, function, tuple) != 0) in pccard_get_first_tuple()
474 return pccard_get_next_tuple(s, function, tuple); in pccard_get_first_tuple()
477 static int follow_link(struct pcmcia_socket *s, tuple_t *tuple) in follow_link() argument
485 ret = read_cis_cache(s, LINK_SPACE(tuple->Flags), in follow_link()
504 ret = read_cis_cache(s, SPACE(tuple->Flags), ofs, 5, link); in follow_link()
510 remove_cis_cache(s, SPACE(tuple->Flags), ofs, 5); in follow_link()
514 ret = read_cis_cache(s, SPACE(tuple->Flags), ofs, 5, link); in follow_link()
520 remove_cis_cache(s, SPACE(tuple->Flags), ofs, 5); in follow_link()
524 int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function, in pccard_get_next_tuple() argument
531 if (!s) in pccard_get_next_tuple()
533 if (!(s->state & SOCKET_PRESENT) || (s->state & SOCKET_CARDBUS)) in pccard_get_next_tuple()
544 ret = read_cis_cache(s, attr, ofs, 2, link); in pccard_get_next_tuple()
555 ofs = follow_link(s, tuple); in pccard_get_next_tuple()
559 ret = read_cis_cache(s, attr, ofs, 2, link); in pccard_get_next_tuple()
575 ret = read_cis_cache(s, attr, ofs+2, 4, in pccard_get_next_tuple()
583 ret = read_cis_cache(s, attr, ofs+2, 4, in pccard_get_next_tuple()
599 ret = read_cis_cache(s, attr, ofs+2, in pccard_get_next_tuple()
626 dev_dbg(&s->dev, "cs: overrun in pcmcia_get_next_tuple\n"); in pccard_get_next_tuple()
636 int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple) in pccard_get_tuple_data() argument
641 if (!s) in pccard_get_tuple_data()
650 ret = read_cis_cache(s, SPACE(tuple->Flags), in pccard_get_tuple_data()
765 char *s, u_char *ofs, u_char *found) in parse_strings() argument
778 s[j++] = (*p == 0xff) ? '\0' : *p; in parse_strings()
1379 int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *info) in pccard_validate_cis() argument
1386 if (!s) in pccard_validate_cis()
1389 if (s->functions || !(s->state & SOCKET_PRESENT)) { in pccard_validate_cis()
1395 mutex_lock(&s->ops_mutex); in pccard_validate_cis()
1396 destroy_cis_cache(s); in pccard_validate_cis()
1397 mutex_unlock(&s->ops_mutex); in pccard_validate_cis()
1401 dev_warn(&s->dev, "no memory to validate CIS\n"); in pccard_validate_cis()
1407 dev_warn(&s->dev, "no memory to validate CIS\n"); in pccard_validate_cis()
1414 ret = pccard_get_first_tuple(s, BIND_FN_ALL, tuple); in pccard_validate_cis()
1421 (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_CFTABLE_ENTRY, p)) || in pccard_validate_cis()
1422 (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_CFTABLE_ENTRY_CB, p))) in pccard_validate_cis()
1428 if ((pccard_read_tuple(s, BIND_FN_ALL, CISTPL_MANFID, p) == 0) || in pccard_validate_cis()
1429 (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_VERS_1, p) == 0) || in pccard_validate_cis()
1430 (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_VERS_2, p) != -ENOSPC)) in pccard_validate_cis()
1437 ret = pccard_get_next_tuple(s, BIND_FN_ALL, tuple); in pccard_validate_cis()
1462 dev_info(&s->dev, "no CIS, assuming an anonymous memory card.\n"); in pccard_validate_cis()
1463 pcmcia_replace_cis(s, "\xFF", 1); in pccard_validate_cis()
1469 mutex_lock(&s->ops_mutex); in pccard_validate_cis()
1470 destroy_cis_cache(s); in pccard_validate_cis()
1471 mutex_unlock(&s->ops_mutex); in pccard_validate_cis()
1486 static ssize_t pccard_extract_cis(struct pcmcia_socket *s, char *buf, in pccard_extract_cis() argument
1512 status = pccard_get_first_tuple(s, BIND_FN_ALL, &tuple); in pccard_extract_cis()
1518 status = pccard_get_tuple_data(s, &tuple); in pccard_extract_cis()
1544 status = pccard_get_next_tuple(s, BIND_FN_ALL, &tuple); in pccard_extract_cis()
1564 struct pcmcia_socket *s; in pccard_show_cis() local
1570 s = to_socket(container_of(kobj, struct device, kobj)); in pccard_show_cis()
1572 if (!(s->state & SOCKET_PRESENT)) in pccard_show_cis()
1574 if (!s->functions && pccard_validate_cis(s, &chains)) in pccard_show_cis()
1579 count = pccard_extract_cis(s, buf, off, count); in pccard_show_cis()
1590 struct pcmcia_socket *s; in pccard_store_cis() local
1593 s = to_socket(container_of(kobj, struct device, kobj)); in pccard_store_cis()
1601 if (!(s->state & SOCKET_PRESENT)) in pccard_store_cis()
1604 error = pcmcia_replace_cis(s, buf, count); in pccard_store_cis()
1608 pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY); in pccard_store_cis()