#error "Invalid CPU frequency - must be multiple of 12!"
 #endif
 
-#define CFG_HZ                  (CFG_MHZ * 1000000) /* FIXME causes overflow in net.c */
+#define CFG_MIPS_TIMER_FREQ    (CFG_MHZ * 1000000)
+
+#define CFG_HZ                 1000
 
 #define CFG_SDRAM_BASE         0x80000000     /* Cached addr */
 
 
 
 #define CFG_MHZ                        500
 
-#define CFG_HZ                 (CFG_MHZ * 1000000) /* FIXME causes overflow in net.c */
+#define CFG_MIPS_TIMER_FREQ    (CFG_MHZ * 1000000)
+
+#define CFG_HZ                 1000
 
 #define CFG_SDRAM_BASE         0x80000000     /* Cached addr */
 
 
 
 #define CFG_BOOTPARAMS_LEN     128*1024
 
-#define CFG_HZ                 (incaip_get_cpuclk() / 2)
+#define CFG_MIPS_TIMER_FREQ    (incaip_get_cpuclk() / 2)
+
+#define CFG_HZ                 1000
 
 #define CFG_SDRAM_BASE         0x80000000
 
 
 
 #define CFG_BOOTPARAMS_LEN     128*1024
 
-#define CFG_HZ                 396000000      /* FIXME causes overflow in net.c */
+#define CFG_MIPS_TIMER_FREQ    396000000
+
+#define CFG_HZ                 1000
 
 #define CFG_SDRAM_BASE         0x80000000     /* Cached addr */
 
 
 #define        CFG_PROMPT              "PURPLE # "     /* Monitor Command Prompt    */
 #define        CFG_CBSIZE              256             /* Console I/O Buffer Size   */
 #define        CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16)  /* Print Buffer Size */
-#define CFG_HZ                 (CPU_CLOCK_RATE/2)
+#define CFG_MIPS_TIMER_FREQ    (CPU_CLOCK_RATE/2)
+#define CFG_HZ                 1000
 #define        CFG_MAXARGS             16              /* max number of command args*/
 
 #define        CFG_LOAD_ADDR           0x80500000      /* default load address */
 
 
 #define CFG_MHZ                        132
 
-#define CFG_HZ                 (CFG_MHZ * 1000000)
+#define CFG_MIPS_TIMER_FREQ    (CFG_MHZ * 1000000)
+
+#define CFG_HZ                 1000
 
 #define CFG_SDRAM_BASE         0x80000000      /* Cached addr */
 
 
 
 #define CFG_BOOTPARAMS_LEN     128*1024
 
-#define CFG_HZ                 (CPU_TCLOCK_RATE/4)
+#define CFG_MIPS_TIMER_FREQ    (CPU_TCLOCK_RATE/4)
+
+#define CFG_HZ                 1000
 
 #define CFG_SDRAM_BASE         0x80000000
 
 
 #include <common.h>
 #include <asm/mipsregs.h>
 
+static unsigned long timestamp;
+
+/* how many counter cycles in a jiffy */
+#define CYCLES_PER_JIFFY       (CFG_MIPS_TIMER_FREQ + CFG_HZ / 2) / CFG_HZ
+
 /*
  * timer without interrupts
  */
 
 int timer_init(void)
 {
-       write_c0_compare(0);
-       write_c0_count(0);
+       /* Set up the timer for the first expiration. */
+       timestamp = 0;
+       write_c0_compare(read_c0_count() + CYCLES_PER_JIFFY);
 
        return 0;
 }
 
 void reset_timer(void)
 {
-       write_c0_count(0);
+       timestamp = 0;
+       write_c0_compare(read_c0_count() + CYCLES_PER_JIFFY);
 }
 
 ulong get_timer(ulong base)
 {
-       return read_c0_count() - base;
+       unsigned int count;
+       unsigned int expirelo = read_c0_compare();
+
+       /* Check to see if we have missed any timestamps. */
+       count = read_c0_count();
+       while ((count - expirelo) < 0x7fffffff) {
+               expirelo += CYCLES_PER_JIFFY;
+               timestamp++;
+       }
+       write_c0_compare(expirelo);
+
+       return (timestamp - base);
 }
 
 void set_timer(ulong t)
 {
-       write_c0_count(t);
+       timestamp = t;
+       write_c0_compare(read_c0_count() + CYCLES_PER_JIFFY);
 }
 
 void udelay(unsigned long usec)
  */
 unsigned long long get_ticks(void)
 {
-       return read_c0_count();
+       return get_timer(0);
 }
 
 /*