diff options
Diffstat (limited to 'drivers/pcmcia/cs.c')
| -rw-r--r-- | drivers/pcmcia/cs.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index c3b615c94b4b..8c8caec3a72c 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c @@ -452,17 +452,20 @@ static int socket_insert(struct pcmcia_socket *skt)  static int socket_suspend(struct pcmcia_socket *skt)  { -	if (skt->state & SOCKET_SUSPEND) +	if ((skt->state & SOCKET_SUSPEND) && !(skt->state & SOCKET_IN_RESUME))  		return -EBUSY;  	mutex_lock(&skt->ops_mutex); -	skt->suspended_state = skt->state; +	/* store state on first suspend, but not after spurious wakeups */ +	if (!(skt->state & SOCKET_IN_RESUME)) +		skt->suspended_state = skt->state;  	skt->socket = dead_socket;  	skt->ops->set_socket(skt, &skt->socket);  	if (skt->ops->suspend)  		skt->ops->suspend(skt);  	skt->state |= SOCKET_SUSPEND; +	skt->state &= ~SOCKET_IN_RESUME;  	mutex_unlock(&skt->ops_mutex);  	return 0;  } @@ -475,6 +478,7 @@ static int socket_early_resume(struct pcmcia_socket *skt)  	skt->ops->set_socket(skt, &skt->socket);  	if (skt->state & SOCKET_PRESENT)  		skt->resume_status = socket_setup(skt, resume_delay); +	skt->state |= SOCKET_IN_RESUME;  	mutex_unlock(&skt->ops_mutex);  	return 0;  } @@ -484,7 +488,7 @@ static int socket_late_resume(struct pcmcia_socket *skt)  	int ret = 0;  	mutex_lock(&skt->ops_mutex); -	skt->state &= ~SOCKET_SUSPEND; +	skt->state &= ~(SOCKET_SUSPEND | SOCKET_IN_RESUME);  	mutex_unlock(&skt->ops_mutex);  	if (!(skt->state & SOCKET_PRESENT)) {  | 
