2 * cistpl.c -- 16-bit PCMCIA Card Information Structure parser
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.
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.
12 * (C) 1999 David A. Hinds
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>
24 #include <linux/pci.h>
25 #include <linux/ioport.h>
27 #include <asm/byteorder.h>
28 #include <asm/unaligned.h>
30 #include <pcmcia/ss.h>
31 #include <pcmcia/cisreg.h>
32 #include <pcmcia/cistpl.h>
33 #include "cs_internal.h"
35 static const u_char mantissa
[] = {
36 10, 12, 13, 15, 20, 25, 30, 35,
37 40, 45, 50, 55, 60, 70, 80, 90
40 static const u_int exponent
[] = {
41 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000
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])
52 /* Upper limit on reasonable # of tuples */
53 #define MAX_TUPLES 200
55 /* Bits in IRQInfo1 field */
56 #define IRQ_INFO2_VALID 0x10
60 module_param(cis_width
, int, 0444);
62 void release_cis_mem(struct pcmcia_socket
*s
)
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
);
69 release_resource(s
->cis_mem
.res
);
70 kfree(s
->cis_mem
.res
);
71 s
->cis_mem
.res
= NULL
;
76 mutex_unlock(&s
->ops_mutex
);
80 * set_cis_map() - map the card memory at "card_offset" into virtual space.
82 * If flags & MAP_ATTRIB, map the attribute space, otherwise
83 * map the memory space.
85 * Must be called with ops_mutex held.
87 static void __iomem
*set_cis_map(struct pcmcia_socket
*s
,
88 unsigned int card_offset
, unsigned int flags
)
90 pccard_mem_map
*mem
= &s
->cis_mem
;
93 if (!(s
->features
& SS_CAP_STATIC_MAP
) && (mem
->res
== NULL
)) {
94 mem
->res
= pcmcia_find_mem_region(0, s
->map_size
,
96 if (mem
->res
== NULL
) {
97 dev_printk(KERN_NOTICE
, &s
->dev
,
98 "cs: unable to map card memory!\n");
104 if (!(s
->features
& SS_CAP_STATIC_MAP
) && (!s
->cis_virt
))
105 s
->cis_virt
= ioremap(mem
->res
->start
, s
->map_size
);
107 mem
->card_start
= card_offset
;
110 ret
= s
->ops
->set_mem_map(s
, mem
);
112 iounmap(s
->cis_virt
);
117 if (s
->features
& SS_CAP_STATIC_MAP
) {
119 iounmap(s
->cis_virt
);
120 s
->cis_virt
= ioremap(mem
->static_start
, s
->map_size
);
127 /* Bits in attr field */
129 #define IS_INDIRECT 8
132 * pcmcia_read_cis_mem() - low-level function to read CIS memory
134 * must be called with ops_mutex held
136 int pcmcia_read_cis_mem(struct pcmcia_socket
*s
, int attr
, u_int addr
,
137 u_int len
, void *ptr
)
139 void __iomem
*sys
, *end
;
140 unsigned char *buf
= ptr
;
142 dev_dbg(&s
->dev
, "pcmcia_read_cis_mem(%d, %#x, %u)\n", attr
, addr
, len
);
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
) {
150 flags
= ICTRL0_AUTOINC
;
153 sys
= set_cis_map(s
, 0, MAP_ACTIVE
|
154 ((cis_width
) ? MAP_16BIT
: 0));
156 dev_dbg(&s
->dev
, "could not map memory\n");
157 memset(ptr
, 0xff, len
);
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
);
169 u_int inc
= 1, card_offset
, flags
;
171 if (addr
> CISTPL_MAX_CIS_SIZE
) {
173 "attempt to read CIS mem at addr %#x", addr
);
174 memset(ptr
, 0xff, len
);
178 flags
= MAP_ACTIVE
| ((cis_width
) ? MAP_16BIT
: 0);
185 card_offset
= addr
& ~(s
->map_size
-1);
187 sys
= set_cis_map(s
, card_offset
, flags
);
189 dev_dbg(&s
->dev
, "could not map memory\n");
190 memset(ptr
, 0xff, len
);
193 end
= sys
+ s
->map_size
;
194 sys
= sys
+ (addr
& (s
->map_size
-1));
195 for ( ; len
> 0; len
--, buf
++, sys
+= inc
) {
200 card_offset
+= s
->map_size
;
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));
212 * pcmcia_write_cis_mem() - low-level function to write CIS memory
214 * Probably only useful for writing one-byte registers. Must be called
215 * with ops_mutex held.
217 int pcmcia_write_cis_mem(struct pcmcia_socket
*s
, int attr
, u_int addr
,
218 u_int len
, void *ptr
)
220 void __iomem
*sys
, *end
;
221 unsigned char *buf
= ptr
;
224 "pcmcia_write_cis_mem(%d, %#x, %u)\n", attr
, addr
, len
);
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
) {
232 flags
= ICTRL0_AUTOINC
;
235 sys
= set_cis_map(s
, 0, MAP_ACTIVE
|
236 ((cis_width
) ? MAP_16BIT
: 0));
238 dev_dbg(&s
->dev
, "could not map memory\n");
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
);
250 u_int inc
= 1, card_offset
, flags
;
252 flags
= MAP_ACTIVE
| ((cis_width
) ? MAP_16BIT
: 0);
253 if (attr
& IS_ATTR
) {
259 card_offset
= addr
& ~(s
->map_size
-1);
261 sys
= set_cis_map(s
, card_offset
, flags
);
263 dev_dbg(&s
->dev
, "could not map memory\n");
267 end
= sys
+ s
->map_size
;
268 sys
= sys
+ (addr
& (s
->map_size
-1));
269 for ( ; len
> 0; len
--, buf
++, sys
+= inc
) {
274 card_offset
+= s
->map_size
;
283 * read_cis_cache() - read CIS memory or its associated cache
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.
289 static int read_cis_cache(struct pcmcia_socket
*s
, int attr
, u_int addr
,
290 size_t len
, void *ptr
)
292 struct cis_cache_entry
*cis
;
295 if (s
->state
& SOCKET_CARDBUS
)
298 mutex_lock(&s
->ops_mutex
);
300 if (s
->fake_cis_len
>= addr
+len
)
301 memcpy(ptr
, s
->fake_cis
+addr
, len
);
303 memset(ptr
, 0xff, len
);
306 mutex_unlock(&s
->ops_mutex
);
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
);
318 ret
= pcmcia_read_cis_mem(s
, attr
, addr
, len
, ptr
);
321 /* Copy data into the cache */
322 cis
= kmalloc(sizeof(struct cis_cache_entry
) + len
, GFP_KERNEL
);
327 memcpy(cis
->cache
, ptr
, len
);
328 list_add(&cis
->node
, &s
->cis_cache
);
331 mutex_unlock(&s
->ops_mutex
);
337 remove_cis_cache(struct pcmcia_socket
*s
, int attr
, u_int addr
, u_int len
)
339 struct cis_cache_entry
*cis
;
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
);
348 mutex_unlock(&s
->ops_mutex
);
352 * destroy_cis_cache() - destroy the CIS cache
353 * @s: pcmcia_socket for which CIS cache shall be destroyed
355 * This destroys the CIS cache but keeps any fake CIS alive. Must be
356 * called with ops_mutex held.
358 void destroy_cis_cache(struct pcmcia_socket
*s
)
360 struct list_head
*l
, *n
;
361 struct cis_cache_entry
*cis
;
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
);
371 * verify_cis_cache() - does the CIS match what is in the CIS cache?
373 int verify_cis_cache(struct pcmcia_socket
*s
)
375 struct cis_cache_entry
*cis
;
379 if (s
->state
& SOCKET_CARDBUS
)
382 buf
= kmalloc(256, GFP_KERNEL
);
384 dev_printk(KERN_WARNING
, &s
->dev
,
385 "no memory for verifying CIS\n");
388 mutex_lock(&s
->ops_mutex
);
389 list_for_each_entry(cis
, &s
->cis_cache
, node
) {
395 ret
= pcmcia_read_cis_mem(s
, cis
->attr
, cis
->addr
, len
, buf
);
396 if (ret
|| memcmp(buf
, cis
->cache
, len
) != 0) {
398 mutex_unlock(&s
->ops_mutex
);
403 mutex_unlock(&s
->ops_mutex
);
408 * pcmcia_replace_cis() - use a replacement CIS instead of the card's CIS
410 * For really bad cards, we provide a facility for uploading a
413 int pcmcia_replace_cis(struct pcmcia_socket
*s
,
414 const u8
*data
, const size_t len
)
416 if (len
> CISTPL_MAX_CIS_SIZE
) {
417 dev_printk(KERN_WARNING
, &s
->dev
, "replacement CIS too big\n");
420 mutex_lock(&s
->ops_mutex
);
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
);
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
);
435 /* The high-level CIS tuple services */
437 typedef struct tuple_flags
{
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)
449 int pccard_get_first_tuple(struct pcmcia_socket
*s
, unsigned int function
,
455 if (!(s
->state
& SOCKET_PRESENT
) || (s
->state
& SOCKET_CARDBUS
))
457 tuple
->TupleLink
= tuple
->Flags
= 0;
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;
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)
471 tuple
->CISOffset
= tuple
->TupleLink
= 0;
472 tuple
->DesiredTuple
= req
;
474 return pccard_get_next_tuple(s
, function
, tuple
);
477 static int follow_link(struct pcmcia_socket
*s
, tuple_t
*tuple
)
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
);
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;
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
);
507 if ((link
[0] == CISTPL_LINKTARGET
) && (link
[1] >= 3) &&
508 (strncmp(link
+2, "CIS", 3) == 0))
510 remove_cis_cache(s
, SPACE(tuple
->Flags
), ofs
, 5);
511 /* Then, we try the wrong spot... */
514 ret
= read_cis_cache(s
, SPACE(tuple
->Flags
), ofs
, 5, link
);
517 if ((link
[0] == CISTPL_LINKTARGET
) && (link
[1] >= 3) &&
518 (strncmp(link
+2, "CIS", 3) == 0))
520 remove_cis_cache(s
, SPACE(tuple
->Flags
), ofs
, 5);
524 int pccard_get_next_tuple(struct pcmcia_socket
*s
, unsigned int function
,
533 if (!(s
->state
& SOCKET_PRESENT
) || (s
->state
& SOCKET_CARDBUS
))
536 link
[1] = tuple
->TupleLink
;
537 ofs
= tuple
->CISOffset
+ tuple
->TupleLink
;
538 attr
= SPACE(tuple
->Flags
);
540 for (i
= 0; i
< MAX_TUPLES
; i
++) {
542 link
[0] = CISTPL_END
;
544 ret
= read_cis_cache(s
, attr
, ofs
, 2, link
);
547 if (link
[0] == CISTPL_NULL
) {
553 /* End of chain? Follow long link if possible */
554 if (link
[0] == CISTPL_END
) {
555 ofs
= follow_link(s
, tuple
);
558 attr
= SPACE(tuple
->Flags
);
559 ret
= read_cis_cache(s
, attr
, ofs
, 2, link
);
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
)) {
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,
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,
588 case CISTPL_INDIRECT
:
589 HAS_LINK(tuple
->Flags
) = 1;
590 LINK_SPACE(tuple
->Flags
) = IS_ATTR
|
592 tuple
->LinkOffset
= 0;
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,
603 MFC_FN(tuple
->Flags
) = tmp
;
605 /* Follow exactly one of the links */
606 MFC_FN(tuple
->Flags
) = 1;
607 tuple
->LinkOffset
+= function
* 5;
611 HAS_LINK(tuple
->Flags
) = 0;
614 if ((tuple
->Attributes
& TUPLE_RETURN_LINK
) &&
615 (tuple
->DesiredTuple
== RETURN_FIRST_TUPLE
))
618 if (tuple
->DesiredTuple
== RETURN_FIRST_TUPLE
)
621 if (link
[0] == tuple
->DesiredTuple
)
625 if (i
== MAX_TUPLES
) {
626 dev_dbg(&s
->dev
, "cs: overrun in pcmcia_get_next_tuple\n");
630 tuple
->TupleCode
= link
[0];
631 tuple
->TupleLink
= link
[1];
632 tuple
->CISOffset
= ofs
+ 2;
636 int pccard_get_tuple_data(struct pcmcia_socket
*s
, tuple_t
*tuple
)
644 if (tuple
->TupleLink
< tuple
->TupleOffset
)
646 len
= tuple
->TupleLink
- tuple
->TupleOffset
;
647 tuple
->TupleDataLen
= tuple
->TupleLink
;
650 ret
= read_cis_cache(s
, SPACE(tuple
->Flags
),
651 tuple
->CISOffset
+ tuple
->TupleOffset
,
652 min(len
, (u_int
) tuple
->TupleDataMax
),
660 /* Parsing routines for individual tuples */
662 static int parse_device(tuple_t
*tuple
, cistpl_device_t
*device
)
668 p
= (u_char
*)tuple
->TupleData
;
669 q
= p
+ tuple
->TupleDataLen
;
672 for (i
= 0; i
< CISTPL_MAX_DEVICES
; i
++) {
676 device
->dev
[i
].type
= (*p
>> 4);
677 device
->dev
[i
].wp
= (*p
& 0x08) ? 1 : 0;
680 device
->dev
[i
].speed
= 0;
683 device
->dev
[i
].speed
= 250;
686 device
->dev
[i
].speed
= 200;
689 device
->dev
[i
].speed
= 150;
692 device
->dev
[i
].speed
= 100;
697 device
->dev
[i
].speed
= SPEED_CVT(*p
);
713 device
->dev
[i
].size
= ((*p
>> 3) + 1) * (512 << (scale
*2));
723 static int parse_checksum(tuple_t
*tuple
, cistpl_checksum_t
*csum
)
726 if (tuple
->TupleDataLen
< 5)
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);
736 static int parse_longlink(tuple_t
*tuple
, cistpl_longlink_t
*link
)
738 if (tuple
->TupleDataLen
< 4)
740 link
->addr
= get_unaligned_le32(tuple
->TupleData
);
745 static int parse_longlink_mfc(tuple_t
*tuple
, cistpl_longlink_mfc_t
*link
)
750 p
= (u_char
*)tuple
->TupleData
;
753 if (tuple
->TupleDataLen
<= link
->nfn
*5)
755 for (i
= 0; i
< link
->nfn
; i
++) {
756 link
->fn
[i
].space
= *p
; p
++;
757 link
->fn
[i
].addr
= get_unaligned_le32(p
);
764 static int parse_strings(u_char
*p
, u_char
*q
, int max
,
765 char *s
, u_char
*ofs
, u_char
*found
)
772 for (i
= 0; i
< max
; i
++) {
778 s
[j
++] = (*p
== 0xff) ? '\0' : *p
;
779 if ((*p
== '\0') || (*p
== 0xff))
784 if ((*p
== 0xff) || (++p
== q
))
792 return (ns
== max
) ? 0 : -EINVAL
;
796 static int parse_vers_1(tuple_t
*tuple
, cistpl_vers_1_t
*vers_1
)
800 p
= (u_char
*)tuple
->TupleData
;
801 q
= p
+ tuple
->TupleDataLen
;
803 vers_1
->major
= *p
; p
++;
804 vers_1
->minor
= *p
; p
++;
808 return parse_strings(p
, q
, CISTPL_VERS_1_MAX_PROD_STRINGS
,
809 vers_1
->str
, vers_1
->ofs
, &vers_1
->ns
);
813 static int parse_altstr(tuple_t
*tuple
, cistpl_altstr_t
*altstr
)
817 p
= (u_char
*)tuple
->TupleData
;
818 q
= p
+ tuple
->TupleDataLen
;
820 return parse_strings(p
, q
, CISTPL_MAX_ALTSTR_STRINGS
,
821 altstr
->str
, altstr
->ofs
, &altstr
->ns
);
825 static int parse_jedec(tuple_t
*tuple
, cistpl_jedec_t
*jedec
)
830 p
= (u_char
*)tuple
->TupleData
;
831 q
= p
+ tuple
->TupleDataLen
;
833 for (nid
= 0; nid
< CISTPL_MAX_DEVICES
; nid
++) {
836 jedec
->id
[nid
].mfr
= p
[0];
837 jedec
->id
[nid
].info
= p
[1];
845 static int parse_manfid(tuple_t
*tuple
, cistpl_manfid_t
*m
)
847 if (tuple
->TupleDataLen
< 4)
849 m
->manf
= get_unaligned_le16(tuple
->TupleData
);
850 m
->card
= get_unaligned_le16(tuple
->TupleData
+ 2);
855 static int parse_funcid(tuple_t
*tuple
, cistpl_funcid_t
*f
)
858 if (tuple
->TupleDataLen
< 2)
860 p
= (u_char
*)tuple
->TupleData
;
867 static int parse_funce(tuple_t
*tuple
, cistpl_funce_t
*f
)
871 if (tuple
->TupleDataLen
< 1)
873 p
= (u_char
*)tuple
->TupleData
;
875 for (i
= 1; i
< tuple
->TupleDataLen
; i
++)
881 static int parse_config(tuple_t
*tuple
, cistpl_config_t
*config
)
886 p
= (u_char
*)tuple
->TupleData
;
888 rmsz
= (*p
& 0x3c) >> 2;
889 if (tuple
->TupleDataLen
< rasz
+rmsz
+4)
891 config
->last_idx
= *(++p
);
894 for (i
= 0; i
<= rasz
; i
++)
895 config
->base
+= p
[i
] << (8*i
);
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);
905 /* The following routines are all used to parse the nightmarish
906 * config table entries.
909 static u_char
*parse_power(u_char
*p
, u_char
*q
, cistpl_power_t
*pwr
)
919 for (i
= 0; i
< 7; i
++)
920 if (pwr
->present
& (1<<i
)) {
923 pwr
->param
[i
] = POWER_CVT(*p
);
924 scale
= POWER_SCALE(*p
);
928 if ((*p
& 0x7f) < 100)
930 (*p
& 0x7f) * scale
/ 100;
932 pwr
->flags
|= CISTPL_POWER_HIGHZ_OK
;
936 pwr
->flags
|= CISTPL_POWER_HIGHZ_REQ
;
946 static u_char
*parse_timing(u_char
*p
, u_char
*q
, cistpl_timing_t
*timing
)
953 if ((scale
& 3) != 3) {
956 timing
->wait
= SPEED_CVT(*p
);
957 timing
->waitscale
= exponent
[scale
& 3];
961 if ((scale
& 7) != 7) {
964 timing
->ready
= SPEED_CVT(*p
);
965 timing
->rdyscale
= exponent
[scale
& 7];
972 timing
->reserved
= SPEED_CVT(*p
);
973 timing
->rsvscale
= exponent
[scale
];
975 timing
->reserved
= 0;
981 static u_char
*parse_io(u_char
*p
, u_char
*q
, cistpl_io_t
*io
)
992 io
->win
[0].len
= (1 << (io
->flags
& CISTPL_IO_LINES_MASK
));
998 io
->nwin
= (*p
& 0x0f) + 1;
999 bsz
= (*p
& 0x30) >> 4;
1002 lsz
= (*p
& 0xc0) >> 6;
1007 for (i
= 0; i
< io
->nwin
; i
++) {
1008 io
->win
[i
].base
= 0;
1010 for (j
= 0; j
< bsz
; j
++, p
++) {
1013 io
->win
[i
].base
+= *p
<< (j
*8);
1015 for (j
= 0; j
< lsz
; j
++, p
++) {
1018 io
->win
[i
].len
+= *p
<< (j
*8);
1025 static u_char
*parse_mem(u_char
*p
, u_char
*q
, cistpl_mem_t
*mem
)
1027 int i
, j
, asz
, lsz
, has_ha
;
1033 mem
->nwin
= (*p
& 0x07) + 1;
1034 lsz
= (*p
& 0x18) >> 3;
1035 asz
= (*p
& 0x60) >> 5;
1036 has_ha
= (*p
& 0x80);
1040 for (i
= 0; i
< mem
->nwin
; i
++) {
1042 for (j
= 0; j
< lsz
; j
++, p
++) {
1047 for (j
= 0; j
< asz
; j
++, p
++) {
1053 for (j
= 0; j
< asz
; j
++, p
++) {
1058 mem
->win
[i
].len
= len
<< 8;
1059 mem
->win
[i
].card_addr
= ca
<< 8;
1060 mem
->win
[i
].host_addr
= ha
<< 8;
1066 static u_char
*parse_irq(u_char
*p
, u_char
*q
, cistpl_irq_t
*irq
)
1070 irq
->IRQInfo1
= *p
; p
++;
1071 if (irq
->IRQInfo1
& IRQ_INFO2_VALID
) {
1074 irq
->IRQInfo2
= (p
[1]<<8) + p
[0];
1081 static int parse_cftable_entry(tuple_t
*tuple
,
1082 cistpl_cftable_entry_t
*entry
)
1084 u_char
*p
, *q
, features
;
1086 p
= tuple
->TupleData
;
1087 q
= p
+ tuple
->TupleDataLen
;
1088 entry
->index
= *p
& 0x3f;
1091 entry
->flags
|= CISTPL_CFTABLE_DEFAULT
;
1096 entry
->flags
|= CISTPL_CFTABLE_BVDS
;
1098 entry
->flags
|= CISTPL_CFTABLE_WP
;
1100 entry
->flags
|= CISTPL_CFTABLE_RDYBSY
;
1102 entry
->flags
|= CISTPL_CFTABLE_MWAIT
;
1103 entry
->interface
= *p
& 0x0f;
1105 entry
->interface
= 0;
1107 /* Process optional features */
1113 if ((features
& 3) > 0) {
1114 p
= parse_power(p
, q
, &entry
->vcc
);
1118 entry
->vcc
.present
= 0;
1119 if ((features
& 3) > 1) {
1120 p
= parse_power(p
, q
, &entry
->vpp1
);
1124 entry
->vpp1
.present
= 0;
1125 if ((features
& 3) > 2) {
1126 p
= parse_power(p
, q
, &entry
->vpp2
);
1130 entry
->vpp2
.present
= 0;
1132 /* Timing options */
1133 if (features
& 0x04) {
1134 p
= parse_timing(p
, q
, &entry
->timing
);
1138 entry
->timing
.wait
= 0;
1139 entry
->timing
.ready
= 0;
1140 entry
->timing
.reserved
= 0;
1143 /* I/O window options */
1144 if (features
& 0x08) {
1145 p
= parse_io(p
, q
, &entry
->io
);
1151 /* Interrupt options */
1152 if (features
& 0x10) {
1153 p
= parse_irq(p
, q
, &entry
->irq
);
1157 entry
->irq
.IRQInfo1
= 0;
1159 switch (features
& 0x60) {
1161 entry
->mem
.nwin
= 0;
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;
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;
1182 p
= parse_mem(p
, q
, &entry
->mem
);
1189 if (features
& 0x80) {
1192 entry
->flags
|= (*p
<< 8);
1199 entry
->subtuples
= q
-p
;
1205 static int parse_device_geo(tuple_t
*tuple
, cistpl_device_geo_t
*geo
)
1210 p
= (u_char
*)tuple
->TupleData
;
1211 q
= p
+ tuple
->TupleDataLen
;
1213 for (n
= 0; n
< CISTPL_MAX_DEVICES
; n
++) {
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);
1229 static int parse_vers_2(tuple_t
*tuple
, cistpl_vers_2_t
*v2
)
1233 if (tuple
->TupleDataLen
< 10)
1236 p
= tuple
->TupleData
;
1237 q
= p
+ tuple
->TupleDataLen
;
1241 v2
->dindex
= get_unaligned_le16(p
+ 2);
1246 return parse_strings(p
, q
, 2, v2
->str
, &v2
->vendor
, NULL
);
1250 static int parse_org(tuple_t
*tuple
, cistpl_org_t
*org
)
1255 p
= tuple
->TupleData
;
1256 q
= p
+ tuple
->TupleDataLen
;
1262 for (i
= 0; i
< 30; i
++) {
1273 static int parse_format(tuple_t
*tuple
, cistpl_format_t
*fmt
)
1277 if (tuple
->TupleDataLen
< 10)
1280 p
= tuple
->TupleData
;
1284 fmt
->offset
= get_unaligned_le32(p
+ 2);
1285 fmt
->length
= get_unaligned_le32(p
+ 6);
1291 int pcmcia_parse_tuple(tuple_t
*tuple
, cisparse_t
*parse
)
1295 if (tuple
->TupleDataLen
> tuple
->TupleDataMax
)
1297 switch (tuple
->TupleCode
) {
1299 case CISTPL_DEVICE_A
:
1300 ret
= parse_device(tuple
, &parse
->device
);
1302 case CISTPL_CHECKSUM
:
1303 ret
= parse_checksum(tuple
, &parse
->checksum
);
1305 case CISTPL_LONGLINK_A
:
1306 case CISTPL_LONGLINK_C
:
1307 ret
= parse_longlink(tuple
, &parse
->longlink
);
1309 case CISTPL_LONGLINK_MFC
:
1310 ret
= parse_longlink_mfc(tuple
, &parse
->longlink_mfc
);
1313 ret
= parse_vers_1(tuple
, &parse
->version_1
);
1316 ret
= parse_altstr(tuple
, &parse
->altstr
);
1318 case CISTPL_JEDEC_A
:
1319 case CISTPL_JEDEC_C
:
1320 ret
= parse_jedec(tuple
, &parse
->jedec
);
1323 ret
= parse_manfid(tuple
, &parse
->manfid
);
1326 ret
= parse_funcid(tuple
, &parse
->funcid
);
1329 ret
= parse_funce(tuple
, &parse
->funce
);
1332 ret
= parse_config(tuple
, &parse
->config
);
1334 case CISTPL_CFTABLE_ENTRY
:
1335 ret
= parse_cftable_entry(tuple
, &parse
->cftable_entry
);
1337 case CISTPL_DEVICE_GEO
:
1338 case CISTPL_DEVICE_GEO_A
:
1339 ret
= parse_device_geo(tuple
, &parse
->device_geo
);
1342 ret
= parse_vers_2(tuple
, &parse
->vers_2
);
1345 ret
= parse_org(tuple
, &parse
->org
);
1348 case CISTPL_FORMAT_A
:
1349 ret
= parse_format(tuple
, &parse
->format
);
1351 case CISTPL_NO_LINK
:
1352 case CISTPL_LINKTARGET
:
1360 pr_debug("parse_tuple failed %d\n", ret
);
1363 EXPORT_SYMBOL(pcmcia_parse_tuple
);
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
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.
1377 * The function returns 0 on success.
1379 int pccard_validate_cis(struct pcmcia_socket
*s
, unsigned int *info
)
1383 unsigned int count
= 0;
1384 int ret
, reserved
, dev_ok
= 0, ident_ok
= 0;
1389 if (s
->functions
|| !(s
->state
& SOCKET_PRESENT
)) {
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
);
1399 tuple
= kmalloc(sizeof(*tuple
), GFP_KERNEL
);
1400 if (tuple
== NULL
) {
1401 dev_warn(&s
->dev
, "no memory to validate CIS\n");
1404 p
= kmalloc(sizeof(*p
), GFP_KERNEL
);
1407 dev_warn(&s
->dev
, "no memory to validate CIS\n");
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
);
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
)))
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
))
1433 if (!dev_ok
&& !ident_ok
)
1436 for (count
= 1; count
< MAX_TUPLES
; count
++) {
1437 ret
= pccard_get_next_tuple(s
, BIND_FN_ALL
, tuple
);
1440 if (((tuple
->TupleCode
> 0x23) && (tuple
->TupleCode
< 0x40)) ||
1441 ((tuple
->TupleCode
> 0x47) && (tuple
->TupleCode
< 0x80)) ||
1442 ((tuple
->TupleCode
> 0x90) && (tuple
->TupleCode
< 0xff)))
1445 if ((count
== MAX_TUPLES
) || (reserved
> 5) ||
1446 ((!dev_ok
|| !ident_ok
) && (count
> 10)))
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.
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);
1469 mutex_lock(&s
->ops_mutex
);
1470 destroy_cis_cache(s
);
1471 mutex_unlock(&s
->ops_mutex
);
1484 #define to_socket(_dev) container_of(_dev, struct pcmcia_socket, dev)
1486 static ssize_t
pccard_extract_cis(struct pcmcia_socket
*s
, char *buf
,
1487 loff_t off
, size_t count
)
1493 u_char
*tuplebuffer
;
1496 tuplebuffer
= kmalloc(sizeof(u_char
) * 256, GFP_KERNEL
);
1500 tempbuffer
= kmalloc(sizeof(u_char
) * 258, GFP_KERNEL
);
1506 memset(&tuple
, 0, sizeof(tuple_t
));
1508 tuple
.Attributes
= TUPLE_RETURN_LINK
| TUPLE_RETURN_COMMON
;
1509 tuple
.DesiredTuple
= RETURN_FIRST_TUPLE
;
1510 tuple
.TupleOffset
= 0;
1512 status
= pccard_get_first_tuple(s
, BIND_FN_ALL
, &tuple
);
1514 tuple
.TupleData
= tuplebuffer
;
1515 tuple
.TupleDataMax
= 255;
1516 memset(tuplebuffer
, 0, sizeof(u_char
) * 255);
1518 status
= pccard_get_tuple_data(s
, &tuple
);
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;
1528 for (i
= 0; i
< (2 + tuple
.TupleDataLen
); i
++) {
1529 if (((i
+ pointer
) >= off
) &&
1530 (i
+ pointer
) < (off
+ count
)) {
1531 buf
[ret
] = tempbuffer
[i
];
1537 pointer
+= 2 + tuple
.TupleDataLen
;
1539 if (pointer
>= (off
+ count
))
1542 if (tuple
.TupleCode
== CISTPL_END
)
1544 status
= pccard_get_next_tuple(s
, BIND_FN_ALL
, &tuple
);
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
)
1559 unsigned int size
= 0x200;
1564 struct pcmcia_socket
*s
;
1565 unsigned int chains
= 1;
1567 if (off
+ count
> size
)
1570 s
= to_socket(container_of(kobj
, struct device
, kobj
));
1572 if (!(s
->state
& SOCKET_PRESENT
))
1574 if (!s
->functions
&& pccard_validate_cis(s
, &chains
))
1579 count
= pccard_extract_cis(s
, buf
, off
, count
);
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
)
1590 struct pcmcia_socket
*s
;
1593 s
= to_socket(container_of(kobj
, struct device
, kobj
));
1598 if (count
>= CISTPL_MAX_CIS_SIZE
)
1601 if (!(s
->state
& SOCKET_PRESENT
))
1604 error
= pcmcia_replace_cis(s
, buf
, count
);
1608 pcmcia_parse_uevents(s
, PCMCIA_UEVENT_REQUERY
);
1614 struct bin_attribute pccard_cis_attr
= {
1615 .attr
= { .name
= "cis", .mode
= S_IRUGO
| S_IWUSR
},
1617 .read
= pccard_show_cis
,
1618 .write
= pccard_store_cis
,