#define DM9000_TIMER_WUT  jiffies+(HZ*2)       /* timer wakeup time : 2 second */
 
-#define DM9000_DEBUG 0
-
-#if DM9000_DEBUG > 2
-#define PRINTK3(args...)  printk(CARDNAME ": " args)
-#else
-#define PRINTK3(args...)  do { } while(0)
-#endif
-
-#if DM9000_DEBUG > 1
-#define PRINTK2(args...)  printk(CARDNAME ": " args)
-#else
-#define PRINTK2(args...)  do { } while(0)
-#endif
-
-#if DM9000_DEBUG > 0
-#define PRINTK1(args...)  printk(CARDNAME ": " args)
-#define PRINTK(args...)   printk(CARDNAME ": " args)
-#else
-#define PRINTK1(args...)  do { } while(0)
-#define PRINTK(args...)   printk(KERN_DEBUG args)
-#endif
-
 #ifdef CONFIG_BLACKFIN
 #define readsb insb
 #define readsw insw
        u8 phy_addr;
        unsigned int flags;
 
+       int debug_level;
+
        void (*inblk)(void __iomem *port, void *data, int length);
        void (*outblk)(void __iomem *port, void *data, int length);
        void (*dumpblk)(void __iomem *port, int length);
        u32 msg_enable;
 } board_info_t;
 
+/* debug code */
+
+#define dm9000_dbg(db, lev, msg...) do {               \
+       if ((lev) < CONFIG_DM9000_DEBUGLEVEL &&         \
+           (lev) < db->debug_level) {                  \
+               dev_dbg(db->dev, msg);                  \
+       }                                               \
+} while (0)
+
 /* function declaration ------------------------------------- */
 static int dm9000_probe(struct platform_device *);
 static int dm9000_open(struct net_device *);
 {
        board_info_t *db = (board_info_t *) dev->priv;
 
-       PRINTK1("entering %s\n",__FUNCTION__);
+       dm9000_dbg(db, 1, "entering %s\n", __func__);
 
        /* I/O mode */
        db->io_mode = ior(db, DM9000_ISR) >> 6; /* ISR bit7:6 keeps I/O mode */
        unsigned long flags;
        board_info_t *db = (board_info_t *) dev->priv;
 
-       PRINTK3("dm9000_start_xmit\n");
+       dm9000_dbg(db, 3, "%s:\n", __func__);
 
        if (db->tx_pkt_cnt > 1)
                return 1;
 {
        board_info_t *db = (board_info_t *) ndev->priv;
 
-       PRINTK1("entering %s\n",__FUNCTION__);
+       dm9000_dbg(db, 1, "entering %s\n", __func__);
 
        /* deleted timer */
        del_timer(&db->timer);
 dm9000_interrupt(int irq, void *dev_id)
 {
        struct net_device *dev = dev_id;
-       board_info_t *db;
+       board_info_t *db = (board_info_t *) dev->priv;
        int int_status;
        u8 reg_save;
 
-       PRINTK3("entering %s\n",__FUNCTION__);
-
-       if (!dev) {
-               PRINTK1("dm9000_interrupt() without DEVICE arg\n");
-               return IRQ_HANDLED;
-       }
+       dm9000_dbg(db, 3, "entering %s\n", __func__);
 
        /* A real interrupt coming */
-       db = (board_info_t *) dev->priv;
+
        spin_lock(&db->lock);
 
        /* Save previous register address */
        struct net_device *dev = (struct net_device *) data;
        board_info_t *db = (board_info_t *) dev->priv;
 
-       PRINTK3("dm9000_timer()\n");
+       dm9000_dbg(db, 3, "entering %s\n", __func__);
 
        mii_check_media(&db->mii, netif_msg_link(db), 0);
 
        u16 i, oft, hash_table[4];
        unsigned long flags;
 
-       PRINTK2("dm9000_hash_table()\n");
+       dm9000_dbg(db, 1, "entering %s\n", __func__);
 
        spin_lock_irqsave(&db->lock,flags);