static int bam_rmnet_probe(struct platform_device *pdev) { int i, ret; struct rmnet_private *p; struct device *d; char name[BAM_DMUX_CH_NAME_MAX_LEN]; struct net_device *dev; const char *dev_name; for (i = 0; i < BAM_DMUX_NUM_CHANNELS; ++i) { scnprintf(name, BAM_DMUX_CH_NAME_MAX_LEN, "bam_dmux_ch_%d", i); if (!strcmp(pdev->name, name)) break; } if (((i > BAM_DMUX_DATA_RMNET_7) && (i < BAM_DMUX_DATA_REV_RMNET_0)) || (i >= BAM_DMUX_NUM_CHANNELS)) { pr_err("%s: wrong netdev %s\n", __func__, pdev->name); return -ENODEV; } if (i <= BAM_DMUX_DATA_RMNET_7) dev_name = "rmnet%d"; else dev_name = "rev_rmnet%d"; dev = alloc_netdev(sizeof(*p), dev_name, rmnet_setup); if (!dev) { pr_err("%s: no memory for netdev %d\n", __func__, i); return -ENOMEM; } netdevs[i] = dev; d = &(dev->dev); p = netdev_priv(dev); /* Initial config uses Ethernet */ p->operation_mode = RMNET_MODE_LLP_ETH; p->ch_id = i; p->waiting_for_ul_skb = NULL; p->device_up = DEVICE_UNINITIALIZED; spin_lock_init(&p->lock); spin_lock_init(&p->tx_queue_lock); ret = register_netdev(dev); if (ret) { pr_err("%s: unable to register netdev %d rc=%d\n", __func__, i, ret); netdevs[i] = NULL; free_netdev(dev); return ret; } rmnet_debug_init(dev); return 0; }
static int __init rmnet_init(void) { int ret; struct device *d; struct net_device *dev; struct rmnet_private *p; unsigned n; char *tempname; pr_info("%s: BAM devices[%d]\n", __func__, RMNET_DEVICE_COUNT); #ifdef CONFIG_MSM_RMNET_DEBUG timeout_us = 0; #ifdef CONFIG_HAS_EARLYSUSPEND timeout_suspend_us = 0; #endif #endif for (n = 0; n < RMNET_DEVICE_COUNT; n++) { dev = alloc_netdev(sizeof(struct rmnet_private), "rmnet%d", rmnet_setup); if (!dev) { pr_err("%s: no memory for netdev %d\n", __func__, n); return -ENOMEM; } netdevs[n] = dev; d = &(dev->dev); p = netdev_priv(dev); /* Initial config uses Ethernet */ p->operation_mode = RMNET_MODE_LLP_ETH; p->ch_id = n; p->waiting_for_ul_skb = NULL; p->in_reset = 0; spin_lock_init(&p->lock); spin_lock_init(&p->tx_queue_lock); #ifdef CONFIG_MSM_RMNET_DEBUG p->timeout_us = timeout_us; p->wakeups_xmit = p->wakeups_rcv = 0; #endif ret = register_netdev(dev); if (ret) { pr_err("%s: unable to register netdev" " %d rc=%d\n", __func__, n, ret); netdevs[n] = NULL; free_netdev(dev); return ret; } #ifdef CONFIG_MSM_RMNET_DEBUG if (device_create_file(d, &dev_attr_timeout)) continue; if (device_create_file(d, &dev_attr_wakeups_xmit)) continue; if (device_create_file(d, &dev_attr_wakeups_rcv)) continue; #ifdef CONFIG_HAS_EARLYSUSPEND if (device_create_file(d, &dev_attr_timeout_suspend)) continue; /* Only care about rmnet0 for suspend/resume tiemout hooks. */ if (n == 0) rmnet0 = d; #endif #endif bam_rmnet_drivers[n].probe = bam_rmnet_probe; bam_rmnet_drivers[n].remove = bam_rmnet_remove; tempname = kmalloc(BAM_DMUX_CH_NAME_MAX_LEN, GFP_KERNEL); if (tempname == NULL) { netdevs[n] = NULL; ret = -ENOMEM; goto error; } scnprintf(tempname, BAM_DMUX_CH_NAME_MAX_LEN, "bam_dmux_ch_%d", n); bam_rmnet_drivers[n].driver.name = tempname; bam_rmnet_drivers[n].driver.owner = THIS_MODULE; ret = platform_driver_register(&bam_rmnet_drivers[n]); if (ret) { pr_err("%s: registration failed n=%d rc=%d\n", __func__, n, ret); netdevs[n] = NULL; goto error; } } /*Support for new rmnet ports */ for (n = 0; n < RMNET_REV_DEVICE_COUNT; n++) { dev = alloc_netdev(sizeof(struct rmnet_private), "rev_rmnet%d", rmnet_setup); if (!dev) { pr_err("%s: no memory for rev netdev %d\n", __func__, n); return -ENOMEM; } netdevs_rev[n] = dev; d = &(dev->dev); p = netdev_priv(dev); /* Initial config uses Ethernet */ p->operation_mode = RMNET_MODE_LLP_ETH; p->ch_id = n+BAM_DMUX_DATA_REV_RMNET_0; p->waiting_for_ul_skb = NULL; p->in_reset = 0; spin_lock_init(&p->lock); spin_lock_init(&p->tx_queue_lock); ret = register_netdev(dev); if (ret) { pr_err("%s: unable to register rev netdev %d rc=%d\n", __func__, n, ret); netdevs_rev[n] = NULL; free_netdev(dev); return ret; } if (rmnet_debug_init(dev)) continue; bam_rmnet_rev_drivers[n].probe = bam_rmnet_rev_probe; bam_rmnet_rev_drivers[n].remove = bam_rmnet_rev_remove; tempname = kmalloc(BAM_DMUX_CH_NAME_MAX_LEN, GFP_KERNEL); if (tempname == NULL) { netdevs_rev[n] = NULL; ret = -ENOMEM; goto error; } scnprintf(tempname, BAM_DMUX_CH_NAME_MAX_LEN, "bam_dmux_ch_%d", (n+BAM_DMUX_DATA_REV_RMNET_0)); bam_rmnet_rev_drivers[n].driver.name = tempname; bam_rmnet_rev_drivers[n].driver.owner = THIS_MODULE; ret = platform_driver_register(&bam_rmnet_rev_drivers[n]); if (ret) { pr_err("%s: new rev driver registration failed n=%d rc=%d\n", __func__, n, ret); netdevs_rev[n] = NULL; goto error; } } return 0; error: unregister_netdev(dev); free_netdev(dev); return ret; }