Dominik Brodowski wrote:
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 <[EMAIL PROTECTED]>
---
drivers/pcmcia/cistpl.c | 96 +++++++++++++++++++++--------------------
drivers/pcmcia/ds.c | 1 -
drivers/pcmcia/pcmcia_ioctl.c | 2 -
include/pcmcia/cs.h | 2 +-
4 files changed, 50 insertions(+), 51 deletions(-)
--- snip a bunch ---
switch (tuple->TupleCode) {
case CISTPL_DEVICE:
case CISTPL_DEVICE_A:
@@ -1400,6 +1400,8 @@ int pccard_parse_tuple(tuple_t *tuple, cisparse_t *parse)
ret = -EINVAL;
break;
}
+ if (ret)
+ cs_dbg(s, 0, "parse_tuple failed %d\n", ret);
This routine fails to compile with debugging enabled because "s" has
never been declared. The fix required adding the socket as an argument
for pccard_parse_tuple, which required a change in the wrapper macro,
etc. The revised patch is attached.
Larry
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 <[EMAIL PROTECTED]>
---
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)
_______________________________________________
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia