/** Debug interface constructor. * * Initializes the debug object, creates a net_device and registeres it. * * \retval 0 Success. * \retval <0 Error code. */ int ec_debug_init( ec_debug_t *dbg, /**< Debug object. */ ec_device_t *device, /**< EtherCAT device. */ const char *name /**< Interface name. */ ) { dbg->device = device; dbg->registered = 0; dbg->opened = 0; memset(&dbg->stats, 0, sizeof(struct net_device_stats)); if (!(dbg->dev = alloc_netdev(sizeof(ec_debug_t *), name, ether_setup))) { EC_MASTER_ERR(device->master, "Unable to allocate net_device" " for debug object!\n"); return -ENODEV; } // initialize net_device #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 31) dbg->dev->netdev_ops = &ec_dbg_netdev_ops; #else dbg->dev->open = ec_dbgdev_open; dbg->dev->stop = ec_dbgdev_stop; dbg->dev->hard_start_xmit = ec_dbgdev_tx; dbg->dev->get_stats = ec_dbgdev_stats; #endif // initialize private data *((ec_debug_t **) netdev_priv(dbg->dev)) = dbg; return 0; }
/** Initialize an RTDM device. * * \return Zero on success, otherwise a negative error code. */ int ec_rtdm_dev_init( ec_rtdm_dev_t *rtdm_dev, /**< EtherCAT RTDM device. */ ec_master_t *master /**< EtherCAT master. */ ) { int ret; rtdm_dev->master = master; rtdm_dev->dev = kzalloc(sizeof(struct rtdm_device), GFP_KERNEL); if (!rtdm_dev->dev) { EC_MASTER_ERR(master, "Failed to reserve memory for RTDM device.\n"); return -ENOMEM; } rtdm_dev->dev->struct_version = RTDM_DEVICE_STRUCT_VER; rtdm_dev->dev->device_flags = RTDM_NAMED_DEVICE; rtdm_dev->dev->context_size = sizeof(ec_rtdm_context_t); snprintf(rtdm_dev->dev->device_name, RTDM_MAX_DEVNAME_LEN, "EtherCAT%u", master->index); rtdm_dev->dev->open_nrt = ec_rtdm_open; rtdm_dev->dev->ops.close_nrt = ec_rtdm_close; rtdm_dev->dev->ops.ioctl_rt = ec_rtdm_ioctl; rtdm_dev->dev->ops.ioctl_nrt = ec_rtdm_ioctl; rtdm_dev->dev->device_class = RTDM_CLASS_EXPERIMENTAL; rtdm_dev->dev->device_sub_class = 222; rtdm_dev->dev->driver_name = "EtherCAT"; rtdm_dev->dev->driver_version = RTDM_DRIVER_VER(1, 0, 2); rtdm_dev->dev->peripheral_name = rtdm_dev->dev->device_name; rtdm_dev->dev->provider_name = "EtherLab Community"; rtdm_dev->dev->proc_name = rtdm_dev->dev->device_name; rtdm_dev->dev->device_data = rtdm_dev; /* pointer to parent */ EC_MASTER_INFO(master, "Registering RTDM device %s.\n", rtdm_dev->dev->driver_name); ret = rtdm_dev_register(rtdm_dev->dev); if (ret) { EC_MASTER_ERR(master, "Initialization of RTDM interface failed" " (return value %i).\n", ret); kfree(rtdm_dev->dev); } return ret; }