Skip to content

Commit

Permalink
ISAPNP: handle independent options following dependent ones
Browse files Browse the repository at this point in the history
The ISAPNP spec recommends that independent options precede
dependent ones, but this is not actually required.  The current
ISAPNP code incorrectly puts such trailing independent options
at the end of the last dependent option list.

This patch fixes that bug by resetting the current option list
to the independent list when we see an "End Dependent Functions"
tag.  PNPBIOS and PNPACPI handle this the same way.

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Acked-by: Rene Herman <rene.herman@gmail.com>
Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
Bjorn Helgaas authored and Andi Kleen committed Jul 16, 2008
1 parent e2a1a6f commit bbe413b
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions drivers/pnp/isapnp/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -584,14 +584,14 @@ static int __init isapnp_create_device(struct pnp_card *card,
{
int number = 0, skip = 0, priority, compat = 0;
unsigned char type, tmp[17];
struct pnp_option *option;
struct pnp_option *option, *option_independent;
struct pnp_dev *dev;
u32 eisa_id;
char id[8];

if ((dev = isapnp_parse_device(card, size, number++)) == NULL)
return 1;
option = pnp_register_independent_option(dev);
option_independent = option = pnp_register_independent_option(dev);
if (!option) {
kfree(dev);
return 1;
Expand All @@ -613,6 +613,7 @@ static int __init isapnp_create_device(struct pnp_card *card,
size = 0;
skip = 0;
option = pnp_register_independent_option(dev);
option_independent = option;
if (!option) {
kfree(dev);
return 1;
Expand Down Expand Up @@ -662,6 +663,10 @@ static int __init isapnp_create_device(struct pnp_card *card,
case _STAG_ENDDEP:
if (size != 0)
goto __skip;
if (option_independent == option)
dev_warn(&dev->dev, "missing "
"_STAG_STARTDEP tag\n");
option = option_independent;
dev_dbg(&dev->dev, "end dependent options\n");
break;
case _STAG_IOPORT:
Expand Down

0 comments on commit bbe413b

Please sign in to comment.