diff options
-rw-r--r-- | drivers/pcmcia/ds.c | 12 | ||||
-rw-r--r-- | drivers/pcmcia/ds_internal.h | 14 | ||||
-rw-r--r-- | drivers/pcmcia/pcmcia_ioctl.c | 12 |
3 files changed, 20 insertions, 18 deletions
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 54068f451ee6..85e2cb2b9e91 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -622,14 +622,14 @@ static void pcmcia_delayed_add_pseudo_device(void *data) | |||
622 | { | 622 | { |
623 | struct pcmcia_bus_socket *s = data; | 623 | struct pcmcia_bus_socket *s = data; |
624 | pcmcia_device_add(s, 0); | 624 | pcmcia_device_add(s, 0); |
625 | s->device_add_pending = 0; | 625 | s->pcmcia_state.device_add_pending = 0; |
626 | } | 626 | } |
627 | 627 | ||
628 | static inline void pcmcia_add_pseudo_device(struct pcmcia_bus_socket *s) | 628 | static inline void pcmcia_add_pseudo_device(struct pcmcia_bus_socket *s) |
629 | { | 629 | { |
630 | if (!s->device_add_pending) { | 630 | if (!s->pcmcia_state.device_add_pending) { |
631 | schedule_work(&s->device_add); | 631 | schedule_work(&s->device_add); |
632 | s->device_add_pending = 1; | 632 | s->pcmcia_state.device_add_pending = 1; |
633 | } | 633 | } |
634 | return; | 634 | return; |
635 | } | 635 | } |
@@ -981,14 +981,14 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority) | |||
981 | switch (event) { | 981 | switch (event) { |
982 | 982 | ||
983 | case CS_EVENT_CARD_REMOVAL: | 983 | case CS_EVENT_CARD_REMOVAL: |
984 | s->state &= ~DS_SOCKET_PRESENT; | 984 | s->pcmcia_state.present = 0; |
985 | send_event(skt, event, priority); | 985 | send_event(skt, event, priority); |
986 | unbind_request(s); | 986 | unbind_request(s); |
987 | handle_event(s, event); | 987 | handle_event(s, event); |
988 | break; | 988 | break; |
989 | 989 | ||
990 | case CS_EVENT_CARD_INSERTION: | 990 | case CS_EVENT_CARD_INSERTION: |
991 | s->state |= DS_SOCKET_PRESENT; | 991 | s->pcmcia_state.present = 1; |
992 | pcmcia_card_add(skt); | 992 | pcmcia_card_add(skt); |
993 | handle_event(s, event); | 993 | handle_event(s, event); |
994 | break; | 994 | break; |
@@ -1229,7 +1229,7 @@ static void pcmcia_bus_remove_socket(struct class_device *class_dev) | |||
1229 | 1229 | ||
1230 | pccard_register_pcmcia(socket, NULL); | 1230 | pccard_register_pcmcia(socket, NULL); |
1231 | 1231 | ||
1232 | socket->pcmcia->state |= DS_SOCKET_DEAD; | 1232 | socket->pcmcia->pcmcia_state.dead = 1; |
1233 | pcmcia_put_bus_socket(socket->pcmcia); | 1233 | pcmcia_put_bus_socket(socket->pcmcia); |
1234 | socket->pcmcia = NULL; | 1234 | socket->pcmcia = NULL; |
1235 | 1235 | ||
diff --git a/drivers/pcmcia/ds_internal.h b/drivers/pcmcia/ds_internal.h index b05bc39d9cd6..2c3bb189dec6 100644 --- a/drivers/pcmcia/ds_internal.h +++ b/drivers/pcmcia/ds_internal.h | |||
@@ -5,7 +5,6 @@ struct user_info_t; | |||
5 | /* Socket state information */ | 5 | /* Socket state information */ |
6 | struct pcmcia_bus_socket { | 6 | struct pcmcia_bus_socket { |
7 | struct kref refcount; | 7 | struct kref refcount; |
8 | int state; | ||
9 | struct pcmcia_socket *parent; | 8 | struct pcmcia_socket *parent; |
10 | 9 | ||
11 | /* the PCMCIA devices connected to this socket (normally one, more | 10 | /* the PCMCIA devices connected to this socket (normally one, more |
@@ -15,7 +14,14 @@ struct pcmcia_bus_socket { | |||
15 | * only internally and subject | 14 | * only internally and subject |
16 | * to incorrectness and change */ | 15 | * to incorrectness and change */ |
17 | 16 | ||
18 | u8 device_add_pending; | 17 | struct { |
18 | u8 present:1, | ||
19 | busy:1, | ||
20 | dead:1, | ||
21 | device_add_pending:1, | ||
22 | reserved:4; | ||
23 | } pcmcia_state; | ||
24 | |||
19 | struct work_struct device_add; | 25 | struct work_struct device_add; |
20 | 26 | ||
21 | 27 | ||
@@ -29,10 +35,6 @@ extern spinlock_t pcmcia_dev_list_lock; | |||
29 | extern struct bus_type pcmcia_bus_type; | 35 | extern struct bus_type pcmcia_bus_type; |
30 | 36 | ||
31 | 37 | ||
32 | #define DS_SOCKET_PRESENT 0x01 | ||
33 | #define DS_SOCKET_BUSY 0x02 | ||
34 | #define DS_SOCKET_DEAD 0x80 | ||
35 | |||
36 | extern struct pcmcia_device * pcmcia_get_dev(struct pcmcia_device *p_dev); | 38 | extern struct pcmcia_device * pcmcia_get_dev(struct pcmcia_device *p_dev); |
37 | extern void pcmcia_put_dev(struct pcmcia_device *p_dev); | 39 | extern void pcmcia_put_dev(struct pcmcia_device *p_dev); |
38 | 40 | ||
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index e8d2c95db1c9..b223f5235de7 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
@@ -404,12 +404,12 @@ static int ds_open(struct inode *inode, struct file *file) | |||
404 | return -ENODEV; | 404 | return -ENODEV; |
405 | 405 | ||
406 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { | 406 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { |
407 | if (s->state & DS_SOCKET_BUSY) { | 407 | if (s->pcmcia_state.busy) { |
408 | pcmcia_put_bus_socket(s); | 408 | pcmcia_put_bus_socket(s); |
409 | return -EBUSY; | 409 | return -EBUSY; |
410 | } | 410 | } |
411 | else | 411 | else |
412 | s->state |= DS_SOCKET_BUSY; | 412 | s->pcmcia_state.busy = 1; |
413 | } | 413 | } |
414 | 414 | ||
415 | user = kmalloc(sizeof(user_info_t), GFP_KERNEL); | 415 | user = kmalloc(sizeof(user_info_t), GFP_KERNEL); |
@@ -424,7 +424,7 @@ static int ds_open(struct inode *inode, struct file *file) | |||
424 | s->user = user; | 424 | s->user = user; |
425 | file->private_data = user; | 425 | file->private_data = user; |
426 | 426 | ||
427 | if (s->state & DS_SOCKET_PRESENT) | 427 | if (s->pcmcia_state.present) |
428 | queue_event(user, CS_EVENT_CARD_INSERTION); | 428 | queue_event(user, CS_EVENT_CARD_INSERTION); |
429 | return 0; | 429 | return 0; |
430 | } /* ds_open */ | 430 | } /* ds_open */ |
@@ -446,7 +446,7 @@ static int ds_release(struct inode *inode, struct file *file) | |||
446 | 446 | ||
447 | /* Unlink user data structure */ | 447 | /* Unlink user data structure */ |
448 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { | 448 | if ((file->f_flags & O_ACCMODE) != O_RDONLY) { |
449 | s->state &= ~DS_SOCKET_BUSY; | 449 | s->pcmcia_state.busy = 0; |
450 | } | 450 | } |
451 | file->private_data = NULL; | 451 | file->private_data = NULL; |
452 | for (link = &s->user; *link; link = &(*link)->next) | 452 | for (link = &s->user; *link; link = &(*link)->next) |
@@ -480,7 +480,7 @@ static ssize_t ds_read(struct file *file, char __user *buf, | |||
480 | return -EIO; | 480 | return -EIO; |
481 | 481 | ||
482 | s = user->socket; | 482 | s = user->socket; |
483 | if (s->state & DS_SOCKET_DEAD) | 483 | if (s->pcmcia_state.dead) |
484 | return -EIO; | 484 | return -EIO; |
485 | 485 | ||
486 | ret = wait_event_interruptible(s->queue, !queue_empty(user)); | 486 | ret = wait_event_interruptible(s->queue, !queue_empty(user)); |
@@ -550,7 +550,7 @@ static int ds_ioctl(struct inode * inode, struct file * file, | |||
550 | return -EIO; | 550 | return -EIO; |
551 | 551 | ||
552 | s = user->socket; | 552 | s = user->socket; |
553 | if (s->state & DS_SOCKET_DEAD) | 553 | if (s->pcmcia_state.dead) |
554 | return -EIO; | 554 | return -EIO; |
555 | 555 | ||
556 | size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT; | 556 | size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT; |