Skip to content

Commit

Permalink
pcmcia: do not lock socket driver module on card insert
Browse files Browse the repository at this point in the history
Do not lock the socket driver module on card insert, as
the PCMCIA core can handle a socket module removal, at least
if we add a call to socket_remove() on pccardd()'s shutdown.

Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
  • Loading branch information
Dominik Brodowski committed Jan 24, 2010
1 parent 593f010 commit 3970dd8
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 23 deletions.
13 changes: 10 additions & 3 deletions drivers/pcmcia/cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -407,7 +407,7 @@ static void socket_shutdown(struct pcmcia_socket *s)
"*** DANGER *** unable to remove socket power\n");
}

cs_socket_put(s);
s->state &= ~SOCKET_INUSE;
}

static int socket_setup(struct pcmcia_socket *skt, int initial_delay)
Expand Down Expand Up @@ -496,8 +496,8 @@ static int socket_insert(struct pcmcia_socket *skt)

dev_dbg(&skt->dev, "insert\n");

if (!cs_socket_get(skt))
return -ENODEV;
WARN_ON(skt->state & SOCKET_INUSE);
skt->state |= SOCKET_INUSE;

ret = socket_setup(skt, setup_delay);
if (ret == 0) {
Expand Down Expand Up @@ -697,6 +697,13 @@ static int pccardd(void *__skt)
/* make sure we are running before we exit */
set_current_state(TASK_RUNNING);

/* shut down socket, if a device is still present */
if (skt->state & SOCKET_PRESENT) {
mutex_lock(&skt->skt_mutex);
socket_remove(skt);
mutex_unlock(&skt->skt_mutex);
}

/* remove from the device core */
pccard_sysfs_remove_socket(&skt->dev);
device_unregister(&skt->dev);
Expand Down
20 changes: 0 additions & 20 deletions drivers/pcmcia/cs_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,26 +87,6 @@ struct pccard_resource_ops {
#define SOCKET_CARDBUS 0x8000
#define SOCKET_CARDBUS_CONFIG 0x10000

static inline int cs_socket_get(struct pcmcia_socket *skt)
{
int ret;

WARN_ON(skt->state & SOCKET_INUSE);

ret = try_module_get(skt->owner);
if (ret)
skt->state |= SOCKET_INUSE;
return ret;
}

static inline void cs_socket_put(struct pcmcia_socket *skt)
{
if (skt->state & SOCKET_INUSE) {
skt->state &= ~SOCKET_INUSE;
module_put(skt->owner);
}
}


/*
* Stuff internal to module "pcmcia_core":
Expand Down

0 comments on commit 3970dd8

Please sign in to comment.