};
 MODULE_DEVICE_TABLE(pci, atl1_pci_tbl);
 
+static const u32 atl1_default_msg = NETIF_MSG_DRV | NETIF_MSG_PROBE |
+       NETIF_MSG_LINK | NETIF_MSG_TIMER | NETIF_MSG_IFDOWN | NETIF_MSG_IFUP;
+
+static int debug = -1;
+module_param(debug, int, 0);
+MODULE_PARM_DESC(debug, "Message level (0=none,...,16=all)");
+
 /*
  * atl1_sw_init - Initialize general software structures (struct atl1_adapter)
  * @adapter: board private structure to initialize
        size = sizeof(struct atl1_buffer) * (tpd_ring->count + rfd_ring->count);
        tpd_ring->buffer_info = kzalloc(size, GFP_KERNEL);
        if (unlikely(!tpd_ring->buffer_info)) {
-               dev_err(&pdev->dev, "kzalloc failed , size = D%d\n", size);
+               if (netif_msg_drv(adapter))
+                       dev_err(&pdev->dev, "kzalloc failed , size = D%d\n",
+                               size);
                goto err_nomem;
        }
        rfd_ring->buffer_info =
        ring_header->desc = pci_alloc_consistent(pdev, ring_header->size,
                &ring_header->dma);
        if (unlikely(!ring_header->desc)) {
-               dev_err(&pdev->dev, "pci_alloc_consistent failed\n");
+               if (netif_msg_drv(adapter))
+                       dev_err(&pdev->dev, "pci_alloc_consistent failed\n");
                goto err_nomem;
        }
 
                /* link down */
                if (netif_carrier_ok(netdev)) {
                        /* old link state: Up */
-                       dev_info(&adapter->pdev->dev, "link is down\n");
+                       if (netif_msg_link(adapter))
+                               dev_info(&adapter->pdev->dev, "link is down\n");
                        adapter->link_speed = SPEED_0;
                        netif_carrier_off(netdev);
                        netif_stop_queue(netdev);
                        adapter->link_speed = speed;
                        adapter->link_duplex = duplex;
                        atl1_setup_mac_ctrl(adapter);
-                       dev_info(&adapter->pdev->dev,
-                               "%s link is up %d Mbps %s\n",
-                               netdev->name, adapter->link_speed,
-                               adapter->link_duplex == FULL_DUPLEX ?
-                               "full duplex" : "half duplex");
+                       if (netif_msg_link(adapter))
+                               dev_info(&adapter->pdev->dev,
+                                       "%s link is up %d Mbps %s\n",
+                                       netdev->name, adapter->link_speed,
+                                       adapter->link_duplex == FULL_DUPLEX ?
+                                       "full duplex" : "half duplex");
                }
                if (!netif_carrier_ok(netdev)) {
                        /* Link down -> Up */
 
        if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
            (max_frame > MAX_JUMBO_FRAME_SIZE)) {
-               dev_warn(&adapter->pdev->dev, "invalid MTU setting\n");
+               if (netif_msg_link(adapter))
+                       dev_warn(&adapter->pdev->dev, "invalid MTU setting\n");
                return -EINVAL;
        }
 
                if (rrd->err_flg & (ERR_FLAG_CRC | ERR_FLAG_TRUNC |
                                        ERR_FLAG_CODE | ERR_FLAG_OV)) {
                        adapter->hw_csum_err++;
-                       dev_printk(KERN_DEBUG, &pdev->dev,
-                               "rx checksum error\n");
+                       if (netif_msg_rx_err(adapter))
+                               dev_printk(KERN_DEBUG, &pdev->dev,
+                                       "rx checksum error\n");
                        return;
                }
        }
        }
 
        /* IPv4, but hardware thinks its checksum is wrong */
