Skip to content
Snippets Groups Projects
e100-2.6.18-ethercat.c 88.8 KiB
Newer Older
	.name =         DRV_NAME,
	.id_table =     e100_id_table,
	.probe =        e100_probe,
	.remove =       __devexit_p(e100_remove),
#ifdef CONFIG_PM
	.suspend =      e100_suspend,
	.resume =       e100_resume,
#endif
	.shutdown =     e100_shutdown,
	.err_handler = &e100_err_handler,
};

static int __init e100_init_module(void)
{
    struct nic *nic;

    printk(KERN_INFO DRV_NAME " " DRV_DESCRIPTION " " DRV_VERSION
            ", master " EC_MASTER_VERSION "\n");
	printk(KERN_INFO DRV_NAME " ec_device_index is %i\n", ec_device_index);

	if (pci_module_init(&e100_driver) < 0) {
		printk(KERN_ERR DRV_NAME " Failed to init PCI module.\n");
		goto out_return;
	}

	if (e100_ec_netdev) {
        nic = netdev_priv(e100_ec_netdev);
		printk(KERN_INFO DRV_NAME " Registering EtherCAT device...\n");
		if (!(nic->ecdev = ecdev_register(ec_device_master_index,
                        e100_ec_netdev, e100_ec_poll, THIS_MODULE))) {
			printk(KERN_ERR DRV_NAME " Failed to register EtherCAT device!\n");
			goto out_pci;
		}
		printk(KERN_INFO DRV_NAME " Opening EtherCAT device...\n");
		if (ecdev_open(nic->ecdev)) {
			printk(KERN_ERR DRV_NAME " Failed to open EtherCAT device!\n");
			goto out_unregister;
		}

		printk(KERN_INFO DRV_NAME " EtherCAT device ready.\n");
	} else {
		printk(KERN_WARNING DRV_NAME " No EtherCAT device registered!\n");
	}

	return 0;

out_unregister:
	printk(KERN_INFO DRV_NAME " Unregistering EtherCAT device...\n");
	ecdev_unregister(ec_device_master_index, nic->ecdev);
out_pci:
	pci_unregister_driver(&e100_driver);
out_return:
	return -1;
}

static void __exit e100_cleanup_module(void)
{
	printk(KERN_INFO DRV_NAME " Cleaning up module...\n");

	if (e100_ec_netdev) {
        struct nic *nic = netdev_priv(e100_ec_netdev);
		printk(KERN_INFO DRV_NAME " Closing EtherCAT device...\n");
		ecdev_close(nic->ecdev);
		printk(KERN_INFO DRV_NAME " Unregistering EtherCAT device...\n");
		ecdev_unregister(ec_device_master_index, nic->ecdev);
	}

	pci_unregister_driver(&e100_driver);

	printk(KERN_INFO DRV_NAME " module cleaned up.\n");
}

module_init(e100_init_module);
module_exit(e100_cleanup_module);