net: convert print_mac to %pM
[safe/jmp/linux-2.6] / drivers / net / myri_sbus.c
index 1998106..1bbdde1 100644 (file)
@@ -1,6 +1,6 @@
 /* myri_sbus.c: MyriCOM MyriNET SBUS card driver.
  *
- * Copyright (C) 1996, 1999, 2006 David S. Miller (davem@davemloft.net)
+ * Copyright (C) 1996, 1999, 2006, 2008 David S. Miller (davem@davemloft.net)
  */
 
 static char version[] =
@@ -22,6 +22,9 @@ static char version[] =
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
 #include <linux/bitops.h>
+#include <linux/dma-mapping.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
 
 #include <net/dst.h>
 #include <net/arp.h>
@@ -33,13 +36,11 @@ static char version[] =
 #include <asm/dma.h>
 #include <asm/byteorder.h>
 #include <asm/idprom.h>
-#include <asm/sbus.h>
 #include <asm/openprom.h>
 #include <asm/oplib.h>
 #include <asm/auxio.h>
 #include <asm/pgtable.h>
 #include <asm/irq.h>
-#include <asm/checksum.h>
 
 #include "myri_sbus.h"
 #include "myri_code.h"
@@ -135,7 +136,7 @@ static int myri_do_handshake(struct myri_eth *mp)
 
        myri_disable_irq(mp->lregs, cregs);
 
-       while (tick++ <= 25) {
+       while (tick++ < 25) {
                u32 softstate;
 
                /* Wake it up. */
@@ -168,7 +169,7 @@ static int myri_do_handshake(struct myri_eth *mp)
        return 0;
 }
 
-static int myri_load_lanai(struct myri_eth *mp)
+static int __devinit myri_load_lanai(struct myri_eth *mp)
 {
        struct net_device       *dev = mp->dev;
        struct myri_shmem __iomem *shmem = mp->shmem;
@@ -244,7 +245,8 @@ static void myri_clean_rings(struct myri_eth *mp)
                        u32 dma_addr;
 
                        dma_addr = sbus_readl(&rxd->myri_scatters[0].addr);
-                       sbus_unmap_single(mp->myri_sdev, dma_addr, RX_ALLOC_SIZE, SBUS_DMA_FROMDEVICE);
+                       dma_unmap_single(&mp->myri_op->dev, dma_addr,
+                                        RX_ALLOC_SIZE, DMA_FROM_DEVICE);
                        dev_kfree_skb(mp->rx_skbs[i]);
                        mp->rx_skbs[i] = NULL;
                }
@@ -260,7 +262,9 @@ static void myri_clean_rings(struct myri_eth *mp)
                        u32 dma_addr;
 
                        dma_addr = sbus_readl(&txd->myri_gathers[0].addr);
-                       sbus_unmap_single(mp->myri_sdev, dma_addr, (skb->len + 3) & ~3, SBUS_DMA_TODEVICE);
+                       dma_unmap_single(&mp->myri_op->dev, dma_addr,
+                                        (skb->len + 3) & ~3,
+                                        DMA_TO_DEVICE);
                        dev_kfree_skb(mp->tx_skbs[i]);
                        mp->tx_skbs[i] = NULL;
                }
@@ -289,7 +293,9 @@ static void myri_init_rings(struct myri_eth *mp, int from_irq)
                skb->dev = dev;
                skb_put(skb, RX_ALLOC_SIZE);
 
-               dma_addr = sbus_map_single(mp->myri_sdev, skb->data, RX_ALLOC_SIZE, SBUS_DMA_FROMDEVICE);
+               dma_addr = dma_map_single(&mp->myri_op->dev,
+                                         skb->data, RX_ALLOC_SIZE,
+                                         DMA_FROM_DEVICE);
                sbus_writel(dma_addr, &rxd[i].myri_scatters[0].addr);
                sbus_writel(RX_ALLOC_SIZE, &rxd[i].myri_scatters[0].len);
                sbus_writel(i, &rxd[i].ctx);
