]> nv-tegra.nvidia Code Review - linux-3.10.git/blobdiff - drivers/net/tulip/de2104x.c
net: remove interrupt.h inclusion from netdevice.h
[linux-3.10.git] / drivers / net / tulip / de2104x.c
index 9d67f11422ec5ed8317eb477eb3d1f524b034528..ce90efc6ba3c4bdb44f633a2609425cb534d7427 100644 (file)
@@ -27,6 +27,8 @@
 
  */
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #define DRV_NAME               "de2104x"
 #define DRV_VERSION            "0.7"
 #define DRV_RELDATE            "Mar 17, 2004"
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/init.h>
+#include <linux/interrupt.h>
 #include <linux/pci.h>
 #include <linux/delay.h>
 #include <linux/ethtool.h>
 #include <linux/compiler.h>
 #include <linux/rtnetlink.h>
 #include <linux/crc32.h>
+#include <linux/slab.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
@@ -50,7 +54,7 @@
 
 /* These identify the driver base version and may not be removed. */
 static char version[] =
-KERN_INFO DRV_NAME " PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE ")\n";
+"PCI Ethernet driver v" DRV_VERSION " (" DRV_RELDATE ")";
 
 MODULE_AUTHOR("Jeff Garzik <jgarzik@pobox.com>");
 MODULE_DESCRIPTION("Intel/Digital 21040/1 series PCI Ethernet driver");
@@ -62,9 +66,9 @@ module_param (debug, int, 0);
 MODULE_PARM_DESC (debug, "de2104x bitmapped message enable number");
 
 /* Set the copy breakpoint for the copy-only-tiny-buffer Rx structure. */
-#if defined(__alpha__) || defined(__arm__) || defined(__hppa__) \
-        || defined(__sparc_) || defined(__ia64__) \
-        || defined(__sh__) || defined(__mips__)
+#if defined(__alpha__) || defined(__arm__) || defined(__hppa__) || \
+        defined(CONFIG_SPARC) || defined(__ia64__) ||             \
+        defined(__sh__) || defined(__mips__)
 static int rx_copybreak = 1518;
 #else
 static int rx_copybreak = 100;
@@ -72,8 +76,6 @@ static int rx_copybreak = 100;
 module_param (rx_copybreak, int, 0);
 MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copied");
 
-#define PFX                    DRV_NAME ": "
-
 #define DE_DEF_MSG_ENABLE      (NETIF_MSG_DRV          | \
                                 NETIF_MSG_PROBE        | \
                                 NETIF_MSG_LINK         | \
@@ -82,6 +84,13 @@ MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copi
                                 NETIF_MSG_RX_ERR       | \
                                 NETIF_MSG_TX_ERR)
 
+/* Descriptor skip length in 32 bit longwords. */
+#ifndef CONFIG_DE2104X_DSL
+#define DSL                    0
+#else
+#define DSL                    CONFIG_DE2104X_DSL
+#endif
+
 #define DE_RX_RING_SIZE                64
 #define DE_TX_RING_SIZE                64
 #define DE_RING_BYTES          \
@@ -124,8 +133,6 @@ MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copi
 /* Time in jiffies before concluding the transmitter is hung. */
 #define TX_TIMEOUT             (6*HZ)
 
-#define DE_UNALIGNED_16(a)     (u16)(get_unaligned((u16 *)(a)))
-
 /* This is a mysterious value that can be written to CSR11 in the 21040 (only)
    to support a pre-NWay full-duplex signaling mechanism using short frames.
    No one knows what it should be, but if left at its default value some
@@ -155,6 +162,7 @@ enum {
        CmdReset                = (1 << 0),
        CacheAlign16            = 0x00008000,
        BurstLen4               = 0x00000400,
+       DescSkipLen             = (DSL << 2),
 
        /* Rx/TxPoll bits */
        NormalTxPoll            = (1 << 0),
@@ -236,6 +244,7 @@ enum {
        NWayState               = (1 << 14) | (1 << 13) | (1 << 12),
        NWayRestart             = (1 << 12),
        NonselPortActive        = (1 << 9),
+       SelPortActive           = (1 << 8),
        LinkFailStatus          = (1 << 2),
        NetCxnErr               = (1 << 1),
 };
@@ -248,26 +257,29 @@ static const u32 de_intr_mask =
  * Set the programmable burst length to 4 longwords for all:
  * DMA errors result without these values. Cache align 16 long.
  */
