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