struct socket_data wasn't zeroed, so pcmcia_validate_mem() didn't get called. If it is called, though, one possible code-path already holds skt_sem, so lockups occur. Therefore, change calling conventions to pcmcia_validate_mem(). Signed-off-by: Dominik Brodowski --- drivers/pcmcia/ds.c | 4 ++++ drivers/pcmcia/rsrc_nonstatic.c | 8 ++------ 2 files changed, 6 insertions(+), 6 deletions(-) Index: 2.6.12-rc1/drivers/pcmcia/ds.c =================================================================== --- 2.6.12-rc1.orig/drivers/pcmcia/ds.c 2005-03-19 11:49:32.000000000 +0100 +++ 2.6.12-rc1/drivers/pcmcia/ds.c 2005-03-19 11:52:06.000000000 +0100 @@ -1386,7 +1386,9 @@ buf->config.Function, &buf->config); break; case DS_GET_FIRST_TUPLE: + down(&s->parent.sem); pcmcia_validate_mem(s->parent); + up(&s->parent.sem); ret = pccard_get_first_tuple(s->parent, BIND_FN_ALL, &buf->tuple); break; case DS_GET_NEXT_TUPLE: @@ -1412,7 +1414,9 @@ ret = pccard_get_status(s->parent, buf->status.Function, &buf->status); break; case DS_VALIDATE_CIS: + down(&s->parent.sem); pcmcia_validate_mem(s->parent); + up(&s->parent.sem); ret = pccard_validate_cis(s->parent, BIND_FN_ALL, &buf->cisinfo); break; case DS_SUSPEND_CARD: Index: 2.6.12-rc1/drivers/pcmcia/rsrc_nonstatic.c =================================================================== --- 2.6.12-rc1.orig/drivers/pcmcia/rsrc_nonstatic.c 2005-03-19 11:49:10.000000000 +0100 +++ 2.6.12-rc1/drivers/pcmcia/rsrc_nonstatic.c 2005-03-19 11:52:33.000000000 +0100 @@ -474,8 +474,7 @@ /* - * Locking note: this is the only place where we take - * both rsrc_sem and skt_sem. + * Locking note: Must be called with skt_sem held! */ static void pcmcia_nonstatic_validate_mem(struct pcmcia_socket *s) { @@ -492,12 +491,8 @@ if (probe_mask & ~s_data->rsrc_mem_probe) { s_data->rsrc_mem_probe |= probe_mask; - down(&s->skt_sem); - if (s->state & SOCKET_PRESENT) validate_mem(s, probe_mask); - - up(&s->skt_sem); } up(&rsrc_sem); @@ -781,6 +776,7 @@ data = kmalloc(sizeof(struct socket_data), GFP_KERNEL); if (!data) return -ENOMEM; + memset(data, 0, sizeof(struct socket_data)); data->mem_db.next = &data->mem_db; data->io_db.next = &data->io_db;