Merge remote-tracking branch 'asoc/fix/dapm' into asoc-linus
[deliverable/linux.git] / drivers / pcmcia / cistpl.c
1 /*
2 * cistpl.c -- 16-bit PCMCIA Card Information Structure parser
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * The initial developer of the original code is David A. Hinds
9 * <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
10 * are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
11 *
12 * (C) 1999 David A. Hinds
13 */
14
15 #include <linux/module.h>
16 #include <linux/moduleparam.h>
17 #include <linux/kernel.h>
18 #include <linux/string.h>
19 #include <linux/major.h>
20 #include <linux/errno.h>
21 #include <linux/timer.h>
22 #include <linux/slab.h>
23 #include <linux/mm.h>
24 #include <linux/pci.h>
25 #include <linux/ioport.h>
26 #include <linux/io.h>
27 #include <asm/byteorder.h>
28 #include <asm/unaligned.h>
29
30 #include <pcmcia/ss.h>
31 #include <pcmcia/cisreg.h>
32 #include <pcmcia/cistpl.h>
33 #include "cs_internal.h"
34
35 static const u_char mantissa[] = {
36 10, 12, 13, 15, 20, 25, 30, 35,
37 40, 45, 50, 55, 60, 70, 80, 90
38 };
39
40 static const u_int exponent[] = {
41 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000
42 };
43
44 /* Convert an extended speed byte to a time in nanoseconds */
45 #define SPEED_CVT(v) \
46 (mantissa[(((v)>>3)&15)-1] * exponent[(v)&7] / 10)
47 /* Convert a power byte to a current in 0.1 microamps */
48 #define POWER_CVT(v) \
49 (mantissa[((v)>>3)&15] * exponent[(v)&7] / 10)
50 #define POWER_SCALE(v) (exponent[(v)&7])
51
52 /* Upper limit on reasonable # of tuples */
53 #define MAX_TUPLES 200
54
55 /* Bits in IRQInfo1 field */
56 #define IRQ_INFO2_VALID 0x10
57
58 /* 16-bit CIS? */
59 static int cis_width;
60 module_param(cis_width, int, 0444);
61
62 void release_cis_mem(struct pcmcia_socket *s)
63 {
64 mutex_lock(&s->ops_mutex);
65 if (s->cis_mem.flags & MAP_ACTIVE) {
66 s->cis_mem.flags &= ~MAP_ACTIVE;
67 s->ops->set_mem_map(s, &s->cis_mem);
68 if (s->cis_mem.res) {
69 release_resource(s->cis_mem.res);
70 kfree(s->cis_mem.res);
71 s->cis_mem.res = NULL;
72 }
73 iounmap(s->cis_virt);
74 s->cis_virt = NULL;
75 }
76 mutex_unlock(&s->ops_mutex);
77 }
78
79 /**
80 * set_cis_map() - map the card memory at "card_offset" into virtual space.
81 *
82 * If flags & MAP_ATTRIB, map the attribute space, otherwise
83 * map the memory space.
84 *
85 * Must be called with ops_mutex held.
86 */
87 static void __iomem *set_cis_map(struct pcmcia_socket *s,
88 unsigned int card_offset, unsigned int flags)
89 {
90 pccard_mem_map *mem = &s->cis_mem;
91 int ret;
92
93 if (!(s->features & SS_CAP_STATIC_MAP) && (mem->res == NULL)) {
94 mem->res = pcmcia_find_mem_region(0, s->map_size,
95 s->map_size, 0, s);
96 if (mem->res == NULL) {
97 dev_printk(KERN_NOTICE, &s->dev,
98 "cs: unable to map card memory!\n");
99 return NULL;
100 }
101 s->cis_virt = NULL;
102 }
103
104 if (!(s->features & SS_CAP_STATIC_MAP) && (!s->cis_virt))
105 s->cis_virt = ioremap(mem->res->start, s->map_size);
106
107 mem->card_start = card_offset;
108 mem->flags = flags;
109
110 ret = s->ops->set_mem_map(s, mem);
111 if (ret) {
112 iounmap(s->cis_virt);
113 s->cis_virt = NULL;
114 return NULL;
115 }
116
117 if (s->features & SS_CAP_STATIC_MAP) {
118 if (s->cis_virt)
119 iounmap(s->cis_virt);
120 s->cis_virt = ioremap(mem->static_start, s->map_size);
121 }
122
123 return s->cis_virt;
124 }
125
126
127 /* Bits in attr field */
128 #define IS_ATTR 1
129 #define IS_INDIRECT 8
130
131 /**
132 * pcmcia_read_cis_mem() - low-level function to read CIS memory
133 *
134 * must be called with ops_mutex held
135 */
136 int pcmcia_read_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
137 u_int len, void *ptr)
138 {
139 void __iomem *sys, *end;
140 unsigned char *buf = ptr;
141
142 dev_dbg(&s->dev, "pcmcia_read_cis_mem(%d, %#x, %u)\n", attr, addr, len);
143
144 if (attr & IS_INDIRECT) {
145 /* Indirect accesses use a bunch of special registers at fixed
146 locations in common memory */
147 u_char flags = ICTRL0_COMMON|ICTRL0_AUTOINC|ICTRL0_BYTEGRAN;
148 if (attr & IS_ATTR) {
149 addr *= 2;
150 flags = ICTRL0_AUTOINC;
151 }
152
153 sys = set_cis_map(s, 0, MAP_ACTIVE |
154 ((cis_width) ? MAP_16BIT : 0));
155 if (!sys) {
156 dev_dbg(&s->dev, "could not map memory\n");
157 memset(ptr, 0xff, len);
158 return -1;
159 }
160
161 writeb(flags, sys+CISREG_ICTRL0);
162 writeb(addr & 0xff, sys+CISREG_IADDR0);
163 writeb((addr>>8) & 0xff, sys+CISREG_IADDR1);
164 writeb((addr>>16) & 0xff, sys+CISREG_IADDR2);
165 writeb((addr>>24) & 0xff, sys+CISREG_IADDR3);
166 for ( ; len > 0; len--, buf++)
167 *buf = readb(sys+CISREG_IDATA0);
168 } else {
169 u_int inc = 1, card_offset, flags;
170
171 if (addr > CISTPL_MAX_CIS_SIZE) {
172 dev_dbg(&s->dev,
173 "attempt to read CIS mem at addr %#x", addr);
174 memset(ptr, 0xff, len);
175 return -1;
176 }
177
178 flags = MAP_ACTIVE | ((cis_width) ? MAP_16BIT : 0);
179 if (attr) {
180 flags |= MAP_ATTRIB;
181 inc++;
182 addr *= 2;
183 }
184
185 card_offset = addr & ~(s->map_size-1);
186 while (len) {
187 sys = set_cis_map(s, card_offset, flags);
188 if (!sys) {
189 dev_dbg(&s->dev, "could not map memory\n");
190 memset(ptr, 0xff, len);
191 return -1;
192 }
193 end = sys + s->map_size;
194 sys = sys + (addr & (s->map_size-1));
195 for ( ; len > 0; len--, buf++, sys += inc) {
196 if (sys == end)
197 break;
198 *buf = readb(sys);
199 }
200 card_offset += s->map_size;
201 addr = 0;
202 }
203 }
204 dev_dbg(&s->dev, " %#2.2x %#2.2x %#2.2x %#2.2x ...\n",
205 *(u_char *)(ptr+0), *(u_char *)(ptr+1),
206 *(u_char *)(ptr+2), *(u_char *)(ptr+3));
207 return 0;
208 }
209
210
211 /**
212 * pcmcia_write_cis_mem() - low-level function to write CIS memory
213 *
214 * Probably only useful for writing one-byte registers. Must be called
215 * with ops_mutex held.
216 */
217 int pcmcia_write_cis_mem(struct pcmcia_socket *s, int attr, u_int addr,
218 u_int len, void *ptr)
219 {
220 void __iomem *sys, *end;
221 unsigned char *buf = ptr;
222
223 dev_dbg(&s->dev,
224 "pcmcia_write_cis_mem(%d, %#x, %u)\n", attr, addr, len);
225
226 if (attr & IS_INDIRECT) {
227 /* Indirect accesses use a bunch of special registers at fixed
228 locations in common memory */
229 u_char flags = ICTRL0_COMMON|ICTRL0_AUTOINC|ICTRL0_BYTEGRAN;
230 if (attr & IS_ATTR) {
231 addr *= 2;
232 flags = ICTRL0_AUTOINC;
233 }
234
235 sys = set_cis_map(s, 0, MAP_ACTIVE |
236 ((cis_width) ? MAP_16BIT : 0));
237 if (!sys) {
238 dev_dbg(&s->dev, "could not map memory\n");
239 return -EINVAL;
240 }
241
242 writeb(flags, sys+CISREG_ICTRL0);
243 writeb(addr & 0xff, sys+CISREG_IADDR0);
244 writeb((addr>>8) & 0xff, sys+CISREG_IADDR1);
245 writeb((addr>>16) & 0xff, sys+CISREG_IADDR2);
246 writeb((addr>>24) & 0xff, sys+CISREG_IADDR3);
247 for ( ; len > 0; len--, buf++)
248 writeb(*buf, sys+CISREG_IDATA0);
249 } else {
250 u_int inc = 1, card_offset, flags;
251
252 flags = MAP_ACTIVE | ((cis_width) ? MAP_16BIT : 0);
253 if (attr & IS_ATTR) {
254 flags |= MAP_ATTRIB;
255 inc++;
256 addr *= 2;
257 }
258
259 card_offset = addr & ~(s->map_size-1);
260 while (len) {
261 sys = set_cis_map(s, card_offset, flags);
262 if (!sys) {
263 dev_dbg(&s->dev, "could not map memory\n");
264 return -EINVAL;
265 }
266
267 end = sys + s->map_size;
268 sys = sys + (addr & (s->map_size-1));
269 for ( ; len > 0; len--, buf++, sys += inc) {
270 if (sys == end)
271 break;
272 writeb(*buf, sys);
273 }
274 card_offset += s->map_size;
275 addr = 0;
276 }
277 }
278 return 0;
279 }
280
281
282 /**
283 * read_cis_cache() - read CIS memory or its associated cache
284 *
285 * This is a wrapper around read_cis_mem, with the same interface,
286 * but which caches information, for cards whose CIS may not be
287 * readable all the time.
288 */
289 static int read_cis_cache(struct pcmcia_socket *s, int attr, u_int addr,
290 size_t len, void *ptr)
291 {
292 struct cis_cache_entry *cis;
293 int ret = 0;
294
295 if (s->state & SOCKET_CARDBUS)
296 return -EINVAL;
297
298 mutex_lock(&s->ops_mutex);
299 if (s->fake_cis) {
300 if (s->fake_cis_len >= addr+len)
301 memcpy(ptr, s->fake_cis+addr, len);
302 else {
303 memset(ptr, 0xff, len);
304 ret = -EINVAL;
305 }
306 mutex_unlock(&s->ops_mutex);
307 return ret;
308 }
309
310 list_for_each_entry(cis, &s->cis_cache, node) {
311 if (cis->addr == addr && cis->len == len && cis->attr == attr) {
312 memcpy(ptr, cis->cache, len);
313 mutex_unlock(&s->ops_mutex);
314 return 0;
315 }
316 }
317
318 ret = pcmcia_read_cis_mem(s, attr, addr, len, ptr);
319
320 if (ret == 0) {
321 /* Copy data into the cache */
322 cis = kmalloc(sizeof(struct cis_cache_entry) + len, GFP_KERNEL);
323 if (cis) {
324 cis->addr = addr;
325 cis->len = len;
326 cis->attr = attr;
327 memcpy(cis->cache, ptr, len);
328 list_add(&cis->node, &s->cis_cache);
329 }
330 }
331 mutex_unlock(&s->ops_mutex);
332
333 return ret;
334 }
335
336 static void
337 remove_cis_cache(struct pcmcia_socket *s, int attr, u_int addr, u_int len)
338 {
339 struct cis_cache_entry *cis;
340
341 mutex_lock(&s->ops_mutex);
342 list_for_each_entry(cis, &s->cis_cache, node)
343 if (cis->addr == addr && cis->len == len && cis->attr == attr) {
344 list_del(&cis->node);
345 kfree(cis);
346 break;
347 }
348 mutex_unlock(&s->ops_mutex);
349 }
350
351 /**
352 * destroy_cis_cache() - destroy the CIS cache
353 * @s: pcmcia_socket for which CIS cache shall be destroyed
354 *
355 * This destroys the CIS cache but keeps any fake CIS alive. Must be
356 * called with ops_mutex held.
357 */
358 void destroy_cis_cache(struct pcmcia_socket *s)
359 {
360 struct list_head *l, *n;
361 struct cis_cache_entry *cis;
362
363 list_for_each_safe(l, n, &s->cis_cache) {
364 cis = list_entry(l, struct cis_cache_entry, node);
365 list_del(&cis->node);
366 kfree(cis);
367 }
368 }
369
370 /**
371 * verify_cis_cache() - does the CIS match what is in the CIS cache?
372 */
373 int verify_cis_cache(struct pcmcia_socket *s)
374 {
375 struct cis_cache_entry *cis;
376 char *buf;
377 int ret;
378
379 if (s->state & SOCKET_CARDBUS)
380 return -EINVAL;
381
382 buf = kmalloc(256, GFP_KERNEL);
383 if (buf == NULL) {
384 dev_printk(KERN_WARNING, &s->dev,
385 "no memory for verifying CIS\n");
386 return -ENOMEM;
387 }
388 mutex_lock(&s->ops_mutex);
389 list_for_each_entry(cis, &s->cis_cache, node) {
390 int len = cis->len;
391
392 if (len > 256)
393 len = 256;
394
395 ret = pcmcia_read_cis_mem(s, cis->attr, cis->addr, len, buf);
396 if (ret || memcmp(buf, cis->cache, len) != 0) {
397 kfree(buf);
398 mutex_unlock(&s->ops_mutex);
399 return -1;
400 }
401 }
402 kfree(buf);
403 mutex_unlock(&s->ops_mutex);
404 return 0;
405 }
406
407 /**
408 * pcmcia_replace_cis() - use a replacement CIS instead of the card's CIS
409 *
410 * For really bad cards, we provide a facility for uploading a
411 * replacement CIS.
412 */
413 int pcmcia_replace_cis(struct pcmcia_socket *s,
414 const u8 *data, const size_t len)
415 {
416 if (len > CISTPL_MAX_CIS_SIZE) {
417 dev_printk(KERN_WARNING, &s->dev, "replacement CIS too big\n");
418 return -EINVAL;
419 }
420 mutex_lock(&s->ops_mutex);
421 kfree(s->fake_cis);
422 s->fake_cis = kmalloc(len, GFP_KERNEL);
423 if (s->fake_cis == NULL) {
424 dev_printk(KERN_WARNING, &s->dev, "no memory to replace CIS\n");
425 mutex_unlock(&s->ops_mutex);
426 return -ENOMEM;
427 }
428 s->fake_cis_len = len;
429 memcpy(s->fake_cis, data, len);
430 dev_info(&s->dev, "Using replacement CIS\n");
431 mutex_unlock(&s->ops_mutex);
432 return 0;
433 }
434
435 /* The high-level CIS tuple services */
436
437 typedef struct tuple_flags {
438 u_int link_space:4;
439 u_int has_link:1;
440 u_int mfc_fn:3;
441 u_int space:4;
442 } tuple_flags;
443
444 #define LINK_SPACE(f) (((tuple_flags *)(&(f)))->link_space)
445 #define HAS_LINK(f) (((tuple_flags *)(&(f)))->has_link)
446 #define MFC_FN(f) (((tuple_flags *)(&(f)))->mfc_fn)
447 #define SPACE(f) (((tuple_flags *)(&(f)))->space)
448
449 int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function,
450 tuple_t *tuple)
451 {
452 if (!s)
453 return -EINVAL;
454
455 if (!(s->state & SOCKET_PRESENT) || (s->state & SOCKET_CARDBUS))
456 return -ENODEV;
457 tuple->TupleLink = tuple->Flags = 0;
458
459 /* Assume presence of a LONGLINK_C to address 0 */
460 tuple->CISOffset = tuple->LinkOffset = 0;
461 SPACE(tuple->Flags) = HAS_LINK(tuple->Flags) = 1;
462
463 if ((s->functions > 1) && !(tuple->Attributes & TUPLE_RETURN_COMMON)) {
464 cisdata_t req = tuple->DesiredTuple;
465 tuple->DesiredTuple = CISTPL_LONGLINK_MFC;
466 if (pccard_get_next_tuple(s, function, tuple) == 0) {
467 tuple->DesiredTuple = CISTPL_LINKTARGET;
468 if (pccard_get_next_tuple(s, function, tuple) != 0)
469 return -ENOSPC;
470 } else
471 tuple->CISOffset = tuple->TupleLink = 0;
472 tuple->DesiredTuple = req;
473 }
474 return pccard_get_next_tuple(s, function, tuple);
475 }
476
477 static int follow_link(struct pcmcia_socket *s, tuple_t *tuple)
478 {
479 u_char link[5];
480 u_int ofs;
481 int ret;
482
483 if (MFC_FN(tuple->Flags)) {
484 /* Get indirect link from the MFC tuple */
485 ret = read_cis_cache(s, LINK_SPACE(tuple->Flags),
486 tuple->LinkOffset, 5, link);
487 if (ret)
488 return -1;
489 ofs = get_unaligned_le32(link + 1);
490 SPACE(tuple->Flags) = (link[0] == CISTPL_MFC_ATTR);
491 /* Move to the next indirect link */
492 tuple->LinkOffset += 5;
493 MFC_FN(tuple->Flags)--;
494 } else if (HAS_LINK(tuple->Flags)) {
495 ofs = tuple->LinkOffset;
496 SPACE(tuple->Flags) = LINK_SPACE(tuple->Flags);
497 HAS_LINK(tuple->Flags) = 0;
498 } else
499 return -1;
500
501 if (SPACE(tuple->Flags)) {
502 /* This is ugly, but a common CIS error is to code the long
503 link offset incorrectly, so we check the right spot... */
504 ret = read_cis_cache(s, SPACE(tuple->Flags), ofs, 5, link);
505 if (ret)
506 return -1;
507 if ((link[0] == CISTPL_LINKTARGET) && (link[1] >= 3) &&
508 (strncmp(link+2, "CIS", 3) == 0))
509 return ofs;
510 remove_cis_cache(s, SPACE(tuple->Flags), ofs, 5);
511 /* Then, we try the wrong spot... */
512 ofs = ofs >> 1;
513 }
514 ret = read_cis_cache(s, SPACE(tuple->Flags), ofs, 5, link);
515 if (ret)
516 return -1;
517 if ((link[0] == CISTPL_LINKTARGET) && (link[1] >= 3) &&
518 (strncmp(link+2, "CIS", 3) == 0))
519 return ofs;
520 remove_cis_cache(s, SPACE(tuple->Flags), ofs, 5);
521 return -1;
522 }
523
524 int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int function,
525 tuple_t *tuple)
526 {
527 u_char link[2], tmp;
528 int ofs, i, attr;
529 int ret;
530
531 if (!s)
532 return -EINVAL;
533 if (!(s->state & SOCKET_PRESENT) || (s->state & SOCKET_CARDBUS))
534 return -ENODEV;
535
536 link[1] = tuple->TupleLink;
537 ofs = tuple->CISOffset + tuple->TupleLink;
538 attr = SPACE(tuple->Flags);
539
540 for (i = 0; i < MAX_TUPLES; i++) {
541 if (link[1] == 0xff)
542 link[0] = CISTPL_END;
543 else {
544 ret = read_cis_cache(s, attr, ofs, 2, link);
545 if (ret)
546 return -1;
547 if (link[0] == CISTPL_NULL) {
548 ofs++;
549 continue;
550 }
551 }
552
553 /* End of chain? Follow long link if possible */
554 if (link[0] == CISTPL_END) {
555 ofs = follow_link(s, tuple);
556 if (ofs < 0)
557 return -ENOSPC;
558 attr = SPACE(tuple->Flags);
559 ret = read_cis_cache(s, attr, ofs, 2, link);
560 if (ret)
561 return -1;
562 }
563
564 /* Is this a link tuple? Make a note of it */
565 if ((link[0] == CISTPL_LONGLINK_A) ||
566 (link[0] == CISTPL_LONGLINK_C) ||
567 (link[0] == CISTPL_LONGLINK_MFC) ||
568 (link[0] == CISTPL_LINKTARGET) ||
569 (link[0] == CISTPL_INDIRECT) ||
570 (link[0] == CISTPL_NO_LINK)) {
571 switch (link[0]) {
572 case CISTPL_LONGLINK_A:
573 HAS_LINK(tuple->Flags) = 1;
574 LINK_SPACE(tuple->Flags) = attr | IS_ATTR;
575 ret = read_cis_cache(s, attr, ofs+2, 4,
576 &tuple->LinkOffset);
577 if (ret)
578 return -1;
579 break;
580 case CISTPL_LONGLINK_C:
581 HAS_LINK(tuple->Flags) = 1;
582 LINK_SPACE(tuple->Flags) = attr & ~IS_ATTR;
583 ret = read_cis_cache(s, attr, ofs+2, 4,
584 &tuple->LinkOffset);
585 if (ret)
586 return -1;
587 break;
588 case CISTPL_INDIRECT:
589 HAS_LINK(tuple->Flags) = 1;
590 LINK_SPACE(tuple->Flags) = IS_ATTR |
591 IS_INDIRECT;
592 tuple->LinkOffset = 0;
593 break;
594 case CISTPL_LONGLINK_MFC:
595 tuple->LinkOffset = ofs + 3;
596 LINK_SPACE(tuple->Flags) = attr;
597 if (function == BIND_FN_ALL) {
598 /* Follow all the MFC links */
599 ret = read_cis_cache(s, attr, ofs+2,
600 1, &tmp);
601 if (ret)
602 return -1;
603 MFC_FN(tuple->Flags) = tmp;
604 } else {
605 /* Follow exactly one of the links */
606 MFC_FN(tuple->Flags) = 1;
607 tuple->LinkOffset += function * 5;
608 }
609 break;
610 case CISTPL_NO_LINK:
611 HAS_LINK(tuple->Flags) = 0;
612 break;
613 }
614 if ((tuple->Attributes & TUPLE_RETURN_LINK) &&
615 (tuple->DesiredTuple == RETURN_FIRST_TUPLE))
616 break;
617 } else
618 if (tuple->DesiredTuple == RETURN_FIRST_TUPLE)
619 break;
620
621 if (link[0] == tuple->DesiredTuple)
622 break;
623 ofs += link[1] + 2;
624 }
625 if (i == MAX_TUPLES) {
626 dev_dbg(&s->dev, "cs: overrun in pcmcia_get_next_tuple\n");
627 return -ENOSPC;
628 }
629
630 tuple->TupleCode = link[0];
631 tuple->TupleLink = link[1];
632 tuple->CISOffset = ofs + 2;
633 return 0;
634 }
635
636 int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple)
637 {
638 u_int len;
639 int ret;
640
641 if (!s)
642 return -EINVAL;
643
644 if (tuple->TupleLink < tuple->TupleOffset)
645 return -ENOSPC;
646 len = tuple->TupleLink - tuple->TupleOffset;
647 tuple->TupleDataLen = tuple->TupleLink;
648 if (len == 0)
649 return 0;
650 ret = read_cis_cache(s, SPACE(tuple->Flags),
651 tuple->CISOffset + tuple->TupleOffset,
652 min(len, (u_int) tuple->TupleDataMax),
653 tuple->TupleData);
654 if (ret)
655 return -1;
656 return 0;
657 }
658
659
660 /* Parsing routines for individual tuples */
661
662 static int parse_device(tuple_t *tuple, cistpl_device_t *device)
663 {
664 int i;
665 u_char scale;
666 u_char *p, *q;
667
668 p = (u_char *)tuple->TupleData;
669 q = p + tuple->TupleDataLen;
670
671 device->ndev = 0;
672 for (i = 0; i < CISTPL_MAX_DEVICES; i++) {
673
674 if (*p == 0xff)
675 break;
676 device->dev[i].type = (*p >> 4);
677 device->dev[i].wp = (*p & 0x08) ? 1 : 0;
678 switch (*p & 0x07) {
679 case 0:
680 device->dev[i].speed = 0;
681 break;
682 case 1:
683 device->dev[i].speed = 250;
684 break;
685 case 2:
686 device->dev[i].speed = 200;
687 break;
688 case 3:
689 device->dev[i].speed = 150;
690 break;
691 case 4:
692 device->dev[i].speed = 100;
693 break;
694 case 7:
695 if (++p == q)
696 return -EINVAL;
697 device->dev[i].speed = SPEED_CVT(*p);
698 while (*p & 0x80)
699 if (++p == q)
700 return -EINVAL;
701 break;
702 default:
703 return -EINVAL;
704 }
705
706 if (++p == q)
707 return -EINVAL;
708 if (*p == 0xff)
709 break;
710 scale = *p & 7;
711 if (scale == 7)
712 return -EINVAL;
713 device->dev[i].size = ((*p >> 3) + 1) * (512 << (scale*2));
714 device->ndev++;
715 if (++p == q)
716 break;
717 }
718
719 return 0;
720 }
721
722
723 static int parse_checksum(tuple_t *tuple, cistpl_checksum_t *csum)
724 {
725 u_char *p;
726 if (tuple->TupleDataLen < 5)
727 return -EINVAL;
728 p = (u_char *) tuple->TupleData;
729 csum->addr = tuple->CISOffset + get_unaligned_le16(p) - 2;
730 csum->len = get_unaligned_le16(p + 2);
731 csum->sum = *(p + 4);
732 return 0;
733 }
734
735
736 static int parse_longlink(tuple_t *tuple, cistpl_longlink_t *link)
737 {
738 if (tuple->TupleDataLen < 4)
739 return -EINVAL;
740 link->addr = get_unaligned_le32(tuple->TupleData);
741 return 0;
742 }
743
744
745 static int parse_longlink_mfc(tuple_t *tuple, cistpl_longlink_mfc_t *link)
746 {
747 u_char *p;
748 int i;
749
750 p = (u_char *)tuple->TupleData;
751
752 link->nfn = *p; p++;
753 if (tuple->TupleDataLen <= link->nfn*5)
754 return -EINVAL;
755 for (i = 0; i < link->nfn; i++) {
756 link->fn[i].space = *p; p++;
757 link->fn[i].addr = get_unaligned_le32(p);
758 p += 4;
759 }
760 return 0;
761 }
762
763
764 static int parse_strings(u_char *p, u_char *q, int max,
765 char *s, u_char *ofs, u_char *found)
766 {
767 int i, j, ns;
768
769 if (p == q)
770 return -EINVAL;
771 ns = 0; j = 0;
772 for (i = 0; i < max; i++) {
773 if (*p == 0xff)
774 break;
775 ofs[i] = j;
776 ns++;
777 for (;;) {
778 s[j++] = (*p == 0xff) ? '\0' : *p;
779 if ((*p == '\0') || (*p == 0xff))
780 break;
781 if (++p == q)
782 return -EINVAL;
783 }
784 if ((*p == 0xff) || (++p == q))
785 break;
786 }
787 if (found) {
788 *found = ns;
789 return 0;
790 }
791
792 return (ns == max) ? 0 : -EINVAL;
793 }
794
795
796 static int parse_vers_1(tuple_t *tuple, cistpl_vers_1_t *vers_1)
797 {
798 u_char *p, *q;
799
800 p = (u_char *)tuple->TupleData;
801 q = p + tuple->TupleDataLen;
802
803 vers_1->major = *p; p++;
804 vers_1->minor = *p; p++;
805 if (p >= q)
806 return -EINVAL;
807
808 return parse_strings(p, q, CISTPL_VERS_1_MAX_PROD_STRINGS,
809 vers_1->str, vers_1->ofs, &vers_1->ns);
810 }
811
812
813 static int parse_altstr(tuple_t *tuple, cistpl_altstr_t *altstr)
814 {
815 u_char *p, *q;
816
817 p = (u_char *)tuple->TupleData;
818 q = p + tuple->TupleDataLen;
819
820 return parse_strings(p, q, CISTPL_MAX_ALTSTR_STRINGS,
821 altstr->str, altstr->ofs, &altstr->ns);
822 }
823
824
825 static int parse_jedec(tuple_t *tuple, cistpl_jedec_t *jedec)
826 {
827 u_char *p, *q;
828 int nid;
829
830 p = (u_char *)tuple->TupleData;
831 q = p + tuple->TupleDataLen;
832
833 for (nid = 0; nid < CISTPL_MAX_DEVICES; nid++) {
834 if (p > q-2)
835 break;
836 jedec->id[nid].mfr = p[0];
837 jedec->id[nid].info = p[1];
838 p += 2;
839 }
840 jedec->nid = nid;
841 return 0;
842 }
843
844
845 static int parse_manfid(tuple_t *tuple, cistpl_manfid_t *m)
846 {
847 if (tuple->TupleDataLen < 4)
848 return -EINVAL;
849 m->manf = get_unaligned_le16(tuple->TupleData);
850 m->card = get_unaligned_le16(tuple->TupleData + 2);
851 return 0;
852 }
853
854
855 static int parse_funcid(tuple_t *tuple, cistpl_funcid_t *f)
856 {
857 u_char *p;
858 if (tuple->TupleDataLen < 2)
859 return -EINVAL;
860 p = (u_char *)tuple->TupleData;
861 f->func = p[0];
862 f->sysinit = p[1];
863 return 0;
864 }
865
866
867 static int parse_funce(tuple_t *tuple, cistpl_funce_t *f)
868 {
869 u_char *p;
870 int i;
871 if (tuple->TupleDataLen < 1)
872 return -EINVAL;
873 p = (u_char *)tuple->TupleData;
874 f->type = p[0];
875 for (i = 1; i < tuple->TupleDataLen; i++)
876 f->data[i-1] = p[i];
877 return 0;
878 }
879
880
881 static int parse_config(tuple_t *tuple, cistpl_config_t *config)
882 {
883 int rasz, rmsz, i;
884 u_char *p;
885
886 p = (u_char *)tuple->TupleData;
887 rasz = *p & 0x03;
888 rmsz = (*p & 0x3c) >> 2;
889 if (tuple->TupleDataLen < rasz+rmsz+4)
890 return -EINVAL;
891 config->last_idx = *(++p);
892 p++;
893 config->base = 0;
894 for (i = 0; i <= rasz; i++)
895 config->base += p[i] << (8*i);
896 p += rasz+1;
897 for (i = 0; i < 4; i++)
898 config->rmask[i] = 0;
899 for (i = 0; i <= rmsz; i++)
900 config->rmask[i>>2] += p[i] << (8*(i%4));
901 config->subtuples = tuple->TupleDataLen - (rasz+rmsz+4);
902 return 0;
903 }
904
905 /* The following routines are all used to parse the nightmarish
906 * config table entries.
907 */
908
909 static u_char *parse_power(u_char *p, u_char *q, cistpl_power_t *pwr)
910 {
911 int i;
912 u_int scale;
913
914 if (p == q)
915 return NULL;
916 pwr->present = *p;
917 pwr->flags = 0;
918 p++;
919 for (i = 0; i < 7; i++)
920 if (pwr->present & (1<<i)) {
921 if (p == q)
922 return NULL;
923 pwr->param[i] = POWER_CVT(*p);
924 scale = POWER_SCALE(*p);
925 while (*p & 0x80) {
926 if (++p == q)
927 return NULL;
928 if ((*p & 0x7f) < 100)
929 pwr->param[i] +=
930 (*p & 0x7f) * scale / 100;
931 else if (*p == 0x7d)
932 pwr->flags |= CISTPL_POWER_HIGHZ_OK;
933 else if (*p == 0x7e)
934 pwr->param[i] = 0;
935 else if (*p == 0x7f)
936 pwr->flags |= CISTPL_POWER_HIGHZ_REQ;
937 else
938 return NULL;
939 }
940 p++;
941 }
942 return p;
943 }
944
945
946 static u_char *parse_timing(u_char *p, u_char *q, cistpl_timing_t *timing)
947 {
948 u_char scale;
949
950 if (p == q)
951 return NULL;
952 scale = *p;
953 if ((scale & 3) != 3) {
954 if (++p == q)
955 return NULL;
956 timing->wait = SPEED_CVT(*p);
957 timing->waitscale = exponent[scale & 3];
958 } else
959 timing->wait = 0;
960 scale >>= 2;
961 if ((scale & 7) != 7) {
962 if (++p == q)
963 return NULL;
964 timing->ready = SPEED_CVT(*p);
965 timing->rdyscale = exponent[scale & 7];
966 } else
967 timing->ready = 0;
968 scale >>= 3;
969 if (scale != 7) {
970 if (++p == q)
971 return NULL;
972 timing->reserved = SPEED_CVT(*p);
973 timing->rsvscale = exponent[scale];
974 } else
975 timing->reserved = 0;
976 p++;
977 return p;
978 }
979
980
981 static u_char *parse_io(u_char *p, u_char *q, cistpl_io_t *io)
982 {
983 int i, j, bsz, lsz;
984
985 if (p == q)
986 return NULL;
987 io->flags = *p;
988
989 if (!(*p & 0x80)) {
990 io->nwin = 1;
991 io->win[0].base = 0;
992 io->win[0].len = (1 << (io->flags & CISTPL_IO_LINES_MASK));
993 return p+1;
994 }
995
996 if (++p == q)
997 return NULL;
998 io->nwin = (*p & 0x0f) + 1;
999 bsz = (*p & 0x30) >> 4;
1000 if (bsz == 3)
1001 bsz++;
1002 lsz = (*p & 0xc0) >> 6;
1003 if (lsz == 3)
1004 lsz++;
1005 p++;
1006
1007 for (i = 0; i < io->nwin; i++) {
1008 io->win[i].base = 0;
1009 io->win[i].len = 1;
1010 for (j = 0; j < bsz; j++, p++) {
1011 if (p == q)
1012 return NULL;
1013 io->win[i].base += *p << (j*8);
1014 }
1015 for (j = 0; j < lsz; j++, p++) {
1016 if (p == q)
1017 return NULL;
1018 io->win[i].len += *p << (j*8);
1019 }
1020 }
1021 return p;
1022 }
1023
1024
1025 static u_char *parse_mem(u_char *p, u_char *q, cistpl_mem_t *mem)
1026 {
1027 int i, j, asz, lsz, has_ha;
1028 u_int len, ca, ha;
1029
1030 if (p == q)
1031 return NULL;
1032
1033 mem->nwin = (*p & 0x07) + 1;
1034 lsz = (*p & 0x18) >> 3;
1035 asz = (*p & 0x60) >> 5;
1036 has_ha = (*p & 0x80);
1037 if (++p == q)
1038 return NULL;
1039
1040 for (i = 0; i < mem->nwin; i++) {
1041 len = ca = ha = 0;
1042 for (j = 0; j < lsz; j++, p++) {
1043 if (p == q)
1044 return NULL;
1045 len += *p << (j*8);
1046 }
1047 for (j = 0; j < asz; j++, p++) {
1048 if (p == q)
1049 return NULL;
1050 ca += *p << (j*8);
1051 }
1052 if (has_ha)
1053 for (j = 0; j < asz; j++, p++) {
1054 if (p == q)
1055 return NULL;
1056 ha += *p << (j*8);
1057 }
1058 mem->win[i].len = len << 8;
1059 mem->win[i].card_addr = ca << 8;
1060 mem->win[i].host_addr = ha << 8;
1061 }
1062 return p;
1063 }
1064
1065
1066 static u_char *parse_irq(u_char *p, u_char *q, cistpl_irq_t *irq)
1067 {
1068 if (p == q)
1069 return NULL;
1070 irq->IRQInfo1 = *p; p++;
1071 if (irq->IRQInfo1 & IRQ_INFO2_VALID) {
1072 if (p+2 > q)
1073 return NULL;
1074 irq->IRQInfo2 = (p[1]<<8) + p[0];
1075 p += 2;
1076 }
1077 return p;
1078 }
1079
1080
1081 static int parse_cftable_entry(tuple_t *tuple,
1082 cistpl_cftable_entry_t *entry)
1083 {
1084 u_char *p, *q, features;
1085
1086 p = tuple->TupleData;
1087 q = p + tuple->TupleDataLen;
1088 entry->index = *p & 0x3f;
1089 entry->flags = 0;
1090 if (*p & 0x40)
1091 entry->flags |= CISTPL_CFTABLE_DEFAULT;
1092 if (*p & 0x80) {
1093 if (++p == q)
1094 return -EINVAL;
1095 if (*p & 0x10)
1096 entry->flags |= CISTPL_CFTABLE_BVDS;
1097 if (*p & 0x20)
1098 entry->flags |= CISTPL_CFTABLE_WP;
1099 if (*p & 0x40)
1100 entry->flags |= CISTPL_CFTABLE_RDYBSY;
1101 if (*p & 0x80)
1102 entry->flags |= CISTPL_CFTABLE_MWAIT;
1103 entry->interface = *p & 0x0f;
1104 } else
1105 entry->interface = 0;
1106
1107 /* Process optional features */
1108 if (++p == q)
1109 return -EINVAL;
1110 features = *p; p++;
1111
1112 /* Power options */
1113 if ((features & 3) > 0) {
1114 p = parse_power(p, q, &entry->vcc);
1115 if (p == NULL)
1116 return -EINVAL;
1117 } else
1118 entry->vcc.present = 0;
1119 if ((features & 3) > 1) {
1120 p = parse_power(p, q, &entry->vpp1);
1121 if (p == NULL)
1122 return -EINVAL;
1123 } else
1124 entry->vpp1.present = 0;
1125 if ((features & 3) > 2) {
1126 p = parse_power(p, q, &entry->vpp2);
1127 if (p == NULL)
1128 return -EINVAL;
1129 } else
1130 entry->vpp2.present = 0;
1131
1132 /* Timing options */
1133 if (features & 0x04) {
1134 p = parse_timing(p, q, &entry->timing);
1135 if (p == NULL)
1136 return -EINVAL;
1137 } else {
1138 entry->timing.wait = 0;
1139 entry->timing.ready = 0;
1140 entry->timing.reserved = 0;
1141 }
1142
1143 /* I/O window options */
1144 if (features & 0x08) {
1145 p = parse_io(p, q, &entry->io);
1146 if (p == NULL)
1147 return -EINVAL;
1148 } else
1149 entry->io.nwin = 0;
1150
1151 /* Interrupt options */
1152 if (features & 0x10) {
1153 p = parse_irq(p, q, &entry->irq);
1154 if (p == NULL)
1155 return -EINVAL;
1156 } else
1157 entry->irq.IRQInfo1 = 0;
1158
1159 switch (features & 0x60) {
1160 case 0x00:
1161 entry->mem.nwin = 0;
1162 break;
1163 case 0x20:
1164 entry->mem.nwin = 1;
1165 entry->mem.win[0].len = get_unaligned_le16(p) << 8;
1166 entry->mem.win[0].card_addr = 0;
1167 entry->mem.win[0].host_addr = 0;
1168 p += 2;
1169 if (p > q)
1170 return -EINVAL;
1171 break;
1172 case 0x40:
1173 entry->mem.nwin = 1;
1174 entry->mem.win[0].len = get_unaligned_le16(p) << 8;
1175 entry->mem.win[0].card_addr = get_unaligned_le16(p + 2) << 8;
1176 entry->mem.win[0].host_addr = 0;
1177 p += 4;
1178 if (p > q)
1179 return -EINVAL;
1180 break;
1181 case 0x60:
1182 p = parse_mem(p, q, &entry->mem);
1183 if (p == NULL)
1184 return -EINVAL;
1185 break;
1186 }
1187
1188 /* Misc features */
1189 if (features & 0x80) {
1190 if (p == q)
1191 return -EINVAL;
1192 entry->flags |= (*p << 8);
1193 while (*p & 0x80)
1194 if (++p == q)
1195 return -EINVAL;
1196 p++;
1197 }
1198
1199 entry->subtuples = q-p;
1200
1201 return 0;
1202 }
1203
1204
1205 static int parse_device_geo(tuple_t *tuple, cistpl_device_geo_t *geo)
1206 {
1207 u_char *p, *q;
1208 int n;
1209
1210 p = (u_char *)tuple->TupleData;
1211 q = p + tuple->TupleDataLen;
1212
1213 for (n = 0; n < CISTPL_MAX_DEVICES; n++) {
1214 if (p > q-6)
1215 break;
1216 geo->geo[n].buswidth = p[0];
1217 geo->geo[n].erase_block = 1 << (p[1]-1);
1218 geo->geo[n].read_block = 1 << (p[2]-1);
1219 geo->geo[n].write_block = 1 << (p[3]-1);
1220 geo->geo[n].partition = 1 << (p[4]-1);
1221 geo->geo[n].interleave = 1 << (p[5]-1);
1222 p += 6;
1223 }
1224 geo->ngeo = n;
1225 return 0;
1226 }
1227
1228
1229 static int parse_vers_2(tuple_t *tuple, cistpl_vers_2_t *v2)
1230 {
1231 u_char *p, *q;
1232
1233 if (tuple->TupleDataLen < 10)
1234 return -EINVAL;
1235
1236 p = tuple->TupleData;
1237 q = p + tuple->TupleDataLen;
1238
1239 v2->vers = p[0];
1240 v2->comply = p[1];
1241 v2->dindex = get_unaligned_le16(p + 2);
1242 v2->vspec8 = p[6];
1243 v2->vspec9 = p[7];
1244 v2->nhdr = p[8];
1245 p += 9;
1246 return parse_strings(p, q, 2, v2->str, &v2->vendor, NULL);
1247 }
1248
1249
1250 static int parse_org(tuple_t *tuple, cistpl_org_t *org)
1251 {
1252 u_char *p, *q;
1253 int i;
1254
1255 p = tuple->TupleData;
1256 q = p + tuple->TupleDataLen;
1257 if (p == q)
1258 return -EINVAL;
1259 org->data_org = *p;
1260 if (++p == q)
1261 return -EINVAL;
1262 for (i = 0; i < 30; i++) {
1263 org->desc[i] = *p;
1264 if (*p == '\0')
1265 break;
1266 if (++p == q)
1267 return -EINVAL;
1268 }
1269 return 0;
1270 }
1271
1272
1273 static int parse_format(tuple_t *tuple, cistpl_format_t *fmt)
1274 {
1275 u_char *p;
1276
1277 if (tuple->TupleDataLen < 10)
1278 return -EINVAL;
1279
1280 p = tuple->TupleData;
1281
1282 fmt->type = p[0];
1283 fmt->edc = p[1];
1284 fmt->offset = get_unaligned_le32(p + 2);
1285 fmt->length = get_unaligned_le32(p + 6);
1286
1287 return 0;
1288 }
1289
1290
1291 int pcmcia_parse_tuple(tuple_t *tuple, cisparse_t *parse)
1292 {
1293 int ret = 0;
1294
1295 if (tuple->TupleDataLen > tuple->TupleDataMax)
1296 return -EINVAL;
1297 switch (tuple->TupleCode) {
1298 case CISTPL_DEVICE:
1299 case CISTPL_DEVICE_A:
1300 ret = parse_device(tuple, &parse->device);
1301 break;
1302 case CISTPL_CHECKSUM:
1303 ret = parse_checksum(tuple, &parse->checksum);
1304 break;
1305 case CISTPL_LONGLINK_A:
1306 case CISTPL_LONGLINK_C:
1307 ret = parse_longlink(tuple, &parse->longlink);
1308 break;
1309 case CISTPL_LONGLINK_MFC:
1310 ret = parse_longlink_mfc(tuple, &parse->longlink_mfc);
1311 break;
1312 case CISTPL_VERS_1:
1313 ret = parse_vers_1(tuple, &parse->version_1);
1314 break;
1315 case CISTPL_ALTSTR:
1316 ret = parse_altstr(tuple, &parse->altstr);
1317 break;
1318 case CISTPL_JEDEC_A:
1319 case CISTPL_JEDEC_C:
1320 ret = parse_jedec(tuple, &parse->jedec);
1321 break;
1322 case CISTPL_MANFID:
1323 ret = parse_manfid(tuple, &parse->manfid);
1324 break;
1325 case CISTPL_FUNCID:
1326 ret = parse_funcid(tuple, &parse->funcid);
1327 break;
1328 case CISTPL_FUNCE:
1329 ret = parse_funce(tuple, &parse->funce);
1330 break;
1331 case CISTPL_CONFIG:
1332 ret = parse_config(tuple, &parse->config);
1333 break;
1334 case CISTPL_CFTABLE_ENTRY:
1335 ret = parse_cftable_entry(tuple, &parse->cftable_entry);
1336 break;
1337 case CISTPL_DEVICE_GEO:
1338 case CISTPL_DEVICE_GEO_A:
1339 ret = parse_device_geo(tuple, &parse->device_geo);
1340 break;
1341 case CISTPL_VERS_2:
1342 ret = parse_vers_2(tuple, &parse->vers_2);
1343 break;
1344 case CISTPL_ORG:
1345 ret = parse_org(tuple, &parse->org);
1346 break;
1347 case CISTPL_FORMAT:
1348 case CISTPL_FORMAT_A:
1349 ret = parse_format(tuple, &parse->format);
1350 break;
1351 case CISTPL_NO_LINK:
1352 case CISTPL_LINKTARGET:
1353 ret = 0;
1354 break;
1355 default:
1356 ret = -EINVAL;
1357 break;
1358 }
1359 if (ret)
1360 pr_debug("parse_tuple failed %d\n", ret);
1361 return ret;
1362 }
1363 EXPORT_SYMBOL(pcmcia_parse_tuple);
1364
1365
1366 /**
1367 * pccard_validate_cis() - check whether card has a sensible CIS
1368 * @s: the struct pcmcia_socket we are to check
1369 * @info: returns the number of tuples in the (valid) CIS, or 0
1370 *
1371 * This tries to determine if a card has a sensible CIS. In @info, it
1372 * returns the number of tuples in the CIS, or 0 if the CIS looks bad. The
1373 * checks include making sure several critical tuples are present and
1374 * valid; seeing if the total number of tuples is reasonable; and
1375 * looking for tuples that use reserved codes.
1376 *
1377 * The function returns 0 on success.
1378 */
1379 int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *info)
1380 {
1381 tuple_t *tuple;
1382 cisparse_t *p;
1383 unsigned int count = 0;
1384 int ret, reserved, dev_ok = 0, ident_ok = 0;
1385
1386 if (!s)
1387 return -EINVAL;
1388
1389 if (s->functions || !(s->state & SOCKET_PRESENT)) {
1390 WARN_ON(1);
1391 return -EINVAL;
1392 }
1393
1394 /* We do not want to validate the CIS cache... */
1395 mutex_lock(&s->ops_mutex);
1396 destroy_cis_cache(s);
1397 mutex_unlock(&s->ops_mutex);
1398
1399 tuple = kmalloc(sizeof(*tuple), GFP_KERNEL);
1400 if (tuple == NULL) {
1401 dev_warn(&s->dev, "no memory to validate CIS\n");
1402 return -ENOMEM;
1403 }
1404 p = kmalloc(sizeof(*p), GFP_KERNEL);
1405 if (p == NULL) {
1406 kfree(tuple);
1407 dev_warn(&s->dev, "no memory to validate CIS\n");
1408 return -ENOMEM;
1409 }
1410
1411 count = reserved = 0;
1412 tuple->DesiredTuple = RETURN_FIRST_TUPLE;
1413 tuple->Attributes = TUPLE_RETURN_COMMON;
1414 ret = pccard_get_first_tuple(s, BIND_FN_ALL, tuple);
1415 if (ret != 0)
1416 goto done;
1417
1418 /* First tuple should be DEVICE; we should really have either that
1419 or a CFTABLE_ENTRY of some sort */
1420 if ((tuple->TupleCode == CISTPL_DEVICE) ||
1421 (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_CFTABLE_ENTRY, p)) ||
1422 (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_CFTABLE_ENTRY_CB, p)))
1423 dev_ok++;
1424
1425 /* All cards should have a MANFID tuple, and/or a VERS_1 or VERS_2
1426 tuple, for card identification. Certain old D-Link and Linksys
1427 cards have only a broken VERS_2 tuple; hence the bogus test. */
1428 if ((pccard_read_tuple(s, BIND_FN_ALL, CISTPL_MANFID, p) == 0) ||
1429 (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_VERS_1, p) == 0) ||
1430 (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_VERS_2, p) != -ENOSPC))
1431 ident_ok++;
1432
1433 if (!dev_ok && !ident_ok)
1434 goto done;
1435
1436 for (count = 1; count < MAX_TUPLES; count++) {
1437 ret = pccard_get_next_tuple(s, BIND_FN_ALL, tuple);
1438 if (ret != 0)
1439 break;
1440 if (((tuple->TupleCode > 0x23) && (tuple->TupleCode < 0x40)) ||
1441 ((tuple->TupleCode > 0x47) && (tuple->TupleCode < 0x80)) ||
1442 ((tuple->TupleCode > 0x90) && (tuple->TupleCode < 0xff)))
1443 reserved++;
1444 }
1445 if ((count == MAX_TUPLES) || (reserved > 5) ||
1446 ((!dev_ok || !ident_ok) && (count > 10)))
1447 count = 0;
1448
1449 ret = 0;
1450
1451 done:
1452 /* invalidate CIS cache on failure */
1453 if (!dev_ok || !ident_ok || !count) {
1454 #if defined(CONFIG_MTD_PCMCIA_ANONYMOUS)
1455 /* Set up as an anonymous card. If we don't have anonymous
1456 memory support then just error the card as there is no
1457 point trying to second guess.
1458
1459 Note: some cards have just a device entry, it may be
1460 worth extending support to cover these in future */
1461 if (!dev_ok || !ident_ok) {
1462 dev_info(&s->dev, "no CIS, assuming an anonymous memory card.\n");
1463 pcmcia_replace_cis(s, "\xFF", 1);
1464 count = 1;
1465 ret = 0;
1466 } else
1467 #endif
1468 {
1469 mutex_lock(&s->ops_mutex);
1470 destroy_cis_cache(s);
1471 mutex_unlock(&s->ops_mutex);
1472 ret = -EIO;
1473 }
1474 }
1475
1476 if (info)
1477 *info = count;
1478 kfree(tuple);
1479 kfree(p);
1480 return ret;
1481 }
1482
1483
1484 #define to_socket(_dev) container_of(_dev, struct pcmcia_socket, dev)
1485
1486 static ssize_t pccard_extract_cis(struct pcmcia_socket *s, char *buf,
1487 loff_t off, size_t count)
1488 {
1489 tuple_t tuple;
1490 int status, i;
1491 loff_t pointer = 0;
1492 ssize_t ret = 0;
1493 u_char *tuplebuffer;
1494 u_char *tempbuffer;
1495
1496 tuplebuffer = kmalloc(sizeof(u_char) * 256, GFP_KERNEL);
1497 if (!tuplebuffer)
1498 return -ENOMEM;
1499
1500 tempbuffer = kmalloc(sizeof(u_char) * 258, GFP_KERNEL);
1501 if (!tempbuffer) {
1502 ret = -ENOMEM;
1503 goto free_tuple;
1504 }
1505
1506 memset(&tuple, 0, sizeof(tuple_t));
1507
1508 tuple.Attributes = TUPLE_RETURN_LINK | TUPLE_RETURN_COMMON;
1509 tuple.DesiredTuple = RETURN_FIRST_TUPLE;
1510 tuple.TupleOffset = 0;
1511
1512 status = pccard_get_first_tuple(s, BIND_FN_ALL, &tuple);
1513 while (!status) {
1514 tuple.TupleData = tuplebuffer;
1515 tuple.TupleDataMax = 255;
1516 memset(tuplebuffer, 0, sizeof(u_char) * 255);
1517
1518 status = pccard_get_tuple_data(s, &tuple);
1519 if (status)
1520 break;
1521
1522 if (off < (pointer + 2 + tuple.TupleDataLen)) {
1523 tempbuffer[0] = tuple.TupleCode & 0xff;
1524 tempbuffer[1] = tuple.TupleLink & 0xff;
1525 for (i = 0; i < tuple.TupleDataLen; i++)
1526 tempbuffer[i + 2] = tuplebuffer[i] & 0xff;
1527
1528 for (i = 0; i < (2 + tuple.TupleDataLen); i++) {
1529 if (((i + pointer) >= off) &&
1530 (i + pointer) < (off + count)) {
1531 buf[ret] = tempbuffer[i];
1532 ret++;
1533 }
1534 }
1535 }
1536
1537 pointer += 2 + tuple.TupleDataLen;
1538
1539 if (pointer >= (off + count))
1540 break;
1541
1542 if (tuple.TupleCode == CISTPL_END)
1543 break;
1544 status = pccard_get_next_tuple(s, BIND_FN_ALL, &tuple);
1545 }
1546
1547 kfree(tempbuffer);
1548 free_tuple:
1549 kfree(tuplebuffer);
1550
1551 return ret;
1552 }
1553
1554
1555 static ssize_t pccard_show_cis(struct file *filp, struct kobject *kobj,
1556 struct bin_attribute *bin_attr,
1557 char *buf, loff_t off, size_t count)
1558 {
1559 unsigned int size = 0x200;
1560
1561 if (off >= size)
1562 count = 0;
1563 else {
1564 struct pcmcia_socket *s;
1565 unsigned int chains = 1;
1566
1567 if (off + count > size)
1568 count = size - off;
1569
1570 s = to_socket(container_of(kobj, struct device, kobj));
1571
1572 if (!(s->state & SOCKET_PRESENT))
1573 return -ENODEV;
1574 if (!s->functions && pccard_validate_cis(s, &chains))
1575 return -EIO;
1576 if (!chains)
1577 return -ENODATA;
1578
1579 count = pccard_extract_cis(s, buf, off, count);
1580 }
1581
1582 return count;
1583 }
1584
1585
1586 static ssize_t pccard_store_cis(struct file *filp, struct kobject *kobj,
1587 struct bin_attribute *bin_attr,
1588 char *buf, loff_t off, size_t count)
1589 {
1590 struct pcmcia_socket *s;
1591 int error;
1592
1593 s = to_socket(container_of(kobj, struct device, kobj));
1594
1595 if (off)
1596 return -EINVAL;
1597
1598 if (count >= CISTPL_MAX_CIS_SIZE)
1599 return -EINVAL;
1600
1601 if (!(s->state & SOCKET_PRESENT))
1602 return -ENODEV;
1603
1604 error = pcmcia_replace_cis(s, buf, count);
1605 if (error)
1606 return -EIO;
1607
1608 pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
1609
1610 return count;
1611 }
1612
1613
1614 struct bin_attribute pccard_cis_attr = {
1615 .attr = { .name = "cis", .mode = S_IRUGO | S_IWUSR },
1616 .size = 0x200,
1617 .read = pccard_show_cis,
1618 .write = pccard_store_cis,
1619 };
This page took 0.087503 seconds and 5 git commands to generate.