static int __devexit hss_remove_one(struct platform_device *pdev) { struct port *port = platform_get_drvdata(pdev); unregister_hdlc_device(port->netdev); free_netdev(port->netdev); npe_release(port->npe); platform_set_drvdata(pdev, NULL); kfree(port); return 0; }
static int __devexit eth_remove_one(struct platform_device *pdev) { struct net_device *dev = platform_get_drvdata(pdev); struct port *port = netdev_priv(dev); unregister_netdev(dev); npe_port_tab[NPE_ID(port->id)] = NULL; platform_set_drvdata(pdev, NULL); npe_release(port->npe); release_resource(port->mem_res); free_netdev(dev); return 0; }
static int __devinit hss_init_one(struct platform_device *pdev) { struct port *port; struct net_device *dev; hdlc_device *hdlc; int err; if ((port = kzalloc(sizeof(*port), GFP_KERNEL)) == NULL) return -ENOMEM; if ((port->npe = npe_request(0)) == NULL) { err = -ENOSYS; goto err_free; } if ((port->netdev = dev = alloc_hdlcdev(port)) == NULL) { err = -ENOMEM; goto err_plat; } SET_NETDEV_DEV(dev, &pdev->dev); hdlc = dev_to_hdlc(dev); hdlc->attach = hss_hdlc_attach; hdlc->xmit = hss_hdlc_xmit; dev->open = hss_hdlc_open; dev->stop = hss_hdlc_close; dev->do_ioctl = hss_hdlc_ioctl; dev->tx_queue_len = 100; port->clock_type = CLOCK_EXT; port->clock_rate = 2048000; port->id = pdev->id; port->dev = &pdev->dev; port->plat = pdev->dev.platform_data; netif_napi_add(dev, &port->napi, hss_hdlc_poll, NAPI_WEIGHT); if ((err = register_hdlc_device(dev))) goto err_free_netdev; platform_set_drvdata(pdev, port); printk(KERN_INFO "%s: HSS-%i\n", dev->name, port->id); return 0; err_free_netdev: free_netdev(dev); err_plat: npe_release(port->npe); err_free: kfree(port); return err; }
static int hss_init_one(struct platform_device *pdev) { struct port *port; struct net_device *dev; hdlc_device *hdlc; int err; if ((port = kzalloc(sizeof(*port), GFP_KERNEL)) == NULL) return -ENOMEM; if ((port->npe = npe_request(0)) == NULL) { err = -ENODEV; goto err_free; } if ((port->netdev = dev = alloc_hdlcdev(port)) == NULL) { err = -ENOMEM; goto err_plat; } SET_NETDEV_DEV(dev, &pdev->dev); hdlc = dev_to_hdlc(dev); hdlc->attach = hss_hdlc_attach; hdlc->xmit = hss_hdlc_xmit; dev->netdev_ops = &hss_hdlc_ops; dev->tx_queue_len = 100; port->clock_type = CLOCK_EXT; port->clock_rate = 0; port->clock_reg = CLK42X_SPEED_2048KHZ; port->id = pdev->id; port->dev = &pdev->dev; port->plat = pdev->dev.platform_data; netif_napi_add(dev, &port->napi, hss_hdlc_poll, NAPI_WEIGHT); if ((err = register_hdlc_device(dev))) goto err_free_netdev; platform_set_drvdata(pdev, port); netdev_info(dev, "initialized\n"); return 0; err_free_netdev: free_netdev(dev); err_plat: npe_release(port->npe); err_free: kfree(port); return err; }
static int __devinit eth_init_one(struct platform_device *pdev) { struct port *port; struct net_device *dev; struct eth_plat_info *plat = pdev->dev.platform_data; u32 regs_phys; char phy_id[BUS_ID_SIZE]; int err; if (!(dev = alloc_etherdev(sizeof(struct port)))) return -ENOMEM; SET_NETDEV_DEV(dev, &pdev->dev); port = netdev_priv(dev); port->netdev = dev; port->id = pdev->id; switch (port->id) { case IXP4XX_ETH_NPEA: port->regs = (struct eth_regs __iomem *)IXP4XX_EthA_BASE_VIRT; regs_phys = IXP4XX_EthA_BASE_PHYS; break; case IXP4XX_ETH_NPEB: port->regs = (struct eth_regs __iomem *)IXP4XX_EthB_BASE_VIRT; regs_phys = IXP4XX_EthB_BASE_PHYS; break; case IXP4XX_ETH_NPEC: port->regs = (struct eth_regs __iomem *)IXP4XX_EthC_BASE_VIRT; regs_phys = IXP4XX_EthC_BASE_PHYS; break; default: err = -ENOSYS; goto err_free; } dev->netdev_ops = &ixp4xx_netdev_ops; dev->ethtool_ops = &ixp4xx_ethtool_ops; dev->tx_queue_len = 100; netif_napi_add(dev, &port->napi, eth_poll, NAPI_WEIGHT); if (!(port->npe = npe_request(NPE_ID(port->id)))) { err = -EIO; goto err_free; } if (register_netdev(dev)) { err = -EIO; goto err_npe_rel; } port->mem_res = request_mem_region(regs_phys, REGS_SIZE, dev->name); if (!port->mem_res) { err = -EBUSY; goto err_unreg; } port->plat = plat; npe_port_tab[NPE_ID(port->id)] = port; memcpy(dev->dev_addr, plat->hwaddr, ETH_ALEN); platform_set_drvdata(pdev, dev); __raw_writel(DEFAULT_CORE_CNTRL | CORE_RESET, &port->regs->core_control); udelay(50); __raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control); udelay(50); snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, "0", plat->phy); port->phydev = phy_connect(dev, phy_id, &ixp4xx_adjust_link, 0, PHY_INTERFACE_MODE_MII); if (IS_ERR(port->phydev)) { printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); return PTR_ERR(port->phydev); } port->phydev->irq = PHY_POLL; printk(KERN_INFO "%s: MII PHY %i on %s\n", dev->name, plat->phy, npe_name(port->npe)); return 0; err_unreg: unregister_netdev(dev); err_npe_rel: npe_release(port->npe); err_free: free_netdev(dev); return err; }