-       dev_printk(KERN_DEBUG, &pdev->dev,
-               "hw csum wrong, pkt_flag:%x, err_flag:%x\n",
-               rrd->pkt_flg, rrd->err_flg);
+       if (netif_msg_rx_err(adapter))
+               dev_printk(KERN_DEBUG, &pdev->dev,
+                       "hw csum wrong, pkt_flag:%x, err_flag:%x\n",
+                       rrd->pkt_flg, rrd->err_flg);
        skb->ip_summed = CHECKSUM_COMPLETE;
        skb->csum = htons(rrd->xsz.xsum_sz.rx_chksum);
        adapter->hw_csum_err++;
                        /* rrd seems to be bad */
                        if (unlikely(i-- > 0)) {
                                /* rrd may not be DMAed completely */
-                               dev_printk(KERN_DEBUG, &adapter->pdev->dev,
-                                       "incomplete RRD DMA transfer\n");
+                               if (netif_msg_rx_err(adapter))
+                                       dev_printk(KERN_DEBUG,
+                                               &adapter->pdev->dev,
+                                               "unexpected RRD count\n");
                                udelay(1);
                                goto chk_rrd;
                        }
                        /* bad rrd */
-                       dev_printk(KERN_DEBUG, &adapter->pdev->dev,
-                               "bad RRD\n");
+                       if (netif_msg_rx_err(adapter))
+                               dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+                                       "bad RRD\n");
                        /* see if update RFD index */
                        if (rrd->num_buf > 1)
                                atl1_update_rfd_index(adapter, rrd);
                cso = css + (u8) skb->csum_offset;
                if (unlikely(css & 0x1)) {
                        /* L1 hardware requires an even number here */
-                       dev_printk(KERN_DEBUG, &adapter->pdev->dev,
-                               "payload offset not an even number\n");
+                       if (netif_msg_tx_err(adapter))
+                               dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+                                       "payload offset not an even number\n");
                        return -1;
                }
                ptpd->word3 |= (css & TPD_PLOADOFFSET_MASK) <<
 
        if (!spin_trylock_irqsave(&adapter->lock, flags)) {
                /* Can't get lock - tell upper layer to requeue */
-               dev_printk(KERN_DEBUG, &adapter->pdev->dev, "tx locked\n");
+               if (netif_msg_tx_queued(adapter))
+                       dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+                               "tx locked\n");
                return NETDEV_TX_LOCKED;
        }
 
                /* not enough descriptors */
                netif_stop_queue(netdev);
                spin_unlock_irqrestore(&adapter->lock, flags);
