2008-07-15 13:26:31

by Marc Zyngier

[permalink] [raw]
Subject: [BUG][PATCH][pcmcia] cisinfo_t removal prevents card detection

Dominik,

The commit

c5081d5f4775b2a3f858f91151bbf9163e473075 (pcmcia: simplify pccard_validate_cis)

that entered mainline yesterday introduced a bug that prevents card detection
on my platform (PXA255 based), and possibly others :

@@ -1490,11 +1491,13 @@ int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, cisinfo_
((tuple->TupleCode > 0x90) && (tuple->TupleCode < 0xff)))
reserved++;
}
- if ((info->Chains == MAX_TUPLES) || (reserved > 5) ||
- ((!dev_ok || !ident_ok) && (info->Chains > 10)))
- info->Chains = 0;
+ if ((count) || (reserved > 5) ||
+ ((!dev_ok || !ident_ok) && (count > 10)))
+ count = 0;

Since count starts at 1, condition is now always true, and count then
reset to 0. Restoring the comparaison to MAX_TUPLES makes everybody
happy...

M.

Signed-off-by: Marc Zyngier <[email protected]>

diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c
index 9fcff0c..65129b5 100644
--- a/drivers/pcmcia/cistpl.c
+++ b/drivers/pcmcia/cistpl.c
@@ -1490,7 +1490,7 @@ int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, unsigned
((tuple->TupleCode > 0x90) && (tuple->TupleCode < 0xff)))
reserved++;
}
- if ((count) || (reserved > 5) ||
+ if ((count == MAX_TUPLES) || (reserved > 5) ||
((!dev_ok || !ident_ok) && (count > 10)))
count = 0;

--
A rat a day keeps the plague away.


2008-07-15 13:36:37

by Manuel Lauss

[permalink] [raw]
Subject: Re: [BUG][PATCH][pcmcia] cisinfo_t removal prevents card detection

On Tue, Jul 15, 2008 at 03:26:15PM +0200, Marc Zyngier wrote:
> Dominik,
>
> The commit
>
> c5081d5f4775b2a3f858f91151bbf9163e473075 (pcmcia: simplify
> pccard_validate_cis)
>
> that entered mainline yesterday introduced a bug that prevents card
> detection
> on my platform (PXA255 based), and possibly others :
>
> @@ -1490,11 +1491,13 @@ int pccard_validate_cis(struct pcmcia_socket *s,
> unsigned int function, cisinfo_
> ((tuple->TupleCode > 0x90) && (tuple->TupleCode < 0xff)))
> reserved++;
> }
> - if ((info->Chains == MAX_TUPLES) || (reserved > 5) ||
> - ((!dev_ok || !ident_ok) && (info->Chains > 10)))
> - info->Chains = 0;
> + if ((count) || (reserved > 5) ||
> + ((!dev_ok || !ident_ok) && (count > 10)))
> + count = 0;
>
> Since count starts at 1, condition is now always true, and count then
> reset to 0. Restoring the comparaison to MAX_TUPLES makes everybody
> happy...
>
> M.
>
> Signed-off-by: Marc Zyngier <[email protected]>
>
> diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c
> index 9fcff0c..65129b5 100644
> --- a/drivers/pcmcia/cistpl.c
> +++ b/drivers/pcmcia/cistpl.c
> @@ -1490,7 +1490,7 @@ int pccard_validate_cis(struct pcmcia_socket *s,
> unsigned int function, unsigned
> ((tuple->TupleCode > 0x90) && (tuple->TupleCode < 0xff)))
> reserved++;
> }
> - if ((count) || (reserved > 5) ||
> + if ((count == MAX_TUPLES) || (reserved > 5) ||
> ((!dev_ok || !ident_ok) && (count > 10)))
> count = 0;

Confirmed: this fixes CF card detection on my SH and MIPS boards.
Thanks!

--
Manuel Lauss