Loading drivers/net/sunlance.c +97 −76 Original line number Diff line number Diff line Loading @@ -266,7 +266,6 @@ struct lance_private { char *name; dma_addr_t init_block_dvma; struct net_device *dev; /* Backpointer */ struct lance_private *next_module; struct sbus_dev *sdev; struct timer_list multicast_timer; }; Loading Loading @@ -298,8 +297,6 @@ int sparc_lance_debug = 2; #define LANCE_ADDR(x) ((long)(x) & ~0xff000000) static struct lance_private *root_lance_dev; /* Load the CSR registers */ static void load_csrs(struct lance_private *lp) { Loading Loading @@ -1327,7 +1324,7 @@ static struct ethtool_ops sparc_lance_ethtool_ops = { .get_link = sparc_lance_get_link, }; static int __init sparc_lance_init(struct sbus_dev *sdev, static int __init sparc_lance_probe_one(struct sbus_dev *sdev, struct sbus_dma *ledma, struct sbus_dev *lebuffer) { Loading Loading @@ -1473,6 +1470,7 @@ no_link_test: lp->dev = dev; SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &sdev->ofdev.dev); dev->open = &lance_open; dev->stop = &lance_close; dev->hard_start_xmit = &lance_start_xmit; Loading Loading @@ -1500,8 +1498,7 @@ no_link_test: goto fail; } lp->next_module = root_lance_dev; root_lance_dev = lp; dev_set_drvdata(&sdev->ofdev.dev, lp); printk(KERN_INFO "%s: LANCE ", dev->name); Loading Loading @@ -1536,88 +1533,112 @@ static inline struct sbus_dma *find_ledma(struct sbus_dev *sdev) #include <asm/machines.h> /* Find all the lance cards on the system and initialize them */ static int __init sparc_lance_probe(void) static struct sbus_dev sun4_sdev; static int __init sparc_lance_init(void) { static struct sbus_dev sdev; static int called; root_lance_dev = NULL; if (called) return -ENODEV; called++; if ((idprom->id_machtype == (SM_SUN4|SM_4_330)) || (idprom->id_machtype == (SM_SUN4|SM_4_470))) { memset(&sdev, 0, sizeof(sdev)); sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr; sdev.irqs[0] = 6; return sparc_lance_init(&sdev, NULL, NULL); memset(&sun4_sdev, 0, sizeof(sdev)); sun4_sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr; sun4_sdev.irqs[0] = 6; return sparc_lance_probe_one(&sun4_sdev, NULL, NULL); } return -ENODEV; } static int __exit sunlance_sun4_remove(void) { struct lance_private *lp = dev_get_drvdata(&sun4_sdev->dev); struct net_device *net_dev = lp->dev; unregister_netdevice(net_dev); lance_free_hwresources(root_lance_dev); free_netdev(net_dev); dev_set_drvdata(&sun4_sdev->dev, NULL); return 0; } #else /* !CONFIG_SUN4 */ /* Find all the lance cards on the system and initialize them */ static int __init sparc_lance_probe(void) static int __devinit sunlance_sbus_probe(struct of_device *dev, const struct of_device_id *match) { struct sbus_bus *bus; struct sbus_dev *sdev = NULL; struct sbus_dma *ledma = NULL; static int called; int cards = 0, v; struct sbus_dev *sdev = to_sbus_device(&dev->dev); struct device_node *dp = dev->node; int err; root_lance_dev = NULL; if (!strcmp(dp->name, "le")) { err = sparc_lance_probe_one(sdev, NULL, NULL); } else if (!strcmp(dp->name, "ledma")) { struct sbus_dma *ledma = find_ledma(sdev); if (called) return -ENODEV; called++; for_each_sbus (bus) { for_each_sbusdev (sdev, bus) { if (strcmp(sdev->prom_name, "le") == 0) { cards++; if ((v = sparc_lance_init(sdev, NULL, NULL))) return v; continue; } if (strcmp(sdev->prom_name, "ledma") == 0) { cards++; ledma = find_ledma(sdev); if ((v = sparc_lance_init(sdev->child, ledma, NULL))) return v; continue; err = sparc_lance_probe_one(sdev->child, ledma, NULL); } else { BUG_ON(strcmp(dp->name, "lebuffer")); err = sparc_lance_probe_one(sdev->child, NULL, sdev); } if (strcmp(sdev->prom_name, "lebuffer") == 0){ cards++; if ((v = sparc_lance_init(sdev->child, NULL, sdev))) return v; continue; return err; } } /* for each sbusdev */ } /* for each sbus */ if (!cards) return -ENODEV; static int __devexit sunlance_sbus_remove(struct of_device *dev) { struct lance_private *lp = dev_get_drvdata(&dev->dev); struct net_device *net_dev = lp->dev; unregister_netdevice(net_dev); lance_free_hwresources(lp); free_netdev(net_dev); dev_set_drvdata(&dev->dev, NULL); return 0; } #endif /* !CONFIG_SUN4 */ static void __exit sparc_lance_cleanup(void) static struct of_device_id sunlance_sbus_match[] = { { struct lance_private *lp; .name = "le", }, { .name = "ledma", }, { .name = "lebuffer", }, {}, }; while (root_lance_dev) { lp = root_lance_dev->next_module; MODULE_DEVICE_TABLE(of, sunlance_sbus_match); unregister_netdev(root_lance_dev->dev); lance_free_hwresources(root_lance_dev); free_netdev(root_lance_dev->dev); root_lance_dev = lp; static struct of_platform_driver sunlance_sbus_driver = { .name = "sunlance", .match_table = sunlance_sbus_match, .probe = sunlance_sbus_probe, .remove = __devexit_p(sunlance_sbus_remove), }; /* Find all the lance cards on the system and initialize them */ static int __init sparc_lance_init(void) { return of_register_driver(&sunlance_sbus_driver, &sbus_bus_type); } #endif /* !CONFIG_SUN4 */ static void __exit sparc_lance_exit(void) { #ifdef CONFIG_SUN4 sunlance_sun4_remove(); #else of_unregister_driver(&sunlance_sbus_driver); #endif } module_init(sparc_lance_probe); module_exit(sparc_lance_cleanup); module_init(sparc_lance_init); module_exit(sparc_lance_exit); Loading
drivers/net/sunlance.c +97 −76 Original line number Diff line number Diff line Loading @@ -266,7 +266,6 @@ struct lance_private { char *name; dma_addr_t init_block_dvma; struct net_device *dev; /* Backpointer */ struct lance_private *next_module; struct sbus_dev *sdev; struct timer_list multicast_timer; }; Loading Loading @@ -298,8 +297,6 @@ int sparc_lance_debug = 2; #define LANCE_ADDR(x) ((long)(x) & ~0xff000000) static struct lance_private *root_lance_dev; /* Load the CSR registers */ static void load_csrs(struct lance_private *lp) { Loading Loading @@ -1327,7 +1324,7 @@ static struct ethtool_ops sparc_lance_ethtool_ops = { .get_link = sparc_lance_get_link, }; static int __init sparc_lance_init(struct sbus_dev *sdev, static int __init sparc_lance_probe_one(struct sbus_dev *sdev, struct sbus_dma *ledma, struct sbus_dev *lebuffer) { Loading Loading @@ -1473,6 +1470,7 @@ no_link_test: lp->dev = dev; SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, &sdev->ofdev.dev); dev->open = &lance_open; dev->stop = &lance_close; dev->hard_start_xmit = &lance_start_xmit; Loading Loading @@ -1500,8 +1498,7 @@ no_link_test: goto fail; } lp->next_module = root_lance_dev; root_lance_dev = lp; dev_set_drvdata(&sdev->ofdev.dev, lp); printk(KERN_INFO "%s: LANCE ", dev->name); Loading Loading @@ -1536,88 +1533,112 @@ static inline struct sbus_dma *find_ledma(struct sbus_dev *sdev) #include <asm/machines.h> /* Find all the lance cards on the system and initialize them */ static int __init sparc_lance_probe(void) static struct sbus_dev sun4_sdev; static int __init sparc_lance_init(void) { static struct sbus_dev sdev; static int called; root_lance_dev = NULL; if (called) return -ENODEV; called++; if ((idprom->id_machtype == (SM_SUN4|SM_4_330)) || (idprom->id_machtype == (SM_SUN4|SM_4_470))) { memset(&sdev, 0, sizeof(sdev)); sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr; sdev.irqs[0] = 6; return sparc_lance_init(&sdev, NULL, NULL); memset(&sun4_sdev, 0, sizeof(sdev)); sun4_sdev.reg_addrs[0].phys_addr = sun4_eth_physaddr; sun4_sdev.irqs[0] = 6; return sparc_lance_probe_one(&sun4_sdev, NULL, NULL); } return -ENODEV; } static int __exit sunlance_sun4_remove(void) { struct lance_private *lp = dev_get_drvdata(&sun4_sdev->dev); struct net_device *net_dev = lp->dev; unregister_netdevice(net_dev); lance_free_hwresources(root_lance_dev); free_netdev(net_dev); dev_set_drvdata(&sun4_sdev->dev, NULL); return 0; } #else /* !CONFIG_SUN4 */ /* Find all the lance cards on the system and initialize them */ static int __init sparc_lance_probe(void) static int __devinit sunlance_sbus_probe(struct of_device *dev, const struct of_device_id *match) { struct sbus_bus *bus; struct sbus_dev *sdev = NULL; struct sbus_dma *ledma = NULL; static int called; int cards = 0, v; struct sbus_dev *sdev = to_sbus_device(&dev->dev); struct device_node *dp = dev->node; int err; root_lance_dev = NULL; if (!strcmp(dp->name, "le")) { err = sparc_lance_probe_one(sdev, NULL, NULL); } else if (!strcmp(dp->name, "ledma")) { struct sbus_dma *ledma = find_ledma(sdev); if (called) return -ENODEV; called++; for_each_sbus (bus) { for_each_sbusdev (sdev, bus) { if (strcmp(sdev->prom_name, "le") == 0) { cards++; if ((v = sparc_lance_init(sdev, NULL, NULL))) return v; continue; } if (strcmp(sdev->prom_name, "ledma") == 0) { cards++; ledma = find_ledma(sdev); if ((v = sparc_lance_init(sdev->child, ledma, NULL))) return v; continue; err = sparc_lance_probe_one(sdev->child, ledma, NULL); } else { BUG_ON(strcmp(dp->name, "lebuffer")); err = sparc_lance_probe_one(sdev->child, NULL, sdev); } if (strcmp(sdev->prom_name, "lebuffer") == 0){ cards++; if ((v = sparc_lance_init(sdev->child, NULL, sdev))) return v; continue; return err; } } /* for each sbusdev */ } /* for each sbus */ if (!cards) return -ENODEV; static int __devexit sunlance_sbus_remove(struct of_device *dev) { struct lance_private *lp = dev_get_drvdata(&dev->dev); struct net_device *net_dev = lp->dev; unregister_netdevice(net_dev); lance_free_hwresources(lp); free_netdev(net_dev); dev_set_drvdata(&dev->dev, NULL); return 0; } #endif /* !CONFIG_SUN4 */ static void __exit sparc_lance_cleanup(void) static struct of_device_id sunlance_sbus_match[] = { { struct lance_private *lp; .name = "le", }, { .name = "ledma", }, { .name = "lebuffer", }, {}, }; while (root_lance_dev) { lp = root_lance_dev->next_module; MODULE_DEVICE_TABLE(of, sunlance_sbus_match); unregister_netdev(root_lance_dev->dev); lance_free_hwresources(root_lance_dev); free_netdev(root_lance_dev->dev); root_lance_dev = lp; static struct of_platform_driver sunlance_sbus_driver = { .name = "sunlance", .match_table = sunlance_sbus_match, .probe = sunlance_sbus_probe, .remove = __devexit_p(sunlance_sbus_remove), }; /* Find all the lance cards on the system and initialize them */ static int __init sparc_lance_init(void) { return of_register_driver(&sunlance_sbus_driver, &sbus_bus_type); } #endif /* !CONFIG_SUN4 */ static void __exit sparc_lance_exit(void) { #ifdef CONFIG_SUN4 sunlance_sun4_remove(); #else of_unregister_driver(&sunlance_sbus_driver); #endif } module_init(sparc_lance_probe); module_exit(sparc_lance_cleanup); module_init(sparc_lance_init); module_exit(sparc_lance_exit);