@@ -312,13 +318,10 @@ static void myri_is_not_so_happy(struct myri_eth *mp)
 #ifdef DEBUG_HEADER
 static void dump_ehdr(struct ethhdr *ehdr)
 {
-       printk("ehdr[h_dst(%02x:%02x:%02x:%02x:%02x:%02x)"
-              "h_source(%02x:%02x:%02x:%02x:%02x:%02x)h_proto(%04x)]\n",
-              ehdr->h_dest[0], ehdr->h_dest[1], ehdr->h_dest[2],
-              ehdr->h_dest[3], ehdr->h_dest[4], ehdr->h_dest[4],
-              ehdr->h_source[0], ehdr->h_source[1], ehdr->h_source[2],
-              ehdr->h_source[3], ehdr->h_source[4], ehdr->h_source[4],
-              ehdr->h_proto);
+       printk("ehdr[h_dst(%pM)"
+              "h_source(%pM)"
+              "h_proto(%04x)]\n",
+              ehdr->h_dest, ehdr->h_source, ehdr->h_proto);
 }
 
 static void dump_ehdr_and_myripad(unsigned char *stuff)
@@ -326,13 +329,7 @@ static void dump_ehdr_and_myripad(unsigned char *stuff)
        struct ethhdr *ehdr = (struct ethhdr *) (stuff + 2);
 
        printk("pad[%02x:%02x]", stuff[0], stuff[1]);
-       printk("ehdr[h_dst(%02x:%02x:%02x:%02x:%02x:%02x)"
-              "h_source(%02x:%02x:%02x:%02x:%02x:%02x)h_proto(%04x)]\n",
-              ehdr->h_dest[0], ehdr->h_dest[1], ehdr->h_dest[2],
-              ehdr->h_dest[3], ehdr->h_dest[4], ehdr->h_dest[4],
-              ehdr->h_source[0], ehdr->h_source[1], ehdr->h_source[2],
-              ehdr->h_source[3], ehdr->h_source[4], ehdr->h_source[4],
-              ehdr->h_proto);
+       dump_ehdr(ehdr);
 }
 #endif
 
@@ -351,16 +348,17 @@ static void myri_tx(struct myri_eth *mp, struct net_device *dev)
 
                DTX(("SKB[%d] ", entry));
                dma_addr = sbus_readl(&sq->myri_txd[entry].myri_gathers[0].addr);
-               sbus_unmap_single(mp->myri_sdev, dma_addr, skb->len, SBUS_DMA_TODEVICE);
+               dma_unmap_single(&mp->myri_op->dev, dma_addr,
+                                skb->len, DMA_TO_DEVICE);
                dev_kfree_skb(skb);
                mp->tx_skbs[entry] = NULL;
-               mp->enet_stats.tx_packets++;
+               dev->stats.tx_packets++;
                entry = NEXT_TX(entry);
        }
        mp->tx_old = entry;
 }
 
-/* Determine the packet's protocol ID. The rule here is that we 
+/* Determine the packet's protocol ID. The rule here is that we
  * assume 802.3 if the type field is short enough to be a length.
  * This is normal practice and works for any 'now in use' protocol.
  */
@@ -368,11 +366,11 @@ static __be16 myri_type_trans(struct sk_buff *skb, struct net_device *dev)
 {
        struct ethhdr *eth;
        unsigned char *rawp;
-       
-       skb->mac.raw = (((unsigned char *)skb->data) + MYRI_PAD_LEN);
+
+       skb_set_mac_header(skb, MYRI_PAD_LEN);
        skb_pull(skb, dev->hard_header_len);
        eth = eth_hdr(skb);
-       
+
 #ifdef DEBUG_HEADER
        DHDR(("myri_type_trans: "));
        dump_ehdr(eth);
@@ -386,12 +384,12 @@ static __be16 myri_type_trans(struct sk_buff *skb, struct net_device *dev)
                if (memcmp(eth->h_dest, dev->dev_addr, ETH_ALEN))
                        skb->pkt_type = PACKET_OTHERHOST;
        }
-       
+
        if (ntohs(eth->h_proto) >= 1536)
                return eth->h_proto;
-               
+
        rawp = skb->data;
