···11/* myri_sbus.c: MyriCOM MyriNET SBUS card driver.22 *33- * Copyright (C) 1996, 1999, 2006 David S. Miller (davem@davemloft.net)33+ * Copyright (C) 1996, 1999, 2006, 2008 David S. Miller (davem@davemloft.net)44 */5566static char version[] =···2323#include <linux/skbuff.h>2424#include <linux/bitops.h>2525#include <linux/dma-mapping.h>2626+#include <linux/of.h>2727+#include <linux/of_device.h>26282729#include <net/dst.h>2830#include <net/arp.h>···3634#include <asm/dma.h>3735#include <asm/byteorder.h>3836#include <asm/idprom.h>3939-#include <asm/sbus.h>4037#include <asm/openprom.h>4138#include <asm/oplib.h>4239#include <asm/auxio.h>···245244 u32 dma_addr;246245247246 dma_addr = sbus_readl(&rxd->myri_scatters[0].addr);248248- dma_unmap_single(&mp->myri_sdev->ofdev.dev, dma_addr,247247+ dma_unmap_single(&mp->myri_op->dev, dma_addr,249248 RX_ALLOC_SIZE, DMA_FROM_DEVICE);250249 dev_kfree_skb(mp->rx_skbs[i]);251250 mp->rx_skbs[i] = NULL;···262261 u32 dma_addr;263262264263 dma_addr = sbus_readl(&txd->myri_gathers[0].addr);265265- dma_unmap_single(&mp->myri_sdev->ofdev.dev, dma_addr,264264+ dma_unmap_single(&mp->myri_op->dev, dma_addr,266265 (skb->len + 3) & ~3,267266 DMA_TO_DEVICE);268267 dev_kfree_skb(mp->tx_skbs[i]);···293292 skb->dev = dev;294293 skb_put(skb, RX_ALLOC_SIZE);295294296296- dma_addr = dma_map_single(&mp->myri_sdev->ofdev.dev,295295+ dma_addr = dma_map_single(&mp->myri_op->dev,297296 skb->data, RX_ALLOC_SIZE,298297 DMA_FROM_DEVICE);299298 sbus_writel(dma_addr, &rxd[i].myri_scatters[0].addr);···351350352351 DTX(("SKB[%d] ", entry));353352 dma_addr = sbus_readl(&sq->myri_txd[entry].myri_gathers[0].addr);354354- dma_unmap_single(&mp->myri_sdev->ofdev.dev, dma_addr,353353+ dma_unmap_single(&mp->myri_op->dev, dma_addr,355354 skb->len, DMA_TO_DEVICE);356355 dev_kfree_skb(skb);357356 mp->tx_skbs[entry] = NULL;···431430432431 /* Check for errors. */433432 DRX(("rxd[%d]: %p len[%d] csum[%08x] ", entry, rxd, len, csum));434434- dma_sync_single_for_cpu(&mp->myri_sdev->ofdev.dev,433433+ dma_sync_single_for_cpu(&mp->myri_op->dev,435434 sbus_readl(&rxd->myri_scatters[0].addr),436435 RX_ALLOC_SIZE, DMA_FROM_DEVICE);437436 if (len < (ETH_HLEN + MYRI_PAD_LEN) || (skb->data[0] != MYRI_PAD_LEN)) {···450449 drops++;451450 DRX(("DROP "));452451 dev->stats.rx_dropped++;453453- dma_sync_single_for_device(&mp->myri_sdev->ofdev.dev,452452+ dma_sync_single_for_device(&mp->myri_op->dev,454453 sbus_readl(&rxd->myri_scatters[0].addr),455454 RX_ALLOC_SIZE,456455 DMA_FROM_DEVICE);···472471 DRX(("skb_alloc(FAILED) "));473472 goto drop_it;474473 }475475- dma_unmap_single(&mp->myri_sdev->ofdev.dev,474474+ dma_unmap_single(&mp->myri_op->dev,476475 sbus_readl(&rxd->myri_scatters[0].addr),477476 RX_ALLOC_SIZE,478477 DMA_FROM_DEVICE);479478 mp->rx_skbs[index] = new_skb;480479 new_skb->dev = dev;481480 skb_put(new_skb, RX_ALLOC_SIZE);482482- dma_addr = dma_map_single(&mp->myri_sdev->ofdev.dev,481481+ dma_addr = dma_map_single(&mp->myri_op->dev,483482 new_skb->data,484483 RX_ALLOC_SIZE,485484 DMA_FROM_DEVICE);···508507509508 /* Reuse original ring buffer. */510509 DRX(("reuse "));511511- dma_sync_single_for_device(&mp->myri_sdev->ofdev.dev,510510+ dma_sync_single_for_device(&mp->myri_op->dev,512511 sbus_readl(&rxd->myri_scatters[0].addr),513512 RX_ALLOC_SIZE,514513 DMA_FROM_DEVICE);···660659 sbus_writew((skb->data[4] << 8) | skb->data[5], &txd->addr[3]);661660 }662661663663- dma_addr = dma_map_single(&mp->myri_sdev->ofdev.dev, skb->data,662662+ dma_addr = dma_map_single(&mp->myri_op->dev, skb->data,664663 len, DMA_TO_DEVICE);665664 sbus_writel(dma_addr, &txd->myri_gathers[0].addr);666665 sbus_writel(len, &txd->myri_gathers[0].len);···900899 .cache_update = myri_header_cache_update,901900};902901903903-static int __devinit myri_ether_init(struct sbus_dev *sdev)902902+static int __devinit myri_sbus_probe(struct of_device *op, const struct of_device_id *match)904903{905905- static int num;904904+ struct device_node *dp = op->node;906905 static unsigned version_printed;907906 struct net_device *dev;908908- struct myri_eth *mp;909909- unsigned char prop_buf[32];910910- int i;911907 DECLARE_MAC_BUF(mac);908908+ struct myri_eth *mp;909909+ const void *prop;910910+ static int num;911911+ int i, len;912912913913- DET(("myri_ether_init(%p,%d):\n", sdev, num));913913+ DET(("myri_ether_init(%p,%d):\n", op, num));914914 dev = alloc_etherdev(sizeof(struct myri_eth));915915-916915 if (!dev)917916 return -ENOMEM;918917919918 if (version_printed++ == 0)920919 printk(version);921920922922- SET_NETDEV_DEV(dev, &sdev->ofdev.dev);921921+ SET_NETDEV_DEV(dev, &op->dev);923922924924- mp = (struct myri_eth *) dev->priv;923923+ mp = netdev_priv(dev);925924 spin_lock_init(&mp->irq_lock);926926- mp->myri_sdev = sdev;925925+ mp->myri_op = op;927926928927 /* Clean out skb arrays. */929928 for (i = 0; i < (RX_RING_SIZE + 1); i++)···933932 mp->tx_skbs[i] = NULL;934933935934 /* First check for EEPROM information. */936936- i = prom_getproperty(sdev->prom_node, "myrinet-eeprom-info",937937- (char *)&mp->eeprom, sizeof(struct myri_eeprom));938938- DET(("prom_getprop(myrinet-eeprom-info) returns %d\n", i));939939- if (i == 0 || i == -1) {935935+ prop = of_get_property(dp, "myrinet-eeprom-info", &len);936936+937937+ if (prop)938938+ memcpy(&mp->eeprom, prop, sizeof(struct myri_eeprom));939939+ if (!prop) {940940 /* No eeprom property, must cook up the values ourselves. */941941 DET(("No EEPROM: "));942942 mp->eeprom.bus_type = BUS_TYPE_SBUS;943943- mp->eeprom.cpuvers = prom_getintdefault(sdev->prom_node,"cpu_version",0);944944- mp->eeprom.cval = prom_getintdefault(sdev->prom_node,"clock_value",0);945945- mp->eeprom.ramsz = prom_getintdefault(sdev->prom_node,"sram_size",0);946946- DET(("cpuvers[%d] cval[%d] ramsz[%d]\n", mp->eeprom.cpuvers,947947- mp->eeprom.cval, mp->eeprom.ramsz));948948- if (mp->eeprom.cpuvers == 0) {949949- DET(("EEPROM: cpuvers was zero, setting to %04x\n",CPUVERS_2_3));943943+ mp->eeprom.cpuvers =944944+ of_getintprop_default(dp, "cpu_version", 0);945945+ mp->eeprom.cval =946946+ of_getintprop_default(dp, "clock_value", 0);947947+ mp->eeprom.ramsz = of_getintprop_default(dp, "sram_size", 0);948948+ if (!mp->eeprom.cpuvers)950949 mp->eeprom.cpuvers = CPUVERS_2_3;951951- }952952- if (mp->eeprom.cpuvers < CPUVERS_3_0) {953953- DET(("EEPROM: cpuvers < CPUVERS_3_0, clockval set to zero.\n"));950950+ if (mp->eeprom.cpuvers < CPUVERS_3_0)954951 mp->eeprom.cval = 0;955955- }956956- if (mp->eeprom.ramsz == 0) {957957- DET(("EEPROM: ramsz == 0, setting to 128k\n"));952952+ if (!mp->eeprom.ramsz)958953 mp->eeprom.ramsz = (128 * 1024);959959- }960960- i = prom_getproperty(sdev->prom_node, "myrinet-board-id",961961- &prop_buf[0], 10);962962- DET(("EEPROM: prom_getprop(myrinet-board-id) returns %d\n", i));963963- if ((i != 0) && (i != -1))964964- memcpy(&mp->eeprom.id[0], &prop_buf[0], 6);954954+955955+ prop = of_get_property(dp, "myrinet-board-id", &len);956956+ if (prop)957957+ memcpy(&mp->eeprom.id[0], prop, 6);965958 else966959 set_boardid_from_idprom(mp, num);967967- i = prom_getproperty(sdev->prom_node, "fpga_version",968968- &mp->eeprom.fvers[0], 32);969969- DET(("EEPROM: prom_getprop(fpga_version) returns %d\n", i));970970- if (i == 0 || i == -1)960960+961961+ prop = of_get_property(dp, "fpga_version", &len);962962+ if (prop)963963+ memcpy(&mp->eeprom.fvers[0], prop, 32);964964+ else971965 memset(&mp->eeprom.fvers[0], 0, 32);972966973967 if (mp->eeprom.cpuvers == CPUVERS_4_1) {974974- DET(("EEPROM: cpuvers CPUVERS_4_1, "));975975- if (mp->eeprom.ramsz == (128 * 1024)) {976976- DET(("ramsize 128k, setting to 256k, "));968968+ if (mp->eeprom.ramsz == (128 * 1024))977969 mp->eeprom.ramsz = (256 * 1024);978978- }979979- if ((mp->eeprom.cval==0x40414041)||(mp->eeprom.cval==0x90449044)){980980- DET(("changing cval from %08x to %08x ",981981- mp->eeprom.cval, 0x50e450e4));970970+ if ((mp->eeprom.cval == 0x40414041) ||971971+ (mp->eeprom.cval == 0x90449044))982972 mp->eeprom.cval = 0x50e450e4;983983- }984984- DET(("\n"));985973 }986974 }987975#ifdef DEBUG_DETECT···989999 * XXX only a valid version for PCI cards? Ask feldy...9901000 */9911001 DET(("Mapping regs for cpuvers < CPUVERS_4_0\n"));992992- mp->regs = sbus_ioremap(&sdev->resource[0], 0,993993- mp->reg_size, "MyriCOM Regs");10021002+ mp->regs = of_ioremap(&op->resource[0], 0,10031003+ mp->reg_size, "MyriCOM Regs");9941004 if (!mp->regs) {9951005 printk("MyriCOM: Cannot map MyriCOM registers.\n");9961006 goto err;···9991009 mp->lregs = mp->lanai + (0x10000 * 2);10001010 } else {10011011 DET(("Mapping regs for cpuvers >= CPUVERS_4_0\n"));10021002- mp->cregs = sbus_ioremap(&sdev->resource[0], 0,10031003- PAGE_SIZE, "MyriCOM Control Regs");10041004- mp->lregs = sbus_ioremap(&sdev->resource[0], (256 * 1024),10121012+ mp->cregs = of_ioremap(&op->resource[0], 0,10131013+ PAGE_SIZE, "MyriCOM Control Regs");10141014+ mp->lregs = of_ioremap(&op->resource[0], (256 * 1024),10051015 PAGE_SIZE, "MyriCOM LANAI Regs");10061006- mp->lanai =10071007- sbus_ioremap(&sdev->resource[0], (512 * 1024),10081008- mp->eeprom.ramsz, "MyriCOM SRAM");10161016+ mp->lanai = of_ioremap(&op->resource[0], (512 * 1024),10171017+ mp->eeprom.ramsz, "MyriCOM SRAM");10091018 }10101019 DET(("Registers mapped: cregs[%p] lregs[%p] lanai[%p]\n",10111020 mp->cregs, mp->lregs, mp->lanai));···10361047 myri_reset_on(mp->cregs);1037104810381049 /* Get the supported DVMA burst sizes from our SBUS. */10391039- mp->myri_bursts = prom_getintdefault(mp->myri_sdev->bus->prom_node,10401040- "burst-sizes", 0x00);10411041-10501050+ mp->myri_bursts = of_getintprop_default(dp->parent,10511051+ "burst-sizes", 0x00);10421052 if (!sbus_can_burst64())10431053 mp->myri_bursts &= ~(DMA_BURST64);1044105410451055 DET(("MYRI bursts %02x\n", mp->myri_bursts));1046105610471057 /* Encode SBUS interrupt level in second control register. */10481048- i = prom_getint(sdev->prom_node, "interrupts");10581058+ i = of_getintprop_default(dp, "interrupts", 0);10491059 if (i == 0)10501060 i = 4;10511061 DET(("prom_getint(interrupts)==%d, irqlvl set to %04x\n",···10591071 dev->tx_timeout = &myri_tx_timeout;10601072 dev->watchdog_timeo = 5*HZ;10611073 dev->set_multicast_list = &myri_set_multicast;10621062- dev->irq = sdev->irqs[0];10741074+ dev->irq = op->irqs[0];1063107510641076 /* Register interrupt handler now. */10651077 DET(("Requesting MYRIcom IRQ line.\n"));···10841096 goto err_free_irq;10851097 }1086109810871087- dev_set_drvdata(&sdev->ofdev.dev, mp);10991099+ dev_set_drvdata(&op->dev, mp);1088110010891101 num++;10901102···11011113 return -ENODEV;11021114}1103111511041104-11051105-static int __devinit myri_sbus_probe(struct of_device *dev, const struct of_device_id *match)11161116+static int __devexit myri_sbus_remove(struct of_device *op)11061117{11071107- struct sbus_dev *sdev = to_sbus_device(&dev->dev);11081108-11091109- return myri_ether_init(sdev);11101110-}11111111-11121112-static int __devexit myri_sbus_remove(struct of_device *dev)11131113-{11141114- struct myri_eth *mp = dev_get_drvdata(&dev->dev);11181118+ struct myri_eth *mp = dev_get_drvdata(&op->dev);11151119 struct net_device *net_dev = mp->dev;1116112011171121 unregister_netdevice(net_dev);···11111131 free_irq(net_dev->irq, net_dev);1112113211131133 if (mp->eeprom.cpuvers < CPUVERS_4_0) {11141114- sbus_iounmap(mp->regs, mp->reg_size);11341134+ of_iounmap(&op->resource[0], mp->regs, mp->reg_size);11151135 } else {11161116- sbus_iounmap(mp->cregs, PAGE_SIZE);11171117- sbus_iounmap(mp->lregs, (256 * 1024));11181118- sbus_iounmap(mp->lanai, (512 * 1024));11361136+ of_iounmap(&op->resource[0], mp->cregs, PAGE_SIZE);11371137+ of_iounmap(&op->resource[0], mp->lregs, (256 * 1024));11381138+ of_iounmap(&op->resource[0], mp->lanai, (512 * 1024));11191139 }1120114011211141 free_netdev(net_dev);1122114211231123- dev_set_drvdata(&dev->dev, NULL);11431143+ dev_set_drvdata(&op->dev, NULL);1124114411251145 return 0;11261146}···1146116611471167static int __init myri_sbus_init(void)11481168{11491149- return of_register_driver(&myri_sbus_driver, &sbus_bus_type);11691169+ return of_register_driver(&myri_sbus_driver, &of_bus_type);11501170}1151117111521172static void __exit myri_sbus_exit(void)
+1-1
drivers/net/myri_sbus.h
···288288 struct myri_eeprom eeprom; /* Local copy of EEPROM. */289289 unsigned int reg_size; /* Size of register space. */290290 unsigned int shmem_base; /* Offset to shared ram. */291291- struct sbus_dev *myri_sdev; /* Our SBUS device struct. */291291+ struct of_device *myri_op; /* Our OF device struct. */292292};293293294294/* We use this to acquire receive skb's that we can DMA directly into. */