aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Brodowski <linux@dominikbrodowski.net>2015-06-14 15:52:46 -0400
committerDominik Brodowski <linux@dominikbrodowski.net>2015-06-16 01:29:39 -0400
commite8e68fd86d22fa5bd9c7bed16043e27ac86998f8 (patch)
tree383199964057e8e9a54fdb8b3e9bf63eb6d8e1ec
parentd19319affb6c84ef45185588f63dc28f8ff95ea3 (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.c28
-rw-r--r--drivers/pcmcia/ds.c20
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)
1449done: 1449done:
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))