Skip to content

Commit

Permalink
[PATCH] pcmcia: start over after CIS override
Browse files Browse the repository at this point in the history
When overriding the CIS, re-start the configuration of the card from
scratch. Reported and debugged by Fabrice Bellet <fabrice@bellet.info>

Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
  • Loading branch information
Dominik Brodowski committed Dec 5, 2006
1 parent 5eb5fc9 commit 4ae1cbf
Showing 3 changed files with 11 additions and 7 deletions.
2 changes: 1 addition & 1 deletion drivers/pcmcia/cs_internal.h
Original file line number Diff line number Diff line change
@@ -135,7 +135,7 @@ int pccard_get_status(struct pcmcia_socket *s, struct pcmcia_device *p_dev, cs_s
struct pcmcia_callback{
struct module *owner;
int (*event) (struct pcmcia_socket *s, event_t event, int priority);
void (*requery) (struct pcmcia_socket *s);
void (*requery) (struct pcmcia_socket *s, int new_cis);
int (*suspend) (struct pcmcia_socket *s);
int (*resume) (struct pcmcia_socket *s);
};
12 changes: 8 additions & 4 deletions drivers/pcmcia/ds.c
Original file line number Diff line number Diff line change
@@ -714,22 +714,26 @@ static int pcmcia_requery(struct device *dev, void * _data)
return 0;
}

static void pcmcia_bus_rescan(struct pcmcia_socket *skt)
static void pcmcia_bus_rescan(struct pcmcia_socket *skt, int new_cis)
{
int no_devices=0;
int no_devices = 0;
int ret = 0;
unsigned long flags;

/* must be called with skt_mutex held */
spin_lock_irqsave(&pcmcia_dev_list_lock, flags);
if (list_empty(&skt->devices_list))
no_devices=1;
no_devices = 1;
spin_unlock_irqrestore(&pcmcia_dev_list_lock, flags);

/* If this is because of a CIS override, start over */
if (new_cis && !no_devices)
pcmcia_card_remove(skt, NULL);

/* if no devices were added for this socket yet because of
* missing resource information or other trouble, we need to
* do this now. */
if (no_devices) {
if (no_devices || new_cis) {
ret = pcmcia_card_add(skt);
if (ret)
return;
4 changes: 2 additions & 2 deletions drivers/pcmcia/socket_sysfs.c
Original file line number Diff line number Diff line change
@@ -188,7 +188,7 @@ static ssize_t pccard_store_resource(struct class_device *dev, const char *buf,
(s->state & SOCKET_PRESENT) &&
!(s->state & SOCKET_CARDBUS)) {
if (try_module_get(s->callback->owner)) {
s->callback->requery(s);
s->callback->requery(s, 0);
module_put(s->callback->owner);
}
}
@@ -325,7 +325,7 @@ static ssize_t pccard_store_cis(struct kobject *kobj, char *buf, loff_t off, siz
if ((s->callback) && (s->state & SOCKET_PRESENT) &&
!(s->state & SOCKET_CARDBUS)) {
if (try_module_get(s->callback->owner)) {
s->callback->requery(s);
s->callback->requery(s, 1);
module_put(s->callback->owner);
}
}

0 comments on commit 4ae1cbf

Please sign in to comment.