[Orinoco-devel] 2.6.28-rc2: new PCMCIA device instance after resume - orinoco can't download firmware
Dave
kilroyd at googlemail.com
Thu Oct 30 14:15:24 EDT 2008
Russell King wrote:
> On Wed, Oct 29, 2008 at 08:53:24PM +0000, Dave wrote:
>> Looking at the pcmcia code it looks like ds_event is getting a
>> CS_EVENT_CARD_INSERTION event. Should we be processing that event ?
>
> You can get that on resume if PCMCIA thinks the card has changed -
> and it determines that by comparing its cache of the CIS with what
> is in the card on resume. If the cache doesn't match the CIS, it
> assumes the card has changed, and does a remove-insert cycle instead
> of resume.
>
> So the question to ask is: why is the card's CIS changing on resume?
>
> Try putting some debug in verify_cis_cache() in drivers/pcmcia/cistpl.c.
After much faffing about, I managed to bisect this. In retrospect the
above hint (thanks Russell) and a code inspection ought to have made the
bug obvious. The offending commit is:
commit 1168386aa7d850ead2ae135d5a7949a592c6e9a0
pcmcia: deprecate CS_OUT_OF_RESOURCE
in which the following change is made (among others):
@@ -352,7 +352,9 @@ int verify_cis_cache(struct pcmcia_socket *s)
buf = kmalloc(256, GFP_KERNEL);
if (buf == NULL)
- return -1;
+ dev_printk(KERN_WARNING, &s->dev,
+ "no memory for verifying CIS\n");
+ return -ENOMEM;
list_for_each_entry(cis, &s->cis_cache, node) {
int len = cis->len;
The attached patch should fix things.
Regards,
Dave.
---
pcmcia: Actually verify against the cached CIS
Commit 1168386aa7d850ead2ae135d5a7949a592c6e9a0 introduced a printk into
a single line if without adding braces, resulting in PCMCIA devices
being added as new on resume.
Add the necessary braces.
Reported by: Andrey Borzenkov <arvidjaar at mail.ru>
Signed-off by: David Kilroy <kilroyd at gmail.com>
---
diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c
index 8d37768..91a00ec 100644
--- a/drivers/pcmcia/cistpl.c
+++ b/drivers/pcmcia/cistpl.c
@@ -351,10 +351,12 @@ int verify_cis_cache(struct pcmcia_socket *s)
char *buf;
buf = kmalloc(256, GFP_KERNEL);
- if (buf == NULL)
+ if (buf == NULL) {
dev_printk(KERN_WARNING, &s->dev,
"no memory for verifying CIS\n");
return -ENOMEM;
+ }
+
list_for_each_entry(cis, &s->cis_cache, node) {
int len = cis->len;
More information about the linux-pcmcia
mailing list