Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

myri_sbus: Convert to pure OF driver.

Signed-off-by: David S. Miller <davem@davemloft.net>

+69 -89
+68 -88
drivers/net/myri_sbus.c
··· 1 1 /* myri_sbus.c: MyriCOM MyriNET SBUS card driver. 2 2 * 3 - * Copyright (C) 1996, 1999, 2006 David S. Miller (davem@davemloft.net) 3 + * Copyright (C) 1996, 1999, 2006, 2008 David S. Miller (davem@davemloft.net) 4 4 */ 5 5 6 6 static char version[] = ··· 23 23 #include <linux/skbuff.h> 24 24 #include <linux/bitops.h> 25 25 #include <linux/dma-mapping.h> 26 + #include <linux/of.h> 27 + #include <linux/of_device.h> 26 28 27 29 #include <net/dst.h> 28 30 #include <net/arp.h> ··· 36 34 #include <asm/dma.h> 37 35 #include <asm/byteorder.h> 38 36 #include <asm/idprom.h> 39 - #include <asm/sbus.h> 40 37 #include <asm/openprom.h> 41 38 #include <asm/oplib.h> 42 39 #include <asm/auxio.h> ··· 245 244 u32 dma_addr; 246 245 247 246 dma_addr = sbus_readl(&rxd->myri_scatters[0].addr); 248 - dma_unmap_single(&mp->myri_sdev->ofdev.dev, dma_addr, 247 + dma_unmap_single(&mp->myri_op->dev, dma_addr, 249 248 RX_ALLOC_SIZE, DMA_FROM_DEVICE); 250 249 dev_kfree_skb(mp->rx_skbs[i]); 251 250 mp->rx_skbs[i] = NULL; ··· 262 261 u32 dma_addr; 263 262 264 263 dma_addr = sbus_readl(&txd->myri_gathers[0].addr); 265 - dma_unmap_single(&mp->myri_sdev->ofdev.dev, dma_addr, 264 + dma_unmap_single(&mp->myri_op->dev, dma_addr, 266 265 (skb->len + 3) & ~3, 267 266 DMA_TO_DEVICE); 268 267 dev_kfree_skb(mp->tx_skbs[i]); ··· 293 292 skb->dev = dev; 294 293 skb_put(skb, RX_ALLOC_SIZE); 295 294 296 - dma_addr = dma_map_single(&mp->myri_sdev->ofdev.dev, 295 + dma_addr = dma_map_single(&mp->myri_op->dev, 297 296 skb->data, RX_ALLOC_SIZE, 298 297 DMA_FROM_DEVICE); 299 298 sbus_writel(dma_addr, &rxd[i].myri_scatters[0].addr); ··· 351 350 352 351 DTX(("SKB[%d] ", entry)); 353 352 dma_addr = sbus_readl(&sq->myri_txd[entry].myri_gathers[0].addr); 354 - dma_unmap_single(&mp->myri_sdev->ofdev.dev, dma_addr, 353 + dma_unmap_single(&mp->myri_op->dev, dma_addr, 355 354 skb->len, DMA_TO_DEVICE); 356 355 dev_kfree_skb(skb); 357 356 mp->tx_skbs[entry] = NULL; ··· 431 430 432 431 /* Check for errors. */ 433 432 DRX(("rxd[%d]: %p len[%d] csum[%08x] ", entry, rxd, len, csum)); 434 - dma_sync_single_for_cpu(&mp->myri_sdev->ofdev.dev, 433 + dma_sync_single_for_cpu(&mp->myri_op->dev, 435 434 sbus_readl(&rxd->myri_scatters[0].addr), 436 435 RX_ALLOC_SIZE, DMA_FROM_DEVICE); 437 436 if (len < (ETH_HLEN + MYRI_PAD_LEN) || (skb->data[0] != MYRI_PAD_LEN)) { ··· 450 449 drops++; 451 450 DRX(("DROP ")); 452 451 dev->stats.rx_dropped++; 453 - dma_sync_single_for_device(&mp->myri_sdev->ofdev.dev, 452 + dma_sync_single_for_device(&mp->myri_op->dev, 454 453 sbus_readl(&rxd->myri_scatters[0].addr), 455 454 RX_ALLOC_SIZE, 456 455 DMA_FROM_DEVICE); ··· 472 471 DRX(("skb_alloc(FAILED) ")); 473 472 goto drop_it; 474 473 } 475 - dma_unmap_single(&mp->myri_sdev->ofdev.dev, 474 + dma_unmap_single(&mp->myri_op->dev, 476 475 sbus_readl(&rxd->myri_scatters[0].addr), 477 476 RX_ALLOC_SIZE, 478 477 DMA_FROM_DEVICE); 479 478 mp->rx_skbs[index] = new_skb; 480 479 new_skb->dev = dev; 481 480 skb_put(new_skb, RX_ALLOC_SIZE); 482 - dma_addr = dma_map_single(&mp->myri_sdev->ofdev.dev, 481 + dma_addr = dma_map_single(&mp->myri_op->dev, 483 482 new_skb->data, 484 483 RX_ALLOC_SIZE, 485 484 DMA_FROM_DEVICE); ··· 508 507 509 508 /* Reuse original ring buffer. */ 510 509 DRX(("reuse ")); 511 - dma_sync_single_for_device(&mp->myri_sdev->ofdev.dev, 510 + dma_sync_single_for_device(&mp->myri_op->dev, 512 511 sbus_readl(&rxd->myri_scatters[0].addr), 513 512 RX_ALLOC_SIZE, 514 513 DMA_FROM_DEVICE); ··· 660 659 sbus_writew((skb->data[4] << 8) | skb->data[5], &txd->addr[3]); 661 660 } 662 661 663 - dma_addr = dma_map_single(&mp->myri_sdev->ofdev.dev, skb->data, 662 + dma_addr = dma_map_single(&mp->myri_op->dev, skb->data, 664 663 len, DMA_TO_DEVICE); 665 664 sbus_writel(dma_addr, &txd->myri_gathers[0].addr); 666 665 sbus_writel(len, &txd->myri_gathers[0].len); ··· 900 899 .cache_update = myri_header_cache_update, 901 900 }; 902 901 903 - static int __devinit myri_ether_init(struct sbus_dev *sdev) 902 + static int __devinit myri_sbus_probe(struct of_device *op, const struct of_device_id *match) 904 903 { 905 - static int num; 904 + struct device_node *dp = op->node; 906 905 static unsigned version_printed; 907 906 struct net_device *dev; 908 - struct myri_eth *mp; 909 - unsigned char prop_buf[32]; 910 - int i; 911 907 DECLARE_MAC_BUF(mac); 908 + struct myri_eth *mp; 909 + const void *prop; 910 + static int num; 911 + int i, len; 912 912 913 - DET(("myri_ether_init(%p,%d):\n", sdev, num)); 913 + DET(("myri_ether_init(%p,%d):\n", op, num)); 914 914 dev = alloc_etherdev(sizeof(struct myri_eth)); 915 - 916 915 if (!dev) 917 916 return -ENOMEM; 918 917 919 918 if (version_printed++ == 0) 920 919 printk(version); 921 920 922 - SET_NETDEV_DEV(dev, &sdev->ofdev.dev); 921 + SET_NETDEV_DEV(dev, &op->dev); 923 922 924 - mp = (struct myri_eth *) dev->priv; 923 + mp = netdev_priv(dev); 925 924 spin_lock_init(&mp->irq_lock); 926 - mp->myri_sdev = sdev; 925 + mp->myri_op = op; 927 926 928 927 /* Clean out skb arrays. */ 929 928 for (i = 0; i < (RX_RING_SIZE + 1); i++) ··· 933 932 mp->tx_skbs[i] = NULL; 934 933 935 934 /* First check for EEPROM information. */ 936 - i = prom_getproperty(sdev->prom_node, "myrinet-eeprom-info", 937 - (char *)&mp->eeprom, sizeof(struct myri_eeprom)); 938 - DET(("prom_getprop(myrinet-eeprom-info) returns %d\n", i)); 939 - if (i == 0 || i == -1) { 935 + prop = of_get_property(dp, "myrinet-eeprom-info", &len); 936 + 937 + if (prop) 938 + memcpy(&mp->eeprom, prop, sizeof(struct myri_eeprom)); 939 + if (!prop) { 940 940 /* No eeprom property, must cook up the values ourselves. */ 941 941 DET(("No EEPROM: ")); 942 942 mp->eeprom.bus_type = BUS_TYPE_SBUS; 943 - mp->eeprom.cpuvers = prom_getintdefault(sdev->prom_node,"cpu_version",0); 944 - mp->eeprom.cval = prom_getintdefault(sdev->prom_node,"clock_value",0); 945 - mp->eeprom.ramsz = prom_getintdefault(sdev->prom_node,"sram_size",0); 946 - DET(("cpuvers[%d] cval[%d] ramsz[%d]\n", mp->eeprom.cpuvers, 947 - mp->eeprom.cval, mp->eeprom.ramsz)); 948 - if (mp->eeprom.cpuvers == 0) { 949 - DET(("EEPROM: cpuvers was zero, setting to %04x\n",CPUVERS_2_3)); 943 + mp->eeprom.cpuvers = 944 + of_getintprop_default(dp, "cpu_version", 0); 945 + mp->eeprom.cval = 946 + of_getintprop_default(dp, "clock_value", 0); 947 + mp->eeprom.ramsz = of_getintprop_default(dp, "sram_size", 0); 948 + if (!mp->eeprom.cpuvers) 950 949 mp->eeprom.cpuvers = CPUVERS_2_3; 951 - } 952 - if (mp->eeprom.cpuvers < CPUVERS_3_0) { 953 - DET(("EEPROM: cpuvers < CPUVERS_3_0, clockval set to zero.\n")); 950 + if (mp->eeprom.cpuvers < CPUVERS_3_0) 954 951 mp->eeprom.cval = 0; 955 - } 956 - if (mp->eeprom.ramsz == 0) { 957 - DET(("EEPROM: ramsz == 0, setting to 128k\n")); 952 + if (!mp->eeprom.ramsz) 958 953 mp->eeprom.ramsz = (128 * 1024); 959 - } 960 - i = prom_getproperty(sdev->prom_node, "myrinet-board-id", 961 - &prop_buf[0], 10); 962 - DET(("EEPROM: prom_getprop(myrinet-board-id) returns %d\n", i)); 963 - if ((i != 0) && (i != -1)) 964 - memcpy(&mp->eeprom.id[0], &prop_buf[0], 6); 954 + 955 + prop = of_get_property(dp, "myrinet-board-id", &len); 956 + if (prop) 957 + memcpy(&mp->eeprom.id[0], prop, 6); 965 958 else 966 959 set_boardid_from_idprom(mp, num); 967 - i = prom_getproperty(sdev->prom_node, "fpga_version", 968 - &mp->eeprom.fvers[0], 32); 969 - DET(("EEPROM: prom_getprop(fpga_version) returns %d\n", i)); 970 - if (i == 0 || i == -1) 960 + 961 + prop = of_get_property(dp, "fpga_version", &len); 962 + if (prop) 963 + memcpy(&mp->eeprom.fvers[0], prop, 32); 964 + else 971 965 memset(&mp->eeprom.fvers[0], 0, 32); 972 966 973 967 if (mp->eeprom.cpuvers == CPUVERS_4_1) { 974 - DET(("EEPROM: cpuvers CPUVERS_4_1, ")); 975 - if (mp->eeprom.ramsz == (128 * 1024)) { 976 - DET(("ramsize 128k, setting to 256k, ")); 968 + if (mp->eeprom.ramsz == (128 * 1024)) 977 969 mp->eeprom.ramsz = (256 * 1024); 978 - } 979 - if ((mp->eeprom.cval==0x40414041)||(mp->eeprom.cval==0x90449044)){ 980 - DET(("changing cval from %08x to %08x ", 981 - mp->eeprom.cval, 0x50e450e4)); 970 + if ((mp->eeprom.cval == 0x40414041) || 971 + (mp->eeprom.cval == 0x90449044)) 982 972 mp->eeprom.cval = 0x50e450e4; 983 - } 984 - DET(("\n")); 985 973 } 986 974 } 987 975 #ifdef DEBUG_DETECT ··· 989 999 * XXX only a valid version for PCI cards? Ask feldy... 990 1000 */ 991 1001 DET(("Mapping regs for cpuvers < CPUVERS_4_0\n")); 992 - mp->regs = sbus_ioremap(&sdev->resource[0], 0, 993 - mp->reg_size, "MyriCOM Regs"); 1002 + mp->regs = of_ioremap(&op->resource[0], 0, 1003 + mp->reg_size, "MyriCOM Regs"); 994 1004 if (!mp->regs) { 995 1005 printk("MyriCOM: Cannot map MyriCOM registers.\n"); 996 1006 goto err; ··· 999 1009 mp->lregs = mp->lanai + (0x10000 * 2); 1000 1010 } else { 1001 1011 DET(("Mapping regs for cpuvers >= CPUVERS_4_0\n")); 1002 - mp->cregs = sbus_ioremap(&sdev->resource[0], 0, 1003 - PAGE_SIZE, "MyriCOM Control Regs"); 1004 - mp->lregs = sbus_ioremap(&sdev->resource[0], (256 * 1024), 1012 + mp->cregs = of_ioremap(&op->resource[0], 0, 1013 + PAGE_SIZE, "MyriCOM Control Regs"); 1014 + mp->lregs = of_ioremap(&op->resource[0], (256 * 1024), 1005 1015 PAGE_SIZE, "MyriCOM LANAI Regs"); 1006 - mp->lanai = 1007 - sbus_ioremap(&sdev->resource[0], (512 * 1024), 1008 - mp->eeprom.ramsz, "MyriCOM SRAM"); 1016 + mp->lanai = of_ioremap(&op->resource[0], (512 * 1024), 1017 + mp->eeprom.ramsz, "MyriCOM SRAM"); 1009 1018 } 1010 1019 DET(("Registers mapped: cregs[%p] lregs[%p] lanai[%p]\n", 1011 1020 mp->cregs, mp->lregs, mp->lanai)); ··· 1036 1047 myri_reset_on(mp->cregs); 1037 1048 1038 1049 /* Get the supported DVMA burst sizes from our SBUS. */ 1039 - mp->myri_bursts = prom_getintdefault(mp->myri_sdev->bus->prom_node, 1040 - "burst-sizes", 0x00); 1041 - 1050 + mp->myri_bursts = of_getintprop_default(dp->parent, 1051 + "burst-sizes", 0x00); 1042 1052 if (!sbus_can_burst64()) 1043 1053 mp->myri_bursts &= ~(DMA_BURST64); 1044 1054 1045 1055 DET(("MYRI bursts %02x\n", mp->myri_bursts)); 1046 1056 1047 1057 /* Encode SBUS interrupt level in second control register. */ 1048 - i = prom_getint(sdev->prom_node, "interrupts"); 1058 + i = of_getintprop_default(dp, "interrupts", 0); 1049 1059 if (i == 0) 1050 1060 i = 4; 1051 1061 DET(("prom_getint(interrupts)==%d, irqlvl set to %04x\n", ··· 1059 1071 dev->tx_timeout = &myri_tx_timeout; 1060 1072 dev->watchdog_timeo = 5*HZ; 1061 1073 dev->set_multicast_list = &myri_set_multicast; 1062 - dev->irq = sdev->irqs[0]; 1074 + dev->irq = op->irqs[0]; 1063 1075 1064 1076 /* Register interrupt handler now. */ 1065 1077 DET(("Requesting MYRIcom IRQ line.\n")); ··· 1084 1096 goto err_free_irq; 1085 1097 } 1086 1098 1087 - dev_set_drvdata(&sdev->ofdev.dev, mp); 1099 + dev_set_drvdata(&op->dev, mp); 1088 1100 1089 1101 num++; 1090 1102 ··· 1101 1113 return -ENODEV; 1102 1114 } 1103 1115 1104 - 1105 - static int __devinit myri_sbus_probe(struct of_device *dev, const struct of_device_id *match) 1116 + static int __devexit myri_sbus_remove(struct of_device *op) 1106 1117 { 1107 - struct sbus_dev *sdev = to_sbus_device(&dev->dev); 1108 - 1109 - return myri_ether_init(sdev); 1110 - } 1111 - 1112 - static int __devexit myri_sbus_remove(struct of_device *dev) 1113 - { 1114 - struct myri_eth *mp = dev_get_drvdata(&dev->dev); 1118 + struct myri_eth *mp = dev_get_drvdata(&op->dev); 1115 1119 struct net_device *net_dev = mp->dev; 1116 1120 1117 1121 unregister_netdevice(net_dev); ··· 1111 1131 free_irq(net_dev->irq, net_dev); 1112 1132 1113 1133 if (mp->eeprom.cpuvers < CPUVERS_4_0) { 1114 - sbus_iounmap(mp->regs, mp->reg_size); 1134 + of_iounmap(&op->resource[0], mp->regs, mp->reg_size); 1115 1135 } else { 1116 - sbus_iounmap(mp->cregs, PAGE_SIZE); 1117 - sbus_iounmap(mp->lregs, (256 * 1024)); 1118 - sbus_iounmap(mp->lanai, (512 * 1024)); 1136 + of_iounmap(&op->resource[0], mp->cregs, PAGE_SIZE); 1137 + of_iounmap(&op->resource[0], mp->lregs, (256 * 1024)); 1138 + of_iounmap(&op->resource[0], mp->lanai, (512 * 1024)); 1119 1139 } 1120 1140 1121 1141 free_netdev(net_dev); 1122 1142 1123 - dev_set_drvdata(&dev->dev, NULL); 1143 + dev_set_drvdata(&op->dev, NULL); 1124 1144 1125 1145 return 0; 1126 1146 } ··· 1146 1166 1147 1167 static int __init myri_sbus_init(void) 1148 1168 { 1149 - return of_register_driver(&myri_sbus_driver, &sbus_bus_type); 1169 + return of_register_driver(&myri_sbus_driver, &of_bus_type); 1150 1170 } 1151 1171 1152 1172 static void __exit myri_sbus_exit(void)
+1 -1
drivers/net/myri_sbus.h
··· 288 288 struct myri_eeprom eeprom; /* Local copy of EEPROM. */ 289 289 unsigned int reg_size; /* Size of register space. */ 290 290 unsigned int shmem_base; /* Offset to shared ram. */ 291 - struct sbus_dev *myri_sdev; /* Our SBUS device struct. */ 291 + struct of_device *myri_op; /* Our OF device struct. */ 292 292 }; 293 293 294 294 /* We use this to acquire receive skb's that we can DMA directly into. */