-       
+
        /* This is a magic hack to spot IPX packets. Older Novell breaks
         * the protocol design and runs IPX over 802.3 without an 802.2 LLC
         * layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
@@ -399,7 +397,7 @@ static __be16 myri_type_trans(struct sk_buff *skb, struct net_device *dev)
         */
        if (*(unsigned short *)rawp == 0xFFFF)
                return htons(ETH_P_802_3);
-               
+
        /* Real 802.2 LLC */
        return htons(ETH_P_802_2);
 }
@@ -430,29 +428,29 @@ static void myri_rx(struct myri_eth *mp, struct net_device *dev)
 
                /* Check for errors. */
                DRX(("rxd[%d]: %p len[%d] csum[%08x] ", entry, rxd, len, csum));
-               sbus_dma_sync_single_for_cpu(mp->myri_sdev,
-                                            sbus_readl(&rxd->myri_scatters[0].addr),
-                                            RX_ALLOC_SIZE, SBUS_DMA_FROMDEVICE);
+               dma_sync_single_for_cpu(&mp->myri_op->dev,
+                                       sbus_readl(&rxd->myri_scatters[0].addr),
+                                       RX_ALLOC_SIZE, DMA_FROM_DEVICE);
                if (len < (ETH_HLEN + MYRI_PAD_LEN) || (skb->data[0] != MYRI_PAD_LEN)) {
                        DRX(("ERROR["));
-                       mp->enet_stats.rx_errors++;
+                       dev->stats.rx_errors++;
                        if (len < (ETH_HLEN + MYRI_PAD_LEN)) {
                                DRX(("BAD_LENGTH] "));
-                               mp->enet_stats.rx_length_errors++;
+                               dev->stats.rx_length_errors++;
                        } else {
                                DRX(("NO_PADDING] "));
-                               mp->enet_stats.rx_frame_errors++;
+                               dev->stats.rx_frame_errors++;
                        }
 
                        /* Return it to the LANAI. */
        drop_it:
                        drops++;
                        DRX(("DROP "));
-                       mp->enet_stats.rx_dropped++;
-                       sbus_dma_sync_single_for_device(mp->myri_sdev,
-                                                       sbus_readl(&rxd->myri_scatters[0].addr),
-                                                       RX_ALLOC_SIZE,
-                                                       SBUS_DMA_FROMDEVICE);
+                       dev->stats.rx_dropped++;
+                       dma_sync_single_for_device(&mp->myri_op->dev,
+                                                  sbus_readl(&rxd->myri_scatters[0].addr),
+                                                  RX_ALLOC_SIZE,
+                                                  DMA_FROM_DEVICE);
                        sbus_writel(RX_ALLOC_SIZE, &rxd->myri_scatters[0].len);
                        sbus_writel(index, &rxd->ctx);
                        sbus_writel(1, &rxd->num_sg);
@@ -471,17 +469,17 @@ static void myri_rx(struct myri_eth *mp, struct net_device *dev)
                                DRX(("skb_alloc(FAILED) "));
                                goto drop_it;
                        }
-                       sbus_unmap_single(mp->myri_sdev,
-                                         sbus_readl(&rxd->myri_scatters[0].addr),
-                                         RX_ALLOC_SIZE,
-                                         SBUS_DMA_FROMDEVICE);
+                       dma_unmap_single(&mp->myri_op->dev,
+                                        sbus_readl(&rxd->myri_scatters[0].addr),
+                                        RX_ALLOC_SIZE,
+                                        DMA_FROM_DEVICE);
                        mp->rx_skbs[index] = new_skb;
                        new_skb->dev = dev;
                        skb_put(new_skb, RX_ALLOC_SIZE);
-                       dma_addr = sbus_map_single(mp->myri_sdev,
-                                                  new_skb->data,
-                                                  RX_ALLOC_SIZE,
-                                                  SBUS_DMA_FROMDEVICE);
+                       dma_addr = dma_map_single(&mp->myri_op->dev,
+                                                 new_skb->data,
+                                                 RX_ALLOC_SIZE,
+                                                 DMA_FROM_DEVICE);
                        sbus_writel(dma_addr, &rxd->myri_scatters[0].addr);
                        sbus_writel(RX_ALLOC_SIZE, &rxd->myri_scatters[0].len);
                        sbus_writel(index, &rxd->ctx);
@@ -503,14 +501,14 @@ static void myri_rx(struct myri_eth *mp, struct net_device *dev)
                        copy_skb->dev = dev;
                        DRX(("resv_and_put "));
                        skb_put(copy_skb, len);
-                       memcpy(copy_skb->data, skb->data, len);
+                       skb_copy_from_linear_data(skb, copy_skb->data, len);
 
                        /* Reuse original ring buffer. */
                        DRX(("reuse "));
-                       sbus_dma_sync_single_for_device(mp->myri_sdev,
-                                                       sbus_readl(&rxd->myri_scatters[0].addr),
-                                                       RX_ALLOC_SIZE,
-                                                       SBUS_DMA_FROMDEVICE);
+                       dma_sync_single_for_device(&mp->myri_op->dev,
+                                                  sbus_readl(&rxd->myri_scatters[0].addr),
+                                                  RX_ALLOC_SIZE,
+                                                  DMA_FROM_DEVICE);
                        sbus_writel(RX_ALLOC_SIZE, &rxd->myri_scatters[0].len);
                        sbus_writel(index, &rxd->ctx);
                        sbus_writel(1, &rxd->num_sg);
@@ -528,15 +526,15 @@ static void myri_rx(struct myri_eth *mp, struct net_device *dev)
                netif_rx(skb);
 
                dev->last_rx = jiffies;
-               mp->enet_stats.rx_packets++;
-               mp->enet_stats.rx_bytes += len;
+               dev->stats.rx_packets++;
+               dev->stats.rx_bytes += len;
        next:
                DRX(("NEXT\n"));
                entry = NEXT_RX(entry);
        }
 }
 
-static irqreturn_t myri_interrupt(int irq, void *dev_id, struct pt_regs *regs)
+static irqreturn_t myri_interrupt(int irq, void *dev_id)
 {
        struct net_device *dev          = (struct net_device *) dev_id;
        struct myri_eth *mp             = (struct myri_eth *) dev->priv;
@@ -597,7 +595,7 @@ static void myri_tx_timeout(struct net_device *dev)
 
        printk(KERN_ERR "%s: transmit timed out, resetting\n", dev->name);
 
-       mp->enet_stats.tx_errors++;
+       dev->stats.tx_errors++;
        myri_init(mp, 0);
        netif_wake_queue(dev);
 }
@@ -659,7 +657,8 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev)
                sbus_writew((skb->data[4] << 8) | skb->data[5], &txd->addr[3]);
        }
 
-       dma_addr = sbus_map_single(mp->myri_sdev, skb->data, len, SBUS_DMA_TODEVICE);
+       dma_addr = dma_map_single(&mp->myri_op->dev, skb->data,
+                                 len, DMA_TO_DEVICE);
        sbus_writel(dma_addr, &txd->myri_gathers[0].addr);
        sbus_writel(len, &txd->myri_gathers[0].len);
        sbus_writel(1, &txd->num_sg);
@@ -678,13 +677,14 @@ static int myri_start_xmit(struct sk_buff *skb, struct net_device *dev)
        return 0;
 }
 
-/* Create the MyriNet MAC header for an arbitrary protocol layer 
+/* Create the MyriNet MAC header for an arbitrary protocol layer
  *
  * saddr=NULL  means use device source address
  * daddr=NULL  means leave destination address (eg unresolved arp)
  */
