[SPARC64]: Handle LDC resets properly in domain-services driver.
authorDavid S. Miller <davem@sunset.davemloft.net>
Wed, 18 Jul 2007 06:12:20 +0000 (23:12 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Wed, 18 Jul 2007 08:20:09 +0000 (01:20 -0700)
Reset the handshake and per-capability state so that when the
link comes back up we'll renegotiate the DS version and then
reregister all of the services.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/ds.c

index ba01533..fa1f04d 100644 (file)
@@ -1013,6 +1013,19 @@ static void ds_up(struct ds_info *dp)
                dp->hs_state = DS_HS_START;
 }
 
+static void ds_reset(struct ds_info *dp)
+{
+       int i;
+
+       dp->hs_state = 0;
+
+       for (i = 0; i < ARRAY_SIZE(ds_states); i++) {
+               struct ds_cap_state *cp = &ds_states[i];
+
+               cp->state = CAP_STATE_UNKNOWN;
+       }
+}
+
 static void ds_event(void *arg, int event)
 {
        struct ds_info *dp = arg;
@@ -1028,6 +1041,12 @@ static void ds_event(void *arg, int event)
                return;
        }
 
+       if (event == LDC_EVENT_RESET) {
+               ds_reset(dp);
+               spin_unlock_irqrestore(&ds_lock, flags);
+               return;
+       }
+
        if (event != LDC_EVENT_DATA_READY) {
                printk(KERN_WARNING PFX "Unexpected LDC event %d\n", event);
                spin_unlock_irqrestore(&ds_lock, flags);