|
@@ -29,17 +29,21 @@ static void __udelay_disabled(unsigned long long usecs)
|
|
|
{
|
|
|
unsigned long mask, cr0, cr0_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();
|
|
|
- set_clock_comparator(get_clock() + (usecs << 12));
|
|
|
__ctl_store(cr0_saved, 0, 0);
|
|
|
cr0 = (cr0_saved & 0xffff00e0) | 0x00000800;
|
|
|
__ctl_load(cr0 , 0, 0);
|
|
|
- mask = psw_kernel_bits | PSW_MASK_WAIT | PSW_MASK_EXT;
|
|
|
lockdep_off();
|
|
|
- trace_hardirqs_on();
|
|
|
- __load_psw_mask(mask);
|
|
|
- local_irq_disable();
|
|
|
+ do {
|
|
|
+ set_clock_comparator(end);
|
|
|
+ trace_hardirqs_on();
|
|
|
+ __load_psw_mask(mask);
|
|
|
+ local_irq_disable();
|
|
|
+ } while (get_clock() < end);
|
|
|
lockdep_on();
|
|
|
__ctl_load(cr0_saved, 0, 0);
|
|
|
local_tick_enable(clock_saved);
|