Re: 2.4.6-test1, PCMCIA cards require two insertions

From: Russell King (rmk@arm.linux.org.uk)
Date: Sat Aug 02 2003 - 11:33:52 EST


On Fri, Jul 25, 2003 at 01:02:42PM -0800, Christopher Swingley wrote:
> I'm running 2.6.0-test1 on an SiS based laptop with all the PCMCIA
> network and serial drivers built into the kernel. When the system boots
> with a PCMCIA cardbus card in place, the card doesn't show up. I unplug
> the card and plug it back in, and then the kernel "sees" it and it
> works. If I unplug it again, I have to go through a plug - unplug -
> plug cycle before it recognizes it. As if it only recognizes the card
> on even numbered insertion events.

Hmm, weird - I'm not seeing that behaviour here. Can you report back
with kernel messages with the following patch applied please?

--- linux/drivers/pcmcia/cs.c.old Sat Aug 2 17:25:45 2003
+++ linux/drivers/pcmcia/cs.c Sat Aug 2 17:32:49 2003
@@ -579,6 +579,7 @@
 
 static void socket_shutdown(struct pcmcia_socket *skt)
 {
+printk("socket_shutdown: skt %p\n", skt);
         socket_remove_drivers(skt);
         set_current_state(TASK_UNINTERRUPTIBLE);
         schedule_timeout(cs_to_timeout(shutdown_delay));
@@ -590,7 +591,7 @@
 static int socket_reset(struct pcmcia_socket *skt)
 {
         int status, i;
-
+printk("socket_reset: skt %p\n", skt);
         skt->socket.flags |= SS_OUTPUT_ENA | SS_RESET;
         skt->ops->set_socket(skt, &skt->socket);
         udelay((long)reset_time);
@@ -622,6 +623,7 @@
         int status, i;
 
         skt->ops->get_status(skt, &status);
+printk("socket_setup: skt %p status %08x\n", skt, status);
         if (!(status & SS_DETECT))
                 return CS_NO_CARD;
 
@@ -704,7 +706,7 @@
 static int socket_insert(struct pcmcia_socket *skt)
 {
         int ret;
-
+printk("socket_insert: skt %p\n", skt);
         if (!try_module_get(skt->owner))
                 return CS_NO_CARD;
 
@@ -728,6 +730,7 @@
 
 static int socket_suspend(struct pcmcia_socket *skt)
 {
+printk("socket_suspend: skt %p state %08x\n", skt, skt->state);
         if (skt->state & SOCKET_SUSPEND)
                 return CS_IN_USE;
 
@@ -748,7 +751,7 @@
 static int socket_resume(struct pcmcia_socket *skt)
 {
         int ret;
-
+printk("socket_resume: skt %p state %08x\n", skt, skt->state);
         if (!(skt->state & SOCKET_SUSPEND))
                 return CS_IN_USE;
 
@@ -782,6 +785,7 @@
 
 static void socket_remove(struct pcmcia_socket *skt)
 {
+printk("socket_remove: skt %p\n", skt);
         socket_shutdown(skt);
         module_put(skt->owner);
 }
@@ -808,6 +812,7 @@
                 }
 
                 skt->ops->get_status(skt, &status);
+printk("socket %p status %08x\n", skt, status);
                 if ((skt->state & SOCKET_PRESENT) &&
                      !(status & SS_DETECT))
                         socket_remove(skt);
@@ -866,6 +871,7 @@
 
 void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
 {
+printk("parse_events: socket %p thread %p events %08x\n", s, s->thread, events);
         if (s->thread) {
                 spin_lock(&s->thread_lock);
                 s->thread_events |= events;

-- 
Russell King (rmk@arm.linux.org.uk)                The developer of ARM Linux
             http://www.arm.linux.org.uk/personal/aboutme.html

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Aug 07 2003 - 22:00:19 EST