-static const u32 de_bus_mode = CacheAlign16 | BurstLen4;
+static const u32 de_bus_mode = CacheAlign16 | BurstLen4 | DescSkipLen;
 
 struct de_srom_media_block {
        u8                      opts;
        u16                     csr13;
        u16                     csr14;
        u16                     csr15;
-} __attribute__((packed));
+} __packed;
 
 struct de_srom_info_leaf {
        u16                     default_media;
        u8                      n_blocks;
        u8                      unused;
-} __attribute__((packed));
+} __packed;
 
 struct de_desc {
-       u32                     opts1;
-       u32                     opts2;
-       u32                     addr1;
-       u32                     addr2;
+       __le32                  opts1;
+       __le32                  opts2;
+       __le32                  addr1;
+       __le32                  addr2;
+#if DSL
+       __le32                  skip[DSL];
+#endif
 };
 
 struct media_info {
@@ -328,7 +340,7 @@ static void de21041_media_timer (unsigned long data);
 static unsigned int de_ok_to_advertise (struct de_private *de, u32 new_media);
 
 
-static struct pci_device_id de_pci_tbl[] = {
+static DEFINE_PCI_DEVICE_TABLE(de_pci_tbl) = {
        { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP,
          PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 },
        { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TULIP_PLUS,
@@ -353,29 +365,29 @@ static u16 t21040_csr15[] = { 0, 0, 0x0006, 0x0000, 0x0000, };
 
 /* 21041 transceiver register settings: TP AUTO, BNC, AUI, TP, TP FD*/
 static u16 t21041_csr13[] = { 0xEF01, 0xEF09, 0xEF09, 0xEF01, 0xEF09, };
-static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x6F3F, 0x6F3D, };
+static u16 t21041_csr14[] = { 0xFFFF, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, };
+/* If on-chip autonegotiation is broken, use half-duplex (FF3F) instead */
+static u16 t21041_csr14_brk[] = { 0xFF3F, 0xF7FD, 0xF7FD, 0x7F3F, 0x7F3D, };
 static u16 t21041_csr15[] = { 0x0008, 0x0006, 0x000E, 0x0008, 0x0008, };
 
 
-#define dr32(reg)              readl(de->regs + (reg))
-#define dw32(reg,val)          writel((val), de->regs + (reg))
+#define dr32(reg)      ioread32(de->regs + (reg))
+#define dw32(reg, val) iowrite32((val), de->regs + (reg))
 
 
 static void de_rx_err_acct (struct de_private *de, unsigned rx_tail,
                            u32 status, u32 len)
 {
-       if (netif_msg_rx_err (de))
-               printk (KERN_DEBUG
-                       "%s: rx err, slot %d status 0x%x len %d\n",
-                       de->dev->name, rx_tail, status, len);
+       netif_dbg(de, rx_err, de->dev,
+                 "rx err, slot %d status 0x%x len %d\n",
+                 rx_tail, status, len);
 
        if ((status & 0x38000300) != 0x0300) {
                /* Ingore earlier buffers. */
                if ((status & 0xffff) != 0x7fff) {
-                       if (netif_msg_rx_err(de))
-                               printk(KERN_WARNING "%s: Oversized Ethernet frame "
-                                          "spanned multiple buffers, status %8.8x!\n",
-                                          de->dev->name, status);
+                       netif_warn(de, rx_err, de->dev,
+                                  "Oversized Ethernet frame spanned multiple buffers, status %08x!\n",
+                                  status);
                        de->net_stats.rx_length_errors++;
                }
        } else if (status & RxError) {
@@ -394,7 +406,7 @@ static void de_rx (struct de_private *de)
        unsigned drop = 0;
        int rc;
 
-       while (rx_work--) {
+       while (--rx_work) {
                u32 status, len;
                dma_addr_t mapping;
                struct sk_buff *skb, *copy_skb;
@@ -422,10 +434,9 @@ static void de_rx (struct de_private *de)
 
                copying_skb = (len <= rx_copybreak);
 
-               if (unlikely(netif_msg_rx_status(de)))
-                       printk(KERN_DEBUG "%s: rx slot %d status 0x%x len %d copying? %d\n",
-                              de->dev->name, rx_tail, status, len,
-                              copying_skb);
+               netif_dbg(de, rx_status, de->dev,
+                         "rx slot %d status 0x%x len %d copying? %d\n",
+                         rx_tail, status, len, copying_skb);
 
                buflen = copying_skb ? (len + RX_OFFSET) : de->rx_buf_sz;
                copy_skb = dev_alloc_skb (buflen);
@@ -435,7 +446,6 @@ static void de_rx (struct de_private *de)
                        rx_work = 100;
                        goto rx_next;
                }
-               copy_skb->dev = de->dev;
 
                if (!copying_skb) {
                        pci_unmap_single(de->pdev, mapping,
@@ -450,8 +460,8 @@ static void de_rx (struct de_private *de)
                } else {
                        pci_dma_sync_single_for_cpu(de->pdev, mapping, len, PCI_DMA_FROMDEVICE);
                        skb_reserve(copy_skb, RX_OFFSET);
-                       memcpy(skb_put(copy_skb, len), skb->data, len);
-
+                       skb_copy_from_linear_data(skb, skb_put(copy_skb, len),
+                                                 len);
                        pci_dma_sync_single_for_device(de->pdev, mapping, len, PCI_DMA_FROMDEVICE);
 
                        /* We'll reuse the original ring buffer. */
@@ -462,24 +472,24 @@ static void de_rx (struct de_private *de)
 
                de->net_stats.rx_packets++;
                de->net_stats.rx_bytes += skb->len;
-               de->dev->last_rx = jiffies;
                rc = netif_rx (skb);
                if (rc == NET_RX_DROP)
                        drop = 1;
 
 rx_next:
-               de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
                if (rx_tail == (DE_RX_RING_SIZE - 1))
                        de->rx_ring[rx_tail].opts2 =
                                cpu_to_le32(RingEnd | de->rx_buf_sz);
                else
                        de->rx_ring[rx_tail].opts2 = cpu_to_le32(de->rx_buf_sz);
                de->rx_ring[rx_tail].addr1 = cpu_to_le32(mapping);
+               wmb();
+               de->rx_ring[rx_tail].opts1 = cpu_to_le32(DescOwn);
                rx_tail = NEXT_RX(rx_tail);
        }
 
        if (!rx_work)
-               printk(KERN_WARNING "%s: rx work limit reached\n", de->dev->name);
+               netdev_warn(de->dev, "rx work limit reached\n");
 
        de->rx_tail = rx_tail;
 }
@@ -487,16 +497,16 @@ rx_next:
 static irqreturn_t de_interrupt (int irq, void *dev_instance)
 {
        struct net_device *dev = dev_instance;
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        u32 status;
 
        status = dr32(MacStatus);
        if ((!(status & (IntrOK|IntrErr))) || (status == 0xFFFF))
                return IRQ_NONE;
 
-       if (netif_msg_intr(de))
-               printk(KERN_DEBUG "%s: intr, status %08x mode %08x desc %u/%u/%u\n",
-                       dev->name, status, dr32(MacMode), de->rx_tail, de->tx_head, de->tx_tail);
+       netif_dbg(de, intr, dev, "intr, status %08x mode %08x desc %u/%u/%u\n",
+                 status, dr32(MacMode),
+                 de->rx_tail, de->tx_head, de->tx_tail);
 
        dw32(MacStatus, status);
 
@@ -521,8 +531,9 @@ static irqreturn_t de_interrupt (int irq, void *dev_instance)
 
                pci_read_config_word(de->pdev, PCI_STATUS, &pci_status);
                pci_write_config_word(de->pdev, PCI_STATUS, pci_status);
-               printk(KERN_ERR "%s: PCI bus error, status=%08x, PCI status=%04x\n",
-                      dev->name, status, pci_status);
+               netdev_err(de->dev,
+                          "PCI bus error, status=%08x, PCI status=%04x\n",
+                          status, pci_status);
        }
 
        return IRQ_HANDLED;
@@ -558,9 +569,9 @@ static void de_tx (struct de_private *de)
 
                if (status & LastFrag) {
                        if (status & TxError) {
-                               if (netif_msg_tx_err(de))
-                                       printk(KERN_DEBUG "%s: tx err, status 0x%x\n",
-                                              de->dev->name, status);
+                               netif_dbg(de, tx_err, de->dev,
+                                         "tx err, status 0x%x\n",
+                                         status);
                                de->net_stats.tx_errors++;
                                if (status & TxOWC)
                                        de->net_stats.tx_window_errors++;
@@ -573,8 +584,8 @@ static void de_tx (struct de_private *de)
                        } else {
                                de->net_stats.tx_packets++;
                                de->net_stats.tx_bytes += skb->len;
-                               if (netif_msg_tx_done(de))
-                                       printk(KERN_DEBUG "%s: tx done, slot %d\n", de->dev->name, tx_tail);
+                               netif_dbg(de, tx_done, de->dev,
+                                         "tx done, slot %d\n", tx_tail);
                        }
                        dev_kfree_skb_irq(skb);
                }
@@ -591,9 +602,10 @@ next:
                netif_wake_queue(de->dev);
 }
 
-static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t de_start_xmit (struct sk_buff *skb,
+                                       struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        unsigned int entry, tx_free;
        u32 mapping, len, flags = FirstFrag | LastFrag;
        struct de_desc *txd;
@@ -604,7 +616,7 @@ static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
        if (tx_free == 0) {
                netif_stop_queue(dev);
                spin_unlock_irq(&de->lock);
-               return 1;
+               return NETDEV_TX_BUSY;
        }
        tx_free--;
 
@@ -630,9 +642,8 @@ static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
        wmb();
 
        de->tx_head = NEXT_TX(entry);
-       if (netif_msg_tx_queued(de))
-               printk(KERN_DEBUG "%s: tx queued, slot %d, skblen %d\n",
-                      dev->name, entry, skb->len);
+       netif_dbg(de, tx_queued, dev, "tx queued, slot %d, skblen %d\n",
+                 entry, skb->len);
 
        if (tx_free == 0)
                netif_stop_queue(dev);
@@ -641,9 +652,8 @@ static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
 
        /* Trigger an immediate transmit demand. */
        dw32(TxPoll, NormalTxPoll);
-       dev->trans_start = jiffies;
 
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 /* Set or clear the multicast filter for this adaptor.
@@ -656,27 +666,26 @@ static int de_start_xmit (struct sk_buff *skb, struct net_device *dev)
 
 static void build_setup_frame_hash(u16 *setup_frm, struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        u16 hash_table[32];
-       struct dev_mc_list *mclist;
+       struct netdev_hw_addr *ha;
        int i;
        u16 *eaddrs;
 
        memset(hash_table, 0, sizeof(hash_table));
        set_bit_le(255, hash_table);                    /* Broadcast entry */
        /* This should work on big-endian machines as well. */
-       for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count;
-            i++, mclist = mclist->next) {
-               int index = ether_crc_le(ETH_ALEN, mclist->dmi_addr) & 0x1ff;
+       netdev_for_each_mc_addr(ha, dev) {
+               int index = ether_crc_le(ETH_ALEN, ha->addr) & 0x1ff;
 
                set_bit_le(index, hash_table);
+       }
 
-               for (i = 0; i < 32; i++) {
-                       *setup_frm++ = hash_table[i];
-                       *setup_frm++ = hash_table[i];
-               }
-               setup_frm = &de->setup_frame[13*6];
+       for (i = 0; i < 32; i++) {
+               *setup_frm++ = hash_table[i];
+               *setup_frm++ = hash_table[i];
        }
+       setup_frm = &de->setup_frame[13*6];
 
        /* Fill the final entry with our physical address. */
        eaddrs = (u16 *)dev->dev_addr;
@@ -687,22 +696,20 @@ static void build_setup_frame_hash(u16 *setup_frm, struct net_device *dev)
 
 static void build_setup_frame_perfect(u16 *setup_frm, struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
-       struct dev_mc_list *mclist;
-       int i;
+       struct de_private *de = netdev_priv(dev);
+       struct netdev_hw_addr *ha;
        u16 *eaddrs;
 
        /* We have <= 14 addresses so we can use the wonderful
           16 address perfect filtering of the Tulip. */
-       for (i = 0, mclist = dev->mc_list; i < dev->mc_count;
-            i++, mclist = mclist->next) {
-               eaddrs = (u16 *)mclist->dmi_addr;
+       netdev_for_each_mc_addr(ha, dev) {
+               eaddrs = (u16 *) ha->addr;
                *setup_frm++ = *eaddrs; *setup_frm++ = *eaddrs++;
                *setup_frm++ = *eaddrs; *setup_frm++ = *eaddrs++;
                *setup_frm++ = *eaddrs; *setup_frm++ = *eaddrs++;
        }
        /* Fill the unused entries with the broadcast address. */
-       memset(setup_frm, 0xff, (15-i)*12);
+       memset(setup_frm, 0xff, (15 - netdev_mc_count(dev)) * 12);
        setup_frm = &de->setup_frame[15*6];
 
        /* Fill the final entry with our physical address. */
@@ -715,7 +722,7 @@ static void build_setup_frame_perfect(u16 *setup_frm, struct net_device *dev)
 
 static void __de_set_rx_mode (struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        u32 macmode;
        unsigned int entry;
        u32 mapping;
@@ -729,7 +736,7 @@ static void __de_set_rx_mode (struct net_device *dev)
                goto out;
        }
 
-       if ((dev->mc_count > 1000) || (dev->flags & IFF_ALLMULTI)) {
+       if ((netdev_mc_count(dev) > 1000) || (dev->flags & IFF_ALLMULTI)) {
                /* Too many to filter well -- accept all multicasts. */
                macmode |= AcceptAllMulticast;
                goto out;
@@ -737,7 +744,7 @@ static void __de_set_rx_mode (struct net_device *dev)
 
        /* Note that only the low-address shortword of setup_frame is valid!
           The values are doubled for big-endian architectures. */
-       if (dev->mc_count > 14) /* Must use a multicast hash table. */
+       if (netdev_mc_count(dev) > 14)  /* Must use a multicast hash table. */
                build_setup_frame_hash (de->setup_frame, dev);
        else
                build_setup_frame_perfect (de->setup_frame, dev);
@@ -786,7 +793,6 @@ static void __de_set_rx_mode (struct net_device *dev)
 
        de->tx_head = NEXT_TX(entry);
 
-       BUG_ON(TX_BUFFS_AVAIL(de) < 0);
        if (TX_BUFFS_AVAIL(de) == 0)
                netif_stop_queue(dev);
 
@@ -801,7 +807,7 @@ out:
 static void de_set_rx_mode (struct net_device *dev)
 {
        unsigned long flags;
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        spin_lock_irqsave (&de->lock, flags);
        __de_set_rx_mode(dev);
@@ -825,7 +831,7 @@ static void __de_get_stats(struct de_private *de)
 
 static struct net_device_stats *de_get_stats(struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        /* The chip only need report frame silently dropped. */
        spin_lock_irq(&de->lock);
@@ -844,7 +850,7 @@ static inline int de_is_running (struct de_private *de)
 static void de_stop_rxtx (struct de_private *de)
 {
        u32 macmode;
-       unsigned int work = 1000;
+       unsigned int i = 1300/100;
 
        macmode = dr32(MacMode);
        if (macmode & RxTx) {
@@ -852,13 +858,17 @@ static void de_stop_rxtx (struct de_private *de)
                dr32(MacMode);
        }
 
-       while (--work > 0) {
+       /* wait until in-flight frame completes.
+        * Max time @ 10BT: 1500*8b/10Mbps == 1200us (+ 100us margin)
+        * Typically expect this loop to end in < 50 us on 100BT.
+        */
+       while (--i) {
                if (!de_is_running(de))
                        return;
-               cpu_relax();
+               udelay(100);
        }
 
-       printk(KERN_WARNING "%s: timeout expired stopping DMA\n", de->dev->name);
+       netdev_warn(de->dev, "timeout expired, stopping DMA\n");
 }
 
 static inline void de_start_rxtx (struct de_private *de)
@@ -892,9 +902,8 @@ static void de_link_up(struct de_private *de)
 {
        if (!netif_carrier_ok(de->dev)) {
                netif_carrier_on(de->dev);
-               if (netif_msg_link(de))
-                       printk(KERN_INFO "%s: link up, media %s\n",
-                              de->dev->name, media_name[de->media_type]);
+               netif_info(de, link, de->dev, "link up, media %s\n",
+                          media_name[de->media_type]);
        }
 }
 
@@ -902,8 +911,7 @@ static void de_link_down(struct de_private *de)
 {
        if (netif_carrier_ok(de->dev)) {
                netif_carrier_off(de->dev);
-               if (netif_msg_link(de))
-                       printk(KERN_INFO "%s: link down\n", de->dev->name);
+               netif_info(de, link, de->dev, "link down\n");
        }
 }
 
@@ -912,7 +920,8 @@ static void de_set_media (struct de_private *de)
        unsigned media = de->media_type;
        u32 macmode = dr32(MacMode);
 
-       BUG_ON(de_is_running(de));
+       if (de_is_running(de))
+               netdev_warn(de->dev, "chip is running while changing media!\n");
 
        if (de->de21040)
                dw32(CSR11, FULL_DUPLEX_MAGIC);
@@ -931,21 +940,18 @@ static void de_set_media (struct de_private *de)
        else
                macmode &= ~FullDuplex;
 
-       if (netif_msg_link(de)) {
-               printk(KERN_INFO "%s: set link %s\n"
-                      KERN_INFO "%s:    mode 0x%x, sia 0x%x,0x%x,0x%x,0x%x\n"
-                      KERN_INFO "%s:    set mode 0x%x, set sia 0x%x,0x%x,0x%x\n",
-                      de->dev->name, media_name[media],
-                      de->dev->name, dr32(MacMode), dr32(SIAStatus),
-                      dr32(CSR13), dr32(CSR14), dr32(CSR15),
-                      de->dev->name, macmode, de->media[media].csr13,
-                      de->media[media].csr14, de->media[media].csr15);
-       }
+       netif_info(de, link, de->dev, "set link %s\n", media_name[media]);
+       netif_info(de, hw, de->dev, "mode 0x%x, sia 0x%x,0x%x,0x%x,0x%x\n",
+                  dr32(MacMode), dr32(SIAStatus),
+                  dr32(CSR13), dr32(CSR14), dr32(CSR15));
+       netif_info(de, hw, de->dev, "set mode 0x%x, set sia 0x%x,0x%x,0x%x\n",
+                  macmode, de->media[media].csr13,
+                  de->media[media].csr14, de->media[media].csr15);
        if (macmode != dr32(MacMode))
                dw32(MacMode, macmode);
 }
 
-static void de_next_media (struct de_private *de, u32 *media,
+static void de_next_media (struct de_private *de, const u32 *media,
                           unsigned int n_media)
 {
        unsigned int i;
@@ -977,10 +983,8 @@ static void de21040_media_timer (unsigned long data)
                if (!netif_carrier_ok(dev))
                        de_link_up(de);
                else
-                       if (netif_msg_timer(de))
-                               printk(KERN_INFO "%s: %s link ok, status %x\n",
-                                      dev->name, media_name[de->media_type],
-                                      status);
+                       netif_info(de, timer, dev, "%s link ok, status %x\n",
+                                  media_name[de->media_type], status);
                return;
        }
 
@@ -990,10 +994,10 @@ static void de21040_media_timer (unsigned long data)
                return;
 
        if (de->media_type == DE_MEDIA_AUI) {
-               u32 next_state = DE_MEDIA_TP;
+               static const u32 next_state = DE_MEDIA_TP;
                de_next_media(de, &next_state, 1);
        } else {
-               u32 next_state = DE_MEDIA_AUI;
+               static const u32 next_state = DE_MEDIA_AUI;
                de_next_media(de, &next_state, 1);
        }
 
@@ -1007,9 +1011,8 @@ no_link_yet:
        de->media_timer.expires = jiffies + DE_TIMER_NO_LINK;
        add_timer(&de->media_timer);
 
-       if (netif_msg_timer(de))
-               printk(KERN_INFO "%s: no link, trying media %s, status %x\n",
-                      dev->name, media_name[de->media_type], status);
+       netif_info(de, timer, dev, "no link, trying media %s, status %x\n",
+                  media_name[de->media_type], status);
 }
 
 static unsigned int de_ok_to_advertise (struct de_private *de, u32 new_media)
@@ -1050,6 +1053,9 @@ static void de21041_media_timer (unsigned long data)
        unsigned int carrier;
        unsigned long flags;
 
+       /* clear port active bits */
+       dw32(SIAStatus, NonselPortActive | SelPortActive);
+
        carrier = (status & NetCxnErr) ? 0 : 1;
 
        if (carrier) {
@@ -1064,10 +1070,10 @@ static void de21041_media_timer (unsigned long data)
                if (!netif_carrier_ok(dev))
                        de_link_up(de);
                else
-                       if (netif_msg_timer(de))
-                               printk(KERN_INFO "%s: %s link ok, mode %x status %x\n",
-                                      dev->name, media_name[de->media_type],
-                                      dr32(MacMode), status);
+                       netif_info(de, timer, dev,
+                                  "%s link ok, mode %x status %x\n",
+                                  media_name[de->media_type],
+                                  dr32(MacMode), status);
                return;
        }
 
@@ -1114,13 +1120,19 @@ static void de21041_media_timer (unsigned long data)
         * simply resets the PHY and reloads the current media settings.
         */
        if (de->media_type == DE_MEDIA_AUI) {
-               u32 next_states[] = { DE_MEDIA_BNC, DE_MEDIA_TP_AUTO };
+               static const u32 next_states[] = {
+                       DE_MEDIA_BNC, DE_MEDIA_TP_AUTO
+               };
                de_next_media(de, next_states, ARRAY_SIZE(next_states));
        } else if (de->media_type == DE_MEDIA_BNC) {
-               u32 next_states[] = { DE_MEDIA_TP_AUTO, DE_MEDIA_AUI };
+               static const u32 next_states[] = {
+                       DE_MEDIA_TP_AUTO, DE_MEDIA_AUI
+               };
                de_next_media(de, next_states, ARRAY_SIZE(next_states));
        } else {
-               u32 next_states[] = { DE_MEDIA_AUI, DE_MEDIA_BNC, DE_MEDIA_TP_AUTO };
+               static const u32 next_states[] = {
+                       DE_MEDIA_AUI, DE_MEDIA_BNC, DE_MEDIA_TP_AUTO
+               };
                de_next_media(de, next_states, ARRAY_SIZE(next_states));
        }
 
@@ -1135,22 +1147,36 @@ no_link_yet:
        de->media_timer.expires = jiffies + DE_TIMER_NO_LINK;
        add_timer(&de->media_timer);
 
-       if (netif_msg_timer(de))
-               printk(KERN_INFO "%s: no link, trying media %s, status %x\n",
-                      dev->name, media_name[de->media_type], status);
+       netif_info(de, timer, dev, "no link, trying media %s, status %x\n",
+                  media_name[de->media_type], status);
 }
 
 static void de_media_interrupt (struct de_private *de, u32 status)
 {
        if (status & LinkPass) {
+               /* Ignore if current media is AUI or BNC and we can't use TP */
+               if ((de->media_type == DE_MEDIA_AUI ||
+                    de->media_type == DE_MEDIA_BNC) &&
+                   (de->media_lock ||
+                    !de_ok_to_advertise(de, DE_MEDIA_TP_AUTO)))
+                       return;
+               /* If current media is not TP, change it to TP */
+               if ((de->media_type == DE_MEDIA_AUI ||
+                    de->media_type == DE_MEDIA_BNC)) {
+                       de->media_type = DE_MEDIA_TP_AUTO;
+                       de_stop_rxtx(de);
+                       de_set_media(de);
+                       de_start_rxtx(de);
+               }
                de_link_up(de);
                mod_timer(&de->media_timer, jiffies + DE_TIMER_LINK);
                return;
        }
 
        BUG_ON(!(status & LinkFail));
-
-       if (netif_carrier_ok(de->dev)) {
+       /* Mark the link as down only if current media is TP */
+       if (netif_carrier_ok(de->dev) && de->media_type != DE_MEDIA_AUI &&
+           de->media_type != DE_MEDIA_BNC) {
                de_link_down(de);
                mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK);
        }
@@ -1214,6 +1240,7 @@ static void de_adapter_sleep (struct de_private *de)
        if (de->de21040)
                return;
 
+       dw32(CSR13, 0); /* Reset phy */
        pci_read_config_dword(de->pdev, PCIPM, &pmctl);
        pmctl |= PM_Sleep;
        pci_write_config_dword(de->pdev, PCIPM, pmctl);
@@ -1354,18 +1381,16 @@ static void de_free_rings (struct de_private *de)
 
 static int de_open (struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        int rc;
 
-       if (netif_msg_ifup(de))
-               printk(KERN_DEBUG "%s: enabling interface\n", dev->name);
+       netif_dbg(de, ifup, dev, "enabling interface\n");
 
        de->rx_buf_sz = (dev->mtu <= 1500 ? PKT_BUF_SZ : dev->mtu + 32);
 
        rc = de_alloc_rings(de);
        if (rc) {
-               printk(KERN_ERR "%s: ring allocation failure, err=%d\n",
-                      dev->name, rc);
+               netdev_err(dev, "ring allocation failure, err=%d\n", rc);
                return rc;
        }
 
@@ -1373,15 +1398,14 @@ static int de_open (struct net_device *dev)
 
        rc = request_irq(dev->irq, de_interrupt, IRQF_SHARED, dev->name, dev);
        if (rc) {
-               printk(KERN_ERR "%s: IRQ %d request failure, err=%d\n",
-                      dev->name, dev->irq, rc);
+               netdev_err(dev, "IRQ %d request failure, err=%d\n",
+                          dev->irq, rc);
                goto err_out_free;
        }
 
        rc = de_init_hw(de);
        if (rc) {
-               printk(KERN_ERR "%s: h/w init failure, err=%d\n",
-                      dev->name, rc);
+               netdev_err(dev, "h/w init failure, err=%d\n", rc);
                goto err_out_free_irq;
        }
 
@@ -1399,11 +1423,10 @@ err_out_free:
 
 static int de_close (struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        unsigned long flags;
 
-       if (netif_msg_ifdown(de))
-               printk(KERN_DEBUG "%s: disabling interface\n", dev->name);
+       netif_dbg(de, ifdown, dev, "disabling interface\n");
 
        del_timer_sync(&de->media_timer);
 
@@ -1417,17 +1440,16 @@ static int de_close (struct net_device *dev)
 
        de_free_rings(de);
        de_adapter_sleep(de);
-       pci_disable_device(de->pdev);
        return 0;
 }
 
 static void de_tx_timeout (struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
-       printk(KERN_DEBUG "%s: NIC status %08x mode %08x sia %08x desc %u/%u/%u\n",
-              dev->name, dr32(MacStatus), dr32(MacMode), dr32(SIAStatus),
-              de->rx_tail, de->tx_head, de->tx_tail);
+       netdev_dbg(dev, "NIC status %08x mode %08x sia %08x desc %u/%u/%u\n",
+                  dr32(MacStatus), dr32(MacMode), dr32(SIAStatus),
+                  de->rx_tail, de->tx_head, de->tx_tail);
 
        del_timer_sync(&de->media_timer);
 
@@ -1477,18 +1499,17 @@ static int __de_get_settings(struct de_private *de, struct ethtool_cmd *ecmd)
        switch (de->media_type) {
        case DE_MEDIA_AUI:
                ecmd->port = PORT_AUI;
-               ecmd->speed = 5;
                break;
        case DE_MEDIA_BNC:
                ecmd->port = PORT_BNC;
-               ecmd->speed = 2;
                break;
        default:
                ecmd->port = PORT_TP;
-               ecmd->speed = SPEED_10;
                break;
        }
 
+       ethtool_cmd_speed_set(ecmd, 10);
+
        if (dr32(MacMode) & FullDuplex)
                ecmd->duplex = DUPLEX_FULL;
        else
@@ -1509,9 +1530,7 @@ static int __de_set_settings(struct de_private *de, struct ethtool_cmd *ecmd)
        u32 new_media;
        unsigned int media_lock;
 
-       if (ecmd->speed != SPEED_10 && ecmd->speed != 5 && ecmd->speed != 2)
-               return -EINVAL;
-       if (de->de21040 && ecmd->speed == 2)
+       if (ethtool_cmd_speed(ecmd) != 10)
                return -EINVAL;
        if (ecmd->duplex != DUPLEX_HALF && ecmd->duplex != DUPLEX_FULL)
                return -EINVAL;
@@ -1562,19 +1581,22 @@ static int __de_set_settings(struct de_private *de, struct ethtool_cmd *ecmd)
                return 0; /* nothing to change */
 
        de_link_down(de);
+       mod_timer(&de->media_timer, jiffies + DE_TIMER_NO_LINK);
        de_stop_rxtx(de);
 
        de->media_type = new_media;
        de->media_lock = media_lock;
        de->media_advertise = ecmd->advertising;
        de_set_media(de);
+       if (netif_running(de->dev))
+               de_start_rxtx(de);
 
        return 0;
 }
 
 static void de_get_drvinfo (struct net_device *dev,struct ethtool_drvinfo *info)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        strcpy (info->driver, DRV_NAME);
        strcpy (info->version, DRV_VERSION);
@@ -1589,7 +1611,7 @@ static int de_get_regs_len(struct net_device *dev)
 
 static int de_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        int rc;
 
        spin_lock_irq(&de->lock);
@@ -1601,7 +1623,7 @@ static int de_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 
 static int de_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        int rc;
 
        spin_lock_irq(&de->lock);
@@ -1613,14 +1635,14 @@ static int de_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
 
 static u32 de_get_msglevel(struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        return de->msg_enable;
 }
 
 static void de_set_msglevel(struct net_device *dev, u32 msglvl)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        de->msg_enable = msglvl;
 }
@@ -1628,7 +1650,7 @@ static void de_set_msglevel(struct net_device *dev, u32 msglvl)
 static int de_get_eeprom(struct net_device *dev,
                         struct ethtool_eeprom *eeprom, u8 *data)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        if (!de->ee_data)
                return -EOPNOTSUPP;
@@ -1642,7 +1664,7 @@ static int de_get_eeprom(struct net_device *dev,
 
 static int de_nway_reset(struct net_device *dev)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        u32 status;
 
        if (de->media_type != DE_MEDIA_TP_AUTO)
@@ -1652,16 +1674,15 @@ static int de_nway_reset(struct net_device *dev)
 
        status = dr32(SIAStatus);
        dw32(SIAStatus, (status & ~NWayState) | NWayRestart);
-       if (netif_msg_link(de))
-               printk(KERN_INFO "%s: link nway restart, status %x,%x\n",
-                      de->dev->name, status, dr32(SIAStatus));
+       netif_info(de, link, dev, "link nway restart, status %x,%x\n",
+                  status, dr32(SIAStatus));
        return 0;
 }
 
 static void de_get_regs(struct net_device *dev, struct ethtool_regs *regs,
                        void *data)
 {
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        regs->version = (DE_REGS_VER << 2) | de->de21040;
 
@@ -1672,8 +1693,6 @@ static void de_get_regs(struct net_device *dev, struct ethtool_regs *regs,
 
 static const struct ethtool_ops de_ethtool_ops = {
        .get_link               = ethtool_op_get_link,
-       .get_tx_csum            = ethtool_op_get_tx_csum,
-       .get_sg                 = ethtool_op_get_sg,
        .get_drvinfo            = de_get_drvinfo,
        .get_regs_len           = de_get_regs_len,
        .get_settings           = de_get_settings,
@@ -1685,25 +1704,28 @@ static const struct ethtool_ops de_ethtool_ops = {
        .get_regs               = de_get_regs,
 };
 
-static void __init de21040_get_mac_address (struct de_private *de)
+static void __devinit de21040_get_mac_address (struct de_private *de)
 {
        unsigned i;
 
        dw32 (ROMCmd, 0);       /* Reset the pointer with a dummy write. */
+       udelay(5);
 
        for (i = 0; i < 6; i++) {
                int value, boguscnt = 100000;
-               do
+               do {
                        value = dr32(ROMCmd);
-               while (value < 0 && --boguscnt > 0);
+                       rmb();
+               } while (value < 0 && --boguscnt > 0);
                de->dev->dev_addr[i] = value;
                udelay(1);
                if (boguscnt <= 0)
-                       printk(KERN_WARNING PFX "timeout reading 21040 MAC address byte %u\n", i);
+                       pr_warn("timeout reading 21040 MAC address byte %u\n",
+                               i);
        }
 }
 
-static void __init de21040_get_media_info(struct de_private *de)
+static void __devinit de21040_get_media_info(struct de_private *de)
 {
        unsigned int i;
 
@@ -1765,7 +1787,7 @@ static unsigned __devinit tulip_read_eeprom(void __iomem *regs, int location, in
        return retval;
 }
 
-static void __init de21041_get_srom_info (struct de_private *de)
+static void __devinit de21041_get_srom_info (struct de_private *de)
 {
        unsigned i, sa_offset = 0, ofs;
        u8 ee_data[DE_EEPROM_SIZE + 6] = {};
@@ -1775,8 +1797,8 @@ static void __init de21041_get_srom_info (struct de_private *de)
 
        /* download entire eeprom */
        for (i = 0; i < DE_EEPROM_WORDS; i++)
-               ((u16 *)ee_data)[i] =
-                       le16_to_cpu(tulip_read_eeprom(de->regs, i, ee_addr_size));
+               ((__le16 *)ee_data)[i] =
+                       cpu_to_le16(tulip_read_eeprom(de->regs, i, ee_addr_size));
 
        /* DEC now has a specification but early board makers
           just put the address in the first EEPROM locations. */
@@ -1810,7 +1832,7 @@ static void __init de21041_get_srom_info (struct de_private *de)
                goto bad_srom;
 
        /* get default media type */
-       switch (DE_UNALIGNED_16(&il->default_media)) {
+       switch (get_unaligned(&il->default_media)) {
        case 0x0001:  de->media_type = DE_MEDIA_BNC; break;
        case 0x0002:  de->media_type = DE_MEDIA_AUI; break;
        case 0x0204:  de->media_type = DE_MEDIA_TP_FD; break;
@@ -1818,9 +1840,8 @@ static void __init de21041_get_srom_info (struct de_private *de)
        }
 
        if (netif_msg_probe(de))
-               printk(KERN_INFO "de%d: SROM leaf offset %u, default media %s\n",
-                      de->board_idx, ofs,
-                      media_name[de->media_type]);
+               pr_info("de%d: SROM leaf offset %u, default media %s\n",
+                      de->board_idx, ofs, media_name[de->media_type]);
 
        /* init SIA register values to defaults */
        for (i = 0; i < DE_MAX_MEDIA; i++) {
@@ -1867,27 +1888,29 @@ static void __init de21041_get_srom_info (struct de_private *de)
                de->media[idx].type = idx;
 
                if (netif_msg_probe(de))
-                       printk(KERN_INFO "de%d:   media block #%u: %s",
-                              de->board_idx, i,
-                              media_name[de->media[idx].type]);
+                       pr_info("de%d:   media block #%u: %s",
+                               de->board_idx, i,
+                               media_name[de->media[idx].type]);
 
                bufp += sizeof (ib->opts);
 
                if (ib->opts & MediaCustomCSRs) {
-                       de->media[idx].csr13 = DE_UNALIGNED_16(&ib->csr13);
-                       de->media[idx].csr14 = DE_UNALIGNED_16(&ib->csr14);
-                       de->media[idx].csr15 = DE_UNALIGNED_16(&ib->csr15);
+                       de->media[idx].csr13 = get_unaligned(&ib->csr13);
+                       de->media[idx].csr14 = get_unaligned(&ib->csr14);
+                       de->media[idx].csr15 = get_unaligned(&ib->csr15);
                        bufp += sizeof(ib->csr13) + sizeof(ib->csr14) +
                                sizeof(ib->csr15);
 
                        if (netif_msg_probe(de))
-                               printk(" (%x,%x,%x)\n",
-                                      de->media[idx].csr13,
-                                      de->media[idx].csr14,
-                                      de->media[idx].csr15);
+                               pr_cont(" (%x,%x,%x)\n",
+                                       de->media[idx].csr13,
+                                       de->media[idx].csr14,
+                                       de->media[idx].csr15);
 
-               } else if (netif_msg_probe(de))
-                       printk("\n");
+               } else {
+                       if (netif_msg_probe(de))
+                               pr_cont("\n");
+               }
 
                if (bufp > ((void *)&ee_data[DE_EEPROM_SIZE - 3]))
                        break;
@@ -1900,8 +1923,14 @@ fill_defaults:
        for (i = 0; i < DE_MAX_MEDIA; i++) {
                if (de->media[i].csr13 == 0xffff)
                        de->media[i].csr13 = t21041_csr13[i];
-               if (de->media[i].csr14 == 0xffff)
-                       de->media[i].csr14 = t21041_csr14[i];
+               if (de->media[i].csr14 == 0xffff) {
+                       /* autonegotiation is broken at least on some chip
+                          revisions - rev. 0x21 works, 0x11 does not */
+                       if (de->pdev->revision < 0x20)
+                               de->media[i].csr14 = t21041_csr14_brk[i];
+                       else
+                               de->media[i].csr14 = t21041_csr14[i];
+               }
                if (de->media[i].csr15 == 0xffff)
                        de->media[i].csr15 = t21041_csr15[i];
        }
@@ -1924,6 +1953,18 @@ bad_srom:
        goto fill_defaults;
 }
 
+static const struct net_device_ops de_netdev_ops = {
+       .ndo_open               = de_open,
+       .ndo_stop               = de_close,
+       .ndo_set_multicast_list = de_set_rx_mode,
+       .ndo_start_xmit         = de_start_xmit,
+       .ndo_get_stats          = de_get_stats,
+       .ndo_tx_timeout         = de_tx_timeout,
+       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
 static int __devinit de_init_one (struct pci_dev *pdev,
                                  const struct pci_device_id *ent)
 {
@@ -1938,7 +1979,7 @@ static int __devinit de_init_one (struct pci_dev *pdev,
 
 #ifndef MODULE
        if (board_idx == 0)
-               printk("%s", version);
+               pr_info("%s\n", version);
 #endif
 
        /* allocate a new ethernet device structure, and fill in defaults */
@@ -1946,18 +1987,12 @@ static int __devinit de_init_one (struct pci_dev *pdev,
        if (!dev)
                return -ENOMEM;
 
-       SET_MODULE_OWNER(dev);
+       dev->netdev_ops = &de_netdev_ops;
        SET_NETDEV_DEV(dev, &pdev->dev);
-       dev->open = de_open;
-       dev->stop = de_close;
-       dev->set_multicast_list = de_set_rx_mode;
-       dev->hard_start_xmit = de_start_xmit;
-       dev->get_stats = de_get_stats;
        dev->ethtool_ops = &de_ethtool_ops;
-       dev->tx_timeout = de_tx_timeout;
        dev->watchdog_timeo = TX_TIMEOUT;
 
-       de = dev->priv;
+       de = netdev_priv(dev);
        de->de21040 = ent->driver_data == 0 ? 1 : 0;
        de->pdev = pdev;
        de->dev = dev;
@@ -1972,7 +2007,6 @@ static int __devinit de_init_one (struct pci_dev *pdev,
        de->media_timer.data = (unsigned long) de;
 
        netif_carrier_off(dev);
-       netif_stop_queue(dev);
 
        /* wake up device, assign resources */
        rc = pci_enable_device(pdev);
@@ -1987,7 +2021,7 @@ static int __devinit de_init_one (struct pci_dev *pdev,
        /* check for invalid IRQ value */
        if (pdev->irq < 2) {
                rc = -EIO;
-               printk(KERN_ERR PFX "invalid irq (%d) for pci dev %s\n",
+               pr_err("invalid irq (%d) for pci dev %s\n",
                       pdev->irq, pci_name(pdev));
                goto err_out_res;
        }
@@ -1998,14 +2032,14 @@ static int __devinit de_init_one (struct pci_dev *pdev,
        pciaddr = pci_resource_start(pdev, 1);
        if (!pciaddr) {
                rc = -EIO;
-               printk(KERN_ERR PFX "no MMIO resource for pci dev %s\n",
-                      pci_name(pdev));
+               pr_err("no MMIO resource for pci dev %s\n", pci_name(pdev));
                goto err_out_res;
        }
        if (pci_resource_len(pdev, 1) < DE_REGS_SIZE) {
                rc = -EIO;
-               printk(KERN_ERR PFX "MMIO resource (%llx) too small on pci dev %s\n",
-                      (unsigned long long)pci_resource_len(pdev, 1), pci_name(pdev));
+               pr_err("MMIO resource (%llx) too small on pci dev %s\n",
+                      (unsigned long long)pci_resource_len(pdev, 1),
+                      pci_name(pdev));
                goto err_out_res;
        }
 
@@ -2013,9 +2047,9 @@ static int __devinit de_init_one (struct pci_dev *pdev,
        regs = ioremap_nocache(pciaddr, DE_REGS_SIZE);
        if (!regs) {
                rc = -EIO;
-               printk(KERN_ERR PFX "Cannot map PCI MMIO (%llx@%lx) on pci dev %s\n",
-                       (unsigned long long)pci_resource_len(pdev, 1),
-                       pciaddr, pci_name(pdev));
+               pr_err("Cannot map PCI MMIO (%llx@%lx) on pci dev %s\n",
+                      (unsigned long long)pci_resource_len(pdev, 1),
+                      pciaddr, pci_name(pdev));
                goto err_out_res;
        }
        dev->base_addr = (unsigned long) regs;
@@ -2026,8 +2060,7 @@ static int __devinit de_init_one (struct pci_dev *pdev,
        /* make sure hardware is not running */
        rc = de_reset_mac(de);
        if (rc) {
-               printk(KERN_ERR PFX "Cannot reset MAC, pci dev %s\n",
-                      pci_name(pdev));
+               pr_err("Cannot reset MAC, pci dev %s\n", pci_name(pdev));
                goto err_out_iomap;
        }
 
@@ -2047,16 +2080,11 @@ static int __devinit de_init_one (struct pci_dev *pdev,
                goto err_out_iomap;
 
        /* print info about board and interface just registered */
-       printk (KERN_INFO "%s: %s at 0x%lx, "
-               "%02x:%02x:%02x:%02x:%02x:%02x, "
-               "IRQ %d\n",
-               dev->name,
-               de->de21040 ? "21040" : "21041",
-               dev->base_addr,
-               dev->dev_addr[0], dev->dev_addr[1],
-               dev->dev_addr[2], dev->dev_addr[3],
-               dev->dev_addr[4], dev->dev_addr[5],
-               dev->irq);
+       netdev_info(dev, "%s at 0x%lx, %pM, IRQ %d\n",
+                   de->de21040 ? "21040" : "21041",
+                   dev->base_addr,
+                   dev->dev_addr,
+                   dev->irq);
 
        pci_set_drvdata(pdev, dev);
 
@@ -2083,7 +2111,7 @@ err_out_free:
 static void __devexit de_remove_one (struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata(pdev);
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        BUG_ON(!dev);
        unregister_netdev(dev);
@@ -2100,7 +2128,7 @@ static void __devexit de_remove_one (struct pci_dev *pdev)
 static int de_suspend (struct pci_dev *pdev, pm_message_t state)
 {
        struct net_device *dev = pci_get_drvdata (pdev);
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
 
        rtnl_lock();
        if (netif_running (dev)) {
@@ -2135,7 +2163,7 @@ static int de_suspend (struct pci_dev *pdev, pm_message_t state)
 static int de_resume (struct pci_dev *pdev)
 {
        struct net_device *dev = pci_get_drvdata (pdev);
-       struct de_private *de = dev->priv;
+       struct de_private *de = netdev_priv(dev);
        int retval = 0;
 
        rtnl_lock();
@@ -2144,10 +2172,11 @@ static int de_resume (struct pci_dev *pdev)
        if (!netif_running(dev))
                goto out_attach;
        if ((retval = pci_enable_device(pdev))) {
-               printk (KERN_ERR "%s: pci_enable_device failed in resume\n",
-                       dev->name);
+               netdev_err(dev, "pci_enable_device failed in resume\n");
                goto out;
        }
+       pci_set_master(pdev);
+       de_init_rings(de);
        de_init_hw(de);
 out_attach:
        netif_device_attach(dev);
@@ -2172,7 +2201,7 @@ static struct pci_driver de_driver = {
 static int __init de_init (void)
 {
 #ifdef MODULE
-       printk("%s", version);
+       pr_info("%s\n", version);
 #endif
        return pci_register_driver(&de_driver);
 }