1 /*======================================================================
3 PCMCIA Card Information Structure parser
5 cistpl.c 1.99 2002/10/24 06:11:48
7 The contents of this file are subject to the Mozilla Public
8 License Version 1.1 (the "License"); you may not use this file
9 except in compliance with the License. You may obtain a copy of
10 the License at http://www.mozilla.org/MPL/
12 Software distributed under the License is distributed on an "AS
13 IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14 implied. See the License for the specific language governing
15 rights and limitations under the License.
17 The initial developer of the original code is David A. Hinds
18 <dahinds@users.sourceforge.net>. Portions created by David A. Hinds
19 are Copyright (C) 1999 David A. Hinds. All Rights Reserved.
21 Alternatively, the contents of this file may be used under the
22 terms of the GNU General Public License version 2 (the "GPL"), in
23 which case the provisions of the GPL are applicable instead of the
24 above. If you wish to allow the use of your version of this file
25 only under the terms of the GPL and not to allow others to use
26 your version of this file under the MPL, indicate your decision
27 by deleting the provisions above and replace them with the notice
28 and other provisions required by the GPL. If you do not delete
29 the provisions above, a recipient may use your version of this
30 file under either the MPL or the GPL.
32 ======================================================================*/
34 #define __NO_VERSION__
36 #include <linux/config.h>
37 #include <linux/module.h>
38 #include <linux/kernel.h>
39 #include <linux/string.h>
40 #include <linux/major.h>
41 #include <linux/errno.h>
42 #include <linux/timer.h>
43 #include <linux/slab.h>
45 #include <linux/sched.h>
46 #include <linux/pci.h>
47 #include <linux/ioport.h>
49 #include <asm/byteorder.h>
51 #include <pcmcia/cs_types.h>
52 #include <pcmcia/bus_ops.h>
53 #include <pcmcia/ss.h>
54 #include <pcmcia/cs.h>
55 #include <pcmcia/bulkmem.h>
56 #include <pcmcia/cisreg.h>
57 #include <pcmcia/cistpl.h>
58 #include "cs_internal.h"
60 static const u_char mantissa[] = {
61 10, 12, 13, 15, 20, 25, 30, 35,
62 40, 45, 50, 55, 60, 70, 80, 90
65 static const u_int exponent[] = {
66 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000
69 /* Convert an extended speed byte to a time in nanoseconds */
70 #define SPEED_CVT(v) \
71 (mantissa[(((v)>>3)&15)-1] * exponent[(v)&7] / 10)
72 /* Convert a power byte to a current in 0.1 microamps */
73 #define POWER_CVT(v) \
74 (mantissa[((v)>>3)&15] * exponent[(v)&7] / 10)
75 #define POWER_SCALE(v) (exponent[(v)&7])
77 /* Upper limit on reasonable # of tuples */
78 #define MAX_TUPLES 200
80 /*====================================================================*/
82 /* Parameters that can be set with 'insmod' */
84 #define INT_MODULE_PARM(n, v) static int n = v; MODULE_PARM(n, "i")
86 INT_MODULE_PARM(cis_width, 0); /* 16-bit CIS? */
88 /*======================================================================
90 Low-level functions to read and write CIS memory. I think the
91 write routine is only useful for writing one-byte registers.
93 ======================================================================*/
95 /* Bits in attr field */
99 static int setup_cis_mem(socket_info_t *s);
101 static void set_cis_map(socket_info_t *s, pccard_mem_map *mem)
103 s->ss_entry->set_mem_map(s->sock, mem);
104 if (s->cap.features & SS_CAP_STATIC_MAP) {
106 bus_iounmap(s->cap.bus, s->cis_virt);
107 s->cis_virt = bus_ioremap(s->cap.bus, mem->sys_start,
112 int read_cis_mem(socket_info_t *s, int attr, u_int addr,
113 u_int len, void *ptr)
115 pccard_mem_map *mem = &s->cis_mem;
116 u_char *sys, *buf = ptr;
118 DEBUG(3, "cs: read_cis_mem(%d, %#x, %u)\n", attr, addr, len);
119 if (setup_cis_mem(s) != 0) {
120 memset(ptr, 0xff, len);
123 mem->flags = MAP_ACTIVE | ((cis_width) ? MAP_16BIT : 0);
125 if (attr & IS_INDIRECT) {
126 /* Indirect accesses use a bunch of special registers at fixed
127 locations in common memory */
128 u_char flags = ICTRL0_COMMON|ICTRL0_AUTOINC|ICTRL0_BYTEGRAN;
129 if (attr & IS_ATTR) { addr *= 2; flags = ICTRL0_AUTOINC; }
130 mem->card_start = 0; mem->flags = MAP_ACTIVE;
133 bus_writeb(s->cap.bus, flags, sys+CISREG_ICTRL0);
134 bus_writeb(s->cap.bus, addr & 0xff, sys+CISREG_IADDR0);
135 bus_writeb(s->cap.bus, (addr>>8) & 0xff, sys+CISREG_IADDR1);
136 bus_writeb(s->cap.bus, (addr>>16) & 0xff, sys+CISREG_IADDR2);
137 bus_writeb(s->cap.bus, (addr>>24) & 0xff, sys+CISREG_IADDR3);
138 for ( ; len > 0; len--, buf++)
139 *buf = bus_readb(s->cap.bus, sys+CISREG_IDATA0);
142 if (attr) { mem->flags |= MAP_ATTRIB; inc++; addr *= 2; }
143 mem->card_start = addr & ~(s->cap.map_size-1);
146 sys = s->cis_virt + (addr & (s->cap.map_size-1));
147 for ( ; len > 0; len--, buf++, sys += inc) {
148 if (sys == s->cis_virt+s->cap.map_size) break;
149 *buf = bus_readb(s->cap.bus, sys);
151 mem->card_start += s->cap.map_size;
155 DEBUG(3, "cs: %#2.2x %#2.2x %#2.2x %#2.2x ...\n",
156 *(u_char *)(ptr+0), *(u_char *)(ptr+1),
157 *(u_char *)(ptr+2), *(u_char *)(ptr+3));
161 void write_cis_mem(socket_info_t *s, int attr, u_int addr,
162 u_int len, void *ptr)
164 pccard_mem_map *mem = &s->cis_mem;
165 u_char *sys, *buf = ptr;
167 DEBUG(3, "cs: write_cis_mem(%d, %#x, %u)\n", attr, addr, len);
168 if (setup_cis_mem(s) != 0) return;
169 mem->flags = MAP_ACTIVE | ((cis_width) ? MAP_16BIT : 0);
171 if (attr & IS_INDIRECT) {
172 /* Indirect accesses use a bunch of special registers at fixed
173 locations in common memory */
174 u_char flags = ICTRL0_COMMON|ICTRL0_AUTOINC|ICTRL0_BYTEGRAN;
175 if (attr & IS_ATTR) { addr *= 2; flags = ICTRL0_AUTOINC; }
176 mem->card_start = 0; mem->flags = MAP_ACTIVE;
179 bus_writeb(s->cap.bus, flags, sys+CISREG_ICTRL0);
180 bus_writeb(s->cap.bus, addr & 0xff, sys+CISREG_IADDR0);
181 bus_writeb(s->cap.bus, (addr>>8) & 0xff, sys+CISREG_IADDR1);
182 bus_writeb(s->cap.bus, (addr>>16) & 0xff, sys+CISREG_IADDR2);
183 bus_writeb(s->cap.bus, (addr>>24) & 0xff, sys+CISREG_IADDR3);
184 for ( ; len > 0; len--, buf++)
185 bus_writeb(s->cap.bus, *buf, sys+CISREG_IDATA0);
188 if (attr & IS_ATTR) { mem->flags |= MAP_ATTRIB; inc++; addr *= 2; }
189 mem->card_start = addr & ~(s->cap.map_size-1);
192 sys = s->cis_virt + (addr & (s->cap.map_size-1));
193 for ( ; len > 0; len--, buf++, sys += inc) {
194 if (sys == s->cis_virt+s->cap.map_size) break;
195 bus_writeb(s->cap.bus, *buf, sys);
197 mem->card_start += s->cap.map_size;
203 /*======================================================================
205 This is tricky... when we set up CIS memory, we try to validate
206 the memory window space allocations.
208 ======================================================================*/
210 /* Scratch pointer to the socket we use for validation */
211 static socket_info_t *vs = NULL;
213 /* Validation function for cards with a valid CIS */
214 static int cis_readable(u_long base)
216 cisinfo_t info1, info2;
218 vs->cis_mem.sys_start = base;
219 vs->cis_mem.sys_stop = base+vs->cap.map_size-1;
220 vs->cis_virt = bus_ioremap(vs->cap.bus, base, vs->cap.map_size);
221 ret = pcmcia_validate_cis(vs->clients, &info1);
222 /* invalidate mapping and CIS cache */
223 bus_iounmap(vs->cap.bus, vs->cis_virt); vs->cis_used = 0;
224 if ((ret != 0) || (info1.Chains == 0))
226 vs->cis_mem.sys_start = base+vs->cap.map_size;
227 vs->cis_mem.sys_stop = base+2*vs->cap.map_size-1;
228 vs->cis_virt = bus_ioremap(vs->cap.bus, base+vs->cap.map_size,
230 ret = pcmcia_validate_cis(vs->clients, &info2);
231 bus_iounmap(vs->cap.bus, vs->cis_virt); vs->cis_used = 0;
232 return ((ret == 0) && (info1.Chains == info2.Chains));
235 /* Validation function for simple memory cards */
236 static int checksum(u_long base)
239 vs->cis_mem.sys_start = base;
240 vs->cis_mem.sys_stop = base+vs->cap.map_size-1;
241 vs->cis_virt = bus_ioremap(vs->cap.bus, base, vs->cap.map_size);
242 vs->cis_mem.card_start = 0;
243 vs->cis_mem.flags = MAP_ACTIVE;
244 vs->ss_entry->set_mem_map(vs->sock, &vs->cis_mem);
245 /* Don't bother checking every word... */
247 for (i = 0; i < vs->cap.map_size; i += 44) {
248 d = bus_readl(vs->cap.bus, vs->cis_virt+i);
251 bus_iounmap(vs->cap.bus, vs->cis_virt);
252 return (b == -1) ? -1 : (a>>1);
255 static int checksum_match(u_long base)
257 int a = checksum(base), b = checksum(base+vs->cap.map_size);
258 return ((a == b) && (a >= 0));
261 static int setup_cis_mem(socket_info_t *s)
263 if (!(s->cap.features & SS_CAP_STATIC_MAP) &&
264 (s->cis_mem.sys_start == 0)) {
265 int low = !(s->cap.features & SS_CAP_PAGE_REGS);
267 validate_mem(cis_readable, checksum_match, low, s);
268 s->cis_mem.sys_start = 0;
270 if (find_mem_region(&s->cis_mem.sys_start, s->cap.map_size,
271 s->cap.map_size, low, "card services", s)) {
272 printk(KERN_NOTICE "cs: unable to map card memory!\n");
275 s->cis_mem.sys_stop = s->cis_mem.sys_start+s->cap.map_size-1;
276 s->cis_virt = bus_ioremap(s->cap.bus, s->cis_mem.sys_start,
282 void release_cis_mem(socket_info_t *s)
284 if (s->cis_mem.sys_start != 0) {
285 s->cis_mem.flags &= ~MAP_ACTIVE;
286 s->ss_entry->set_mem_map(s->sock, &s->cis_mem);
287 if (!(s->cap.features & SS_CAP_STATIC_MAP))
288 release_mem_region(s->cis_mem.sys_start, s->cap.map_size);
289 bus_iounmap(s->cap.bus, s->cis_virt);
290 s->cis_mem.sys_start = 0;
295 /*======================================================================
297 This is a wrapper around read_cis_mem, with the same interface,
298 but which caches information, for cards whose CIS may not be
299 readable all the time.
301 ======================================================================*/
303 static void read_cis_cache(socket_info_t *s, int attr, u_int addr,
304 u_int len, void *ptr)
310 if (s->fake_cis_len > addr+len)
311 memcpy(ptr, s->fake_cis+addr, len);
313 memset(ptr, 0xff, len);
316 caddr = s->cis_cache;
317 for (i = 0; i < s->cis_used; i++) {
318 if ((s->cis_table[i].addr == addr) &&
319 (s->cis_table[i].len == len) &&
320 (s->cis_table[i].attr == attr)) break;
321 caddr += s->cis_table[i].len;
323 if (i < s->cis_used) {
324 memcpy(ptr, caddr, len);
327 #ifdef CONFIG_CARDBUS
328 if (s->state & SOCKET_CARDBUS)
329 ret = read_cb_mem(s, 0, attr, addr, len, ptr);
332 ret = read_cis_mem(s, attr, addr, len, ptr);
333 /* Copy data into the cache, if there is room */
334 if ((ret == 0) && (i < MAX_CIS_TABLE) &&
335 (caddr+len < s->cis_cache+MAX_CIS_DATA)) {
336 s->cis_table[i].addr = addr;
337 s->cis_table[i].len = len;
338 s->cis_table[i].attr = attr;
340 memcpy(caddr, ptr, len);
344 /*======================================================================
346 This verifies if the CIS of a card matches what is in the CIS
349 ======================================================================*/
351 int verify_cis_cache(socket_info_t *s)
356 buf = kmalloc(256, GFP_KERNEL);
359 caddr = s->cis_cache;
360 for (i = 0; i < s->cis_used; i++) {
361 #ifdef CONFIG_CARDBUS
362 if (s->state & SOCKET_CARDBUS)
363 read_cb_mem(s, 0, s->cis_table[i].attr, s->cis_table[i].addr,
364 s->cis_table[i].len, buf);
367 read_cis_mem(s, s->cis_table[i].attr, s->cis_table[i].addr,
368 s->cis_table[i].len, buf);
369 if (memcmp(buf, caddr, s->cis_table[i].len) != 0)
371 caddr += s->cis_table[i].len;
374 return (i < s->cis_used);
377 /*======================================================================
379 For really bad cards, we provide a facility for uploading a
382 ======================================================================*/
384 int pcmcia_replace_cis(client_handle_t handle, cisdump_t *cis)
387 if (CHECK_HANDLE(handle))
388 return CS_BAD_HANDLE;
390 if (s->fake_cis != NULL) {
394 if (cis->Length > CISTPL_MAX_CIS_SIZE)
396 s->fake_cis = kmalloc(cis->Length, GFP_KERNEL);
397 if (s->fake_cis == NULL)
398 return CS_OUT_OF_RESOURCE;
399 s->fake_cis_len = cis->Length;
400 memcpy(s->fake_cis, cis->Data, cis->Length);
404 /*======================================================================
406 The high-level CIS tuple services
408 ======================================================================*/
410 typedef struct tuple_flags {
417 #define LINK_SPACE(f) (((tuple_flags *)(&(f)))->link_space)
418 #define HAS_LINK(f) (((tuple_flags *)(&(f)))->has_link)
419 #define MFC_FN(f) (((tuple_flags *)(&(f)))->mfc_fn)
420 #define SPACE(f) (((tuple_flags *)(&(f)))->space)
422 int pcmcia_get_next_tuple(client_handle_t handle, tuple_t *tuple);
424 int pcmcia_get_first_tuple(client_handle_t handle, tuple_t *tuple)
427 if (CHECK_HANDLE(handle))
428 return CS_BAD_HANDLE;
430 if (!(s->state & SOCKET_PRESENT))
432 tuple->TupleLink = tuple->Flags = 0;
433 #ifdef CONFIG_CARDBUS
434 if (s->state & SOCKET_CARDBUS) {
436 pcibios_read_config_dword(s->cap.cb_dev->subordinate->number, 0, 0x28, &ptr);
437 tuple->CISOffset = ptr & ~7;
438 SPACE(tuple->Flags) = (ptr & 7);
442 /* Assume presence of a LONGLINK_C to address 0 */
443 tuple->CISOffset = tuple->LinkOffset = 0;
444 SPACE(tuple->Flags) = HAS_LINK(tuple->Flags) = 1;
446 if (!(s->state & SOCKET_CARDBUS) && (s->functions > 1) &&
447 !(tuple->Attributes & TUPLE_RETURN_COMMON)) {
448 cisdata_t req = tuple->DesiredTuple;
449 tuple->DesiredTuple = CISTPL_LONGLINK_MFC;
450 if (pcmcia_get_next_tuple(handle, tuple) == CS_SUCCESS) {
451 tuple->DesiredTuple = CISTPL_LINKTARGET;
452 if (pcmcia_get_next_tuple(handle, tuple) != CS_SUCCESS)
453 return CS_NO_MORE_ITEMS;
455 tuple->CISOffset = tuple->TupleLink = 0;
456 tuple->DesiredTuple = req;
458 return pcmcia_get_next_tuple(handle, tuple);
461 static int follow_link(socket_info_t *s, tuple_t *tuple)
466 if (MFC_FN(tuple->Flags)) {
467 /* Get indirect link from the MFC tuple */
468 read_cis_cache(s, LINK_SPACE(tuple->Flags),
469 tuple->LinkOffset, 5, link);
470 ofs = le32_to_cpu(*(u_int *)(link+1));
471 SPACE(tuple->Flags) = (link[0] == CISTPL_MFC_ATTR);
472 /* Move to the next indirect link */
473 tuple->LinkOffset += 5;
474 MFC_FN(tuple->Flags)--;
475 } else if (HAS_LINK(tuple->Flags)) {
476 ofs = tuple->LinkOffset;
477 SPACE(tuple->Flags) = LINK_SPACE(tuple->Flags);
478 HAS_LINK(tuple->Flags) = 0;
482 if (!(s->state & SOCKET_CARDBUS) && SPACE(tuple->Flags)) {
483 /* This is ugly, but a common CIS error is to code the long
484 link offset incorrectly, so we check the right spot... */
485 read_cis_cache(s, SPACE(tuple->Flags), ofs, 5, link);
486 if ((link[0] == CISTPL_LINKTARGET) && (link[1] >= 3) &&
487 (strncmp(link+2, "CIS", 3) == 0))
489 /* Then, we try the wrong spot... */
492 read_cis_cache(s, SPACE(tuple->Flags), ofs, 5, link);
493 if ((link[0] != CISTPL_LINKTARGET) || (link[1] < 3) ||
494 (strncmp(link+2, "CIS", 3) != 0))
499 int pcmcia_get_next_tuple(client_handle_t handle, tuple_t *tuple)
505 if (CHECK_HANDLE(handle))
506 return CS_BAD_HANDLE;
508 if (!(s->state & SOCKET_PRESENT))
511 link[1] = tuple->TupleLink;
512 ofs = tuple->CISOffset + tuple->TupleLink;
513 attr = SPACE(tuple->Flags);
515 for (i = 0; i < MAX_TUPLES; i++) {
516 if (link[1] == 0xff) {
517 link[0] = CISTPL_END;
519 read_cis_cache(s, attr, ofs, 2, link);
520 if (link[0] == CISTPL_NULL) {
525 /* End of chain? Follow long link if possible */
526 if (link[0] == CISTPL_END) {
527 if ((ofs = follow_link(s, tuple)) < 0)
528 return CS_NO_MORE_ITEMS;
529 attr = SPACE(tuple->Flags);
530 read_cis_cache(s, attr, ofs, 2, link);
533 /* Is this a link tuple? Make a note of it */
534 if ((link[0] == CISTPL_LONGLINK_A) ||
535 (link[0] == CISTPL_LONGLINK_C) ||
536 (link[0] == CISTPL_LONGLINK_MFC) ||
537 (link[0] == CISTPL_LINKTARGET) ||
538 (link[0] == CISTPL_INDIRECT) ||
539 (link[0] == CISTPL_NO_LINK)) {
541 case CISTPL_LONGLINK_A:
542 HAS_LINK(tuple->Flags) = 1;
543 LINK_SPACE(tuple->Flags) = attr | IS_ATTR;
544 read_cis_cache(s, attr, ofs+2, 4, &tuple->LinkOffset);
546 case CISTPL_LONGLINK_C:
547 HAS_LINK(tuple->Flags) = 1;
548 LINK_SPACE(tuple->Flags) = attr & ~IS_ATTR;
549 read_cis_cache(s, attr, ofs+2, 4, &tuple->LinkOffset);
551 case CISTPL_INDIRECT:
552 HAS_LINK(tuple->Flags) = 1;
553 LINK_SPACE(tuple->Flags) = IS_ATTR | IS_INDIRECT;
554 tuple->LinkOffset = 0;
556 case CISTPL_LONGLINK_MFC:
557 tuple->LinkOffset = ofs + 3;
558 LINK_SPACE(tuple->Flags) = attr;
559 if (handle->Function == BIND_FN_ALL) {
560 /* Follow all the MFC links */
561 read_cis_cache(s, attr, ofs+2, 1, &tmp);
562 MFC_FN(tuple->Flags) = tmp;
564 /* Follow exactly one of the links */
565 MFC_FN(tuple->Flags) = 1;
566 tuple->LinkOffset += handle->Function * 5;
570 HAS_LINK(tuple->Flags) = 0;
573 if ((tuple->Attributes & TUPLE_RETURN_LINK) &&
574 (tuple->DesiredTuple == RETURN_FIRST_TUPLE))
577 if (tuple->DesiredTuple == RETURN_FIRST_TUPLE)
580 if (link[0] == tuple->DesiredTuple)
584 if (i == MAX_TUPLES) {
585 DEBUG(1, "cs: overrun in pcmcia_get_next_tuple for socket %d\n",
587 return CS_NO_MORE_ITEMS;
590 tuple->TupleCode = link[0];
591 tuple->TupleLink = link[1];
592 tuple->CISOffset = ofs + 2;
596 /*====================================================================*/
598 #define _MIN(a, b) (((a) < (b)) ? (a) : (b))
600 int pcmcia_get_tuple_data(client_handle_t handle, tuple_t *tuple)
605 if (CHECK_HANDLE(handle))
606 return CS_BAD_HANDLE;
610 if (tuple->TupleLink < tuple->TupleOffset)
611 return CS_NO_MORE_ITEMS;
612 len = tuple->TupleLink - tuple->TupleOffset;
613 tuple->TupleDataLen = tuple->TupleLink;
616 read_cis_cache(s, SPACE(tuple->Flags),
617 tuple->CISOffset + tuple->TupleOffset,
618 _MIN(len, tuple->TupleDataMax), tuple->TupleData);
622 /*======================================================================
624 Parsing routines for individual tuples
626 ======================================================================*/
628 static int parse_device(tuple_t *tuple, cistpl_device_t *device)
634 p = (u_char *)tuple->TupleData;
635 q = p + tuple->TupleDataLen;
638 for (i = 0; i < CISTPL_MAX_DEVICES; i++) {
640 if (*p == 0xff) break;
641 device->dev[i].type = (*p >> 4);
642 device->dev[i].wp = (*p & 0x08) ? 1 : 0;
644 case 0: device->dev[i].speed = 0; break;
645 case 1: device->dev[i].speed = 250; break;
646 case 2: device->dev[i].speed = 200; break;
647 case 3: device->dev[i].speed = 150; break;
648 case 4: device->dev[i].speed = 100; break;
650 if (++p == q) return CS_BAD_TUPLE;
651 device->dev[i].speed = SPEED_CVT(*p);
653 if (++p == q) return CS_BAD_TUPLE;
659 if (++p == q) return CS_BAD_TUPLE;
660 if (*p == 0xff) break;
662 if (scale == 7) return CS_BAD_TUPLE;
663 device->dev[i].size = ((*p >> 3) + 1) * (512 << (scale*2));
671 /*====================================================================*/
673 static int parse_checksum(tuple_t *tuple, cistpl_checksum_t *csum)
676 if (tuple->TupleDataLen < 5)
678 p = (u_char *)tuple->TupleData;
679 csum->addr = tuple->CISOffset+(short)le16_to_cpu(*(u_short *)p)-2;
680 csum->len = le16_to_cpu(*(u_short *)(p + 2));
685 /*====================================================================*/
687 static int parse_longlink(tuple_t *tuple, cistpl_longlink_t *link)
689 if (tuple->TupleDataLen < 4)
691 link->addr = le32_to_cpu(*(u_int *)tuple->TupleData);
695 /*====================================================================*/
697 static int parse_longlink_mfc(tuple_t *tuple,
698 cistpl_longlink_mfc_t *link)
703 p = (u_char *)tuple->TupleData;
706 if (tuple->TupleDataLen <= link->nfn*5)
708 for (i = 0; i < link->nfn; i++) {
709 link->fn[i].space = *p; p++;
710 link->fn[i].addr = le32_to_cpu(*(u_int *)p); p += 4;
715 /*====================================================================*/
717 static int parse_strings(u_char *p, u_char *q, int max,
718 char *s, u_char *ofs, u_char *found)
722 if (p == q) return CS_BAD_TUPLE;
724 for (i = 0; i < max; i++) {
725 if (*p == 0xff) break;
729 s[j++] = (*p == 0xff) ? '\0' : *p;
730 if ((*p == '\0') || (*p == 0xff)) break;
731 if (++p == q) return CS_BAD_TUPLE;
733 if ((*p == 0xff) || (++p == q)) break;
739 return (ns == max) ? CS_SUCCESS : CS_BAD_TUPLE;
743 /*====================================================================*/
745 static int parse_vers_1(tuple_t *tuple, cistpl_vers_1_t *vers_1)
749 p = (u_char *)tuple->TupleData;
750 q = p + tuple->TupleDataLen;
752 vers_1->major = *p; p++;
753 vers_1->minor = *p; p++;
754 if (p >= q) return CS_BAD_TUPLE;
756 return parse_strings(p, q, CISTPL_VERS_1_MAX_PROD_STRINGS,
757 vers_1->str, vers_1->ofs, &vers_1->ns);
760 /*====================================================================*/
762 static int parse_altstr(tuple_t *tuple, cistpl_altstr_t *altstr)
766 p = (u_char *)tuple->TupleData;
767 q = p + tuple->TupleDataLen;
769 return parse_strings(p, q, CISTPL_MAX_ALTSTR_STRINGS,
770 altstr->str, altstr->ofs, &altstr->ns);
773 /*====================================================================*/
775 static int parse_jedec(tuple_t *tuple, cistpl_jedec_t *jedec)
780 p = (u_char *)tuple->TupleData;
781 q = p + tuple->TupleDataLen;
783 for (nid = 0; nid < CISTPL_MAX_DEVICES; nid++) {
785 jedec->id[nid].mfr = p[0];
786 jedec->id[nid].info = p[1];
793 /*====================================================================*/
795 static int parse_manfid(tuple_t *tuple, cistpl_manfid_t *m)
798 if (tuple->TupleDataLen < 4)
800 p = (u_short *)tuple->TupleData;
801 m->manf = le16_to_cpu(p[0]);
802 m->card = le16_to_cpu(p[1]);
806 /*====================================================================*/
808 static int parse_funcid(tuple_t *tuple, cistpl_funcid_t *f)
811 if (tuple->TupleDataLen < 2)
813 p = (u_char *)tuple->TupleData;
819 /*====================================================================*/
821 static int parse_funce(tuple_t *tuple, cistpl_funce_t *f)
825 if (tuple->TupleDataLen < 1)
827 p = (u_char *)tuple->TupleData;
829 for (i = 1; i < tuple->TupleDataLen; i++)
834 /*====================================================================*/
836 static int parse_config(tuple_t *tuple, cistpl_config_t *config)
841 p = (u_char *)tuple->TupleData;
843 rmsz = (*p & 0x3c) >> 2;
844 if (tuple->TupleDataLen < rasz+rmsz+4)
846 config->last_idx = *(++p);
849 for (i = 0; i <= rasz; i++)
850 config->base += p[i] << (8*i);
852 for (i = 0; i < 4; i++)
853 config->rmask[i] = 0;
854 for (i = 0; i <= rmsz; i++)
855 config->rmask[i>>2] += p[i] << (8*(i%4));
856 config->subtuples = tuple->TupleDataLen - (rasz+rmsz+4);
860 /*======================================================================
862 The following routines are all used to parse the nightmarish
863 config table entries.
865 ======================================================================*/
867 static u_char *parse_power(u_char *p, u_char *q,
873 if (p == q) return NULL;
877 for (i = 0; i < 7; i++)
878 if (pwr->present & (1<<i)) {
879 if (p == q) return NULL;
880 pwr->param[i] = POWER_CVT(*p);
881 scale = POWER_SCALE(*p);
883 if (++p == q) return NULL;
884 if ((*p & 0x7f) < 100)
885 pwr->param[i] += (*p & 0x7f) * scale / 100;
887 pwr->flags |= CISTPL_POWER_HIGHZ_OK;
891 pwr->flags |= CISTPL_POWER_HIGHZ_REQ;
900 /*====================================================================*/
902 static u_char *parse_timing(u_char *p, u_char *q,
903 cistpl_timing_t *timing)
907 if (p == q) return NULL;
909 if ((scale & 3) != 3) {
910 if (++p == q) return NULL;
911 timing->wait = SPEED_CVT(*p);
912 timing->waitscale = exponent[scale & 3];
916 if ((scale & 7) != 7) {
917 if (++p == q) return NULL;
918 timing->ready = SPEED_CVT(*p);
919 timing->rdyscale = exponent[scale & 7];
924 if (++p == q) return NULL;
925 timing->reserved = SPEED_CVT(*p);
926 timing->rsvscale = exponent[scale];
928 timing->reserved = 0;
933 /*====================================================================*/
935 static u_char *parse_io(u_char *p, u_char *q, cistpl_io_t *io)
939 if (p == q) return NULL;
945 io->win[0].len = (1 << (io->flags & CISTPL_IO_LINES_MASK));
949 if (++p == q) return NULL;
950 io->nwin = (*p & 0x0f) + 1;
951 bsz = (*p & 0x30) >> 4;
953 lsz = (*p & 0xc0) >> 6;
957 for (i = 0; i < io->nwin; i++) {
960 for (j = 0; j < bsz; j++, p++) {
961 if (p == q) return NULL;
962 io->win[i].base += *p << (j*8);
964 for (j = 0; j < lsz; j++, p++) {
965 if (p == q) return NULL;
966 io->win[i].len += *p << (j*8);
972 /*====================================================================*/
974 static u_char *parse_mem(u_char *p, u_char *q, cistpl_mem_t *mem)
976 int i, j, asz, lsz, has_ha;
979 if (p == q) return NULL;
981 mem->nwin = (*p & 0x07) + 1;
982 lsz = (*p & 0x18) >> 3;
983 asz = (*p & 0x60) >> 5;
984 has_ha = (*p & 0x80);
985 if (++p == q) return NULL;
987 for (i = 0; i < mem->nwin; i++) {
989 for (j = 0; j < lsz; j++, p++) {
990 if (p == q) return NULL;
993 for (j = 0; j < asz; j++, p++) {
994 if (p == q) return NULL;
998 for (j = 0; j < asz; j++, p++) {
999 if (p == q) return NULL;
1002 mem->win[i].len = len << 8;
1003 mem->win[i].card_addr = ca << 8;
1004 mem->win[i].host_addr = ha << 8;
1009 /*====================================================================*/
1011 static u_char *parse_irq(u_char *p, u_char *q, cistpl_irq_t *irq)
1013 if (p == q) return NULL;
1014 irq->IRQInfo1 = *p; p++;
1015 if (irq->IRQInfo1 & IRQ_INFO2_VALID) {
1016 if (p+2 > q) return NULL;
1017 irq->IRQInfo2 = (p[1]<<8) + p[0];
1023 /*====================================================================*/
1025 static int parse_cftable_entry(tuple_t *tuple,
1026 cistpl_cftable_entry_t *entry)
1028 u_char *p, *q, features;
1030 p = tuple->TupleData;
1031 q = p + tuple->TupleDataLen;
1032 entry->index = *p & 0x3f;
1035 entry->flags |= CISTPL_CFTABLE_DEFAULT;
1037 if (++p == q) return CS_BAD_TUPLE;
1039 entry->flags |= CISTPL_CFTABLE_BVDS;
1041 entry->flags |= CISTPL_CFTABLE_WP;
1043 entry->flags |= CISTPL_CFTABLE_RDYBSY;
1045 entry->flags |= CISTPL_CFTABLE_MWAIT;
1046 entry->interface = *p & 0x0f;
1048 entry->interface = 0;
1050 /* Process optional features */
1051 if (++p == q) return CS_BAD_TUPLE;
1055 if ((features & 3) > 0) {
1056 p = parse_power(p, q, &entry->vcc);
1057 if (p == NULL) return CS_BAD_TUPLE;
1059 entry->vcc.present = 0;
1060 if ((features & 3) > 1) {
1061 p = parse_power(p, q, &entry->vpp1);
1062 if (p == NULL) return CS_BAD_TUPLE;
1064 entry->vpp1.present = 0;
1065 if ((features & 3) > 2) {
1066 p = parse_power(p, q, &entry->vpp2);
1067 if (p == NULL) return CS_BAD_TUPLE;
1069 entry->vpp2.present = 0;
1071 /* Timing options */
1072 if (features & 0x04) {
1073 p = parse_timing(p, q, &entry->timing);
1074 if (p == NULL) return CS_BAD_TUPLE;
1076 entry->timing.wait = 0;
1077 entry->timing.ready = 0;
1078 entry->timing.reserved = 0;
1081 /* I/O window options */
1082 if (features & 0x08) {
1083 p = parse_io(p, q, &entry->io);
1084 if (p == NULL) return CS_BAD_TUPLE;
1088 /* Interrupt options */
1089 if (features & 0x10) {
1090 p = parse_irq(p, q, &entry->irq);
1091 if (p == NULL) return CS_BAD_TUPLE;
1093 entry->irq.IRQInfo1 = 0;
1095 switch (features & 0x60) {
1097 entry->mem.nwin = 0;
1100 entry->mem.nwin = 1;
1101 entry->mem.win[0].len = le16_to_cpu(*(u_short *)p) << 8;
1102 entry->mem.win[0].card_addr = 0;
1103 entry->mem.win[0].host_addr = 0;
1105 if (p > q) return CS_BAD_TUPLE;
1108 entry->mem.nwin = 1;
1109 entry->mem.win[0].len = le16_to_cpu(*(u_short *)p) << 8;
1110 entry->mem.win[0].card_addr =
1111 le16_to_cpu(*(u_short *)(p+2)) << 8;
1112 entry->mem.win[0].host_addr = 0;
1114 if (p > q) return CS_BAD_TUPLE;
1117 p = parse_mem(p, q, &entry->mem);
1118 if (p == NULL) return CS_BAD_TUPLE;
1123 if (features & 0x80) {
1124 if (p == q) return CS_BAD_TUPLE;
1125 entry->flags |= (*p << 8);
1127 if (++p == q) return CS_BAD_TUPLE;
1131 entry->subtuples = q-p;
1136 /*====================================================================*/
1138 #ifdef CONFIG_CARDBUS
1140 static int parse_bar(tuple_t *tuple, cistpl_bar_t *bar)
1143 if (tuple->TupleDataLen < 6)
1144 return CS_BAD_TUPLE;
1145 p = (u_char *)tuple->TupleData;
1148 bar->size = le32_to_cpu(*(u_int *)p);
1152 static int parse_config_cb(tuple_t *tuple, cistpl_config_t *config)
1156 p = (u_char *)tuple->TupleData;
1157 if ((*p != 3) || (tuple->TupleDataLen < 6))
1158 return CS_BAD_TUPLE;
1159 config->last_idx = *(++p);
1161 config->base = le32_to_cpu(*(u_int *)p);
1162 config->subtuples = tuple->TupleDataLen - 6;
1166 static int parse_cftable_entry_cb(tuple_t *tuple,
1167 cistpl_cftable_entry_cb_t *entry)
1169 u_char *p, *q, features;
1171 p = tuple->TupleData;
1172 q = p + tuple->TupleDataLen;
1173 entry->index = *p & 0x3f;
1176 entry->flags |= CISTPL_CFTABLE_DEFAULT;
1178 /* Process optional features */
1179 if (++p == q) return CS_BAD_TUPLE;
1183 if ((features & 3) > 0) {
1184 p = parse_power(p, q, &entry->vcc);
1185 if (p == NULL) return CS_BAD_TUPLE;
1187 entry->vcc.present = 0;
1188 if ((features & 3) > 1) {
1189 p = parse_power(p, q, &entry->vpp1);
1190 if (p == NULL) return CS_BAD_TUPLE;
1192 entry->vpp1.present = 0;
1193 if ((features & 3) > 2) {
1194 p = parse_power(p, q, &entry->vpp2);
1195 if (p == NULL) return CS_BAD_TUPLE;
1197 entry->vpp2.present = 0;
1199 /* I/O window options */
1200 if (features & 0x08) {
1201 if (p == q) return CS_BAD_TUPLE;
1202 entry->io = *p; p++;
1206 /* Interrupt options */
1207 if (features & 0x10) {
1208 p = parse_irq(p, q, &entry->irq);
1209 if (p == NULL) return CS_BAD_TUPLE;
1211 entry->irq.IRQInfo1 = 0;
1213 if (features & 0x20) {
1214 if (p == q) return CS_BAD_TUPLE;
1215 entry->mem = *p; p++;
1220 if (features & 0x80) {
1221 if (p == q) return CS_BAD_TUPLE;
1222 entry->flags |= (*p << 8);
1224 if (++p == q) return CS_BAD_TUPLE;
1225 entry->flags |= (*p << 16);
1228 if (++p == q) return CS_BAD_TUPLE;
1232 entry->subtuples = q-p;
1239 /*====================================================================*/
1241 static int parse_device_geo(tuple_t *tuple, cistpl_device_geo_t *geo)
1246 p = (u_char *)tuple->TupleData;
1247 q = p + tuple->TupleDataLen;
1249 for (n = 0; n < CISTPL_MAX_DEVICES; n++) {
1251 geo->geo[n].buswidth = p[0];
1252 geo->geo[n].erase_block = 1 << (p[1]-1);
1253 geo->geo[n].read_block = 1 << (p[2]-1);
1254 geo->geo[n].write_block = 1 << (p[3]-1);
1255 geo->geo[n].partition = 1 << (p[4]-1);
1256 geo->geo[n].interleave = 1 << (p[5]-1);
1263 /*====================================================================*/
1265 static int parse_vers_2(tuple_t *tuple, cistpl_vers_2_t *v2)
1269 if (tuple->TupleDataLen < 10)
1270 return CS_BAD_TUPLE;
1272 p = tuple->TupleData;
1273 q = p + tuple->TupleDataLen;
1277 v2->dindex = le16_to_cpu(*(u_short *)(p+2));
1282 return parse_strings(p, q, 2, v2->str, &v2->vendor, NULL);
1285 /*====================================================================*/
1287 static int parse_org(tuple_t *tuple, cistpl_org_t *org)
1292 p = tuple->TupleData;
1293 q = p + tuple->TupleDataLen;
1294 if (p == q) return CS_BAD_TUPLE;
1296 if (++p == q) return CS_BAD_TUPLE;
1297 for (i = 0; i < 30; i++) {
1299 if (*p == '\0') break;
1300 if (++p == q) return CS_BAD_TUPLE;
1305 /*====================================================================*/
1307 static int parse_format(tuple_t *tuple, cistpl_format_t *fmt)
1311 if (tuple->TupleDataLen < 10)
1312 return CS_BAD_TUPLE;
1314 p = tuple->TupleData;
1318 fmt->offset = le32_to_cpu(*(u_int *)(p+2));
1319 fmt->length = le32_to_cpu(*(u_int *)(p+6));
1324 /*====================================================================*/
1326 int pcmcia_parse_tuple(client_handle_t handle, tuple_t *tuple, cisparse_t *parse)
1328 int ret = CS_SUCCESS;
1330 if (tuple->TupleDataLen > tuple->TupleDataMax)
1331 return CS_BAD_TUPLE;
1332 switch (tuple->TupleCode) {
1334 case CISTPL_DEVICE_A:
1335 ret = parse_device(tuple, &parse->device);
1337 #ifdef CONFIG_CARDBUS
1339 ret = parse_bar(tuple, &parse->bar);
1341 case CISTPL_CONFIG_CB:
1342 ret = parse_config_cb(tuple, &parse->config);
1344 case CISTPL_CFTABLE_ENTRY_CB:
1345 ret = parse_cftable_entry_cb(tuple, &parse->cftable_entry_cb);
1348 case CISTPL_CHECKSUM:
1349 ret = parse_checksum(tuple, &parse->checksum);
1351 case CISTPL_LONGLINK_A:
1352 case CISTPL_LONGLINK_C:
1353 ret = parse_longlink(tuple, &parse->longlink);
1355 case CISTPL_LONGLINK_MFC:
1356 ret = parse_longlink_mfc(tuple, &parse->longlink_mfc);
1359 ret = parse_vers_1(tuple, &parse->version_1);
1362 ret = parse_altstr(tuple, &parse->altstr);
1364 case CISTPL_JEDEC_A:
1365 case CISTPL_JEDEC_C:
1366 ret = parse_jedec(tuple, &parse->jedec);
1369 ret = parse_manfid(tuple, &parse->manfid);
1372 ret = parse_funcid(tuple, &parse->funcid);
1375 ret = parse_funce(tuple, &parse->funce);
1378 ret = parse_config(tuple, &parse->config);
1380 case CISTPL_CFTABLE_ENTRY:
1381 ret = parse_cftable_entry(tuple, &parse->cftable_entry);
1383 case CISTPL_DEVICE_GEO:
1384 case CISTPL_DEVICE_GEO_A:
1385 ret = parse_device_geo(tuple, &parse->device_geo);
1388 ret = parse_vers_2(tuple, &parse->vers_2);
1391 ret = parse_org(tuple, &parse->org);
1394 case CISTPL_FORMAT_A:
1395 ret = parse_format(tuple, &parse->format);
1397 case CISTPL_NO_LINK:
1398 case CISTPL_LINKTARGET:
1402 ret = CS_UNSUPPORTED_FUNCTION;
1408 /*======================================================================
1410 This is used internally by Card Services to look up CIS stuff.
1412 ======================================================================*/
1414 int read_tuple(client_handle_t handle, cisdata_t code, void *parse)
1420 buf = kmalloc(256, GFP_KERNEL);
1422 return CS_OUT_OF_RESOURCE;
1423 tuple = kmalloc(sizeof(*tuple), GFP_KERNEL);
1424 if (tuple == NULL) {
1426 return CS_OUT_OF_RESOURCE;
1428 tuple->DesiredTuple = code;
1429 tuple->Attributes = TUPLE_RETURN_COMMON;
1430 ret = pcmcia_get_first_tuple(handle, tuple);
1431 if (ret != CS_SUCCESS) goto done;
1432 tuple->TupleData = buf;
1433 tuple->TupleOffset = 0;
1434 tuple->TupleDataMax = 255;
1435 ret = pcmcia_get_tuple_data(handle, tuple);
1436 if (ret != CS_SUCCESS) goto done;
1437 ret = pcmcia_parse_tuple(handle, tuple, parse);
1444 /*======================================================================
1446 This tries to determine if a card has a sensible CIS. It returns
1447 the number of tuples in the CIS, or 0 if the CIS looks bad. The
1448 checks include making sure several critical tuples are present and
1449 valid; seeing if the total number of tuples is reasonable; and
1450 looking for tuples that use reserved codes.
1452 ======================================================================*/
1454 int pcmcia_validate_cis(client_handle_t handle, cisinfo_t *info)
1458 int ret, reserved, dev_ok = 0, ident_ok = 0;
1460 if (CHECK_HANDLE(handle))
1461 return CS_BAD_HANDLE;
1462 tuple = kmalloc(sizeof(*tuple), GFP_KERNEL);
1464 return CS_OUT_OF_RESOURCE;
1465 p = kmalloc(sizeof(*p), GFP_KERNEL);
1468 return CS_OUT_OF_RESOURCE;
1471 info->Chains = reserved = 0;
1472 tuple->DesiredTuple = RETURN_FIRST_TUPLE;
1473 tuple->Attributes = TUPLE_RETURN_COMMON;
1474 ret = pcmcia_get_first_tuple(handle, tuple);
1475 if (ret != CS_SUCCESS)
1478 /* First tuple should be DEVICE; we should really have either that
1479 or a CFTABLE_ENTRY of some sort */
1480 if ((tuple->TupleCode == CISTPL_DEVICE) ||
1481 (read_tuple(handle, CISTPL_CFTABLE_ENTRY, p) == CS_SUCCESS) ||
1482 (read_tuple(handle, CISTPL_CFTABLE_ENTRY_CB, p) == CS_SUCCESS))
1485 /* All cards should have a MANFID tuple, and/or a VERS_1 or VERS_2
1486 tuple, for card identification. Certain old D-Link and Linksys
1487 cards have only a broken VERS_2 tuple; hence the bogus test. */
1488 if ((read_tuple(handle, CISTPL_MANFID, p) == CS_SUCCESS) ||
1489 (read_tuple(handle, CISTPL_VERS_1, p) == CS_SUCCESS) ||
1490 (read_tuple(handle, CISTPL_VERS_2, p) != CS_NO_MORE_ITEMS))
1493 if (!dev_ok && !ident_ok)
1496 for (info->Chains = 1; info->Chains < MAX_TUPLES; info->Chains++) {
1497 ret = pcmcia_get_next_tuple(handle, tuple);
1498 if (ret != CS_SUCCESS) break;
1499 if (((tuple->TupleCode > 0x23) && (tuple->TupleCode < 0x40)) ||
1500 ((tuple->TupleCode > 0x47) && (tuple->TupleCode < 0x80)) ||
1501 ((tuple->TupleCode > 0x90) && (tuple->TupleCode < 0xff)))
1504 if ((info->Chains == MAX_TUPLES) || (reserved > 5) ||
1505 ((!dev_ok || !ident_ok) && (info->Chains > 10)))