diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2007-07-18 02:12:20 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-07-18 04:20:09 -0400 |
commit | 8a2950cce6c8fa29bcbf6a3b33a63e0e68337f0e (patch) | |
tree | d7692cd45035a78e7968a2fb23865ec4b8c95892 /arch/sparc64 | |
parent | 6160f63518406485c7009cb0f2e1588ea3abccc1 (diff) |
[SPARC64]: Handle LDC resets properly in domain-services driver.
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>
Diffstat (limited to 'arch/sparc64')
-rw-r--r-- | arch/sparc64/kernel/ds.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/sparc64/kernel/ds.c b/arch/sparc64/kernel/ds.c index ba01533f4e03..fa1f04d756a2 100644 --- a/arch/sparc64/kernel/ds.c +++ b/arch/sparc64/kernel/ds.c | |||
@@ -1013,6 +1013,19 @@ static void ds_up(struct ds_info *dp) | |||
1013 | dp->hs_state = DS_HS_START; | 1013 | dp->hs_state = DS_HS_START; |
1014 | } | 1014 | } |
1015 | 1015 | ||
1016 | static void ds_reset(struct ds_info *dp) | ||
1017 | { | ||
1018 | int i; | ||
1019 | |||
1020 | dp->hs_state = 0; | ||
1021 | |||
1022 | for (i = 0; i < ARRAY_SIZE(ds_states); i++) { | ||
1023 | struct ds_cap_state *cp = &ds_states[i]; | ||
1024 | |||
1025 | cp->state = CAP_STATE_UNKNOWN; | ||
1026 | } | ||
1027 | } | ||
1028 | |||
1016 | static void ds_event(void *arg, int event) | 1029 | static void ds_event(void *arg, int event) |
1017 | { | 1030 | { |
1018 | struct ds_info *dp = arg; | 1031 | struct ds_info *dp = arg; |
@@ -1028,6 +1041,12 @@ static void ds_event(void *arg, int event) | |||
1028 | return; | 1041 | return; |
1029 | } | 1042 | } |
1030 | 1043 | ||
1044 | if (event == LDC_EVENT_RESET) { | ||
1045 | ds_reset(dp); | ||
1046 | spin_unlock_irqrestore(&ds_lock, flags); | ||
1047 | return; | ||
1048 | } | ||
1049 | |||
1031 | if (event != LDC_EVENT_DATA_READY) { | 1050 | if (event != LDC_EVENT_DATA_READY) { |
1032 | printk(KERN_WARNING PFX "Unexpected LDC event %d\n", event); | 1051 | printk(KERN_WARNING PFX "Unexpected LDC event %d\n", event); |
1033 | spin_unlock_irqrestore(&ds_lock, flags); | 1052 | spin_unlock_irqrestore(&ds_lock, flags); |