diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2015-06-14 15:52:46 -0400 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2015-06-16 01:29:39 -0400 |
commit | e8e68fd86d22fa5bd9c7bed16043e27ac86998f8 (patch) | |
tree | 383199964057e8e9a54fdb8b3e9bf63eb6d8e1ec | |
parent | d19319affb6c84ef45185588f63dc28f8ff95ea3 (diff) |
pcmcia: do not break rsrc_nonstatic when handling anonymous cards
Patch 1c6c9b1d9d25 caused a regression for rsrc_nonstatic: It relies
on pccard_validate_cis() to determine whether an iomem resource can
be used for PCMCIA cards. This override, however, lead invalid iomem
resources to be accepted -- and lead to a fake CIS being used instead
of the original CIS.
To fix this issue, move the override for anonymous cards to the one
place where it is needed -- when adding a PCMCIA device.
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
-rw-r--r-- | drivers/pcmcia/cistpl.c | 28 | ||||
-rw-r--r-- | drivers/pcmcia/ds.c | 20 |
2 files changed, 27 insertions, 21 deletions
diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c index 39ae542d9d23..55ef7d1fd8da 100644 --- a/drivers/pcmcia/cistpl.c +++ b/drivers/pcmcia/cistpl.c | |||
@@ -1449,26 +1449,16 @@ int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *info) | |||
1449 | done: | 1449 | done: |
1450 | /* invalidate CIS cache on failure */ | 1450 | /* invalidate CIS cache on failure */ |
1451 | if (!dev_ok || !ident_ok || !count) { | 1451 | if (!dev_ok || !ident_ok || !count) { |
1452 | #if defined(CONFIG_MTD_PCMCIA_ANONYMOUS) | 1452 | mutex_lock(&s->ops_mutex); |
1453 | /* Set up as an anonymous card. If we don't have anonymous | 1453 | destroy_cis_cache(s); |
1454 | memory support then just error the card as there is no | 1454 | mutex_unlock(&s->ops_mutex); |
1455 | point trying to second guess. | 1455 | /* We differentiate between dev_ok, ident_ok and count |
1456 | 1456 | failures to allow for an override for anonymous cards | |
1457 | Note: some cards have just a device entry, it may be | 1457 | in ds.c */ |
1458 | worth extending support to cover these in future */ | 1458 | if (!dev_ok || !ident_ok) |
1459 | if (!dev_ok || !ident_ok) { | ||
1460 | dev_info(&s->dev, "no CIS, assuming an anonymous memory card.\n"); | ||
1461 | pcmcia_replace_cis(s, "\xFF", 1); | ||
1462 | count = 1; | ||
1463 | ret = 0; | ||
1464 | } else | ||
1465 | #endif | ||
1466 | { | ||
1467 | mutex_lock(&s->ops_mutex); | ||
1468 | destroy_cis_cache(s); | ||
1469 | mutex_unlock(&s->ops_mutex); | ||
1470 | ret = -EIO; | 1459 | ret = -EIO; |
1471 | } | 1460 | else |
1461 | ret = -EFAULT; | ||
1472 | } | 1462 | } |
1473 | 1463 | ||
1474 | if (info) | 1464 | if (info) |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 8ab419b631d3..0decee6c556e 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -633,8 +633,24 @@ static int pcmcia_card_add(struct pcmcia_socket *s) | |||
633 | 633 | ||
634 | ret = pccard_validate_cis(s, &no_chains); | 634 | ret = pccard_validate_cis(s, &no_chains); |
635 | if (ret || !no_chains) { | 635 | if (ret || !no_chains) { |
636 | dev_dbg(&s->dev, "invalid CIS or invalid resources\n"); | 636 | #if defined(CONFIG_MTD_PCMCIA_ANONYMOUS) |
637 | return -ENODEV; | 637 | /* Set up as an anonymous card. If we don't have anonymous |
638 | memory support then just error the card as there is no | ||
639 | point trying to second guess. | ||
640 | |||
641 | Note: some cards have just a device entry, it may be | ||
642 | worth extending support to cover these in future */ | ||
643 | if (ret == -EIO) { | ||
644 | dev_info(&s->dev, "no CIS, assuming an anonymous memory card.\n"); | ||
645 | pcmcia_replace_cis(s, "\xFF", 1); | ||
646 | no_chains = 1; | ||
647 | ret = 0; | ||
648 | } else | ||
649 | #endif | ||
650 | { | ||
651 | dev_dbg(&s->dev, "invalid CIS or invalid resources\n"); | ||
652 | return -ENODEV; | ||
653 | } | ||
638 | } | 654 | } |
639 | 655 | ||
640 | if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc)) | 656 | if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc)) |