-               dev_printk(KERN_DEBUG, &adapter->pdev->dev, "tx busy\n");
+               if (netif_msg_tx_queued(adapter))
+                       dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+                               "tx busy\n");
                return NETDEV_TX_BUSY;
        }
 
 
                /* check if PCIE PHY Link down */
                if (status & ISR_PHY_LINKDOWN) {
-                       dev_printk(KERN_DEBUG, &adapter->pdev->dev,
-                               "pcie phy link down %x\n", status);
+                       if (netif_msg_intr(adapter))
+                               dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+                                       "pcie phy link down %x\n", status);
                        if (netif_running(adapter->netdev)) {   /* reset MAC */
                                iowrite32(0, adapter->hw.hw_addr + REG_IMR);
                                schedule_work(&adapter->pcie_dma_to_rst_task);
 
                /* check if DMA read/write error ? */
                if (status & (ISR_DMAR_TO_RST | ISR_DMAW_TO_RST)) {
-                       dev_printk(KERN_DEBUG, &adapter->pdev->dev,
-                               "pcie DMA r/w error (status = 0x%x)\n",
-                               status);
+                       if (netif_msg_intr(adapter))
+                               dev_printk(KERN_DEBUG, &adapter->pdev->dev,
+                                       "pcie DMA r/w error (status = 0x%x)\n",
+                                       status);
                        iowrite32(0, adapter->hw.hw_addr + REG_IMR);
                        schedule_work(&adapter->pcie_dma_to_rst_task);
                        return IRQ_HANDLED;
                        if (status & (ISR_RXF_OV | ISR_RFD_UNRUN |
                                ISR_RRD_OV | ISR_HOST_RFD_UNRUN |
                                ISR_HOST_RRD_OV))
-                               dev_printk(KERN_DEBUG, &adapter->pdev->dev,
-                                       "rx exception, ISR = 0x%x\n", status);
+                               if (netif_msg_intr(adapter))
+                                       dev_printk(KERN_DEBUG,
+                                               &adapter->pdev->dev,
+                                               "rx exception, ISR = 0x%x\n",
+                                               status);
                        atl1_intr_rx(adapter);
                }
 
 
        err = pci_enable_msi(adapter->pdev);
        if (err) {
-               dev_info(&adapter->pdev->dev,
-                       "Unable to enable MSI: %d\n", err);
+               if (netif_msg_ifup(adapter))
+                       dev_info(&adapter->pdev->dev,
+                               "Unable to enable MSI: %d\n", err);
                irq_flags |= IRQF_SHARED;
        }
 
        adapter->netdev = netdev;
        adapter->pdev = pdev;
        adapter->hw.back = adapter;
+       adapter->msg_enable = netif_msg_init(debug, atl1_default_msg);
 
        adapter->hw.hw_addr = pci_iomap(pdev, 0, 0);
        if (!adapter->hw.hw_addr) {
        /* get device revision number */
        adapter->hw.dev_rev = ioread16(adapter->hw.hw_addr +
                (REG_MASTER_CTRL + 2));
-       dev_info(&pdev->dev, "version %s\n", ATLX_DRIVER_VERSION);
+       if (netif_msg_probe(adapter))
+               dev_info(&pdev->dev, "version %s\n", ATLX_DRIVER_VERSION);
 
        /* set default ring resource counts */
        adapter->rfd_ring.count = adapter->rrd_ring.count = ATL1_DEFAULT_RFD;
        u16 old_media_type = hw->media_type;
 
        if (netif_running(adapter->netdev)) {
-               dev_dbg(&adapter->pdev->dev, "ethtool shutting down adapter\n");
+               if (netif_msg_link(adapter))
+                       dev_dbg(&adapter->pdev->dev,
+                               "ethtool shutting down adapter\n");
                atl1_down(adapter);
        }
 
        else {
                if (ecmd->speed == SPEED_1000) {
                        if (ecmd->duplex != DUPLEX_FULL) {
-                               dev_warn(&adapter->pdev->dev,
-                                       "can't force to 1000M half duplex\n");
+                               if (netif_msg_link(adapter))
+                                       dev_warn(&adapter->pdev->dev,
+                                               "1000M half is invalid\n");
                                ret_val = -EINVAL;
                                goto exit_sset;
                        }
        }
        if (atl1_phy_setup_autoneg_adv(hw)) {
                ret_val = -EINVAL;
-               dev_warn(&adapter->pdev->dev,
-                       "invalid ethtool speed/duplex setting\n");
+               if (netif_msg_link(adapter))
+                       dev_warn(&adapter->pdev->dev,
+                               "invalid ethtool speed/duplex setting\n");
                goto exit_sset;
        }
        if (hw->media_type == MEDIA_TYPE_AUTO_SENSOR ||
                hw->media_type = old_media_type;
 
        if (netif_running(adapter->netdev)) {
-               dev_dbg(&adapter->pdev->dev, "ethtool starting adapter\n");
+               if (netif_msg_link(adapter))
+                       dev_dbg(&adapter->pdev->dev,
+                               "ethtool starting adapter\n");
                atl1_up(adapter);
        } else if (!ret_val) {
-               dev_dbg(&adapter->pdev->dev, "ethtool resetting adapter\n");
+               if (netif_msg_link(adapter))
+                       dev_dbg(&adapter->pdev->dev,
+                               "ethtool resetting adapter\n");
                atl1_reset(adapter);
        }
        return ret_val;
        return 0;
 }
 
+static u32 atl1_get_msglevel(struct net_device *netdev)
+{
+       struct atl1_adapter *adapter = netdev_priv(netdev);
+       return adapter->msg_enable;
+}
+
+static void atl1_set_msglevel(struct net_device *netdev, u32 value)
+{
+       struct atl1_adapter *adapter = netdev_priv(netdev);
+       adapter->msg_enable = value;
+}
+
 static int atl1_get_regs_len(struct net_device *netdev)
 {
        return ATL1_REG_COUNT * sizeof(u32);
        .get_drvinfo            = atl1_get_drvinfo,
        .get_wol                = atl1_get_wol,
        .set_wol                = atl1_set_wol,
+       .get_msglevel           = atl1_get_msglevel,
+       .set_msglevel           = atl1_set_msglevel,
        .get_regs_len           = atl1_get_regs_len,
        .get_regs               = atl1_get_regs,
        .get_ringparam          = atl1_get_ringparam,
 s32 atl1_reset_hw(struct atl1_hw *hw)
 {
        struct pci_dev *pdev = hw->back->pdev;
+       struct atl1_adapter *adapter = hw->back;
        u32 icr;
        int i;
 
        }
 
        if (icr) {
-               dev_dbg(&pdev->dev, "ICR = 0x%x\n", icr);
+               if (netif_msg_hw(adapter))
+                       dev_dbg(&pdev->dev, "ICR = 0x%x\n", icr);
                return icr;
        }
 
 static s32 atl1_phy_reset(struct atl1_hw *hw)
 {
        struct pci_dev *pdev = hw->back->pdev;
+       struct atl1_adapter *adapter = hw->back;
        s32 ret_val;
        u16 phy_data;
 
                u32 val;
                int i;
                /* pcie serdes link may be down! */
-               dev_dbg(&pdev->dev, "pcie phy link down\n");
+               if (netif_msg_hw(adapter))
+                       dev_dbg(&pdev->dev, "pcie phy link down\n");
 
                for (i = 0; i < 25; i++) {
                        msleep(1);
                }
 
                if ((val & (MDIO_START | MDIO_BUSY)) != 0) {
-                       dev_warn(&pdev->dev, "pcie link down at least 25ms\n");
+                       if (netif_msg_hw(adapter))
+                               dev_warn(&pdev->dev,
+                                       "pcie link down at least 25ms\n");
                        return ret_val;
                }
        }
 static s32 atl1_setup_link(struct atl1_hw *hw)
 {
        struct pci_dev *pdev = hw->back->pdev;
+       struct atl1_adapter *adapter = hw->back;
        s32 ret_val;
 
        /*
         */
        ret_val = atl1_phy_setup_autoneg_adv(hw);
        if (ret_val) {
-               dev_dbg(&pdev->dev, "error setting up autonegotiation\n");
+               if (netif_msg_link(adapter))
+                       dev_dbg(&pdev->dev,
+                               "error setting up autonegotiation\n");
                return ret_val;
        }
        /* SW.Reset , En-Auto-Neg if needed */
        ret_val = atl1_phy_reset(hw);
        if (ret_val) {
-               dev_dbg(&pdev->dev, "error resetting phy\n");
+               if (netif_msg_link(adapter))
+                       dev_dbg(&pdev->dev, "error resetting phy\n");
                return ret_val;
        }
        hw->phy_configured = true;
 s32 atl1_get_speed_and_duplex(struct atl1_hw *hw, u16 *speed, u16 *duplex)
 {
        struct pci_dev *pdev = hw->back->pdev;
+       struct atl1_adapter *adapter = hw->back;
        s32 ret_val;
        u16 phy_data;
 
                *speed = SPEED_10;
                break;
        default:
-               dev_dbg(&pdev->dev, "error getting speed\n");
+               if (netif_msg_hw(adapter))
+                       dev_dbg(&pdev->dev, "error getting speed\n");
                return ATLX_ERR_PHY_SPEED;
                break;
        }