-static int myri_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
-                      void *daddr, void *saddr, unsigned len)
+static int myri_header(struct sk_buff *skb, struct net_device *dev,
+                      unsigned short type, const void *daddr,
+                      const void *saddr, unsigned len)
 {
        struct ethhdr *eth = (struct ethhdr *) skb_push(skb, ETH_HLEN);
        unsigned char *pad = (unsigned char *) skb_push(skb, MYRI_PAD_LEN);
@@ -701,7 +701,7 @@ static int myri_header(struct sk_buff *skb, struct net_device *dev, unsigned sho
        /* Set the protocol type. For a packet of type ETH_P_802_3 we put the length
         * in here instead. It is up to the 802.2 layer to carry protocol information.
         */
-       if (type != ETH_P_802_3) 
+       if (type != ETH_P_802_3)
                eth->h_proto = htons(type);
        else
                eth->h_proto = htons(len);
@@ -719,7 +719,7 @@ static int myri_header(struct sk_buff *skb, struct net_device *dev, unsigned sho
                        eth->h_dest[i] = 0;
                return(dev->hard_header_len);
        }
-       
+
        if (daddr) {
                memcpy(eth->h_dest, daddr, dev->addr_len);
                return dev->hard_header_len;
@@ -754,30 +754,30 @@ static int myri_rebuild_header(struct sk_buff *skb)
 #endif
 
        default:
-               printk(KERN_DEBUG 
-                      "%s: unable to resolve type %X addresses.\n", 
+               printk(KERN_DEBUG
+                      "%s: unable to resolve type %X addresses.\n",
                       dev->name, (int)eth->h_proto);
-               
+
                memcpy(eth->h_source, dev->dev_addr, dev->addr_len);
                return 0;
                break;
        }
 
-       return 0;       
+       return 0;
 }
 
-int myri_header_cache(struct neighbour *neigh, struct hh_cache *hh)
+static int myri_header_cache(const struct neighbour *neigh, struct hh_cache *hh)
 {
        unsigned short type = hh->hh_type;
        unsigned char *pad;
        struct ethhdr *eth;
-       struct net_device *dev = neigh->dev;
+       const struct net_device *dev = neigh->dev;
 
        pad = ((unsigned char *) hh->hh_data) +
                HH_DATA_OFF(sizeof(*eth) + MYRI_PAD_LEN);
        eth = (struct ethhdr *) (pad + MYRI_PAD_LEN);
 
-       if (type == __constant_htons(ETH_P_802_3))
+       if (type == htons(ETH_P_802_3))
                return -1;
 
        /* Refill MyriNet padding identifiers, this is just being anal. */
@@ -793,7 +793,9 @@ int myri_header_cache(struct neighbour *neigh, struct hh_cache *hh)
 
 
 /* Called by Address Resolution module to notify changes in address. */
-void myri_header_cache_update(struct hh_cache *hh, struct net_device *dev, unsigned char * haddr)
+void myri_header_cache_update(struct hh_cache *hh,
+                             const struct net_device *dev,
+                             const unsigned char * haddr)
 {
        memcpy(((u8*)hh->hh_data) + HH_DATA_OFF(sizeof(struct ethhdr)),
               haddr, dev->addr_len);
@@ -807,9 +809,6 @@ static int myri_change_mtu(struct net_device *dev, int new_mtu)
        return 0;
 }
 
-static struct net_device_stats *myri_get_stats(struct net_device *dev)
-{ return &(((struct myri_eth *)dev->priv)->enet_stats); }
-
 static void myri_set_multicast(struct net_device *dev)
 {
        /* Do nothing, all MyriCOM nodes transmit multicast frames
@@ -891,30 +890,36 @@ static void dump_eeprom(struct myri_eth *mp)
 }
 #endif
 
-static int __init myri_ether_init(struct sbus_dev *sdev)
+static const struct header_ops myri_header_ops = {
+       .create         = myri_header,
+       .rebuild        = myri_rebuild_header,
+       .cache          = myri_header_cache,
+       .cache_update   = myri_header_cache_update,
+};
+
+static int __devinit myri_sbus_probe(struct of_device *op, const struct of_device_id *match)
 {
-       static int num;
+       struct device_node *dp = op->node;
        static unsigned version_printed;
        struct net_device *dev;
        struct myri_eth *mp;
-       unsigned char prop_buf[32];
-       int i;
+       const void *prop;
+       static int num;
+       int i, len;
 
-       DET(("myri_ether_init(%p,%d):\n", sdev, num));
+       DET(("myri_ether_init(%p,%d):\n", op, num));
        dev = alloc_etherdev(sizeof(struct myri_eth));
-
        if (!dev)
                return -ENOMEM;
 
        if (version_printed++ == 0)
                printk(version);
 
-       SET_MODULE_OWNER(dev);
-       SET_NETDEV_DEV(dev, &sdev->ofdev.dev);
+       SET_NETDEV_DEV(dev, &op->dev);
 
-       mp = (struct myri_eth *) dev->priv;
+       mp = netdev_priv(dev);
        spin_lock_init(&mp->irq_lock);
-       mp->myri_sdev = sdev;
+       mp->myri_op = op;
 
        /* Clean out skb arrays. */
        for (i = 0; i < (RX_RING_SIZE + 1); i++)
@@ -924,55 +929,44 @@ static int __init myri_ether_init(struct sbus_dev *sdev)
                mp->tx_skbs[i] = NULL;
 
        /* First check for EEPROM information. */
-       i = prom_getproperty(sdev->prom_node, "myrinet-eeprom-info",
-                            (char *)&mp->eeprom, sizeof(struct myri_eeprom));
-       DET(("prom_getprop(myrinet-eeprom-info) returns %d\n", i));
-       if (i == 0 || i == -1) {
+       prop = of_get_property(dp, "myrinet-eeprom-info", &len);
+
+       if (prop)
+               memcpy(&mp->eeprom, prop, sizeof(struct myri_eeprom));
+       if (!prop) {
                /* No eeprom property, must cook up the values ourselves. */
                DET(("No EEPROM: "));
                mp->eeprom.bus_type = BUS_TYPE_SBUS;
-               mp->eeprom.cpuvers = prom_getintdefault(sdev->prom_node,"cpu_version",0);
-               mp->eeprom.cval = prom_getintdefault(sdev->prom_node,"clock_value",0);
-               mp->eeprom.ramsz = prom_getintdefault(sdev->prom_node,"sram_size",0);
-               DET(("cpuvers[%d] cval[%d] ramsz[%d]\n", mp->eeprom.cpuvers,
-                    mp->eeprom.cval, mp->eeprom.ramsz));
-               if (mp->eeprom.cpuvers == 0) {
-                       DET(("EEPROM: cpuvers was zero, setting to %04x\n",CPUVERS_2_3));
+               mp->eeprom.cpuvers =
+                       of_getintprop_default(dp, "cpu_version", 0);
+               mp->eeprom.cval =
+                       of_getintprop_default(dp, "clock_value", 0);
+               mp->eeprom.ramsz = of_getintprop_default(dp, "sram_size", 0);
+               if (!mp->eeprom.cpuvers)
                        mp->eeprom.cpuvers = CPUVERS_2_3;
-               }
-               if (mp->eeprom.cpuvers < CPUVERS_3_0) {
-                       DET(("EEPROM: cpuvers < CPUVERS_3_0, clockval set to zero.\n"));
+               if (mp->eeprom.cpuvers < CPUVERS_3_0)
                        mp->eeprom.cval = 0;
-               }
-               if (mp->eeprom.ramsz == 0) {
-                       DET(("EEPROM: ramsz == 0, setting to 128k\n"));
+               if (!mp->eeprom.ramsz)
                        mp->eeprom.ramsz = (128 * 1024);
-               }
-               i = prom_getproperty(sdev->prom_node, "myrinet-board-id",
-                                    &prop_buf[0], 10);
-               DET(("EEPROM: prom_getprop(myrinet-board-id) returns %d\n", i));
-               if ((i != 0) && (i != -1))
-                       memcpy(&mp->eeprom.id[0], &prop_buf[0], 6);
+
+               prop = of_get_property(dp, "myrinet-board-id", &len);
+               if (prop)
+                       memcpy(&mp->eeprom.id[0], prop, 6);
                else
                        set_boardid_from_idprom(mp, num);
-               i = prom_getproperty(sdev->prom_node, "fpga_version",
-                                    &mp->eeprom.fvers[0], 32);
-               DET(("EEPROM: prom_getprop(fpga_version) returns %d\n", i));
-               if (i == 0 || i == -1)
+
+               prop = of_get_property(dp, "fpga_version", &len);
+               if (prop)
+                       memcpy(&mp->eeprom.fvers[0], prop, 32);
+               else
                        memset(&mp->eeprom.fvers[0], 0, 32);
 
                if (mp->eeprom.cpuvers == CPUVERS_4_1) {
-                       DET(("EEPROM: cpuvers CPUVERS_4_1, "));
-                       if (mp->eeprom.ramsz == (128 * 1024)) {
-                               DET(("ramsize 128k, setting to 256k, "));
+                       if (mp->eeprom.ramsz == (128 * 1024))
                                mp->eeprom.ramsz = (256 * 1024);
-                       }
-                       if ((mp->eeprom.cval==0x40414041)||(mp->eeprom.cval==0x90449044)){
-                               DET(("changing cval from %08x to %08x ",
-                                    mp->eeprom.cval, 0x50e450e4));
+                       if ((mp->eeprom.cval == 0x40414041) ||
+                           (mp->eeprom.cval == 0x90449044))
                                mp->eeprom.cval = 0x50e450e4;
-                       }
-                       DET(("\n"));
                }
        }
 #ifdef DEBUG_DETECT
@@ -991,8 +985,8 @@ static int __init myri_ether_init(struct sbus_dev *sdev)
                 * XXX only a valid version for PCI cards?  Ask feldy...
                 */
                DET(("Mapping regs for cpuvers < CPUVERS_4_0\n"));
-               mp->regs = sbus_ioremap(&sdev->resource[0], 0,
-                                       mp->reg_size, "MyriCOM Regs");
+               mp->regs = of_ioremap(&op->resource[0], 0,
+                                     mp->reg_size, "MyriCOM Regs");
                if (!mp->regs) {
                        printk("MyriCOM: Cannot map MyriCOM registers.\n");
                        goto err;
@@ -1001,13 +995,12 @@ static int __init myri_ether_init(struct sbus_dev *sdev)
                mp->lregs = mp->lanai + (0x10000 * 2);
        } else {
                DET(("Mapping regs for cpuvers >= CPUVERS_4_0\n"));
-               mp->cregs = sbus_ioremap(&sdev->resource[0], 0,
-                                        PAGE_SIZE, "MyriCOM Control Regs");
-               mp->lregs = sbus_ioremap(&sdev->resource[0], (256 * 1024),
+               mp->cregs = of_ioremap(&op->resource[0], 0,
+                                      PAGE_SIZE, "MyriCOM Control Regs");
+               mp->lregs = of_ioremap(&op->resource[0], (256 * 1024),
                                         PAGE_SIZE, "MyriCOM LANAI Regs");
-               mp->lanai =
-                       sbus_ioremap(&sdev->resource[0], (512 * 1024),
-                                    mp->eeprom.ramsz, "MyriCOM SRAM");
+               mp->lanai = of_ioremap(&op->resource[0], (512 * 1024),
+                                      mp->eeprom.ramsz, "MyriCOM SRAM");
        }
        DET(("Registers mapped: cregs[%p] lregs[%p] lanai[%p]\n",
             mp->cregs, mp->lregs, mp->lanai));
@@ -1039,16 +1032,15 @@ static int __init myri_ether_init(struct sbus_dev *sdev)
        myri_reset_on(mp->cregs);
 
        /* Get the supported DVMA burst sizes from our SBUS. */
-       mp->myri_bursts = prom_getintdefault(mp->myri_sdev->bus->prom_node,
-                                            "burst-sizes", 0x00);
-
-       if (!sbus_can_burst64(sdev))
+       mp->myri_bursts = of_getintprop_default(dp->parent,
+                                               "burst-sizes", 0x00);
+       if (!sbus_can_burst64())
                mp->myri_bursts &= ~(DMA_BURST64);
 
        DET(("MYRI bursts %02x\n", mp->myri_bursts));
 
        /* Encode SBUS interrupt level in second control register. */
-       i = prom_getint(sdev->prom_node, "interrupts");
+       i = of_getintprop_default(dp, "interrupts", 0);
        if (i == 0)
                i = 4;
        DET(("prom_getint(interrupts)==%d, irqlvl set to %04x\n",
@@ -1062,25 +1054,22 @@ static int __init myri_ether_init(struct sbus_dev *sdev)
        dev->hard_start_xmit = &myri_start_xmit;
        dev->tx_timeout = &myri_tx_timeout;
        dev->watchdog_timeo = 5*HZ;
-       dev->get_stats = &myri_get_stats;
        dev->set_multicast_list = &myri_set_multicast;
-       dev->irq = sdev->irqs[0];
+       dev->irq = op->irqs[0];
 
        /* Register interrupt handler now. */
        DET(("Requesting MYRIcom IRQ line.\n"));
        if (request_irq(dev->irq, &myri_interrupt,
-                       SA_SHIRQ, "MyriCOM Ethernet", (void *) dev)) {
+                       IRQF_SHARED, "MyriCOM Ethernet", (void *) dev)) {
                printk("MyriCOM: Cannot register interrupt handler.\n");
                goto err;
        }
 
        dev->mtu                = MYRINET_MTU;
        dev->change_mtu         = myri_change_mtu;
-       dev->hard_header        = myri_header;
-       dev->rebuild_header     = myri_rebuild_header;
+       dev->header_ops         = &myri_header_ops;
+
        dev->hard_header_len    = (ETH_HLEN + MYRI_PAD_LEN);
-       dev->hard_header_cache  = myri_header_cache;
-       dev->header_cache_update= myri_header_cache_update;
 
        /* Load code onto the LANai. */
        DET(("Loading LANAI firmware\n"));
@@ -1091,16 +1080,12 @@ static int __init myri_ether_init(struct sbus_dev *sdev)
                goto err_free_irq;
        }
 
-       dev_set_drvdata(&sdev->ofdev.dev, mp);
+       dev_set_drvdata(&op->dev, mp);
 
        num++;
 
-       printk("%s: MyriCOM MyriNET Ethernet ", dev->name);
-
-       for (i = 0; i < 6; i++)
-               printk("%2.2x%c", dev->dev_addr[i],
-                      i == 5 ? ' ' : ':');
-       printk("\n");
+       printk("%s: MyriCOM MyriNET Ethernet %pM\n",
+              dev->name, dev->dev_addr);
 
        return 0;
 
@@ -1112,39 +1097,31 @@ err:
        return -ENODEV;
 }
 
-
-static int __devinit myri_sbus_probe(struct of_device *dev, const struct of_device_id *match)
-{
-       struct sbus_dev *sdev = to_sbus_device(&dev->dev);
-
-       return myri_ether_init(sdev);
-}
-
-static int __devexit myri_sbus_remove(struct of_device *dev)
+static int __devexit myri_sbus_remove(struct of_device *op)
 {
-       struct myri_eth *mp = dev_get_drvdata(&dev->dev);
+       struct myri_eth *mp = dev_get_drvdata(&op->dev);
        struct net_device *net_dev = mp->dev;
 
-       unregister_netdevice(net_dev);
+       unregister_netdev(net_dev);
 
        free_irq(net_dev->irq, net_dev);
 
        if (mp->eeprom.cpuvers < CPUVERS_4_0) {
-               sbus_iounmap(mp->regs, mp->reg_size);
+               of_iounmap(&op->resource[0], mp->regs, mp->reg_size);
        } else {
-               sbus_iounmap(mp->cregs, PAGE_SIZE);
-               sbus_iounmap(mp->lregs, (256 * 1024));
-               sbus_iounmap(mp->lanai, (512 * 1024));
+               of_iounmap(&op->resource[0], mp->cregs, PAGE_SIZE);
+               of_iounmap(&op->resource[0], mp->lregs, (256 * 1024));
+               of_iounmap(&op->resource[0], mp->lanai, (512 * 1024));
        }
 
        free_netdev(net_dev);
 
-       dev_set_drvdata(&dev->dev, NULL);
+       dev_set_drvdata(&op->dev, NULL);
 
        return 0;
 }
 
-static struct of_device_id myri_sbus_match[] = {
+static const struct of_device_id myri_sbus_match[] = {
        {
                .name = "MYRICOM,mlanai",
        },
@@ -1165,7 +1142,7 @@ static struct of_platform_driver myri_sbus_driver = {
 
 static int __init myri_sbus_init(void)
 {
-       return of_register_driver(&myri_sbus_driver, &sbus_bus_type);
+       return of_register_driver(&myri_sbus_driver, &of_bus_type);
 }
 
 static void __exit myri_sbus_exit(void)