net: phy: extract pause mode
[linux-2.6-block.git] / drivers / hv / hv.c
index 6188fb7dda4245e914a7fa46515f5b9161048b67..fcc52797c16935ea47cee18af55ae61de75681d4 100644 (file)
@@ -154,7 +154,7 @@ void hv_synic_free(void)
  * retrieve the initialized message and event pages.  Otherwise, we create and
  * initialize the message and event pages.
  */
-int hv_synic_init(unsigned int cpu)
+void hv_synic_enable_regs(unsigned int cpu)
 {
        struct hv_per_cpu_context *hv_cpu
                = per_cpu_ptr(hv_context.cpu_context, cpu);
@@ -196,6 +196,11 @@ int hv_synic_init(unsigned int cpu)
        sctrl.enable = 1;
 
        hv_set_synic_state(sctrl.as_uint64);
+}
+
+int hv_synic_init(unsigned int cpu)
+{
+       hv_synic_enable_regs(cpu);
 
        hv_stimer_init(cpu);
 
@@ -205,20 +210,45 @@ int hv_synic_init(unsigned int cpu)
 /*
  * hv_synic_cleanup - Cleanup routine for hv_synic_init().
  */
-int hv_synic_cleanup(unsigned int cpu)
+void hv_synic_disable_regs(unsigned int cpu)
 {
        union hv_synic_sint shared_sint;
        union hv_synic_simp simp;
        union hv_synic_siefp siefp;
        union hv_synic_scontrol sctrl;
+
+       hv_get_synint_state(VMBUS_MESSAGE_SINT, shared_sint.as_uint64);
+
+       shared_sint.masked = 1;
+
+       /* Need to correctly cleanup in the case of SMP!!! */
+       /* Disable the interrupt */
+       hv_set_synint_state(VMBUS_MESSAGE_SINT, shared_sint.as_uint64);
+
+       hv_get_simp(simp.as_uint64);
+       simp.simp_enabled = 0;
+       simp.base_simp_gpa = 0;
+
+       hv_set_simp(simp.as_uint64);
+
+       hv_get_siefp(siefp.as_uint64);
+       siefp.siefp_enabled = 0;
+       siefp.base_siefp_gpa = 0;
+
+       hv_set_siefp(siefp.as_uint64);
+
+       /* Disable the global synic bit */
+       hv_get_synic_state(sctrl.as_uint64);
+       sctrl.enable = 0;
+       hv_set_synic_state(sctrl.as_uint64);
+}
+
+int hv_synic_cleanup(unsigned int cpu)
+{
        struct vmbus_channel *channel, *sc;
        bool channel_found = false;
        unsigned long flags;
 
-       hv_get_synic_state(sctrl.as_uint64);
-       if (sctrl.enable != 1)
-               return -EFAULT;
-
        /*
         * Search for channels which are bound to the CPU we're about to
         * cleanup. In case we find one and vmbus is still connected we need to
@@ -249,29 +279,7 @@ int hv_synic_cleanup(unsigned int cpu)
 
        hv_stimer_cleanup(cpu);
 
-       hv_get_synint_state(VMBUS_MESSAGE_SINT, shared_sint.as_uint64);
-
-       shared_sint.masked = 1;
-
-       /* Need to correctly cleanup in the case of SMP!!! */
-       /* Disable the interrupt */
-       hv_set_synint_state(VMBUS_MESSAGE_SINT, shared_sint.as_uint64);
-
-       hv_get_simp(simp.as_uint64);
-       simp.simp_enabled = 0;
-       simp.base_simp_gpa = 0;
-
-       hv_set_simp(simp.as_uint64);
-
-       hv_get_siefp(siefp.as_uint64);
-       siefp.siefp_enabled = 0;
-       siefp.base_siefp_gpa = 0;
-
-       hv_set_siefp(siefp.as_uint64);
-
-       /* Disable the global synic bit */
-       sctrl.enable = 0;
-       hv_set_synic_state(sctrl.as_uint64);
+       hv_synic_disable_regs(cpu);
 
        return 0;
 }