In pcmcia_parse_cis_tuple(), refactor the memspace section introducing

a switch statement and fixing CID 566.
This commit is contained in:
rpaulo 2006-04-06 18:06:43 +00:00
parent 086b31316b
commit ed268c60d0
1 changed files with 96 additions and 86 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pcmcia_cis.c,v 1.41 2006/02/23 03:20:53 gdamore Exp $ */
/* $NetBSD: pcmcia_cis.c,v 1.42 2006/04/06 18:06:43 rpaulo Exp $ */
/*
* Copyright (c) 1997 Marc Horowitz. All rights reserved.
@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pcmcia_cis.c,v 1.41 2006/02/23 03:20:53 gdamore Exp $");
__KERNEL_RCSID(0, "$NetBSD: pcmcia_cis.c,v 1.42 2006/04/06 18:06:43 rpaulo Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -1220,98 +1220,108 @@ pcmcia_parse_cis_tuple(tuple, arg)
(1 << (reg & PCMCIA_TPCE_IR_IRQ));
}
}
if (memspace) {
if (tuple->length <= idx) {
DPRINTF(("ran out of space before TCPE_MS\n"));
goto abort_cfe;
if (memspace && tuple->length <= idx) {
DPRINTF(("ran out of space before TCPE_MS\n"));
goto abort_cfe;
}
switch (memspace) {
case PCMCIA_TPCE_FS_MEMSPACE_NONE:
cfe->num_memspace = 0;
break;
case PCMCIA_TPCE_FS_MEMSPACE_LENGTH:
cfe->num_memspace = 1;
cfe->memspace[0].length = 256 *
pcmcia_tuple_read_2(tuple, idx);
idx += 2;
cfe->memspace[0].cardaddr = 0;
cfe->memspace[0].hostaddr = 0;
break;
case PCMCIA_TPCE_FS_MEMSPACE_LENGTHADDR:
cfe->num_memspace = 1;
cfe->memspace[0].length = 256 *
pcmcia_tuple_read_2(tuple, idx);
idx += 2;
cfe->memspace[0].cardaddr = 256 *
pcmcia_tuple_read_2(tuple, idx);
idx += 2;
cfe->memspace[0].hostaddr =
cfe->memspace[0].cardaddr;
break;
default:
{
int lengthsize;
int cardaddrsize;
int hostaddrsize;
reg = pcmcia_tuple_read_1(tuple, idx);
idx++;
cfe->num_memspace = (reg & PCMCIA_TPCE_MS_COUNT)
+ 1;
if (cfe->num_memspace >
(sizeof(cfe->memspace) /
sizeof(cfe->memspace[0]))) {
DPRINTF(("too many mem spaces %d",
cfe->num_memspace));
state->card->error++;
break;
}
lengthsize =
((reg & PCMCIA_TPCE_MS_LENGTH_SIZE_MASK) >>
PCMCIA_TPCE_MS_LENGTH_SIZE_SHIFT);
cardaddrsize =
((reg &
PCMCIA_TPCE_MS_CARDADDR_SIZE_MASK) >>
PCMCIA_TPCE_MS_CARDADDR_SIZE_SHIFT);
hostaddrsize =
(reg & PCMCIA_TPCE_MS_HOSTADDR) ?
cardaddrsize : 0;
if (memspace == PCMCIA_TPCE_FS_MEMSPACE_NONE) {
cfe->num_memspace = 0;
} else if (memspace == PCMCIA_TPCE_FS_MEMSPACE_LENGTH) {
cfe->num_memspace = 1;
cfe->memspace[0].length = 256 *
pcmcia_tuple_read_2(tuple, idx);
idx += 2;
cfe->memspace[0].cardaddr = 0;
cfe->memspace[0].hostaddr = 0;
} else if (memspace ==
PCMCIA_TPCE_FS_MEMSPACE_LENGTHADDR) {
cfe->num_memspace = 1;
cfe->memspace[0].length = 256 *
pcmcia_tuple_read_2(tuple, idx);
idx += 2;
cfe->memspace[0].cardaddr = 256 *
pcmcia_tuple_read_2(tuple, idx);
idx += 2;
cfe->memspace[0].hostaddr = cfe->memspace[0].cardaddr;
} else {
int lengthsize;
int cardaddrsize;
int hostaddrsize;
reg = pcmcia_tuple_read_1(tuple, idx);
idx++;
cfe->num_memspace = (reg &
PCMCIA_TPCE_MS_COUNT) + 1;
if (cfe->num_memspace >
(sizeof(cfe->memspace) /
sizeof(cfe->memspace[0]))) {
DPRINTF(("too many mem "
"spaces %d",
cfe->num_memspace));
state->card->error++;
break;
if (lengthsize == 0) {
DPRINTF(("cfe memspace "
"lengthsize == 0"));
state->card->error++;
}
for (i = 0; i < cfe->num_memspace; i++) {
if (lengthsize) {
cfe->memspace[i].length = 256 *
pcmcia_tuple_read_n(tuple,
lengthsize, idx);
idx += lengthsize;
} else {
cfe->memspace[i].length = 0;
}
lengthsize =
((reg & PCMCIA_TPCE_MS_LENGTH_SIZE_MASK) >>
PCMCIA_TPCE_MS_LENGTH_SIZE_SHIFT);
cardaddrsize =
((reg & PCMCIA_TPCE_MS_CARDADDR_SIZE_MASK) >>
PCMCIA_TPCE_MS_CARDADDR_SIZE_SHIFT);
hostaddrsize =
(reg & PCMCIA_TPCE_MS_HOSTADDR) ? cardaddrsize : 0;
if (lengthsize == 0) {
DPRINTF(("cfe memspace "
"lengthsize == 0"));
if (cfe->memspace[i].length == 0) {
DPRINTF(("cfe->memspace"
"[%d].length == 0", i));
state->card->error++;
}
for (i = 0; i < cfe->num_memspace; i++) {
if (lengthsize) {
cfe->memspace[i].length =
256 * pcmcia_tuple_read_n(tuple, lengthsize,
idx);
idx += lengthsize;
} else {
cfe->memspace[i].length = 0;
}
if (cfe->memspace[i].length == 0) {
DPRINTF(("cfe->memspace[%d].length == 0",
i));
state->card->error++;
}
if (cardaddrsize) {
cfe->memspace[i].cardaddr =
256 * pcmcia_tuple_read_n(tuple, cardaddrsize,
idx);
idx += cardaddrsize;
} else {
cfe->memspace[i].cardaddr = 0;
}
if (hostaddrsize) {
cfe->memspace[i].hostaddr =
256 * pcmcia_tuple_read_n(tuple, hostaddrsize,
idx);
idx += hostaddrsize;
} else {
cfe->memspace[i].hostaddr = 0;
}
if (cardaddrsize) {
cfe->memspace[i].cardaddr =
256 *
pcmcia_tuple_read_n(tuple,
cardaddrsize, idx);
idx += cardaddrsize;
} else {
cfe->memspace[i].cardaddr = 0;
}
if (hostaddrsize) {
cfe->memspace[i].hostaddr =
256 *
pcmcia_tuple_read_n(tuple,
hostaddrsize, idx);
idx += hostaddrsize;
} else {
cfe->memspace[i].hostaddr = 0;
}
}
}
if (misc) {
if (tuple->length <= idx) {
DPRINTF(("ran out of space before TCPE_MI\n"));