CS_BAD_TUPLE was used to denote a bad tuple being passed to the parse
function. Therefore, replace it with -EINVAL and a verbose message.

Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
---

Index: wireless-testing/drivers/pcmcia/cistpl.c
===================================================================
--- wireless-testing.orig/drivers/pcmcia/cistpl.c	2008-08-20 11:02:45.000000000 -0500
+++ wireless-testing/drivers/pcmcia/cistpl.c	2008-08-20 12:45:24.000000000 -0500
@@ -647,19 +647,19 @@
 	case 3: device->dev[i].speed = 150; break;
 	case 4: device->dev[i].speed = 100; break;
 	case 7:
-	    if (++p == q) return CS_BAD_TUPLE;
+	    if (++p == q) return -EINVAL;
 	    device->dev[i].speed = SPEED_CVT(*p);
 	    while (*p & 0x80)
-		if (++p == q) return CS_BAD_TUPLE;
+		if (++p == q) return -EINVAL;
 	    break;
 	default:
-	    return CS_BAD_TUPLE;
+	    return -EINVAL;
 	}
 
-	if (++p == q) return CS_BAD_TUPLE;
+	if (++p == q) return -EINVAL;
 	if (*p == 0xff) break;
 	scale = *p & 7;
-	if (scale == 7) return CS_BAD_TUPLE;
+	if (scale == 7) return -EINVAL;
 	device->dev[i].size = ((*p >> 3) + 1) * (512 << (scale*2));
 	device->ndev++;
 	if (++p == q) break;
@@ -674,7 +674,7 @@
 {
     u_char *p;
     if (tuple->TupleDataLen < 5)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     p = (u_char *) tuple->TupleData;
     csum->addr = tuple->CISOffset + get_unaligned_le16(p) - 2;
     csum->len = get_unaligned_le16(p + 2);
@@ -687,7 +687,7 @@
 static int parse_longlink(tuple_t *tuple, cistpl_longlink_t *link)
 {
     if (tuple->TupleDataLen < 4)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     link->addr = get_unaligned_le32(tuple->TupleData);
     return 0;
 }
@@ -704,7 +704,7 @@
     
     link->nfn = *p; p++;
     if (tuple->TupleDataLen <= link->nfn*5)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     for (i = 0; i < link->nfn; i++) {
 	link->fn[i].space = *p; p++;
 	link->fn[i].addr = get_unaligned_le32(p);
@@ -720,7 +720,7 @@
 {
     int i, j, ns;
 
-    if (p == q) return CS_BAD_TUPLE;
+    if (p == q) return -EINVAL;
     ns = 0; j = 0;
     for (i = 0; i < max; i++) {
 	if (*p == 0xff) break;
@@ -729,7 +729,7 @@
 	for (;;) {
 	    s[j++] = (*p == 0xff) ? '\0' : *p;
 	    if ((*p == '\0') || (*p == 0xff)) break;
-	    if (++p == q) return CS_BAD_TUPLE;
+	    if (++p == q) return -EINVAL;
 	}
 	if ((*p == 0xff) || (++p == q)) break;
     }
@@ -737,7 +737,7 @@
 	*found = ns;
 	return 0;
     } else {
-	return (ns == max) ? 0 : CS_BAD_TUPLE;
+	return (ns == max) ? 0 : -EINVAL;
     }
 }
 
@@ -752,7 +752,7 @@
     
     vers_1->major = *p; p++;
     vers_1->minor = *p; p++;
-    if (p >= q) return CS_BAD_TUPLE;
+    if (p >= q) return -EINVAL;
 
     return parse_strings(p, q, CISTPL_VERS_1_MAX_PROD_STRINGS,
 			 vers_1->str, vers_1->ofs, &vers_1->ns);
@@ -796,7 +796,7 @@
 static int parse_manfid(tuple_t *tuple, cistpl_manfid_t *m)
 {
     if (tuple->TupleDataLen < 4)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     m->manf = get_unaligned_le16(tuple->TupleData);
     m->card = get_unaligned_le16(tuple->TupleData + 2);
     return 0;
@@ -808,7 +808,7 @@
 {
     u_char *p;
     if (tuple->TupleDataLen < 2)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     p = (u_char *)tuple->TupleData;
     f->func = p[0];
     f->sysinit = p[1];
@@ -822,7 +822,7 @@
     u_char *p;
     int i;
     if (tuple->TupleDataLen < 1)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     p = (u_char *)tuple->TupleData;
     f->type = p[0];
     for (i = 1; i < tuple->TupleDataLen; i++)
@@ -841,7 +841,7 @@
     rasz = *p & 0x03;
     rmsz = (*p & 0x3c) >> 2;
     if (tuple->TupleDataLen < rasz+rmsz+4)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     config->last_idx = *(++p);
     p++;
     config->base = 0;
@@ -1033,7 +1033,7 @@
     if (*p & 0x40)
 	entry->flags |= CISTPL_CFTABLE_DEFAULT;
     if (*p & 0x80) {
-	if (++p == q) return CS_BAD_TUPLE;
+	if (++p == q) return -EINVAL;
 	if (*p & 0x10)
 	    entry->flags |= CISTPL_CFTABLE_BVDS;
 	if (*p & 0x20)
@@ -1047,30 +1047,30 @@
 	entry->interface = 0;
 
     /* Process optional features */
-    if (++p == q) return CS_BAD_TUPLE;
+    if (++p == q) return -EINVAL;
     features = *p; p++;
 
     /* Power options */
     if ((features & 3) > 0) {
 	p = parse_power(p, q, &entry->vcc);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else
 	entry->vcc.present = 0;
     if ((features & 3) > 1) {
 	p = parse_power(p, q, &entry->vpp1);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else
 	entry->vpp1.present = 0;
     if ((features & 3) > 2) {
 	p = parse_power(p, q, &entry->vpp2);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else
 	entry->vpp2.present = 0;
 
     /* Timing options */
     if (features & 0x04) {
 	p = parse_timing(p, q, &entry->timing);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else {
 	entry->timing.wait = 0;
 	entry->timing.ready = 0;
@@ -1080,14 +1080,14 @@
     /* I/O window options */
     if (features & 0x08) {
 	p = parse_io(p, q, &entry->io);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else
 	entry->io.nwin = 0;
     
     /* Interrupt options */
     if (features & 0x10) {
 	p = parse_irq(p, q, &entry->irq);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else
 	entry->irq.IRQInfo1 = 0;
 
@@ -1101,7 +1101,7 @@
 	entry->mem.win[0].card_addr = 0;
 	entry->mem.win[0].host_addr = 0;
 	p += 2;
-	if (p > q) return CS_BAD_TUPLE;
+	if (p > q) return -EINVAL;
 	break;
     case 0x40:
 	entry->mem.nwin = 1;
@@ -1109,20 +1109,20 @@
 	entry->mem.win[0].card_addr = get_unaligned_le16(p + 2) << 8;
 	entry->mem.win[0].host_addr = 0;
 	p += 4;
-	if (p > q) return CS_BAD_TUPLE;
+	if (p > q) return -EINVAL;
 	break;
     case 0x60:
 	p = parse_mem(p, q, &entry->mem);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
 	break;
     }
 
     /* Misc features */
     if (features & 0x80) {
-	if (p == q) return CS_BAD_TUPLE;
+	if (p == q) return -EINVAL;
 	entry->flags |= (*p << 8);
 	while (*p & 0x80)
-	    if (++p == q) return CS_BAD_TUPLE;
+	    if (++p == q) return -EINVAL;
 	p++;
     }
 
@@ -1139,7 +1139,7 @@
 {
     u_char *p;
     if (tuple->TupleDataLen < 6)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     p = (u_char *)tuple->TupleData;
     bar->attr = *p;
     p += 2;
@@ -1153,7 +1153,7 @@
     
     p = (u_char *)tuple->TupleData;
     if ((*p != 3) || (tuple->TupleDataLen < 6))
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     config->last_idx = *(++p);
     p++;
     config->base = get_unaligned_le32(p);
@@ -1174,29 +1174,29 @@
 	entry->flags |= CISTPL_CFTABLE_DEFAULT;
 
     /* Process optional features */
-    if (++p == q) return CS_BAD_TUPLE;
+    if (++p == q) return -EINVAL;
     features = *p; p++;
 
     /* Power options */
     if ((features & 3) > 0) {
 	p = parse_power(p, q, &entry->vcc);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else
 	entry->vcc.present = 0;
     if ((features & 3) > 1) {
 	p = parse_power(p, q, &entry->vpp1);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else
 	entry->vpp1.present = 0;
     if ((features & 3) > 2) {
 	p = parse_power(p, q, &entry->vpp2);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else
 	entry->vpp2.present = 0;
 
     /* I/O window options */
     if (features & 0x08) {
-	if (p == q) return CS_BAD_TUPLE;
+	if (p == q) return -EINVAL;
 	entry->io = *p; p++;
     } else
 	entry->io = 0;
@@ -1204,26 +1204,26 @@
     /* Interrupt options */
     if (features & 0x10) {
 	p = parse_irq(p, q, &entry->irq);
-	if (p == NULL) return CS_BAD_TUPLE;
+	if (p == NULL) return -EINVAL;
     } else
 	entry->irq.IRQInfo1 = 0;
 
     if (features & 0x20) {
-	if (p == q) return CS_BAD_TUPLE;
+	if (p == q) return -EINVAL;
 	entry->mem = *p; p++;
     } else
 	entry->mem = 0;
 
     /* Misc features */
     if (features & 0x80) {
-	if (p == q) return CS_BAD_TUPLE;
+	if (p == q) return -EINVAL;
 	entry->flags |= (*p << 8);
 	if (*p & 0x80) {
-	    if (++p == q) return CS_BAD_TUPLE;
+	    if (++p == q) return -EINVAL;
 	    entry->flags |= (*p << 16);
 	}
 	while (*p & 0x80)
-	    if (++p == q) return CS_BAD_TUPLE;
+	    if (++p == q) return -EINVAL;
 	p++;
     }
 
@@ -1265,7 +1265,7 @@
     u_char *p, *q;
 
     if (tuple->TupleDataLen < 10)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     
     p = tuple->TupleData;
     q = p + tuple->TupleDataLen;
@@ -1289,13 +1289,13 @@
     
     p = tuple->TupleData;
     q = p + tuple->TupleDataLen;
-    if (p == q) return CS_BAD_TUPLE;
+    if (p == q) return -EINVAL;
     org->data_org = *p;
-    if (++p == q) return CS_BAD_TUPLE;
+    if (++p == q) return -EINVAL;
     for (i = 0; i < 30; i++) {
 	org->desc[i] = *p;
 	if (*p == '\0') break;
-	if (++p == q) return CS_BAD_TUPLE;
+	if (++p == q) return -EINVAL;
     }
     return 0;
 }
@@ -1307,7 +1307,7 @@
     u_char *p;
 
     if (tuple->TupleDataLen < 10)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
 
     p = tuple->TupleData;
 
@@ -1321,12 +1321,12 @@
 
 /*====================================================================*/
 
-int pccard_parse_tuple(tuple_t *tuple, cisparse_t *parse)
+int pccard_parse_tuple(struct pcmcia_socket *s, tuple_t *tuple, cisparse_t *parse)
 {
     int ret = 0;
     
     if (tuple->TupleDataLen > tuple->TupleDataMax)
-	return CS_BAD_TUPLE;
+	return -EINVAL;
     switch (tuple->TupleCode) {
     case CISTPL_DEVICE:
     case CISTPL_DEVICE_A:
@@ -1400,6 +1400,8 @@
 	ret = -EINVAL;
 	break;
     }
+    if (ret)
+	    cs_dbg(s, 0, "parse_tuple failed %d\n", ret);
     return ret;
 }
 EXPORT_SYMBOL(pccard_parse_tuple);
@@ -1430,7 +1432,7 @@
     tuple.TupleDataMax = 255;
     ret = pccard_get_tuple_data(s, &tuple);
     if (ret != 0) goto done;
-    ret = pccard_parse_tuple(&tuple, parse);
+    ret = pccard_parse_tuple(s, &tuple, parse);
 done:
     kfree(buf);
     return ret;
Index: wireless-testing/drivers/pcmcia/ds.c
===================================================================
--- wireless-testing.orig/drivers/pcmcia/ds.c	2008-08-20 12:04:09.000000000 -0500
+++ wireless-testing/drivers/pcmcia/ds.c	2008-08-20 12:09:45.000000000 -0500
@@ -82,7 +82,6 @@
     { -EBUSY,			"Resource in use" },
     { -ENOSPC,			"No more items" },
     { -ENOMEM,			"Out of resource" },
-    { CS_BAD_TUPLE,		"Bad CIS tuple" }
 };
 
 
Index: wireless-testing/drivers/pcmcia/pcmcia_ioctl.c
===================================================================
--- wireless-testing.orig/drivers/pcmcia/pcmcia_ioctl.c	2008-08-20 12:04:09.000000000 -0500
+++ wireless-testing/drivers/pcmcia/pcmcia_ioctl.c	2008-08-20 12:44:16.000000000 -0500
@@ -858,7 +858,7 @@
 	break;
     case DS_PARSE_TUPLE:
 	buf->tuple.TupleData = buf->tuple_parse.data;
-	ret = pccard_parse_tuple(&buf->tuple, &buf->tuple_parse.parse);
+	ret = pccard_parse_tuple(s, &buf->tuple, &buf->tuple_parse.parse);
 	break;
     case DS_RESET_CARD:
 	ret = pccard_reset_card(s);
@@ -969,8 +969,6 @@
 	case -ENOSYS:
 	    err = ret;
 	    break;
-	case CS_BAD_TUPLE:
-	    err = -EINVAL; break;
 	case -ENOMEM:
 	    err = -ENOSPC; break;
 	case -ENOSPC:
Index: wireless-testing/include/pcmcia/cs.h
===================================================================
--- wireless-testing.orig/include/pcmcia/cs.h	2008-08-20 12:04:09.000000000 -0500
+++ wireless-testing/include/pcmcia/cs.h	2008-08-20 12:09:45.000000000 -0500
@@ -319,7 +319,7 @@
 #define CS_OUT_OF_RESOURCE	-ENOMEM
 #define CS_BAD_HANDLE		-EINVAL
 
-#define CS_BAD_TUPLE		0x40
+#define CS_BAD_TUPLE		-EINVAL
 
 #ifdef __KERNEL__
 
Index: wireless-testing/include/pcmcia/cistpl.h
===================================================================
--- wireless-testing.orig/include/pcmcia/cistpl.h	2008-08-20 07:12:31.000000000 -0500
+++ wireless-testing/include/pcmcia/cistpl.h	2008-08-20 12:39:33.000000000 -0500
@@ -587,7 +587,7 @@
 int pccard_get_next_tuple(struct pcmcia_socket *s, unsigned int func, tuple_t *tuple);
 int pccard_get_first_tuple(struct pcmcia_socket *s, unsigned int function, tuple_t *tuple);
 int pccard_get_tuple_data(struct pcmcia_socket *s, tuple_t *tuple);
-int pccard_parse_tuple(tuple_t *tuple, cisparse_t *parse);
+int pccard_parse_tuple(struct pcmcia_socket *s, tuple_t *tuple, cisparse_t *parse);
 
 int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, unsigned int *count);
 
@@ -602,7 +602,7 @@
 		pccard_get_tuple_data(p_dev->socket, tuple)
 
 #define pcmcia_parse_tuple(p_dev, tuple, parse) \
-		pccard_parse_tuple(tuple, parse)
+		pccard_parse_tuple(p_dev->socket, tuple, parse)
 
 #define pcmcia_validate_cis(p_dev, info) \
 		pccard_validate_cis(p_dev->socket, p_dev->func, info)
