diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-07 17:11:09 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-07 17:11:09 -0400 |
| commit | 2c32b1dab508ccaa4aea1a9d6047b65fc708e929 (patch) | |
| tree | 7a97585278a6e5d49f0b969b8047918f4f5239c2 | |
| parent | 48fe37cb53a40e13c2f9fc974f574e38d18be303 (diff) | |
| parent | 15d0a873549ef0bdeaa04dacf29a3e15de886d03 (diff) | |
Merge branch 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6
* 'urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/brodo/pcmcia-2.6:
pcmcia: fix compilation after 16bit state locking changes
pcmcia: order userspace suspend and resume requests
pcmcia: avoid pccard_validate_cis failure in resume callpath
| -rw-r--r-- | drivers/pcmcia/cs.c | 16 | ||||
| -rw-r--r-- | drivers/pcmcia/ds.c | 1 | ||||
| -rw-r--r-- | drivers/pcmcia/pcmcia_ioctl.c | 7 |
3 files changed, 11 insertions, 13 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index 75ed866e6953..c3383750e333 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
| @@ -671,20 +671,22 @@ static int pccardd(void *__skt) | |||
| 671 | socket_remove(skt); | 671 | socket_remove(skt); |
| 672 | if (sysfs_events & PCMCIA_UEVENT_INSERT) | 672 | if (sysfs_events & PCMCIA_UEVENT_INSERT) |
| 673 | socket_insert(skt); | 673 | socket_insert(skt); |
| 674 | if ((sysfs_events & PCMCIA_UEVENT_RESUME) && | ||
| 675 | !(skt->state & SOCKET_CARDBUS)) { | ||
| 676 | ret = socket_resume(skt); | ||
| 677 | if (!ret && skt->callback) | ||
| 678 | skt->callback->resume(skt); | ||
| 679 | } | ||
| 680 | if ((sysfs_events & PCMCIA_UEVENT_SUSPEND) && | 674 | if ((sysfs_events & PCMCIA_UEVENT_SUSPEND) && |
| 681 | !(skt->state & SOCKET_CARDBUS)) { | 675 | !(skt->state & SOCKET_CARDBUS)) { |
| 682 | if (skt->callback) | 676 | if (skt->callback) |
| 683 | ret = skt->callback->suspend(skt); | 677 | ret = skt->callback->suspend(skt); |
| 684 | else | 678 | else |
| 685 | ret = 0; | 679 | ret = 0; |
| 686 | if (!ret) | 680 | if (!ret) { |
| 687 | socket_suspend(skt); | 681 | socket_suspend(skt); |
| 682 | msleep(100); | ||
| 683 | } | ||
| 684 | } | ||
| 685 | if ((sysfs_events & PCMCIA_UEVENT_RESUME) && | ||
| 686 | !(skt->state & SOCKET_CARDBUS)) { | ||
| 687 | ret = socket_resume(skt); | ||
| 688 | if (!ret && skt->callback) | ||
| 689 | skt->callback->resume(skt); | ||
| 688 | } | 690 | } |
| 689 | if ((sysfs_events & PCMCIA_UEVENT_REQUERY) && | 691 | if ((sysfs_events & PCMCIA_UEVENT_REQUERY) && |
| 690 | !(skt->state & SOCKET_CARDBUS)) { | 692 | !(skt->state & SOCKET_CARDBUS)) { |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 508f94a2a78d..041eee43fd8d 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
| @@ -1283,6 +1283,7 @@ static int ds_event(struct pcmcia_socket *skt, event_t event, int priority) | |||
| 1283 | destroy_cis_cache(skt); | 1283 | destroy_cis_cache(skt); |
| 1284 | kfree(skt->fake_cis); | 1284 | kfree(skt->fake_cis); |
| 1285 | skt->fake_cis = NULL; | 1285 | skt->fake_cis = NULL; |
| 1286 | s->functions = 0; | ||
| 1286 | mutex_unlock(&s->ops_mutex); | 1287 | mutex_unlock(&s->ops_mutex); |
| 1287 | /* now, add the new card */ | 1288 | /* now, add the new card */ |
| 1288 | ds_event(skt, CS_EVENT_CARD_INSERTION, | 1289 | ds_event(skt, CS_EVENT_CARD_INSERTION, |
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 104e73d5d86c..7631faa0cadd 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
| @@ -711,7 +711,7 @@ static int ds_open(struct inode *inode, struct file *file) | |||
| 711 | warning_printed = 1; | 711 | warning_printed = 1; |
| 712 | } | 712 | } |
| 713 | 713 | ||
| 714 | if (s->pcmcia_state.present) | 714 | if (atomic_read(&s->present)) |
| 715 | queue_event(user, CS_EVENT_CARD_INSERTION); | 715 | queue_event(user, CS_EVENT_CARD_INSERTION); |
| 716 | out: | 716 | out: |
| 717 | unlock_kernel(); | 717 | unlock_kernel(); |
| @@ -770,9 +770,6 @@ static ssize_t ds_read(struct file *file, char __user *buf, | |||
| 770 | return -EIO; | 770 | return -EIO; |
| 771 | 771 | ||
| 772 | s = user->socket; | 772 | s = user->socket; |
| 773 | if (s->pcmcia_state.dead) | ||
| 774 | return -EIO; | ||
| 775 | |||
| 776 | ret = wait_event_interruptible(s->queue, !queue_empty(user)); | 773 | ret = wait_event_interruptible(s->queue, !queue_empty(user)); |
| 777 | if (ret == 0) | 774 | if (ret == 0) |
| 778 | ret = put_user(get_queued_event(user), (int __user *)buf) ? -EFAULT : 4; | 775 | ret = put_user(get_queued_event(user), (int __user *)buf) ? -EFAULT : 4; |
| @@ -838,8 +835,6 @@ static int ds_ioctl(struct inode *inode, struct file *file, | |||
| 838 | return -EIO; | 835 | return -EIO; |
| 839 | 836 | ||
| 840 | s = user->socket; | 837 | s = user->socket; |
| 841 | if (s->pcmcia_state.dead) | ||
| 842 | return -EIO; | ||
| 843 | 838 | ||
| 844 | size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT; | 839 | size = (cmd & IOCSIZE_MASK) >> IOCSIZE_SHIFT; |
| 845 | if (size > sizeof(ds_ioctl_arg_t)) | 840 | if (size > sizeof(ds_ioctl_arg_t)) |
