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 <li...@dominikbrodowski.net>
---
 drivers/pcmcia/cistpl.c | 28 +++++++++-------------------
 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 39ae542..55ef7d1 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)
 done:
        /* invalidate CIS cache on failure */
        if (!dev_ok || !ident_ok || !count) {
-#if defined(CONFIG_MTD_PCMCIA_ANONYMOUS)
-               /* Set up as an anonymous card. If we don't have anonymous
-                  memory support then just error the card as there is no
-                  point trying to second guess.
-
-                  Note: some cards have just a device entry, it may be
-                  worth extending support to cover these in future */
-               if (!dev_ok || !ident_ok) {
-                       dev_info(&s->dev, "no CIS, assuming an anonymous memory 
card.\n");
-                       pcmcia_replace_cis(s, "\xFF", 1);
-                       count = 1;
-                       ret = 0;
-               } else
-#endif
-               {
-                       mutex_lock(&s->ops_mutex);
-                       destroy_cis_cache(s);
-                       mutex_unlock(&s->ops_mutex);
+               mutex_lock(&s->ops_mutex);
+               destroy_cis_cache(s);
+               mutex_unlock(&s->ops_mutex);
+               /* We differentiate between dev_ok, ident_ok and count
+                  failures to allow for an override for anonymous cards
+                  in ds.c */
+               if (!dev_ok || !ident_ok)
                        ret = -EIO;
-               }
+               else
+                       ret = -EFAULT;
        }
 
        if (info)
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c
index 8ab419b..0decee6 100644
--- a/drivers/pcmcia/ds.c
+++ b/drivers/pcmcia/ds.c
@@ -633,8 +633,24 @@ static int pcmcia_card_add(struct pcmcia_socket *s)
 
        ret = pccard_validate_cis(s, &no_chains);
        if (ret || !no_chains) {
-               dev_dbg(&s->dev, "invalid CIS or invalid resources\n");
-               return -ENODEV;
+#if defined(CONFIG_MTD_PCMCIA_ANONYMOUS)
+               /* Set up as an anonymous card. If we don't have anonymous
+                  memory support then just error the card as there is no
+                  point trying to second guess.
+
+                  Note: some cards have just a device entry, it may be
+                  worth extending support to cover these in future */
+               if (ret == -EIO) {
+                       dev_info(&s->dev, "no CIS, assuming an anonymous memory 
card.\n");
+                       pcmcia_replace_cis(s, "\xFF", 1);
+                       no_chains = 1;
+                       ret = 0;
+               } else
+#endif
+               {
+                       dev_dbg(&s->dev, "invalid CIS or invalid resources\n");
+                       return -ENODEV;
+               }
        }
 
        if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc))
-- 
2.1.4


_______________________________________________
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia

Reply via email to