Commit 74cf4a55 authored by Dominik Brodowski's avatar Dominik Brodowski Committed by Linus Torvalds

[PATCH] pcmcia: m32 registration failure fixup

The pseudo-unregistration of PCMCIA sockets in case the registration of any
such socket failed causes lockups.

See http://bugme.osdl.org/show_bug.cgi?id=4115 for details (same problem,
Signed-off-by: default avatarDominik Brodowski <linux@brodo.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 5dc0ff31
......@@ -239,6 +239,7 @@ void pcc_iowrite_word(int sock, unsigned long port, void *buf, size_t size,
/*====================================================================*/
#define IS_REGISTERED 0x2000
#define IS_ALIVE 0x8000
typedef struct pcc_t {
......@@ -835,11 +836,9 @@ static int __init init_m32r_pcc(void)
socket[i].socket.owner = THIS_MODULE;
socket[i].number = i;
ret = pcmcia_register_socket(&socket[i].socket);
if (ret && i--) {
for (; i>= 0; i--)
pcmcia_unregister_socket(&socket[i].socket);
break;
}
if (!ret)
socket[i].flags |= IS_REGISTERED;
#if 0 /* driver model ordering issue */
class_device_create_file(&socket[i].socket.dev,
&class_device_attr_info);
......@@ -865,7 +864,8 @@ static void __exit exit_m32r_pcc(void)
int i;
for (i = 0; i < pcc_sockets; i++)
pcmcia_unregister_socket(&socket[i].socket);
if (socket[i].flags & IS_REGISTERED)
pcmcia_unregister_socket(&socket[i].socket);
platform_device_unregister(&pcc_device);
if (poll_interval != 0)
......
......@@ -257,6 +257,7 @@ void pcc_iowrite(int sock, unsigned long port, void *buf, size_t size, size_t nm
/*====================================================================*/
#define IS_REGISTERED 0x2000
#define IS_ALIVE 0x8000
typedef struct pcc_t {
......@@ -772,11 +773,9 @@ static int __init init_m32r_pcc(void)
socket[i].socket.owner = THIS_MODULE;
socket[i].number = i;
ret = pcmcia_register_socket(&socket[i].socket);
if (ret && i--) {
for (; i>= 0; i--)
pcmcia_unregister_socket(&socket[i].socket);
break;
}
if (!ret)
socket[i].flags |= IS_REGISTERED;
#if 0 /* driver model ordering issue */
class_device_create_file(&socket[i].socket.dev,
&class_device_attr_info);
......@@ -802,7 +801,8 @@ static void __exit exit_m32r_pcc(void)
int i;
for (i = 0; i < pcc_sockets; i++)
pcmcia_unregister_socket(&socket[i].socket);
if (socket[i].flags & IS_REGISTERED)
pcmcia_unregister_socket(&socket[i].socket);
platform_device_unregister(&pcc_device);
if (poll_interval != 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment