Commit 8ef2175c86821350775718bfe7d3490bbea2e3cf

Authored by David S. Miller
1 parent 9e6b6e7d8e

sunbmac: Convert to pure OF driver.

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

Showing 2 changed files with 70 additions and 88 deletions Side-by-side Diff

drivers/net/sunbmac.c
1   -/* $Id: sunbmac.c,v 1.30 2002/01/15 06:48:55 davem Exp $
2   - * sunbmac.c: Driver for Sparc BigMAC 100baseT ethernet adapters.
  1 +/* sunbmac.c: Driver for Sparc BigMAC 100baseT ethernet adapters.
3 2 *
4   - * Copyright (C) 1997, 1998, 1999, 2003 David S. Miller (davem@redhat.com)
  3 + * Copyright (C) 1997, 1998, 1999, 2003, 2008 David S. Miller (davem@davemloft.net)
5 4 */
6 5  
7 6 #include <linux/module.h>
... ... @@ -24,6 +23,8 @@
24 23 #include <linux/skbuff.h>
25 24 #include <linux/bitops.h>
26 25 #include <linux/dma-mapping.h>
  26 +#include <linux/of.h>
  27 +#include <linux/of_device.h>
27 28  
28 29 #include <asm/auxio.h>
29 30 #include <asm/byteorder.h>
30 31  
... ... @@ -33,15 +34,14 @@
33 34 #include <asm/openprom.h>
34 35 #include <asm/oplib.h>
35 36 #include <asm/pgtable.h>
36   -#include <asm/sbus.h>
37 37 #include <asm/system.h>
38 38  
39 39 #include "sunbmac.h"
40 40  
41 41 #define DRV_NAME "sunbmac"
42   -#define DRV_VERSION "2.0"
43   -#define DRV_RELDATE "11/24/03"
44   -#define DRV_AUTHOR "David S. Miller (davem@redhat.com)"
  42 +#define DRV_VERSION "2.1"
  43 +#define DRV_RELDATE "August 26, 2008"
  44 +#define DRV_AUTHOR "David S. Miller (davem@davemloft.net)"
45 45  
46 46 static char version[] =
47 47 DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " " DRV_AUTHOR "\n";
48 48  
... ... @@ -97,8 +97,8 @@
97 97  
98 98 static void qec_init(struct bigmac *bp)
99 99 {
  100 + struct of_device *qec_op = bp->qec_op;
100 101 void __iomem *gregs = bp->gregs;
101   - struct sbus_dev *qec_sdev = bp->qec_sdev;
102 102 u8 bsizes = bp->bigmac_bursts;
103 103 u32 regval;
104 104  
105 105  
106 106  
... ... @@ -113,13 +113,13 @@
113 113 sbus_writel(GLOB_PSIZE_2048, gregs + GLOB_PSIZE);
114 114  
115 115 /* All of memsize is given to bigmac. */
116   - sbus_writel(qec_sdev->reg_addrs[1].reg_size,
  116 + sbus_writel(resource_size(&qec_op->resource[1]),
117 117 gregs + GLOB_MSIZE);
118 118  
119 119 /* Half to the transmitter, half to the receiver. */
120   - sbus_writel(qec_sdev->reg_addrs[1].reg_size >> 1,
  120 + sbus_writel(resource_size(&qec_op->resource[1]) >> 1,
121 121 gregs + GLOB_TSIZE);
122   - sbus_writel(qec_sdev->reg_addrs[1].reg_size >> 1,
  122 + sbus_writel(resource_size(&qec_op->resource[1]) >> 1,
123 123 gregs + GLOB_RSIZE);
124 124 }
125 125  
... ... @@ -240,7 +240,7 @@
240 240 skb_reserve(skb, 34);
241 241  
242 242 bb->be_rxd[i].rx_addr =
243   - dma_map_single(&bp->bigmac_sdev->ofdev.dev,
  243 + dma_map_single(&bp->bigmac_op->dev,
244 244 skb->data,
245 245 RX_BUF_ALLOC_SIZE - 34,
246 246 DMA_FROM_DEVICE);
... ... @@ -778,7 +778,7 @@
778 778 skb = bp->tx_skbs[elem];
779 779 bp->enet_stats.tx_packets++;
780 780 bp->enet_stats.tx_bytes += skb->len;
781   - dma_unmap_single(&bp->bigmac_sdev->ofdev.dev,
  781 + dma_unmap_single(&bp->bigmac_op->dev,
782 782 this->tx_addr, skb->len,
783 783 DMA_TO_DEVICE);
784 784  
... ... @@ -833,7 +833,7 @@
833 833 drops++;
834 834 goto drop_it;
835 835 }
836   - dma_unmap_single(&bp->bigmac_sdev->ofdev.dev,
  836 + dma_unmap_single(&bp->bigmac_op->dev,
837 837 this->rx_addr,
838 838 RX_BUF_ALLOC_SIZE - 34,
839 839 DMA_FROM_DEVICE);
... ... @@ -842,7 +842,7 @@
842 842 skb_put(new_skb, ETH_FRAME_LEN);
843 843 skb_reserve(new_skb, 34);
844 844 this->rx_addr =
845   - dma_map_single(&bp->bigmac_sdev->ofdev.dev,
  845 + dma_map_single(&bp->bigmac_op->dev,
846 846 new_skb->data,
847 847 RX_BUF_ALLOC_SIZE - 34,
848 848 DMA_FROM_DEVICE);
849 849  
... ... @@ -860,11 +860,11 @@
860 860 }
861 861 skb_reserve(copy_skb, 2);
862 862 skb_put(copy_skb, len);
863   - dma_sync_single_for_cpu(&bp->bigmac_sdev->ofdev.dev,
  863 + dma_sync_single_for_cpu(&bp->bigmac_op->dev,
864 864 this->rx_addr, len,
865 865 DMA_FROM_DEVICE);
866 866 skb_copy_to_linear_data(copy_skb, (unsigned char *)skb->data, len);
867   - dma_sync_single_for_device(&bp->bigmac_sdev->ofdev.dev,
  867 + dma_sync_single_for_device(&bp->bigmac_op->dev,
868 868 this->rx_addr, len,
869 869 DMA_FROM_DEVICE);
870 870  
... ... @@ -962,7 +962,7 @@
962 962 u32 mapping;
963 963  
964 964 len = skb->len;
965   - mapping = dma_map_single(&bp->bigmac_sdev->ofdev.dev, skb->data,
  965 + mapping = dma_map_single(&bp->bigmac_op->dev, skb->data,
966 966 len, DMA_TO_DEVICE);
967 967  
968 968 /* Avoid a race... */
969 969  
... ... @@ -1055,12 +1055,8 @@
1055 1055 /* Ethtool support... */
1056 1056 static void bigmac_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
1057 1057 {
1058   - struct bigmac *bp = dev->priv;
1059   -
1060 1058 strcpy(info->driver, "sunbmac");
1061 1059 strcpy(info->version, "2.0");
1062   - sprintf(info->bus_info, "SBUS:%d",
1063   - bp->qec_sdev->slot);
1064 1060 }
1065 1061  
1066 1062 static u32 bigmac_get_link(struct net_device *dev)
1067 1063  
1068 1064  
1069 1065  
1070 1066  
... ... @@ -1079,14 +1075,15 @@
1079 1075 .get_link = bigmac_get_link,
1080 1076 };
1081 1077  
1082   -static int __devinit bigmac_ether_init(struct sbus_dev *qec_sdev)
  1078 +static int __devinit bigmac_ether_init(struct of_device *op,
  1079 + struct of_device *qec_op)
1083 1080 {
1084   - struct net_device *dev;
1085 1081 static int version_printed;
1086   - struct bigmac *bp;
  1082 + struct net_device *dev;
1087 1083 u8 bsizes, bsizes_more;
1088   - int i;
1089 1084 DECLARE_MAC_BUF(mac);
  1085 + struct bigmac *bp;
  1086 + int i;
1090 1087  
1091 1088 /* Get a new device struct for this interface. */
1092 1089 dev = alloc_etherdev(sizeof(struct bigmac));
1093 1090  
1094 1091  
1095 1092  
1096 1093  
... ... @@ -1096,32 +1093,21 @@
1096 1093 if (version_printed++ == 0)
1097 1094 printk(KERN_INFO "%s", version);
1098 1095  
1099   - dev->base_addr = (long) qec_sdev;
1100 1096 for (i = 0; i < 6; i++)
1101 1097 dev->dev_addr[i] = idprom->id_ethaddr[i];
1102 1098  
1103 1099 /* Setup softc, with backpointers to QEC and BigMAC SBUS device structs. */
1104   - bp = dev->priv;
1105   - bp->qec_sdev = qec_sdev;
1106   - bp->bigmac_sdev = qec_sdev->child;
  1100 + bp = netdev_priv(dev);
  1101 + bp->qec_op = qec_op;
  1102 + bp->bigmac_op = op;
1107 1103  
1108   - SET_NETDEV_DEV(dev, &bp->bigmac_sdev->ofdev.dev);
  1104 + SET_NETDEV_DEV(dev, &op->dev);
1109 1105  
1110 1106 spin_lock_init(&bp->lock);
1111 1107  
1112   - /* Verify the registers we expect, are actually there. */
1113   - if ((bp->bigmac_sdev->num_registers != 3) ||
1114   - (bp->qec_sdev->num_registers != 2)) {
1115   - printk(KERN_ERR "BIGMAC: Device does not have 2 and 3 regs, it has %d and %d.\n",
1116   - bp->qec_sdev->num_registers,
1117   - bp->bigmac_sdev->num_registers);
1118   - printk(KERN_ERR "BIGMAC: Would you like that for here or to go?\n");
1119   - goto fail_and_cleanup;
1120   - }
1121   -
1122 1108 /* Map in QEC global control registers. */
1123   - bp->gregs = sbus_ioremap(&bp->qec_sdev->resource[0], 0,
1124   - GLOB_REG_SIZE, "BigMAC QEC GLobal Regs");
  1109 + bp->gregs = of_ioremap(&qec_op->resource[0], 0,
  1110 + GLOB_REG_SIZE, "BigMAC QEC GLobal Regs");
1125 1111 if (!bp->gregs) {
1126 1112 printk(KERN_ERR "BIGMAC: Cannot map QEC global registers.\n");
1127 1113 goto fail_and_cleanup;
1128 1114  
... ... @@ -1138,14 +1124,9 @@
1138 1124 goto fail_and_cleanup;
1139 1125  
1140 1126 /* Get supported SBUS burst sizes. */
1141   - bsizes = prom_getintdefault(bp->qec_sdev->prom_node,
1142   - "burst-sizes",
1143   - 0xff);
  1127 + bsizes = of_getintprop_default(qec_op->node, "burst-sizes", 0xff);
  1128 + bsizes_more = of_getintprop_default(qec_op->node, "burst-sizes", 0xff);
1144 1129  
1145   - bsizes_more = prom_getintdefault(bp->qec_sdev->bus->prom_node,
1146   - "burst-sizes",
1147   - 0xff);
1148   -
1149 1130 bsizes &= 0xff;
1150 1131 if (bsizes_more != 0xff)
1151 1132 bsizes &= bsizes_more;
1152 1133  
... ... @@ -1158,16 +1139,16 @@
1158 1139 qec_init(bp);
1159 1140  
1160 1141 /* Map in the BigMAC channel registers. */
1161   - bp->creg = sbus_ioremap(&bp->bigmac_sdev->resource[0], 0,
1162   - CREG_REG_SIZE, "BigMAC QEC Channel Regs");
  1142 + bp->creg = of_ioremap(&op->resource[0], 0,
  1143 + CREG_REG_SIZE, "BigMAC QEC Channel Regs");
1163 1144 if (!bp->creg) {
1164 1145 printk(KERN_ERR "BIGMAC: Cannot map QEC channel registers.\n");
1165 1146 goto fail_and_cleanup;
1166 1147 }
1167 1148  
1168 1149 /* Map in the BigMAC control registers. */
1169   - bp->bregs = sbus_ioremap(&bp->bigmac_sdev->resource[1], 0,
1170   - BMAC_REG_SIZE, "BigMAC Primary Regs");
  1150 + bp->bregs = of_ioremap(&op->resource[1], 0,
  1151 + BMAC_REG_SIZE, "BigMAC Primary Regs");
1171 1152 if (!bp->bregs) {
1172 1153 printk(KERN_ERR "BIGMAC: Cannot map BigMAC primary registers.\n");
1173 1154 goto fail_and_cleanup;
... ... @@ -1176,8 +1157,8 @@
1176 1157 /* Map in the BigMAC transceiver registers, this is how you poke at
1177 1158 * the BigMAC's PHY.
1178 1159 */
1179   - bp->tregs = sbus_ioremap(&bp->bigmac_sdev->resource[2], 0,
1180   - TCVR_REG_SIZE, "BigMAC Transceiver Regs");
  1160 + bp->tregs = of_ioremap(&op->resource[2], 0,
  1161 + TCVR_REG_SIZE, "BigMAC Transceiver Regs");
1181 1162 if (!bp->tregs) {
1182 1163 printk(KERN_ERR "BIGMAC: Cannot map BigMAC transceiver registers.\n");
1183 1164 goto fail_and_cleanup;
... ... @@ -1187,7 +1168,7 @@
1187 1168 bigmac_stop(bp);
1188 1169  
1189 1170 /* Allocate transmit/receive descriptor DVMA block. */
1190   - bp->bmac_block = dma_alloc_coherent(&bp->bigmac_sdev->ofdev.dev,
  1171 + bp->bmac_block = dma_alloc_coherent(&bp->bigmac_op->dev,
1191 1172 PAGE_SIZE,
1192 1173 &bp->bblock_dvma, GFP_ATOMIC);
1193 1174 if (bp->bmac_block == NULL || bp->bblock_dvma == 0) {
... ... @@ -1196,8 +1177,8 @@
1196 1177 }
1197 1178  
1198 1179 /* Get the board revision of this BigMAC. */
1199   - bp->board_rev = prom_getintdefault(bp->bigmac_sdev->prom_node,
1200   - "board-version", 1);
  1180 + bp->board_rev = of_getintprop_default(bp->bigmac_op->node,
  1181 + "board-version", 1);
1201 1182  
1202 1183 /* Init auto-negotiation timer state. */
1203 1184 init_timer(&bp->bigmac_timer);
... ... @@ -1221,7 +1202,7 @@
1221 1202 dev->watchdog_timeo = 5*HZ;
1222 1203  
1223 1204 /* Finish net device registration. */
1224   - dev->irq = bp->bigmac_sdev->irqs[0];
  1205 + dev->irq = bp->bigmac_op->irqs[0];
1225 1206 dev->dma = 0;
1226 1207  
1227 1208 if (register_netdev(dev)) {
... ... @@ -1229,7 +1210,7 @@
1229 1210 goto fail_and_cleanup;
1230 1211 }
1231 1212  
1232   - dev_set_drvdata(&bp->bigmac_sdev->ofdev.dev, bp);
  1213 + dev_set_drvdata(&bp->bigmac_op->dev, bp);
1233 1214  
1234 1215 printk(KERN_INFO "%s: BigMAC 100baseT Ethernet %s\n",
1235 1216 dev->name, print_mac(mac, dev->dev_addr));
1236 1217  
1237 1218  
1238 1219  
1239 1220  
... ... @@ -1240,16 +1221,16 @@
1240 1221 /* Something went wrong, undo whatever we did so far. */
1241 1222 /* Free register mappings if any. */
1242 1223 if (bp->gregs)
1243   - sbus_iounmap(bp->gregs, GLOB_REG_SIZE);
  1224 + of_iounmap(&qec_op->resource[0], bp->gregs, GLOB_REG_SIZE);
1244 1225 if (bp->creg)
1245   - sbus_iounmap(bp->creg, CREG_REG_SIZE);
  1226 + of_iounmap(&op->resource[0], bp->creg, CREG_REG_SIZE);
1246 1227 if (bp->bregs)
1247   - sbus_iounmap(bp->bregs, BMAC_REG_SIZE);
  1228 + of_iounmap(&op->resource[1], bp->bregs, BMAC_REG_SIZE);
1248 1229 if (bp->tregs)
1249   - sbus_iounmap(bp->tregs, TCVR_REG_SIZE);
  1230 + of_iounmap(&op->resource[2], bp->tregs, TCVR_REG_SIZE);
1250 1231  
1251 1232 if (bp->bmac_block)
1252   - dma_free_coherent(&bp->bigmac_sdev->ofdev.dev,
  1233 + dma_free_coherent(&bp->bigmac_op->dev,
1253 1234 PAGE_SIZE,
1254 1235 bp->bmac_block,
1255 1236 bp->bblock_dvma);
1256 1237  
1257 1238  
1258 1239  
1259 1240  
1260 1241  
1261 1242  
1262 1243  
1263 1244  
1264 1245  
1265 1246  
1266 1247  
... ... @@ -1259,48 +1240,49 @@
1259 1240 return -ENODEV;
1260 1241 }
1261 1242  
1262   -/* QEC can be the parent of either QuadEthernet or
1263   - * a BigMAC. We want the latter.
  1243 +/* QEC can be the parent of either QuadEthernet or a BigMAC. We want
  1244 + * the latter.
1264 1245 */
1265   -static int __devinit bigmac_sbus_probe(struct of_device *dev, const struct of_device_id *match)
  1246 +static int __devinit bigmac_sbus_probe(struct of_device *op,
  1247 + const struct of_device_id *match)
1266 1248 {
1267   - struct sbus_dev *sdev = to_sbus_device(&dev->dev);
1268   - struct device_node *dp = dev->node;
  1249 + struct device *parent = op->dev.parent;
  1250 + struct of_device *qec_op;
1269 1251  
1270   - if (!strcmp(dp->name, "be"))
1271   - sdev = sdev->parent;
  1252 + qec_op = to_of_device(parent);
1272 1253  
1273   - return bigmac_ether_init(sdev);
  1254 + return bigmac_ether_init(op, qec_op);
1274 1255 }
1275 1256  
1276   -static int __devexit bigmac_sbus_remove(struct of_device *dev)
  1257 +static int __devexit bigmac_sbus_remove(struct of_device *op)
1277 1258 {
1278   - struct bigmac *bp = dev_get_drvdata(&dev->dev);
  1259 + struct bigmac *bp = dev_get_drvdata(&op->dev);
  1260 + struct device *parent = op->dev.parent;
1279 1261 struct net_device *net_dev = bp->dev;
  1262 + struct of_device *qec_op;
1280 1263  
  1264 + qec_op = to_of_device(parent);
  1265 +
1281 1266 unregister_netdevice(net_dev);
1282 1267  
1283   - sbus_iounmap(bp->gregs, GLOB_REG_SIZE);
1284   - sbus_iounmap(bp->creg, CREG_REG_SIZE);
1285   - sbus_iounmap(bp->bregs, BMAC_REG_SIZE);
1286   - sbus_iounmap(bp->tregs, TCVR_REG_SIZE);
1287   - dma_free_coherent(&bp->bigmac_sdev->ofdev.dev,
  1268 + of_iounmap(&qec_op->resource[0], bp->gregs, GLOB_REG_SIZE);
  1269 + of_iounmap(&op->resource[0], bp->creg, CREG_REG_SIZE);
  1270 + of_iounmap(&op->resource[1], bp->bregs, BMAC_REG_SIZE);
  1271 + of_iounmap(&op->resource[2], bp->tregs, TCVR_REG_SIZE);
  1272 + dma_free_coherent(&op->dev,
1288 1273 PAGE_SIZE,
1289 1274 bp->bmac_block,
1290 1275 bp->bblock_dvma);
1291 1276  
1292 1277 free_netdev(net_dev);
1293 1278  
1294   - dev_set_drvdata(&dev->dev, NULL);
  1279 + dev_set_drvdata(&op->dev, NULL);
1295 1280  
1296 1281 return 0;
1297 1282 }
1298 1283  
1299 1284 static struct of_device_id bigmac_sbus_match[] = {
1300 1285 {
1301   - .name = "qec",
1302   - },
1303   - {
1304 1286 .name = "be",
1305 1287 },
1306 1288 {},
... ... @@ -1317,7 +1299,7 @@
1317 1299  
1318 1300 static int __init bigmac_init(void)
1319 1301 {
1320   - return of_register_driver(&bigmac_sbus_driver, &sbus_bus_type);
  1302 + return of_register_driver(&bigmac_sbus_driver, &of_bus_type);
1321 1303 }
1322 1304  
1323 1305 static void __exit bigmac_exit(void)
drivers/net/sunbmac.h
... ... @@ -329,8 +329,8 @@
329 329 unsigned int timer_ticks;
330 330  
331 331 struct net_device_stats enet_stats;
332   - struct sbus_dev *qec_sdev;
333   - struct sbus_dev *bigmac_sdev;
  332 + struct of_device *qec_op;
  333 + struct of_device *bigmac_op;
334 334 struct net_device *dev;
335 335 };
336 336