Commit b76a1e4f authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6

* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6:
  [S390] qdio: free indicator after reset is finished
  [S390] nmi: fix clock comparator revalidation
parents 78daa87b 4814a2b3
...@@ -95,7 +95,6 @@ EXPORT_SYMBOL_GPL(s390_handle_mcck); ...@@ -95,7 +95,6 @@ EXPORT_SYMBOL_GPL(s390_handle_mcck);
static int notrace s390_revalidate_registers(struct mci *mci) static int notrace s390_revalidate_registers(struct mci *mci)
{ {
int kill_task; int kill_task;
u64 tmpclock;
u64 zero; u64 zero;
void *fpt_save_area, *fpt_creg_save_area; void *fpt_save_area, *fpt_creg_save_area;
...@@ -214,11 +213,10 @@ static int notrace s390_revalidate_registers(struct mci *mci) ...@@ -214,11 +213,10 @@ static int notrace s390_revalidate_registers(struct mci *mci)
: "0", "cc"); : "0", "cc");
#endif #endif
/* Revalidate clock comparator register */ /* Revalidate clock comparator register */
asm volatile( if (S390_lowcore.clock_comparator == -1)
" stck 0(%1)\n" set_clock_comparator(S390_lowcore.mcck_clock);
" sckc 0(%1)" else
: "=m" (tmpclock) : "a" (&(tmpclock)) : "cc", "memory"); set_clock_comparator(S390_lowcore.clock_comparator);
/* Check if old PSW is valid */ /* Check if old PSW is valid */
if (!mci->wp) if (!mci->wp)
/* /*
......
...@@ -29,17 +29,21 @@ static void __udelay_disabled(unsigned long long usecs) ...@@ -29,17 +29,21 @@ static void __udelay_disabled(unsigned long long usecs)
{ {
unsigned long mask, cr0, cr0_saved; unsigned long mask, cr0, cr0_saved;
u64 clock_saved; u64 clock_saved;
u64 end;
mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT;
end = get_clock() + (usecs << 12);
clock_saved = local_tick_disable(); clock_saved = local_tick_disable();
set_clock_comparator(get_clock() + (usecs << 12));
__ctl_store(cr0_saved, 0, 0); __ctl_store(cr0_saved, 0, 0);
cr0 = (cr0_saved & 0xffff00e0) | 0x00000800; cr0 = (cr0_saved & 0xffff00e0) | 0x00000800;
__ctl_load(cr0 , 0, 0); __ctl_load(cr0 , 0, 0);
mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT;
lockdep_off(); lockdep_off();
trace_hardirqs_on(); do {
__load_psw_mask(mask); set_clock_comparator(end);
local_irq_disable(); trace_hardirqs_on();
__load_psw_mask(mask);
local_irq_disable();
} while (get_clock() < end);
lockdep_on(); lockdep_on();
__ctl_load(cr0_saved, 0, 0); __ctl_load(cr0_saved, 0, 0);
local_tick_enable(clock_saved); local_tick_enable(clock_saved);
......
...@@ -292,8 +292,8 @@ void qdio_shutdown_thinint(struct qdio_irq *irq_ptr) ...@@ -292,8 +292,8 @@ void qdio_shutdown_thinint(struct qdio_irq *irq_ptr)
return; return;
/* reset adapter interrupt indicators */ /* reset adapter interrupt indicators */
put_indicator(irq_ptr->dsci);
set_subchannel_ind(irq_ptr, 1); set_subchannel_ind(irq_ptr, 1);
put_indicator(irq_ptr->dsci);
} }
void __exit tiqdio_unregister_thinints(void) void __exit tiqdio_unregister_thinints(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment