pcmcia: do not break rsrc_nonstatic when handling anonymous cards
Patch 1c6c9b1d9d
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>
This commit is contained in:
parent
d19319affb
commit
e8e68fd86d
2 changed files with 27 additions and 21 deletions
|
@ -1449,26 +1449,16 @@ int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *info)
|
||||||
done:
|
done:
|
||||||
/* invalidate CIS cache on failure */
|
/* invalidate CIS cache on failure */
|
||||||
if (!dev_ok || !ident_ok || !count) {
|
if (!dev_ok || !ident_ok || !count) {
|
||||||
#if defined(CONFIG_MTD_PCMCIA_ANONYMOUS)
|
mutex_lock(&s->ops_mutex);
|
||||||
/* Set up as an anonymous card. If we don't have anonymous
|
destroy_cis_cache(s);
|
||||||
memory support then just error the card as there is no
|
mutex_unlock(&s->ops_mutex);
|
||||||
point trying to second guess.
|
/* We differentiate between dev_ok, ident_ok and count
|
||||||
|
failures to allow for an override for anonymous cards
|
||||||
Note: some cards have just a device entry, it may be
|
in ds.c */
|
||||||
worth extending support to cover these in future */
|
if (!dev_ok || !ident_ok)
|
||||||
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);
|
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
}
|
else
|
||||||
|
ret = -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info)
|
if (info)
|
||||||
|
|
|
@ -633,8 +633,24 @@ static int pcmcia_card_add(struct pcmcia_socket *s)
|
||||||
|
|
||||||
ret = pccard_validate_cis(s, &no_chains);
|
ret = pccard_validate_cis(s, &no_chains);
|
||||||
if (ret || !no_chains) {
|
if (ret || !no_chains) {
|
||||||
dev_dbg(&s->dev, "invalid CIS or invalid resources\n");
|
#if defined(CONFIG_MTD_PCMCIA_ANONYMOUS)
|
||||||
return -ENODEV;
|
/* 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))
|
if (!pccard_read_tuple(s, BIND_FN_ALL, CISTPL_LONGLINK_MFC, &mfc))
|
||||||
|
|
Loading…
Reference in a new issue